diff --git a/.circleci/config.yml b/.circleci/config.yml index f0a8ee5a198..3192b6a4070 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -53,7 +53,7 @@ commands: command: pnpm -F "./packages/*" add react-compiler-runtime - run: name: Build with compiler - command: pnpm -F "./packages/*" build --enableReactCompiler + command: pnpm release:build --enableReactCompiler environment: MUI_REACT_COMPILER_MODE: 'infer' diff --git a/.gitignore b/.gitignore index 2caaecd4a02..74dbf44a7d2 100644 --- a/.gitignore +++ b/.gitignore @@ -28,7 +28,9 @@ size-snapshot.json # Remove if you want to pregenerate the docs md files docs/public/llms.txt docs/public/llms-full.txt +docs/public/index.md docs/public/react +packages/react/published-docs/ .cursor/rules/nx-rules.mdc .github/instructions/nx.instructions.md diff --git a/docs/scripts/generateLlmTxt/index.mjs b/docs/scripts/generateLlmTxt/index.mjs index 6b41532c3a0..d0320ef924b 100755 --- a/docs/scripts/generateLlmTxt/index.mjs +++ b/docs/scripts/generateLlmTxt/index.mjs @@ -36,6 +36,10 @@ function incrementHeaders(increment = 1) { }; } +function inlineCodeHtmlTags(text) { + return text.replace(/<\/?[a-zA-Z][^>]*>/g, '`$&`'); +} + function githubSlugify(text) { return text .trim() @@ -216,7 +220,11 @@ async function generateLlmsTxt() { // Page rendering functions - focused only on their unique logic const renderPageAsLink = (page) => { const resolvedUrl = resolveUrl(page.mdUrlPath, BASE_URL); - return [`- [${page.title}](${resolvedUrl}): ${page.description}`]; + return [`- [${page.title}](${resolvedUrl}): ${inlineCodeHtmlTags(page.description)}`]; + }; + const renderPageAsRelativeLink = (page) => { + const relativeUrl = `.${page.mdUrlPath}`; + return [`- [${page.title}](${relativeUrl}): ${inlineCodeHtmlTags(page.description)}`]; }; const renderPageAsInline = async (page) => { const content = await prepareForInlineMarkdown(page.fullMarkdown, 2, metadataByUrl); @@ -300,9 +308,12 @@ async function generateLlmsTxt() { await Promise.all([ createFile('llms.txt', renderPageAsLink), createFile('llms-full.txt', renderPageAsInline), + createFile('index.md', renderPageAsRelativeLink), ]); - console.log(`Successfully generated ${totalFiles} markdown files, llms.txt, and llms-full.txt`); + console.log( + `Successfully generated ${totalFiles} markdown files, llms.txt, llms-full.txt, and index.md`, + ); } catch (error) { console.error('Error generating llms.txt:', error); process.exit(1); diff --git a/package.json b/package.json index c00618e681c..d6f5be2cd1a 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "deduplicate": "pnpm dedupe", "build": "lerna run --no-private build", "release:version": "lerna version --no-changelog --no-push --no-git-tag-version --no-private", - "release:build": "lerna run --concurrency 8 --no-private build --skip-nx-cache", + "release:build": "pnpm docs:generate-llms && lerna run --concurrency 8 --no-private build --skip-nx-cache --", "release:changelog": "code-infra generate-changelog", "release:changelog:docs": "FORMAT=docs code-infra generate-changelog", "release:publish": "code-infra publish --github-release", diff --git a/packages/react/package.json b/packages/react/package.json index e23815a0b5f..435a11b4dcc 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -113,8 +113,8 @@ }, "type": "commonjs", "scripts": { - "prebuild": "rimraf --glob build build-tests \"*.tsbuildinfo\"", - "build": "code-infra build --ignore \"**/*.template.js\" --copy .npmignore", + "prebuild": "rimraf --glob build build-tests published-docs \"*.tsbuildinfo\" && node ./scripts/stagePublishedDocs.mjs", + "build": "code-infra build --ignore \"**/*.template.js\" --copy .npmignore --copy \"published-docs/**:docs\"", "test:package": "publint --pack pnpm && attw --pack ./build --exclude-entrypoints package.json --exclude-entrypoints esm --exclude-entrypoints cjs", "release": "pnpm build && pnpm publish", "test": "cross-env VITEST_ENV=jsdom vitest", diff --git a/packages/react/scripts/stagePublishedDocs.mjs b/packages/react/scripts/stagePublishedDocs.mjs new file mode 100644 index 00000000000..d9dfaf861de --- /dev/null +++ b/packages/react/scripts/stagePublishedDocs.mjs @@ -0,0 +1,24 @@ +/* eslint-disable no-console */ +import fs from 'node:fs/promises'; +import path from 'node:path'; + +const PACKAGE_ROOT = path.resolve(import.meta.dirname, '..'); +const DOCS_PUBLIC = path.resolve(PACKAGE_ROOT, '../../docs/public'); +const STAGE_DIR = path.join(PACKAGE_ROOT, 'published-docs'); + +await fs.rm(STAGE_DIR, { recursive: true, force: true }); + +let count = 0; +for await (const entry of fs.glob('**/*.md', { cwd: DOCS_PUBLIC })) { + const src = path.join(DOCS_PUBLIC, entry); + const dst = path.join(STAGE_DIR, entry); + await fs.mkdir(path.dirname(dst), { recursive: true }); + await fs.copyFile(src, dst); + count += 1; +} + +if (count === 0) { + throw new Error('No markdown files found in docs/public/. Run "pnpm docs:generate-llms" first.'); +} + +console.log(`[stage-docs] Staged ${count} markdown files into published-docs/.`);