diff --git a/e2e/angular/src/config.test.ts b/e2e/angular/src/config.test.ts index d5d9419e23f46..eb69a7a60fb99 100644 --- a/e2e/angular/src/config.test.ts +++ b/e2e/angular/src/config.test.ts @@ -12,7 +12,9 @@ describe('angular.json v1 config', () => { const app1 = uniq('app1'); beforeAll(() => { - newProject({ packages: ['@nx/angular'] }); + newProject({ + packages: ['@nx/angular', '@nx/webpack', '@nx/jest', '@nx/playwright'], + }); runCLI( `generate @nx/angular:app ${app1} --bundler=webpack --unit-test-runner=jest --no-interactive` ); diff --git a/e2e/angular/src/cypress-component-tests-setup.ts b/e2e/angular/src/cypress-component-tests-setup.ts index f7735c324963c..39318b9719f46 100644 --- a/e2e/angular/src/cypress-component-tests-setup.ts +++ b/e2e/angular/src/cypress-component-tests-setup.ts @@ -24,7 +24,13 @@ export function setupCypressComponentTests( ): CypressComponentTestsSetup { const projectName = newProject({ name: uniq('cy-ng'), - packages: ['@nx/angular'], + packages: [ + '@nx/angular', + '@nx/webpack', + '@nx/playwright', + '@nx/vitest', + '@nx/cypress', + ], }); const appName = uniq('cy-angular-app'); diff --git a/e2e/angular/src/misc.test.ts b/e2e/angular/src/misc.test.ts index d34599a3fbeda..2c522cb81acb4 100644 --- a/e2e/angular/src/misc.test.ts +++ b/e2e/angular/src/misc.test.ts @@ -16,7 +16,9 @@ describe('Move Angular Project', () => { let newPath: string; beforeAll(() => { - proj = newProject({ packages: ['@nx/angular'] }); + proj = newProject({ + packages: ['@nx/angular', '@nx/jest', '@nx/playwright'], + }); app1 = uniq('app1'); app2 = uniq('app2'); newPath = `subfolder/${app2}`; @@ -154,7 +156,15 @@ describe('Convert Angular Webpack Project to Rspack', () => { let app1: string; beforeAll(() => { - proj = newProject({ packages: ['@nx/angular'] }); + proj = newProject({ + packages: [ + '@nx/angular', + '@nx/webpack', + '@nx/vitest', + '@nx/playwright', + '@nx/rspack', + ], + }); app1 = uniq('app1'); runCLI( `generate @nx/angular:app ${app1} --bundler=webpack --no-interactive` diff --git a/e2e/angular/src/module-federation-setup.ts b/e2e/angular/src/module-federation-setup.ts index 300bc27d4e4f7..df16bdf3986c6 100644 --- a/e2e/angular/src/module-federation-setup.ts +++ b/e2e/angular/src/module-federation-setup.ts @@ -6,7 +6,15 @@ export interface ModuleFederationTestSetup { } export function setupModuleFederationTest(): ModuleFederationTestSetup { - const proj = newProject({ packages: ['@nx/angular'] }); + const proj = newProject({ + packages: [ + '@nx/angular', + '@nx/jest', + '@nx/vitest', + '@nx/playwright', + '@nx/cypress', + ], + }); const oldVerboseLoggingValue = process.env.NX_E2E_VERBOSE_LOGGING; process.env.NX_E2E_VERBOSE_LOGGING = 'true'; diff --git a/e2e/angular/src/module-federation.rspack.test.ts b/e2e/angular/src/module-federation.rspack.test.ts index 1780be5c95476..d58fb8fa6ec90 100644 --- a/e2e/angular/src/module-federation.rspack.test.ts +++ b/e2e/angular/src/module-federation.rspack.test.ts @@ -19,7 +19,9 @@ describe('Angular Module Federation', () => { let oldVerboseLoggingValue: string; beforeAll(() => { - proj = newProject({ packages: ['@nx/angular'] }); + proj = newProject({ + packages: ['@nx/angular', '@nx/rspack', '@nx/vitest', '@nx/playwright'], + }); oldVerboseLoggingValue = process.env.NX_E2E_VERBOSE_LOGGING; process.env.NX_E2E_VERBOSE_LOGGING = 'true'; }); diff --git a/e2e/angular/src/ngrx.test.ts b/e2e/angular/src/ngrx.test.ts index c24c1a07bb3bc..48fe1280a34de 100644 --- a/e2e/angular/src/ngrx.test.ts +++ b/e2e/angular/src/ngrx.test.ts @@ -9,7 +9,7 @@ import { describe('NgRx', () => { beforeAll(() => { - newProject({ packages: ['@nx/angular'] }); + newProject({ packages: ['@nx/angular', '@nx/playwright'] }); }); afterAll(() => { cleanupProject(); diff --git a/e2e/angular/src/projects-setup.ts b/e2e/angular/src/projects-setup.ts index 83936da7bbda1..fd863fb92e55b 100644 --- a/e2e/angular/src/projects-setup.ts +++ b/e2e/angular/src/projects-setup.ts @@ -20,7 +20,15 @@ export interface ProjectsTestSetup { } export function setupProjectsTest(): ProjectsTestSetup { - const proj = newProject({ packages: ['@nx/angular'] }); + const proj = newProject({ + packages: [ + '@nx/angular', + '@nx/webpack', + '@nx/vitest', + '@nx/playwright', + '@nx/rspack', + ], + }); const app1 = uniq('app1'); const esbuildApp = uniq('esbuild-app'); const lib1 = uniq('lib1'); diff --git a/e2e/angular/src/tailwind.test.ts b/e2e/angular/src/tailwind.test.ts index 2db52f842d3c0..3093ac976bcfd 100644 --- a/e2e/angular/src/tailwind.test.ts +++ b/e2e/angular/src/tailwind.test.ts @@ -116,7 +116,9 @@ describe('Tailwind support', () => { }; beforeAll(() => { - project = newProject({ packages: ['@nx/angular'] }); + project = newProject({ + packages: ['@nx/angular', '@nx/webpack', '@nx/jest', '@nx/playwright'], + }); // Create tailwind config in the workspace root createWorkspaceTailwindConfigFile(); diff --git a/e2e/cypress/src/cypress-legacy.test.ts b/e2e/cypress/src/cypress-legacy.test.ts index 720832f2940ea..8bbd495f3f164 100644 --- a/e2e/cypress/src/cypress-legacy.test.ts +++ b/e2e/cypress/src/cypress-legacy.test.ts @@ -14,7 +14,7 @@ const TEN_MINS_MS = 600_000; describe('Cypress E2E Test runner (legacy)', () => { beforeAll(() => { - newProject({ packages: ['@nx/angular', '@nx/react'] }); + newProject({ packages: ['@nx/angular', '@nx/react', '@nx/cypress'] }); }); afterAll(() => cleanupProject()); diff --git a/e2e/cypress/src/cypress.test.ts b/e2e/cypress/src/cypress.test.ts index 83d151ddc287e..4bce18680820b 100644 --- a/e2e/cypress/src/cypress.test.ts +++ b/e2e/cypress/src/cypress.test.ts @@ -22,7 +22,15 @@ describe('Cypress E2E Test runner', () => { const myapp = uniq('myapp'); beforeAll(() => { - newProject({ packages: ['@nx/angular', '@nx/next', '@nx/react'] }); + newProject({ + packages: [ + '@nx/angular', + '@nx/next', + '@nx/react', + '@nx/cypress', + '@nx/eslint', + ], + }); }); afterAll(() => cleanupProject()); diff --git a/e2e/esbuild/src/esbuild-setup.ts b/e2e/esbuild/src/esbuild-setup.ts index eb28e17b4278e..31c5d875811a1 100644 --- a/e2e/esbuild/src/esbuild-setup.ts +++ b/e2e/esbuild/src/esbuild-setup.ts @@ -1,7 +1,9 @@ import { cleanupProject, newProject } from '@nx/e2e-utils'; export function setupEsbuildTest(): string { - return newProject({ packages: ['@nx/js'] }); + return newProject({ + packages: ['@nx/js', '@nx/esbuild', '@nx/eslint', '@nx/jest'], + }); } export function cleanupEsbuildTest(): void { diff --git a/e2e/eslint/src/linter.test.ts b/e2e/eslint/src/linter.test.ts index be6f149bae8a9..b497d750527ab 100644 --- a/e2e/eslint/src/linter.test.ts +++ b/e2e/eslint/src/linter.test.ts @@ -33,7 +33,13 @@ describe('Linter', () => { beforeAll(() => { projScope = newProject({ - packages: ['@nx/react', '@nx/js', '@nx/eslint'], + packages: [ + '@nx/eslint', + '@nx/js', + '@nx/react', + '@nx/vite', + '@nx/vitest', + ], }); runCLI( `generate @nx/react:app apps/${myapp} --tags=validtag --linter eslint --unitTestRunner vitest` @@ -641,7 +647,14 @@ describe('Linter', () => { describe('Root projects migration', () => { beforeEach(() => newProject({ - packages: ['@nx/react', '@nx/js', '@nx/angular', '@nx/node'], + packages: [ + '@nx/angular', + '@nx/eslint', + '@nx/jest', + '@nx/js', + '@nx/node', + '@nx/react', + ], }) ); afterEach(() => cleanupProject()); diff --git a/e2e/expo/src/expo-legacy.test.ts b/e2e/expo/src/expo-legacy.test.ts index 64d333ff733fa..ad17928536152 100644 --- a/e2e/expo/src/expo-legacy.test.ts +++ b/e2e/expo/src/expo-legacy.test.ts @@ -25,7 +25,18 @@ describe('@nx/expo (legacy)', () => { let originalEnv: string; beforeAll(() => { - proj = newProject({ packages: ['@nx/expo'] }); + proj = newProject({ + packages: [ + '@nx/cypress', + '@nx/expo', + '@nx/jest', + '@nx/playwright', + '@nx/react', + '@nx/rollup', + '@nx/storybook', + '@nx/web', + ], + }); // we create empty preset above which skips creation of `production` named input originalEnv = process.env.NX_ADD_PLUGINS; diff --git a/e2e/expo/src/expo.test.ts b/e2e/expo/src/expo.test.ts index 905b9e9e9655e..d87ab36b4e16f 100644 --- a/e2e/expo/src/expo.test.ts +++ b/e2e/expo/src/expo.test.ts @@ -22,7 +22,16 @@ describe('@nx/expo', () => { let libName: string; beforeAll(() => { - newProject({ packages: ['@nx/expo'] }); + newProject({ + packages: [ + '@nx/cypress', + '@nx/expo', + '@nx/jest', + '@nx/react', + '@nx/rollup', + '@nx/storybook', + ], + }); appName = uniq('app'); libName = uniq('lib'); runCLI( diff --git a/e2e/jest/src/jest-legacy.test.ts b/e2e/jest/src/jest-legacy.test.ts index 62bcf17519913..7aa979d89482e 100644 --- a/e2e/jest/src/jest-legacy.test.ts +++ b/e2e/jest/src/jest-legacy.test.ts @@ -11,7 +11,10 @@ import { describe('Jest', () => { beforeAll(() => { - newProject({ name: uniq('proj-jest'), packages: ['@nx/js', '@nx/node'] }); + newProject({ + name: uniq('proj-jest'), + packages: ['@nx/js', '@nx/node', '@nx/eslint', '@nx/jest'], + }); }); afterAll(() => cleanupProject()); diff --git a/e2e/jest/src/jest-root.test.ts b/e2e/jest/src/jest-root.test.ts index f549cbf05b10f..5495b5d448495 100644 --- a/e2e/jest/src/jest-root.test.ts +++ b/e2e/jest/src/jest-root.test.ts @@ -7,7 +7,7 @@ describe('Jest root projects', () => { describe('angular', () => { beforeAll(() => { newProject({ - packages: ['@nx/angular'], + packages: ['@nx/angular', '@nx/jest'], }); runCLI( `generate @nx/angular:app --name=${myapp} --directory . --rootProject --no-interactive --unitTestRunner=jest --linter=eslint` @@ -31,7 +31,7 @@ describe('Jest root projects', () => { describe('react', () => { beforeAll(() => { newProject({ - packages: ['@nx/react'], + packages: ['@nx/react', '@nx/vite', '@nx/jest', '@nx/eslint'], }); runCLI( `generate @nx/react:app --name=${myapp} --directory . --rootProject --unitTestRunner=jest --linter=eslint` diff --git a/e2e/jest/src/jest.test.ts b/e2e/jest/src/jest.test.ts index ce623ea1b4e82..a83f2ee1ff1bf 100644 --- a/e2e/jest/src/jest.test.ts +++ b/e2e/jest/src/jest.test.ts @@ -13,7 +13,10 @@ import { describe('Jest', () => { beforeAll(() => { - newProject({ name: uniq('proj-jest'), packages: ['@nx/js', '@nx/node'] }); + newProject({ + name: uniq('proj-jest'), + packages: ['@nx/js', '@nx/node', '@nx/eslint', '@nx/jest'], + }); }); afterAll(() => cleanupProject()); diff --git a/e2e/js/src/js-esm-support.test.ts b/e2e/js/src/js-esm-support.test.ts index b2367b148bec0..6067460710b5b 100644 --- a/e2e/js/src/js-esm-support.test.ts +++ b/e2e/js/src/js-esm-support.test.ts @@ -46,7 +46,7 @@ describe('JS ESM/CJS Support', () => { const selectedPm = getSelectedPackageManager(); beforeAll(() => { newProject({ - packages: ['@nx/node', '@nx/js', '@nx/esbuild'], + packages: ['@nx/node', '@nx/js', '@nx/esbuild', '@nx/eslint', '@nx/jest'], packageManager: selectedPm === 'npm' ? 'pnpm' : selectedPm, }); }); diff --git a/e2e/js/src/js-executor-copy-workspace-modules.test.ts b/e2e/js/src/js-executor-copy-workspace-modules.test.ts index a44dbd463ecc3..c1a904f6e4e6e 100644 --- a/e2e/js/src/js-executor-copy-workspace-modules.test.ts +++ b/e2e/js/src/js-executor-copy-workspace-modules.test.ts @@ -14,7 +14,7 @@ describe('@nx/js:copy-workspace-modules', () => { beforeAll(() => { scope = newProject({ - packages: ['@nx/node', '@nx/js'], + packages: ['@nx/node', '@nx/js', '@nx/eslint', '@nx/jest'], preset: 'ts', packageManager: 'pnpm', }); diff --git a/e2e/js/src/js-executor-node.test.ts b/e2e/js/src/js-executor-node.test.ts index 332c3f2701cfe..058dd3d96fa31 100644 --- a/e2e/js/src/js-executor-node.test.ts +++ b/e2e/js/src/js-executor-node.test.ts @@ -12,7 +12,9 @@ describe('js:node executor', () => { let scope: string; beforeAll(() => { - scope = newProject({ packages: ['@nx/js', '@nx/node'] }); + scope = newProject({ + packages: ['@nx/js', '@nx/node', '@nx/esbuild', '@nx/webpack'], + }); }); afterAll(() => cleanupProject()); diff --git a/e2e/js/src/js-executor-prune-lockfile.test.ts b/e2e/js/src/js-executor-prune-lockfile.test.ts index cb6b6e06f0a9a..b6894e114d833 100644 --- a/e2e/js/src/js-executor-prune-lockfile.test.ts +++ b/e2e/js/src/js-executor-prune-lockfile.test.ts @@ -22,7 +22,7 @@ describe('js:prune-lockfile executor', () => { beforeAll(() => { scope = newProject({ - packages: ['@nx/node', '@nx/js'], + packages: ['@nx/node', '@nx/js', '@nx/eslint', '@nx/jest'], preset: 'ts', packageManager, }); diff --git a/e2e/js/src/js-executor-swc.test.ts b/e2e/js/src/js-executor-swc.test.ts index 1a58889a04972..386007d0c7110 100644 --- a/e2e/js/src/js-executor-swc.test.ts +++ b/e2e/js/src/js-executor-swc.test.ts @@ -15,7 +15,7 @@ describe('js:swc executor', () => { let scope: string; beforeAll(() => { - scope = newProject({ packages: ['@nx/js'] }); + scope = newProject({ packages: ['@nx/js', '@nx/eslint', '@nx/jest'] }); }); afterAll(() => { diff --git a/e2e/js/src/js-executor-tsc.test.ts b/e2e/js/src/js-executor-tsc.test.ts index 7771ae386a288..806731933aa8c 100644 --- a/e2e/js/src/js-executor-tsc.test.ts +++ b/e2e/js/src/js-executor-tsc.test.ts @@ -23,7 +23,10 @@ import { describe('js:tsc executor', () => { let scope; - beforeAll(() => (scope = newProject({ packages: ['@nx/js'] }))); + beforeAll( + () => + (scope = newProject({ packages: ['@nx/js', '@nx/eslint', '@nx/jest'] })) + ); afterAll(() => cleanupProject()); it('should create libs with js executors (--compiler=tsc)', async () => { diff --git a/e2e/js/src/js-packaging.test.ts b/e2e/js/src/js-packaging.test.ts index 31b5a443ebee8..1180b82f507a7 100644 --- a/e2e/js/src/js-packaging.test.ts +++ b/e2e/js/src/js-packaging.test.ts @@ -19,7 +19,7 @@ describe('packaging libs', () => { let scope: string; beforeEach(() => { - scope = newProject({ packages: ['@nx/js'] }); + scope = newProject({ packages: ['@nx/js', '@nx/eslint', '@nx/jest'] }); }); afterEach(() => cleanupProject()); diff --git a/e2e/js/src/js-strip-types.test.ts b/e2e/js/src/js-strip-types.test.ts index 7916c19d43692..53e1dcaed079f 100644 --- a/e2e/js/src/js-strip-types.test.ts +++ b/e2e/js/src/js-strip-types.test.ts @@ -18,6 +18,9 @@ describe('native Node.js TypeScript support (NX_PREFER_NODE_STRIP_TYPES)', () => '@nx/playwright', '@nx/cypress', '@nx/web', + '@nx/vite', + '@nx/eslint', + '@nx/jest', ], }); }); diff --git a/e2e/js/src/js-ts-solution.test.ts b/e2e/js/src/js-ts-solution.test.ts index 8c436912ebbc9..23c66d53b78e7 100644 --- a/e2e/js/src/js-ts-solution.test.ts +++ b/e2e/js/src/js-ts-solution.test.ts @@ -14,7 +14,14 @@ import { describe('JS - TS solution setup', () => { beforeAll(() => { newProject({ - packages: ['@nx/js'], + packages: [ + '@nx/js', + '@nx/esbuild', + '@nx/rollup', + '@nx/vite', + '@nx/eslint', + '@nx/jest', + ], preset: 'ts', }); }); diff --git a/e2e/next/src/next-appdir.test.ts b/e2e/next/src/next-appdir.test.ts index 9f1bdc814e42a..1a9b7bc08d3b2 100644 --- a/e2e/next/src/next-appdir.test.ts +++ b/e2e/next/src/next-appdir.test.ts @@ -16,7 +16,7 @@ describe('Next.js App Router', () => { beforeAll( () => (proj = newProject({ - packages: ['@nx/next'], + packages: ['@nx/next', '@nx/js', '@nx/playwright'], })) ); diff --git a/e2e/next/src/next-component-tests.test.ts b/e2e/next/src/next-component-tests.test.ts index 4c35e5917a39e..f4ca806862b60 100644 --- a/e2e/next/src/next-component-tests.test.ts +++ b/e2e/next/src/next-component-tests.test.ts @@ -13,7 +13,7 @@ describe('NextJs Component Testing', () => { beforeAll(() => { newProject({ name: uniq('next-ct'), - packages: ['@nx/next'], + packages: ['@nx/next', '@nx/cypress'], }); }); diff --git a/e2e/next/src/next-jest-config.test.ts b/e2e/next/src/next-jest-config.test.ts index 50b7e64a16792..be556ef93f635 100644 --- a/e2e/next/src/next-jest-config.test.ts +++ b/e2e/next/src/next-jest-config.test.ts @@ -10,7 +10,7 @@ describe('Next.js Jest Configuration', () => { let proj: string; beforeAll(() => { - proj = newProject({ packages: ['@nx/next'] }); + proj = newProject({ packages: ['@nx/next', '@nx/jest'] }); }); afterAll(() => cleanupProject()); diff --git a/e2e/next/src/next-legacy.test.ts b/e2e/next/src/next-legacy.test.ts index 54e28ae2a393b..2889dba4136b5 100644 --- a/e2e/next/src/next-legacy.test.ts +++ b/e2e/next/src/next-legacy.test.ts @@ -29,7 +29,7 @@ describe('@nx/next (legacy)', () => { beforeAll(() => { proj = newProject({ - packages: ['@nx/next'], + packages: ['@nx/next', '@nx/jest', '@nx/eslint'], }); packageManager = detectPackageManager(tmpProjPath()); originalEnv = process.env.NODE_ENV; diff --git a/e2e/next/src/next-playwright.test.ts b/e2e/next/src/next-playwright.test.ts index e49f2729e340d..055cd33de9328 100644 --- a/e2e/next/src/next-playwright.test.ts +++ b/e2e/next/src/next-playwright.test.ts @@ -15,7 +15,7 @@ describe('Next Playwright e2e tests', () => { beforeAll(async () => { projectName = newProject({ name: uniq('pw-next'), - packages: ['@nx/next'], + packages: ['@nx/next', '@nx/js', '@nx/playwright'], }); runCLI( `generate @nx/next:app ${appName} --e2eTestRunner=playwright --no-interactive` diff --git a/e2e/next/src/next-setup.ts b/e2e/next/src/next-setup.ts index 9caffe5ec7f2a..0fec5cc218e2f 100644 --- a/e2e/next/src/next-setup.ts +++ b/e2e/next/src/next-setup.ts @@ -7,7 +7,13 @@ export interface NextTestSetup { export function setupNextTest(): NextTestSetup { const proj = newProject({ - packages: ['@nx/next', '@nx/cypress'], + packages: [ + '@nx/next', + '@nx/cypress', + '@nx/jest', + '@nx/eslint', + '@nx/playwright', + ], }); const originalEnv = process.env.NODE_ENV; diff --git a/e2e/next/src/next-styles.test.ts b/e2e/next/src/next-styles.test.ts index cf3cd2bcb694e..150058c8b0dfd 100644 --- a/e2e/next/src/next-styles.test.ts +++ b/e2e/next/src/next-styles.test.ts @@ -14,7 +14,7 @@ describe('Next.js Styles', () => { beforeAll(() => { newProject({ - packages: ['@nx/next'], + packages: ['@nx/next', '@nx/jest', '@nx/eslint'], }); }); diff --git a/e2e/next/src/next-ts-solutions.test.ts b/e2e/next/src/next-ts-solutions.test.ts index 5bfc0d3a03d43..67434c41c33fb 100644 --- a/e2e/next/src/next-ts-solutions.test.ts +++ b/e2e/next/src/next-ts-solutions.test.ts @@ -14,7 +14,7 @@ describe('Next TS Solutions', () => { beforeAll(() => { proj = newProject({ - packages: ['@nx/next'], + packages: ['@nx/next', '@nx/js', '@nx/vite', '@nx/eslint'], preset: 'ts', }); }); diff --git a/e2e/node/src/node-esm-support.test.ts b/e2e/node/src/node-esm-support.test.ts index 53ed1f51813d6..1ae80c22bdae7 100644 --- a/e2e/node/src/node-esm-support.test.ts +++ b/e2e/node/src/node-esm-support.test.ts @@ -44,7 +44,7 @@ const selectedPm = detectPackageManager(); describe('Node.js Framework ESM Support', () => { beforeAll(() => { newProject({ - packages: ['@nx/node'], + packages: ['@nx/node', '@nx/nest', '@nx/webpack'], packageManager: selectedPm === 'npm' ? 'pnpm' : selectedPm, }); }); diff --git a/e2e/node/src/node-server.test.ts b/e2e/node/src/node-server.test.ts index 1ef4d8f7f0042..fcb0266d123bb 100644 --- a/e2e/node/src/node-server.test.ts +++ b/e2e/node/src/node-server.test.ts @@ -22,7 +22,7 @@ describe('Node Applications + webpack', () => { // TODO(nicholas): Look into how this can work with npm instead of forcing pnpm. beforeAll(() => { proj = newProject({ - packages: ['@nx/node'], + packages: ['@nx/node', '@nx/nest', '@nx/webpack'], // npm has resolution for ajv some packages require ajv6 and some require ajv8 and npm resolves it to ajv6 (Error: Cannot find module 'ajv/dist/compile/codegen') // - ajv@6 (fork-ts-checker-webpack-plugin, terser-webpack-plugin, webpack) // - ajv@8 (babel-loader) diff --git a/e2e/node/src/node-webpack.test.ts b/e2e/node/src/node-webpack.test.ts index 082ba853b4390..524f44240a25d 100644 --- a/e2e/node/src/node-webpack.test.ts +++ b/e2e/node/src/node-webpack.test.ts @@ -19,7 +19,7 @@ import { join } from 'path'; describe('Node Applications + webpack', () => { beforeAll(() => newProject({ - packages: ['@nx/node'], + packages: ['@nx/node', '@nx/webpack', '@nx/esbuild'], }) ); diff --git a/e2e/node/src/node.test.ts b/e2e/node/src/node.test.ts index 202ed31bff87e..ec4efcc20e32f 100644 --- a/e2e/node/src/node.test.ts +++ b/e2e/node/src/node.test.ts @@ -412,7 +412,7 @@ describe('Build Node apps', () => { beforeAll(() => { originalEnvPort = process.env.PORT; scope = newProject({ - packages: ['@nx/node', '@nx/express', '@nx/nest'], + packages: ['@nx/node', '@nx/express', '@nx/nest', '@nx/webpack'], }); }); diff --git a/e2e/nuxt/src/nuxt.test.ts b/e2e/nuxt/src/nuxt.test.ts index a6a2ae1eae003..0bdbf1104f1c2 100644 --- a/e2e/nuxt/src/nuxt.test.ts +++ b/e2e/nuxt/src/nuxt.test.ts @@ -13,7 +13,7 @@ describe('Nuxt Plugin', () => { beforeAll(() => { newProject({ - packages: ['@nx/nuxt'], + packages: ['@nx/nuxt', '@nx/vite', '@nx/vitest', '@nx/cypress'], }); runCLI( `generate @nx/nuxt:app ${app} --unitTestRunner=vitest --e2eTestRunner=cypress --linter=eslint` diff --git a/e2e/nx/src/affected-graph.test.ts b/e2e/nx/src/affected-graph.test.ts index 0f328b8c04184..e8c9af4472b99 100644 --- a/e2e/nx/src/affected-graph.test.ts +++ b/e2e/nx/src/affected-graph.test.ts @@ -20,7 +20,18 @@ import { join } from 'path'; describe('Nx Affected and Graph Tests', () => { let proj: string; - beforeAll(() => (proj = newProject({ packages: ['@nx/js', '@nx/web'] }))); + beforeAll( + () => + (proj = newProject({ + packages: [ + '@nx/js', + '@nx/vite', + '@nx/vitest', + '@nx/web', + '@nx/webpack', + ], + })) + ); afterAll(() => cleanupProject()); describe('affected:*', () => { @@ -530,7 +541,12 @@ describe('Nx Affected and Graph Tests', () => { describe('show projects --affected', () => { let proj: string; - beforeAll(() => (proj = newProject({ packages: ['@nx/js', '@nx/web'] }))); + beforeAll( + () => + (proj = newProject({ + packages: ['@nx/js', '@nx/vite', '@nx/vitest', '@nx/web'], + })) + ); afterAll(() => cleanupProject()); it('should print information about affected projects', async () => { diff --git a/e2e/nx/src/help-output.test.ts b/e2e/nx/src/help-output.test.ts index d773b88a92578..6fe1e7d7e13cf 100644 --- a/e2e/nx/src/help-output.test.ts +++ b/e2e/nx/src/help-output.test.ts @@ -4,7 +4,7 @@ import { cleanupProject, newProject, runCLI, uniq } from '@nx/e2e-utils'; xdescribe('--help output', () => { beforeAll(() => { newProject({ - packages: ['@nx/js', '@nx/jest', '@nx/eslint', '@nx/webpack'], + packages: ['@nx/js', '@nx/jest', '@nx/eslint', '@nx/web', '@nx/webpack'], }); }); diff --git a/e2e/nx/src/misc.test.ts b/e2e/nx/src/misc.test.ts index 340738461a70c..ff22aa58e6ffe 100644 --- a/e2e/nx/src/misc.test.ts +++ b/e2e/nx/src/misc.test.ts @@ -30,7 +30,15 @@ import { join } from 'path'; describe('Nx Commands', () => { beforeAll(() => newProject({ - packages: ['@nx/web', '@nx/angular', '@nx/next'], + packages: [ + '@nx/angular', + '@nx/eslint', + '@nx/next', + '@nx/vite', + '@nx/vitest', + '@nx/web', + '@nx/webpack', + ], }) ); diff --git a/e2e/nx/src/run.test.ts b/e2e/nx/src/run.test.ts index 38b9bf8d5fc38..92a41493fb9c8 100644 --- a/e2e/nx/src/run.test.ts +++ b/e2e/nx/src/run.test.ts @@ -22,7 +22,10 @@ import * as path from 'path'; describe('Nx Running Tests', () => { let proj: string; beforeAll( - () => (proj = newProject({ packages: ['@nx/js', '@nx/web', '@nx/node'] })) + () => + (proj = newProject({ + packages: ['@nx/js', '@nx/node', '@nx/vite', '@nx/vitest', '@nx/web'], + })) ); afterAll(() => cleanupProject()); diff --git a/e2e/nx/src/workspace-legacy.test.ts b/e2e/nx/src/workspace-legacy.test.ts index bdacae592e962..1aaae8a7466ee 100644 --- a/e2e/nx/src/workspace-legacy.test.ts +++ b/e2e/nx/src/workspace-legacy.test.ts @@ -11,7 +11,16 @@ let proj: string; describe('@nx/workspace:convert-to-monorepo', () => { beforeEach(() => { - proj = newProject({ packages: ['@nx/react', '@nx/js'] }); + proj = newProject({ + packages: [ + '@nx/cypress', + '@nx/eslint', + '@nx/jest', + '@nx/js', + '@nx/react', + '@nx/webpack', + ], + }); }); afterEach(() => cleanupProject()); diff --git a/e2e/nx/src/workspace.test.ts b/e2e/nx/src/workspace.test.ts index 3689e20acbbe0..6b59a8c725dbd 100644 --- a/e2e/nx/src/workspace.test.ts +++ b/e2e/nx/src/workspace.test.ts @@ -159,7 +159,16 @@ describe('@nx/workspace:infer-targets', () => { describe('@nx/workspace:convert-to-monorepo', () => { beforeEach(() => { - proj = newProject({ packages: ['@nx/react', '@nx/js'] }); + proj = newProject({ + packages: [ + '@nx/eslint', + '@nx/js', + '@nx/playwright', + '@nx/react', + '@nx/vite', + '@nx/vitest', + ], + }); }); afterEach(() => cleanupProject()); @@ -189,7 +198,7 @@ describe('@nx/workspace:convert-to-monorepo', () => { describe('Workspace Tests', () => { beforeAll(() => { - proj = newProject({ packages: ['@nx/workspace', '@nx/js'] }); + proj = newProject({ packages: ['@nx/workspace', '@nx/js', '@nx/jest'] }); }); afterAll(() => cleanupProject()); diff --git a/e2e/playwright/src/playwright.test.ts b/e2e/playwright/src/playwright.test.ts index bab5ea0b6a7ce..3cef81218cdf6 100644 --- a/e2e/playwright/src/playwright.test.ts +++ b/e2e/playwright/src/playwright.test.ts @@ -19,7 +19,7 @@ describe('Playwright E2E Test runner', () => { beforeAll(() => { newProject({ name: uniq('playwright'), - packages: ['@nx/playwright', '@nx/web'], + packages: ['@nx/playwright', '@nx/web', '@nx/vite'], }); }); diff --git a/e2e/plugin/src/nx-plugin-ts-solution.test.ts b/e2e/plugin/src/nx-plugin-ts-solution.test.ts index 281617e9eae62..648cc9e4f9a9d 100644 --- a/e2e/plugin/src/nx-plugin-ts-solution.test.ts +++ b/e2e/plugin/src/nx-plugin-ts-solution.test.ts @@ -20,7 +20,10 @@ describe('Nx Plugin (TS solution)', () => { let workspaceName: string; beforeAll(() => { - workspaceName = newProject({ preset: 'ts', packages: ['@nx/plugin'] }); + workspaceName = newProject({ + preset: 'ts', + packages: ['@nx/eslint', '@nx/jest', '@nx/plugin'], + }); }); afterAll(() => cleanupProject()); diff --git a/e2e/plugin/src/nx-plugin.test.ts b/e2e/plugin/src/nx-plugin.test.ts index a06912df67a6a..b045010b30131 100644 --- a/e2e/plugin/src/nx-plugin.test.ts +++ b/e2e/plugin/src/nx-plugin.test.ts @@ -26,7 +26,9 @@ describe('Nx Plugin', () => { let workspaceName: string; beforeAll(() => { - workspaceName = newProject({ packages: ['@nx/plugin'] }); + workspaceName = newProject({ + packages: ['@nx/eslint', '@nx/jest', '@nx/plugin'], + }); }); afterAll(() => cleanupProject()); diff --git a/e2e/react-native/src/react-native-legacy.test.ts b/e2e/react-native/src/react-native-legacy.test.ts index 3bf99753db144..03ae9f4a6fff7 100644 --- a/e2e/react-native/src/react-native-legacy.test.ts +++ b/e2e/react-native/src/react-native-legacy.test.ts @@ -28,7 +28,20 @@ describe('@nx/react-native (legacy)', () => { originalEnv = process.env.NX_ADD_PLUGINS; process.env.NX_ADD_PLUGINS = 'false'; - proj = newProject({ packages: ['@nx/react-native', '@nx/react'] }); + proj = newProject({ + packages: [ + '@nx/cypress', + '@nx/jest', + '@nx/playwright', + '@nx/react', + '@nx/react-native', + '@nx/rollup', + '@nx/storybook', + '@nx/vite', + '@nx/web', + '@nx/webpack', + ], + }); // we create empty preset above which skips creation of `production` named input updateJson('nx.json', (nxJson) => { nxJson.namedInputs = { diff --git a/e2e/react-native/src/react-native.test.ts b/e2e/react-native/src/react-native.test.ts index 1e005f5191df4..7fc423f38bbd5 100644 --- a/e2e/react-native/src/react-native.test.ts +++ b/e2e/react-native/src/react-native.test.ts @@ -20,7 +20,19 @@ describe('@nx/react-native', () => { let componentName: string; beforeAll(() => { - proj = newProject({ packages: ['@nx/react-native'] }); + proj = newProject({ + packages: [ + '@nx/cypress', + '@nx/jest', + '@nx/playwright', + '@nx/react', + '@nx/react-native', + '@nx/rollup', + '@nx/storybook', + '@nx/vite', + '@nx/webpack', + ], + }); appName = uniq('app'); runCLI( `generate @nx/react-native:app ${appName} --install=false --no-interactive --unitTestRunner=jest --e2eTestRunner=cypress --linter=eslint` diff --git a/e2e/react/src/cypress-component-tests.test.ts b/e2e/react/src/cypress-component-tests.test.ts index c53b93d95ade4..482ad4157283c 100644 --- a/e2e/react/src/cypress-component-tests.test.ts +++ b/e2e/react/src/cypress-component-tests.test.ts @@ -22,7 +22,7 @@ describe('React Cypress Component Tests', () => { process.env.NX_ADD_PLUGINS = 'false'; projectName = newProject({ name: uniq('cy-react'), - packages: ['@nx/react'], + packages: ['@nx/react', '@nx/webpack', '@nx/jest', '@nx/cypress'], }); ensureCypressInstallation(); diff --git a/e2e/react/src/module-federation/core-rspack-setup.ts b/e2e/react/src/module-federation/core-rspack-setup.ts index 8578e6ab56bce..5788faa962205 100644 --- a/e2e/react/src/module-federation/core-rspack-setup.ts +++ b/e2e/react/src/module-federation/core-rspack-setup.ts @@ -1,7 +1,15 @@ import { cleanupProject, newProject } from '@nx/e2e-utils'; export function setupCoreRspackTest(): void { - newProject({ packages: ['@nx/react'] }); + newProject({ + packages: [ + '@nx/react', + '@nx/rspack', + '@nx/jest', + '@nx/cypress', + '@nx/playwright', + ], + }); } export function cleanupCoreRspackTest(): void { diff --git a/e2e/react/src/module-federation/core-webpack-setup.ts b/e2e/react/src/module-federation/core-webpack-setup.ts index 9a8c8b28ba5cf..0b8410bc0ae26 100644 --- a/e2e/react/src/module-federation/core-webpack-setup.ts +++ b/e2e/react/src/module-federation/core-webpack-setup.ts @@ -1,7 +1,15 @@ import { cleanupProject, newProject } from '@nx/e2e-utils'; export function setupCoreWebpackTest(): void { - newProject({ packages: ['@nx/react', '@nx/webpack'] }); + newProject({ + packages: [ + '@nx/react', + '@nx/webpack', + '@nx/jest', + '@nx/cypress', + '@nx/playwright', + ], + }); } export function cleanupCoreWebpackTest(): void { diff --git a/e2e/react/src/module-federation/dynamic-federation.rspack.test.ts b/e2e/react/src/module-federation/dynamic-federation.rspack.test.ts index 88847747e3d47..052a4d35afe3f 100644 --- a/e2e/react/src/module-federation/dynamic-federation.rspack.test.ts +++ b/e2e/react/src/module-federation/dynamic-federation.rspack.test.ts @@ -17,7 +17,7 @@ import { runCLI } from './utils'; describe('Dynamic Module Federation', () => { beforeAll(() => { - newProject({ packages: ['@nx/react'] }); + newProject({ packages: ['@nx/react', '@nx/rspack', '@nx/cypress'] }); }); afterAll(() => cleanupProject()); diff --git a/e2e/react/src/module-federation/dynamic-federation.webpack.test.ts b/e2e/react/src/module-federation/dynamic-federation.webpack.test.ts index 21b8482fc7c7c..c3ec5acc9ef53 100644 --- a/e2e/react/src/module-federation/dynamic-federation.webpack.test.ts +++ b/e2e/react/src/module-federation/dynamic-federation.webpack.test.ts @@ -19,7 +19,7 @@ import { runCLI } from './utils'; // eslint-disable-next-line jest/no-disabled-tests describe.skip('Dynamic Module Federation', () => { beforeAll(() => { - newProject({ packages: ['@nx/react'] }); + newProject({ packages: ['@nx/react', '@nx/webpack', '@nx/cypress'] }); }); afterAll(() => cleanupProject()); diff --git a/e2e/react/src/module-federation/federate-module.rspack.test.ts b/e2e/react/src/module-federation/federate-module.rspack.test.ts index b4bfaf85d9e42..989d340275530 100644 --- a/e2e/react/src/module-federation/federate-module.rspack.test.ts +++ b/e2e/react/src/module-federation/federate-module.rspack.test.ts @@ -14,7 +14,9 @@ describe('Federate Module', () => { let proj: string; beforeAll(() => { - proj = newProject({ packages: ['@nx/react', '@nx/js'] }); + proj = newProject({ + packages: ['@nx/react', '@nx/js', '@nx/rspack', '@nx/cypress'], + }); }); afterAll(() => cleanupProject()); diff --git a/e2e/react/src/module-federation/federate-module.webpack.test.ts b/e2e/react/src/module-federation/federate-module.webpack.test.ts index 7cc3c8b8a4bae..6672f0c8013d6 100644 --- a/e2e/react/src/module-federation/federate-module.webpack.test.ts +++ b/e2e/react/src/module-federation/federate-module.webpack.test.ts @@ -17,7 +17,9 @@ describe.skip('Federate Module', () => { let proj: string; beforeAll(() => { - proj = newProject({ packages: ['@nx/react', '@nx/js'] }); + proj = newProject({ + packages: ['@nx/react', '@nx/js', '@nx/webpack', '@nx/cypress'], + }); }); afterAll(() => cleanupProject()); diff --git a/e2e/react/src/module-federation/independent-deployability.rspack.test.ts b/e2e/react/src/module-federation/independent-deployability.rspack.test.ts index 60af1c5e65d5e..ee765eb689661 100644 --- a/e2e/react/src/module-federation/independent-deployability.rspack.test.ts +++ b/e2e/react/src/module-federation/independent-deployability.rspack.test.ts @@ -16,7 +16,9 @@ describe('Independent Deployability', () => { let proj: string; beforeAll(() => { - proj = newProject({ packages: ['@nx/react', '@nx/js'] }); + proj = newProject({ + packages: ['@nx/react', '@nx/js', '@nx/rspack', '@nx/cypress'], + }); }); afterAll(() => { diff --git a/e2e/react/src/module-federation/independent-deployability.webpack.test.ts b/e2e/react/src/module-federation/independent-deployability.webpack.test.ts index 2d92779bc6c85..b2b9b10689b9c 100644 --- a/e2e/react/src/module-federation/independent-deployability.webpack.test.ts +++ b/e2e/react/src/module-federation/independent-deployability.webpack.test.ts @@ -19,7 +19,9 @@ describe.skip('Independent Deployability', () => { let proj: string; beforeAll(() => { process.env.NX_ADD_PLUGINS = 'false'; - proj = newProject({ packages: ['@nx/react', '@nx/js'] }); + proj = newProject({ + packages: ['@nx/react', '@nx/js', '@nx/webpack', '@nx/cypress'], + }); }); afterAll(() => { diff --git a/e2e/react/src/module-federation/misc-rspack-convert-to-rspack.test.ts b/e2e/react/src/module-federation/misc-rspack-convert-to-rspack.test.ts index 1185b2b1c5c17..98c0b67228cc2 100644 --- a/e2e/react/src/module-federation/misc-rspack-convert-to-rspack.test.ts +++ b/e2e/react/src/module-federation/misc-rspack-convert-to-rspack.test.ts @@ -17,7 +17,9 @@ import { stripIndents } from 'nx/src/utils/strip-indents'; describe.skip('React Rspack Module Federation Misc - Convert To Rspack', () => { beforeAll(() => { process.env.NX_ADD_PLUGINS = 'false'; - newProject({ packages: ['@nx/react', '@nx/rspack'] }); + newProject({ + packages: ['@nx/react', '@nx/rspack', '@nx/webpack', '@nx/playwright'], + }); }); afterAll(() => { cleanupProject(); diff --git a/e2e/react/src/module-federation/misc-rspack-interoperability.test.ts b/e2e/react/src/module-federation/misc-rspack-interoperability.test.ts index 1fd984fd22bb9..0cc2a823262f0 100644 --- a/e2e/react/src/module-federation/misc-rspack-interoperability.test.ts +++ b/e2e/react/src/module-federation/misc-rspack-interoperability.test.ts @@ -17,7 +17,9 @@ import { stripIndents } from 'nx/src/utils/strip-indents'; describe.skip('React Rspack Module Federation Misc - Interoperability', () => { beforeEach(() => { process.env.NX_ADD_PLUGINS = 'false'; - newProject({ packages: ['@nx/react'] }); + newProject({ + packages: ['@nx/react', '@nx/webpack', '@nx/rspack', '@nx/cypress'], + }); }); afterEach(() => { cleanupProject(); diff --git a/e2e/react/src/module-federation/ssr.rspack.test.ts b/e2e/react/src/module-federation/ssr.rspack.test.ts index 441baa93ac08e..36ed40a46445c 100644 --- a/e2e/react/src/module-federation/ssr.rspack.test.ts +++ b/e2e/react/src/module-federation/ssr.rspack.test.ts @@ -16,7 +16,7 @@ describe('React Rspack SSR Module Federation', () => { // TODO: @columferry please investigate why this test cauess agents to run out of memory xdescribe('ssr', () => { beforeEach(() => { - newProject({ packages: ['@nx/react'] }); + newProject({ packages: ['@nx/react', '@nx/rspack', '@nx/cypress'] }); }); afterEach(() => cleanupProject()); diff --git a/e2e/react/src/playwright.test.ts b/e2e/react/src/playwright.test.ts index a342b22b250fd..da8ddd10fbebb 100644 --- a/e2e/react/src/playwright.test.ts +++ b/e2e/react/src/playwright.test.ts @@ -15,7 +15,7 @@ describe('React Playwright e2e tests', () => { beforeAll(async () => { projectName = newProject({ name: uniq('pw-react'), - packages: ['@nx/react'], + packages: ['@nx/react', '@nx/vite', '@nx/playwright'], }); runCLI( `generate @nx/react:app ${appName} --e2eTestRunner=playwright --bundler=vite --no-interactive` diff --git a/e2e/react/src/react-package-legacy.test.ts b/e2e/react/src/react-package-legacy.test.ts index 5f3db8599a136..493988882df0a 100644 --- a/e2e/react/src/react-package-legacy.test.ts +++ b/e2e/react/src/react-package-legacy.test.ts @@ -43,7 +43,9 @@ describe('Build React libraries and apps', () => { childLib = uniq('childlib'); childLib2 = uniq('childlib2'); - proj = newProject({ packages: ['@nx/react'] }); + proj = newProject({ + packages: ['@nx/react', '@nx/rspack', '@nx/rollup', '@nx/jest'], + }); // create dependencies by importing const createDep = (parent, children: string[]) => { diff --git a/e2e/react/src/react-package.test.ts b/e2e/react/src/react-package.test.ts index 803498d687a31..469e12f4c4823 100644 --- a/e2e/react/src/react-package.test.ts +++ b/e2e/react/src/react-package.test.ts @@ -38,7 +38,9 @@ describe('Build React libraries and apps', () => { childLib = uniq('childlib'); childLib2 = uniq('childlib2'); - proj = newProject({ packages: ['@nx/react'] }); + proj = newProject({ + packages: ['@nx/react', '@nx/rspack', '@nx/rollup', '@nx/jest'], + }); // create dependencies by importing const createDep = (parent, children: string[]) => { diff --git a/e2e/react/src/react-router-ts-paths.test.ts b/e2e/react/src/react-router-ts-paths.test.ts index 1ae681143c703..b1448624d9bb8 100644 --- a/e2e/react/src/react-router-ts-paths.test.ts +++ b/e2e/react/src/react-router-ts-paths.test.ts @@ -13,7 +13,17 @@ import { describe('React Router Applications - TS paths', () => { const appName = uniq('app'); beforeAll(() => { - newProject({ packages: ['@nx/react'] }); + newProject({ + packages: [ + '@nx/react', + '@nx/vite', + '@nx/vitest', + '@nx/jest', + '@nx/cypress', + '@nx/playwright', + '@nx/eslint', + ], + }); ensurePlaywrightBrowsersInstallation(); runCLI( `generate @nx/react:app ${appName} --use-react-router --routing --linter=eslint --unit-test-runner=vitest --e2e-test-runner=playwright --no-interactive` diff --git a/e2e/react/src/react-router-ts-solution.test.ts b/e2e/react/src/react-router-ts-solution.test.ts index 199897bb1c73e..46ef14a28a0d9 100644 --- a/e2e/react/src/react-router-ts-solution.test.ts +++ b/e2e/react/src/react-router-ts-solution.test.ts @@ -13,7 +13,18 @@ import { describe('React Router Applications - TS Solution', () => { const appName = uniq('app'); beforeAll(() => { - newProject({ preset: 'ts', packages: ['@nx/react'] }); + newProject({ + preset: 'ts', + packages: [ + '@nx/react', + '@nx/vite', + '@nx/vitest', + '@nx/jest', + '@nx/cypress', + '@nx/playwright', + '@nx/eslint', + ], + }); ensurePlaywrightBrowsersInstallation(); runCLI( `generate @nx/react:app ${appName} --use-react-router --routing --linter=eslint --unit-test-runner=vitest --e2e-test-runner=playwright --no-interactive` diff --git a/e2e/react/src/react-rsbuild.test.ts b/e2e/react/src/react-rsbuild.test.ts index 92f45a59e72be..61e4ffa37fa19 100644 --- a/e2e/react/src/react-rsbuild.test.ts +++ b/e2e/react/src/react-rsbuild.test.ts @@ -12,7 +12,14 @@ import { describe('Build React applications and libraries with Rsbuild', () => { beforeAll(() => { newProject({ - packages: ['@nx/react'], + packages: [ + '@nx/react', + '@nx/rsbuild', + '@nx/vite', + '@nx/vitest', + '@nx/jest', + '@nx/eslint', + ], }); }); diff --git a/e2e/react/src/react-rspack.test.ts b/e2e/react/src/react-rspack.test.ts index 5727827498472..1621fa575c544 100644 --- a/e2e/react/src/react-rspack.test.ts +++ b/e2e/react/src/react-rspack.test.ts @@ -14,7 +14,14 @@ describe('Build React applications and libraries with Rspack', () => { let proj: string; beforeAll(() => { proj = newProject({ - packages: ['@nx/react'], + packages: [ + '@nx/react', + '@nx/rspack', + '@nx/vite', + '@nx/vitest', + '@nx/eslint', + '@nx/playwright', + ], }); }); diff --git a/e2e/react/src/react-ts-solution.test.ts b/e2e/react/src/react-ts-solution.test.ts index 18ef46dd37d3d..47e4e353764b8 100644 --- a/e2e/react/src/react-ts-solution.test.ts +++ b/e2e/react/src/react-ts-solution.test.ts @@ -16,7 +16,17 @@ describe('React (TS solution)', () => { let workspaceName: string; beforeAll(() => { - workspaceName = newProject({ preset: 'ts', packages: ['@nx/react'] }); + workspaceName = newProject({ + preset: 'ts', + packages: [ + '@nx/react', + '@nx/webpack', + '@nx/rspack', + '@nx/vite', + '@nx/vitest', + '@nx/eslint', + ], + }); }); afterAll(() => cleanupProject()); diff --git a/e2e/react/src/react-vite.test.ts b/e2e/react/src/react-vite.test.ts index 91e742e9b65a5..e4a4659afde10 100644 --- a/e2e/react/src/react-vite.test.ts +++ b/e2e/react/src/react-vite.test.ts @@ -14,7 +14,14 @@ import { describe('Build React applications and libraries with Vite', () => { beforeAll(() => { newProject({ - packages: ['@nx/react'], + packages: [ + '@nx/react', + '@nx/vite', + '@nx/vitest', + '@nx/jest', + '@nx/eslint', + '@nx/playwright', + ], }); }); diff --git a/e2e/react/src/react-webpack.test.ts b/e2e/react/src/react-webpack.test.ts index 7794bde293766..30b0f90b9d717 100644 --- a/e2e/react/src/react-webpack.test.ts +++ b/e2e/react/src/react-webpack.test.ts @@ -15,7 +15,7 @@ import { describe('Build React applications and libraries with Webpack', () => { beforeAll(() => { newProject({ - packages: ['@nx/react'], + packages: ['@nx/react', '@nx/webpack', '@nx/playwright'], }); }); diff --git a/e2e/react/src/react.test.ts b/e2e/react/src/react.test.ts index a5954bf640fd0..03657bda73580 100644 --- a/e2e/react/src/react.test.ts +++ b/e2e/react/src/react.test.ts @@ -22,7 +22,17 @@ describe('React Applications', () => { let proj: string; describe('Crystal Supported Tests', () => { beforeAll(() => { - proj = newProject({ packages: ['@nx/react'] }); + proj = newProject({ + packages: [ + '@nx/react', + '@nx/webpack', + '@nx/vite', + '@nx/vitest', + '@nx/jest', + '@nx/cypress', + '@nx/eslint', + ], + }); ensureCypressInstallation(); }); @@ -362,7 +372,15 @@ describe('React Applications', () => { describe('Non-Crystal Tests', () => { beforeAll(() => { process.env.NX_ADD_PLUGINS = 'false'; - proj = newProject({ packages: ['@nx/react'] }); + proj = newProject({ + packages: [ + '@nx/react', + '@nx/webpack', + '@nx/jest', + '@nx/cypress', + '@nx/eslint', + ], + }); ensureCypressInstallation(); }); diff --git a/e2e/release/src/release-publishable-libraries-ts-solution.test.ts b/e2e/release/src/release-publishable-libraries-ts-solution.test.ts index 4779e717437b8..61e8fdb274999 100644 --- a/e2e/release/src/release-publishable-libraries-ts-solution.test.ts +++ b/e2e/release/src/release-publishable-libraries-ts-solution.test.ts @@ -52,7 +52,14 @@ describe('release publishable libraries in workspace with ts solution setup', () beforeAll(async () => { newProject({ - packages: ['@nx/js', '@nx/react', '@nx/vue', '@nx/react-native'], + packages: [ + '@nx/js', + '@nx/react', + '@nx/react-native', + '@nx/rollup', + '@nx/vite', + '@nx/vue', + ], preset: 'ts', }); diff --git a/e2e/release/src/release-publishable-libraries.test.ts b/e2e/release/src/release-publishable-libraries.test.ts index b3e5fc955473a..82edec02cc65a 100644 --- a/e2e/release/src/release-publishable-libraries.test.ts +++ b/e2e/release/src/release-publishable-libraries.test.ts @@ -55,11 +55,15 @@ describe('release publishable libraries', () => { beforeAll(async () => { newProject({ packages: [ + '@nx/angular', + '@nx/eslint', + '@nx/jest', '@nx/js', '@nx/react', - '@nx/angular', - '@nx/vue', '@nx/react-native', + '@nx/rollup', + '@nx/vite', + '@nx/vue', ], }); diff --git a/e2e/remix/src/nx-remix.test.ts b/e2e/remix/src/nx-remix.test.ts index 688a8fd17502a..4135af7b3bf93 100644 --- a/e2e/remix/src/nx-remix.test.ts +++ b/e2e/remix/src/nx-remix.test.ts @@ -14,7 +14,13 @@ describe('Remix E2E Tests', () => { describe('--integrated (npm)', () => { beforeAll(() => { newProject({ - packages: ['@nx/remix', '@nx/react'], + packages: [ + '@nx/remix', + '@nx/react', + '@nx/vite', + '@nx/vitest', + '@nx/eslint', + ], packageManager: 'npm', }); }); @@ -36,7 +42,15 @@ describe('Remix E2E Tests', () => { describe('--integrated (yarn)', () => { beforeAll(async () => { newProject({ - packages: ['@nx/remix', '@nx/react', '@nx/js'], + packages: [ + '@nx/remix', + '@nx/react', + '@nx/js', + '@nx/vite', + '@nx/vitest', + '@nx/jest', + '@nx/eslint', + ], packageManager: 'yarn', }); }); diff --git a/e2e/remix/src/remix-ts-solution.test.ts b/e2e/remix/src/remix-ts-solution.test.ts index 3921c126b1a4e..3ed640c82e952 100644 --- a/e2e/remix/src/remix-ts-solution.test.ts +++ b/e2e/remix/src/remix-ts-solution.test.ts @@ -9,7 +9,13 @@ import { describe('Remix - TS solution setup', () => { beforeEach(() => { newProject({ - packages: ['@nx/remix'], + packages: [ + '@nx/remix', + '@nx/vite', + '@nx/vitest', + '@nx/jest', + '@nx/eslint', + ], preset: 'ts', }); }); diff --git a/e2e/rollup/src/rollup-legacy.test.ts b/e2e/rollup/src/rollup-legacy.test.ts index 0b783645072d2..17382dd382de9 100644 --- a/e2e/rollup/src/rollup-legacy.test.ts +++ b/e2e/rollup/src/rollup-legacy.test.ts @@ -20,7 +20,9 @@ describe('Rollup Plugin', () => { beforeAll(() => { originalAddPluginsEnv = process.env.NX_ADD_PLUGINS; process.env.NX_ADD_PLUGINS = 'false'; - newProject({ packages: ['@nx/rollup', '@nx/js'] }); + newProject({ + packages: ['@nx/rollup', '@nx/js', '@nx/eslint', '@nx/jest'], + }); }); afterAll(() => { diff --git a/e2e/rollup/src/rollup.test.ts b/e2e/rollup/src/rollup.test.ts index d79623998b055..45e0b6ac5f672 100644 --- a/e2e/rollup/src/rollup.test.ts +++ b/e2e/rollup/src/rollup.test.ts @@ -13,7 +13,11 @@ import { } from '@nx/e2e-utils'; describe('Rollup Plugin', () => { - beforeAll(() => newProject({ packages: ['@nx/rollup', '@nx/js'] })); + beforeAll(() => + newProject({ + packages: ['@nx/rollup', '@nx/js', '@nx/eslint', '@nx/jest'], + }) + ); afterAll(() => cleanupProject()); it('should be able to setup project to build node programs with rollup and different compilers', async () => { diff --git a/e2e/storybook/src/storybook.test.ts b/e2e/storybook/src/storybook.test.ts index c6c9ea1926f0c..f24d0ccfa8ab4 100644 --- a/e2e/storybook/src/storybook.test.ts +++ b/e2e/storybook/src/storybook.test.ts @@ -19,7 +19,7 @@ describe('Storybook generators and executors for monorepos', () => { let proj; beforeAll(async () => { proj = newProject({ - packages: ['@nx/react'], + packages: ['@nx/react', '@nx/webpack'], }); runCLI( `generate @nx/react:app ${reactStorybookApp} --bundler=webpack --no-interactive` diff --git a/e2e/utils/create-project-utils.ts b/e2e/utils/create-project-utils.ts index cffaf7ded0e33..b5634b4129f93 100644 --- a/e2e/utils/create-project-utils.ts +++ b/e2e/utils/create-project-utils.ts @@ -58,6 +58,7 @@ const nxPackages = [ `@nx/rollup`, `@nx/react`, `@nx/remix`, + `@nx/rsbuild`, `@nx/rspack`, `@nx/storybook`, `@nx/vue`, diff --git a/e2e/utils/get-env-info.ts b/e2e/utils/get-env-info.ts index 8d2f4e2a1a132..8d1356c5b089e 100644 --- a/e2e/utils/get-env-info.ts +++ b/e2e/utils/get-env-info.ts @@ -141,7 +141,7 @@ export { } from './ensure-browser-installation'; export function getStrippedEnvironmentVariables() { - return Object.fromEntries( + const stripped = Object.fromEntries( Object.entries(process.env).filter(([key]) => { if (key.startsWith('NX_E2E_')) { return true; @@ -153,6 +153,7 @@ export function getStrippedEnvironmentVariables() { 'NX_VERBOSE_LOGGING', 'NX_NATIVE_LOGGING', 'NX_USE_LOCAL', + 'NX_PERF_LOGGING', ]; if (key.startsWith('NX_') && !allowedKeys.includes(key)) { @@ -189,4 +190,5 @@ export function getStrippedEnvironmentVariables() { return true; }) ); + return { ...stripped, NX_DAEMON: 'true' }; } diff --git a/e2e/vite/src/vite-esm.test.ts b/e2e/vite/src/vite-esm.test.ts index fbb82882718ec..036187f7fab30 100644 --- a/e2e/vite/src/vite-esm.test.ts +++ b/e2e/vite/src/vite-esm.test.ts @@ -11,7 +11,7 @@ import { describe('Vite ESM tests', () => { beforeAll(() => newProject({ - packages: ['@nx/react'], + packages: ['@nx/react', '@nx/vite'], }) ); diff --git a/e2e/vite/src/vite-legacy.test.ts b/e2e/vite/src/vite-legacy.test.ts index badd3ef0e1da0..ab6dae91cbfc3 100644 --- a/e2e/vite/src/vite-legacy.test.ts +++ b/e2e/vite/src/vite-legacy.test.ts @@ -33,7 +33,7 @@ describe('Vite Plugin', () => { originalEnv = process.env.NX_ADD_PLUGINS; process.env.NX_ADD_PLUGINS = 'false'; proj = newProject({ - packages: ['@nx/react', '@nx/web'], + packages: ['@nx/react', '@nx/web', '@nx/vite', '@nx/vitest', '@nx/js'], }); }); @@ -291,7 +291,7 @@ export default async function render(_url: string, document: string) { beforeAll(() => { proj = newProject({ name: uniq('vite-incr-build'), - packages: ['@nx/react'], + packages: ['@nx/react', '@nx/vite', '@nx/vitest', '@nx/js'], }); runCLI( `generate @nx/react:app ${app} --bundler=vite --unitTestRunner=vitest --no-interactive --directory=${app}` @@ -389,7 +389,10 @@ export default App; describe('using default project configuration', () => { const lib = uniq('my-default-lib'); beforeAll(() => { - proj = newProject({ name: uniq('vite-proj'), packages: ['@nx/react'] }); + proj = newProject({ + name: uniq('vite-proj'), + packages: ['@nx/react', '@nx/vite', '@nx/vitest'], + }); runCLI( `generate @nx/react:lib ${lib} --directory=libs/${lib} --unitTestRunner=vitest` ); @@ -429,7 +432,10 @@ export default App; describe('using custom project configuration', () => { const lib = uniq('my-custom-lib'); beforeEach(() => { - proj = newProject({ name: uniq('vite-proj'), packages: ['@nx/react'] }); + proj = newProject({ + name: uniq('vite-proj'), + packages: ['@nx/react', '@nx/vite', '@nx/vitest'], + }); }); it('should be able to run tests', async () => { @@ -588,7 +594,7 @@ export default defineConfig({ describe('ESM-only apps', () => { beforeAll(() => { newProject({ - packages: ['@nx/react'], + packages: ['@nx/react', '@nx/vite'], }); }); diff --git a/e2e/vite/src/vite-ts-solution.test.ts b/e2e/vite/src/vite-ts-solution.test.ts index 06dfa8aedf321..9d3e48f3b51a7 100644 --- a/e2e/vite/src/vite-ts-solution.test.ts +++ b/e2e/vite/src/vite-ts-solution.test.ts @@ -14,7 +14,13 @@ import { describe('Vite - TS solution setup', () => { beforeAll(() => { newProject({ - packages: ['@nx/react', '@nx/js'], + packages: [ + '@nx/react', + '@nx/js', + '@nx/vite', + '@nx/esbuild', + '@nx/rollup', + ], preset: 'ts', }); }); diff --git a/e2e/vite/src/vite.test.ts b/e2e/vite/src/vite.test.ts index 2d3859ee67c0c..a9fe80bef935a 100644 --- a/e2e/vite/src/vite.test.ts +++ b/e2e/vite/src/vite.test.ts @@ -33,7 +33,7 @@ describe('@nx/vite/plugin', () => { describe('with react', () => { beforeAll(() => { proj = newProject({ - packages: ['@nx/react', '@nx/vue'], + packages: ['@nx/react', '@nx/vue', '@nx/vite', '@nx/vitest'], }); runCLI( `generate @nx/react:app ${myApp} --directory=apps/${myApp} --bundler=vite --unitTestRunner=vitest` @@ -293,7 +293,7 @@ describe('@nx/vite/plugin', () => { beforeAll(() => { proj = newProject({ - packages: ['@nx/react'], + packages: ['@nx/react', '@nx/vite', '@nx/vitest'], }); runCLI( `generate @nx/react:app ${vite8App} --directory=apps/${vite8App} --bundler=vite --unitTestRunner=vitest` @@ -318,7 +318,7 @@ describe('@nx/vite/plugin', () => { beforeAll(() => { proj = newProject({ - packages: ['@nx/react'], + packages: ['@nx/react', '@nx/vite', '@nx/vitest'], }); runCLI( `generate @nx/react:app ${vite7App} --directory=apps/${vite7App} --bundler=vite --unitTestRunner=vitest` @@ -352,7 +352,7 @@ describe('@nx/vite/plugin', () => { beforeAll(() => { proj = newProject({ - packages: ['@nx/vitest', '@nx/react'], + packages: ['@nx/vitest', '@nx/react', '@nx/webpack', '@nx/vite'], }); runCLI( `generate @nx/react:app ${reactVitest} --bundler=webpack --unitTestRunner=vitest --e2eTestRunner=none` diff --git a/e2e/vue/src/vue-legacy.test.ts b/e2e/vue/src/vue-legacy.test.ts index 281b996362eaa..eb13d0f2cb358 100644 --- a/e2e/vue/src/vue-legacy.test.ts +++ b/e2e/vue/src/vue-legacy.test.ts @@ -5,7 +5,7 @@ describe('Vue Plugin (legacy)', () => { beforeAll(() => { proj = newProject({ - packages: ['@nx/vue'], + packages: ['@nx/vue', '@nx/vite', '@nx/vitest', '@nx/playwright'], }); }); diff --git a/e2e/vue/src/vue-storybook.test.ts b/e2e/vue/src/vue-storybook.test.ts index e430478c52bdc..9426b690abe0d 100644 --- a/e2e/vue/src/vue-storybook.test.ts +++ b/e2e/vue/src/vue-storybook.test.ts @@ -15,7 +15,7 @@ describe('Storybook generators and executors for Vue projects', () => { originalEnv = process.env.NX_ADD_PLUGINS; process.env.NX_ADD_PLUGINS = 'true'; proj = newProject({ - packages: ['@nx/vue'], + packages: ['@nx/vue', '@nx/vite', '@nx/storybook'], }); runCLI(`generate @nx/vue:app ${vueStorybookApp} --no-interactive`); runCLI( diff --git a/e2e/vue/src/vue-tailwind.test.ts b/e2e/vue/src/vue-tailwind.test.ts index 8303f2274f7bb..650051f3f4292 100644 --- a/e2e/vue/src/vue-tailwind.test.ts +++ b/e2e/vue/src/vue-tailwind.test.ts @@ -10,7 +10,7 @@ import { describe('vue tailwind support', () => { beforeAll(() => { - newProject({ packages: ['@nx/vue'] }); + newProject({ packages: ['@nx/vue', '@nx/vite'] }); }); afterAll(() => { diff --git a/e2e/vue/src/vue-ts-solution.test.ts b/e2e/vue/src/vue-ts-solution.test.ts index d82c798812e55..351ffde5ccbdd 100644 --- a/e2e/vue/src/vue-ts-solution.test.ts +++ b/e2e/vue/src/vue-ts-solution.test.ts @@ -12,7 +12,7 @@ describe('Vue (TS solution)', () => { beforeAll(() => { proj = newProject({ - packages: ['@nx/vue'], + packages: ['@nx/vue', '@nx/vite', '@nx/vitest', '@nx/playwright'], preset: 'ts', }); }); diff --git a/e2e/vue/src/vue.test.ts b/e2e/vue/src/vue.test.ts index 55b3c9be557ac..a66202847b1fe 100644 --- a/e2e/vue/src/vue.test.ts +++ b/e2e/vue/src/vue.test.ts @@ -13,7 +13,13 @@ describe('Vue Plugin', () => { beforeAll(() => { proj = newProject({ - packages: ['@nx/vue'], + packages: [ + '@nx/vue', + '@nx/vite', + '@nx/vitest', + '@nx/rsbuild', + '@nx/playwright', + ], }); }); diff --git a/e2e/web/src/file-server-legacy.test.ts b/e2e/web/src/file-server-legacy.test.ts index c6cdec44e0876..5b2cf690f01da 100644 --- a/e2e/web/src/file-server-legacy.test.ts +++ b/e2e/web/src/file-server-legacy.test.ts @@ -12,7 +12,7 @@ describe('file-server', () => { beforeAll(() => { newProject({ name: uniq('fileserver'), - packages: ['@nx/web', '@nx/angular', '@nx/react'], + packages: ['@nx/web', '@nx/angular', '@nx/react', '@nx/vite'], }); }); diff --git a/e2e/web/src/file-server.test.ts b/e2e/web/src/file-server.test.ts index 716785370fc06..371cacbafe38c 100644 --- a/e2e/web/src/file-server.test.ts +++ b/e2e/web/src/file-server.test.ts @@ -13,7 +13,10 @@ import { join } from 'path'; describe('file-server', () => { beforeAll(() => { - newProject({ name: uniq('fileserver'), packages: ['@nx/web'] }); + newProject({ + name: uniq('fileserver'), + packages: ['@nx/web', '@nx/webpack'], + }); }); afterAll(() => cleanupProject()); diff --git a/e2e/web/src/web-legacy.test.ts b/e2e/web/src/web-legacy.test.ts index 2299567c26120..c2d121afd193b 100644 --- a/e2e/web/src/web-legacy.test.ts +++ b/e2e/web/src/web-legacy.test.ts @@ -14,7 +14,17 @@ import { import { join } from 'path'; describe('Web Components Applications (legacy)', () => { - beforeEach(() => newProject({ packages: ['@nx/web', '@nx/react'] })); + beforeEach(() => + newProject({ + packages: [ + '@nx/web', + '@nx/react', + '@nx/webpack', + '@nx/rollup', + '@nx/jest', + ], + }) + ); afterEach(() => cleanupProject()); it('should remove previous output before building', async () => { diff --git a/e2e/web/src/web-vite.test.ts b/e2e/web/src/web-vite.test.ts index a17000b83e13d..d2a0997dd96af 100644 --- a/e2e/web/src/web-vite.test.ts +++ b/e2e/web/src/web-vite.test.ts @@ -13,7 +13,18 @@ import { } from '@nx/e2e-utils'; describe('Web Components Applications with bundler set as vite', () => { - beforeEach(() => newProject({ packages: ['@nx/web', '@nx/react'] })); + beforeEach(() => + newProject({ + packages: [ + '@nx/web', + '@nx/react', + '@nx/vite', + '@nx/vitest', + '@nx/eslint', + '@nx/cypress', + ], + }) + ); afterEach(() => cleanupProject()); it('should be able to generate a web app', async () => { diff --git a/e2e/web/src/web-webpack.test.ts b/e2e/web/src/web-webpack.test.ts index 47add23cbf710..060615ead63bb 100644 --- a/e2e/web/src/web-webpack.test.ts +++ b/e2e/web/src/web-webpack.test.ts @@ -8,7 +8,7 @@ import { } from '@nx/e2e-utils'; describe('Web Components Applications with bundler set as webpack', () => { - beforeEach(() => newProject({ packages: ['@nx/web'] })); + beforeEach(() => newProject({ packages: ['@nx/web', '@nx/webpack'] })); afterEach(() => cleanupProject()); it('should support https for dev-server (legacy)', async () => { diff --git a/e2e/web/src/web.test.ts b/e2e/web/src/web.test.ts index 8ed4dcff3e2b8..14ed8d6003d53 100644 --- a/e2e/web/src/web.test.ts +++ b/e2e/web/src/web.test.ts @@ -20,7 +20,18 @@ import { join } from 'path'; import { copyFileSync } from 'fs'; describe('Web Components Applications', () => { - beforeAll(() => newProject({ packages: ['@nx/web'] })); + beforeAll(() => + newProject({ + packages: [ + '@nx/web', + '@nx/webpack', + '@nx/vite', + '@nx/vitest', + '@nx/eslint', + '@nx/cypress', + ], + }) + ); afterAll(() => cleanupProject()); it('should be able to generate a web app', async () => { diff --git a/e2e/webpack/src/webpack.legacy.test.ts b/e2e/webpack/src/webpack.legacy.test.ts index 2d88d6a789922..dbe9f8f779a82 100644 --- a/e2e/webpack/src/webpack.legacy.test.ts +++ b/e2e/webpack/src/webpack.legacy.test.ts @@ -22,7 +22,16 @@ describe('Webpack Plugin (legacy)', () => { originalAddPluginsEnv = process.env.NX_ADD_PLUGINS; process.env.NX_ADD_PLUGINS = 'false'; newProject({ - packages: ['@nx/react'], + packages: [ + '@nx/react', + '@nx/webpack', + '@nx/cypress', + '@nx/playwright', + '@nx/jest', + '@nx/vite', + '@nx/vitest', + '@nx/eslint', + ], }); runCLI( `generate @nx/react:app ${appName} --bundler webpack --e2eTestRunner=cypress --rootProject --no-interactive --unitTestRunner=jest --linter=eslint` diff --git a/nx.json b/nx.json index e8e5b1460217b..e74f5d5aeb7c9 100644 --- a/nx.json +++ b/nx.json @@ -274,7 +274,7 @@ "nxCloudId": "62d013ea0852fe0a2df74438", "nxCloudUrl": "https://staging.nx.app", "parallel": 1, - "bust": 3, + "bust": 4, "defaultBase": "master", "sync": { "applyChanges": true }, "conformance": { diff --git a/packages/devkit/src/generators/format-files.ts b/packages/devkit/src/generators/format-files.ts index 6f9f10efff697..31c5a41ee67ad 100644 --- a/packages/devkit/src/generators/format-files.ts +++ b/packages/devkit/src/generators/format-files.ts @@ -59,6 +59,7 @@ export async function formatFiles( const changedPrettierInTree = getChangedPrettierConfigInTree(tree); + const formatStart = performance.now(); await Promise.all( Array.from(files).map(async (file) => { try { @@ -92,6 +93,7 @@ export async function formatFiles( } }) ); + performance.measure('format-files', { start: formatStart }); } function sortTsConfig(tree: Tree) { diff --git a/packages/devkit/src/tasks/install-packages-task.ts b/packages/devkit/src/tasks/install-packages-task.ts index 1fc7475305493..00c86f21a09f2 100644 --- a/packages/devkit/src/tasks/install-packages-task.ts +++ b/packages/devkit/src/tasks/install-packages-task.ts @@ -7,6 +7,7 @@ import { joinPathFragments, PackageManager, Tree, + logger, } from 'nx/src/devkit-exports'; /** @@ -45,6 +46,7 @@ export function installPackagesTask( stdio: process.env.NX_GENERATE_QUIET === 'true' ? 'ignore' : 'inherit', windowsHide: true, }; + logger.info(`Running ${pmc.install}...`); // ensure local registry from process is not interfering with the install // when we start the process from temp folder the local registry would override the custom registry if ( @@ -55,6 +57,13 @@ export function installPackagesTask( ) { delete process.env.npm_config_registry; } + const startTime = Date.now(); + const installStart = performance.now(); execSync(pmc.install, execSyncOptions); + const elapsed = ((Date.now() - startTime) / 1000).toFixed(1); + logger.info(`Package installation completed in ${elapsed}s`); + performance.measure(`install-packages-task:${packageManager}`, { + start: installStart, + }); } } diff --git a/packages/nx/src/command-line/generate/generate.ts b/packages/nx/src/command-line/generate/generate.ts index cbe31a435ba06..f2fc0a4b1621a 100644 --- a/packages/nx/src/command-line/generate/generate.ts +++ b/packages/nx/src/command-line/generate/generate.ts @@ -312,6 +312,7 @@ export async function generate(args: { [k: string]: any }) { let projectGraph: ProjectGraph | undefined; let projectsConfigurations: ProjectsConfigurations; + const projectGraphStart = performance.now(); if (args.skipProjectGraph) { const projects = await retrieveProjectConfigurationsWithoutPluginInference( @@ -323,6 +324,9 @@ export async function generate(args: { [k: string]: any }) { projectsConfigurations = readProjectsConfigurationFromProjectGraph(projectGraph); } + performance.measure('generate:project-graph', { + start: projectGraphStart, + }); const opts = await convertToGenerateOptions( args, @@ -411,7 +415,9 @@ export async function generate(args: { [k: string]: any }) { host.write('libs/.gitkeep', ''); } + const generatorStart = performance.now(); const task = await implementation(host, combinedOpts); + performance.measure('generate:run-generator', { start: generatorStart }); host.lock(); const changes = host.listChanges(); @@ -420,9 +426,13 @@ export async function generate(args: { [k: string]: any }) { printChanges(changes); } if (!opts.dryRun) { + const flushStart = performance.now(); flushChanges(workspaceRoot, changes); + performance.measure('generate:flush-changes', { start: flushStart }); if (task) { + const taskStart = performance.now(); await task(); + performance.measure('generate:post-task', { start: taskStart }); } } else { logger.warn(`\nNOTE: The "dryRun" flag means no changes were made.`); diff --git a/packages/nx/src/utils/perf-logging.ts b/packages/nx/src/utils/perf-logging.ts index 34c48f48bafee..32b234c6dc9b5 100644 --- a/packages/nx/src/utils/perf-logging.ts +++ b/packages/nx/src/utils/perf-logging.ts @@ -1,4 +1,4 @@ -import { PerformanceObserver } from 'perf_hooks'; +import { PerformanceEntry, PerformanceObserver } from 'perf_hooks'; import type { TrackedDetail } from './perf-hooks'; @@ -10,8 +10,7 @@ function isTrackedDetail(detail: unknown): detail is TrackedDetail { ); } -new PerformanceObserver((list) => { - const entries = list.getEntries(); +function handleEntries(entries: PerformanceEntry[]) { const logEnabled = process.env.NX_PERF_LOGGING === 'true'; const tracked = entries.filter((e) => isTrackedDetail(e.detail)); @@ -49,4 +48,17 @@ new PerformanceObserver((list) => { } reportEvent(entry.name, params); } -}).observe({ entryTypes: ['measure'] }); +} + +const observer = new PerformanceObserver((list) => + handleEntries(list.getEntries()) +); +observer.observe({ entryTypes: ['measure'] }); + +// `process.exit()` skips pending microtasks, so measures emitted just before +// exit (e.g. at the tail of a generator) never reach the observer callback. +// Drain synchronously on exit. +process.on('exit', () => { + const pending = observer.takeRecords(); + if (pending.length > 0) handleEntries(pending); +});