From f56e0a30bf8b0e67e295ec3cf6306a5d0ddd3d2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leosvel=20P=C3=A9rez=20Espinosa?= Date: Mon, 11 Nov 2024 10:50:21 +0100 Subject: [PATCH 001/167] fix(devkit): do not write back to package.json when adding plugin and there are no changes (#28846) ## Current Behavior Generators adding plugins to `nx.json` can modify projects' `package.json` files with some JSON serialization changes even though there are no actual changes and prettier is not installed, so they shouldn't be formatted. ## Expected Behavior Generators adding plugins to `nx.json` should not modify projects' `package.json` files with JSON serialization changes when there are no actual changes to make and prettier is not installed. ## Related Issue(s) Fixes # --- packages/devkit/src/utils/add-plugin.spec.ts | 26 ++++++++++++++++++++ packages/devkit/src/utils/add-plugin.ts | 12 +++++---- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/packages/devkit/src/utils/add-plugin.spec.ts b/packages/devkit/src/utils/add-plugin.spec.ts index 12d214b0a86d99..70c8d547ea8507 100644 --- a/packages/devkit/src/utils/add-plugin.spec.ts +++ b/packages/devkit/src/utils/add-plugin.spec.ts @@ -431,6 +431,32 @@ describe('addPlugin', () => { 'echo "Typechecking..." && nx build -p tsconfig.lib.json && nx build -p tsconfig.spec.json && echo "Done"' ); }); + + it('should not touch the package.json when there are no changes to make', async () => { + // package.json with mixed/bad indentation and array value in a single line + // JSON serialization would have a standard indentation and would expand the array value into multiple lines + const packageJsonContent = `{ + "name": "app1", + "scripts": { + "build": "tsc --build" + }, + "keywords": ["foo", "bar", "baz"] +}`; + tree.write('app1/package.json', packageJsonContent); + + await addPlugin( + tree, + graph, + '@nx/next/plugin', + createNodes, + { + targetName: ['build'], + }, + true + ); + + expect(tree.read('app1/package.json', 'utf-8')).toBe(packageJsonContent); + }); }); }); diff --git a/packages/devkit/src/utils/add-plugin.ts b/packages/devkit/src/utils/add-plugin.ts index f4dc4472372dd6..09a3d772cd90dd 100644 --- a/packages/devkit/src/utils/add-plugin.ts +++ b/packages/devkit/src/utils/add-plugin.ts @@ -233,7 +233,7 @@ function processProject( return; } - const replacedTargets = new Set(); + let hasChanges = false; for (const targetCommand of targetCommands) { const { command, target, configuration } = targetCommand; const targetCommandRegex = new RegExp( @@ -250,7 +250,7 @@ function processProject( ? `$1nx ${target} --configuration=${configuration}$3` : `$1nx ${target}$3` ); - replacedTargets.add(target); + hasChanges = true; } else { /** * Parse script and command to handle the following: @@ -327,7 +327,7 @@ function processProject( : `$1nx ${target}$4` ) ); - replacedTargets.add(target); + hasChanges = true; } else { // there are different args or the script has extra args, replace with the command leaving the args packageJson.scripts[scriptName] = packageJson.scripts[ @@ -341,14 +341,16 @@ function processProject( : `$1nx ${target}$3` ) ); - replacedTargets.add(target); + hasChanges = true; } } } } } - writeJson(tree, packageJsonPath, packageJson); + if (hasChanges) { + writeJson(tree, packageJsonPath, packageJson); + } } function getInferredTargetCommands( From 3643f66b61ee92aa3818e25a654e98e6e40dd5c8 Mon Sep 17 00:00:00 2001 From: Ahmed Hakeem <65634467+Ahmed-Hakeem@users.noreply.github.com> Date: Mon, 11 Nov 2024 02:50:53 -0800 Subject: [PATCH 002/167] =?UTF-8?q?fix(graph):=20enable=20action=20on=20th?= =?UTF-8?q?e=20ViewOnGraph=20button=20regardless=20of=20the=E2=80=A6=20(#2?= =?UTF-8?q?8863)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Current Behavior ViewOnGraph button doesn't work until you open the accordion ## Expected Behavior ViewOnGraph button should direct to graph without the need to open the accordion first. I believe it's better from the UX prespective that user shouldn't click twice on the same button to fire its action. --- .../target-configuration-details-header.tsx | 3 --- 1 file changed, 3 deletions(-) diff --git a/graph/ui-project-details/src/lib/target-configuration-details-header/target-configuration-details-header.tsx b/graph/ui-project-details/src/lib/target-configuration-details-header/target-configuration-details-header.tsx index 271d1c83846a96..cb74c763819a46 100644 --- a/graph/ui-project-details/src/lib/target-configuration-details-header/target-configuration-details-header.tsx +++ b/graph/ui-project-details/src/lib/target-configuration-details-header/target-configuration-details-header.tsx @@ -166,9 +166,6 @@ export const TargetConfigurationDetailsHeader = ({ data-tooltip={isCollasped ? false : 'View in Task Graph'} data-tooltip-align-right onClick={(e) => { - if (isCollasped) { - return; - } e.stopPropagation(); onViewInTaskGraph({ projectName, targetName }); }} From 4bec699709aae9074d6bbb801df76b228c17af83 Mon Sep 17 00:00:00 2001 From: Juri Date: Mon, 11 Nov 2024 10:07:13 +0100 Subject: [PATCH 003/167] docs(misc): embed videos in various docs pages --- docs/nx-cloud/intro/connect-to-cloud.md | 2 +- .../images/nx-cloud/nx-cloud-overview.webp | Bin 68388 -> 0 bytes .../running-tasks/defining-task-pipeline.md | 2 ++ 3 files changed, 3 insertions(+), 1 deletion(-) delete mode 100644 docs/shared/images/nx-cloud/nx-cloud-overview.webp diff --git a/docs/nx-cloud/intro/connect-to-cloud.md b/docs/nx-cloud/intro/connect-to-cloud.md index e97e9945c3d813..d77c8d136b3440 100644 --- a/docs/nx-cloud/intro/connect-to-cloud.md +++ b/docs/nx-cloud/intro/connect-to-cloud.md @@ -2,7 +2,7 @@ Nx Cloud directly integrates with your existing CI setup. -![Nx Cloud Overview](/shared/images/nx-cloud/nx-cloud-overview.webp) +{% youtube src="https://youtu.be/8mqHXYIl_qI?si=fug4PsNGbxTloBpy" title="Connect your workspace to Nx Cloud" /%} Here's how you get set up. diff --git a/docs/shared/images/nx-cloud/nx-cloud-overview.webp b/docs/shared/images/nx-cloud/nx-cloud-overview.webp deleted file mode 100644 index 5814e0069f6d73e9542b83d588037d32159d8b49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68388 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%0DP2K8c2V-| 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�@@NAQMTM0?&+dDlf3+1=KOa2Zl)Cv1~L zHcZC-;kUNcFUd>}u7@}=H(k&0c%=};Rxxj(u=7*N15V< zlBed%@F0Y+%n;LyjSyKk1CNkriHC^t?Dwp@n2`{Q^rV10yz?+J>U-)mv2hzT8#D z4k)*gP>_AP_W2vz1I?7Q zA1r&#H?ZUaIug8k@zG%=05T~H9a!g>00H^E0wYpbjiS2ijWDhRAh+R3=k4|yO5jJ%6K zvxU(Mux+@AAWHOUmNM*R*vqkqR%?lCnwwYH%Ya!&G%5S2xr#*7vLCPYvxnPSij++nx(gO ziM7J6AfSYkj1}!*;6a!Tfrl%eTyzS7P-`w7bm&1#FUp3(@@4%>0RM&X(sapCN2h3k zsB<;VB*50OCA4R19PuSa+6lbr-`I4j5 zl3#qLs!zKoEEQB6!49YqMtr9Dk3BZF47V(6e zMF*(Y_-Dd+V`9ZPm8~J=GE_d+Ime12#v<9RKYa+xT&2vN8?lezGD^nSrWcu5Q82z_ zx>BtT4YJzFYyy4nnAjSUqmC;L`n@gR>`(6XnaHL0CO6P1>m#B0Q_J=4dT_cq;c$DU z4L~V^2vwAaleO!e6=N3;a|CCIc^6@aP9O(6bXQV9n1Qru#grjt4OXAGI zS2*buba!4q+)w#(-H;&e>uF1x9^fJGmQ}m-dZdrF%DtdlaF&u6yAQPvx-`>Gm(zKc z9h!k1?CYBToYX|f+$sLC^{;|&x0z8tdDD

~%Lu_-W0hC>@DDV9+$3_Ic|aDko>X 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 T00000000000000000000fCr*` diff --git a/docs/shared/recipes/running-tasks/defining-task-pipeline.md b/docs/shared/recipes/running-tasks/defining-task-pipeline.md index 22f643e7b9f704..17952aa3612f74 100644 --- a/docs/shared/recipes/running-tasks/defining-task-pipeline.md +++ b/docs/shared/recipes/running-tasks/defining-task-pipeline.md @@ -9,6 +9,8 @@ Running a specific task like `build` in a monorepo usually involves running mult If you want to learn more about the concept of a task pipeline and its importance in a monorepo, have a look at [the What is a Task Pipeline page](/concepts/task-pipeline-configuration). +{% youtube src="https://youtu.be/_U4hu6SuBaY?si=rSclPBdRh7P_xZ_f" title="Define a task pipeline" /%} + ## Define Dependencies Between Tasks You can define dependencies among tasks by using the `dependsOn` property: From b0a4291f0570ced26b8a8cddfe430695082e2046 Mon Sep 17 00:00:00 2001 From: Juri Date: Fri, 8 Nov 2024 17:05:25 +0100 Subject: [PATCH 004/167] docs(core): move nx release, MF and Nx Console recipes further up --- docs/generated/manifests/menus.json | 1960 +++++++------- docs/generated/manifests/nx.json | 3830 +++++++++++++-------------- docs/map.json | 306 +-- docs/shared/reference/sitemap.md | 50 +- 4 files changed, 3073 insertions(+), 3073 deletions(-) diff --git a/docs/generated/manifests/menus.json b/docs/generated/manifests/menus.json index bdc8569999c28b..e3a817a154b197 100644 --- a/docs/generated/manifests/menus.json +++ b/docs/generated/manifests/menus.json @@ -1246,6 +1246,209 @@ ], "disableCollapsible": false }, + { + "name": "Nx Release", + "path": "/recipes/nx-release", + "id": "nx-release", + "isExternal": false, + "children": [ + { + "name": "Get Started with Nx Release", + "path": "/recipes/nx-release/get-started-with-nx-release", + "id": "get-started-with-nx-release", + "isExternal": false, + "children": [], + "disableCollapsible": false + }, + { + "name": "Release Projects Independently", + "path": "/recipes/nx-release/release-projects-independently", + "id": "release-projects-independently", + "isExternal": false, + "children": [], + "disableCollapsible": false + }, + { + "name": "Automatically Version with Conventional Commits", + "path": "/recipes/nx-release/automatically-version-with-conventional-commits", + "id": "automatically-version-with-conventional-commits", + "isExternal": false, + "children": [], + "disableCollapsible": false + }, + { + "name": "Customize Conventional Commit Types", + "path": "/recipes/nx-release/customize-conventional-commit-types", + "id": "customize-conventional-commit-types", + "isExternal": false, + "children": [], + "disableCollapsible": false + }, + { + "name": "File Based Versioning (Version Plans)", + "path": "/recipes/nx-release/file-based-versioning-version-plans", + "id": "file-based-versioning-version-plans", + "isExternal": false, + "children": [], + "disableCollapsible": false + }, + { + "name": "Configure Custom Registries", + "path": "/recipes/nx-release/configure-custom-registries", + "id": "configure-custom-registries", + "isExternal": false, + "children": [], + "disableCollapsible": false + }, + { + "name": "Publish in CI/CD", + "path": "/recipes/nx-release/publish-in-ci-cd", + "id": "publish-in-ci-cd", + "isExternal": false, + "children": [], + "disableCollapsible": false + }, + { + "name": "Automate GitHub Releases", + "path": "/recipes/nx-release/automate-github-releases", + "id": "automate-github-releases", + "isExternal": false, + "children": [], + "disableCollapsible": false + }, + { + "name": "Publish Rust Crates", + "path": "/recipes/nx-release/publish-rust-crates", + "id": "publish-rust-crates", + "isExternal": false, + "children": [], + "disableCollapsible": false + }, + { + "name": "Update Your Local Registry Setup to use Nx Release", + "path": "/recipes/nx-release/update-local-registry-setup", + "id": "update-local-registry-setup", + "isExternal": false, + "children": [], + "disableCollapsible": false + }, + { + "name": "Configure Changelog Format", + "path": "/recipes/nx-release/configure-changelog-format", + "id": "configure-changelog-format", + "isExternal": false, + "children": [], + "disableCollapsible": false + }, + { + "name": "Publish a Custom Dist Directory", + "path": "/recipes/nx-release/publish-custom-dist-directory", + "id": "publish-custom-dist-directory", + "isExternal": false, + "children": [], + "disableCollapsible": false + }, + { + "name": "Build Before Versioning", + "path": "/recipes/nx-release/build-before-versioning", + "id": "build-before-versioning", + "isExternal": false, + "children": [], + "disableCollapsible": false + }, + { + "name": "Configuring Version Prefix for Dependency Versions", + "path": "/recipes/nx-release/configuration-version-prefix", + "id": "configuration-version-prefix", + "isExternal": false, + "children": [], + "disableCollapsible": false + } + ], + "disableCollapsible": false + }, + { + "name": "Module Federation", + "path": "/recipes/module-federation", + "id": "module-federation", + "isExternal": false, + "children": [ + { + "name": "How to create a Module Federation Host Application", + "path": "/recipes/module-federation/create-a-host", + "id": "create-a-host", + "isExternal": false, + "children": [], + "disableCollapsible": false + }, + { + "name": "How to create a Module Federation Remote Application", + "path": "/recipes/module-federation/create-a-remote", + "id": "create-a-remote", + "isExternal": false, + "children": [], + "disableCollapsible": false + }, + { + "name": "How to Federate a Module", + "path": "/recipes/module-federation/federate-a-module", + "id": "federate-a-module", + "isExternal": false, + "children": [], + "disableCollapsible": false + } + ], + "disableCollapsible": false + }, + { + "name": "Nx Console", + "path": "/recipes/nx-console", + "id": "nx-console", + "isExternal": false, + "children": [ + { + "name": "Telemetry", + "path": "/recipes/nx-console/console-telemetry", + "id": "console-telemetry", + "isExternal": false, + "children": [], + "disableCollapsible": false + }, + { + "name": "Project Details View", + "path": "/recipes/nx-console/console-project-details", + "id": "console-project-details", + "isExternal": false, + "children": [], + "disableCollapsible": false + }, + { + "name": "Generate Command", + "path": "/recipes/nx-console/console-generate-command", + "id": "console-generate-command", + "isExternal": false, + "children": [], + "disableCollapsible": false + }, + { + "name": "Run Command", + "path": "/recipes/nx-console/console-run-command", + "id": "console-run-command", + "isExternal": false, + "children": [], + "disableCollapsible": false + }, + { + "name": "Troubleshooting", + "path": "/recipes/nx-console/console-troubleshooting", + "id": "console-troubleshooting", + "isExternal": false, + "children": [], + "disableCollapsible": false + } + ], + "disableCollapsible": false + }, { "name": "React", "path": "/recipes/react", @@ -1664,39 +1867,6 @@ ], "disableCollapsible": false }, - { - "name": "Module Federation", - "path": "/recipes/module-federation", - "id": "module-federation", - "isExternal": false, - "children": [ - { - "name": "How to create a Module Federation Host Application", - "path": "/recipes/module-federation/create-a-host", - "id": "create-a-host", - "isExternal": false, - "children": [], - "disableCollapsible": false - }, - { - "name": "How to create a Module Federation Remote Application", - "path": "/recipes/module-federation/create-a-remote", - "id": "create-a-remote", - "isExternal": false, - "children": [], - "disableCollapsible": false - }, - { - "name": "How to Federate a Module", - "path": "/recipes/module-federation/federate-a-module", - "id": "federate-a-module", - "isExternal": false, - "children": [], - "disableCollapsible": false - } - ], - "disableCollapsible": false - }, { "name": "Enforce Module Boundaries", "path": "/recipes/enforce-module-boundaries", @@ -1874,190 +2044,20 @@ } ], "disableCollapsible": false - }, + } + ], + "disableCollapsible": false + }, + { + "name": "Installation", + "path": "/recipes/installation", + "id": "installation", + "isExternal": false, + "children": [ { - "name": "Nx Console", - "path": "/recipes/nx-console", - "id": "nx-console", - "isExternal": false, - "children": [ - { - "name": "Telemetry", - "path": "/recipes/nx-console/console-telemetry", - "id": "console-telemetry", - "isExternal": false, - "children": [], - "disableCollapsible": false - }, - { - "name": "Project Details View", - "path": "/recipes/nx-console/console-project-details", - "id": "console-project-details", - "isExternal": false, - "children": [], - "disableCollapsible": false - }, - { - "name": "Generate Command", - "path": "/recipes/nx-console/console-generate-command", - "id": "console-generate-command", - "isExternal": false, - "children": [], - "disableCollapsible": false - }, - { - "name": "Run Command", - "path": "/recipes/nx-console/console-run-command", - "id": "console-run-command", - "isExternal": false, - "children": [], - "disableCollapsible": false - }, - { - "name": "Troubleshooting", - "path": "/recipes/nx-console/console-troubleshooting", - "id": "console-troubleshooting", - "isExternal": false, - "children": [], - "disableCollapsible": false - } - ], - "disableCollapsible": false - }, - { - "name": "Nx Release", - "path": "/recipes/nx-release", - "id": "nx-release", - "isExternal": false, - "children": [ - { - "name": "Get Started with Nx Release", - "path": "/recipes/nx-release/get-started-with-nx-release", - "id": "get-started-with-nx-release", - "isExternal": false, - "children": [], - "disableCollapsible": false - }, - { - "name": "Release Projects Independently", - "path": "/recipes/nx-release/release-projects-independently", - "id": "release-projects-independently", - "isExternal": false, - "children": [], - "disableCollapsible": false - }, - { - "name": "Automatically Version with Conventional Commits", - "path": "/recipes/nx-release/automatically-version-with-conventional-commits", - "id": "automatically-version-with-conventional-commits", - "isExternal": false, - "children": [], - "disableCollapsible": false - }, - { - "name": "Customize Conventional Commit Types", - "path": "/recipes/nx-release/customize-conventional-commit-types", - "id": "customize-conventional-commit-types", - "isExternal": false, - "children": [], - "disableCollapsible": false - }, - { - "name": "File Based Versioning (Version Plans)", - "path": "/recipes/nx-release/file-based-versioning-version-plans", - "id": "file-based-versioning-version-plans", - "isExternal": false, - "children": [], - "disableCollapsible": false - }, - { - "name": "Configure Custom Registries", - "path": "/recipes/nx-release/configure-custom-registries", - "id": "configure-custom-registries", - "isExternal": false, - "children": [], - "disableCollapsible": false - }, - { - "name": "Publish in CI/CD", - "path": "/recipes/nx-release/publish-in-ci-cd", - "id": "publish-in-ci-cd", - "isExternal": false, - "children": [], - "disableCollapsible": false - }, - { - "name": "Automate GitHub Releases", - "path": "/recipes/nx-release/automate-github-releases", - "id": "automate-github-releases", - "isExternal": false, - "children": [], - "disableCollapsible": false - }, - { - "name": "Publish Rust Crates", - "path": "/recipes/nx-release/publish-rust-crates", - "id": "publish-rust-crates", - "isExternal": false, - "children": [], - "disableCollapsible": false - }, - { - "name": "Update Your Local Registry Setup to use Nx Release", - "path": "/recipes/nx-release/update-local-registry-setup", - "id": "update-local-registry-setup", - "isExternal": false, - "children": [], - "disableCollapsible": false - }, - { - "name": "Configure Changelog Format", - "path": "/recipes/nx-release/configure-changelog-format", - "id": "configure-changelog-format", - "isExternal": false, - "children": [], - "disableCollapsible": false - }, - { - "name": "Publish a Custom Dist Directory", - "path": "/recipes/nx-release/publish-custom-dist-directory", - "id": "publish-custom-dist-directory", - "isExternal": false, - "children": [], - "disableCollapsible": false - }, - { - "name": "Build Before Versioning", - "path": "/recipes/nx-release/build-before-versioning", - "id": "build-before-versioning", - "isExternal": false, - "children": [], - "disableCollapsible": false - }, - { - "name": "Configuring Version Prefix for Dependency Versions", - "path": "/recipes/nx-release/configuration-version-prefix", - "id": "configuration-version-prefix", - "isExternal": false, - "children": [], - "disableCollapsible": false - } - ], - "disableCollapsible": false - } - ], - "disableCollapsible": false - }, - { - "name": "Installation", - "path": "/recipes/installation", - "id": "installation", - "isExternal": false, - "children": [ - { - "name": "Install Nx in a Non-Javascript Repo", - "path": "/recipes/installation/install-non-javascript", - "id": "install-non-javascript", + "name": "Install Nx in a Non-Javascript Repo", + "path": "/recipes/installation/install-non-javascript", + "id": "install-non-javascript", "isExternal": false, "children": [], "disableCollapsible": false @@ -2396,209 +2396,119 @@ "disableCollapsible": false }, { - "name": "React", - "path": "/recipes/react", - "id": "react", + "name": "Nx Release", + "path": "/recipes/nx-release", + "id": "nx-release", "isExternal": false, "children": [ { - "name": "React Native with Nx", - "path": "/recipes/react/react-native", - "id": "react-native", + "name": "Get Started with Nx Release", + "path": "/recipes/nx-release/get-started-with-nx-release", + "id": "get-started-with-nx-release", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Remix with Nx", - "path": "/recipes/react/remix", - "id": "remix", + "name": "Release Projects Independently", + "path": "/recipes/nx-release/release-projects-independently", + "id": "release-projects-independently", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Use Environment Variables in React", - "path": "/recipes/react/use-environment-variables-in-react", - "id": "use-environment-variables-in-react", + "name": "Automatically Version with Conventional Commits", + "path": "/recipes/nx-release/automatically-version-with-conventional-commits", + "id": "automatically-version-with-conventional-commits", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Using Tailwind CSS in React", - "path": "/recipes/react/using-tailwind-css-in-react", - "id": "using-tailwind-css-in-react", + "name": "Customize Conventional Commit Types", + "path": "/recipes/nx-release/customize-conventional-commit-types", + "id": "customize-conventional-commit-types", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Adding Images, Fonts, and Files", - "path": "/recipes/react/adding-assets-react", - "id": "adding-assets-react", + "name": "File Based Versioning (Version Plans)", + "path": "/recipes/nx-release/file-based-versioning-version-plans", + "id": "file-based-versioning-version-plans", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Setup Module Federation with SSR for React", - "path": "/recipes/react/module-federation-with-ssr", - "id": "module-federation-with-ssr", + "name": "Configure Custom Registries", + "path": "/recipes/nx-release/configure-custom-registries", + "id": "configure-custom-registries", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Deploying Next.js applications to Vercel", - "path": "/recipes/react/deploy-nextjs-to-vercel", - "id": "deploy-nextjs-to-vercel", + "name": "Publish in CI/CD", + "path": "/recipes/nx-release/publish-in-ci-cd", + "id": "publish-in-ci-cd", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "React Compiler with Nx", - "path": "/recipes/react/react-compiler", - "id": "react-compiler", + "name": "Automate GitHub Releases", + "path": "/recipes/nx-release/automate-github-releases", + "id": "automate-github-releases", "isExternal": false, "children": [], "disableCollapsible": false - } - ], - "disableCollapsible": false - }, - { - "name": "React Native with Nx", - "path": "/recipes/react/react-native", - "id": "react-native", - "isExternal": false, - "children": [], - "disableCollapsible": false - }, - { - "name": "Remix with Nx", - "path": "/recipes/react/remix", - "id": "remix", - "isExternal": false, - "children": [], - "disableCollapsible": false - }, - { - "name": "Use Environment Variables in React", - "path": "/recipes/react/use-environment-variables-in-react", - "id": "use-environment-variables-in-react", - "isExternal": false, - "children": [], - "disableCollapsible": false - }, - { - "name": "Using Tailwind CSS in React", - "path": "/recipes/react/using-tailwind-css-in-react", - "id": "using-tailwind-css-in-react", - "isExternal": false, - "children": [], - "disableCollapsible": false - }, - { - "name": "Adding Images, Fonts, and Files", - "path": "/recipes/react/adding-assets-react", - "id": "adding-assets-react", - "isExternal": false, - "children": [], - "disableCollapsible": false - }, - { - "name": "Setup Module Federation with SSR for React", - "path": "/recipes/react/module-federation-with-ssr", - "id": "module-federation-with-ssr", - "isExternal": false, - "children": [], - "disableCollapsible": false - }, - { - "name": "Deploying Next.js applications to Vercel", - "path": "/recipes/react/deploy-nextjs-to-vercel", - "id": "deploy-nextjs-to-vercel", - "isExternal": false, - "children": [], - "disableCollapsible": false - }, - { - "name": "React Compiler with Nx", - "path": "/recipes/react/react-compiler", - "id": "react-compiler", - "isExternal": false, - "children": [], - "disableCollapsible": false - }, - { - "name": "Angular", - "path": "/recipes/angular", - "id": "angular", - "isExternal": false, - "children": [ + }, { - "name": "Migration", - "path": "/recipes/angular/migration", - "id": "migration", + "name": "Publish Rust Crates", + "path": "/recipes/nx-release/publish-rust-crates", + "id": "publish-rust-crates", "isExternal": false, - "children": [ - { - "name": "Migrating from Angular CLI", - "path": "/recipes/angular/migration/angular", - "id": "angular", - "isExternal": false, - "children": [], - "disableCollapsible": false - }, - { - "name": "Migrating From Multiple Angular CLI Repos", - "path": "/recipes/angular/migration/angular-multiple", - "id": "angular-multiple", - "isExternal": false, - "children": [], - "disableCollapsible": false - } - ], + "children": [], "disableCollapsible": false }, { - "name": "Use Environment Variables in Angular", - "path": "/recipes/angular/use-environment-variables-in-angular", - "id": "use-environment-variables-in-angular", + "name": "Update Your Local Registry Setup to use Nx Release", + "path": "/recipes/nx-release/update-local-registry-setup", + "id": "update-local-registry-setup", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Using Tailwind CSS with Angular projects", - "path": "/recipes/angular/using-tailwind-css-with-angular-projects", - "id": "using-tailwind-css-with-angular-projects", + "name": "Configure Changelog Format", + "path": "/recipes/nx-release/configure-changelog-format", + "id": "configure-changelog-format", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Setup Module Federation with SSR for Angular", - "path": "/recipes/angular/module-federation-with-ssr", - "id": "module-federation-with-ssr", + "name": "Publish a Custom Dist Directory", + "path": "/recipes/nx-release/publish-custom-dist-directory", + "id": "publish-custom-dist-directory", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Advanced Micro Frontends with Angular using Dynamic Federation", - "path": "/recipes/angular/dynamic-module-federation-with-angular", - "id": "dynamic-module-federation-with-angular", + "name": "Build Before Versioning", + "path": "/recipes/nx-release/build-before-versioning", + "id": "build-before-versioning", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Setup incremental builds for Angular applications", - "path": "/recipes/angular/setup-incremental-builds-angular", - "id": "setup-incremental-builds-angular", + "name": "Configuring Version Prefix for Dependency Versions", + "path": "/recipes/nx-release/configuration-version-prefix", + "id": "configuration-version-prefix", "isExternal": false, "children": [], "disableCollapsible": false @@ -2607,281 +2517,329 @@ "disableCollapsible": false }, { - "name": "Migration", - "path": "/recipes/angular/migration", - "id": "migration", + "name": "Get Started with Nx Release", + "path": "/recipes/nx-release/get-started-with-nx-release", + "id": "get-started-with-nx-release", "isExternal": false, - "children": [ - { - "name": "Migrating from Angular CLI", - "path": "/recipes/angular/migration/angular", - "id": "angular", - "isExternal": false, - "children": [], - "disableCollapsible": false - }, - { - "name": "Migrating From Multiple Angular CLI Repos", - "path": "/recipes/angular/migration/angular-multiple", - "id": "angular-multiple", - "isExternal": false, - "children": [], - "disableCollapsible": false - } - ], + "children": [], "disableCollapsible": false }, { - "name": "Migrating from Angular CLI", - "path": "/recipes/angular/migration/angular", - "id": "angular", + "name": "Release Projects Independently", + "path": "/recipes/nx-release/release-projects-independently", + "id": "release-projects-independently", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Migrating From Multiple Angular CLI Repos", - "path": "/recipes/angular/migration/angular-multiple", - "id": "angular-multiple", + "name": "Automatically Version with Conventional Commits", + "path": "/recipes/nx-release/automatically-version-with-conventional-commits", + "id": "automatically-version-with-conventional-commits", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Use Environment Variables in Angular", - "path": "/recipes/angular/use-environment-variables-in-angular", - "id": "use-environment-variables-in-angular", + "name": "Customize Conventional Commit Types", + "path": "/recipes/nx-release/customize-conventional-commit-types", + "id": "customize-conventional-commit-types", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Using Tailwind CSS with Angular projects", - "path": "/recipes/angular/using-tailwind-css-with-angular-projects", - "id": "using-tailwind-css-with-angular-projects", + "name": "File Based Versioning (Version Plans)", + "path": "/recipes/nx-release/file-based-versioning-version-plans", + "id": "file-based-versioning-version-plans", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Setup Module Federation with SSR for Angular", - "path": "/recipes/angular/module-federation-with-ssr", - "id": "module-federation-with-ssr", + "name": "Configure Custom Registries", + "path": "/recipes/nx-release/configure-custom-registries", + "id": "configure-custom-registries", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Advanced Micro Frontends with Angular using Dynamic Federation", - "path": "/recipes/angular/dynamic-module-federation-with-angular", - "id": "dynamic-module-federation-with-angular", + "name": "Publish in CI/CD", + "path": "/recipes/nx-release/publish-in-ci-cd", + "id": "publish-in-ci-cd", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Setup incremental builds for Angular applications", - "path": "/recipes/angular/setup-incremental-builds-angular", - "id": "setup-incremental-builds-angular", + "name": "Automate GitHub Releases", + "path": "/recipes/nx-release/automate-github-releases", + "id": "automate-github-releases", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Node", - "path": "/recipes/node", - "id": "node", + "name": "Publish Rust Crates", + "path": "/recipes/nx-release/publish-rust-crates", + "id": "publish-rust-crates", "isExternal": false, - "children": [ - { - "name": "Deploying a Node App to Fly.io", - "path": "/recipes/node/node-server-fly-io", - "id": "node-server-fly-io", - "isExternal": false, - "children": [], - "disableCollapsible": false - }, - { - "name": "Add and Deploy Netlify Edge Functions with Node", - "path": "/recipes/node/node-serverless-functions-netlify", - "id": "node-serverless-functions-netlify", - "isExternal": false, - "children": [], - "disableCollapsible": false - }, - { - "name": "Deploying AWS lambda in Node.js (deprecated)", - "path": "/recipes/node/node-aws-lambda", - "id": "node-aws-lambda", - "isExternal": false, - "children": [], - "disableCollapsible": false - }, - { - "name": "Set Up Application Proxies", - "path": "/recipes/node/application-proxies", - "id": "application-proxies", - "isExternal": false, - "children": [], - "disableCollapsible": false - }, - { - "name": "Wait for Tasks to Finish", - "path": "/recipes/node/wait-for-tasks", - "id": "wait-for-tasks", - "isExternal": false, - "children": [], - "disableCollapsible": false - } - ], + "children": [], "disableCollapsible": false }, { - "name": "Deploying a Node App to Fly.io", - "path": "/recipes/node/node-server-fly-io", - "id": "node-server-fly-io", + "name": "Update Your Local Registry Setup to use Nx Release", + "path": "/recipes/nx-release/update-local-registry-setup", + "id": "update-local-registry-setup", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Add and Deploy Netlify Edge Functions with Node", - "path": "/recipes/node/node-serverless-functions-netlify", - "id": "node-serverless-functions-netlify", + "name": "Configure Changelog Format", + "path": "/recipes/nx-release/configure-changelog-format", + "id": "configure-changelog-format", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Deploying AWS lambda in Node.js (deprecated)", - "path": "/recipes/node/node-aws-lambda", - "id": "node-aws-lambda", + "name": "Publish a Custom Dist Directory", + "path": "/recipes/nx-release/publish-custom-dist-directory", + "id": "publish-custom-dist-directory", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Set Up Application Proxies", - "path": "/recipes/node/application-proxies", - "id": "application-proxies", + "name": "Build Before Versioning", + "path": "/recipes/nx-release/build-before-versioning", + "id": "build-before-versioning", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Wait for Tasks to Finish", - "path": "/recipes/node/wait-for-tasks", - "id": "wait-for-tasks", + "name": "Configuring Version Prefix for Dependency Versions", + "path": "/recipes/nx-release/configuration-version-prefix", + "id": "configuration-version-prefix", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Storybook", - "path": "/recipes/storybook", - "id": "storybook", + "name": "Module Federation", + "path": "/recipes/module-federation", + "id": "module-federation", "isExternal": false, "children": [ { - "name": "Set up Storybook for React Projects", - "path": "/recipes/storybook/overview-react", - "id": "overview-react", + "name": "How to create a Module Federation Host Application", + "path": "/recipes/module-federation/create-a-host", + "id": "create-a-host", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Set up Storybook for Angular Projects", - "path": "/recipes/storybook/overview-angular", - "id": "overview-angular", + "name": "How to create a Module Federation Remote Application", + "path": "/recipes/module-federation/create-a-remote", + "id": "create-a-remote", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Set up Storybook for Vue Projects", - "path": "/recipes/storybook/overview-vue", - "id": "overview-vue", + "name": "How to Federate a Module", + "path": "/recipes/module-federation/federate-a-module", + "id": "federate-a-module", + "isExternal": false, + "children": [], + "disableCollapsible": false + } + ], + "disableCollapsible": false + }, + { + "name": "How to create a Module Federation Host Application", + "path": "/recipes/module-federation/create-a-host", + "id": "create-a-host", + "isExternal": false, + "children": [], + "disableCollapsible": false + }, + { + "name": "How to create a Module Federation Remote Application", + "path": "/recipes/module-federation/create-a-remote", + "id": "create-a-remote", + "isExternal": false, + "children": [], + "disableCollapsible": false + }, + { + "name": "How to Federate a Module", + "path": "/recipes/module-federation/federate-a-module", + "id": "federate-a-module", + "isExternal": false, + "children": [], + "disableCollapsible": false + }, + { + "name": "Nx Console", + "path": "/recipes/nx-console", + "id": "nx-console", + "isExternal": false, + "children": [ + { + "name": "Telemetry", + "path": "/recipes/nx-console/console-telemetry", + "id": "console-telemetry", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Configuring Storybook on Nx", - "path": "/recipes/storybook/configuring-storybook", - "id": "configuring-storybook", + "name": "Project Details View", + "path": "/recipes/nx-console/console-project-details", + "id": "console-project-details", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "One main Storybook instance for all projects", - "path": "/recipes/storybook/one-storybook-for-all", - "id": "one-storybook-for-all", + "name": "Generate Command", + "path": "/recipes/nx-console/console-generate-command", + "id": "console-generate-command", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "One Storybook instance per scope", - "path": "/recipes/storybook/one-storybook-per-scope", - "id": "one-storybook-per-scope", + "name": "Run Command", + "path": "/recipes/nx-console/console-run-command", + "id": "console-run-command", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "One main Storybook instance using Storybook Composition", - "path": "/recipes/storybook/one-storybook-with-composition", - "id": "one-storybook-with-composition", + "name": "Troubleshooting", + "path": "/recipes/nx-console/console-troubleshooting", + "id": "console-troubleshooting", + "isExternal": false, + "children": [], + "disableCollapsible": false + } + ], + "disableCollapsible": false + }, + { + "name": "Telemetry", + "path": "/recipes/nx-console/console-telemetry", + "id": "console-telemetry", + "isExternal": false, + "children": [], + "disableCollapsible": false + }, + { + "name": "Project Details View", + "path": "/recipes/nx-console/console-project-details", + "id": "console-project-details", + "isExternal": false, + "children": [], + "disableCollapsible": false + }, + { + "name": "Generate Command", + "path": "/recipes/nx-console/console-generate-command", + "id": "console-generate-command", + "isExternal": false, + "children": [], + "disableCollapsible": false + }, + { + "name": "Run Command", + "path": "/recipes/nx-console/console-run-command", + "id": "console-run-command", + "isExternal": false, + "children": [], + "disableCollapsible": false + }, + { + "name": "Troubleshoot Nx Console Issues", + "path": "/recipes/nx-console/console-troubleshooting", + "id": "console-troubleshooting", + "isExternal": false, + "children": [], + "disableCollapsible": false + }, + { + "name": "React", + "path": "/recipes/react", + "id": "react", + "isExternal": false, + "children": [ + { + "name": "React Native with Nx", + "path": "/recipes/react/react-native", + "id": "react-native", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "How to configure Webpack and Vite for Storybook", - "path": "/recipes/storybook/custom-builder-configs", - "id": "custom-builder-configs", + "name": "Remix with Nx", + "path": "/recipes/react/remix", + "id": "remix", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Setting up Storybook Interaction Tests with Nx", - "path": "/recipes/storybook/storybook-interaction-tests", - "id": "storybook-interaction-tests", + "name": "Use Environment Variables in React", + "path": "/recipes/react/use-environment-variables-in-react", + "id": "use-environment-variables-in-react", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Upgrading Storybook using the Storybook CLI", - "path": "/recipes/storybook/upgrading-storybook", - "id": "upgrading-storybook", + "name": "Using Tailwind CSS in React", + "path": "/recipes/react/using-tailwind-css-in-react", + "id": "using-tailwind-css-in-react", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Setting up Storybook Composition with Nx", - "path": "/recipes/storybook/storybook-composition-setup", - "id": "storybook-composition-setup", + "name": "Adding Images, Fonts, and Files", + "path": "/recipes/react/adding-assets-react", + "id": "adding-assets-react", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Angular: Set up Compodoc for Storybook on Nx", - "path": "/recipes/storybook/angular-storybook-compodoc", - "id": "angular-storybook-compodoc", + "name": "Setup Module Federation with SSR for React", + "path": "/recipes/react/module-federation-with-ssr", + "id": "module-federation-with-ssr", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Angular: Configuring styles and preprocessor options", - "path": "/recipes/storybook/angular-configuring-styles", - "id": "angular-configuring-styles", + "name": "Deploying Next.js applications to Vercel", + "path": "/recipes/react/deploy-nextjs-to-vercel", + "id": "deploy-nextjs-to-vercel", + "isExternal": false, + "children": [], + "disableCollapsible": false + }, + { + "name": "React Compiler with Nx", + "path": "/recipes/react/react-compiler", + "id": "react-compiler", "isExternal": false, "children": [], "disableCollapsible": false @@ -2890,226 +2848,136 @@ "disableCollapsible": false }, { - "name": "Set up Storybook for React Projects", - "path": "/recipes/storybook/overview-react", - "id": "overview-react", - "isExternal": false, - "children": [], - "disableCollapsible": false - }, - { - "name": "Set up Storybook for Angular Projects", - "path": "/recipes/storybook/overview-angular", - "id": "overview-angular", - "isExternal": false, - "children": [], - "disableCollapsible": false - }, - { - "name": "Set up Storybook for Vue Projects", - "path": "/recipes/storybook/overview-vue", - "id": "overview-vue", + "name": "React Native with Nx", + "path": "/recipes/react/react-native", + "id": "react-native", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Configuring Storybook on Nx", - "path": "/recipes/storybook/configuring-storybook", - "id": "configuring-storybook", + "name": "Remix with Nx", + "path": "/recipes/react/remix", + "id": "remix", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "One main Storybook instance for all projects", - "path": "/recipes/storybook/one-storybook-for-all", - "id": "one-storybook-for-all", + "name": "Use Environment Variables in React", + "path": "/recipes/react/use-environment-variables-in-react", + "id": "use-environment-variables-in-react", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "One Storybook instance per scope", - "path": "/recipes/storybook/one-storybook-per-scope", - "id": "one-storybook-per-scope", + "name": "Using Tailwind CSS in React", + "path": "/recipes/react/using-tailwind-css-in-react", + "id": "using-tailwind-css-in-react", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "One main Storybook instance using Storybook Composition", - "path": "/recipes/storybook/one-storybook-with-composition", - "id": "one-storybook-with-composition", + "name": "Adding Images, Fonts, and Files", + "path": "/recipes/react/adding-assets-react", + "id": "adding-assets-react", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "How to configure Webpack and Vite for Storybook", - "path": "/recipes/storybook/custom-builder-configs", - "id": "custom-builder-configs", + "name": "Setup Module Federation with SSR for React", + "path": "/recipes/react/module-federation-with-ssr", + "id": "module-federation-with-ssr", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Setting up Storybook Interaction Tests with Nx", - "path": "/recipes/storybook/storybook-interaction-tests", - "id": "storybook-interaction-tests", + "name": "Deploying Next.js applications to Vercel", + "path": "/recipes/react/deploy-nextjs-to-vercel", + "id": "deploy-nextjs-to-vercel", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Upgrading Storybook using the Storybook CLI", - "path": "/recipes/storybook/upgrading-storybook", - "id": "upgrading-storybook", + "name": "React Compiler with Nx", + "path": "/recipes/react/react-compiler", + "id": "react-compiler", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Setting up Storybook Composition with Nx", - "path": "/recipes/storybook/storybook-composition-setup", - "id": "storybook-composition-setup", - "isExternal": false, - "children": [], - "disableCollapsible": false - }, - { - "name": "Angular: Set up Compodoc for Storybook on Nx", - "path": "/recipes/storybook/angular-storybook-compodoc", - "id": "angular-storybook-compodoc", - "isExternal": false, - "children": [], - "disableCollapsible": false - }, - { - "name": "Angular: Configuring styles and preprocessor options", - "path": "/recipes/storybook/angular-configuring-styles", - "id": "angular-configuring-styles", - "isExternal": false, - "children": [], - "disableCollapsible": false - }, - { - "name": "Cypress", - "path": "/recipes/cypress", - "id": "cypress", + "name": "Angular", + "path": "/recipes/angular", + "id": "angular", "isExternal": false, "children": [ { - "name": "Component Testing", - "path": "/recipes/cypress/cypress-component-testing", - "id": "cypress-component-testing", + "name": "Migration", + "path": "/recipes/angular/migration", + "id": "migration", "isExternal": false, - "children": [], + "children": [ + { + "name": "Migrating from Angular CLI", + "path": "/recipes/angular/migration/angular", + "id": "angular", + "isExternal": false, + "children": [], + "disableCollapsible": false + }, + { + "name": "Migrating From Multiple Angular CLI Repos", + "path": "/recipes/angular/migration/angular-multiple", + "id": "angular-multiple", + "isExternal": false, + "children": [], + "disableCollapsible": false + } + ], "disableCollapsible": false }, { - "name": "Using setupNodeEvents with Cypress preset", - "path": "/recipes/cypress/cypress-setup-node-events", - "id": "cypress-setup-node-events", + "name": "Use Environment Variables in Angular", + "path": "/recipes/angular/use-environment-variables-in-angular", + "id": "use-environment-variables-in-angular", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Cypress v11 Migration Guide", - "path": "/recipes/cypress/cypress-v11-migration", - "id": "cypress-v11-migration", + "name": "Using Tailwind CSS with Angular projects", + "path": "/recipes/angular/using-tailwind-css-with-angular-projects", + "id": "using-tailwind-css-with-angular-projects", "isExternal": false, "children": [], "disableCollapsible": false - } - ], - "disableCollapsible": false - }, - { - "name": "Component Testing", - "path": "/recipes/cypress/cypress-component-testing", - "id": "cypress-component-testing", - "isExternal": false, - "children": [], - "disableCollapsible": false - }, - { - "name": "Using setupNodeEvents with Cypress preset", - "path": "/recipes/cypress/cypress-setup-node-events", - "id": "cypress-setup-node-events", - "isExternal": false, - "children": [], - "disableCollapsible": false - }, - { - "name": "Cypress v11 Migration Guide", - "path": "/recipes/cypress/cypress-v11-migration", - "id": "cypress-v11-migration", - "isExternal": false, - "children": [], - "disableCollapsible": false - }, - { - "name": "Next", - "path": "/recipes/next", - "id": "next", - "isExternal": false, - "children": [ + }, { - "name": "How to configure Next.js plugins", - "path": "/recipes/next/next-config-setup", - "id": "next-config-setup", + "name": "Setup Module Federation with SSR for Angular", + "path": "/recipes/angular/module-federation-with-ssr", + "id": "module-federation-with-ssr", "isExternal": false, "children": [], "disableCollapsible": false - } - ], - "disableCollapsible": false - }, - { - "name": "How to configure Next.js plugins", - "path": "/recipes/next/next-config-setup", - "id": "next-config-setup", - "isExternal": false, - "children": [], - "disableCollapsible": false - }, - { - "name": "Nuxt", - "path": "/recipes/nuxt", - "id": "nuxt", - "isExternal": false, - "children": [ + }, { - "name": "Deploying Nuxt applications to Vercel", - "path": "/recipes/nuxt/deploy-nuxt-to-vercel", - "id": "deploy-nuxt-to-vercel", + "name": "Advanced Micro Frontends with Angular using Dynamic Federation", + "path": "/recipes/angular/dynamic-module-federation-with-angular", + "id": "dynamic-module-federation-with-angular", "isExternal": false, "children": [], "disableCollapsible": false - } - ], - "disableCollapsible": false - }, - { - "name": "Deploying Nuxt applications to Vercel", - "path": "/recipes/nuxt/deploy-nuxt-to-vercel", - "id": "deploy-nuxt-to-vercel", - "isExternal": false, - "children": [], - "disableCollapsible": false - }, - { - "name": "Vite", - "path": "/recipes/vite", - "id": "vite", - "isExternal": false, - "children": [ + }, { - "name": "Configure Vite on your Nx workspace", - "path": "/recipes/vite/configure-vite", - "id": "configure-vite", + "name": "Setup incremental builds for Angular applications", + "path": "/recipes/angular/setup-incremental-builds-angular", + "id": "setup-incremental-builds-angular", "isExternal": false, "children": [], "disableCollapsible": false @@ -3118,31 +2986,23 @@ "disableCollapsible": false }, { - "name": "Configure Vite on your Nx workspace", - "path": "/recipes/vite/configure-vite", - "id": "configure-vite", - "isExternal": false, - "children": [], - "disableCollapsible": false - }, - { - "name": "Webpack", - "path": "/recipes/webpack", - "id": "webpack", + "name": "Migration", + "path": "/recipes/angular/migration", + "id": "migration", "isExternal": false, "children": [ { - "name": "How to configure Webpack in your Nx workspace", - "path": "/recipes/webpack/webpack-config-setup", - "id": "webpack-config-setup", + "name": "Migrating from Angular CLI", + "path": "/recipes/angular/migration/angular", + "id": "angular", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Webpack plugins", - "path": "/recipes/webpack/webpack-plugins", - "id": "webpack-plugins", + "name": "Migrating From Multiple Angular CLI Repos", + "path": "/recipes/angular/migration/angular-multiple", + "id": "angular-multiple", "isExternal": false, "children": [], "disableCollapsible": false @@ -3151,112 +3011,103 @@ "disableCollapsible": false }, { - "name": "How to configure Webpack in your Nx workspace", - "path": "/recipes/webpack/webpack-config-setup", - "id": "webpack-config-setup", + "name": "Migrating from Angular CLI", + "path": "/recipes/angular/migration/angular", + "id": "angular", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Webpack plugins", - "path": "/recipes/webpack/webpack-plugins", - "id": "webpack-plugins", + "name": "Migrating From Multiple Angular CLI Repos", + "path": "/recipes/angular/migration/angular-multiple", + "id": "angular-multiple", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Module Federation", - "path": "/recipes/module-federation", - "id": "module-federation", + "name": "Use Environment Variables in Angular", + "path": "/recipes/angular/use-environment-variables-in-angular", + "id": "use-environment-variables-in-angular", "isExternal": false, - "children": [ - { - "name": "How to create a Module Federation Host Application", - "path": "/recipes/module-federation/create-a-host", - "id": "create-a-host", - "isExternal": false, - "children": [], - "disableCollapsible": false - }, - { - "name": "How to create a Module Federation Remote Application", - "path": "/recipes/module-federation/create-a-remote", - "id": "create-a-remote", - "isExternal": false, - "children": [], - "disableCollapsible": false - }, - { - "name": "How to Federate a Module", - "path": "/recipes/module-federation/federate-a-module", - "id": "federate-a-module", - "isExternal": false, - "children": [], - "disableCollapsible": false - } - ], + "children": [], "disableCollapsible": false }, { - "name": "How to create a Module Federation Host Application", - "path": "/recipes/module-federation/create-a-host", - "id": "create-a-host", + "name": "Using Tailwind CSS with Angular projects", + "path": "/recipes/angular/using-tailwind-css-with-angular-projects", + "id": "using-tailwind-css-with-angular-projects", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "How to create a Module Federation Remote Application", - "path": "/recipes/module-federation/create-a-remote", - "id": "create-a-remote", + "name": "Setup Module Federation with SSR for Angular", + "path": "/recipes/angular/module-federation-with-ssr", + "id": "module-federation-with-ssr", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "How to Federate a Module", - "path": "/recipes/module-federation/federate-a-module", - "id": "federate-a-module", + "name": "Advanced Micro Frontends with Angular using Dynamic Federation", + "path": "/recipes/angular/dynamic-module-federation-with-angular", + "id": "dynamic-module-federation-with-angular", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Enforce Module Boundaries", - "path": "/recipes/enforce-module-boundaries", - "id": "enforce-module-boundaries", + "name": "Setup incremental builds for Angular applications", + "path": "/recipes/angular/setup-incremental-builds-angular", + "id": "setup-incremental-builds-angular", + "isExternal": false, + "children": [], + "disableCollapsible": false + }, + { + "name": "Node", + "path": "/recipes/node", + "id": "node", "isExternal": false, "children": [ { - "name": "Ban Dependencies with Certain Tags", - "path": "/recipes/enforce-module-boundaries/ban-dependencies-with-tags", - "id": "ban-dependencies-with-tags", + "name": "Deploying a Node App to Fly.io", + "path": "/recipes/node/node-server-fly-io", + "id": "node-server-fly-io", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Tag in Multiple Dimensions", - "path": "/recipes/enforce-module-boundaries/tag-multiple-dimensions", - "id": "tag-multiple-dimensions", + "name": "Add and Deploy Netlify Edge Functions with Node", + "path": "/recipes/node/node-serverless-functions-netlify", + "id": "node-serverless-functions-netlify", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Ban External Imports", - "path": "/recipes/enforce-module-boundaries/ban-external-imports", - "id": "ban-external-imports", + "name": "Deploying AWS lambda in Node.js (deprecated)", + "path": "/recipes/node/node-aws-lambda", + "id": "node-aws-lambda", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Tags Allow List", - "path": "/recipes/enforce-module-boundaries/tags-allow-list", - "id": "tags-allow-list", + "name": "Set Up Application Proxies", + "path": "/recipes/node/application-proxies", + "id": "application-proxies", + "isExternal": false, + "children": [], + "disableCollapsible": false + }, + { + "name": "Wait for Tasks to Finish", + "path": "/recipes/node/wait-for-tasks", + "id": "wait-for-tasks", "isExternal": false, "children": [], "disableCollapsible": false @@ -3265,167 +3116,151 @@ "disableCollapsible": false }, { - "name": "Ban Dependencies with Certain Tags", - "path": "/recipes/enforce-module-boundaries/ban-dependencies-with-tags", - "id": "ban-dependencies-with-tags", + "name": "Deploying a Node App to Fly.io", + "path": "/recipes/node/node-server-fly-io", + "id": "node-server-fly-io", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Tag in Multiple Dimensions", - "path": "/recipes/enforce-module-boundaries/tag-multiple-dimensions", - "id": "tag-multiple-dimensions", + "name": "Add and Deploy Netlify Edge Functions with Node", + "path": "/recipes/node/node-serverless-functions-netlify", + "id": "node-serverless-functions-netlify", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Ban External Imports", - "path": "/recipes/enforce-module-boundaries/ban-external-imports", - "id": "ban-external-imports", + "name": "Deploying AWS lambda in Node.js (deprecated)", + "path": "/recipes/node/node-aws-lambda", + "id": "node-aws-lambda", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Tags Allow List", - "path": "/recipes/enforce-module-boundaries/tags-allow-list", - "id": "tags-allow-list", + "name": "Set Up Application Proxies", + "path": "/recipes/node/application-proxies", + "id": "application-proxies", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Tips and tricks", - "path": "/recipes/tips-n-tricks", - "id": "tips-n-tricks", + "name": "Wait for Tasks to Finish", + "path": "/recipes/node/wait-for-tasks", + "id": "wait-for-tasks", + "isExternal": false, + "children": [], + "disableCollapsible": false + }, + { + "name": "Storybook", + "path": "/recipes/storybook", + "id": "storybook", "isExternal": false, "children": [ { - "name": "Convert from a Standalone Repository to a Monorepo", - "path": "/recipes/tips-n-tricks/standalone-to-monorepo", - "id": "standalone-to-monorepo", - "isExternal": false, - "children": [], - "disableCollapsible": false - }, - { - "name": "Configuring ESLint with Typescript", - "path": "/recipes/tips-n-tricks/eslint", - "id": "eslint", - "isExternal": false, - "children": [], - "disableCollapsible": false - }, - { - "name": "Enable Typescript Batch Mode", - "path": "/recipes/tips-n-tricks/enable-tsc-batch-mode", - "id": "enable-tsc-batch-mode", - "isExternal": false, - "children": [], - "disableCollapsible": false - }, - { - "name": "Define Secondary Entrypoints for Typescript Packages", - "path": "/recipes/tips-n-tricks/define-secondary-entrypoints", - "id": "define-secondary-entrypoints", + "name": "Set up Storybook for React Projects", + "path": "/recipes/storybook/overview-react", + "id": "overview-react", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Compile Typescript Packages to Multiple Formats", - "path": "/recipes/tips-n-tricks/compile-multiple-formats", - "id": "compile-multiple-formats", + "name": "Set up Storybook for Angular Projects", + "path": "/recipes/storybook/overview-angular", + "id": "overview-angular", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Keep Nx Versions in Sync", - "path": "/recipes/tips-n-tricks/keep-nx-versions-in-sync", - "id": "keep-nx-versions-in-sync", + "name": "Set up Storybook for Vue Projects", + "path": "/recipes/storybook/overview-vue", + "id": "overview-vue", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Define Environment Variables", - "path": "/recipes/tips-n-tricks/define-environment-variables", - "id": "define-environment-variables", + "name": "Configuring Storybook on Nx", + "path": "/recipes/storybook/configuring-storybook", + "id": "configuring-storybook", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Configuring Browser Support", - "path": "/recipes/tips-n-tricks/browser-support", - "id": "browser-support", + "name": "One main Storybook instance for all projects", + "path": "/recipes/storybook/one-storybook-for-all", + "id": "one-storybook-for-all", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Include Assets in Build", - "path": "/recipes/tips-n-tricks/include-assets-in-build", - "id": "include-assets-in-build", + "name": "One Storybook instance per scope", + "path": "/recipes/storybook/one-storybook-per-scope", + "id": "one-storybook-per-scope", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Include All package.json Files as Projects", - "path": "/recipes/tips-n-tricks/include-all-packagejson", - "id": "include-all-packagejson", + "name": "One main Storybook instance using Storybook Composition", + "path": "/recipes/storybook/one-storybook-with-composition", + "id": "one-storybook-with-composition", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Identify Dependencies Between Folders", - "path": "/recipes/tips-n-tricks/identify-dependencies-between-folders", - "id": "identify-dependencies-between-folders", + "name": "How to configure Webpack and Vite for Storybook", + "path": "/recipes/storybook/custom-builder-configs", + "id": "custom-builder-configs", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Disable Graph Links Created from Analyzing Source Files", - "path": "/recipes/tips-n-tricks/analyze-source-files", - "id": "analyze-source-files", + "name": "Setting up Storybook Interaction Tests with Nx", + "path": "/recipes/storybook/storybook-interaction-tests", + "id": "storybook-interaction-tests", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Use JavaScript instead TypeScript", - "path": "/recipes/tips-n-tricks/js-and-ts", - "id": "js-and-ts", + "name": "Upgrading Storybook using the Storybook CLI", + "path": "/recipes/storybook/upgrading-storybook", + "id": "upgrading-storybook", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Altering Migration Process", - "path": "/recipes/tips-n-tricks/advanced-update", - "id": "advanced-update", + "name": "Setting up Storybook Composition with Nx", + "path": "/recipes/storybook/storybook-composition-setup", + "id": "storybook-composition-setup", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Using Yarn PnP", - "path": "/recipes/tips-n-tricks/yarn-pnp", - "id": "yarn-pnp", + "name": "Angular: Set up Compodoc for Storybook on Nx", + "path": "/recipes/storybook/angular-storybook-compodoc", + "id": "angular-storybook-compodoc", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Switching to ESLint's flat config format", - "path": "/recipes/tips-n-tricks/flat-config", - "id": "flat-config", + "name": "Angular: Configuring styles and preprocessor options", + "path": "/recipes/storybook/angular-configuring-styles", + "id": "angular-configuring-styles", "isExternal": false, "children": [], "disableCollapsible": false @@ -3434,175 +3269,316 @@ "disableCollapsible": false }, { - "name": "Convert from a Standalone Repository to a Monorepo", - "path": "/recipes/tips-n-tricks/standalone-to-monorepo", - "id": "standalone-to-monorepo", + "name": "Set up Storybook for React Projects", + "path": "/recipes/storybook/overview-react", + "id": "overview-react", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Configuring ESLint with Typescript", - "path": "/recipes/tips-n-tricks/eslint", - "id": "eslint", + "name": "Set up Storybook for Angular Projects", + "path": "/recipes/storybook/overview-angular", + "id": "overview-angular", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Enable Typescript Batch Mode", - "path": "/recipes/tips-n-tricks/enable-tsc-batch-mode", - "id": "enable-tsc-batch-mode", + "name": "Set up Storybook for Vue Projects", + "path": "/recipes/storybook/overview-vue", + "id": "overview-vue", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Define Secondary Entrypoints for Typescript Packages", - "path": "/recipes/tips-n-tricks/define-secondary-entrypoints", - "id": "define-secondary-entrypoints", + "name": "Configuring Storybook on Nx", + "path": "/recipes/storybook/configuring-storybook", + "id": "configuring-storybook", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Compile Typescript Packages to Multiple Formats", - "path": "/recipes/tips-n-tricks/compile-multiple-formats", - "id": "compile-multiple-formats", + "name": "One main Storybook instance for all projects", + "path": "/recipes/storybook/one-storybook-for-all", + "id": "one-storybook-for-all", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Keep Nx Versions in Sync", - "path": "/recipes/tips-n-tricks/keep-nx-versions-in-sync", - "id": "keep-nx-versions-in-sync", + "name": "One Storybook instance per scope", + "path": "/recipes/storybook/one-storybook-per-scope", + "id": "one-storybook-per-scope", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Define Environment Variables", - "path": "/recipes/tips-n-tricks/define-environment-variables", - "id": "define-environment-variables", + "name": "One main Storybook instance using Storybook Composition", + "path": "/recipes/storybook/one-storybook-with-composition", + "id": "one-storybook-with-composition", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Configuring Browser Support", - "path": "/recipes/tips-n-tricks/browser-support", - "id": "browser-support", + "name": "How to configure Webpack and Vite for Storybook", + "path": "/recipes/storybook/custom-builder-configs", + "id": "custom-builder-configs", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Include Assets in Build", - "path": "/recipes/tips-n-tricks/include-assets-in-build", - "id": "include-assets-in-build", + "name": "Setting up Storybook Interaction Tests with Nx", + "path": "/recipes/storybook/storybook-interaction-tests", + "id": "storybook-interaction-tests", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Include All package.json Files as Projects", - "path": "/recipes/tips-n-tricks/include-all-packagejson", - "id": "include-all-packagejson", + "name": "Upgrading Storybook using the Storybook CLI", + "path": "/recipes/storybook/upgrading-storybook", + "id": "upgrading-storybook", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Identify Dependencies Between Folders", - "path": "/recipes/tips-n-tricks/identify-dependencies-between-folders", - "id": "identify-dependencies-between-folders", + "name": "Setting up Storybook Composition with Nx", + "path": "/recipes/storybook/storybook-composition-setup", + "id": "storybook-composition-setup", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Disable Graph Links Created from Analyzing Source Files", - "path": "/recipes/tips-n-tricks/analyze-source-files", - "id": "analyze-source-files", + "name": "Angular: Set up Compodoc for Storybook on Nx", + "path": "/recipes/storybook/angular-storybook-compodoc", + "id": "angular-storybook-compodoc", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Use JavaScript instead TypeScript", - "path": "/recipes/tips-n-tricks/js-and-ts", - "id": "js-and-ts", + "name": "Angular: Configuring styles and preprocessor options", + "path": "/recipes/storybook/angular-configuring-styles", + "id": "angular-configuring-styles", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Altering Migration Process", - "path": "/recipes/tips-n-tricks/advanced-update", - "id": "advanced-update", + "name": "Cypress", + "path": "/recipes/cypress", + "id": "cypress", + "isExternal": false, + "children": [ + { + "name": "Component Testing", + "path": "/recipes/cypress/cypress-component-testing", + "id": "cypress-component-testing", + "isExternal": false, + "children": [], + "disableCollapsible": false + }, + { + "name": "Using setupNodeEvents with Cypress preset", + "path": "/recipes/cypress/cypress-setup-node-events", + "id": "cypress-setup-node-events", + "isExternal": false, + "children": [], + "disableCollapsible": false + }, + { + "name": "Cypress v11 Migration Guide", + "path": "/recipes/cypress/cypress-v11-migration", + "id": "cypress-v11-migration", + "isExternal": false, + "children": [], + "disableCollapsible": false + } + ], + "disableCollapsible": false + }, + { + "name": "Component Testing", + "path": "/recipes/cypress/cypress-component-testing", + "id": "cypress-component-testing", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Using Yarn PnP", - "path": "/recipes/tips-n-tricks/yarn-pnp", - "id": "yarn-pnp", + "name": "Using setupNodeEvents with Cypress preset", + "path": "/recipes/cypress/cypress-setup-node-events", + "id": "cypress-setup-node-events", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Switching to ESLint's flat config format", - "path": "/recipes/tips-n-tricks/flat-config", - "id": "flat-config", + "name": "Cypress v11 Migration Guide", + "path": "/recipes/cypress/cypress-v11-migration", + "id": "cypress-v11-migration", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Nx Console", - "path": "/recipes/nx-console", - "id": "nx-console", + "name": "Next", + "path": "/recipes/next", + "id": "next", "isExternal": false, "children": [ { - "name": "Telemetry", - "path": "/recipes/nx-console/console-telemetry", - "id": "console-telemetry", + "name": "How to configure Next.js plugins", + "path": "/recipes/next/next-config-setup", + "id": "next-config-setup", + "isExternal": false, + "children": [], + "disableCollapsible": false + } + ], + "disableCollapsible": false + }, + { + "name": "How to configure Next.js plugins", + "path": "/recipes/next/next-config-setup", + "id": "next-config-setup", + "isExternal": false, + "children": [], + "disableCollapsible": false + }, + { + "name": "Nuxt", + "path": "/recipes/nuxt", + "id": "nuxt", + "isExternal": false, + "children": [ + { + "name": "Deploying Nuxt applications to Vercel", + "path": "/recipes/nuxt/deploy-nuxt-to-vercel", + "id": "deploy-nuxt-to-vercel", + "isExternal": false, + "children": [], + "disableCollapsible": false + } + ], + "disableCollapsible": false + }, + { + "name": "Deploying Nuxt applications to Vercel", + "path": "/recipes/nuxt/deploy-nuxt-to-vercel", + "id": "deploy-nuxt-to-vercel", + "isExternal": false, + "children": [], + "disableCollapsible": false + }, + { + "name": "Vite", + "path": "/recipes/vite", + "id": "vite", + "isExternal": false, + "children": [ + { + "name": "Configure Vite on your Nx workspace", + "path": "/recipes/vite/configure-vite", + "id": "configure-vite", + "isExternal": false, + "children": [], + "disableCollapsible": false + } + ], + "disableCollapsible": false + }, + { + "name": "Configure Vite on your Nx workspace", + "path": "/recipes/vite/configure-vite", + "id": "configure-vite", + "isExternal": false, + "children": [], + "disableCollapsible": false + }, + { + "name": "Webpack", + "path": "/recipes/webpack", + "id": "webpack", + "isExternal": false, + "children": [ + { + "name": "How to configure Webpack in your Nx workspace", + "path": "/recipes/webpack/webpack-config-setup", + "id": "webpack-config-setup", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Project Details View", - "path": "/recipes/nx-console/console-project-details", - "id": "console-project-details", + "name": "Webpack plugins", + "path": "/recipes/webpack/webpack-plugins", + "id": "webpack-plugins", + "isExternal": false, + "children": [], + "disableCollapsible": false + } + ], + "disableCollapsible": false + }, + { + "name": "How to configure Webpack in your Nx workspace", + "path": "/recipes/webpack/webpack-config-setup", + "id": "webpack-config-setup", + "isExternal": false, + "children": [], + "disableCollapsible": false + }, + { + "name": "Webpack plugins", + "path": "/recipes/webpack/webpack-plugins", + "id": "webpack-plugins", + "isExternal": false, + "children": [], + "disableCollapsible": false + }, + { + "name": "Enforce Module Boundaries", + "path": "/recipes/enforce-module-boundaries", + "id": "enforce-module-boundaries", + "isExternal": false, + "children": [ + { + "name": "Ban Dependencies with Certain Tags", + "path": "/recipes/enforce-module-boundaries/ban-dependencies-with-tags", + "id": "ban-dependencies-with-tags", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Generate Command", - "path": "/recipes/nx-console/console-generate-command", - "id": "console-generate-command", + "name": "Tag in Multiple Dimensions", + "path": "/recipes/enforce-module-boundaries/tag-multiple-dimensions", + "id": "tag-multiple-dimensions", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Run Command", - "path": "/recipes/nx-console/console-run-command", - "id": "console-run-command", + "name": "Ban External Imports", + "path": "/recipes/enforce-module-boundaries/ban-external-imports", + "id": "ban-external-imports", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Troubleshooting", - "path": "/recipes/nx-console/console-troubleshooting", - "id": "console-troubleshooting", + "name": "Tags Allow List", + "path": "/recipes/enforce-module-boundaries/tags-allow-list", + "id": "tags-allow-list", "isExternal": false, "children": [], "disableCollapsible": false @@ -3611,159 +3587,167 @@ "disableCollapsible": false }, { - "name": "Telemetry", - "path": "/recipes/nx-console/console-telemetry", - "id": "console-telemetry", - "isExternal": false, - "children": [], - "disableCollapsible": false - }, - { - "name": "Project Details View", - "path": "/recipes/nx-console/console-project-details", - "id": "console-project-details", + "name": "Ban Dependencies with Certain Tags", + "path": "/recipes/enforce-module-boundaries/ban-dependencies-with-tags", + "id": "ban-dependencies-with-tags", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Generate Command", - "path": "/recipes/nx-console/console-generate-command", - "id": "console-generate-command", + "name": "Tag in Multiple Dimensions", + "path": "/recipes/enforce-module-boundaries/tag-multiple-dimensions", + "id": "tag-multiple-dimensions", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Run Command", - "path": "/recipes/nx-console/console-run-command", - "id": "console-run-command", + "name": "Ban External Imports", + "path": "/recipes/enforce-module-boundaries/ban-external-imports", + "id": "ban-external-imports", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Troubleshoot Nx Console Issues", - "path": "/recipes/nx-console/console-troubleshooting", - "id": "console-troubleshooting", + "name": "Tags Allow List", + "path": "/recipes/enforce-module-boundaries/tags-allow-list", + "id": "tags-allow-list", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Nx Release", - "path": "/recipes/nx-release", - "id": "nx-release", + "name": "Tips and tricks", + "path": "/recipes/tips-n-tricks", + "id": "tips-n-tricks", "isExternal": false, "children": [ { - "name": "Get Started with Nx Release", - "path": "/recipes/nx-release/get-started-with-nx-release", - "id": "get-started-with-nx-release", + "name": "Convert from a Standalone Repository to a Monorepo", + "path": "/recipes/tips-n-tricks/standalone-to-monorepo", + "id": "standalone-to-monorepo", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Release Projects Independently", - "path": "/recipes/nx-release/release-projects-independently", - "id": "release-projects-independently", + "name": "Configuring ESLint with Typescript", + "path": "/recipes/tips-n-tricks/eslint", + "id": "eslint", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Automatically Version with Conventional Commits", - "path": "/recipes/nx-release/automatically-version-with-conventional-commits", - "id": "automatically-version-with-conventional-commits", + "name": "Enable Typescript Batch Mode", + "path": "/recipes/tips-n-tricks/enable-tsc-batch-mode", + "id": "enable-tsc-batch-mode", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Customize Conventional Commit Types", - "path": "/recipes/nx-release/customize-conventional-commit-types", - "id": "customize-conventional-commit-types", + "name": "Define Secondary Entrypoints for Typescript Packages", + "path": "/recipes/tips-n-tricks/define-secondary-entrypoints", + "id": "define-secondary-entrypoints", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "File Based Versioning (Version Plans)", - "path": "/recipes/nx-release/file-based-versioning-version-plans", - "id": "file-based-versioning-version-plans", + "name": "Compile Typescript Packages to Multiple Formats", + "path": "/recipes/tips-n-tricks/compile-multiple-formats", + "id": "compile-multiple-formats", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Configure Custom Registries", - "path": "/recipes/nx-release/configure-custom-registries", - "id": "configure-custom-registries", + "name": "Keep Nx Versions in Sync", + "path": "/recipes/tips-n-tricks/keep-nx-versions-in-sync", + "id": "keep-nx-versions-in-sync", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Publish in CI/CD", - "path": "/recipes/nx-release/publish-in-ci-cd", - "id": "publish-in-ci-cd", + "name": "Define Environment Variables", + "path": "/recipes/tips-n-tricks/define-environment-variables", + "id": "define-environment-variables", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Automate GitHub Releases", - "path": "/recipes/nx-release/automate-github-releases", - "id": "automate-github-releases", + "name": "Configuring Browser Support", + "path": "/recipes/tips-n-tricks/browser-support", + "id": "browser-support", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Publish Rust Crates", - "path": "/recipes/nx-release/publish-rust-crates", - "id": "publish-rust-crates", + "name": "Include Assets in Build", + "path": "/recipes/tips-n-tricks/include-assets-in-build", + "id": "include-assets-in-build", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Update Your Local Registry Setup to use Nx Release", - "path": "/recipes/nx-release/update-local-registry-setup", - "id": "update-local-registry-setup", + "name": "Include All package.json Files as Projects", + "path": "/recipes/tips-n-tricks/include-all-packagejson", + "id": "include-all-packagejson", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Configure Changelog Format", - "path": "/recipes/nx-release/configure-changelog-format", - "id": "configure-changelog-format", + "name": "Identify Dependencies Between Folders", + "path": "/recipes/tips-n-tricks/identify-dependencies-between-folders", + "id": "identify-dependencies-between-folders", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Publish a Custom Dist Directory", - "path": "/recipes/nx-release/publish-custom-dist-directory", - "id": "publish-custom-dist-directory", + "name": "Disable Graph Links Created from Analyzing Source Files", + "path": "/recipes/tips-n-tricks/analyze-source-files", + "id": "analyze-source-files", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Build Before Versioning", - "path": "/recipes/nx-release/build-before-versioning", - "id": "build-before-versioning", + "name": "Use JavaScript instead TypeScript", + "path": "/recipes/tips-n-tricks/js-and-ts", + "id": "js-and-ts", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Configuring Version Prefix for Dependency Versions", - "path": "/recipes/nx-release/configuration-version-prefix", - "id": "configuration-version-prefix", + "name": "Altering Migration Process", + "path": "/recipes/tips-n-tricks/advanced-update", + "id": "advanced-update", + "isExternal": false, + "children": [], + "disableCollapsible": false + }, + { + "name": "Using Yarn PnP", + "path": "/recipes/tips-n-tricks/yarn-pnp", + "id": "yarn-pnp", + "isExternal": false, + "children": [], + "disableCollapsible": false + }, + { + "name": "Switching to ESLint's flat config format", + "path": "/recipes/tips-n-tricks/flat-config", + "id": "flat-config", "isExternal": false, "children": [], "disableCollapsible": false @@ -3772,113 +3756,129 @@ "disableCollapsible": false }, { - "name": "Get Started with Nx Release", - "path": "/recipes/nx-release/get-started-with-nx-release", - "id": "get-started-with-nx-release", + "name": "Convert from a Standalone Repository to a Monorepo", + "path": "/recipes/tips-n-tricks/standalone-to-monorepo", + "id": "standalone-to-monorepo", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Release Projects Independently", - "path": "/recipes/nx-release/release-projects-independently", - "id": "release-projects-independently", + "name": "Configuring ESLint with Typescript", + "path": "/recipes/tips-n-tricks/eslint", + "id": "eslint", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Automatically Version with Conventional Commits", - "path": "/recipes/nx-release/automatically-version-with-conventional-commits", - "id": "automatically-version-with-conventional-commits", + "name": "Enable Typescript Batch Mode", + "path": "/recipes/tips-n-tricks/enable-tsc-batch-mode", + "id": "enable-tsc-batch-mode", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Customize Conventional Commit Types", - "path": "/recipes/nx-release/customize-conventional-commit-types", - "id": "customize-conventional-commit-types", + "name": "Define Secondary Entrypoints for Typescript Packages", + "path": "/recipes/tips-n-tricks/define-secondary-entrypoints", + "id": "define-secondary-entrypoints", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "File Based Versioning (Version Plans)", - "path": "/recipes/nx-release/file-based-versioning-version-plans", - "id": "file-based-versioning-version-plans", + "name": "Compile Typescript Packages to Multiple Formats", + "path": "/recipes/tips-n-tricks/compile-multiple-formats", + "id": "compile-multiple-formats", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Configure Custom Registries", - "path": "/recipes/nx-release/configure-custom-registries", - "id": "configure-custom-registries", + "name": "Keep Nx Versions in Sync", + "path": "/recipes/tips-n-tricks/keep-nx-versions-in-sync", + "id": "keep-nx-versions-in-sync", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Publish in CI/CD", - "path": "/recipes/nx-release/publish-in-ci-cd", - "id": "publish-in-ci-cd", + "name": "Define Environment Variables", + "path": "/recipes/tips-n-tricks/define-environment-variables", + "id": "define-environment-variables", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Automate GitHub Releases", - "path": "/recipes/nx-release/automate-github-releases", - "id": "automate-github-releases", + "name": "Configuring Browser Support", + "path": "/recipes/tips-n-tricks/browser-support", + "id": "browser-support", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Publish Rust Crates", - "path": "/recipes/nx-release/publish-rust-crates", - "id": "publish-rust-crates", + "name": "Include Assets in Build", + "path": "/recipes/tips-n-tricks/include-assets-in-build", + "id": "include-assets-in-build", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Update Your Local Registry Setup to use Nx Release", - "path": "/recipes/nx-release/update-local-registry-setup", - "id": "update-local-registry-setup", + "name": "Include All package.json Files as Projects", + "path": "/recipes/tips-n-tricks/include-all-packagejson", + "id": "include-all-packagejson", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Configure Changelog Format", - "path": "/recipes/nx-release/configure-changelog-format", - "id": "configure-changelog-format", + "name": "Identify Dependencies Between Folders", + "path": "/recipes/tips-n-tricks/identify-dependencies-between-folders", + "id": "identify-dependencies-between-folders", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Publish a Custom Dist Directory", - "path": "/recipes/nx-release/publish-custom-dist-directory", - "id": "publish-custom-dist-directory", + "name": "Disable Graph Links Created from Analyzing Source Files", + "path": "/recipes/tips-n-tricks/analyze-source-files", + "id": "analyze-source-files", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Build Before Versioning", - "path": "/recipes/nx-release/build-before-versioning", - "id": "build-before-versioning", + "name": "Use JavaScript instead TypeScript", + "path": "/recipes/tips-n-tricks/js-and-ts", + "id": "js-and-ts", "isExternal": false, "children": [], "disableCollapsible": false }, { - "name": "Configuring Version Prefix for Dependency Versions", - "path": "/recipes/nx-release/configuration-version-prefix", - "id": "configuration-version-prefix", + "name": "Altering Migration Process", + "path": "/recipes/tips-n-tricks/advanced-update", + "id": "advanced-update", + "isExternal": false, + "children": [], + "disableCollapsible": false + }, + { + "name": "Using Yarn PnP", + "path": "/recipes/tips-n-tricks/yarn-pnp", + "id": "yarn-pnp", + "isExternal": false, + "children": [], + "disableCollapsible": false + }, + { + "name": "Switching to ESLint's flat config format", + "path": "/recipes/tips-n-tricks/flat-config", + "id": "flat-config", "isExternal": false, "children": [], "disableCollapsible": false diff --git a/docs/generated/manifests/nx.json b/docs/generated/manifests/nx.json index b33099826db4d6..0f0043db6a2be7 100644 --- a/docs/generated/manifests/nx.json +++ b/docs/generated/manifests/nx.json @@ -1704,1096 +1704,1096 @@ "tags": [] }, { - "id": "react", - "name": "React", - "description": "Advanced guides to adopt Nx in React.", + "id": "nx-release", + "name": "Nx Release", + "description": "Recipes for releasing with Nx release.", "mediaImage": "", "file": "", "itemList": [ { - "id": "react-native", - "name": "React Native with Nx", + "id": "get-started-with-nx-release", + "name": "Get Started with Nx Release", "description": "", "mediaImage": "", - "file": "shared/guides/react-native", + "file": "shared/recipes/nx-release/get-started-with-nx-release", "itemList": [], "isExternal": false, - "path": "/recipes/react/react-native", - "tags": [] + "path": "/recipes/nx-release/get-started-with-nx-release", + "tags": ["nx-release"] }, { - "id": "remix", - "name": "Remix with Nx", + "id": "release-projects-independently", + "name": "Release Projects Independently", "description": "", "mediaImage": "", - "file": "shared/guides/remix", + "file": "shared/recipes/nx-release/release-projects-independently", "itemList": [], "isExternal": false, - "path": "/recipes/react/remix", - "tags": [] + "path": "/recipes/nx-release/release-projects-independently", + "tags": ["nx-release"] }, { - "id": "use-environment-variables-in-react", - "name": "Use Environment Variables in React", + "id": "automatically-version-with-conventional-commits", + "name": "Automatically Version with Conventional Commits", "description": "", "mediaImage": "", - "file": "shared/guides/use-environment-variables-in-react", + "file": "shared/recipes/nx-release/automatically-version-with-conventional-commits", "itemList": [], "isExternal": false, - "path": "/recipes/react/use-environment-variables-in-react", - "tags": ["environment-variables"] + "path": "/recipes/nx-release/automatically-version-with-conventional-commits", + "tags": ["nx-release"] }, { - "id": "using-tailwind-css-in-react", - "name": "Using Tailwind CSS in React", + "id": "customize-conventional-commit-types", + "name": "Customize Conventional Commit Types", "description": "", "mediaImage": "", - "file": "shared/guides/using-tailwind-css-in-react", + "file": "shared/recipes/nx-release/customize-conventional-commit-types", "itemList": [], "isExternal": false, - "path": "/recipes/react/using-tailwind-css-in-react", - "tags": [] + "path": "/recipes/nx-release/customize-conventional-commit-types", + "tags": ["nx-release"] }, { - "id": "adding-assets-react", - "name": "Adding Images, Fonts, and Files", + "id": "file-based-versioning-version-plans", + "name": "File Based Versioning (Version Plans)", "description": "", "mediaImage": "", - "file": "shared/guides/adding-assets", + "file": "shared/recipes/nx-release/file-based-versioning-version-plans", "itemList": [], "isExternal": false, - "path": "/recipes/react/adding-assets-react", - "tags": [] + "path": "/recipes/nx-release/file-based-versioning-version-plans", + "tags": ["nx-release"] }, { - "id": "module-federation-with-ssr", - "name": "Setup Module Federation with SSR for React", + "id": "configure-custom-registries", + "name": "Configure Custom Registries", "description": "", "mediaImage": "", - "file": "shared/recipes/module-federation-with-ssr", + "file": "shared/recipes/nx-release/configure-custom-registries", "itemList": [], "isExternal": false, - "path": "/recipes/react/module-federation-with-ssr", - "tags": ["module-federation", "react"] + "path": "/recipes/nx-release/configure-custom-registries", + "tags": ["nx-release"] }, { - "id": "deploy-nextjs-to-vercel", - "name": "Deploying Next.js applications to Vercel", + "id": "publish-in-ci-cd", + "name": "Publish in CI/CD", "description": "", "mediaImage": "", - "file": "shared/recipes/deployment/deploy-nextjs-to-vercel", + "file": "shared/recipes/nx-release/publish-in-ci-cd", "itemList": [], "isExternal": false, - "path": "/recipes/react/deploy-nextjs-to-vercel", - "tags": [] + "path": "/recipes/nx-release/publish-in-ci-cd", + "tags": ["nx-release"] }, { - "id": "react-compiler", - "name": "React Compiler with Nx", + "id": "automate-github-releases", + "name": "Automate GitHub Releases", "description": "", "mediaImage": "", - "file": "shared/guides/react-compiler", + "file": "shared/recipes/nx-release/automate-github-releases", "itemList": [], "isExternal": false, - "path": "/recipes/react/react-compiler", - "tags": [] - } - ], - "isExternal": false, - "path": "/recipes/react", - "tags": [] - }, - { - "id": "angular", - "name": "Angular", - "description": "Advanced guides to adopt Nx in Angular.", - "mediaImage": "", - "file": "", - "itemList": [ + "path": "/recipes/nx-release/automate-github-releases", + "tags": ["nx-release"] + }, { - "id": "migration", - "name": "Migration", + "id": "publish-rust-crates", + "name": "Publish Rust Crates", "description": "", "mediaImage": "", - "file": "", - "itemList": [ - { - "id": "angular", - "name": "Migrating from Angular CLI", - "description": "", - "mediaImage": "", - "file": "shared/migration/migration-angular", - "itemList": [], - "isExternal": false, - "path": "/recipes/angular/migration/angular", - "tags": [] - }, - { - "id": "angular-multiple", - "name": "Migrating From Multiple Angular CLI Repos", - "description": "", - "mediaImage": "", - "file": "shared/migration/angular-multiple", - "itemList": [], - "isExternal": false, - "path": "/recipes/angular/migration/angular-multiple", - "tags": [] - } - ], + "file": "shared/recipes/nx-release/publish-rust-crates", + "itemList": [], "isExternal": false, - "path": "/recipes/angular/migration", - "tags": [] + "path": "/recipes/nx-release/publish-rust-crates", + "tags": ["nx-release"] }, { - "id": "use-environment-variables-in-angular", - "name": "Use Environment Variables in Angular", + "id": "update-local-registry-setup", + "name": "Update Your Local Registry Setup to use Nx Release", "description": "", "mediaImage": "", - "file": "shared/guides/use-environment-variables-in-angular", + "file": "shared/recipes/nx-release/update-local-registry-setup", "itemList": [], "isExternal": false, - "path": "/recipes/angular/use-environment-variables-in-angular", - "tags": ["environment-variables"] + "path": "/recipes/nx-release/update-local-registry-setup", + "tags": ["nx-release"] }, { - "id": "using-tailwind-css-with-angular-projects", - "name": "Using Tailwind CSS with Angular projects", + "id": "configure-changelog-format", + "name": "Configure Changelog Format", "description": "", "mediaImage": "", - "file": "shared/guides/using-tailwind-css-with-angular-projects", + "file": "shared/recipes/nx-release/configure-changelog-format", "itemList": [], "isExternal": false, - "path": "/recipes/angular/using-tailwind-css-with-angular-projects", - "tags": [] + "path": "/recipes/nx-release/configure-changelog-format", + "tags": ["nx-release"] }, { - "id": "module-federation-with-ssr", - "name": "Setup Module Federation with SSR for Angular", + "id": "publish-custom-dist-directory", + "name": "Publish a Custom Dist Directory", "description": "", "mediaImage": "", - "file": "shared/recipes/module-federation-with-ssr", + "file": "shared/recipes/nx-release/publish-custom-dist-directory", "itemList": [], "isExternal": false, - "path": "/recipes/angular/module-federation-with-ssr", - "tags": ["module-federation", "angular"] + "path": "/recipes/nx-release/publish-custom-dist-directory", + "tags": ["nx-release"] }, { - "id": "dynamic-module-federation-with-angular", - "name": "Advanced Micro Frontends with Angular using Dynamic Federation", + "id": "build-before-versioning", + "name": "Build Before Versioning", "description": "", "mediaImage": "", - "file": "shared/recipes/module-federation/dynamic-mfe-angular", + "file": "shared/recipes/nx-release/build-before-versioning", "itemList": [], "isExternal": false, - "path": "/recipes/angular/dynamic-module-federation-with-angular", - "tags": ["module-federation", "angular"] + "path": "/recipes/nx-release/build-before-versioning", + "tags": ["nx-release"] }, { - "id": "setup-incremental-builds-angular", - "name": "Setup incremental builds for Angular applications", + "id": "configuration-version-prefix", + "name": "Configuring Version Prefix for Dependency Versions", "description": "", "mediaImage": "", - "file": "shared/guides/setup-incremental-builds-angular", + "file": "shared/recipes/nx-release/configuration-version-prefix", "itemList": [], "isExternal": false, - "path": "/recipes/angular/setup-incremental-builds-angular", - "tags": [] + "path": "/recipes/nx-release/configuration-version-prefix", + "tags": ["nx-release"] } ], "isExternal": false, - "path": "/recipes/angular", + "path": "/recipes/nx-release", "tags": [] }, { - "id": "node", - "name": "Node", - "description": "Set of Node related recipes.", + "id": "module-federation", + "name": "Module Federation", + "description": "Advanced guides to utilize Module Federation with Nx.", "mediaImage": "", "file": "", "itemList": [ { - "id": "node-server-fly-io", - "name": "Deploying a Node App to Fly.io", - "description": "", - "mediaImage": "", - "file": "shared/recipes/deployment/node-server-fly-io", - "itemList": [], - "isExternal": false, - "path": "/recipes/node/node-server-fly-io", - "tags": ["deployment", "node"] - }, - { - "id": "node-serverless-functions-netlify", - "name": "Add and Deploy Netlify Edge Functions with Node", - "description": "", - "mediaImage": "", - "file": "shared/recipes/deployment/node-serverless-functions-netlify", - "itemList": [], - "isExternal": false, - "path": "/recipes/node/node-serverless-functions-netlify", - "tags": ["deployment", "node"] - }, - { - "id": "node-aws-lambda", - "name": "Deploying AWS lambda in Node.js (deprecated)", - "description": "", + "id": "create-a-host", + "name": "How to create a Module Federation Host Application", + "description": "A guide on how to create a Module Federation Host Application in your Nx workspace", "mediaImage": "", - "file": "shared/recipes/deployment/node-aws-lambda", + "file": "shared/recipes/module-federation/creating-a-host", "itemList": [], "isExternal": false, - "path": "/recipes/node/node-aws-lambda", - "tags": ["deployment", "node"] + "path": "/recipes/module-federation/create-a-host", + "tags": [] }, { - "id": "application-proxies", - "name": "Set Up Application Proxies", - "description": "", + "id": "create-a-remote", + "name": "How to create a Module Federation Remote Application", + "description": "A guide on how to create a Module Federation Remote Application in your Nx workspace", "mediaImage": "", - "file": "shared/recipes/node/application-proxies", + "file": "shared/recipes/module-federation/creating-a-remote", "itemList": [], "isExternal": false, - "path": "/recipes/node/application-proxies", - "tags": ["node"] + "path": "/recipes/module-federation/create-a-remote", + "tags": [] }, { - "id": "wait-for-tasks", - "name": "Wait for Tasks to Finish", - "description": "", + "id": "federate-a-module", + "name": "How to Federate a Module", + "description": "A guide on how to federate a module in your Nx workspace", "mediaImage": "", - "file": "shared/recipes/node/wait-for-tasks", + "file": "shared/recipes/module-federation/federate-a-module", "itemList": [], "isExternal": false, - "path": "/recipes/node/wait-for-tasks", + "path": "/recipes/module-federation/federate-a-module", "tags": [] } ], "isExternal": false, - "path": "/recipes/node", + "path": "/recipes/module-federation", "tags": [] }, { - "id": "storybook", - "name": "Storybook", - "description": "Storybook strategies and setups.", - "mediaImage": "", - "file": "", + "id": "nx-console", + "name": "Nx Console", + "description": "Checkout all the recipes related to Nx Console.", + "mediaImage": "", + "file": "", "itemList": [ { - "id": "overview-react", - "name": "Set up Storybook for React Projects", - "description": "This guide explains how to set up Storybook for React projects in your Nx workspace.", + "id": "console-telemetry", + "name": "Telemetry", + "description": "", "mediaImage": "", - "file": "shared/recipes/storybook/plugin-react", + "file": "shared/recipes/console-telemetry", "itemList": [], "isExternal": false, - "path": "/recipes/storybook/overview-react", - "tags": ["storybook"] + "path": "/recipes/nx-console/console-telemetry", + "tags": ["editor-setup"] }, { - "id": "overview-angular", - "name": "Set up Storybook for Angular Projects", - "description": "This guide explains how to set up Storybook for Angular projects in your Nx workspace.", + "id": "console-project-details", + "name": "Project Details View", + "description": "", "mediaImage": "", - "file": "shared/recipes/storybook/plugin-angular", + "file": "shared/recipes/console-project-details", "itemList": [], "isExternal": false, - "path": "/recipes/storybook/overview-angular", - "tags": ["storybook"] + "path": "/recipes/nx-console/console-project-details", + "tags": ["editor-setup"] }, { - "id": "overview-vue", - "name": "Set up Storybook for Vue Projects", - "description": "This guide explains how to set up Storybook for Vue projects in your Nx workspace.", + "id": "console-generate-command", + "name": "Generate Command", + "description": "", "mediaImage": "", - "file": "shared/recipes/storybook/plugin-vue", + "file": "shared/recipes/console-generate-command", "itemList": [], "isExternal": false, - "path": "/recipes/storybook/overview-vue", - "tags": ["storybook"] + "path": "/recipes/nx-console/console-generate-command", + "tags": ["editor-setup"] }, { - "id": "configuring-storybook", - "name": "Configuring Storybook on Nx", - "description": "This guide explains how Storybook is configured on your Nx workspace.", + "id": "console-run-command", + "name": "Run Command", + "description": "", "mediaImage": "", - "file": "shared/recipes/storybook/configuring-storybook", + "file": "shared/recipes/console-run-command", "itemList": [], "isExternal": false, - "path": "/recipes/storybook/configuring-storybook", - "tags": ["storybook"] + "path": "/recipes/nx-console/console-run-command", + "tags": ["editor-setup"] }, { - "id": "one-storybook-for-all", - "name": "One main Storybook instance for all projects", - "description": "This guide explains how to consolidate all your Storybook stories from different projects into one unified Storybook instance. Ideal for Nx workspaces leveraging a single framework.", + "id": "console-troubleshooting", + "name": "Troubleshooting", + "description": "", "mediaImage": "", - "file": "shared/recipes/storybook/one-storybook-for-all", + "file": "shared/recipes/console-troubleshooting", "itemList": [], "isExternal": false, - "path": "/recipes/storybook/one-storybook-for-all", - "tags": ["storybook"] - }, + "path": "/recipes/nx-console/console-troubleshooting", + "tags": ["editor-setup"] + } + ], + "isExternal": false, + "path": "/recipes/nx-console", + "tags": [] + }, + { + "id": "react", + "name": "React", + "description": "Advanced guides to adopt Nx in React.", + "mediaImage": "", + "file": "", + "itemList": [ { - "id": "one-storybook-per-scope", - "name": "One Storybook instance per scope", - "description": "This guide explains how to set up individual Storybook instances for each scope within an Nx workspace. It provides a structured approach, emphasizing folder organization and thematic scope separation.", + "id": "react-native", + "name": "React Native with Nx", + "description": "", "mediaImage": "", - "file": "shared/recipes/storybook/one-storybook-per-scope", + "file": "shared/guides/react-native", "itemList": [], "isExternal": false, - "path": "/recipes/storybook/one-storybook-per-scope", - "tags": ["storybook"] + "path": "/recipes/react/react-native", + "tags": [] }, { - "id": "one-storybook-with-composition", - "name": "One main Storybook instance using Storybook Composition", - "description": "This guide explains how to publish a unified Storybook instance from multiple frameworks within an Nx workspace using Storybook Composition.", + "id": "remix", + "name": "Remix with Nx", + "description": "", "mediaImage": "", - "file": "shared/recipes/storybook/one-storybook-with-composition", + "file": "shared/guides/remix", "itemList": [], "isExternal": false, - "path": "/recipes/storybook/one-storybook-with-composition", - "tags": ["storybook"] + "path": "/recipes/react/remix", + "tags": [] }, { - "id": "custom-builder-configs", - "name": "How to configure Webpack and Vite for Storybook", - "description": "This guide explains how to customize the webpack configuration and your vite configuration for Storybook.", + "id": "use-environment-variables-in-react", + "name": "Use Environment Variables in React", + "description": "", "mediaImage": "", - "file": "shared/recipes/storybook/custom-builder-configs", + "file": "shared/guides/use-environment-variables-in-react", "itemList": [], "isExternal": false, - "path": "/recipes/storybook/custom-builder-configs", - "tags": ["storybook"] + "path": "/recipes/react/use-environment-variables-in-react", + "tags": ["environment-variables"] }, { - "id": "storybook-interaction-tests", - "name": "Setting up Storybook Interaction Tests with Nx", - "description": "This guide explains how you can set up Storybook interaction tests on your Nx workspace.", + "id": "using-tailwind-css-in-react", + "name": "Using Tailwind CSS in React", + "description": "", "mediaImage": "", - "file": "shared/recipes/storybook/interaction-tests", + "file": "shared/guides/using-tailwind-css-in-react", "itemList": [], "isExternal": false, - "path": "/recipes/storybook/storybook-interaction-tests", - "tags": ["storybook"] + "path": "/recipes/react/using-tailwind-css-in-react", + "tags": [] }, { - "id": "upgrading-storybook", - "name": "Upgrading Storybook using the Storybook CLI", - "description": "This guide explains how you can upgrade Storybook using the Storybook CLI upgrade and automigrate commands.", + "id": "adding-assets-react", + "name": "Adding Images, Fonts, and Files", + "description": "", "mediaImage": "", - "file": "shared/recipes/storybook/upgrading-storybook", + "file": "shared/guides/adding-assets", "itemList": [], "isExternal": false, - "path": "/recipes/storybook/upgrading-storybook", - "tags": ["storybook"] + "path": "/recipes/react/adding-assets-react", + "tags": [] }, { - "id": "storybook-composition-setup", - "name": "Setting up Storybook Composition with Nx", - "description": "This guide explains how you can set up Storybook composition on your Nx workspace.", + "id": "module-federation-with-ssr", + "name": "Setup Module Federation with SSR for React", + "description": "", "mediaImage": "", - "file": "shared/recipes/storybook/storybook-composition-setup", + "file": "shared/recipes/module-federation-with-ssr", "itemList": [], "isExternal": false, - "path": "/recipes/storybook/storybook-composition-setup", - "tags": ["storybook"] + "path": "/recipes/react/module-federation-with-ssr", + "tags": ["module-federation", "react"] }, { - "id": "angular-storybook-compodoc", - "name": "Angular: Set up Compodoc for Storybook on Nx", - "description": "This guide explains how to set up Compodoc for Storybook on Angular projects in a Nx workspace.", + "id": "deploy-nextjs-to-vercel", + "name": "Deploying Next.js applications to Vercel", + "description": "", "mediaImage": "", - "file": "shared/recipes/storybook/angular-storybook-compodoc", + "file": "shared/recipes/deployment/deploy-nextjs-to-vercel", "itemList": [], "isExternal": false, - "path": "/recipes/storybook/angular-storybook-compodoc", - "tags": ["storybook"] + "path": "/recipes/react/deploy-nextjs-to-vercel", + "tags": [] }, { - "id": "angular-configuring-styles", - "name": "Angular: Configuring styles and preprocessor options", - "description": "This document explains how to configure styles and preprocessor options in Angular projects with a Storybook configuration.", + "id": "react-compiler", + "name": "React Compiler with Nx", + "description": "", "mediaImage": "", - "file": "shared/recipes/storybook/angular-configuring-styles", + "file": "shared/guides/react-compiler", "itemList": [], "isExternal": false, - "path": "/recipes/storybook/angular-configuring-styles", - "tags": ["storybook"] + "path": "/recipes/react/react-compiler", + "tags": [] } ], "isExternal": false, - "path": "/recipes/storybook", + "path": "/recipes/react", "tags": [] }, { - "id": "cypress", - "name": "Cypress", - "description": "Cypress related recipes", + "id": "angular", + "name": "Angular", + "description": "Advanced guides to adopt Nx in Angular.", "mediaImage": "", "file": "", "itemList": [ { - "id": "cypress-component-testing", - "name": "Component Testing", - "description": "Component Testing", + "id": "migration", + "name": "Migration", + "description": "", "mediaImage": "", - "file": "shared/packages/cypress/cypress-component-testing", - "itemList": [], + "file": "", + "itemList": [ + { + "id": "angular", + "name": "Migrating from Angular CLI", + "description": "", + "mediaImage": "", + "file": "shared/migration/migration-angular", + "itemList": [], + "isExternal": false, + "path": "/recipes/angular/migration/angular", + "tags": [] + }, + { + "id": "angular-multiple", + "name": "Migrating From Multiple Angular CLI Repos", + "description": "", + "mediaImage": "", + "file": "shared/migration/angular-multiple", + "itemList": [], + "isExternal": false, + "path": "/recipes/angular/migration/angular-multiple", + "tags": [] + } + ], "isExternal": false, - "path": "/recipes/cypress/cypress-component-testing", + "path": "/recipes/angular/migration", "tags": [] }, { - "id": "cypress-setup-node-events", - "name": "Using setupNodeEvents with Cypress preset", - "description": "A guide on using the setupNodeEvents function with @nx/cypress/plugins/cypress-preset", + "id": "use-environment-variables-in-angular", + "name": "Use Environment Variables in Angular", + "description": "", "mediaImage": "", - "file": "shared/packages/cypress/cypress-setup-node-events", + "file": "shared/guides/use-environment-variables-in-angular", "itemList": [], "isExternal": false, - "path": "/recipes/cypress/cypress-setup-node-events", - "tags": [] + "path": "/recipes/angular/use-environment-variables-in-angular", + "tags": ["environment-variables"] }, { - "id": "cypress-v11-migration", - "name": "Cypress v11 Migration Guide", - "description": "Cypress v11 Migration Guide", + "id": "using-tailwind-css-with-angular-projects", + "name": "Using Tailwind CSS with Angular projects", + "description": "", "mediaImage": "", - "file": "shared/packages/cypress/cypress-v11-migration", + "file": "shared/guides/using-tailwind-css-with-angular-projects", "itemList": [], "isExternal": false, - "path": "/recipes/cypress/cypress-v11-migration", + "path": "/recipes/angular/using-tailwind-css-with-angular-projects", "tags": [] - } - ], - "isExternal": false, - "path": "/recipes/cypress", - "tags": [] - }, - { - "id": "next", - "name": "Next", - "description": "Next related recipes", - "mediaImage": "", - "file": "", - "itemList": [ + }, { - "id": "next-config-setup", - "name": "How to configure Next.js plugins", - "description": "How to configure Next.js plugins", + "id": "module-federation-with-ssr", + "name": "Setup Module Federation with SSR for Angular", + "description": "", "mediaImage": "", - "file": "shared/packages/next/next-config-setup", + "file": "shared/recipes/module-federation-with-ssr", "itemList": [], "isExternal": false, - "path": "/recipes/next/next-config-setup", - "tags": [] - } - ], - "isExternal": false, - "path": "/recipes/next", - "tags": [] - }, - { - "id": "nuxt", - "name": "Nuxt", - "description": "Nuxt related recipes", - "mediaImage": "", - "file": "", - "itemList": [ + "path": "/recipes/angular/module-federation-with-ssr", + "tags": ["module-federation", "angular"] + }, { - "id": "deploy-nuxt-to-vercel", - "name": "Deploying Nuxt applications to Vercel", - "description": "A detailed guide on how to deploy Nuxt applications from Nx workspaces to Vercel.", + "id": "dynamic-module-federation-with-angular", + "name": "Advanced Micro Frontends with Angular using Dynamic Federation", + "description": "", "mediaImage": "", - "file": "shared/recipes/deployment/deploy-nuxt-to-vercel", + "file": "shared/recipes/module-federation/dynamic-mfe-angular", "itemList": [], "isExternal": false, - "path": "/recipes/nuxt/deploy-nuxt-to-vercel", - "tags": [] - } - ], - "isExternal": false, - "path": "/recipes/nuxt", - "tags": [] - }, - { - "id": "vite", - "name": "Vite", - "description": "Vite related recipes", - "mediaImage": "", - "file": "", - "itemList": [ + "path": "/recipes/angular/dynamic-module-federation-with-angular", + "tags": ["module-federation", "angular"] + }, { - "id": "configure-vite", - "name": "Configure Vite on your Nx workspace", - "description": "Configure Vite on your Nx workspace", + "id": "setup-incremental-builds-angular", + "name": "Setup incremental builds for Angular applications", + "description": "", "mediaImage": "", - "file": "shared/packages/vite/configure-vite", + "file": "shared/guides/setup-incremental-builds-angular", "itemList": [], "isExternal": false, - "path": "/recipes/vite/configure-vite", + "path": "/recipes/angular/setup-incremental-builds-angular", "tags": [] } ], "isExternal": false, - "path": "/recipes/vite", + "path": "/recipes/angular", "tags": [] }, { - "id": "webpack", - "name": "Webpack", - "description": "Webpack related recipes", + "id": "node", + "name": "Node", + "description": "Set of Node related recipes.", "mediaImage": "", "file": "", "itemList": [ { - "id": "webpack-config-setup", - "name": "How to configure Webpack in your Nx workspace", - "description": "A guide on how to configure webpack on your Nx workspace, and instructions on how to customize your webpack configuration", + "id": "node-server-fly-io", + "name": "Deploying a Node App to Fly.io", + "description": "", "mediaImage": "", - "file": "shared/packages/webpack/webpack-config-setup", + "file": "shared/recipes/deployment/node-server-fly-io", "itemList": [], "isExternal": false, - "path": "/recipes/webpack/webpack-config-setup", - "tags": [] + "path": "/recipes/node/node-server-fly-io", + "tags": ["deployment", "node"] }, { - "id": "webpack-plugins", - "name": "Webpack plugins", - "description": "Webpack plugins", + "id": "node-serverless-functions-netlify", + "name": "Add and Deploy Netlify Edge Functions with Node", + "description": "", "mediaImage": "", - "file": "shared/packages/webpack/webpack-plugins", + "file": "shared/recipes/deployment/node-serverless-functions-netlify", "itemList": [], "isExternal": false, - "path": "/recipes/webpack/webpack-plugins", - "tags": [] - } - ], - "isExternal": false, - "path": "/recipes/webpack", - "tags": [] - }, - { - "id": "module-federation", - "name": "Module Federation", - "description": "Advanced guides to utilize Module Federation with Nx.", - "mediaImage": "", - "file": "", - "itemList": [ + "path": "/recipes/node/node-serverless-functions-netlify", + "tags": ["deployment", "node"] + }, { - "id": "create-a-host", - "name": "How to create a Module Federation Host Application", - "description": "A guide on how to create a Module Federation Host Application in your Nx workspace", + "id": "node-aws-lambda", + "name": "Deploying AWS lambda in Node.js (deprecated)", + "description": "", "mediaImage": "", - "file": "shared/recipes/module-federation/creating-a-host", + "file": "shared/recipes/deployment/node-aws-lambda", "itemList": [], "isExternal": false, - "path": "/recipes/module-federation/create-a-host", - "tags": [] + "path": "/recipes/node/node-aws-lambda", + "tags": ["deployment", "node"] }, { - "id": "create-a-remote", - "name": "How to create a Module Federation Remote Application", - "description": "A guide on how to create a Module Federation Remote Application in your Nx workspace", + "id": "application-proxies", + "name": "Set Up Application Proxies", + "description": "", "mediaImage": "", - "file": "shared/recipes/module-federation/creating-a-remote", + "file": "shared/recipes/node/application-proxies", "itemList": [], "isExternal": false, - "path": "/recipes/module-federation/create-a-remote", - "tags": [] + "path": "/recipes/node/application-proxies", + "tags": ["node"] }, { - "id": "federate-a-module", - "name": "How to Federate a Module", - "description": "A guide on how to federate a module in your Nx workspace", + "id": "wait-for-tasks", + "name": "Wait for Tasks to Finish", + "description": "", "mediaImage": "", - "file": "shared/recipes/module-federation/federate-a-module", + "file": "shared/recipes/node/wait-for-tasks", "itemList": [], "isExternal": false, - "path": "/recipes/module-federation/federate-a-module", + "path": "/recipes/node/wait-for-tasks", "tags": [] } ], "isExternal": false, - "path": "/recipes/module-federation", + "path": "/recipes/node", "tags": [] }, { - "id": "enforce-module-boundaries", - "name": "Enforce Module Boundaries", - "description": "Configuring the enforce module boundaries rule", + "id": "storybook", + "name": "Storybook", + "description": "Storybook strategies and setups.", "mediaImage": "", "file": "", "itemList": [ { - "id": "ban-dependencies-with-tags", - "name": "Ban Dependencies with Certain Tags", - "description": "", + "id": "overview-react", + "name": "Set up Storybook for React Projects", + "description": "This guide explains how to set up Storybook for React projects in your Nx workspace.", "mediaImage": "", - "file": "shared/recipes/ban-dependencies-with-tags", + "file": "shared/recipes/storybook/plugin-react", "itemList": [], "isExternal": false, - "path": "/recipes/enforce-module-boundaries/ban-dependencies-with-tags", - "tags": ["enforce-module-boundaries"] + "path": "/recipes/storybook/overview-react", + "tags": ["storybook"] }, { - "id": "tag-multiple-dimensions", - "name": "Tag in Multiple Dimensions", - "description": "", + "id": "overview-angular", + "name": "Set up Storybook for Angular Projects", + "description": "This guide explains how to set up Storybook for Angular projects in your Nx workspace.", "mediaImage": "", - "file": "shared/recipes/tag-multiple-dimensions", + "file": "shared/recipes/storybook/plugin-angular", "itemList": [], "isExternal": false, - "path": "/recipes/enforce-module-boundaries/tag-multiple-dimensions", - "tags": ["enforce-module-boundaries"] + "path": "/recipes/storybook/overview-angular", + "tags": ["storybook"] }, { - "id": "ban-external-imports", - "name": "Ban External Imports", - "description": "", + "id": "overview-vue", + "name": "Set up Storybook for Vue Projects", + "description": "This guide explains how to set up Storybook for Vue projects in your Nx workspace.", "mediaImage": "", - "file": "shared/recipes/ban-external-imports", + "file": "shared/recipes/storybook/plugin-vue", "itemList": [], "isExternal": false, - "path": "/recipes/enforce-module-boundaries/ban-external-imports", - "tags": ["enforce-module-boundaries"] + "path": "/recipes/storybook/overview-vue", + "tags": ["storybook"] }, { - "id": "tags-allow-list", - "name": "Tags Allow List", - "description": "", + "id": "configuring-storybook", + "name": "Configuring Storybook on Nx", + "description": "This guide explains how Storybook is configured on your Nx workspace.", "mediaImage": "", - "file": "shared/recipes/tags-allow-list", + "file": "shared/recipes/storybook/configuring-storybook", "itemList": [], "isExternal": false, - "path": "/recipes/enforce-module-boundaries/tags-allow-list", - "tags": ["enforce-module-boundaries"] - } - ], - "isExternal": false, - "path": "/recipes/enforce-module-boundaries", - "tags": [] - }, - { - "id": "tips-n-tricks", - "name": "Tips and tricks", - "description": "Various tips and tricks for using Nx.", - "mediaImage": "", - "file": "", - "itemList": [ + "path": "/recipes/storybook/configuring-storybook", + "tags": ["storybook"] + }, { - "id": "standalone-to-monorepo", - "name": "Convert from a Standalone Repository to a Monorepo", - "description": "", + "id": "one-storybook-for-all", + "name": "One main Storybook instance for all projects", + "description": "This guide explains how to consolidate all your Storybook stories from different projects into one unified Storybook instance. Ideal for Nx workspaces leveraging a single framework.", "mediaImage": "", - "file": "shared/recipes/tips-n-tricks/standalone-to-monorepo", + "file": "shared/recipes/storybook/one-storybook-for-all", "itemList": [], "isExternal": false, - "path": "/recipes/tips-n-tricks/standalone-to-monorepo", - "tags": [] + "path": "/recipes/storybook/one-storybook-for-all", + "tags": ["storybook"] }, { - "id": "eslint", - "name": "Configuring ESLint with Typescript", - "description": "", + "id": "one-storybook-per-scope", + "name": "One Storybook instance per scope", + "description": "This guide explains how to set up individual Storybook instances for each scope within an Nx workspace. It provides a structured approach, emphasizing folder organization and thematic scope separation.", "mediaImage": "", - "file": "shared/eslint", + "file": "shared/recipes/storybook/one-storybook-per-scope", "itemList": [], "isExternal": false, - "path": "/recipes/tips-n-tricks/eslint", - "tags": [] + "path": "/recipes/storybook/one-storybook-per-scope", + "tags": ["storybook"] }, { - "id": "enable-tsc-batch-mode", - "name": "Enable Typescript Batch Mode", - "description": "", + "id": "one-storybook-with-composition", + "name": "One main Storybook instance using Storybook Composition", + "description": "This guide explains how to publish a unified Storybook instance from multiple frameworks within an Nx workspace using Storybook Composition.", "mediaImage": "", - "file": "shared/recipes/enable-tsc-batch-mode", + "file": "shared/recipes/storybook/one-storybook-with-composition", "itemList": [], "isExternal": false, - "path": "/recipes/tips-n-tricks/enable-tsc-batch-mode", - "tags": [] + "path": "/recipes/storybook/one-storybook-with-composition", + "tags": ["storybook"] }, { - "id": "define-secondary-entrypoints", - "name": "Define Secondary Entrypoints for Typescript Packages", - "description": "", + "id": "custom-builder-configs", + "name": "How to configure Webpack and Vite for Storybook", + "description": "This guide explains how to customize the webpack configuration and your vite configuration for Storybook.", "mediaImage": "", - "file": "shared/recipes/tips-n-tricks/define-secondary-entrypoints", + "file": "shared/recipes/storybook/custom-builder-configs", "itemList": [], "isExternal": false, - "path": "/recipes/tips-n-tricks/define-secondary-entrypoints", - "tags": [] + "path": "/recipes/storybook/custom-builder-configs", + "tags": ["storybook"] }, { - "id": "compile-multiple-formats", - "name": "Compile Typescript Packages to Multiple Formats", - "description": "", + "id": "storybook-interaction-tests", + "name": "Setting up Storybook Interaction Tests with Nx", + "description": "This guide explains how you can set up Storybook interaction tests on your Nx workspace.", "mediaImage": "", - "file": "shared/recipes/tips-n-tricks/compile-multiple-formats", + "file": "shared/recipes/storybook/interaction-tests", "itemList": [], "isExternal": false, - "path": "/recipes/tips-n-tricks/compile-multiple-formats", - "tags": [] + "path": "/recipes/storybook/storybook-interaction-tests", + "tags": ["storybook"] }, { - "id": "keep-nx-versions-in-sync", - "name": "Keep Nx Versions in Sync", - "description": "", + "id": "upgrading-storybook", + "name": "Upgrading Storybook using the Storybook CLI", + "description": "This guide explains how you can upgrade Storybook using the Storybook CLI upgrade and automigrate commands.", "mediaImage": "", - "file": "shared/recipes/tips-n-tricks/keep-nx-versions-in-sync", + "file": "shared/recipes/storybook/upgrading-storybook", "itemList": [], "isExternal": false, - "path": "/recipes/tips-n-tricks/keep-nx-versions-in-sync", - "tags": ["automate-updating-dependencies"] + "path": "/recipes/storybook/upgrading-storybook", + "tags": ["storybook"] }, { - "id": "define-environment-variables", - "name": "Define Environment Variables", - "description": "", + "id": "storybook-composition-setup", + "name": "Setting up Storybook Composition with Nx", + "description": "This guide explains how you can set up Storybook composition on your Nx workspace.", "mediaImage": "", - "file": "shared/guides/define-environment-variables", + "file": "shared/recipes/storybook/storybook-composition-setup", "itemList": [], "isExternal": false, - "path": "/recipes/tips-n-tricks/define-environment-variables", - "tags": ["environment-variables"] + "path": "/recipes/storybook/storybook-composition-setup", + "tags": ["storybook"] }, { - "id": "browser-support", - "name": "Configuring Browser Support", - "description": "", + "id": "angular-storybook-compodoc", + "name": "Angular: Set up Compodoc for Storybook on Nx", + "description": "This guide explains how to set up Compodoc for Storybook on Angular projects in a Nx workspace.", "mediaImage": "", - "file": "shared/guides/browser-support", + "file": "shared/recipes/storybook/angular-storybook-compodoc", "itemList": [], "isExternal": false, - "path": "/recipes/tips-n-tricks/browser-support", - "tags": [] + "path": "/recipes/storybook/angular-storybook-compodoc", + "tags": ["storybook"] }, { - "id": "include-assets-in-build", - "name": "Include Assets in Build", - "description": "", + "id": "angular-configuring-styles", + "name": "Angular: Configuring styles and preprocessor options", + "description": "This document explains how to configure styles and preprocessor options in Angular projects with a Storybook configuration.", "mediaImage": "", - "file": "shared/recipes/include-assets-in-build", + "file": "shared/recipes/storybook/angular-configuring-styles", "itemList": [], "isExternal": false, - "path": "/recipes/tips-n-tricks/include-assets-in-build", + "path": "/recipes/storybook/angular-configuring-styles", + "tags": ["storybook"] + } + ], + "isExternal": false, + "path": "/recipes/storybook", + "tags": [] + }, + { + "id": "cypress", + "name": "Cypress", + "description": "Cypress related recipes", + "mediaImage": "", + "file": "", + "itemList": [ + { + "id": "cypress-component-testing", + "name": "Component Testing", + "description": "Component Testing", + "mediaImage": "", + "file": "shared/packages/cypress/cypress-component-testing", + "itemList": [], + "isExternal": false, + "path": "/recipes/cypress/cypress-component-testing", "tags": [] }, { - "id": "include-all-packagejson", - "name": "Include All package.json Files as Projects", - "description": "", + "id": "cypress-setup-node-events", + "name": "Using setupNodeEvents with Cypress preset", + "description": "A guide on using the setupNodeEvents function with @nx/cypress/plugins/cypress-preset", "mediaImage": "", - "file": "shared/recipes/include-all-packagejson", + "file": "shared/packages/cypress/cypress-setup-node-events", "itemList": [], "isExternal": false, - "path": "/recipes/tips-n-tricks/include-all-packagejson", + "path": "/recipes/cypress/cypress-setup-node-events", "tags": [] }, { - "id": "identify-dependencies-between-folders", - "name": "Identify Dependencies Between Folders", - "description": "", + "id": "cypress-v11-migration", + "name": "Cypress v11 Migration Guide", + "description": "Cypress v11 Migration Guide", "mediaImage": "", - "file": "shared/recipes/identify-dependencies-between-folders", + "file": "shared/packages/cypress/cypress-v11-migration", "itemList": [], "isExternal": false, - "path": "/recipes/tips-n-tricks/identify-dependencies-between-folders", + "path": "/recipes/cypress/cypress-v11-migration", "tags": [] - }, + } + ], + "isExternal": false, + "path": "/recipes/cypress", + "tags": [] + }, + { + "id": "next", + "name": "Next", + "description": "Next related recipes", + "mediaImage": "", + "file": "", + "itemList": [ { - "id": "analyze-source-files", - "name": "Disable Graph Links Created from Analyzing Source Files", - "description": "", + "id": "next-config-setup", + "name": "How to configure Next.js plugins", + "description": "How to configure Next.js plugins", "mediaImage": "", - "file": "shared/recipes/analyze-source-files", + "file": "shared/packages/next/next-config-setup", "itemList": [], "isExternal": false, - "path": "/recipes/tips-n-tricks/analyze-source-files", - "tags": ["explore-graph"] - }, + "path": "/recipes/next/next-config-setup", + "tags": [] + } + ], + "isExternal": false, + "path": "/recipes/next", + "tags": [] + }, + { + "id": "nuxt", + "name": "Nuxt", + "description": "Nuxt related recipes", + "mediaImage": "", + "file": "", + "itemList": [ { - "id": "js-and-ts", - "name": "Use JavaScript instead TypeScript", - "description": "", + "id": "deploy-nuxt-to-vercel", + "name": "Deploying Nuxt applications to Vercel", + "description": "A detailed guide on how to deploy Nuxt applications from Nx workspaces to Vercel.", "mediaImage": "", - "file": "shared/guides/js-and-ts", + "file": "shared/recipes/deployment/deploy-nuxt-to-vercel", "itemList": [], "isExternal": false, - "path": "/recipes/tips-n-tricks/js-and-ts", + "path": "/recipes/nuxt/deploy-nuxt-to-vercel", "tags": [] - }, + } + ], + "isExternal": false, + "path": "/recipes/nuxt", + "tags": [] + }, + { + "id": "vite", + "name": "Vite", + "description": "Vite related recipes", + "mediaImage": "", + "file": "", + "itemList": [ { - "id": "advanced-update", - "name": "Altering Migration Process", - "description": "", + "id": "configure-vite", + "name": "Configure Vite on your Nx workspace", + "description": "Configure Vite on your Nx workspace", "mediaImage": "", - "file": "shared/recipes/advanced-update", + "file": "shared/packages/vite/configure-vite", "itemList": [], "isExternal": false, - "path": "/recipes/tips-n-tricks/advanced-update", - "tags": ["automate-updating-dependencies"] - }, + "path": "/recipes/vite/configure-vite", + "tags": [] + } + ], + "isExternal": false, + "path": "/recipes/vite", + "tags": [] + }, + { + "id": "webpack", + "name": "Webpack", + "description": "Webpack related recipes", + "mediaImage": "", + "file": "", + "itemList": [ { - "id": "yarn-pnp", - "name": "Using Yarn PnP", - "description": "", + "id": "webpack-config-setup", + "name": "How to configure Webpack in your Nx workspace", + "description": "A guide on how to configure webpack on your Nx workspace, and instructions on how to customize your webpack configuration", "mediaImage": "", - "file": "shared/recipes/yarn-pnp", + "file": "shared/packages/webpack/webpack-config-setup", "itemList": [], "isExternal": false, - "path": "/recipes/tips-n-tricks/yarn-pnp", - "tags": ["yarn", "Plug and Play"] + "path": "/recipes/webpack/webpack-config-setup", + "tags": [] }, { - "id": "flat-config", - "name": "Switching to ESLint's flat config format", - "description": "", + "id": "webpack-plugins", + "name": "Webpack plugins", + "description": "Webpack plugins", "mediaImage": "", - "file": "shared/recipes/tips-n-tricks/migrating-to-flat-eslint", + "file": "shared/packages/webpack/webpack-plugins", "itemList": [], "isExternal": false, - "path": "/recipes/tips-n-tricks/flat-config", - "tags": ["eslint", "flat config"] + "path": "/recipes/webpack/webpack-plugins", + "tags": [] } ], "isExternal": false, - "path": "/recipes/tips-n-tricks", + "path": "/recipes/webpack", "tags": [] }, { - "id": "nx-console", - "name": "Nx Console", - "description": "Checkout all the recipes related to Nx Console.", + "id": "enforce-module-boundaries", + "name": "Enforce Module Boundaries", + "description": "Configuring the enforce module boundaries rule", "mediaImage": "", "file": "", "itemList": [ { - "id": "console-telemetry", - "name": "Telemetry", + "id": "ban-dependencies-with-tags", + "name": "Ban Dependencies with Certain Tags", "description": "", "mediaImage": "", - "file": "shared/recipes/console-telemetry", + "file": "shared/recipes/ban-dependencies-with-tags", "itemList": [], "isExternal": false, - "path": "/recipes/nx-console/console-telemetry", - "tags": ["editor-setup"] + "path": "/recipes/enforce-module-boundaries/ban-dependencies-with-tags", + "tags": ["enforce-module-boundaries"] }, { - "id": "console-project-details", - "name": "Project Details View", + "id": "tag-multiple-dimensions", + "name": "Tag in Multiple Dimensions", "description": "", "mediaImage": "", - "file": "shared/recipes/console-project-details", + "file": "shared/recipes/tag-multiple-dimensions", "itemList": [], "isExternal": false, - "path": "/recipes/nx-console/console-project-details", - "tags": ["editor-setup"] + "path": "/recipes/enforce-module-boundaries/tag-multiple-dimensions", + "tags": ["enforce-module-boundaries"] }, { - "id": "console-generate-command", - "name": "Generate Command", + "id": "ban-external-imports", + "name": "Ban External Imports", "description": "", "mediaImage": "", - "file": "shared/recipes/console-generate-command", + "file": "shared/recipes/ban-external-imports", "itemList": [], "isExternal": false, - "path": "/recipes/nx-console/console-generate-command", - "tags": ["editor-setup"] + "path": "/recipes/enforce-module-boundaries/ban-external-imports", + "tags": ["enforce-module-boundaries"] }, { - "id": "console-run-command", - "name": "Run Command", - "description": "", - "mediaImage": "", - "file": "shared/recipes/console-run-command", - "itemList": [], - "isExternal": false, - "path": "/recipes/nx-console/console-run-command", - "tags": ["editor-setup"] - }, - { - "id": "console-troubleshooting", - "name": "Troubleshooting", + "id": "tags-allow-list", + "name": "Tags Allow List", "description": "", "mediaImage": "", - "file": "shared/recipes/console-troubleshooting", + "file": "shared/recipes/tags-allow-list", "itemList": [], "isExternal": false, - "path": "/recipes/nx-console/console-troubleshooting", - "tags": ["editor-setup"] + "path": "/recipes/enforce-module-boundaries/tags-allow-list", + "tags": ["enforce-module-boundaries"] } ], "isExternal": false, - "path": "/recipes/nx-console", + "path": "/recipes/enforce-module-boundaries", "tags": [] }, { - "id": "nx-release", - "name": "Nx Release", - "description": "Recipes for releasing with Nx release.", + "id": "tips-n-tricks", + "name": "Tips and tricks", + "description": "Various tips and tricks for using Nx.", "mediaImage": "", "file": "", "itemList": [ { - "id": "get-started-with-nx-release", - "name": "Get Started with Nx Release", + "id": "standalone-to-monorepo", + "name": "Convert from a Standalone Repository to a Monorepo", "description": "", "mediaImage": "", - "file": "shared/recipes/nx-release/get-started-with-nx-release", + "file": "shared/recipes/tips-n-tricks/standalone-to-monorepo", "itemList": [], "isExternal": false, - "path": "/recipes/nx-release/get-started-with-nx-release", - "tags": ["nx-release"] + "path": "/recipes/tips-n-tricks/standalone-to-monorepo", + "tags": [] }, { - "id": "release-projects-independently", - "name": "Release Projects Independently", + "id": "eslint", + "name": "Configuring ESLint with Typescript", "description": "", "mediaImage": "", - "file": "shared/recipes/nx-release/release-projects-independently", + "file": "shared/eslint", "itemList": [], "isExternal": false, - "path": "/recipes/nx-release/release-projects-independently", - "tags": ["nx-release"] + "path": "/recipes/tips-n-tricks/eslint", + "tags": [] }, { - "id": "automatically-version-with-conventional-commits", - "name": "Automatically Version with Conventional Commits", + "id": "enable-tsc-batch-mode", + "name": "Enable Typescript Batch Mode", "description": "", "mediaImage": "", - "file": "shared/recipes/nx-release/automatically-version-with-conventional-commits", + "file": "shared/recipes/enable-tsc-batch-mode", "itemList": [], "isExternal": false, - "path": "/recipes/nx-release/automatically-version-with-conventional-commits", - "tags": ["nx-release"] + "path": "/recipes/tips-n-tricks/enable-tsc-batch-mode", + "tags": [] }, { - "id": "customize-conventional-commit-types", - "name": "Customize Conventional Commit Types", + "id": "define-secondary-entrypoints", + "name": "Define Secondary Entrypoints for Typescript Packages", "description": "", "mediaImage": "", - "file": "shared/recipes/nx-release/customize-conventional-commit-types", + "file": "shared/recipes/tips-n-tricks/define-secondary-entrypoints", "itemList": [], "isExternal": false, - "path": "/recipes/nx-release/customize-conventional-commit-types", - "tags": ["nx-release"] + "path": "/recipes/tips-n-tricks/define-secondary-entrypoints", + "tags": [] }, { - "id": "file-based-versioning-version-plans", - "name": "File Based Versioning (Version Plans)", + "id": "compile-multiple-formats", + "name": "Compile Typescript Packages to Multiple Formats", "description": "", "mediaImage": "", - "file": "shared/recipes/nx-release/file-based-versioning-version-plans", + "file": "shared/recipes/tips-n-tricks/compile-multiple-formats", "itemList": [], "isExternal": false, - "path": "/recipes/nx-release/file-based-versioning-version-plans", - "tags": ["nx-release"] + "path": "/recipes/tips-n-tricks/compile-multiple-formats", + "tags": [] }, { - "id": "configure-custom-registries", - "name": "Configure Custom Registries", + "id": "keep-nx-versions-in-sync", + "name": "Keep Nx Versions in Sync", "description": "", "mediaImage": "", - "file": "shared/recipes/nx-release/configure-custom-registries", + "file": "shared/recipes/tips-n-tricks/keep-nx-versions-in-sync", "itemList": [], "isExternal": false, - "path": "/recipes/nx-release/configure-custom-registries", - "tags": ["nx-release"] + "path": "/recipes/tips-n-tricks/keep-nx-versions-in-sync", + "tags": ["automate-updating-dependencies"] }, { - "id": "publish-in-ci-cd", - "name": "Publish in CI/CD", + "id": "define-environment-variables", + "name": "Define Environment Variables", "description": "", "mediaImage": "", - "file": "shared/recipes/nx-release/publish-in-ci-cd", + "file": "shared/guides/define-environment-variables", "itemList": [], "isExternal": false, - "path": "/recipes/nx-release/publish-in-ci-cd", - "tags": ["nx-release"] + "path": "/recipes/tips-n-tricks/define-environment-variables", + "tags": ["environment-variables"] }, { - "id": "automate-github-releases", - "name": "Automate GitHub Releases", + "id": "browser-support", + "name": "Configuring Browser Support", "description": "", "mediaImage": "", - "file": "shared/recipes/nx-release/automate-github-releases", + "file": "shared/guides/browser-support", "itemList": [], "isExternal": false, - "path": "/recipes/nx-release/automate-github-releases", - "tags": ["nx-release"] + "path": "/recipes/tips-n-tricks/browser-support", + "tags": [] }, { - "id": "publish-rust-crates", - "name": "Publish Rust Crates", + "id": "include-assets-in-build", + "name": "Include Assets in Build", "description": "", "mediaImage": "", - "file": "shared/recipes/nx-release/publish-rust-crates", + "file": "shared/recipes/include-assets-in-build", "itemList": [], "isExternal": false, - "path": "/recipes/nx-release/publish-rust-crates", - "tags": ["nx-release"] + "path": "/recipes/tips-n-tricks/include-assets-in-build", + "tags": [] }, { - "id": "update-local-registry-setup", - "name": "Update Your Local Registry Setup to use Nx Release", + "id": "include-all-packagejson", + "name": "Include All package.json Files as Projects", "description": "", "mediaImage": "", - "file": "shared/recipes/nx-release/update-local-registry-setup", + "file": "shared/recipes/include-all-packagejson", "itemList": [], "isExternal": false, - "path": "/recipes/nx-release/update-local-registry-setup", - "tags": ["nx-release"] + "path": "/recipes/tips-n-tricks/include-all-packagejson", + "tags": [] }, { - "id": "configure-changelog-format", - "name": "Configure Changelog Format", + "id": "identify-dependencies-between-folders", + "name": "Identify Dependencies Between Folders", "description": "", "mediaImage": "", - "file": "shared/recipes/nx-release/configure-changelog-format", + "file": "shared/recipes/identify-dependencies-between-folders", "itemList": [], "isExternal": false, - "path": "/recipes/nx-release/configure-changelog-format", - "tags": ["nx-release"] + "path": "/recipes/tips-n-tricks/identify-dependencies-between-folders", + "tags": [] }, { - "id": "publish-custom-dist-directory", - "name": "Publish a Custom Dist Directory", + "id": "analyze-source-files", + "name": "Disable Graph Links Created from Analyzing Source Files", "description": "", "mediaImage": "", - "file": "shared/recipes/nx-release/publish-custom-dist-directory", + "file": "shared/recipes/analyze-source-files", "itemList": [], "isExternal": false, - "path": "/recipes/nx-release/publish-custom-dist-directory", - "tags": ["nx-release"] + "path": "/recipes/tips-n-tricks/analyze-source-files", + "tags": ["explore-graph"] }, { - "id": "build-before-versioning", - "name": "Build Before Versioning", + "id": "js-and-ts", + "name": "Use JavaScript instead TypeScript", "description": "", "mediaImage": "", - "file": "shared/recipes/nx-release/build-before-versioning", + "file": "shared/guides/js-and-ts", "itemList": [], "isExternal": false, - "path": "/recipes/nx-release/build-before-versioning", - "tags": ["nx-release"] + "path": "/recipes/tips-n-tricks/js-and-ts", + "tags": [] }, { - "id": "configuration-version-prefix", - "name": "Configuring Version Prefix for Dependency Versions", + "id": "advanced-update", + "name": "Altering Migration Process", "description": "", "mediaImage": "", - "file": "shared/recipes/nx-release/configuration-version-prefix", + "file": "shared/recipes/advanced-update", "itemList": [], "isExternal": false, - "path": "/recipes/nx-release/configuration-version-prefix", - "tags": ["nx-release"] + "path": "/recipes/tips-n-tricks/advanced-update", + "tags": ["automate-updating-dependencies"] + }, + { + "id": "yarn-pnp", + "name": "Using Yarn PnP", + "description": "", + "mediaImage": "", + "file": "shared/recipes/yarn-pnp", + "itemList": [], + "isExternal": false, + "path": "/recipes/tips-n-tricks/yarn-pnp", + "tags": ["yarn", "Plug and Play"] + }, + { + "id": "flat-config", + "name": "Switching to ESLint's flat config format", + "description": "", + "mediaImage": "", + "file": "shared/recipes/tips-n-tricks/migrating-to-flat-eslint", + "itemList": [], + "isExternal": false, + "path": "/recipes/tips-n-tricks/flat-config", + "tags": ["eslint", "flat config"] } ], "isExternal": false, - "path": "/recipes/nx-release", + "path": "/recipes/tips-n-tricks", "tags": [] } ], @@ -3277,2045 +3277,2045 @@ "path": "/recipes/adopting-nx/manual", "tags": [] }, - "/recipes/react": { - "id": "react", - "name": "React", - "description": "Advanced guides to adopt Nx in React.", + "/recipes/nx-release": { + "id": "nx-release", + "name": "Nx Release", + "description": "Recipes for releasing with Nx release.", "mediaImage": "", "file": "", "itemList": [ { - "id": "react-native", - "name": "React Native with Nx", + "id": "get-started-with-nx-release", + "name": "Get Started with Nx Release", "description": "", "mediaImage": "", - "file": "shared/guides/react-native", + "file": "shared/recipes/nx-release/get-started-with-nx-release", "itemList": [], "isExternal": false, - "path": "/recipes/react/react-native", - "tags": [] + "path": "/recipes/nx-release/get-started-with-nx-release", + "tags": ["nx-release"] }, { - "id": "remix", - "name": "Remix with Nx", + "id": "release-projects-independently", + "name": "Release Projects Independently", "description": "", "mediaImage": "", - "file": "shared/guides/remix", + "file": "shared/recipes/nx-release/release-projects-independently", "itemList": [], "isExternal": false, - "path": "/recipes/react/remix", - "tags": [] + "path": "/recipes/nx-release/release-projects-independently", + "tags": ["nx-release"] }, { - "id": "use-environment-variables-in-react", - "name": "Use Environment Variables in React", + "id": "automatically-version-with-conventional-commits", + "name": "Automatically Version with Conventional Commits", "description": "", "mediaImage": "", - "file": "shared/guides/use-environment-variables-in-react", + "file": "shared/recipes/nx-release/automatically-version-with-conventional-commits", "itemList": [], "isExternal": false, - "path": "/recipes/react/use-environment-variables-in-react", - "tags": ["environment-variables"] + "path": "/recipes/nx-release/automatically-version-with-conventional-commits", + "tags": ["nx-release"] }, { - "id": "using-tailwind-css-in-react", - "name": "Using Tailwind CSS in React", + "id": "customize-conventional-commit-types", + "name": "Customize Conventional Commit Types", "description": "", "mediaImage": "", - "file": "shared/guides/using-tailwind-css-in-react", + "file": "shared/recipes/nx-release/customize-conventional-commit-types", "itemList": [], "isExternal": false, - "path": "/recipes/react/using-tailwind-css-in-react", - "tags": [] + "path": "/recipes/nx-release/customize-conventional-commit-types", + "tags": ["nx-release"] }, { - "id": "adding-assets-react", - "name": "Adding Images, Fonts, and Files", + "id": "file-based-versioning-version-plans", + "name": "File Based Versioning (Version Plans)", "description": "", "mediaImage": "", - "file": "shared/guides/adding-assets", + "file": "shared/recipes/nx-release/file-based-versioning-version-plans", "itemList": [], "isExternal": false, - "path": "/recipes/react/adding-assets-react", - "tags": [] + "path": "/recipes/nx-release/file-based-versioning-version-plans", + "tags": ["nx-release"] }, { - "id": "module-federation-with-ssr", - "name": "Setup Module Federation with SSR for React", + "id": "configure-custom-registries", + "name": "Configure Custom Registries", "description": "", "mediaImage": "", - "file": "shared/recipes/module-federation-with-ssr", + "file": "shared/recipes/nx-release/configure-custom-registries", "itemList": [], "isExternal": false, - "path": "/recipes/react/module-federation-with-ssr", - "tags": ["module-federation", "react"] + "path": "/recipes/nx-release/configure-custom-registries", + "tags": ["nx-release"] }, { - "id": "deploy-nextjs-to-vercel", - "name": "Deploying Next.js applications to Vercel", + "id": "publish-in-ci-cd", + "name": "Publish in CI/CD", "description": "", "mediaImage": "", - "file": "shared/recipes/deployment/deploy-nextjs-to-vercel", + "file": "shared/recipes/nx-release/publish-in-ci-cd", "itemList": [], "isExternal": false, - "path": "/recipes/react/deploy-nextjs-to-vercel", - "tags": [] + "path": "/recipes/nx-release/publish-in-ci-cd", + "tags": ["nx-release"] }, { - "id": "react-compiler", - "name": "React Compiler with Nx", + "id": "automate-github-releases", + "name": "Automate GitHub Releases", "description": "", "mediaImage": "", - "file": "shared/guides/react-compiler", + "file": "shared/recipes/nx-release/automate-github-releases", "itemList": [], "isExternal": false, - "path": "/recipes/react/react-compiler", - "tags": [] - } - ], - "isExternal": false, - "path": "/recipes/react", - "tags": [] - }, - "/recipes/react/react-native": { - "id": "react-native", - "name": "React Native with Nx", - "description": "", - "mediaImage": "", - "file": "shared/guides/react-native", - "itemList": [], - "isExternal": false, - "path": "/recipes/react/react-native", - "tags": [] - }, - "/recipes/react/remix": { - "id": "remix", - "name": "Remix with Nx", - "description": "", - "mediaImage": "", - "file": "shared/guides/remix", - "itemList": [], - "isExternal": false, - "path": "/recipes/react/remix", - "tags": [] - }, - "/recipes/react/use-environment-variables-in-react": { - "id": "use-environment-variables-in-react", - "name": "Use Environment Variables in React", - "description": "", - "mediaImage": "", - "file": "shared/guides/use-environment-variables-in-react", - "itemList": [], - "isExternal": false, - "path": "/recipes/react/use-environment-variables-in-react", - "tags": ["environment-variables"] - }, - "/recipes/react/using-tailwind-css-in-react": { - "id": "using-tailwind-css-in-react", - "name": "Using Tailwind CSS in React", - "description": "", - "mediaImage": "", - "file": "shared/guides/using-tailwind-css-in-react", - "itemList": [], - "isExternal": false, - "path": "/recipes/react/using-tailwind-css-in-react", - "tags": [] - }, - "/recipes/react/adding-assets-react": { - "id": "adding-assets-react", - "name": "Adding Images, Fonts, and Files", - "description": "", - "mediaImage": "", - "file": "shared/guides/adding-assets", - "itemList": [], - "isExternal": false, - "path": "/recipes/react/adding-assets-react", - "tags": [] - }, - "/recipes/react/module-federation-with-ssr": { - "id": "module-federation-with-ssr", - "name": "Setup Module Federation with SSR for React", - "description": "", - "mediaImage": "", - "file": "shared/recipes/module-federation-with-ssr", - "itemList": [], - "isExternal": false, - "path": "/recipes/react/module-federation-with-ssr", - "tags": ["module-federation", "react"] - }, - "/recipes/react/deploy-nextjs-to-vercel": { - "id": "deploy-nextjs-to-vercel", - "name": "Deploying Next.js applications to Vercel", - "description": "", - "mediaImage": "", - "file": "shared/recipes/deployment/deploy-nextjs-to-vercel", - "itemList": [], - "isExternal": false, - "path": "/recipes/react/deploy-nextjs-to-vercel", - "tags": [] - }, - "/recipes/react/react-compiler": { - "id": "react-compiler", - "name": "React Compiler with Nx", - "description": "", - "mediaImage": "", - "file": "shared/guides/react-compiler", - "itemList": [], - "isExternal": false, - "path": "/recipes/react/react-compiler", - "tags": [] - }, - "/recipes/angular": { - "id": "angular", - "name": "Angular", - "description": "Advanced guides to adopt Nx in Angular.", - "mediaImage": "", - "file": "", - "itemList": [ - { - "id": "migration", - "name": "Migration", - "description": "", - "mediaImage": "", - "file": "", - "itemList": [ - { - "id": "angular", - "name": "Migrating from Angular CLI", - "description": "", - "mediaImage": "", - "file": "shared/migration/migration-angular", - "itemList": [], - "isExternal": false, - "path": "/recipes/angular/migration/angular", - "tags": [] - }, - { - "id": "angular-multiple", - "name": "Migrating From Multiple Angular CLI Repos", - "description": "", - "mediaImage": "", - "file": "shared/migration/angular-multiple", - "itemList": [], - "isExternal": false, - "path": "/recipes/angular/migration/angular-multiple", - "tags": [] - } - ], - "isExternal": false, - "path": "/recipes/angular/migration", - "tags": [] + "path": "/recipes/nx-release/automate-github-releases", + "tags": ["nx-release"] }, { - "id": "use-environment-variables-in-angular", - "name": "Use Environment Variables in Angular", + "id": "publish-rust-crates", + "name": "Publish Rust Crates", "description": "", "mediaImage": "", - "file": "shared/guides/use-environment-variables-in-angular", + "file": "shared/recipes/nx-release/publish-rust-crates", "itemList": [], "isExternal": false, - "path": "/recipes/angular/use-environment-variables-in-angular", - "tags": ["environment-variables"] + "path": "/recipes/nx-release/publish-rust-crates", + "tags": ["nx-release"] }, { - "id": "using-tailwind-css-with-angular-projects", - "name": "Using Tailwind CSS with Angular projects", + "id": "update-local-registry-setup", + "name": "Update Your Local Registry Setup to use Nx Release", "description": "", "mediaImage": "", - "file": "shared/guides/using-tailwind-css-with-angular-projects", + "file": "shared/recipes/nx-release/update-local-registry-setup", "itemList": [], "isExternal": false, - "path": "/recipes/angular/using-tailwind-css-with-angular-projects", - "tags": [] + "path": "/recipes/nx-release/update-local-registry-setup", + "tags": ["nx-release"] }, { - "id": "module-federation-with-ssr", - "name": "Setup Module Federation with SSR for Angular", + "id": "configure-changelog-format", + "name": "Configure Changelog Format", "description": "", "mediaImage": "", - "file": "shared/recipes/module-federation-with-ssr", + "file": "shared/recipes/nx-release/configure-changelog-format", "itemList": [], "isExternal": false, - "path": "/recipes/angular/module-federation-with-ssr", - "tags": ["module-federation", "angular"] + "path": "/recipes/nx-release/configure-changelog-format", + "tags": ["nx-release"] }, { - "id": "dynamic-module-federation-with-angular", - "name": "Advanced Micro Frontends with Angular using Dynamic Federation", + "id": "publish-custom-dist-directory", + "name": "Publish a Custom Dist Directory", "description": "", "mediaImage": "", - "file": "shared/recipes/module-federation/dynamic-mfe-angular", + "file": "shared/recipes/nx-release/publish-custom-dist-directory", "itemList": [], "isExternal": false, - "path": "/recipes/angular/dynamic-module-federation-with-angular", - "tags": ["module-federation", "angular"] + "path": "/recipes/nx-release/publish-custom-dist-directory", + "tags": ["nx-release"] }, { - "id": "setup-incremental-builds-angular", - "name": "Setup incremental builds for Angular applications", - "description": "", - "mediaImage": "", - "file": "shared/guides/setup-incremental-builds-angular", - "itemList": [], - "isExternal": false, - "path": "/recipes/angular/setup-incremental-builds-angular", - "tags": [] - } - ], - "isExternal": false, - "path": "/recipes/angular", - "tags": [] - }, - "/recipes/angular/migration": { - "id": "migration", - "name": "Migration", - "description": "", - "mediaImage": "", - "file": "", - "itemList": [ - { - "id": "angular", - "name": "Migrating from Angular CLI", + "id": "build-before-versioning", + "name": "Build Before Versioning", "description": "", "mediaImage": "", - "file": "shared/migration/migration-angular", + "file": "shared/recipes/nx-release/build-before-versioning", "itemList": [], "isExternal": false, - "path": "/recipes/angular/migration/angular", - "tags": [] + "path": "/recipes/nx-release/build-before-versioning", + "tags": ["nx-release"] }, { - "id": "angular-multiple", - "name": "Migrating From Multiple Angular CLI Repos", + "id": "configuration-version-prefix", + "name": "Configuring Version Prefix for Dependency Versions", "description": "", "mediaImage": "", - "file": "shared/migration/angular-multiple", + "file": "shared/recipes/nx-release/configuration-version-prefix", "itemList": [], "isExternal": false, - "path": "/recipes/angular/migration/angular-multiple", - "tags": [] + "path": "/recipes/nx-release/configuration-version-prefix", + "tags": ["nx-release"] } ], "isExternal": false, - "path": "/recipes/angular/migration", + "path": "/recipes/nx-release", "tags": [] }, - "/recipes/angular/migration/angular": { - "id": "angular", - "name": "Migrating from Angular CLI", + "/recipes/nx-release/get-started-with-nx-release": { + "id": "get-started-with-nx-release", + "name": "Get Started with Nx Release", "description": "", "mediaImage": "", - "file": "shared/migration/migration-angular", + "file": "shared/recipes/nx-release/get-started-with-nx-release", "itemList": [], "isExternal": false, - "path": "/recipes/angular/migration/angular", - "tags": [] + "path": "/recipes/nx-release/get-started-with-nx-release", + "tags": ["nx-release"] }, - "/recipes/angular/migration/angular-multiple": { - "id": "angular-multiple", - "name": "Migrating From Multiple Angular CLI Repos", + "/recipes/nx-release/release-projects-independently": { + "id": "release-projects-independently", + "name": "Release Projects Independently", "description": "", "mediaImage": "", - "file": "shared/migration/angular-multiple", + "file": "shared/recipes/nx-release/release-projects-independently", "itemList": [], "isExternal": false, - "path": "/recipes/angular/migration/angular-multiple", - "tags": [] + "path": "/recipes/nx-release/release-projects-independently", + "tags": ["nx-release"] }, - "/recipes/angular/use-environment-variables-in-angular": { - "id": "use-environment-variables-in-angular", - "name": "Use Environment Variables in Angular", + "/recipes/nx-release/automatically-version-with-conventional-commits": { + "id": "automatically-version-with-conventional-commits", + "name": "Automatically Version with Conventional Commits", "description": "", "mediaImage": "", - "file": "shared/guides/use-environment-variables-in-angular", + "file": "shared/recipes/nx-release/automatically-version-with-conventional-commits", "itemList": [], "isExternal": false, - "path": "/recipes/angular/use-environment-variables-in-angular", - "tags": ["environment-variables"] + "path": "/recipes/nx-release/automatically-version-with-conventional-commits", + "tags": ["nx-release"] }, - "/recipes/angular/using-tailwind-css-with-angular-projects": { - "id": "using-tailwind-css-with-angular-projects", - "name": "Using Tailwind CSS with Angular projects", + "/recipes/nx-release/customize-conventional-commit-types": { + "id": "customize-conventional-commit-types", + "name": "Customize Conventional Commit Types", "description": "", "mediaImage": "", - "file": "shared/guides/using-tailwind-css-with-angular-projects", + "file": "shared/recipes/nx-release/customize-conventional-commit-types", "itemList": [], "isExternal": false, - "path": "/recipes/angular/using-tailwind-css-with-angular-projects", - "tags": [] + "path": "/recipes/nx-release/customize-conventional-commit-types", + "tags": ["nx-release"] }, - "/recipes/angular/module-federation-with-ssr": { - "id": "module-federation-with-ssr", - "name": "Setup Module Federation with SSR for Angular", + "/recipes/nx-release/file-based-versioning-version-plans": { + "id": "file-based-versioning-version-plans", + "name": "File Based Versioning (Version Plans)", "description": "", "mediaImage": "", - "file": "shared/recipes/module-federation-with-ssr", + "file": "shared/recipes/nx-release/file-based-versioning-version-plans", "itemList": [], "isExternal": false, - "path": "/recipes/angular/module-federation-with-ssr", - "tags": ["module-federation", "angular"] + "path": "/recipes/nx-release/file-based-versioning-version-plans", + "tags": ["nx-release"] }, - "/recipes/angular/dynamic-module-federation-with-angular": { - "id": "dynamic-module-federation-with-angular", - "name": "Advanced Micro Frontends with Angular using Dynamic Federation", + "/recipes/nx-release/configure-custom-registries": { + "id": "configure-custom-registries", + "name": "Configure Custom Registries", "description": "", "mediaImage": "", - "file": "shared/recipes/module-federation/dynamic-mfe-angular", + "file": "shared/recipes/nx-release/configure-custom-registries", "itemList": [], "isExternal": false, - "path": "/recipes/angular/dynamic-module-federation-with-angular", - "tags": ["module-federation", "angular"] + "path": "/recipes/nx-release/configure-custom-registries", + "tags": ["nx-release"] }, - "/recipes/angular/setup-incremental-builds-angular": { - "id": "setup-incremental-builds-angular", - "name": "Setup incremental builds for Angular applications", + "/recipes/nx-release/publish-in-ci-cd": { + "id": "publish-in-ci-cd", + "name": "Publish in CI/CD", "description": "", "mediaImage": "", - "file": "shared/guides/setup-incremental-builds-angular", + "file": "shared/recipes/nx-release/publish-in-ci-cd", "itemList": [], "isExternal": false, - "path": "/recipes/angular/setup-incremental-builds-angular", - "tags": [] + "path": "/recipes/nx-release/publish-in-ci-cd", + "tags": ["nx-release"] }, - "/recipes/node": { - "id": "node", - "name": "Node", - "description": "Set of Node related recipes.", + "/recipes/nx-release/automate-github-releases": { + "id": "automate-github-releases", + "name": "Automate GitHub Releases", + "description": "", "mediaImage": "", - "file": "", - "itemList": [ - { - "id": "node-server-fly-io", - "name": "Deploying a Node App to Fly.io", - "description": "", - "mediaImage": "", - "file": "shared/recipes/deployment/node-server-fly-io", - "itemList": [], - "isExternal": false, - "path": "/recipes/node/node-server-fly-io", - "tags": ["deployment", "node"] - }, - { - "id": "node-serverless-functions-netlify", - "name": "Add and Deploy Netlify Edge Functions with Node", - "description": "", - "mediaImage": "", - "file": "shared/recipes/deployment/node-serverless-functions-netlify", - "itemList": [], - "isExternal": false, - "path": "/recipes/node/node-serverless-functions-netlify", - "tags": ["deployment", "node"] - }, - { - "id": "node-aws-lambda", - "name": "Deploying AWS lambda in Node.js (deprecated)", - "description": "", - "mediaImage": "", - "file": "shared/recipes/deployment/node-aws-lambda", - "itemList": [], - "isExternal": false, - "path": "/recipes/node/node-aws-lambda", - "tags": ["deployment", "node"] - }, - { - "id": "application-proxies", - "name": "Set Up Application Proxies", - "description": "", - "mediaImage": "", - "file": "shared/recipes/node/application-proxies", - "itemList": [], - "isExternal": false, - "path": "/recipes/node/application-proxies", - "tags": ["node"] - }, - { - "id": "wait-for-tasks", - "name": "Wait for Tasks to Finish", - "description": "", - "mediaImage": "", - "file": "shared/recipes/node/wait-for-tasks", - "itemList": [], - "isExternal": false, - "path": "/recipes/node/wait-for-tasks", - "tags": [] - } - ], + "file": "shared/recipes/nx-release/automate-github-releases", + "itemList": [], "isExternal": false, - "path": "/recipes/node", - "tags": [] + "path": "/recipes/nx-release/automate-github-releases", + "tags": ["nx-release"] }, - "/recipes/node/node-server-fly-io": { - "id": "node-server-fly-io", - "name": "Deploying a Node App to Fly.io", + "/recipes/nx-release/publish-rust-crates": { + "id": "publish-rust-crates", + "name": "Publish Rust Crates", "description": "", "mediaImage": "", - "file": "shared/recipes/deployment/node-server-fly-io", + "file": "shared/recipes/nx-release/publish-rust-crates", "itemList": [], "isExternal": false, - "path": "/recipes/node/node-server-fly-io", - "tags": ["deployment", "node"] + "path": "/recipes/nx-release/publish-rust-crates", + "tags": ["nx-release"] }, - "/recipes/node/node-serverless-functions-netlify": { - "id": "node-serverless-functions-netlify", - "name": "Add and Deploy Netlify Edge Functions with Node", + "/recipes/nx-release/update-local-registry-setup": { + "id": "update-local-registry-setup", + "name": "Update Your Local Registry Setup to use Nx Release", "description": "", "mediaImage": "", - "file": "shared/recipes/deployment/node-serverless-functions-netlify", + "file": "shared/recipes/nx-release/update-local-registry-setup", "itemList": [], "isExternal": false, - "path": "/recipes/node/node-serverless-functions-netlify", - "tags": ["deployment", "node"] + "path": "/recipes/nx-release/update-local-registry-setup", + "tags": ["nx-release"] }, - "/recipes/node/node-aws-lambda": { - "id": "node-aws-lambda", - "name": "Deploying AWS lambda in Node.js (deprecated)", + "/recipes/nx-release/configure-changelog-format": { + "id": "configure-changelog-format", + "name": "Configure Changelog Format", "description": "", "mediaImage": "", - "file": "shared/recipes/deployment/node-aws-lambda", + "file": "shared/recipes/nx-release/configure-changelog-format", "itemList": [], "isExternal": false, - "path": "/recipes/node/node-aws-lambda", - "tags": ["deployment", "node"] + "path": "/recipes/nx-release/configure-changelog-format", + "tags": ["nx-release"] }, - "/recipes/node/application-proxies": { - "id": "application-proxies", - "name": "Set Up Application Proxies", + "/recipes/nx-release/publish-custom-dist-directory": { + "id": "publish-custom-dist-directory", + "name": "Publish a Custom Dist Directory", "description": "", "mediaImage": "", - "file": "shared/recipes/node/application-proxies", + "file": "shared/recipes/nx-release/publish-custom-dist-directory", "itemList": [], "isExternal": false, - "path": "/recipes/node/application-proxies", - "tags": ["node"] + "path": "/recipes/nx-release/publish-custom-dist-directory", + "tags": ["nx-release"] }, - "/recipes/node/wait-for-tasks": { - "id": "wait-for-tasks", - "name": "Wait for Tasks to Finish", + "/recipes/nx-release/build-before-versioning": { + "id": "build-before-versioning", + "name": "Build Before Versioning", "description": "", "mediaImage": "", - "file": "shared/recipes/node/wait-for-tasks", + "file": "shared/recipes/nx-release/build-before-versioning", "itemList": [], "isExternal": false, - "path": "/recipes/node/wait-for-tasks", - "tags": [] + "path": "/recipes/nx-release/build-before-versioning", + "tags": ["nx-release"] }, - "/recipes/storybook": { - "id": "storybook", - "name": "Storybook", - "description": "Storybook strategies and setups.", + "/recipes/nx-release/configuration-version-prefix": { + "id": "configuration-version-prefix", + "name": "Configuring Version Prefix for Dependency Versions", + "description": "", + "mediaImage": "", + "file": "shared/recipes/nx-release/configuration-version-prefix", + "itemList": [], + "isExternal": false, + "path": "/recipes/nx-release/configuration-version-prefix", + "tags": ["nx-release"] + }, + "/recipes/module-federation": { + "id": "module-federation", + "name": "Module Federation", + "description": "Advanced guides to utilize Module Federation with Nx.", "mediaImage": "", "file": "", "itemList": [ { - "id": "overview-react", - "name": "Set up Storybook for React Projects", - "description": "This guide explains how to set up Storybook for React projects in your Nx workspace.", + "id": "create-a-host", + "name": "How to create a Module Federation Host Application", + "description": "A guide on how to create a Module Federation Host Application in your Nx workspace", "mediaImage": "", - "file": "shared/recipes/storybook/plugin-react", + "file": "shared/recipes/module-federation/creating-a-host", "itemList": [], "isExternal": false, - "path": "/recipes/storybook/overview-react", - "tags": ["storybook"] + "path": "/recipes/module-federation/create-a-host", + "tags": [] }, { - "id": "overview-angular", - "name": "Set up Storybook for Angular Projects", - "description": "This guide explains how to set up Storybook for Angular projects in your Nx workspace.", + "id": "create-a-remote", + "name": "How to create a Module Federation Remote Application", + "description": "A guide on how to create a Module Federation Remote Application in your Nx workspace", "mediaImage": "", - "file": "shared/recipes/storybook/plugin-angular", + "file": "shared/recipes/module-federation/creating-a-remote", "itemList": [], "isExternal": false, - "path": "/recipes/storybook/overview-angular", - "tags": ["storybook"] + "path": "/recipes/module-federation/create-a-remote", + "tags": [] }, { - "id": "overview-vue", - "name": "Set up Storybook for Vue Projects", - "description": "This guide explains how to set up Storybook for Vue projects in your Nx workspace.", + "id": "federate-a-module", + "name": "How to Federate a Module", + "description": "A guide on how to federate a module in your Nx workspace", "mediaImage": "", - "file": "shared/recipes/storybook/plugin-vue", + "file": "shared/recipes/module-federation/federate-a-module", "itemList": [], "isExternal": false, - "path": "/recipes/storybook/overview-vue", - "tags": ["storybook"] - }, - { - "id": "configuring-storybook", - "name": "Configuring Storybook on Nx", - "description": "This guide explains how Storybook is configured on your Nx workspace.", - "mediaImage": "", - "file": "shared/recipes/storybook/configuring-storybook", - "itemList": [], - "isExternal": false, - "path": "/recipes/storybook/configuring-storybook", - "tags": ["storybook"] - }, - { - "id": "one-storybook-for-all", - "name": "One main Storybook instance for all projects", - "description": "This guide explains how to consolidate all your Storybook stories from different projects into one unified Storybook instance. Ideal for Nx workspaces leveraging a single framework.", - "mediaImage": "", - "file": "shared/recipes/storybook/one-storybook-for-all", - "itemList": [], - "isExternal": false, - "path": "/recipes/storybook/one-storybook-for-all", - "tags": ["storybook"] - }, - { - "id": "one-storybook-per-scope", - "name": "One Storybook instance per scope", - "description": "This guide explains how to set up individual Storybook instances for each scope within an Nx workspace. It provides a structured approach, emphasizing folder organization and thematic scope separation.", - "mediaImage": "", - "file": "shared/recipes/storybook/one-storybook-per-scope", - "itemList": [], - "isExternal": false, - "path": "/recipes/storybook/one-storybook-per-scope", - "tags": ["storybook"] - }, - { - "id": "one-storybook-with-composition", - "name": "One main Storybook instance using Storybook Composition", - "description": "This guide explains how to publish a unified Storybook instance from multiple frameworks within an Nx workspace using Storybook Composition.", - "mediaImage": "", - "file": "shared/recipes/storybook/one-storybook-with-composition", - "itemList": [], - "isExternal": false, - "path": "/recipes/storybook/one-storybook-with-composition", - "tags": ["storybook"] - }, - { - "id": "custom-builder-configs", - "name": "How to configure Webpack and Vite for Storybook", - "description": "This guide explains how to customize the webpack configuration and your vite configuration for Storybook.", - "mediaImage": "", - "file": "shared/recipes/storybook/custom-builder-configs", - "itemList": [], - "isExternal": false, - "path": "/recipes/storybook/custom-builder-configs", - "tags": ["storybook"] - }, + "path": "/recipes/module-federation/federate-a-module", + "tags": [] + } + ], + "isExternal": false, + "path": "/recipes/module-federation", + "tags": [] + }, + "/recipes/module-federation/create-a-host": { + "id": "create-a-host", + "name": "How to create a Module Federation Host Application", + "description": "A guide on how to create a Module Federation Host Application in your Nx workspace", + "mediaImage": "", + "file": "shared/recipes/module-federation/creating-a-host", + "itemList": [], + "isExternal": false, + "path": "/recipes/module-federation/create-a-host", + "tags": [] + }, + "/recipes/module-federation/create-a-remote": { + "id": "create-a-remote", + "name": "How to create a Module Federation Remote Application", + "description": "A guide on how to create a Module Federation Remote Application in your Nx workspace", + "mediaImage": "", + "file": "shared/recipes/module-federation/creating-a-remote", + "itemList": [], + "isExternal": false, + "path": "/recipes/module-federation/create-a-remote", + "tags": [] + }, + "/recipes/module-federation/federate-a-module": { + "id": "federate-a-module", + "name": "How to Federate a Module", + "description": "A guide on how to federate a module in your Nx workspace", + "mediaImage": "", + "file": "shared/recipes/module-federation/federate-a-module", + "itemList": [], + "isExternal": false, + "path": "/recipes/module-federation/federate-a-module", + "tags": [] + }, + "/recipes/nx-console": { + "id": "nx-console", + "name": "Nx Console", + "description": "Checkout all the recipes related to Nx Console.", + "mediaImage": "", + "file": "", + "itemList": [ { - "id": "storybook-interaction-tests", - "name": "Setting up Storybook Interaction Tests with Nx", - "description": "This guide explains how you can set up Storybook interaction tests on your Nx workspace.", + "id": "console-telemetry", + "name": "Telemetry", + "description": "", "mediaImage": "", - "file": "shared/recipes/storybook/interaction-tests", + "file": "shared/recipes/console-telemetry", "itemList": [], "isExternal": false, - "path": "/recipes/storybook/storybook-interaction-tests", - "tags": ["storybook"] + "path": "/recipes/nx-console/console-telemetry", + "tags": ["editor-setup"] }, { - "id": "upgrading-storybook", - "name": "Upgrading Storybook using the Storybook CLI", - "description": "This guide explains how you can upgrade Storybook using the Storybook CLI upgrade and automigrate commands.", + "id": "console-project-details", + "name": "Project Details View", + "description": "", "mediaImage": "", - "file": "shared/recipes/storybook/upgrading-storybook", + "file": "shared/recipes/console-project-details", "itemList": [], "isExternal": false, - "path": "/recipes/storybook/upgrading-storybook", - "tags": ["storybook"] + "path": "/recipes/nx-console/console-project-details", + "tags": ["editor-setup"] }, { - "id": "storybook-composition-setup", - "name": "Setting up Storybook Composition with Nx", - "description": "This guide explains how you can set up Storybook composition on your Nx workspace.", + "id": "console-generate-command", + "name": "Generate Command", + "description": "", "mediaImage": "", - "file": "shared/recipes/storybook/storybook-composition-setup", + "file": "shared/recipes/console-generate-command", "itemList": [], "isExternal": false, - "path": "/recipes/storybook/storybook-composition-setup", - "tags": ["storybook"] + "path": "/recipes/nx-console/console-generate-command", + "tags": ["editor-setup"] }, { - "id": "angular-storybook-compodoc", - "name": "Angular: Set up Compodoc for Storybook on Nx", - "description": "This guide explains how to set up Compodoc for Storybook on Angular projects in a Nx workspace.", + "id": "console-run-command", + "name": "Run Command", + "description": "", "mediaImage": "", - "file": "shared/recipes/storybook/angular-storybook-compodoc", + "file": "shared/recipes/console-run-command", "itemList": [], "isExternal": false, - "path": "/recipes/storybook/angular-storybook-compodoc", - "tags": ["storybook"] + "path": "/recipes/nx-console/console-run-command", + "tags": ["editor-setup"] }, { - "id": "angular-configuring-styles", - "name": "Angular: Configuring styles and preprocessor options", - "description": "This document explains how to configure styles and preprocessor options in Angular projects with a Storybook configuration.", + "id": "console-troubleshooting", + "name": "Troubleshooting", + "description": "", "mediaImage": "", - "file": "shared/recipes/storybook/angular-configuring-styles", + "file": "shared/recipes/console-troubleshooting", "itemList": [], "isExternal": false, - "path": "/recipes/storybook/angular-configuring-styles", - "tags": ["storybook"] + "path": "/recipes/nx-console/console-troubleshooting", + "tags": ["editor-setup"] } ], "isExternal": false, - "path": "/recipes/storybook", + "path": "/recipes/nx-console", "tags": [] }, - "/recipes/storybook/overview-react": { - "id": "overview-react", - "name": "Set up Storybook for React Projects", - "description": "This guide explains how to set up Storybook for React projects in your Nx workspace.", - "mediaImage": "", - "file": "shared/recipes/storybook/plugin-react", - "itemList": [], - "isExternal": false, - "path": "/recipes/storybook/overview-react", - "tags": ["storybook"] - }, - "/recipes/storybook/overview-angular": { - "id": "overview-angular", - "name": "Set up Storybook for Angular Projects", - "description": "This guide explains how to set up Storybook for Angular projects in your Nx workspace.", + "/recipes/nx-console/console-telemetry": { + "id": "console-telemetry", + "name": "Telemetry", + "description": "", "mediaImage": "", - "file": "shared/recipes/storybook/plugin-angular", + "file": "shared/recipes/console-telemetry", "itemList": [], "isExternal": false, - "path": "/recipes/storybook/overview-angular", - "tags": ["storybook"] + "path": "/recipes/nx-console/console-telemetry", + "tags": ["editor-setup"] }, - "/recipes/storybook/overview-vue": { - "id": "overview-vue", - "name": "Set up Storybook for Vue Projects", - "description": "This guide explains how to set up Storybook for Vue projects in your Nx workspace.", + "/recipes/nx-console/console-project-details": { + "id": "console-project-details", + "name": "Project Details View", + "description": "", "mediaImage": "", - "file": "shared/recipes/storybook/plugin-vue", + "file": "shared/recipes/console-project-details", "itemList": [], "isExternal": false, - "path": "/recipes/storybook/overview-vue", - "tags": ["storybook"] + "path": "/recipes/nx-console/console-project-details", + "tags": ["editor-setup"] }, - "/recipes/storybook/configuring-storybook": { - "id": "configuring-storybook", - "name": "Configuring Storybook on Nx", - "description": "This guide explains how Storybook is configured on your Nx workspace.", + "/recipes/nx-console/console-generate-command": { + "id": "console-generate-command", + "name": "Generate Command", + "description": "", "mediaImage": "", - "file": "shared/recipes/storybook/configuring-storybook", + "file": "shared/recipes/console-generate-command", "itemList": [], "isExternal": false, - "path": "/recipes/storybook/configuring-storybook", - "tags": ["storybook"] + "path": "/recipes/nx-console/console-generate-command", + "tags": ["editor-setup"] }, - "/recipes/storybook/one-storybook-for-all": { - "id": "one-storybook-for-all", - "name": "One main Storybook instance for all projects", - "description": "This guide explains how to consolidate all your Storybook stories from different projects into one unified Storybook instance. Ideal for Nx workspaces leveraging a single framework.", + "/recipes/nx-console/console-run-command": { + "id": "console-run-command", + "name": "Run Command", + "description": "", "mediaImage": "", - "file": "shared/recipes/storybook/one-storybook-for-all", + "file": "shared/recipes/console-run-command", "itemList": [], "isExternal": false, - "path": "/recipes/storybook/one-storybook-for-all", - "tags": ["storybook"] + "path": "/recipes/nx-console/console-run-command", + "tags": ["editor-setup"] }, - "/recipes/storybook/one-storybook-per-scope": { - "id": "one-storybook-per-scope", - "name": "One Storybook instance per scope", - "description": "This guide explains how to set up individual Storybook instances for each scope within an Nx workspace. It provides a structured approach, emphasizing folder organization and thematic scope separation.", + "/recipes/nx-console/console-troubleshooting": { + "id": "console-troubleshooting", + "name": "Troubleshoot Nx Console Issues", + "description": "", "mediaImage": "", - "file": "shared/recipes/storybook/one-storybook-per-scope", + "file": "shared/recipes/console-troubleshooting", "itemList": [], "isExternal": false, - "path": "/recipes/storybook/one-storybook-per-scope", - "tags": ["storybook"] + "path": "/recipes/nx-console/console-troubleshooting", + "tags": [] }, - "/recipes/storybook/one-storybook-with-composition": { - "id": "one-storybook-with-composition", - "name": "One main Storybook instance using Storybook Composition", - "description": "This guide explains how to publish a unified Storybook instance from multiple frameworks within an Nx workspace using Storybook Composition.", - "mediaImage": "", - "file": "shared/recipes/storybook/one-storybook-with-composition", - "itemList": [], - "isExternal": false, - "path": "/recipes/storybook/one-storybook-with-composition", - "tags": ["storybook"] - }, - "/recipes/storybook/custom-builder-configs": { - "id": "custom-builder-configs", - "name": "How to configure Webpack and Vite for Storybook", - "description": "This guide explains how to customize the webpack configuration and your vite configuration for Storybook.", - "mediaImage": "", - "file": "shared/recipes/storybook/custom-builder-configs", - "itemList": [], - "isExternal": false, - "path": "/recipes/storybook/custom-builder-configs", - "tags": ["storybook"] - }, - "/recipes/storybook/storybook-interaction-tests": { - "id": "storybook-interaction-tests", - "name": "Setting up Storybook Interaction Tests with Nx", - "description": "This guide explains how you can set up Storybook interaction tests on your Nx workspace.", - "mediaImage": "", - "file": "shared/recipes/storybook/interaction-tests", - "itemList": [], - "isExternal": false, - "path": "/recipes/storybook/storybook-interaction-tests", - "tags": ["storybook"] - }, - "/recipes/storybook/upgrading-storybook": { - "id": "upgrading-storybook", - "name": "Upgrading Storybook using the Storybook CLI", - "description": "This guide explains how you can upgrade Storybook using the Storybook CLI upgrade and automigrate commands.", - "mediaImage": "", - "file": "shared/recipes/storybook/upgrading-storybook", - "itemList": [], - "isExternal": false, - "path": "/recipes/storybook/upgrading-storybook", - "tags": ["storybook"] - }, - "/recipes/storybook/storybook-composition-setup": { - "id": "storybook-composition-setup", - "name": "Setting up Storybook Composition with Nx", - "description": "This guide explains how you can set up Storybook composition on your Nx workspace.", - "mediaImage": "", - "file": "shared/recipes/storybook/storybook-composition-setup", - "itemList": [], - "isExternal": false, - "path": "/recipes/storybook/storybook-composition-setup", - "tags": ["storybook"] - }, - "/recipes/storybook/angular-storybook-compodoc": { - "id": "angular-storybook-compodoc", - "name": "Angular: Set up Compodoc for Storybook on Nx", - "description": "This guide explains how to set up Compodoc for Storybook on Angular projects in a Nx workspace.", - "mediaImage": "", - "file": "shared/recipes/storybook/angular-storybook-compodoc", - "itemList": [], - "isExternal": false, - "path": "/recipes/storybook/angular-storybook-compodoc", - "tags": ["storybook"] - }, - "/recipes/storybook/angular-configuring-styles": { - "id": "angular-configuring-styles", - "name": "Angular: Configuring styles and preprocessor options", - "description": "This document explains how to configure styles and preprocessor options in Angular projects with a Storybook configuration.", - "mediaImage": "", - "file": "shared/recipes/storybook/angular-configuring-styles", - "itemList": [], - "isExternal": false, - "path": "/recipes/storybook/angular-configuring-styles", - "tags": ["storybook"] - }, - "/recipes/cypress": { - "id": "cypress", - "name": "Cypress", - "description": "Cypress related recipes", + "/recipes/react": { + "id": "react", + "name": "React", + "description": "Advanced guides to adopt Nx in React.", "mediaImage": "", "file": "", "itemList": [ { - "id": "cypress-component-testing", - "name": "Component Testing", - "description": "Component Testing", + "id": "react-native", + "name": "React Native with Nx", + "description": "", "mediaImage": "", - "file": "shared/packages/cypress/cypress-component-testing", + "file": "shared/guides/react-native", "itemList": [], "isExternal": false, - "path": "/recipes/cypress/cypress-component-testing", + "path": "/recipes/react/react-native", "tags": [] }, { - "id": "cypress-setup-node-events", - "name": "Using setupNodeEvents with Cypress preset", - "description": "A guide on using the setupNodeEvents function with @nx/cypress/plugins/cypress-preset", + "id": "remix", + "name": "Remix with Nx", + "description": "", "mediaImage": "", - "file": "shared/packages/cypress/cypress-setup-node-events", + "file": "shared/guides/remix", "itemList": [], "isExternal": false, - "path": "/recipes/cypress/cypress-setup-node-events", + "path": "/recipes/react/remix", "tags": [] }, { - "id": "cypress-v11-migration", - "name": "Cypress v11 Migration Guide", - "description": "Cypress v11 Migration Guide", + "id": "use-environment-variables-in-react", + "name": "Use Environment Variables in React", + "description": "", "mediaImage": "", - "file": "shared/packages/cypress/cypress-v11-migration", + "file": "shared/guides/use-environment-variables-in-react", "itemList": [], "isExternal": false, - "path": "/recipes/cypress/cypress-v11-migration", + "path": "/recipes/react/use-environment-variables-in-react", + "tags": ["environment-variables"] + }, + { + "id": "using-tailwind-css-in-react", + "name": "Using Tailwind CSS in React", + "description": "", + "mediaImage": "", + "file": "shared/guides/using-tailwind-css-in-react", + "itemList": [], + "isExternal": false, + "path": "/recipes/react/using-tailwind-css-in-react", + "tags": [] + }, + { + "id": "adding-assets-react", + "name": "Adding Images, Fonts, and Files", + "description": "", + "mediaImage": "", + "file": "shared/guides/adding-assets", + "itemList": [], + "isExternal": false, + "path": "/recipes/react/adding-assets-react", + "tags": [] + }, + { + "id": "module-federation-with-ssr", + "name": "Setup Module Federation with SSR for React", + "description": "", + "mediaImage": "", + "file": "shared/recipes/module-federation-with-ssr", + "itemList": [], + "isExternal": false, + "path": "/recipes/react/module-federation-with-ssr", + "tags": ["module-federation", "react"] + }, + { + "id": "deploy-nextjs-to-vercel", + "name": "Deploying Next.js applications to Vercel", + "description": "", + "mediaImage": "", + "file": "shared/recipes/deployment/deploy-nextjs-to-vercel", + "itemList": [], + "isExternal": false, + "path": "/recipes/react/deploy-nextjs-to-vercel", + "tags": [] + }, + { + "id": "react-compiler", + "name": "React Compiler with Nx", + "description": "", + "mediaImage": "", + "file": "shared/guides/react-compiler", + "itemList": [], + "isExternal": false, + "path": "/recipes/react/react-compiler", "tags": [] } ], "isExternal": false, - "path": "/recipes/cypress", + "path": "/recipes/react", "tags": [] }, - "/recipes/cypress/cypress-component-testing": { - "id": "cypress-component-testing", - "name": "Component Testing", - "description": "Component Testing", + "/recipes/react/react-native": { + "id": "react-native", + "name": "React Native with Nx", + "description": "", "mediaImage": "", - "file": "shared/packages/cypress/cypress-component-testing", + "file": "shared/guides/react-native", "itemList": [], "isExternal": false, - "path": "/recipes/cypress/cypress-component-testing", + "path": "/recipes/react/react-native", "tags": [] }, - "/recipes/cypress/cypress-setup-node-events": { - "id": "cypress-setup-node-events", - "name": "Using setupNodeEvents with Cypress preset", - "description": "A guide on using the setupNodeEvents function with @nx/cypress/plugins/cypress-preset", + "/recipes/react/remix": { + "id": "remix", + "name": "Remix with Nx", + "description": "", "mediaImage": "", - "file": "shared/packages/cypress/cypress-setup-node-events", + "file": "shared/guides/remix", "itemList": [], "isExternal": false, - "path": "/recipes/cypress/cypress-setup-node-events", + "path": "/recipes/react/remix", "tags": [] }, - "/recipes/cypress/cypress-v11-migration": { - "id": "cypress-v11-migration", - "name": "Cypress v11 Migration Guide", - "description": "Cypress v11 Migration Guide", + "/recipes/react/use-environment-variables-in-react": { + "id": "use-environment-variables-in-react", + "name": "Use Environment Variables in React", + "description": "", "mediaImage": "", - "file": "shared/packages/cypress/cypress-v11-migration", + "file": "shared/guides/use-environment-variables-in-react", "itemList": [], "isExternal": false, - "path": "/recipes/cypress/cypress-v11-migration", - "tags": [] + "path": "/recipes/react/use-environment-variables-in-react", + "tags": ["environment-variables"] }, - "/recipes/next": { - "id": "next", - "name": "Next", - "description": "Next related recipes", + "/recipes/react/using-tailwind-css-in-react": { + "id": "using-tailwind-css-in-react", + "name": "Using Tailwind CSS in React", + "description": "", "mediaImage": "", - "file": "", - "itemList": [ - { - "id": "next-config-setup", - "name": "How to configure Next.js plugins", - "description": "How to configure Next.js plugins", - "mediaImage": "", - "file": "shared/packages/next/next-config-setup", - "itemList": [], - "isExternal": false, - "path": "/recipes/next/next-config-setup", - "tags": [] - } - ], + "file": "shared/guides/using-tailwind-css-in-react", + "itemList": [], "isExternal": false, - "path": "/recipes/next", + "path": "/recipes/react/using-tailwind-css-in-react", "tags": [] }, - "/recipes/next/next-config-setup": { - "id": "next-config-setup", - "name": "How to configure Next.js plugins", - "description": "How to configure Next.js plugins", + "/recipes/react/adding-assets-react": { + "id": "adding-assets-react", + "name": "Adding Images, Fonts, and Files", + "description": "", "mediaImage": "", - "file": "shared/packages/next/next-config-setup", + "file": "shared/guides/adding-assets", "itemList": [], "isExternal": false, - "path": "/recipes/next/next-config-setup", + "path": "/recipes/react/adding-assets-react", "tags": [] }, - "/recipes/nuxt": { - "id": "nuxt", - "name": "Nuxt", - "description": "Nuxt related recipes", + "/recipes/react/module-federation-with-ssr": { + "id": "module-federation-with-ssr", + "name": "Setup Module Federation with SSR for React", + "description": "", "mediaImage": "", - "file": "", - "itemList": [ - { - "id": "deploy-nuxt-to-vercel", - "name": "Deploying Nuxt applications to Vercel", - "description": "A detailed guide on how to deploy Nuxt applications from Nx workspaces to Vercel.", - "mediaImage": "", - "file": "shared/recipes/deployment/deploy-nuxt-to-vercel", - "itemList": [], - "isExternal": false, - "path": "/recipes/nuxt/deploy-nuxt-to-vercel", - "tags": [] - } - ], - "isExternal": false, - "path": "/recipes/nuxt", - "tags": [] - }, - "/recipes/nuxt/deploy-nuxt-to-vercel": { - "id": "deploy-nuxt-to-vercel", - "name": "Deploying Nuxt applications to Vercel", - "description": "A detailed guide on how to deploy Nuxt applications from Nx workspaces to Vercel.", - "mediaImage": "", - "file": "shared/recipes/deployment/deploy-nuxt-to-vercel", + "file": "shared/recipes/module-federation-with-ssr", "itemList": [], "isExternal": false, - "path": "/recipes/nuxt/deploy-nuxt-to-vercel", - "tags": [] + "path": "/recipes/react/module-federation-with-ssr", + "tags": ["module-federation", "react"] }, - "/recipes/vite": { - "id": "vite", - "name": "Vite", - "description": "Vite related recipes", + "/recipes/react/deploy-nextjs-to-vercel": { + "id": "deploy-nextjs-to-vercel", + "name": "Deploying Next.js applications to Vercel", + "description": "", "mediaImage": "", - "file": "", - "itemList": [ - { - "id": "configure-vite", - "name": "Configure Vite on your Nx workspace", - "description": "Configure Vite on your Nx workspace", - "mediaImage": "", - "file": "shared/packages/vite/configure-vite", - "itemList": [], - "isExternal": false, - "path": "/recipes/vite/configure-vite", - "tags": [] - } - ], + "file": "shared/recipes/deployment/deploy-nextjs-to-vercel", + "itemList": [], "isExternal": false, - "path": "/recipes/vite", + "path": "/recipes/react/deploy-nextjs-to-vercel", "tags": [] }, - "/recipes/vite/configure-vite": { - "id": "configure-vite", - "name": "Configure Vite on your Nx workspace", - "description": "Configure Vite on your Nx workspace", + "/recipes/react/react-compiler": { + "id": "react-compiler", + "name": "React Compiler with Nx", + "description": "", "mediaImage": "", - "file": "shared/packages/vite/configure-vite", + "file": "shared/guides/react-compiler", "itemList": [], "isExternal": false, - "path": "/recipes/vite/configure-vite", + "path": "/recipes/react/react-compiler", "tags": [] }, - "/recipes/webpack": { - "id": "webpack", - "name": "Webpack", - "description": "Webpack related recipes", + "/recipes/angular": { + "id": "angular", + "name": "Angular", + "description": "Advanced guides to adopt Nx in Angular.", "mediaImage": "", "file": "", "itemList": [ { - "id": "webpack-config-setup", - "name": "How to configure Webpack in your Nx workspace", - "description": "A guide on how to configure webpack on your Nx workspace, and instructions on how to customize your webpack configuration", + "id": "migration", + "name": "Migration", + "description": "", "mediaImage": "", - "file": "shared/packages/webpack/webpack-config-setup", + "file": "", + "itemList": [ + { + "id": "angular", + "name": "Migrating from Angular CLI", + "description": "", + "mediaImage": "", + "file": "shared/migration/migration-angular", + "itemList": [], + "isExternal": false, + "path": "/recipes/angular/migration/angular", + "tags": [] + }, + { + "id": "angular-multiple", + "name": "Migrating From Multiple Angular CLI Repos", + "description": "", + "mediaImage": "", + "file": "shared/migration/angular-multiple", + "itemList": [], + "isExternal": false, + "path": "/recipes/angular/migration/angular-multiple", + "tags": [] + } + ], + "isExternal": false, + "path": "/recipes/angular/migration", + "tags": [] + }, + { + "id": "use-environment-variables-in-angular", + "name": "Use Environment Variables in Angular", + "description": "", + "mediaImage": "", + "file": "shared/guides/use-environment-variables-in-angular", "itemList": [], "isExternal": false, - "path": "/recipes/webpack/webpack-config-setup", + "path": "/recipes/angular/use-environment-variables-in-angular", + "tags": ["environment-variables"] + }, + { + "id": "using-tailwind-css-with-angular-projects", + "name": "Using Tailwind CSS with Angular projects", + "description": "", + "mediaImage": "", + "file": "shared/guides/using-tailwind-css-with-angular-projects", + "itemList": [], + "isExternal": false, + "path": "/recipes/angular/using-tailwind-css-with-angular-projects", "tags": [] }, { - "id": "webpack-plugins", - "name": "Webpack plugins", - "description": "Webpack plugins", + "id": "module-federation-with-ssr", + "name": "Setup Module Federation with SSR for Angular", + "description": "", "mediaImage": "", - "file": "shared/packages/webpack/webpack-plugins", + "file": "shared/recipes/module-federation-with-ssr", "itemList": [], "isExternal": false, - "path": "/recipes/webpack/webpack-plugins", + "path": "/recipes/angular/module-federation-with-ssr", + "tags": ["module-federation", "angular"] + }, + { + "id": "dynamic-module-federation-with-angular", + "name": "Advanced Micro Frontends with Angular using Dynamic Federation", + "description": "", + "mediaImage": "", + "file": "shared/recipes/module-federation/dynamic-mfe-angular", + "itemList": [], + "isExternal": false, + "path": "/recipes/angular/dynamic-module-federation-with-angular", + "tags": ["module-federation", "angular"] + }, + { + "id": "setup-incremental-builds-angular", + "name": "Setup incremental builds for Angular applications", + "description": "", + "mediaImage": "", + "file": "shared/guides/setup-incremental-builds-angular", + "itemList": [], + "isExternal": false, + "path": "/recipes/angular/setup-incremental-builds-angular", "tags": [] } ], "isExternal": false, - "path": "/recipes/webpack", - "tags": [] - }, - "/recipes/webpack/webpack-config-setup": { - "id": "webpack-config-setup", - "name": "How to configure Webpack in your Nx workspace", - "description": "A guide on how to configure webpack on your Nx workspace, and instructions on how to customize your webpack configuration", - "mediaImage": "", - "file": "shared/packages/webpack/webpack-config-setup", - "itemList": [], - "isExternal": false, - "path": "/recipes/webpack/webpack-config-setup", - "tags": [] - }, - "/recipes/webpack/webpack-plugins": { - "id": "webpack-plugins", - "name": "Webpack plugins", - "description": "Webpack plugins", - "mediaImage": "", - "file": "shared/packages/webpack/webpack-plugins", - "itemList": [], - "isExternal": false, - "path": "/recipes/webpack/webpack-plugins", + "path": "/recipes/angular", "tags": [] }, - "/recipes/module-federation": { - "id": "module-federation", - "name": "Module Federation", - "description": "Advanced guides to utilize Module Federation with Nx.", + "/recipes/angular/migration": { + "id": "migration", + "name": "Migration", + "description": "", "mediaImage": "", "file": "", "itemList": [ { - "id": "create-a-host", - "name": "How to create a Module Federation Host Application", - "description": "A guide on how to create a Module Federation Host Application in your Nx workspace", - "mediaImage": "", - "file": "shared/recipes/module-federation/creating-a-host", - "itemList": [], - "isExternal": false, - "path": "/recipes/module-federation/create-a-host", - "tags": [] - }, - { - "id": "create-a-remote", - "name": "How to create a Module Federation Remote Application", - "description": "A guide on how to create a Module Federation Remote Application in your Nx workspace", + "id": "angular", + "name": "Migrating from Angular CLI", + "description": "", "mediaImage": "", - "file": "shared/recipes/module-federation/creating-a-remote", + "file": "shared/migration/migration-angular", "itemList": [], "isExternal": false, - "path": "/recipes/module-federation/create-a-remote", + "path": "/recipes/angular/migration/angular", "tags": [] }, { - "id": "federate-a-module", - "name": "How to Federate a Module", - "description": "A guide on how to federate a module in your Nx workspace", + "id": "angular-multiple", + "name": "Migrating From Multiple Angular CLI Repos", + "description": "", "mediaImage": "", - "file": "shared/recipes/module-federation/federate-a-module", + "file": "shared/migration/angular-multiple", "itemList": [], "isExternal": false, - "path": "/recipes/module-federation/federate-a-module", + "path": "/recipes/angular/migration/angular-multiple", "tags": [] } ], "isExternal": false, - "path": "/recipes/module-federation", + "path": "/recipes/angular/migration", "tags": [] }, - "/recipes/module-federation/create-a-host": { - "id": "create-a-host", - "name": "How to create a Module Federation Host Application", - "description": "A guide on how to create a Module Federation Host Application in your Nx workspace", + "/recipes/angular/migration/angular": { + "id": "angular", + "name": "Migrating from Angular CLI", + "description": "", "mediaImage": "", - "file": "shared/recipes/module-federation/creating-a-host", + "file": "shared/migration/migration-angular", "itemList": [], "isExternal": false, - "path": "/recipes/module-federation/create-a-host", + "path": "/recipes/angular/migration/angular", "tags": [] }, - "/recipes/module-federation/create-a-remote": { - "id": "create-a-remote", - "name": "How to create a Module Federation Remote Application", - "description": "A guide on how to create a Module Federation Remote Application in your Nx workspace", + "/recipes/angular/migration/angular-multiple": { + "id": "angular-multiple", + "name": "Migrating From Multiple Angular CLI Repos", + "description": "", "mediaImage": "", - "file": "shared/recipes/module-federation/creating-a-remote", + "file": "shared/migration/angular-multiple", "itemList": [], "isExternal": false, - "path": "/recipes/module-federation/create-a-remote", + "path": "/recipes/angular/migration/angular-multiple", "tags": [] }, - "/recipes/module-federation/federate-a-module": { - "id": "federate-a-module", - "name": "How to Federate a Module", - "description": "A guide on how to federate a module in your Nx workspace", + "/recipes/angular/use-environment-variables-in-angular": { + "id": "use-environment-variables-in-angular", + "name": "Use Environment Variables in Angular", + "description": "", "mediaImage": "", - "file": "shared/recipes/module-federation/federate-a-module", + "file": "shared/guides/use-environment-variables-in-angular", "itemList": [], "isExternal": false, - "path": "/recipes/module-federation/federate-a-module", - "tags": [] + "path": "/recipes/angular/use-environment-variables-in-angular", + "tags": ["environment-variables"] }, - "/recipes/enforce-module-boundaries": { - "id": "enforce-module-boundaries", - "name": "Enforce Module Boundaries", - "description": "Configuring the enforce module boundaries rule", + "/recipes/angular/using-tailwind-css-with-angular-projects": { + "id": "using-tailwind-css-with-angular-projects", + "name": "Using Tailwind CSS with Angular projects", + "description": "", + "mediaImage": "", + "file": "shared/guides/using-tailwind-css-with-angular-projects", + "itemList": [], + "isExternal": false, + "path": "/recipes/angular/using-tailwind-css-with-angular-projects", + "tags": [] + }, + "/recipes/angular/module-federation-with-ssr": { + "id": "module-federation-with-ssr", + "name": "Setup Module Federation with SSR for Angular", + "description": "", + "mediaImage": "", + "file": "shared/recipes/module-federation-with-ssr", + "itemList": [], + "isExternal": false, + "path": "/recipes/angular/module-federation-with-ssr", + "tags": ["module-federation", "angular"] + }, + "/recipes/angular/dynamic-module-federation-with-angular": { + "id": "dynamic-module-federation-with-angular", + "name": "Advanced Micro Frontends with Angular using Dynamic Federation", + "description": "", + "mediaImage": "", + "file": "shared/recipes/module-federation/dynamic-mfe-angular", + "itemList": [], + "isExternal": false, + "path": "/recipes/angular/dynamic-module-federation-with-angular", + "tags": ["module-federation", "angular"] + }, + "/recipes/angular/setup-incremental-builds-angular": { + "id": "setup-incremental-builds-angular", + "name": "Setup incremental builds for Angular applications", + "description": "", + "mediaImage": "", + "file": "shared/guides/setup-incremental-builds-angular", + "itemList": [], + "isExternal": false, + "path": "/recipes/angular/setup-incremental-builds-angular", + "tags": [] + }, + "/recipes/node": { + "id": "node", + "name": "Node", + "description": "Set of Node related recipes.", "mediaImage": "", "file": "", "itemList": [ { - "id": "ban-dependencies-with-tags", - "name": "Ban Dependencies with Certain Tags", + "id": "node-server-fly-io", + "name": "Deploying a Node App to Fly.io", "description": "", "mediaImage": "", - "file": "shared/recipes/ban-dependencies-with-tags", + "file": "shared/recipes/deployment/node-server-fly-io", "itemList": [], "isExternal": false, - "path": "/recipes/enforce-module-boundaries/ban-dependencies-with-tags", - "tags": ["enforce-module-boundaries"] + "path": "/recipes/node/node-server-fly-io", + "tags": ["deployment", "node"] }, { - "id": "tag-multiple-dimensions", - "name": "Tag in Multiple Dimensions", + "id": "node-serverless-functions-netlify", + "name": "Add and Deploy Netlify Edge Functions with Node", "description": "", "mediaImage": "", - "file": "shared/recipes/tag-multiple-dimensions", + "file": "shared/recipes/deployment/node-serverless-functions-netlify", "itemList": [], "isExternal": false, - "path": "/recipes/enforce-module-boundaries/tag-multiple-dimensions", - "tags": ["enforce-module-boundaries"] + "path": "/recipes/node/node-serverless-functions-netlify", + "tags": ["deployment", "node"] }, { - "id": "ban-external-imports", - "name": "Ban External Imports", + "id": "node-aws-lambda", + "name": "Deploying AWS lambda in Node.js (deprecated)", "description": "", "mediaImage": "", - "file": "shared/recipes/ban-external-imports", + "file": "shared/recipes/deployment/node-aws-lambda", "itemList": [], "isExternal": false, - "path": "/recipes/enforce-module-boundaries/ban-external-imports", - "tags": ["enforce-module-boundaries"] + "path": "/recipes/node/node-aws-lambda", + "tags": ["deployment", "node"] }, { - "id": "tags-allow-list", - "name": "Tags Allow List", + "id": "application-proxies", + "name": "Set Up Application Proxies", "description": "", "mediaImage": "", - "file": "shared/recipes/tags-allow-list", + "file": "shared/recipes/node/application-proxies", "itemList": [], "isExternal": false, - "path": "/recipes/enforce-module-boundaries/tags-allow-list", - "tags": ["enforce-module-boundaries"] + "path": "/recipes/node/application-proxies", + "tags": ["node"] + }, + { + "id": "wait-for-tasks", + "name": "Wait for Tasks to Finish", + "description": "", + "mediaImage": "", + "file": "shared/recipes/node/wait-for-tasks", + "itemList": [], + "isExternal": false, + "path": "/recipes/node/wait-for-tasks", + "tags": [] } ], "isExternal": false, - "path": "/recipes/enforce-module-boundaries", + "path": "/recipes/node", "tags": [] }, - "/recipes/enforce-module-boundaries/ban-dependencies-with-tags": { - "id": "ban-dependencies-with-tags", - "name": "Ban Dependencies with Certain Tags", + "/recipes/node/node-server-fly-io": { + "id": "node-server-fly-io", + "name": "Deploying a Node App to Fly.io", "description": "", "mediaImage": "", - "file": "shared/recipes/ban-dependencies-with-tags", + "file": "shared/recipes/deployment/node-server-fly-io", "itemList": [], "isExternal": false, - "path": "/recipes/enforce-module-boundaries/ban-dependencies-with-tags", - "tags": ["enforce-module-boundaries"] + "path": "/recipes/node/node-server-fly-io", + "tags": ["deployment", "node"] }, - "/recipes/enforce-module-boundaries/tag-multiple-dimensions": { - "id": "tag-multiple-dimensions", - "name": "Tag in Multiple Dimensions", + "/recipes/node/node-serverless-functions-netlify": { + "id": "node-serverless-functions-netlify", + "name": "Add and Deploy Netlify Edge Functions with Node", "description": "", "mediaImage": "", - "file": "shared/recipes/tag-multiple-dimensions", + "file": "shared/recipes/deployment/node-serverless-functions-netlify", "itemList": [], "isExternal": false, - "path": "/recipes/enforce-module-boundaries/tag-multiple-dimensions", - "tags": ["enforce-module-boundaries"] + "path": "/recipes/node/node-serverless-functions-netlify", + "tags": ["deployment", "node"] }, - "/recipes/enforce-module-boundaries/ban-external-imports": { - "id": "ban-external-imports", - "name": "Ban External Imports", + "/recipes/node/node-aws-lambda": { + "id": "node-aws-lambda", + "name": "Deploying AWS lambda in Node.js (deprecated)", "description": "", "mediaImage": "", - "file": "shared/recipes/ban-external-imports", + "file": "shared/recipes/deployment/node-aws-lambda", "itemList": [], "isExternal": false, - "path": "/recipes/enforce-module-boundaries/ban-external-imports", - "tags": ["enforce-module-boundaries"] + "path": "/recipes/node/node-aws-lambda", + "tags": ["deployment", "node"] }, - "/recipes/enforce-module-boundaries/tags-allow-list": { - "id": "tags-allow-list", - "name": "Tags Allow List", + "/recipes/node/application-proxies": { + "id": "application-proxies", + "name": "Set Up Application Proxies", "description": "", "mediaImage": "", - "file": "shared/recipes/tags-allow-list", + "file": "shared/recipes/node/application-proxies", "itemList": [], "isExternal": false, - "path": "/recipes/enforce-module-boundaries/tags-allow-list", - "tags": ["enforce-module-boundaries"] + "path": "/recipes/node/application-proxies", + "tags": ["node"] }, - "/recipes/tips-n-tricks": { - "id": "tips-n-tricks", - "name": "Tips and tricks", - "description": "Various tips and tricks for using Nx.", + "/recipes/node/wait-for-tasks": { + "id": "wait-for-tasks", + "name": "Wait for Tasks to Finish", + "description": "", + "mediaImage": "", + "file": "shared/recipes/node/wait-for-tasks", + "itemList": [], + "isExternal": false, + "path": "/recipes/node/wait-for-tasks", + "tags": [] + }, + "/recipes/storybook": { + "id": "storybook", + "name": "Storybook", + "description": "Storybook strategies and setups.", "mediaImage": "", "file": "", "itemList": [ { - "id": "standalone-to-monorepo", - "name": "Convert from a Standalone Repository to a Monorepo", - "description": "", + "id": "overview-react", + "name": "Set up Storybook for React Projects", + "description": "This guide explains how to set up Storybook for React projects in your Nx workspace.", "mediaImage": "", - "file": "shared/recipes/tips-n-tricks/standalone-to-monorepo", + "file": "shared/recipes/storybook/plugin-react", "itemList": [], "isExternal": false, - "path": "/recipes/tips-n-tricks/standalone-to-monorepo", - "tags": [] + "path": "/recipes/storybook/overview-react", + "tags": ["storybook"] }, { - "id": "eslint", - "name": "Configuring ESLint with Typescript", - "description": "", + "id": "overview-angular", + "name": "Set up Storybook for Angular Projects", + "description": "This guide explains how to set up Storybook for Angular projects in your Nx workspace.", "mediaImage": "", - "file": "shared/eslint", + "file": "shared/recipes/storybook/plugin-angular", "itemList": [], "isExternal": false, - "path": "/recipes/tips-n-tricks/eslint", - "tags": [] + "path": "/recipes/storybook/overview-angular", + "tags": ["storybook"] }, { - "id": "enable-tsc-batch-mode", - "name": "Enable Typescript Batch Mode", - "description": "", + "id": "overview-vue", + "name": "Set up Storybook for Vue Projects", + "description": "This guide explains how to set up Storybook for Vue projects in your Nx workspace.", "mediaImage": "", - "file": "shared/recipes/enable-tsc-batch-mode", + "file": "shared/recipes/storybook/plugin-vue", "itemList": [], "isExternal": false, - "path": "/recipes/tips-n-tricks/enable-tsc-batch-mode", - "tags": [] + "path": "/recipes/storybook/overview-vue", + "tags": ["storybook"] }, { - "id": "define-secondary-entrypoints", - "name": "Define Secondary Entrypoints for Typescript Packages", - "description": "", + "id": "configuring-storybook", + "name": "Configuring Storybook on Nx", + "description": "This guide explains how Storybook is configured on your Nx workspace.", "mediaImage": "", - "file": "shared/recipes/tips-n-tricks/define-secondary-entrypoints", + "file": "shared/recipes/storybook/configuring-storybook", "itemList": [], "isExternal": false, - "path": "/recipes/tips-n-tricks/define-secondary-entrypoints", - "tags": [] + "path": "/recipes/storybook/configuring-storybook", + "tags": ["storybook"] }, { - "id": "compile-multiple-formats", - "name": "Compile Typescript Packages to Multiple Formats", - "description": "", + "id": "one-storybook-for-all", + "name": "One main Storybook instance for all projects", + "description": "This guide explains how to consolidate all your Storybook stories from different projects into one unified Storybook instance. Ideal for Nx workspaces leveraging a single framework.", "mediaImage": "", - "file": "shared/recipes/tips-n-tricks/compile-multiple-formats", + "file": "shared/recipes/storybook/one-storybook-for-all", "itemList": [], "isExternal": false, - "path": "/recipes/tips-n-tricks/compile-multiple-formats", - "tags": [] + "path": "/recipes/storybook/one-storybook-for-all", + "tags": ["storybook"] }, { - "id": "keep-nx-versions-in-sync", - "name": "Keep Nx Versions in Sync", - "description": "", + "id": "one-storybook-per-scope", + "name": "One Storybook instance per scope", + "description": "This guide explains how to set up individual Storybook instances for each scope within an Nx workspace. It provides a structured approach, emphasizing folder organization and thematic scope separation.", "mediaImage": "", - "file": "shared/recipes/tips-n-tricks/keep-nx-versions-in-sync", + "file": "shared/recipes/storybook/one-storybook-per-scope", "itemList": [], "isExternal": false, - "path": "/recipes/tips-n-tricks/keep-nx-versions-in-sync", - "tags": ["automate-updating-dependencies"] + "path": "/recipes/storybook/one-storybook-per-scope", + "tags": ["storybook"] }, { - "id": "define-environment-variables", - "name": "Define Environment Variables", - "description": "", + "id": "one-storybook-with-composition", + "name": "One main Storybook instance using Storybook Composition", + "description": "This guide explains how to publish a unified Storybook instance from multiple frameworks within an Nx workspace using Storybook Composition.", "mediaImage": "", - "file": "shared/guides/define-environment-variables", + "file": "shared/recipes/storybook/one-storybook-with-composition", "itemList": [], "isExternal": false, - "path": "/recipes/tips-n-tricks/define-environment-variables", - "tags": ["environment-variables"] + "path": "/recipes/storybook/one-storybook-with-composition", + "tags": ["storybook"] }, { - "id": "browser-support", - "name": "Configuring Browser Support", - "description": "", + "id": "custom-builder-configs", + "name": "How to configure Webpack and Vite for Storybook", + "description": "This guide explains how to customize the webpack configuration and your vite configuration for Storybook.", "mediaImage": "", - "file": "shared/guides/browser-support", + "file": "shared/recipes/storybook/custom-builder-configs", "itemList": [], "isExternal": false, - "path": "/recipes/tips-n-tricks/browser-support", - "tags": [] + "path": "/recipes/storybook/custom-builder-configs", + "tags": ["storybook"] }, { - "id": "include-assets-in-build", - "name": "Include Assets in Build", - "description": "", + "id": "storybook-interaction-tests", + "name": "Setting up Storybook Interaction Tests with Nx", + "description": "This guide explains how you can set up Storybook interaction tests on your Nx workspace.", "mediaImage": "", - "file": "shared/recipes/include-assets-in-build", + "file": "shared/recipes/storybook/interaction-tests", "itemList": [], "isExternal": false, - "path": "/recipes/tips-n-tricks/include-assets-in-build", - "tags": [] + "path": "/recipes/storybook/storybook-interaction-tests", + "tags": ["storybook"] }, { - "id": "include-all-packagejson", - "name": "Include All package.json Files as Projects", - "description": "", + "id": "upgrading-storybook", + "name": "Upgrading Storybook using the Storybook CLI", + "description": "This guide explains how you can upgrade Storybook using the Storybook CLI upgrade and automigrate commands.", "mediaImage": "", - "file": "shared/recipes/include-all-packagejson", + "file": "shared/recipes/storybook/upgrading-storybook", "itemList": [], "isExternal": false, - "path": "/recipes/tips-n-tricks/include-all-packagejson", - "tags": [] + "path": "/recipes/storybook/upgrading-storybook", + "tags": ["storybook"] }, { - "id": "identify-dependencies-between-folders", - "name": "Identify Dependencies Between Folders", - "description": "", + "id": "storybook-composition-setup", + "name": "Setting up Storybook Composition with Nx", + "description": "This guide explains how you can set up Storybook composition on your Nx workspace.", "mediaImage": "", - "file": "shared/recipes/identify-dependencies-between-folders", + "file": "shared/recipes/storybook/storybook-composition-setup", "itemList": [], "isExternal": false, - "path": "/recipes/tips-n-tricks/identify-dependencies-between-folders", - "tags": [] + "path": "/recipes/storybook/storybook-composition-setup", + "tags": ["storybook"] }, { - "id": "analyze-source-files", - "name": "Disable Graph Links Created from Analyzing Source Files", - "description": "", + "id": "angular-storybook-compodoc", + "name": "Angular: Set up Compodoc for Storybook on Nx", + "description": "This guide explains how to set up Compodoc for Storybook on Angular projects in a Nx workspace.", "mediaImage": "", - "file": "shared/recipes/analyze-source-files", + "file": "shared/recipes/storybook/angular-storybook-compodoc", "itemList": [], "isExternal": false, - "path": "/recipes/tips-n-tricks/analyze-source-files", - "tags": ["explore-graph"] + "path": "/recipes/storybook/angular-storybook-compodoc", + "tags": ["storybook"] }, { - "id": "js-and-ts", - "name": "Use JavaScript instead TypeScript", - "description": "", + "id": "angular-configuring-styles", + "name": "Angular: Configuring styles and preprocessor options", + "description": "This document explains how to configure styles and preprocessor options in Angular projects with a Storybook configuration.", "mediaImage": "", - "file": "shared/guides/js-and-ts", + "file": "shared/recipes/storybook/angular-configuring-styles", "itemList": [], "isExternal": false, - "path": "/recipes/tips-n-tricks/js-and-ts", - "tags": [] - }, + "path": "/recipes/storybook/angular-configuring-styles", + "tags": ["storybook"] + } + ], + "isExternal": false, + "path": "/recipes/storybook", + "tags": [] + }, + "/recipes/storybook/overview-react": { + "id": "overview-react", + "name": "Set up Storybook for React Projects", + "description": "This guide explains how to set up Storybook for React projects in your Nx workspace.", + "mediaImage": "", + "file": "shared/recipes/storybook/plugin-react", + "itemList": [], + "isExternal": false, + "path": "/recipes/storybook/overview-react", + "tags": ["storybook"] + }, + "/recipes/storybook/overview-angular": { + "id": "overview-angular", + "name": "Set up Storybook for Angular Projects", + "description": "This guide explains how to set up Storybook for Angular projects in your Nx workspace.", + "mediaImage": "", + "file": "shared/recipes/storybook/plugin-angular", + "itemList": [], + "isExternal": false, + "path": "/recipes/storybook/overview-angular", + "tags": ["storybook"] + }, + "/recipes/storybook/overview-vue": { + "id": "overview-vue", + "name": "Set up Storybook for Vue Projects", + "description": "This guide explains how to set up Storybook for Vue projects in your Nx workspace.", + "mediaImage": "", + "file": "shared/recipes/storybook/plugin-vue", + "itemList": [], + "isExternal": false, + "path": "/recipes/storybook/overview-vue", + "tags": ["storybook"] + }, + "/recipes/storybook/configuring-storybook": { + "id": "configuring-storybook", + "name": "Configuring Storybook on Nx", + "description": "This guide explains how Storybook is configured on your Nx workspace.", + "mediaImage": "", + "file": "shared/recipes/storybook/configuring-storybook", + "itemList": [], + "isExternal": false, + "path": "/recipes/storybook/configuring-storybook", + "tags": ["storybook"] + }, + "/recipes/storybook/one-storybook-for-all": { + "id": "one-storybook-for-all", + "name": "One main Storybook instance for all projects", + "description": "This guide explains how to consolidate all your Storybook stories from different projects into one unified Storybook instance. Ideal for Nx workspaces leveraging a single framework.", + "mediaImage": "", + "file": "shared/recipes/storybook/one-storybook-for-all", + "itemList": [], + "isExternal": false, + "path": "/recipes/storybook/one-storybook-for-all", + "tags": ["storybook"] + }, + "/recipes/storybook/one-storybook-per-scope": { + "id": "one-storybook-per-scope", + "name": "One Storybook instance per scope", + "description": "This guide explains how to set up individual Storybook instances for each scope within an Nx workspace. It provides a structured approach, emphasizing folder organization and thematic scope separation.", + "mediaImage": "", + "file": "shared/recipes/storybook/one-storybook-per-scope", + "itemList": [], + "isExternal": false, + "path": "/recipes/storybook/one-storybook-per-scope", + "tags": ["storybook"] + }, + "/recipes/storybook/one-storybook-with-composition": { + "id": "one-storybook-with-composition", + "name": "One main Storybook instance using Storybook Composition", + "description": "This guide explains how to publish a unified Storybook instance from multiple frameworks within an Nx workspace using Storybook Composition.", + "mediaImage": "", + "file": "shared/recipes/storybook/one-storybook-with-composition", + "itemList": [], + "isExternal": false, + "path": "/recipes/storybook/one-storybook-with-composition", + "tags": ["storybook"] + }, + "/recipes/storybook/custom-builder-configs": { + "id": "custom-builder-configs", + "name": "How to configure Webpack and Vite for Storybook", + "description": "This guide explains how to customize the webpack configuration and your vite configuration for Storybook.", + "mediaImage": "", + "file": "shared/recipes/storybook/custom-builder-configs", + "itemList": [], + "isExternal": false, + "path": "/recipes/storybook/custom-builder-configs", + "tags": ["storybook"] + }, + "/recipes/storybook/storybook-interaction-tests": { + "id": "storybook-interaction-tests", + "name": "Setting up Storybook Interaction Tests with Nx", + "description": "This guide explains how you can set up Storybook interaction tests on your Nx workspace.", + "mediaImage": "", + "file": "shared/recipes/storybook/interaction-tests", + "itemList": [], + "isExternal": false, + "path": "/recipes/storybook/storybook-interaction-tests", + "tags": ["storybook"] + }, + "/recipes/storybook/upgrading-storybook": { + "id": "upgrading-storybook", + "name": "Upgrading Storybook using the Storybook CLI", + "description": "This guide explains how you can upgrade Storybook using the Storybook CLI upgrade and automigrate commands.", + "mediaImage": "", + "file": "shared/recipes/storybook/upgrading-storybook", + "itemList": [], + "isExternal": false, + "path": "/recipes/storybook/upgrading-storybook", + "tags": ["storybook"] + }, + "/recipes/storybook/storybook-composition-setup": { + "id": "storybook-composition-setup", + "name": "Setting up Storybook Composition with Nx", + "description": "This guide explains how you can set up Storybook composition on your Nx workspace.", + "mediaImage": "", + "file": "shared/recipes/storybook/storybook-composition-setup", + "itemList": [], + "isExternal": false, + "path": "/recipes/storybook/storybook-composition-setup", + "tags": ["storybook"] + }, + "/recipes/storybook/angular-storybook-compodoc": { + "id": "angular-storybook-compodoc", + "name": "Angular: Set up Compodoc for Storybook on Nx", + "description": "This guide explains how to set up Compodoc for Storybook on Angular projects in a Nx workspace.", + "mediaImage": "", + "file": "shared/recipes/storybook/angular-storybook-compodoc", + "itemList": [], + "isExternal": false, + "path": "/recipes/storybook/angular-storybook-compodoc", + "tags": ["storybook"] + }, + "/recipes/storybook/angular-configuring-styles": { + "id": "angular-configuring-styles", + "name": "Angular: Configuring styles and preprocessor options", + "description": "This document explains how to configure styles and preprocessor options in Angular projects with a Storybook configuration.", + "mediaImage": "", + "file": "shared/recipes/storybook/angular-configuring-styles", + "itemList": [], + "isExternal": false, + "path": "/recipes/storybook/angular-configuring-styles", + "tags": ["storybook"] + }, + "/recipes/cypress": { + "id": "cypress", + "name": "Cypress", + "description": "Cypress related recipes", + "mediaImage": "", + "file": "", + "itemList": [ { - "id": "advanced-update", - "name": "Altering Migration Process", - "description": "", + "id": "cypress-component-testing", + "name": "Component Testing", + "description": "Component Testing", "mediaImage": "", - "file": "shared/recipes/advanced-update", + "file": "shared/packages/cypress/cypress-component-testing", "itemList": [], "isExternal": false, - "path": "/recipes/tips-n-tricks/advanced-update", - "tags": ["automate-updating-dependencies"] - }, - { - "id": "yarn-pnp", - "name": "Using Yarn PnP", - "description": "", + "path": "/recipes/cypress/cypress-component-testing", + "tags": [] + }, + { + "id": "cypress-setup-node-events", + "name": "Using setupNodeEvents with Cypress preset", + "description": "A guide on using the setupNodeEvents function with @nx/cypress/plugins/cypress-preset", "mediaImage": "", - "file": "shared/recipes/yarn-pnp", + "file": "shared/packages/cypress/cypress-setup-node-events", "itemList": [], "isExternal": false, - "path": "/recipes/tips-n-tricks/yarn-pnp", - "tags": ["yarn", "Plug and Play"] + "path": "/recipes/cypress/cypress-setup-node-events", + "tags": [] }, { - "id": "flat-config", - "name": "Switching to ESLint's flat config format", - "description": "", + "id": "cypress-v11-migration", + "name": "Cypress v11 Migration Guide", + "description": "Cypress v11 Migration Guide", "mediaImage": "", - "file": "shared/recipes/tips-n-tricks/migrating-to-flat-eslint", + "file": "shared/packages/cypress/cypress-v11-migration", "itemList": [], "isExternal": false, - "path": "/recipes/tips-n-tricks/flat-config", - "tags": ["eslint", "flat config"] + "path": "/recipes/cypress/cypress-v11-migration", + "tags": [] } ], "isExternal": false, - "path": "/recipes/tips-n-tricks", - "tags": [] - }, - "/recipes/tips-n-tricks/standalone-to-monorepo": { - "id": "standalone-to-monorepo", - "name": "Convert from a Standalone Repository to a Monorepo", - "description": "", - "mediaImage": "", - "file": "shared/recipes/tips-n-tricks/standalone-to-monorepo", - "itemList": [], - "isExternal": false, - "path": "/recipes/tips-n-tricks/standalone-to-monorepo", + "path": "/recipes/cypress", "tags": [] }, - "/recipes/tips-n-tricks/eslint": { - "id": "eslint", - "name": "Configuring ESLint with Typescript", - "description": "", + "/recipes/cypress/cypress-component-testing": { + "id": "cypress-component-testing", + "name": "Component Testing", + "description": "Component Testing", "mediaImage": "", - "file": "shared/eslint", + "file": "shared/packages/cypress/cypress-component-testing", "itemList": [], "isExternal": false, - "path": "/recipes/tips-n-tricks/eslint", + "path": "/recipes/cypress/cypress-component-testing", "tags": [] }, - "/recipes/tips-n-tricks/enable-tsc-batch-mode": { - "id": "enable-tsc-batch-mode", - "name": "Enable Typescript Batch Mode", - "description": "", + "/recipes/cypress/cypress-setup-node-events": { + "id": "cypress-setup-node-events", + "name": "Using setupNodeEvents with Cypress preset", + "description": "A guide on using the setupNodeEvents function with @nx/cypress/plugins/cypress-preset", "mediaImage": "", - "file": "shared/recipes/enable-tsc-batch-mode", + "file": "shared/packages/cypress/cypress-setup-node-events", "itemList": [], "isExternal": false, - "path": "/recipes/tips-n-tricks/enable-tsc-batch-mode", + "path": "/recipes/cypress/cypress-setup-node-events", "tags": [] }, - "/recipes/tips-n-tricks/define-secondary-entrypoints": { - "id": "define-secondary-entrypoints", - "name": "Define Secondary Entrypoints for Typescript Packages", - "description": "", + "/recipes/cypress/cypress-v11-migration": { + "id": "cypress-v11-migration", + "name": "Cypress v11 Migration Guide", + "description": "Cypress v11 Migration Guide", "mediaImage": "", - "file": "shared/recipes/tips-n-tricks/define-secondary-entrypoints", + "file": "shared/packages/cypress/cypress-v11-migration", "itemList": [], "isExternal": false, - "path": "/recipes/tips-n-tricks/define-secondary-entrypoints", + "path": "/recipes/cypress/cypress-v11-migration", "tags": [] }, - "/recipes/tips-n-tricks/compile-multiple-formats": { - "id": "compile-multiple-formats", - "name": "Compile Typescript Packages to Multiple Formats", - "description": "", + "/recipes/next": { + "id": "next", + "name": "Next", + "description": "Next related recipes", "mediaImage": "", - "file": "shared/recipes/tips-n-tricks/compile-multiple-formats", - "itemList": [], + "file": "", + "itemList": [ + { + "id": "next-config-setup", + "name": "How to configure Next.js plugins", + "description": "How to configure Next.js plugins", + "mediaImage": "", + "file": "shared/packages/next/next-config-setup", + "itemList": [], + "isExternal": false, + "path": "/recipes/next/next-config-setup", + "tags": [] + } + ], "isExternal": false, - "path": "/recipes/tips-n-tricks/compile-multiple-formats", + "path": "/recipes/next", "tags": [] }, - "/recipes/tips-n-tricks/keep-nx-versions-in-sync": { - "id": "keep-nx-versions-in-sync", - "name": "Keep Nx Versions in Sync", - "description": "", - "mediaImage": "", - "file": "shared/recipes/tips-n-tricks/keep-nx-versions-in-sync", - "itemList": [], - "isExternal": false, - "path": "/recipes/tips-n-tricks/keep-nx-versions-in-sync", - "tags": ["automate-updating-dependencies"] - }, - "/recipes/tips-n-tricks/define-environment-variables": { - "id": "define-environment-variables", - "name": "Define Environment Variables", - "description": "", - "mediaImage": "", - "file": "shared/guides/define-environment-variables", - "itemList": [], - "isExternal": false, - "path": "/recipes/tips-n-tricks/define-environment-variables", - "tags": ["environment-variables"] - }, - "/recipes/tips-n-tricks/browser-support": { - "id": "browser-support", - "name": "Configuring Browser Support", - "description": "", + "/recipes/next/next-config-setup": { + "id": "next-config-setup", + "name": "How to configure Next.js plugins", + "description": "How to configure Next.js plugins", "mediaImage": "", - "file": "shared/guides/browser-support", + "file": "shared/packages/next/next-config-setup", "itemList": [], "isExternal": false, - "path": "/recipes/tips-n-tricks/browser-support", + "path": "/recipes/next/next-config-setup", "tags": [] }, - "/recipes/tips-n-tricks/include-assets-in-build": { - "id": "include-assets-in-build", - "name": "Include Assets in Build", - "description": "", + "/recipes/nuxt": { + "id": "nuxt", + "name": "Nuxt", + "description": "Nuxt related recipes", "mediaImage": "", - "file": "shared/recipes/include-assets-in-build", - "itemList": [], + "file": "", + "itemList": [ + { + "id": "deploy-nuxt-to-vercel", + "name": "Deploying Nuxt applications to Vercel", + "description": "A detailed guide on how to deploy Nuxt applications from Nx workspaces to Vercel.", + "mediaImage": "", + "file": "shared/recipes/deployment/deploy-nuxt-to-vercel", + "itemList": [], + "isExternal": false, + "path": "/recipes/nuxt/deploy-nuxt-to-vercel", + "tags": [] + } + ], "isExternal": false, - "path": "/recipes/tips-n-tricks/include-assets-in-build", + "path": "/recipes/nuxt", "tags": [] }, - "/recipes/tips-n-tricks/include-all-packagejson": { - "id": "include-all-packagejson", - "name": "Include All package.json Files as Projects", - "description": "", + "/recipes/nuxt/deploy-nuxt-to-vercel": { + "id": "deploy-nuxt-to-vercel", + "name": "Deploying Nuxt applications to Vercel", + "description": "A detailed guide on how to deploy Nuxt applications from Nx workspaces to Vercel.", "mediaImage": "", - "file": "shared/recipes/include-all-packagejson", + "file": "shared/recipes/deployment/deploy-nuxt-to-vercel", "itemList": [], "isExternal": false, - "path": "/recipes/tips-n-tricks/include-all-packagejson", + "path": "/recipes/nuxt/deploy-nuxt-to-vercel", "tags": [] }, - "/recipes/tips-n-tricks/identify-dependencies-between-folders": { - "id": "identify-dependencies-between-folders", - "name": "Identify Dependencies Between Folders", - "description": "", + "/recipes/vite": { + "id": "vite", + "name": "Vite", + "description": "Vite related recipes", "mediaImage": "", - "file": "shared/recipes/identify-dependencies-between-folders", - "itemList": [], + "file": "", + "itemList": [ + { + "id": "configure-vite", + "name": "Configure Vite on your Nx workspace", + "description": "Configure Vite on your Nx workspace", + "mediaImage": "", + "file": "shared/packages/vite/configure-vite", + "itemList": [], + "isExternal": false, + "path": "/recipes/vite/configure-vite", + "tags": [] + } + ], "isExternal": false, - "path": "/recipes/tips-n-tricks/identify-dependencies-between-folders", + "path": "/recipes/vite", "tags": [] }, - "/recipes/tips-n-tricks/analyze-source-files": { - "id": "analyze-source-files", - "name": "Disable Graph Links Created from Analyzing Source Files", - "description": "", - "mediaImage": "", - "file": "shared/recipes/analyze-source-files", - "itemList": [], - "isExternal": false, - "path": "/recipes/tips-n-tricks/analyze-source-files", - "tags": ["explore-graph"] - }, - "/recipes/tips-n-tricks/js-and-ts": { - "id": "js-and-ts", - "name": "Use JavaScript instead TypeScript", - "description": "", + "/recipes/vite/configure-vite": { + "id": "configure-vite", + "name": "Configure Vite on your Nx workspace", + "description": "Configure Vite on your Nx workspace", "mediaImage": "", - "file": "shared/guides/js-and-ts", + "file": "shared/packages/vite/configure-vite", "itemList": [], "isExternal": false, - "path": "/recipes/tips-n-tricks/js-and-ts", + "path": "/recipes/vite/configure-vite", "tags": [] }, - "/recipes/tips-n-tricks/advanced-update": { - "id": "advanced-update", - "name": "Altering Migration Process", - "description": "", + "/recipes/webpack": { + "id": "webpack", + "name": "Webpack", + "description": "Webpack related recipes", "mediaImage": "", - "file": "shared/recipes/advanced-update", - "itemList": [], + "file": "", + "itemList": [ + { + "id": "webpack-config-setup", + "name": "How to configure Webpack in your Nx workspace", + "description": "A guide on how to configure webpack on your Nx workspace, and instructions on how to customize your webpack configuration", + "mediaImage": "", + "file": "shared/packages/webpack/webpack-config-setup", + "itemList": [], + "isExternal": false, + "path": "/recipes/webpack/webpack-config-setup", + "tags": [] + }, + { + "id": "webpack-plugins", + "name": "Webpack plugins", + "description": "Webpack plugins", + "mediaImage": "", + "file": "shared/packages/webpack/webpack-plugins", + "itemList": [], + "isExternal": false, + "path": "/recipes/webpack/webpack-plugins", + "tags": [] + } + ], "isExternal": false, - "path": "/recipes/tips-n-tricks/advanced-update", - "tags": ["automate-updating-dependencies"] + "path": "/recipes/webpack", + "tags": [] }, - "/recipes/tips-n-tricks/yarn-pnp": { - "id": "yarn-pnp", - "name": "Using Yarn PnP", - "description": "", + "/recipes/webpack/webpack-config-setup": { + "id": "webpack-config-setup", + "name": "How to configure Webpack in your Nx workspace", + "description": "A guide on how to configure webpack on your Nx workspace, and instructions on how to customize your webpack configuration", "mediaImage": "", - "file": "shared/recipes/yarn-pnp", + "file": "shared/packages/webpack/webpack-config-setup", "itemList": [], "isExternal": false, - "path": "/recipes/tips-n-tricks/yarn-pnp", - "tags": ["yarn", "Plug and Play"] + "path": "/recipes/webpack/webpack-config-setup", + "tags": [] }, - "/recipes/tips-n-tricks/flat-config": { - "id": "flat-config", - "name": "Switching to ESLint's flat config format", - "description": "", + "/recipes/webpack/webpack-plugins": { + "id": "webpack-plugins", + "name": "Webpack plugins", + "description": "Webpack plugins", "mediaImage": "", - "file": "shared/recipes/tips-n-tricks/migrating-to-flat-eslint", + "file": "shared/packages/webpack/webpack-plugins", "itemList": [], "isExternal": false, - "path": "/recipes/tips-n-tricks/flat-config", - "tags": ["eslint", "flat config"] + "path": "/recipes/webpack/webpack-plugins", + "tags": [] }, - "/recipes/nx-console": { - "id": "nx-console", - "name": "Nx Console", - "description": "Checkout all the recipes related to Nx Console.", + "/recipes/enforce-module-boundaries": { + "id": "enforce-module-boundaries", + "name": "Enforce Module Boundaries", + "description": "Configuring the enforce module boundaries rule", "mediaImage": "", "file": "", "itemList": [ { - "id": "console-telemetry", - "name": "Telemetry", - "description": "", - "mediaImage": "", - "file": "shared/recipes/console-telemetry", - "itemList": [], - "isExternal": false, - "path": "/recipes/nx-console/console-telemetry", - "tags": ["editor-setup"] - }, - { - "id": "console-project-details", - "name": "Project Details View", + "id": "ban-dependencies-with-tags", + "name": "Ban Dependencies with Certain Tags", "description": "", "mediaImage": "", - "file": "shared/recipes/console-project-details", + "file": "shared/recipes/ban-dependencies-with-tags", "itemList": [], "isExternal": false, - "path": "/recipes/nx-console/console-project-details", - "tags": ["editor-setup"] + "path": "/recipes/enforce-module-boundaries/ban-dependencies-with-tags", + "tags": ["enforce-module-boundaries"] }, { - "id": "console-generate-command", - "name": "Generate Command", + "id": "tag-multiple-dimensions", + "name": "Tag in Multiple Dimensions", "description": "", "mediaImage": "", - "file": "shared/recipes/console-generate-command", + "file": "shared/recipes/tag-multiple-dimensions", "itemList": [], "isExternal": false, - "path": "/recipes/nx-console/console-generate-command", - "tags": ["editor-setup"] + "path": "/recipes/enforce-module-boundaries/tag-multiple-dimensions", + "tags": ["enforce-module-boundaries"] }, { - "id": "console-run-command", - "name": "Run Command", + "id": "ban-external-imports", + "name": "Ban External Imports", "description": "", "mediaImage": "", - "file": "shared/recipes/console-run-command", + "file": "shared/recipes/ban-external-imports", "itemList": [], "isExternal": false, - "path": "/recipes/nx-console/console-run-command", - "tags": ["editor-setup"] + "path": "/recipes/enforce-module-boundaries/ban-external-imports", + "tags": ["enforce-module-boundaries"] }, { - "id": "console-troubleshooting", - "name": "Troubleshooting", + "id": "tags-allow-list", + "name": "Tags Allow List", "description": "", "mediaImage": "", - "file": "shared/recipes/console-troubleshooting", + "file": "shared/recipes/tags-allow-list", "itemList": [], "isExternal": false, - "path": "/recipes/nx-console/console-troubleshooting", - "tags": ["editor-setup"] + "path": "/recipes/enforce-module-boundaries/tags-allow-list", + "tags": ["enforce-module-boundaries"] } ], "isExternal": false, - "path": "/recipes/nx-console", + "path": "/recipes/enforce-module-boundaries", "tags": [] }, - "/recipes/nx-console/console-telemetry": { - "id": "console-telemetry", - "name": "Telemetry", - "description": "", - "mediaImage": "", - "file": "shared/recipes/console-telemetry", - "itemList": [], - "isExternal": false, - "path": "/recipes/nx-console/console-telemetry", - "tags": ["editor-setup"] - }, - "/recipes/nx-console/console-project-details": { - "id": "console-project-details", - "name": "Project Details View", + "/recipes/enforce-module-boundaries/ban-dependencies-with-tags": { + "id": "ban-dependencies-with-tags", + "name": "Ban Dependencies with Certain Tags", "description": "", "mediaImage": "", - "file": "shared/recipes/console-project-details", + "file": "shared/recipes/ban-dependencies-with-tags", "itemList": [], "isExternal": false, - "path": "/recipes/nx-console/console-project-details", - "tags": ["editor-setup"] + "path": "/recipes/enforce-module-boundaries/ban-dependencies-with-tags", + "tags": ["enforce-module-boundaries"] }, - "/recipes/nx-console/console-generate-command": { - "id": "console-generate-command", - "name": "Generate Command", + "/recipes/enforce-module-boundaries/tag-multiple-dimensions": { + "id": "tag-multiple-dimensions", + "name": "Tag in Multiple Dimensions", "description": "", "mediaImage": "", - "file": "shared/recipes/console-generate-command", + "file": "shared/recipes/tag-multiple-dimensions", "itemList": [], "isExternal": false, - "path": "/recipes/nx-console/console-generate-command", - "tags": ["editor-setup"] + "path": "/recipes/enforce-module-boundaries/tag-multiple-dimensions", + "tags": ["enforce-module-boundaries"] }, - "/recipes/nx-console/console-run-command": { - "id": "console-run-command", - "name": "Run Command", + "/recipes/enforce-module-boundaries/ban-external-imports": { + "id": "ban-external-imports", + "name": "Ban External Imports", "description": "", "mediaImage": "", - "file": "shared/recipes/console-run-command", + "file": "shared/recipes/ban-external-imports", "itemList": [], "isExternal": false, - "path": "/recipes/nx-console/console-run-command", - "tags": ["editor-setup"] + "path": "/recipes/enforce-module-boundaries/ban-external-imports", + "tags": ["enforce-module-boundaries"] }, - "/recipes/nx-console/console-troubleshooting": { - "id": "console-troubleshooting", - "name": "Troubleshoot Nx Console Issues", + "/recipes/enforce-module-boundaries/tags-allow-list": { + "id": "tags-allow-list", + "name": "Tags Allow List", "description": "", "mediaImage": "", - "file": "shared/recipes/console-troubleshooting", + "file": "shared/recipes/tags-allow-list", "itemList": [], "isExternal": false, - "path": "/recipes/nx-console/console-troubleshooting", - "tags": [] + "path": "/recipes/enforce-module-boundaries/tags-allow-list", + "tags": ["enforce-module-boundaries"] }, - "/recipes/nx-release": { - "id": "nx-release", - "name": "Nx Release", - "description": "Recipes for releasing with Nx release.", + "/recipes/tips-n-tricks": { + "id": "tips-n-tricks", + "name": "Tips and tricks", + "description": "Various tips and tricks for using Nx.", "mediaImage": "", "file": "", "itemList": [ { - "id": "get-started-with-nx-release", - "name": "Get Started with Nx Release", + "id": "standalone-to-monorepo", + "name": "Convert from a Standalone Repository to a Monorepo", "description": "", "mediaImage": "", - "file": "shared/recipes/nx-release/get-started-with-nx-release", + "file": "shared/recipes/tips-n-tricks/standalone-to-monorepo", "itemList": [], "isExternal": false, - "path": "/recipes/nx-release/get-started-with-nx-release", - "tags": ["nx-release"] + "path": "/recipes/tips-n-tricks/standalone-to-monorepo", + "tags": [] }, { - "id": "release-projects-independently", - "name": "Release Projects Independently", + "id": "eslint", + "name": "Configuring ESLint with Typescript", "description": "", "mediaImage": "", - "file": "shared/recipes/nx-release/release-projects-independently", + "file": "shared/eslint", "itemList": [], "isExternal": false, - "path": "/recipes/nx-release/release-projects-independently", - "tags": ["nx-release"] + "path": "/recipes/tips-n-tricks/eslint", + "tags": [] }, { - "id": "automatically-version-with-conventional-commits", - "name": "Automatically Version with Conventional Commits", + "id": "enable-tsc-batch-mode", + "name": "Enable Typescript Batch Mode", "description": "", "mediaImage": "", - "file": "shared/recipes/nx-release/automatically-version-with-conventional-commits", + "file": "shared/recipes/enable-tsc-batch-mode", "itemList": [], "isExternal": false, - "path": "/recipes/nx-release/automatically-version-with-conventional-commits", - "tags": ["nx-release"] + "path": "/recipes/tips-n-tricks/enable-tsc-batch-mode", + "tags": [] }, { - "id": "customize-conventional-commit-types", - "name": "Customize Conventional Commit Types", + "id": "define-secondary-entrypoints", + "name": "Define Secondary Entrypoints for Typescript Packages", "description": "", "mediaImage": "", - "file": "shared/recipes/nx-release/customize-conventional-commit-types", + "file": "shared/recipes/tips-n-tricks/define-secondary-entrypoints", "itemList": [], "isExternal": false, - "path": "/recipes/nx-release/customize-conventional-commit-types", - "tags": ["nx-release"] + "path": "/recipes/tips-n-tricks/define-secondary-entrypoints", + "tags": [] }, { - "id": "file-based-versioning-version-plans", - "name": "File Based Versioning (Version Plans)", + "id": "compile-multiple-formats", + "name": "Compile Typescript Packages to Multiple Formats", "description": "", "mediaImage": "", - "file": "shared/recipes/nx-release/file-based-versioning-version-plans", + "file": "shared/recipes/tips-n-tricks/compile-multiple-formats", "itemList": [], "isExternal": false, - "path": "/recipes/nx-release/file-based-versioning-version-plans", - "tags": ["nx-release"] + "path": "/recipes/tips-n-tricks/compile-multiple-formats", + "tags": [] }, { - "id": "configure-custom-registries", - "name": "Configure Custom Registries", + "id": "keep-nx-versions-in-sync", + "name": "Keep Nx Versions in Sync", "description": "", "mediaImage": "", - "file": "shared/recipes/nx-release/configure-custom-registries", + "file": "shared/recipes/tips-n-tricks/keep-nx-versions-in-sync", "itemList": [], "isExternal": false, - "path": "/recipes/nx-release/configure-custom-registries", - "tags": ["nx-release"] + "path": "/recipes/tips-n-tricks/keep-nx-versions-in-sync", + "tags": ["automate-updating-dependencies"] }, { - "id": "publish-in-ci-cd", - "name": "Publish in CI/CD", + "id": "define-environment-variables", + "name": "Define Environment Variables", "description": "", "mediaImage": "", - "file": "shared/recipes/nx-release/publish-in-ci-cd", + "file": "shared/guides/define-environment-variables", "itemList": [], "isExternal": false, - "path": "/recipes/nx-release/publish-in-ci-cd", - "tags": ["nx-release"] + "path": "/recipes/tips-n-tricks/define-environment-variables", + "tags": ["environment-variables"] }, { - "id": "automate-github-releases", - "name": "Automate GitHub Releases", + "id": "browser-support", + "name": "Configuring Browser Support", "description": "", "mediaImage": "", - "file": "shared/recipes/nx-release/automate-github-releases", + "file": "shared/guides/browser-support", + "itemList": [], + "isExternal": false, + "path": "/recipes/tips-n-tricks/browser-support", + "tags": [] + }, + { + "id": "include-assets-in-build", + "name": "Include Assets in Build", + "description": "", + "mediaImage": "", + "file": "shared/recipes/include-assets-in-build", + "itemList": [], + "isExternal": false, + "path": "/recipes/tips-n-tricks/include-assets-in-build", + "tags": [] + }, + { + "id": "include-all-packagejson", + "name": "Include All package.json Files as Projects", + "description": "", + "mediaImage": "", + "file": "shared/recipes/include-all-packagejson", "itemList": [], "isExternal": false, - "path": "/recipes/nx-release/automate-github-releases", - "tags": ["nx-release"] + "path": "/recipes/tips-n-tricks/include-all-packagejson", + "tags": [] }, { - "id": "publish-rust-crates", - "name": "Publish Rust Crates", + "id": "identify-dependencies-between-folders", + "name": "Identify Dependencies Between Folders", "description": "", "mediaImage": "", - "file": "shared/recipes/nx-release/publish-rust-crates", + "file": "shared/recipes/identify-dependencies-between-folders", "itemList": [], "isExternal": false, - "path": "/recipes/nx-release/publish-rust-crates", - "tags": ["nx-release"] + "path": "/recipes/tips-n-tricks/identify-dependencies-between-folders", + "tags": [] }, { - "id": "update-local-registry-setup", - "name": "Update Your Local Registry Setup to use Nx Release", + "id": "analyze-source-files", + "name": "Disable Graph Links Created from Analyzing Source Files", "description": "", "mediaImage": "", - "file": "shared/recipes/nx-release/update-local-registry-setup", + "file": "shared/recipes/analyze-source-files", "itemList": [], "isExternal": false, - "path": "/recipes/nx-release/update-local-registry-setup", - "tags": ["nx-release"] + "path": "/recipes/tips-n-tricks/analyze-source-files", + "tags": ["explore-graph"] }, { - "id": "configure-changelog-format", - "name": "Configure Changelog Format", + "id": "js-and-ts", + "name": "Use JavaScript instead TypeScript", "description": "", "mediaImage": "", - "file": "shared/recipes/nx-release/configure-changelog-format", + "file": "shared/guides/js-and-ts", "itemList": [], "isExternal": false, - "path": "/recipes/nx-release/configure-changelog-format", - "tags": ["nx-release"] + "path": "/recipes/tips-n-tricks/js-and-ts", + "tags": [] }, { - "id": "publish-custom-dist-directory", - "name": "Publish a Custom Dist Directory", + "id": "advanced-update", + "name": "Altering Migration Process", "description": "", "mediaImage": "", - "file": "shared/recipes/nx-release/publish-custom-dist-directory", + "file": "shared/recipes/advanced-update", "itemList": [], "isExternal": false, - "path": "/recipes/nx-release/publish-custom-dist-directory", - "tags": ["nx-release"] + "path": "/recipes/tips-n-tricks/advanced-update", + "tags": ["automate-updating-dependencies"] }, { - "id": "build-before-versioning", - "name": "Build Before Versioning", + "id": "yarn-pnp", + "name": "Using Yarn PnP", "description": "", "mediaImage": "", - "file": "shared/recipes/nx-release/build-before-versioning", + "file": "shared/recipes/yarn-pnp", "itemList": [], "isExternal": false, - "path": "/recipes/nx-release/build-before-versioning", - "tags": ["nx-release"] + "path": "/recipes/tips-n-tricks/yarn-pnp", + "tags": ["yarn", "Plug and Play"] }, { - "id": "configuration-version-prefix", - "name": "Configuring Version Prefix for Dependency Versions", + "id": "flat-config", + "name": "Switching to ESLint's flat config format", "description": "", "mediaImage": "", - "file": "shared/recipes/nx-release/configuration-version-prefix", + "file": "shared/recipes/tips-n-tricks/migrating-to-flat-eslint", "itemList": [], "isExternal": false, - "path": "/recipes/nx-release/configuration-version-prefix", - "tags": ["nx-release"] + "path": "/recipes/tips-n-tricks/flat-config", + "tags": ["eslint", "flat config"] } ], "isExternal": false, - "path": "/recipes/nx-release", + "path": "/recipes/tips-n-tricks", "tags": [] }, - "/recipes/nx-release/get-started-with-nx-release": { - "id": "get-started-with-nx-release", - "name": "Get Started with Nx Release", + "/recipes/tips-n-tricks/standalone-to-monorepo": { + "id": "standalone-to-monorepo", + "name": "Convert from a Standalone Repository to a Monorepo", "description": "", "mediaImage": "", - "file": "shared/recipes/nx-release/get-started-with-nx-release", + "file": "shared/recipes/tips-n-tricks/standalone-to-monorepo", "itemList": [], "isExternal": false, - "path": "/recipes/nx-release/get-started-with-nx-release", - "tags": ["nx-release"] + "path": "/recipes/tips-n-tricks/standalone-to-monorepo", + "tags": [] }, - "/recipes/nx-release/release-projects-independently": { - "id": "release-projects-independently", - "name": "Release Projects Independently", + "/recipes/tips-n-tricks/eslint": { + "id": "eslint", + "name": "Configuring ESLint with Typescript", "description": "", "mediaImage": "", - "file": "shared/recipes/nx-release/release-projects-independently", + "file": "shared/eslint", "itemList": [], "isExternal": false, - "path": "/recipes/nx-release/release-projects-independently", - "tags": ["nx-release"] + "path": "/recipes/tips-n-tricks/eslint", + "tags": [] }, - "/recipes/nx-release/automatically-version-with-conventional-commits": { - "id": "automatically-version-with-conventional-commits", - "name": "Automatically Version with Conventional Commits", + "/recipes/tips-n-tricks/enable-tsc-batch-mode": { + "id": "enable-tsc-batch-mode", + "name": "Enable Typescript Batch Mode", "description": "", "mediaImage": "", - "file": "shared/recipes/nx-release/automatically-version-with-conventional-commits", + "file": "shared/recipes/enable-tsc-batch-mode", "itemList": [], "isExternal": false, - "path": "/recipes/nx-release/automatically-version-with-conventional-commits", - "tags": ["nx-release"] + "path": "/recipes/tips-n-tricks/enable-tsc-batch-mode", + "tags": [] }, - "/recipes/nx-release/customize-conventional-commit-types": { - "id": "customize-conventional-commit-types", - "name": "Customize Conventional Commit Types", + "/recipes/tips-n-tricks/define-secondary-entrypoints": { + "id": "define-secondary-entrypoints", + "name": "Define Secondary Entrypoints for Typescript Packages", "description": "", "mediaImage": "", - "file": "shared/recipes/nx-release/customize-conventional-commit-types", + "file": "shared/recipes/tips-n-tricks/define-secondary-entrypoints", "itemList": [], "isExternal": false, - "path": "/recipes/nx-release/customize-conventional-commit-types", - "tags": ["nx-release"] + "path": "/recipes/tips-n-tricks/define-secondary-entrypoints", + "tags": [] }, - "/recipes/nx-release/file-based-versioning-version-plans": { - "id": "file-based-versioning-version-plans", - "name": "File Based Versioning (Version Plans)", + "/recipes/tips-n-tricks/compile-multiple-formats": { + "id": "compile-multiple-formats", + "name": "Compile Typescript Packages to Multiple Formats", "description": "", "mediaImage": "", - "file": "shared/recipes/nx-release/file-based-versioning-version-plans", + "file": "shared/recipes/tips-n-tricks/compile-multiple-formats", "itemList": [], "isExternal": false, - "path": "/recipes/nx-release/file-based-versioning-version-plans", - "tags": ["nx-release"] + "path": "/recipes/tips-n-tricks/compile-multiple-formats", + "tags": [] }, - "/recipes/nx-release/configure-custom-registries": { - "id": "configure-custom-registries", - "name": "Configure Custom Registries", + "/recipes/tips-n-tricks/keep-nx-versions-in-sync": { + "id": "keep-nx-versions-in-sync", + "name": "Keep Nx Versions in Sync", "description": "", "mediaImage": "", - "file": "shared/recipes/nx-release/configure-custom-registries", + "file": "shared/recipes/tips-n-tricks/keep-nx-versions-in-sync", "itemList": [], "isExternal": false, - "path": "/recipes/nx-release/configure-custom-registries", - "tags": ["nx-release"] + "path": "/recipes/tips-n-tricks/keep-nx-versions-in-sync", + "tags": ["automate-updating-dependencies"] }, - "/recipes/nx-release/publish-in-ci-cd": { - "id": "publish-in-ci-cd", - "name": "Publish in CI/CD", + "/recipes/tips-n-tricks/define-environment-variables": { + "id": "define-environment-variables", + "name": "Define Environment Variables", "description": "", "mediaImage": "", - "file": "shared/recipes/nx-release/publish-in-ci-cd", + "file": "shared/guides/define-environment-variables", "itemList": [], "isExternal": false, - "path": "/recipes/nx-release/publish-in-ci-cd", - "tags": ["nx-release"] + "path": "/recipes/tips-n-tricks/define-environment-variables", + "tags": ["environment-variables"] }, - "/recipes/nx-release/automate-github-releases": { - "id": "automate-github-releases", - "name": "Automate GitHub Releases", + "/recipes/tips-n-tricks/browser-support": { + "id": "browser-support", + "name": "Configuring Browser Support", "description": "", "mediaImage": "", - "file": "shared/recipes/nx-release/automate-github-releases", + "file": "shared/guides/browser-support", "itemList": [], "isExternal": false, - "path": "/recipes/nx-release/automate-github-releases", - "tags": ["nx-release"] + "path": "/recipes/tips-n-tricks/browser-support", + "tags": [] }, - "/recipes/nx-release/publish-rust-crates": { - "id": "publish-rust-crates", - "name": "Publish Rust Crates", + "/recipes/tips-n-tricks/include-assets-in-build": { + "id": "include-assets-in-build", + "name": "Include Assets in Build", "description": "", "mediaImage": "", - "file": "shared/recipes/nx-release/publish-rust-crates", + "file": "shared/recipes/include-assets-in-build", "itemList": [], "isExternal": false, - "path": "/recipes/nx-release/publish-rust-crates", - "tags": ["nx-release"] + "path": "/recipes/tips-n-tricks/include-assets-in-build", + "tags": [] }, - "/recipes/nx-release/update-local-registry-setup": { - "id": "update-local-registry-setup", - "name": "Update Your Local Registry Setup to use Nx Release", + "/recipes/tips-n-tricks/include-all-packagejson": { + "id": "include-all-packagejson", + "name": "Include All package.json Files as Projects", "description": "", "mediaImage": "", - "file": "shared/recipes/nx-release/update-local-registry-setup", + "file": "shared/recipes/include-all-packagejson", "itemList": [], "isExternal": false, - "path": "/recipes/nx-release/update-local-registry-setup", - "tags": ["nx-release"] + "path": "/recipes/tips-n-tricks/include-all-packagejson", + "tags": [] }, - "/recipes/nx-release/configure-changelog-format": { - "id": "configure-changelog-format", - "name": "Configure Changelog Format", + "/recipes/tips-n-tricks/identify-dependencies-between-folders": { + "id": "identify-dependencies-between-folders", + "name": "Identify Dependencies Between Folders", "description": "", "mediaImage": "", - "file": "shared/recipes/nx-release/configure-changelog-format", + "file": "shared/recipes/identify-dependencies-between-folders", "itemList": [], "isExternal": false, - "path": "/recipes/nx-release/configure-changelog-format", - "tags": ["nx-release"] + "path": "/recipes/tips-n-tricks/identify-dependencies-between-folders", + "tags": [] }, - "/recipes/nx-release/publish-custom-dist-directory": { - "id": "publish-custom-dist-directory", - "name": "Publish a Custom Dist Directory", + "/recipes/tips-n-tricks/analyze-source-files": { + "id": "analyze-source-files", + "name": "Disable Graph Links Created from Analyzing Source Files", "description": "", "mediaImage": "", - "file": "shared/recipes/nx-release/publish-custom-dist-directory", + "file": "shared/recipes/analyze-source-files", "itemList": [], "isExternal": false, - "path": "/recipes/nx-release/publish-custom-dist-directory", - "tags": ["nx-release"] + "path": "/recipes/tips-n-tricks/analyze-source-files", + "tags": ["explore-graph"] }, - "/recipes/nx-release/build-before-versioning": { - "id": "build-before-versioning", - "name": "Build Before Versioning", + "/recipes/tips-n-tricks/js-and-ts": { + "id": "js-and-ts", + "name": "Use JavaScript instead TypeScript", "description": "", "mediaImage": "", - "file": "shared/recipes/nx-release/build-before-versioning", + "file": "shared/guides/js-and-ts", "itemList": [], "isExternal": false, - "path": "/recipes/nx-release/build-before-versioning", - "tags": ["nx-release"] + "path": "/recipes/tips-n-tricks/js-and-ts", + "tags": [] }, - "/recipes/nx-release/configuration-version-prefix": { - "id": "configuration-version-prefix", - "name": "Configuring Version Prefix for Dependency Versions", + "/recipes/tips-n-tricks/advanced-update": { + "id": "advanced-update", + "name": "Altering Migration Process", "description": "", "mediaImage": "", - "file": "shared/recipes/nx-release/configuration-version-prefix", + "file": "shared/recipes/advanced-update", "itemList": [], "isExternal": false, - "path": "/recipes/nx-release/configuration-version-prefix", - "tags": ["nx-release"] + "path": "/recipes/tips-n-tricks/advanced-update", + "tags": ["automate-updating-dependencies"] + }, + "/recipes/tips-n-tricks/yarn-pnp": { + "id": "yarn-pnp", + "name": "Using Yarn PnP", + "description": "", + "mediaImage": "", + "file": "shared/recipes/yarn-pnp", + "itemList": [], + "isExternal": false, + "path": "/recipes/tips-n-tricks/yarn-pnp", + "tags": ["yarn", "Plug and Play"] + }, + "/recipes/tips-n-tricks/flat-config": { + "id": "flat-config", + "name": "Switching to ESLint's flat config format", + "description": "", + "mediaImage": "", + "file": "shared/recipes/tips-n-tricks/migrating-to-flat-eslint", + "itemList": [], + "isExternal": false, + "path": "/recipes/tips-n-tricks/flat-config", + "tags": ["eslint", "flat config"] }, "/nx-enterprise": { "id": "nx-enterprise", diff --git a/docs/map.json b/docs/map.json index 3810b91b468fbc..72371adcb694ec 100644 --- a/docs/map.json +++ b/docs/map.json @@ -476,6 +476,159 @@ } ] }, + { + "name": "Nx Release", + "id": "nx-release", + "description": "Recipes for releasing with Nx release.", + "itemList": [ + { + "name": "Get Started with Nx Release", + "id": "get-started-with-nx-release", + "tags": ["nx-release"], + "file": "shared/recipes/nx-release/get-started-with-nx-release" + }, + { + "name": "Release Projects Independently", + "id": "release-projects-independently", + "tags": ["nx-release"], + "file": "shared/recipes/nx-release/release-projects-independently" + }, + { + "name": "Automatically Version with Conventional Commits", + "id": "automatically-version-with-conventional-commits", + "tags": ["nx-release"], + "file": "shared/recipes/nx-release/automatically-version-with-conventional-commits" + }, + { + "name": "Customize Conventional Commit Types", + "id": "customize-conventional-commit-types", + "tags": ["nx-release"], + "file": "shared/recipes/nx-release/customize-conventional-commit-types" + }, + { + "name": "File Based Versioning (Version Plans)", + "id": "file-based-versioning-version-plans", + "tags": ["nx-release"], + "file": "shared/recipes/nx-release/file-based-versioning-version-plans" + }, + { + "name": "Configure Custom Registries", + "id": "configure-custom-registries", + "tags": ["nx-release"], + "file": "shared/recipes/nx-release/configure-custom-registries" + }, + { + "name": "Publish in CI/CD", + "id": "publish-in-ci-cd", + "tags": ["nx-release"], + "file": "shared/recipes/nx-release/publish-in-ci-cd" + }, + { + "name": "Automate GitHub Releases", + "id": "automate-github-releases", + "tags": ["nx-release"], + "file": "shared/recipes/nx-release/automate-github-releases" + }, + { + "name": "Publish Rust Crates", + "id": "publish-rust-crates", + "tags": ["nx-release"], + "file": "shared/recipes/nx-release/publish-rust-crates" + }, + { + "name": "Update Your Local Registry Setup to use Nx Release", + "id": "update-local-registry-setup", + "tags": ["nx-release"], + "file": "shared/recipes/nx-release/update-local-registry-setup" + }, + { + "name": "Configure Changelog Format", + "id": "configure-changelog-format", + "tags": ["nx-release"], + "file": "shared/recipes/nx-release/configure-changelog-format" + }, + { + "name": "Publish a Custom Dist Directory", + "id": "publish-custom-dist-directory", + "tags": ["nx-release"], + "file": "shared/recipes/nx-release/publish-custom-dist-directory" + }, + { + "name": "Build Before Versioning", + "id": "build-before-versioning", + "tags": ["nx-release"], + "file": "shared/recipes/nx-release/build-before-versioning" + }, + { + "name": "Configuring Version Prefix for Dependency Versions", + "id": "configuration-version-prefix", + "tags": ["nx-release"], + "file": "shared/recipes/nx-release/configuration-version-prefix" + } + ] + }, + { + "name": "Module Federation", + "id": "module-federation", + "description": "Advanced guides to utilize Module Federation with Nx.", + "itemList": [ + { + "id": "create-a-host", + "name": "How to create a Module Federation Host Application", + "description": "A guide on how to create a Module Federation Host Application in your Nx workspace", + "file": "shared/recipes/module-federation/creating-a-host" + }, + { + "id": "create-a-remote", + "name": "How to create a Module Federation Remote Application", + "description": "A guide on how to create a Module Federation Remote Application in your Nx workspace", + "file": "shared/recipes/module-federation/creating-a-remote" + }, + { + "id": "federate-a-module", + "name": "How to Federate a Module", + "description": "A guide on how to federate a module in your Nx workspace", + "file": "shared/recipes/module-federation/federate-a-module" + } + ] + }, + { + "name": "Nx Console", + "id": "nx-console", + "description": "Checkout all the recipes related to Nx Console.", + "itemList": [ + { + "name": "Telemetry", + "id": "console-telemetry", + "tags": ["editor-setup"], + "file": "shared/recipes/console-telemetry" + }, + { + "name": "Project Details View", + "id": "console-project-details", + "tags": ["editor-setup"], + "file": "shared/recipes/console-project-details" + }, + { + "name": "Generate Command", + "id": "console-generate-command", + "tags": ["editor-setup"], + "file": "shared/recipes/console-generate-command" + }, + { + "name": "Run Command", + "id": "console-run-command", + "tags": ["editor-setup"], + "file": "shared/recipes/console-run-command" + }, + { + "name": "Troubleshooting", + "id": "console-troubleshooting", + "tags": ["editor-setup"], + "file": "shared/recipes/console-troubleshooting" + } + ] + }, { "name": "React", "id": "react", @@ -794,31 +947,6 @@ } ] }, - { - "name": "Module Federation", - "id": "module-federation", - "description": "Advanced guides to utilize Module Federation with Nx.", - "itemList": [ - { - "id": "create-a-host", - "name": "How to create a Module Federation Host Application", - "description": "A guide on how to create a Module Federation Host Application in your Nx workspace", - "file": "shared/recipes/module-federation/creating-a-host" - }, - { - "id": "create-a-remote", - "name": "How to create a Module Federation Remote Application", - "description": "A guide on how to create a Module Federation Remote Application in your Nx workspace", - "file": "shared/recipes/module-federation/creating-a-remote" - }, - { - "id": "federate-a-module", - "name": "How to Federate a Module", - "description": "A guide on how to federate a module in your Nx workspace", - "file": "shared/recipes/module-federation/federate-a-module" - } - ] - }, { "name": "Enforce Module Boundaries", "id": "enforce-module-boundaries", @@ -945,134 +1073,6 @@ "file": "shared/recipes/tips-n-tricks/migrating-to-flat-eslint" } ] - }, - { - "name": "Nx Console", - "id": "nx-console", - "description": "Checkout all the recipes related to Nx Console.", - "itemList": [ - { - "name": "Telemetry", - "id": "console-telemetry", - "tags": ["editor-setup"], - "file": "shared/recipes/console-telemetry" - }, - { - "name": "Project Details View", - "id": "console-project-details", - "tags": ["editor-setup"], - "file": "shared/recipes/console-project-details" - }, - { - "name": "Generate Command", - "id": "console-generate-command", - "tags": ["editor-setup"], - "file": "shared/recipes/console-generate-command" - }, - { - "name": "Run Command", - "id": "console-run-command", - "tags": ["editor-setup"], - "file": "shared/recipes/console-run-command" - }, - { - "name": "Troubleshooting", - "id": "console-troubleshooting", - "tags": ["editor-setup"], - "file": "shared/recipes/console-troubleshooting" - } - ] - }, - { - "name": "Nx Release", - "id": "nx-release", - "description": "Recipes for releasing with Nx release.", - "itemList": [ - { - "name": "Get Started with Nx Release", - "id": "get-started-with-nx-release", - "tags": ["nx-release"], - "file": "shared/recipes/nx-release/get-started-with-nx-release" - }, - { - "name": "Release Projects Independently", - "id": "release-projects-independently", - "tags": ["nx-release"], - "file": "shared/recipes/nx-release/release-projects-independently" - }, - { - "name": "Automatically Version with Conventional Commits", - "id": "automatically-version-with-conventional-commits", - "tags": ["nx-release"], - "file": "shared/recipes/nx-release/automatically-version-with-conventional-commits" - }, - { - "name": "Customize Conventional Commit Types", - "id": "customize-conventional-commit-types", - "tags": ["nx-release"], - "file": "shared/recipes/nx-release/customize-conventional-commit-types" - }, - { - "name": "File Based Versioning (Version Plans)", - "id": "file-based-versioning-version-plans", - "tags": ["nx-release"], - "file": "shared/recipes/nx-release/file-based-versioning-version-plans" - }, - { - "name": "Configure Custom Registries", - "id": "configure-custom-registries", - "tags": ["nx-release"], - "file": "shared/recipes/nx-release/configure-custom-registries" - }, - { - "name": "Publish in CI/CD", - "id": "publish-in-ci-cd", - "tags": ["nx-release"], - "file": "shared/recipes/nx-release/publish-in-ci-cd" - }, - { - "name": "Automate GitHub Releases", - "id": "automate-github-releases", - "tags": ["nx-release"], - "file": "shared/recipes/nx-release/automate-github-releases" - }, - { - "name": "Publish Rust Crates", - "id": "publish-rust-crates", - "tags": ["nx-release"], - "file": "shared/recipes/nx-release/publish-rust-crates" - }, - { - "name": "Update Your Local Registry Setup to use Nx Release", - "id": "update-local-registry-setup", - "tags": ["nx-release"], - "file": "shared/recipes/nx-release/update-local-registry-setup" - }, - { - "name": "Configure Changelog Format", - "id": "configure-changelog-format", - "tags": ["nx-release"], - "file": "shared/recipes/nx-release/configure-changelog-format" - }, - { - "name": "Publish a Custom Dist Directory", - "id": "publish-custom-dist-directory", - "tags": ["nx-release"], - "file": "shared/recipes/nx-release/publish-custom-dist-directory" - }, - { - "name": "Build Before Versioning", - "id": "build-before-versioning", - "tags": ["nx-release"], - "file": "shared/recipes/nx-release/build-before-versioning" - }, - { - "name": "Configuring Version Prefix for Dependency Versions", - "id": "configuration-version-prefix", - "tags": ["nx-release"], - "file": "shared/recipes/nx-release/configuration-version-prefix" - } - ] } ] }, diff --git a/docs/shared/reference/sitemap.md b/docs/shared/reference/sitemap.md index 0bdc6604bae83f..f9cee2cba49ce2 100644 --- a/docs/shared/reference/sitemap.md +++ b/docs/shared/reference/sitemap.md @@ -72,6 +72,31 @@ - [Import an Existing Project into an Nx Workspace](/recipes/adopting-nx/import-project) - [Preserving Git Histories](/recipes/adopting-nx/preserving-git-histories) - [Manual migration](/recipes/adopting-nx/manual) + - [Nx Release](/recipes/nx-release) + - [Get Started with Nx Release](/recipes/nx-release/get-started-with-nx-release) + - [Release Projects Independently](/recipes/nx-release/release-projects-independently) + - [Automatically Version with Conventional Commits](/recipes/nx-release/automatically-version-with-conventional-commits) + - [Customize Conventional Commit Types](/recipes/nx-release/customize-conventional-commit-types) + - [File Based Versioning (Version Plans)](/recipes/nx-release/file-based-versioning-version-plans) + - [Configure Custom Registries](/recipes/nx-release/configure-custom-registries) + - [Publish in CI/CD](/recipes/nx-release/publish-in-ci-cd) + - [Automate GitHub Releases](/recipes/nx-release/automate-github-releases) + - [Publish Rust Crates](/recipes/nx-release/publish-rust-crates) + - [Update Your Local Registry Setup to use Nx Release](/recipes/nx-release/update-local-registry-setup) + - [Configure Changelog Format](/recipes/nx-release/configure-changelog-format) + - [Publish a Custom Dist Directory](/recipes/nx-release/publish-custom-dist-directory) + - [Build Before Versioning](/recipes/nx-release/build-before-versioning) + - [Configuring Version Prefix for Dependency Versions](/recipes/nx-release/configuration-version-prefix) + - [Module Federation](/recipes/module-federation) + - [How to create a Module Federation Host Application](/recipes/module-federation/create-a-host) + - [How to create a Module Federation Remote Application](/recipes/module-federation/create-a-remote) + - [How to Federate a Module](/recipes/module-federation/federate-a-module) + - [Nx Console](/recipes/nx-console) + - [Telemetry](/recipes/nx-console/console-telemetry) + - [Project Details View](/recipes/nx-console/console-project-details) + - [Generate Command](/recipes/nx-console/console-generate-command) + - [Run Command](/recipes/nx-console/console-run-command) + - [Troubleshooting](/recipes/nx-console/console-troubleshooting) - [React](/recipes/react) - [React Native with Nx](/recipes/react/react-native) - [Remix with Nx](/recipes/react/remix) @@ -123,10 +148,6 @@ - [Webpack](/recipes/webpack) - [How to configure Webpack in your Nx workspace](/recipes/webpack/webpack-config-setup) - [Webpack plugins](/recipes/webpack/webpack-plugins) - - [Module Federation](/recipes/module-federation) - - [How to create a Module Federation Host Application](/recipes/module-federation/create-a-host) - - [How to create a Module Federation Remote Application](/recipes/module-federation/create-a-remote) - - [How to Federate a Module](/recipes/module-federation/federate-a-module) - [Enforce Module Boundaries](/recipes/enforce-module-boundaries) - [Ban Dependencies with Certain Tags](/recipes/enforce-module-boundaries/ban-dependencies-with-tags) - [Tag in Multiple Dimensions](/recipes/enforce-module-boundaries/tag-multiple-dimensions) @@ -149,27 +170,6 @@ - [Altering Migration Process](/recipes/tips-n-tricks/advanced-update) - [Using Yarn PnP](/recipes/tips-n-tricks/yarn-pnp) - [Switching to ESLint's flat config format](/recipes/tips-n-tricks/flat-config) - - [Nx Console](/recipes/nx-console) - - [Telemetry](/recipes/nx-console/console-telemetry) - - [Project Details View](/recipes/nx-console/console-project-details) - - [Generate Command](/recipes/nx-console/console-generate-command) - - [Run Command](/recipes/nx-console/console-run-command) - - [Troubleshooting](/recipes/nx-console/console-troubleshooting) - - [Nx Release](/recipes/nx-release) - - [Get Started with Nx Release](/recipes/nx-release/get-started-with-nx-release) - - [Release Projects Independently](/recipes/nx-release/release-projects-independently) - - [Automatically Version with Conventional Commits](/recipes/nx-release/automatically-version-with-conventional-commits) - - [Customize Conventional Commit Types](/recipes/nx-release/customize-conventional-commit-types) - - [File Based Versioning (Version Plans)](/recipes/nx-release/file-based-versioning-version-plans) - - [Configure Custom Registries](/recipes/nx-release/configure-custom-registries) - - [Publish in CI/CD](/recipes/nx-release/publish-in-ci-cd) - - [Automate GitHub Releases](/recipes/nx-release/automate-github-releases) - - [Publish Rust Crates](/recipes/nx-release/publish-rust-crates) - - [Update Your Local Registry Setup to use Nx Release](/recipes/nx-release/update-local-registry-setup) - - [Configure Changelog Format](/recipes/nx-release/configure-changelog-format) - - [Publish a Custom Dist Directory](/recipes/nx-release/publish-custom-dist-directory) - - [Build Before Versioning](/recipes/nx-release/build-before-versioning) - - [Configuring Version Prefix for Dependency Versions](/recipes/nx-release/configuration-version-prefix) - [Troubleshoot Nx Console Issues](/recipes/nx-console/console-troubleshooting) - [Enterprise](/nx-enterprise) - [Activate Powerpack](/nx-enterprise/activate-powerpack) From d2c1067a084f91c19a695c79c0cc89e26461b6fe Mon Sep 17 00:00:00 2001 From: Shantanu Jain Date: Mon, 11 Nov 2024 19:04:49 +0530 Subject: [PATCH 005/167] fix(release): support workspace root as a subdirectory of git root (#28650) --- .../nx/src/command-line/release/utils/git.ts | 30 +++++++++++++++++-- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/packages/nx/src/command-line/release/utils/git.ts b/packages/nx/src/command-line/release/utils/git.ts index 6f1b0d90ba373e..b20974d24f89a5 100644 --- a/packages/nx/src/command-line/release/utils/git.ts +++ b/packages/nx/src/command-line/release/utils/git.ts @@ -2,6 +2,7 @@ * Special thanks to changelogen for the original inspiration for many of these utilities: * https://github.com/unjs/changelogen */ +import { relative } from 'node:path'; import { interpolate } from '../../../tasks-runner/utils'; import { workspaceRoot } from '../../../utils/workspace-root'; import { execCommand } from './exec-command'; @@ -124,15 +125,21 @@ export async function getGitDiff( // Use a unique enough separator that we can be relatively certain will not occur within the commit message itself const separator = '§§§'; - // https://git-scm.com/docs/pretty-formats - const r = await execCommand('git', [ + const args = [ '--no-pager', 'log', range, `--pretty="----%n%s${separator}%h${separator}%an${separator}%ae%n%b"`, '--name-status', - ]); + ]; + // Support cases where the nx workspace root is located at a nested path within the git repo + const relativePath = await getGitRootRelativePath(); + if (relativePath) { + args.push(`--relative=${relativePath}`); + } + + const r = await execCommand('git', args); return r .split('----\n') @@ -558,3 +565,20 @@ export async function getFirstGitCommit() { throw new Error(`Unable to find first commit in git history`); } } + +async function getGitRoot() { + try { + return (await execCommand('git', ['rev-parse', '--show-toplevel'])).trim(); + } catch (e) { + throw new Error('Unable to find git root'); + } +} + +let gitRootRelativePath: string; +async function getGitRootRelativePath() { + if (!gitRootRelativePath) { + const gitRoot = await getGitRoot(); + gitRootRelativePath = relative(gitRoot, workspaceRoot); + } + return gitRootRelativePath; +} From 258a2566f1b361582567895629be0c1e30fb26df Mon Sep 17 00:00:00 2001 From: Jason Jean Date: Mon, 11 Nov 2024 09:01:20 -0500 Subject: [PATCH 006/167] fix(core): do not use unix dotfile locks (#28859) ## Current Behavior The unix dotfiles are incompatible with posix dotfiles. Having the 2 modes being switched between yields weird errors. ## Expected Behavior Posix dotfiles seem fine for what we're doing so Nx will stick with that mode for all cases. ## Related Issue(s) Fixes # --- packages/nx/src/native/db/initialize.rs | 28 +++++++------------------ 1 file changed, 7 insertions(+), 21 deletions(-) diff --git a/packages/nx/src/native/db/initialize.rs b/packages/nx/src/native/db/initialize.rs index 20e47072e2e257..5ad5264b334451 100644 --- a/packages/nx/src/native/db/initialize.rs +++ b/packages/nx/src/native/db/initialize.rs @@ -4,7 +4,6 @@ use rusqlite::{Connection, OpenFlags}; use std::fs::{remove_file, File}; use std::path::{Path, PathBuf}; use tracing::{debug, trace}; -use crate::native::utils::ci::is_ci; pub(super) struct LockFile { file: File, @@ -100,25 +99,13 @@ fn create_metadata_table(c: &mut NxDbConnection, nx_version: &str) -> anyhow::Re } fn open_database_connection(db_path: &Path) -> anyhow::Result { - let conn = if cfg!(target_family = "unix") && is_ci() { - trace!("Opening connection with unix-dotfile"); - Connection::open_with_flags_and_vfs( - db_path, - OpenFlags::SQLITE_OPEN_READ_WRITE - | OpenFlags::SQLITE_OPEN_CREATE - | OpenFlags::SQLITE_OPEN_URI - | OpenFlags::SQLITE_OPEN_FULL_MUTEX, - "unix-dotfile", - ) - } else { - Connection::open_with_flags( - db_path, - OpenFlags::SQLITE_OPEN_READ_WRITE - | OpenFlags::SQLITE_OPEN_CREATE - | OpenFlags::SQLITE_OPEN_URI - | OpenFlags::SQLITE_OPEN_FULL_MUTEX, - ) - }; + let conn = Connection::open_with_flags( + db_path, + OpenFlags::SQLITE_OPEN_READ_WRITE + | OpenFlags::SQLITE_OPEN_CREATE + | OpenFlags::SQLITE_OPEN_URI + | OpenFlags::SQLITE_OPEN_FULL_MUTEX, + ); conn.map_err(|e| anyhow::anyhow!("Error creating connection {:?}", e)) .map(NxDbConnection::new) @@ -139,7 +126,6 @@ fn configure_database(connection: &NxDbConnection) -> anyhow::Result<()> { #[cfg(test)] mod tests { - use crate::native::logger::enable_logger; use super::*; From cc251e4378c792729bb64e1e13fb6b01d1ef106f Mon Sep 17 00:00:00 2001 From: Benjamin Cabanes <3447705+bcabanes@users.noreply.github.com> Date: Mon, 11 Nov 2024 10:42:27 -0500 Subject: [PATCH 007/167] docs(nx-dev): use localstorage for livestream banner (#28880) --- nx-dev/ui-common/src/lib/live-stream-notifier.tsx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/nx-dev/ui-common/src/lib/live-stream-notifier.tsx b/nx-dev/ui-common/src/lib/live-stream-notifier.tsx index 872d0d5ac4c910..89bc8848a473bb 100644 --- a/nx-dev/ui-common/src/lib/live-stream-notifier.tsx +++ b/nx-dev/ui-common/src/lib/live-stream-notifier.tsx @@ -11,12 +11,12 @@ import { } from '@heroicons/react/24/outline'; export function LiveStreamNotifier(): ReactElement | null { + const [isMounted, setIsMounted] = useState(false); const [isVisible, setIsVisible] = useState(true); useEffect(() => { - const isClosedSession = sessionStorage.getItem( - 'live-stream-notifier-closed' - ); + setIsMounted(true); + const isClosedSession = localStorage.getItem('live-stream-notifier-closed'); if (isClosedSession === 'true') { setIsVisible(false); } @@ -25,10 +25,10 @@ export function LiveStreamNotifier(): ReactElement | null { const closeNotifier = (e: React.MouseEvent) => { e.stopPropagation(); setIsVisible(false); - sessionStorage.setItem('live-stream-notifier-closed', 'true'); + localStorage.setItem('live-stream-notifier-closed', 'true'); }; - if (!isVisible) return null; + if (!isMounted || !isVisible) return null; return ( Date: Mon, 11 Nov 2024 20:32:11 +0400 Subject: [PATCH 008/167] fix(core): cross-workspace implicitDependencies should be safely ignored (#28845) --- e2e/nx/src/misc.test.ts | 42 +++++++++++++++++++ .../nx/src/utils/assert-workspace-validity.ts | 5 ++- .../nx/src/utils/find-matching-projects.ts | 3 +- 3 files changed, 48 insertions(+), 2 deletions(-) diff --git a/e2e/nx/src/misc.test.ts b/e2e/nx/src/misc.test.ts index 7c7076b1e45386..34ce9fed33fc1a 100644 --- a/e2e/nx/src/misc.test.ts +++ b/e2e/nx/src/misc.test.ts @@ -767,3 +767,45 @@ describe('global installation', () => { }); }); }); + +describe('cross-workspace implicit dependencies', () => { + beforeAll(() => + newProject({ + packages: ['@nx/js'], + }) + ); + + afterAll(() => cleanupProject()); + + it('should successfully build a project graph when cross-workspace implicit dependencies are present', () => { + const npmPackage = uniq('npm-package'); + runCLI(`generate @nx/workspace:npm-package ${npmPackage}`); + + function setImplicitDependencies(deps: string[]) { + updateFile(join(npmPackage, 'package.json'), (content) => { + const json = JSON.parse(content); + json.nx = { + ...json.nx, + implicitDependencies: deps, + }; + return JSON.stringify(json, null, 2); + }); + } + + // First set the implicit dependencies to an intentionally invalid value to prove the command fails during project graph construction + setImplicitDependencies(['this-project-does-not-exist']); + expect( + runCLI(`test ${npmPackage}`, { + silenceError: true, + }) + ).toContain('Failed to process project graph'); + + // Now set the implicit dependencies to a cross-workspace reference to prove that it is valid, despite not being resolvable in the current workspace + setImplicitDependencies(['nx-cloud:another-workspace']); + expect( + runCLI(`test ${npmPackage}`, { + silenceError: true, + }) + ).toContain('Successfully ran target test'); + }); +}); diff --git a/packages/nx/src/utils/assert-workspace-validity.ts b/packages/nx/src/utils/assert-workspace-validity.ts index fe38108080195d..b9c76b8bd5118e 100644 --- a/packages/nx/src/utils/assert-workspace-validity.ts +++ b/packages/nx/src/utils/assert-workspace-validity.ts @@ -114,7 +114,10 @@ function detectAndSetInvalidProjectGlobValues( const projectName = implicit.startsWith('!') ? implicit.substring(1) : implicit; - + // Do not error on cross-workspace implicit dependency references + if (projectName.startsWith('nx-cloud:')) { + return false; + } return !( projectConfigurations[projectName] || findMatchingProjects([implicit], projects).length diff --git a/packages/nx/src/utils/find-matching-projects.ts b/packages/nx/src/utils/find-matching-projects.ts index b78e7197a8abc0..b119e653f46a9c 100644 --- a/packages/nx/src/utils/find-matching-projects.ts +++ b/packages/nx/src/utils/find-matching-projects.ts @@ -49,7 +49,8 @@ export function findMatchingProjects( } for (const stringPattern of patterns) { - if (!stringPattern.length) { + // Do not waste time attempting to look up cross-workspace references which will never match + if (!stringPattern.length || stringPattern.startsWith('nx-cloud:')) { continue; } From d4b9e0dc30527825a591aa763de5fc04d37b9a6d Mon Sep 17 00:00:00 2001 From: Nicholas Cunningham Date: Mon, 11 Nov 2024 09:57:25 -0700 Subject: [PATCH 009/167] fix(nextjs): update default next-env (#28861) ## Current Behavior The current next-env.d.ts is outdated so when you run `nx build` Next.js would update the `next-env.d.ts` file which would trigger git changes due to the outdated content. ## Expected Behavior When you run `nx build` the `next-env.d.ts` ideally should not update from what is generated OOTB. ## Related Issue(s) Fixes # --- e2e/next/src/__snapshots__/next.test.ts.snap | 19 +++++++++++++ e2e/next/src/next.test.ts | 28 +++++++++++++++++++ .../files/common/next-env.d.ts__tmpl__ | 2 +- .../lib/create-application-files.ts | 1 + 4 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 e2e/next/src/__snapshots__/next.test.ts.snap diff --git a/e2e/next/src/__snapshots__/next.test.ts.snap b/e2e/next/src/__snapshots__/next.test.ts.snap new file mode 100644 index 00000000000000..2149098288c63c --- /dev/null +++ b/e2e/next/src/__snapshots__/next.test.ts.snap @@ -0,0 +1,19 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Next.js Applications next-env.d.ts should remain the same after a build 1`] = ` +"/// +/// + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/app/building-your-application/configuring/typescript for more information. +" +`; + +exports[`Next.js Applications next-env.d.ts should remain the same after a build 2`] = ` +"/// +/// + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/pages/building-your-application/configuring/typescript for more information. +" +`; diff --git a/e2e/next/src/next.test.ts b/e2e/next/src/next.test.ts index 15c0afadf38e77..695c109ca01736 100644 --- a/e2e/next/src/next.test.ts +++ b/e2e/next/src/next.test.ts @@ -197,6 +197,34 @@ describe('Next.js Applications', () => { ); } }, 600_000); + + it('next-env.d.ts should remain the same after a build', async () => { + const appName = uniq('app'); + const pagesAppName = uniq('pages-app'); + + runCLI(`generate @nx/next:app ${appName} --style=css --no-interactive`); + runCLI( + `generate @nx/next:app ${pagesAppName} --appDir=false --style=css --no-interactive` + ); + + const appDirNextEnv = `${appName}/next-env.d.ts`; + const appDirNextEnvContent = readFile(appDirNextEnv); + + const pagesDirNextEnv = `${pagesAppName}/next-env.d.ts`; + const pagesDirNextEnvContent = readFile(pagesDirNextEnv); + + runCLI(`build ${appName}`); + runCLI(`build ${pagesAppName}`); + + const postBuildAppContent = readFile(appDirNextEnv); + const postBuildPagesContent = readFile(pagesDirNextEnv); + + expect(postBuildAppContent).toEqual(appDirNextEnvContent); + expect(postBuildAppContent).toMatchSnapshot(); + + expect(postBuildPagesContent).toEqual(pagesDirNextEnvContent); + expect(postBuildPagesContent).toMatchSnapshot(); + }); }); function getData(port, path = ''): Promise { diff --git a/packages/next/src/generators/application/files/common/next-env.d.ts__tmpl__ b/packages/next/src/generators/application/files/common/next-env.d.ts__tmpl__ index 4f11a03dc6cc37..d8b0ee36a63803 100644 --- a/packages/next/src/generators/application/files/common/next-env.d.ts__tmpl__ +++ b/packages/next/src/generators/application/files/common/next-env.d.ts__tmpl__ @@ -2,4 +2,4 @@ /// // NOTE: This file should not be edited -// see https://nextjs.org/docs/basic-features/typescript for more information. +// see https://nextjs.org/docs/<%- appDirType %>/building-your-application/configuring/typescript for more information. diff --git a/packages/next/src/generators/application/lib/create-application-files.ts b/packages/next/src/generators/application/lib/create-application-files.ts index d31c2a060bc1a6..143fd1840abdca 100644 --- a/packages/next/src/generators/application/lib/create-application-files.ts +++ b/packages/next/src/generators/application/lib/create-application-files.ts @@ -44,6 +44,7 @@ export function createApplicationFiles(host: Tree, options: NormalizedSchema) { dot: '.', tmpl: '', offsetFromRoot, + appDirType: options.appDir ? 'app' : 'pages', layoutTypeSrcPath, rootPath, layoutTypeDistPath, From 18bba6f4f7fc5e516eab0fb2a263abfa2965e219 Mon Sep 17 00:00:00 2001 From: Emily Xiong Date: Mon, 11 Nov 2024 09:46:55 -0800 Subject: [PATCH 010/167] fix(core): Remove warning when Nx is not installed globally (#28868) ## Current Behavior ## Expected Behavior ## Related Issue(s) Fixes # --- .../create-nx-plugin/bin/create-nx-plugin.ts | 3 --- .../bin/create-nx-workspace.ts | 3 --- .../src/utils/nx/show-nx-warning.ts | 26 ------------------- 3 files changed, 32 deletions(-) delete mode 100644 packages/create-nx-workspace/src/utils/nx/show-nx-warning.ts diff --git a/packages/create-nx-plugin/bin/create-nx-plugin.ts b/packages/create-nx-plugin/bin/create-nx-plugin.ts index 4b7be79b8cac0e..006a807f595bd5 100644 --- a/packages/create-nx-plugin/bin/create-nx-plugin.ts +++ b/packages/create-nx-plugin/bin/create-nx-plugin.ts @@ -19,7 +19,6 @@ import { createWorkspace, CreateWorkspaceOptions } from 'create-nx-workspace'; import { output } from 'create-nx-workspace/src/utils/output'; import { NxCloud } from 'create-nx-workspace/src/utils/nx/nx-cloud'; import type { PackageManager } from 'create-nx-workspace/src/utils/package-manager'; -import { showNxWarning } from 'create-nx-workspace/src/utils/nx/show-nx-warning'; import { messages, recordStat, @@ -150,8 +149,6 @@ async function main(parsedArgs: yargs.Arguments) { populatedArguments ); - showNxWarning(parsedArgs.pluginName); - await recordStat({ nxVersion, command: 'create-nx-workspace', diff --git a/packages/create-nx-workspace/bin/create-nx-workspace.ts b/packages/create-nx-workspace/bin/create-nx-workspace.ts index 44487ddf21b56e..8a25b98a627af9 100644 --- a/packages/create-nx-workspace/bin/create-nx-workspace.ts +++ b/packages/create-nx-workspace/bin/create-nx-workspace.ts @@ -25,7 +25,6 @@ import { withOptions, withPackageManager, } from '../src/internal-utils/yargs-options'; -import { showNxWarning } from '../src/utils/nx/show-nx-warning'; import { messages, recordStat } from '../src/utils/nx/ab-testing'; import { mapErrorToBodyLines } from '../src/utils/error-utils'; import { existsSync } from 'fs'; @@ -223,8 +222,6 @@ async function main(parsedArgs: yargs.Arguments) { parsedArgs ); - showNxWarning(parsedArgs.name); - await recordStat({ nxVersion, command: 'create-nx-workspace', diff --git a/packages/create-nx-workspace/src/utils/nx/show-nx-warning.ts b/packages/create-nx-workspace/src/utils/nx/show-nx-warning.ts deleted file mode 100644 index 0ed7295d9bba53..00000000000000 --- a/packages/create-nx-workspace/src/utils/nx/show-nx-warning.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { execSync } from 'child_process'; -import { resolve } from 'path'; -import { output } from '../output'; -import { getPackageManagerCommand } from '../package-manager'; - -export function showNxWarning(workspaceName: string) { - try { - const pathToRunNxCommand = resolve(process.cwd(), workspaceName); - execSync('nx --version', { - cwd: pathToRunNxCommand, - stdio: ['ignore', 'ignore', 'ignore'], - windowsHide: false, - }); - } catch (e) { - // no nx found - const { exec, globalAdd } = getPackageManagerCommand(); - output.addVerticalSeparator(); - output.note({ - title: `Nx CLI is not installed globally.`, - bodyLines: [ - `This means that you will have to use "${exec} nx" to execute commands in the workspace.`, - `Run "${globalAdd} nx" to be able to execute command directly.`, - ], - }); - } -} From f3889e487311920bc99b5814b37abcd7c5eb7681 Mon Sep 17 00:00:00 2001 From: Colum Ferry Date: Mon, 11 Nov 2024 19:11:39 +0000 Subject: [PATCH 011/167] feat(remix): ensure migrations point to latest remix verison (#28876) ## Current Behavior Latest migrations for Remix will install verions `2.13.1`. The latest version of remix packages is `2.14` We also were not updating auxillary @remix-run/* packages, including server adapters. ## Expected Behavior Ensure version `2.14` is installed Ensure auxillary packages are migrated ## Related Issue(s) Fixes # --- package.json | 4 +- packages/remix/migrations.json | 54 ++++++++++++++--- packages/remix/package.json | 2 +- .../remix/src/generators/init/init.spec.ts | 8 +-- packages/remix/src/utils/versions.ts | 2 +- pnpm-lock.yaml | 60 ++++++++++++------- 6 files changed, 92 insertions(+), 38 deletions(-) diff --git a/package.json b/package.json index d2f35769acb0f8..2249f4b4ccedbf 100644 --- a/package.json +++ b/package.json @@ -93,8 +93,8 @@ "@pmmmwh/react-refresh-webpack-plugin": "^0.5.7", "@pnpm/lockfile-types": "^6.0.0", "@reduxjs/toolkit": "1.9.0", - "@remix-run/dev": "^2.13.1", - "@remix-run/node": "^2.13.1", + "@remix-run/dev": "^2.14.0", + "@remix-run/node": "^2.14.0", "@rollup/plugin-babel": "^6.0.4", "@rollup/plugin-commonjs": "^25.0.7", "@rollup/plugin-image": "^3.0.3", diff --git a/packages/remix/migrations.json b/packages/remix/migrations.json index 6dd420c0aed805..0a2b0b2ed2ed69 100644 --- a/packages/remix/migrations.json +++ b/packages/remix/migrations.json @@ -133,31 +133,71 @@ } }, "20.1.0": { - "version": "20.1.0-beta.0", + "version": "20.1.0-beta.5", "packages": { "@remix-run/node": { - "version": "^2.13.1", + "version": "^2.14.0", "alwaysAddToPackageJson": true }, "@remix-run/react": { - "version": "^2.13.1", + "version": "^2.14.0", "alwaysAddToPackageJson": true }, "@remix-run/serve": { - "version": "^2.13.1", + "version": "^2.14.0", "alwaysAddToPackageJson": true }, "@remix-run/dev": { - "version": "^2.13.1", + "version": "^2.14.0", "alwaysAddToPackageJson": true }, "@remix-run/css-bundle": { - "version": "^2.13.1", + "version": "^2.14.0", "alwaysAddToPackageJson": true }, "@remix-run/eslint-config": { - "version": "^2.13.1", + "version": "^2.14.0", "alwaysAddToPackageJson": true + }, + "@remix-run/server-runtime": { + "version": "^2.14.0", + "alwaysAddToPackageJson": false + }, + "@remix-run/testing": { + "version": "^2.14.0", + "alwaysAddToPackageJson": false + }, + "@remix-run/express": { + "version": "^2.14.0", + "alwaysAddToPackageJson": false + }, + "@remix-run/cloudflare": { + "version": "^2.14.0", + "alwaysAddToPackageJson": false + }, + "@remix-run/cloudflare-pages": { + "version": "^2.14.0", + "alwaysAddToPackageJson": false + }, + "@remix-run/cloudflare-workers": { + "version": "^2.14.0", + "alwaysAddToPackageJson": false + }, + "@remix-run/architect": { + "version": "^2.14.0", + "alwaysAddToPackageJson": false + }, + "@remix-run/deno": { + "version": "^2.14.0", + "alwaysAddToPackageJson": false + }, + "@remix-run/route-config": { + "version": "^2.14.0", + "alwaysAddToPackageJson": false + }, + "@remix-run/fs-routes": { + "version": "^2.14.0", + "alwaysAddToPackageJson": false } } } diff --git a/packages/remix/package.json b/packages/remix/package.json index b98b902165bf54..d4bead6e317a26 100644 --- a/packages/remix/package.json +++ b/packages/remix/package.json @@ -36,7 +36,7 @@ "@phenomnomnominal/tsquery": "~5.0.1" }, "peerDependencies": { - "@remix-run/dev": "^2.13.1" + "@remix-run/dev": "^2.14.0" }, "publishConfig": { "access": "public" diff --git a/packages/remix/src/generators/init/init.spec.ts b/packages/remix/src/generators/init/init.spec.ts index 8fc1d44e83ef14..e846bdc6be2517 100644 --- a/packages/remix/src/generators/init/init.spec.ts +++ b/packages/remix/src/generators/init/init.spec.ts @@ -18,13 +18,13 @@ describe('Remix Init Generator', () => { const pkgJson = readJson(tree, 'package.json'); expect(pkgJson.dependencies).toMatchInlineSnapshot(` { - "@remix-run/serve": "^2.13.1", + "@remix-run/serve": "^2.14.0", } `); expect(pkgJson.devDependencies).toMatchInlineSnapshot(` { "@nx/web": "0.0.1", - "@remix-run/dev": "^2.13.1", + "@remix-run/dev": "^2.14.0", } `); @@ -70,13 +70,13 @@ describe('Remix Init Generator', () => { const pkgJson = readJson(tree, 'package.json'); expect(pkgJson.dependencies).toMatchInlineSnapshot(` { - "@remix-run/serve": "^2.13.1", + "@remix-run/serve": "^2.14.0", } `); expect(pkgJson.devDependencies).toMatchInlineSnapshot(` { "@nx/web": "0.0.1", - "@remix-run/dev": "^2.13.1", + "@remix-run/dev": "^2.14.0", } `); }); diff --git a/packages/remix/src/utils/versions.ts b/packages/remix/src/utils/versions.ts index b399a2828f0e66..840e5f4100da0f 100644 --- a/packages/remix/src/utils/versions.ts +++ b/packages/remix/src/utils/versions.ts @@ -2,7 +2,7 @@ import { readJson, Tree } from '@nx/devkit'; export const nxVersion = require('../../package.json').version; -export const remixVersion = '^2.13.1'; +export const remixVersion = '^2.14.0'; export const isbotVersion = '^4.4.0'; export const reactVersion = '^18.2.0'; export const reactDomVersion = '^18.2.0'; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 10c855cae95c66..8cac4a012c0576 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -368,11 +368,11 @@ importers: specifier: 1.9.0 version: 1.9.0(react-redux@8.0.5(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(redux@4.2.1))(react@18.3.1) '@remix-run/dev': - specifier: ^2.13.1 - version: 2.13.1(@remix-run/react@2.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4))(@types/node@20.16.10)(less@4.1.3)(sass@1.55.0)(stylus@0.64.0)(terser@5.31.6)(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.5.4))(typescript@5.5.4)(vite@5.0.8(@types/node@20.16.10)(less@4.1.3)(sass@1.55.0)(stylus@0.64.0)(terser@5.31.6)) + specifier: ^2.14.0 + version: 2.14.0(@remix-run/react@2.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4))(@types/node@20.16.10)(less@4.1.3)(sass@1.55.0)(stylus@0.64.0)(terser@5.31.6)(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.5.4))(typescript@5.5.4)(vite@5.0.8(@types/node@20.16.10)(less@4.1.3)(sass@1.55.0)(stylus@0.64.0)(terser@5.31.6)) '@remix-run/node': - specifier: ^2.13.1 - version: 2.13.1(typescript@5.5.4) + specifier: ^2.14.0 + version: 2.14.0(typescript@5.5.4) '@rollup/plugin-babel': specifier: ^6.0.4 version: 6.0.4(@babel/core@7.25.2)(@types/babel__core@7.20.5)(rollup@4.22.0) @@ -5323,13 +5323,13 @@ packages: react-redux: optional: true - '@remix-run/dev@2.13.1': - resolution: {integrity: sha512-7+06Dail6zMyRlRvgrZ4cmQjs2gUb+M24iP4jbmql+0B7VAAPwzCRU0x+BF5z8GSef13kDrH3iXv/BQ2O2yOgw==} + '@remix-run/dev@2.14.0': + resolution: {integrity: sha512-WMun4fy0ANh92WecufUNb3IV/R02uyfBslM7g7nCO1/lzDII+XmfEkZY5CWPaLmnkoAc1DR2G60+eTHRo480Ug==} engines: {node: '>=18.0.0'} hasBin: true peerDependencies: - '@remix-run/react': ^2.13.1 - '@remix-run/serve': ^2.13.1 + '@remix-run/react': ^2.14.0 + '@remix-run/serve': ^2.14.0 typescript: ^5.1.0 vite: ^5.1.0 wrangler: ^3.28.2 @@ -5343,8 +5343,8 @@ packages: wrangler: optional: true - '@remix-run/node@2.13.1': - resolution: {integrity: sha512-2ly7bENj2n2FNBdEN60ZEbNCs5dAOex/QJoo6EZ8RNFfUQxVKAZkMwfQ4ETV2SLWDgkRLj3Jo5n/dx7O2ZGhGw==} + '@remix-run/node@2.14.0': + resolution: {integrity: sha512-ou16LMJYv0ElIToZ6dDqaLjv1T3iBEwuJTBahveEA8NkkACIWODJ2fgUYf1UKLMKHVdHjNImLzS37HdSZY0Q6g==} engines: {node: '>=18.0.0'} peerDependencies: typescript: ^5.1.0 @@ -5367,8 +5367,8 @@ packages: resolution: {integrity: sha512-baiMx18+IMuD1yyvOGaHM9QrVUPGGG0jC+z+IPHnRJWUAUvaKuWKyE8gjDj2rzv3sz9zOGoRSPgeBVHRhZnBlA==} engines: {node: '>=14.0.0'} - '@remix-run/router@1.20.0': - resolution: {integrity: sha512-mUnk8rPJBI9loFDZ+YzPGdeniYK+FTmRD1TMCz7ev2SNIozyKKpnGgsxO34u6Z4z/t0ITuu7voi/AshfsGsgFg==} + '@remix-run/router@1.21.0': + resolution: {integrity: sha512-xfSkCAchbdG5PnbrKqFWwia4Bi61nH+wm8wLEqfHDyp7Y3dZzgqS2itV8i4gAq9pC2HsTpwyBC6Ds8VHZ96JlA==} engines: {node: '>=14.0.0'} '@remix-run/server-runtime@2.12.0': @@ -5380,8 +5380,8 @@ packages: typescript: optional: true - '@remix-run/server-runtime@2.13.1': - resolution: {integrity: sha512-2DfBPRcHKVzE4bCNsNkKB50BhCCKF73x+jiS836OyxSIAL+x0tguV2AEjmGXefEXc5AGGzoxkus0AUUEYa29Vg==} + '@remix-run/server-runtime@2.14.0': + resolution: {integrity: sha512-9Th9UzDaoFFBD7zA5mRI1KT8JktFLN4ij9jPygrKBhG/kYmNIvhcMtq9VyjcbMvFK5natTyhOhrrKRIHtijD4w==} engines: {node: '>=18.0.0'} peerDependencies: typescript: ^5.1.0 @@ -16478,6 +16478,14 @@ packages: resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} engines: {node: '>=10.12.0'} + valibot@0.41.0: + resolution: {integrity: sha512-igDBb8CTYr8YTQlOKgaN9nSS0Be7z+WRuaeYqGf3Cjz3aKmSnqEmYnkfVjzIuumGqfHpa3fLIvMEAfhrpqN8ng==} + peerDependencies: + typescript: '>=5' + peerDependenciesMeta: + typescript: + optional: true + validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} @@ -22645,7 +22653,7 @@ snapshots: react: 18.3.1 react-redux: 8.0.5(@types/react-dom@18.3.0)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(redux@4.2.1) - '@remix-run/dev@2.13.1(@remix-run/react@2.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4))(@types/node@20.16.10)(less@4.1.3)(sass@1.55.0)(stylus@0.64.0)(terser@5.31.6)(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.5.4))(typescript@5.5.4)(vite@5.0.8(@types/node@20.16.10)(less@4.1.3)(sass@1.55.0)(stylus@0.64.0)(terser@5.31.6))': + '@remix-run/dev@2.14.0(@remix-run/react@2.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4))(@types/node@20.16.10)(less@4.1.3)(sass@1.55.0)(stylus@0.64.0)(terser@5.31.6)(ts-node@10.9.1(@swc/core@1.5.7(@swc/helpers@0.5.11))(@types/node@20.16.10)(typescript@5.5.4))(typescript@5.5.4)(vite@5.0.8(@types/node@20.16.10)(less@4.1.3)(sass@1.55.0)(stylus@0.64.0)(terser@5.31.6))': dependencies: '@babel/core': 7.25.2 '@babel/generator': 7.25.6 @@ -22657,10 +22665,10 @@ snapshots: '@babel/types': 7.25.6 '@mdx-js/mdx': 2.3.0 '@npmcli/package-json': 4.0.1 - '@remix-run/node': 2.13.1(typescript@5.5.4) + '@remix-run/node': 2.14.0(typescript@5.5.4) '@remix-run/react': 2.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4) - '@remix-run/router': 1.20.0 - '@remix-run/server-runtime': 2.13.1(typescript@5.5.4) + '@remix-run/router': 1.21.0 + '@remix-run/server-runtime': 2.14.0(typescript@5.5.4) '@types/mdx': 2.0.13 '@vanilla-extract/integration': 6.5.0(@types/node@20.16.10)(less@4.1.3)(sass@1.55.0)(stylus@0.64.0)(terser@5.31.6) arg: 5.0.2 @@ -22700,6 +22708,8 @@ snapshots: set-cookie-parser: 2.7.0 tar-fs: 2.1.1 tsconfig-paths: 4.2.0 + valibot: 0.41.0(typescript@5.5.4) + vite-node: 1.6.0(@types/node@20.16.10)(less@4.1.3)(sass@1.55.0)(stylus@0.64.0)(terser@5.31.6) ws: 7.5.10 optionalDependencies: typescript: 5.5.4 @@ -22720,9 +22730,9 @@ snapshots: - ts-node - utf-8-validate - '@remix-run/node@2.13.1(typescript@5.5.4)': + '@remix-run/node@2.14.0(typescript@5.5.4)': dependencies: - '@remix-run/server-runtime': 2.13.1(typescript@5.5.4) + '@remix-run/server-runtime': 2.14.0(typescript@5.5.4) '@remix-run/web-fetch': 4.4.2 '@web3-storage/multipart-parser': 1.0.0 cookie-signature: 1.2.1 @@ -22746,7 +22756,7 @@ snapshots: '@remix-run/router@1.19.2': {} - '@remix-run/router@1.20.0': {} + '@remix-run/router@1.21.0': {} '@remix-run/server-runtime@2.12.0(typescript@5.5.4)': dependencies: @@ -22760,9 +22770,9 @@ snapshots: optionalDependencies: typescript: 5.5.4 - '@remix-run/server-runtime@2.13.1(typescript@5.5.4)': + '@remix-run/server-runtime@2.14.0(typescript@5.5.4)': dependencies: - '@remix-run/router': 1.20.0 + '@remix-run/router': 1.21.0 '@types/cookie': 0.6.0 '@web3-storage/multipart-parser': 1.0.0 cookie: 0.6.0 @@ -36520,6 +36530,10 @@ snapshots: '@types/istanbul-lib-coverage': 2.0.6 convert-source-map: 2.0.0 + valibot@0.41.0(typescript@5.5.4): + optionalDependencies: + typescript: 5.5.4 + validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.2.0 From 37e31bea57e79993841859957b5f8f05baa0d225 Mon Sep 17 00:00:00 2001 From: Isaac Mann Date: Mon, 11 Nov 2024 14:15:17 -0500 Subject: [PATCH 012/167] docs(core): fix search indexing errors (#28858) Fix search indexing errors --- ...rapped-to-venture-backed-nx-raises-8-6m.md | 2 +- ...-with-server-side-rendering-for-angular.md | 2 +- .../2023-01-18-nx-console-meets-nx-cloud.md | 6 +- ...de-support-angular-lts-lockfile-pruning.md | 2 +- .../2024-08-28-nxcloud-improved-ci-log.md | 2 +- ...-next-gen-module-federation-deployments.md | 2 +- docs/changelog/15_4_0.md | 2 +- .../angular/generators/component-test.json | 2 +- .../react/generators/component-test.json | 2 +- docs/packages.json | 2 - docs/shared/tutorials/angular-monorepo.md | 1 - docs/shared/tutorials/react-monorepo.md | 1 - docs/shared/tutorials/react-standalone.md | 1 - nx-dev/nx-dev/redirect-rules.js | 2 - .../ui-common/src/lib/sidebar-container.tsx | 128 +----------------- .../docs/component-cypress-spec-examples.md | 15 -- .../angular/docs/component-test-examples.md | 6 - .../react/docs/component-test-examples.md | 4 +- 18 files changed, 15 insertions(+), 167 deletions(-) delete mode 100644 packages/angular/docs/component-cypress-spec-examples.md diff --git a/docs/blog/2022-11-17-from-bootstrapped-to-venture-backed-nx-raises-8-6m.md b/docs/blog/2022-11-17-from-bootstrapped-to-venture-backed-nx-raises-8-6m.md index bdcf52eefa10c3..78e6971a4cdb79 100644 --- a/docs/blog/2022-11-17-from-bootstrapped-to-venture-backed-nx-raises-8-6m.md +++ b/docs/blog/2022-11-17-from-bootstrapped-to-venture-backed-nx-raises-8-6m.md @@ -15,7 +15,7 @@ When Victor Savkin and I left Google to start this company in December 2016, we ![](/blog/images/2022-11-17/WIkl00uLsSt6p6dmQbIA0g.avif) -[Nx Cloud](/nx-cloud) has also seen a significant uptake in adoption, thanks in large part due to the addition of [Distributed Task Execution](/ci/concepts/parallelization-distribution) last year. With the combination of Distributed Task Execution and Distributed Caching, Nx Cloud is having a massive impact on the time it takes to validate and merge pull requests, drastically reducing product time-to-market. There are now more than 100k connected Nx Workspaces on nx.app. With Nx Cloud, Nx and Lerna workspaces can drastically reduce build times by letting Nx Cloud manage task cache distribution, and optimal distribution of tasks across many machines using Nx’s deep understanding of project relationships and task timings. We’ve determined that Nx and Nx Cloud have [saved over 250 years of compute time](blog/helping-the-environment-by-saving-two-centuries-of-compute-time) since we started measuring. +[Nx Cloud](/nx-cloud) has also seen a significant uptake in adoption, thanks in large part due to the addition of [Distributed Task Execution](/ci/concepts/parallelization-distribution) last year. With the combination of Distributed Task Execution and Distributed Caching, Nx Cloud is having a massive impact on the time it takes to validate and merge pull requests, drastically reducing product time-to-market. There are now more than 100k connected Nx Workspaces on nx.app. With Nx Cloud, Nx and Lerna workspaces can drastically reduce build times by letting Nx Cloud manage task cache distribution, and optimal distribution of tasks across many machines using Nx’s deep understanding of project relationships and task timings. We’ve determined that Nx and Nx Cloud have [saved over 250 years of compute time](/blog/helping-the-environment-by-saving-two-centuries-of-compute-time) since we started measuring. ![](/blog/images/2022-11-17/ysWZ8fn2K3m3GjCNGRwshw.avif) diff --git a/docs/blog/2023-01-10-setting-up-module-federation-with-server-side-rendering-for-angular.md b/docs/blog/2023-01-10-setting-up-module-federation-with-server-side-rendering-for-angular.md index 7f2f20d70af48f..c03b6fe6808e67 100644 --- a/docs/blog/2023-01-10-setting-up-module-federation-with-server-side-rendering-for-angular.md +++ b/docs/blog/2023-01-10-setting-up-module-federation-with-server-side-rendering-for-angular.md @@ -19,7 +19,7 @@ However, until now, it has only supported Client-Side Rendering (CSR). Essential > [What is server-side rendering: definition, benefits and risks](https://solutionshub.epam.com/blog/post/what-is-server-side-rendering) -Since [version 15.4](blog/nx-15-4-vite-4-support-a-new-nx-watch-command-and-more), Nx now offers Module Federation with support for SSR! 🎉 +Since [version 15.4](/blog/nx-15-4-vite-4-support-a-new-nx-watch-command-and-more), Nx now offers Module Federation with support for SSR! 🎉 Now we can get both, the benefits of Module Federation and SSR in our Nx Workspaces! diff --git a/docs/blog/2023-01-18-nx-console-meets-nx-cloud.md b/docs/blog/2023-01-18-nx-console-meets-nx-cloud.md index 004b8079598875..ff8d957bd8ff2d 100644 --- a/docs/blog/2023-01-18-nx-console-meets-nx-cloud.md +++ b/docs/blog/2023-01-18-nx-console-meets-nx-cloud.md @@ -110,7 +110,7 @@ To set it up, just click on the button in the Nx Console cloud view and follow t ## Learn more - 🧠 [Nx Docs](/getting-started/intro) -- 👩‍💻 [Nx GitHub](<[https://github.com/nrwl/nx](https://github.com/nrwl/nx)>) -- 🎮 [Nx Console GitHub](<[https://github.com/nrwl/nx-console](https://github.com/nrwl/nx-console)>) +- 👩‍💻 [Nx GitHub](https://github.com/nrwl/nx) +- 🎮 [Nx Console GitHub](https://github.com/nrwl/nx-console) - 💬 [Nx Official Discord Server](https://go.nx.dev/community) -- 📹 [Nx Youtube Channel](<[https://www.youtube.com/@nxdevtools](https://www.youtube.com/@nxdevtools)>) +- 📹 [Nx Youtube Channel](https://www.youtube.com/@nxdevtools) diff --git a/docs/blog/2023-02-16-nx-15-7-node-support-angular-lts-lockfile-pruning.md b/docs/blog/2023-02-16-nx-15-7-node-support-angular-lts-lockfile-pruning.md index 44e129ad1cac45..16f3a152c2c671 100644 --- a/docs/blog/2023-02-16-nx-15-7-node-support-angular-lts-lockfile-pruning.md +++ b/docs/blog/2023-02-16-nx-15-7-node-support-angular-lts-lockfile-pruning.md @@ -128,7 +128,7 @@ const lockFile = createLockFile(packageJson); // save files using e.g. `fs.writeFileSync` ``` -Stay tuned for a more in-depth blog post coming soon to [our blog](blog). +Stay tuned for a more in-depth blog post coming soon to [our blog](/blog). ## Storybook 7.0 beta support diff --git a/docs/blog/2024-08-28-nxcloud-improved-ci-log.md b/docs/blog/2024-08-28-nxcloud-improved-ci-log.md index 1e655762def258..e36b6daff14af0 100644 --- a/docs/blog/2024-08-28-nxcloud-improved-ci-log.md +++ b/docs/blog/2024-08-28-nxcloud-improved-ci-log.md @@ -39,7 +39,7 @@ This command will guide you through the setup. We recently introduced a [new Hob ## Learn More -- [Nx on CI](/ci) +- [Nx on CI](/ci/intro/ci-with-nx) - [Task Distribution with Nx Agents](/ci/features/distribute-task-execution) - [Automated e2e Test Splitting](/ci/features/split-e2e-tasks) - [X/Twitter](https://twitter.com/nxdevtools) -- [LinkedIn](https://www.linkedin.com/company/nrwl/) diff --git a/docs/blog/2024-09-12-next-gen-module-federation-deployments.md b/docs/blog/2024-09-12-next-gen-module-federation-deployments.md index ad35f533b16b00..48888388e7c4a9 100644 --- a/docs/blog/2024-09-12-next-gen-module-federation-deployments.md +++ b/docs/blog/2024-09-12-next-gen-module-federation-deployments.md @@ -479,7 +479,7 @@ For more information about Zephyr Cloud I highly recommend checking out their [d ## Learn More -- [Nx on CI](/ci) +- [Nx on CI](/ci/intro/ci-with-nx) - [Task Distribution with Nx Agents](/ci/features/distribute-task-execution) - [Automated e2e Test Splitting](/ci/features/split-e2e-tasks) - [X/Twitter](https://twitter.com/nxdevtools) -- [LinkedIn](https://www.linkedin.com/company/nrwl/) diff --git a/docs/changelog/15_4_0.md b/docs/changelog/15_4_0.md index 5e79ef0d7401e5..f2c2b36ebbea2a 100644 --- a/docs/changelog/15_4_0.md +++ b/docs/changelog/15_4_0.md @@ -1,6 +1,6 @@ # Nx 15.4 -[Read the 15.4 release blog post](https://blog.nrwl.io/nx-15-4-vite-4-support-a-new-nx-watch-command-and-more-77cbf6c9a711) +[Read the 15.4 release blog post](/blog/nx-15-4-vite-4-support-a-new-nx-watch-command-and-more) {% youtube src="https://www.youtube.com/embed/G02THNy3PcE" diff --git a/docs/generated/packages/angular/generators/component-test.json b/docs/generated/packages/angular/generators/component-test.json index 2c274381df7262..2fd0f366b4fa71 100644 --- a/docs/generated/packages/angular/generators/component-test.json +++ b/docs/generated/packages/angular/generators/component-test.json @@ -51,7 +51,7 @@ "componentDir", "componentFileName" ], - "examplesFile": "{% callout type=\"caution\" title=\"Can I use component testing?\" %}\nAngular component testing with Nx requires **Cypress version 10.7.0** and up.\n\nYou can migrate with to v11 via the [migrate-to-cypress-11 generator](/nx-api/cypress/generators/migrate-to-cypress-11).\n\nThis generator is for Cypress based component testing.\n\nIf you're wanting to create Cypress tests for a Storybook story, then check out the [component-cypress-spec generator docs](/nx-api/angular/generators/component-cypress-spec)\n\nIf you're wanting to create Storybook stories for a component, then check out the [stories generator docs](/nx-api/angular/generators/stories) or [component-story generator docs](/nx-api/angular/generators/component-cypress-spec)\n{% /callout %}\n\nThis generator is used to create a Cypress component test file for a given Angular component.\n\n```shell\nnx g @nx/angular:component-test --project=my-cool-angular-project --componentName=CoolBtnComponent --componentDir=src/cool-btn --componentFileName=cool-btn.component\n```\n\nTest file are generated with the `.cy.ts` suffix. this is to prevent colliding with any existing `.spec.` files contained in the project.\n\nIt's currently expected the generated `.cy.ts` file will live side by side with the component. It is also assumed the project is already setup for component testing. If it isn't, then you can run the [cypress-component-project generator](/nx-api/angular/generators/cypress-component-configuration) to set up the project for component testing.\n", + "examplesFile": "{% callout type=\"caution\" title=\"Can I use component testing?\" %}\nAngular component testing with Nx requires **Cypress version 10.7.0** and up.\n\nYou can migrate with to v11 via the [migrate-to-cypress-11 generator](/nx-api/cypress/generators/migrate-to-cypress-11).\n{% /callout %}\n\nThis generator is used to create a Cypress component test file for a given Angular component.\n\n```shell\nnx g @nx/angular:component-test --project=my-cool-angular-project --componentName=CoolBtnComponent --componentDir=src/cool-btn --componentFileName=cool-btn.component\n```\n\nTest file are generated with the `.cy.ts` suffix. this is to prevent colliding with any existing `.spec.` files contained in the project.\n\nIt's currently expected the generated `.cy.ts` file will live side by side with the component. It is also assumed the project is already setup for component testing. If it isn't, then you can run the [cypress-component-project generator](/nx-api/angular/generators/cypress-component-configuration) to set up the project for component testing.\n", "presets": [] }, "description": "Creates a cypress component test file for a component.", diff --git a/docs/generated/packages/react/generators/component-test.json b/docs/generated/packages/react/generators/component-test.json index 9ede1d15287bbe..9e23c780fdb695 100644 --- a/docs/generated/packages/react/generators/component-test.json +++ b/docs/generated/packages/react/generators/component-test.json @@ -30,7 +30,7 @@ } }, "required": ["project", "componentPath"], - "examplesFile": "{% callout type=\"caution\" title=\"Can I use component testing?\" %}\nReact component testing with Nx requires **Cypress version 10** and up.\n\nYou can migrate with to v11 via the [migrate-to-cypress-11 generator](/nx-api/cypress/generators/migrate-to-cypress-11).\n\nThis generator is for Cypress based component testing.\n\nIf you're wanting to create Cypress tests for a Storybook story, then check out the [component-cypress-spec generator docs](/nx-api/react/generators/component-cypress-spec)\n\nIf you're wanting to create Storybook stories for a component, then check out the [stories generator docs](/nx-api/react/generators/stories) or [component-story generator docs](/nx-api/react/generators/component-cypress-spec)\n\n{% /callout %}\n\nThis generator is used to create a Cypress component test file for a given React component.\n\n```shell\nnx g @nx/react:component-test --project=my-cool-react-project --componentPath=src/my-fancy-button.tsx\n```\n\nTest file are generated with the `.cy.` suffix. this is to prevent colliding with any existing `.spec.` files contained in the project.\n\nIt's currently expected the generated `.cy.` file will live side by side with the component. It is also assumed the project is already setup for component testing. If it isn't, then you can run the [cypress-component-project generator](/nx-api/react/generators/cypress-component-configuration) to set up the project for component testing.\n", + "examplesFile": "{% callout type=\"caution\" title=\"Can I use component testing?\" %}\nReact component testing with Nx requires **Cypress version 10** and up.\n\nYou can migrate with to v11 via the [migrate-to-cypress-11 generator](/nx-api/cypress/generators/migrate-to-cypress-11).\n\nThis generator is for Cypress based component testing.\n\nIf you're wanting to create Storybook stories for a component, then check out the [stories generator docs](/nx-api/react/generators/stories)\n\n{% /callout %}\n\nThis generator is used to create a Cypress component test file for a given React component.\n\n```shell\nnx g @nx/react:component-test --project=my-cool-react-project --componentPath=src/my-fancy-button.tsx\n```\n\nTest file are generated with the `.cy.` suffix. this is to prevent colliding with any existing `.spec.` files contained in the project.\n\nIt's currently expected the generated `.cy.` file will live side by side with the component. It is also assumed the project is already setup for component testing. If it isn't, then you can run the [cypress-component-project generator](/nx-api/react/generators/cypress-component-configuration) to set up the project for component testing.\n", "presets": [] }, "description": "Generate a Cypress component test for a React component", diff --git a/docs/packages.json b/docs/packages.json index 1e85f60e6e03ef..70c86ce54396b8 100644 --- a/docs/packages.json +++ b/docs/packages.json @@ -19,7 +19,6 @@ "add-linting", "application", "component", - "component-cypress-spec", "component-story", "component-test", "downgrade-module", @@ -278,7 +277,6 @@ "storybook-configuration", "component-story", "stories", - "component-cypress-spec", "hook", "host", "remote", diff --git a/docs/shared/tutorials/angular-monorepo.md b/docs/shared/tutorials/angular-monorepo.md index 1122dcc1b55904..9489c6cd747d5d 100644 --- a/docs/shared/tutorials/angular-monorepo.md +++ b/docs/shared/tutorials/angular-monorepo.md @@ -200,7 +200,6 @@ NX Capabilities in @nx/angular: add-linting : Adds linting configuration to an Angular project. application : Creates an Angular application. component : Generate an Angular Component. - component-cypress-spec : Creates a Cypress spec for a UI component that has a story. component-story : Creates a stories.ts file for a component. component-test : Creates a cypress component test file for a component. convert-tslint-to-eslint : Converts a project from TSLint to ESLint. diff --git a/docs/shared/tutorials/react-monorepo.md b/docs/shared/tutorials/react-monorepo.md index 2e00fa7aa55a21..064fde5f65e1b0 100644 --- a/docs/shared/tutorials/react-monorepo.md +++ b/docs/shared/tutorials/react-monorepo.md @@ -250,7 +250,6 @@ NX Capabilities in @nx/react: storybook-configuration : Set up storybook for a React app or library. component-story : Generate storybook story for a React component stories : Create stories/specs for all components declared in an app or library. - component-cypress-spec : Create a Cypress spec for a UI component that has a story. hook : Create a hook. cypress-component-configuration : Setup Cypress component testing for a React project component-test : Generate a Cypress component test for a React component diff --git a/docs/shared/tutorials/react-standalone.md b/docs/shared/tutorials/react-standalone.md index 92bcbfc13eaacf..3c20f700d888cc 100644 --- a/docs/shared/tutorials/react-standalone.md +++ b/docs/shared/tutorials/react-standalone.md @@ -351,7 +351,6 @@ redux : Create a Redux slice for a project. storybook-configuration : Set up storybook for a React app or library. component-story : Generate storybook story for a React component stories : Create stories/specs for all components declared in an app or library. -component-cypress-spec : Create a Cypress spec for a UI component that has a story. hook : Create a hook. host : Generate a host react application remote : Generate a remote react application diff --git a/nx-dev/nx-dev/redirect-rules.js b/nx-dev/nx-dev/redirect-rules.js index 4bc4bb7b87d412..944499744e5179 100644 --- a/nx-dev/nx-dev/redirect-rules.js +++ b/nx-dev/nx-dev/redirect-rules.js @@ -66,8 +66,6 @@ const schemaUrls = { '/packages/angular/executors/dev-server', '/react/application': '/packages/react/generators/application', '/react/component': '/packages/react/generators/component', - '/react/component-cypress-spec': - '/packages/react/generators/component-cypress-spec', '/react/component-story': '/packages/react/generators/component-story', '/react/library': '/packages/react/generators/library', '/react/redux': '/packages/react/generators/redux', diff --git a/nx-dev/ui-common/src/lib/sidebar-container.tsx b/nx-dev/ui-common/src/lib/sidebar-container.tsx index b0637f7d1d2385..61c304df7ac03a 100644 --- a/nx-dev/ui-common/src/lib/sidebar-container.tsx +++ b/nx-dev/ui-common/src/lib/sidebar-container.tsx @@ -1,107 +1,6 @@ 'use client'; -import { Menu, MenuItem, MenuSection } from '@nx/nx-dev/models-menu'; +import { Menu } from '@nx/nx-dev/models-menu'; import { Sidebar, SidebarMobile } from './sidebar'; -import { useMemo } from 'react'; - -// TODO(jack): Remove this rspack modification once we move rspack into main repo (when stable). -const rspackSection = { - id: 'rspack', - name: 'rspack', - itemList: [ - { - id: 'documents', - path: '/nx-api/rspack/documents', - name: 'documents', - children: [ - { - name: 'Overview of the Nx Rspack plugin', - path: '/nx-api/rspack/documents/overview', - id: 'overview', - isExternal: false, - children: [], - disableCollapsible: false, - }, - { - name: 'Rspack plugins', - path: '/nx-api/rspack/documents/rspack-plugins', - id: 'rspack-plugins', - isExternal: false, - children: [], - disableCollapsible: false, - }, - { - name: 'How to configure Rspack in your Nx workspace', - path: '/nx-api/rspack/documents/rspack-config-setup', - id: 'rspack-config-setup', - isExternal: false, - children: [], - disableCollapsible: false, - }, - ], - isExternal: false, - disableCollapsible: false, - }, - { - id: 'executors', - path: '/nx-api/rspack/executors', - name: 'executors', - children: [ - { - id: 'rspack', - path: '/nx-api/rspack/executors/rspack', - name: 'rspack', - children: [], - isExternal: false, - disableCollapsible: false, - }, - { - id: 'dev-server', - path: '/nx-api/rspack/executors/dev-server', - name: 'dev-server', - children: [], - isExternal: false, - disableCollapsible: false, - }, - ], - isExternal: false, - disableCollapsible: false, - }, - { - id: 'generators', - path: '/nx-api/rspack/generators', - name: 'generators', - children: [ - { - id: 'init', - path: '/nx-api/rspack/generators/init', - name: 'init', - children: [], - isExternal: false, - disableCollapsible: false, - }, - { - id: 'configuration', - path: '/nx-api/rspack/generators/configuration', - name: 'configuration', - children: [], - isExternal: false, - disableCollapsible: false, - }, - { - id: 'application', - path: '/nx-api/rspack/generators/application', - name: 'application', - children: [], - isExternal: false, - disableCollapsible: false, - }, - ], - isExternal: false, - disableCollapsible: false, - }, - ], - hideSectionHeader: false, -}; export function SidebarContainer({ menu, @@ -112,33 +11,12 @@ export function SidebarContainer({ navIsOpen: boolean; toggleNav: (value: boolean) => void; }): JSX.Element { - // TODO(jack): Remove this rspack modification once we move rspack into main repo (when stable). - const menuWithRspack = useMemo(() => { - const storybookIdx = menu.sections.findIndex((s) => s.id === 'storybook'); - const sections = - storybookIdx > -1 - ? [ - ...menu.sections.slice(0, storybookIdx), - rspackSection, - ...menu.sections.slice(storybookIdx), - ] - : menu.sections; - return { - ...menu, - sections, - }; - }, [menu]); - return (