From 908cf41d74c52a3ceffeb6b97d6504b24bf92b1e Mon Sep 17 00:00:00 2001 From: Caleb Ukle Date: Tue, 28 Feb 2023 15:38:01 -0600 Subject: [PATCH] fix(testing): only install dependency for the desired --testEnvironment (#15244) (cherry picked from commit 2d2804b0c199c2fbbdf73557f7e31b241539b80d) --- .../packages/jest/generators/init.json | 7 ++++ .../jest/generators/jest-project.json | 2 +- .../jest/src/generators/init/init.spec.ts | 34 +++++++++++++++++++ packages/jest/src/generators/init/init.ts | 6 +++- packages/jest/src/generators/init/schema.d.ts | 1 + packages/jest/src/generators/init/schema.json | 7 ++++ .../generators/jest-project/jest-project.ts | 4 +-- .../jest-project/lib/create-files.ts | 5 +++ .../src/generators/jest-project/schema.d.ts | 2 +- .../src/generators/jest-project/schema.json | 2 +- packages/node/src/generators/init/init.ts | 4 ++- .../src/generators/library/library.spec.ts | 6 ++++ 12 files changed, 72 insertions(+), 8 deletions(-) diff --git a/docs/generated/packages/jest/generators/init.json b/docs/generated/packages/jest/generators/init.json index db6e7f00b3991..4a12131dd5141 100644 --- a/docs/generated/packages/jest/generators/init.json +++ b/docs/generated/packages/jest/generators/init.json @@ -21,6 +21,13 @@ "description": "Do not add dependencies to `package.json`.", "x-priority": "internal" }, + "testEnvironment": { + "type": "string", + "enum": ["jsdom", "node", "none"], + "description": "The test environment for jest. This controls which jest-environment-* package is installed", + "default": "jsdom", + "x-priority": "important" + }, "js": { "type": "boolean", "default": false, diff --git a/docs/generated/packages/jest/generators/jest-project.json b/docs/generated/packages/jest/generators/jest-project.json index e4669d1d36218..36cbb1933c04a 100644 --- a/docs/generated/packages/jest/generators/jest-project.json +++ b/docs/generated/packages/jest/generators/jest-project.json @@ -41,7 +41,7 @@ }, "testEnvironment": { "type": "string", - "enum": ["jsdom", "node"], + "enum": ["jsdom", "node", "none"], "description": "The test environment for jest.", "default": "jsdom", "x-priority": "important" diff --git a/packages/jest/src/generators/init/init.spec.ts b/packages/jest/src/generators/init/init.spec.ts index b3091ca1039be..b2f25d10ad108 100644 --- a/packages/jest/src/generators/init/init.spec.ts +++ b/packages/jest/src/generators/init/init.spec.ts @@ -131,6 +131,40 @@ export default { expect(packageJson.devDependencies['@types/jest']).toBeDefined(); expect(packageJson.devDependencies['ts-jest']).toBeDefined(); expect(packageJson.devDependencies['ts-node']).toBeDefined(); + expect(packageJson.devDependencies['jest-environment-jsdom']).toBeDefined(); + expect( + packageJson.devDependencies['jest-environment-node'] + ).not.toBeDefined(); + }); + + it('should add dependencies --testEnvironment=node', async () => { + await jestInitGenerator(tree, { testEnvironment: 'node' }); + const packageJson = readJson(tree, 'package.json'); + expect(packageJson.devDependencies.jest).toBeDefined(); + expect(packageJson.devDependencies['@nrwl/jest']).toBeDefined(); + expect(packageJson.devDependencies['@types/jest']).toBeDefined(); + expect(packageJson.devDependencies['ts-jest']).toBeDefined(); + expect(packageJson.devDependencies['ts-node']).toBeDefined(); + expect(packageJson.devDependencies['jest-environment-node']).toBeDefined(); + expect( + packageJson.devDependencies['jest-environment-jsdom'] + ).not.toBeDefined(); + }); + + it('should add dependencies --testEnvironment=none', async () => { + await jestInitGenerator(tree, { testEnvironment: 'none' }); + const packageJson = readJson(tree, 'package.json'); + expect(packageJson.devDependencies.jest).toBeDefined(); + expect(packageJson.devDependencies['@nrwl/jest']).toBeDefined(); + expect(packageJson.devDependencies['@types/jest']).toBeDefined(); + expect(packageJson.devDependencies['ts-jest']).toBeDefined(); + expect(packageJson.devDependencies['ts-node']).toBeDefined(); + expect( + packageJson.devDependencies['jest-environment-jsdom'] + ).not.toBeDefined(); + expect( + packageJson.devDependencies['jest-environment-node'] + ).not.toBeDefined(); }); it('should make js jest files', async () => { diff --git a/packages/jest/src/generators/init/init.ts b/packages/jest/src/generators/init/init.ts index f11be8529310e..5196fa9f37b2c 100644 --- a/packages/jest/src/generators/init/init.ts +++ b/packages/jest/src/generators/init/init.ts @@ -33,6 +33,7 @@ const schemaDefaults = { compiler: 'tsc', js: false, rootProject: false, + testEnvironment: 'jsdom', } as const; function generateGlobalConfig(tree: Tree, isJS: boolean) { @@ -146,7 +147,6 @@ function updateDependencies(tree: Tree, options: NormalizedSchema) { const devDeps = { '@nrwl/jest': nxVersion, jest: jestVersion, - 'jest-environment-jsdom': jestVersion, // because the default jest-preset uses ts-jest, // jest will throw an error if it's not installed @@ -154,6 +154,10 @@ function updateDependencies(tree: Tree, options: NormalizedSchema) { 'ts-jest': tsJestVersion, }; + if (options.testEnvironment !== 'none') { + devDeps[`jest-environment-${options.testEnvironment}`] = jestVersion; + } + if (!options.js) { devDeps['ts-node'] = tsNodeVersion; devDeps['@types/jest'] = jestTypesVersion; diff --git a/packages/jest/src/generators/init/schema.d.ts b/packages/jest/src/generators/init/schema.d.ts index 5e897dfd22b08..7bc5b047ff35a 100644 --- a/packages/jest/src/generators/init/schema.d.ts +++ b/packages/jest/src/generators/init/schema.d.ts @@ -2,6 +2,7 @@ export interface JestInitSchema { compiler?: 'tsc' | 'babel' | 'swc'; js?: boolean; skipPackageJson?: boolean; + testEnvironment?: 'node' | 'jsdom' | 'none'; /** * @deprecated */ diff --git a/packages/jest/src/generators/init/schema.json b/packages/jest/src/generators/init/schema.json index bc58a5b7e0a91..b0391c43b5526 100644 --- a/packages/jest/src/generators/init/schema.json +++ b/packages/jest/src/generators/init/schema.json @@ -18,6 +18,13 @@ "description": "Do not add dependencies to `package.json`.", "x-priority": "internal" }, + "testEnvironment": { + "type": "string", + "enum": ["jsdom", "node", "none"], + "description": "The test environment for jest. This controls which jest-environment-* package is installed", + "default": "jsdom", + "x-priority": "important" + }, "js": { "type": "boolean", "default": false, diff --git a/packages/jest/src/generators/jest-project/jest-project.ts b/packages/jest/src/generators/jest-project/jest-project.ts index 315f43397c9da..341987668f533 100644 --- a/packages/jest/src/generators/jest-project/jest-project.ts +++ b/packages/jest/src/generators/jest-project/jest-project.ts @@ -18,15 +18,13 @@ const schemaDefaults = { skipSetupFile: false, skipSerializers: false, rootProject: false, + testEnvironment: 'jsdom', } as const; function normalizeOptions(options: JestProjectSchema) { if (!options.testEnvironment) { options.testEnvironment = 'jsdom'; } - if (options.testEnvironment === 'jsdom') { - options.testEnvironment = ''; - } if (!options.hasOwnProperty('supportTsx')) { options.supportTsx = false; diff --git a/packages/jest/src/generators/jest-project/lib/create-files.ts b/packages/jest/src/generators/jest-project/lib/create-files.ts index f57935f6f95b2..c473c4cba8e99 100644 --- a/packages/jest/src/generators/jest-project/lib/create-files.ts +++ b/packages/jest/src/generators/jest-project/lib/create-files.ts @@ -31,6 +31,11 @@ export function createFiles(tree: Tree, options: JestProjectSchema) { generateFiles(tree, join(__dirname, filesFolder), projectConfig.root, { tmpl: '', ...options, + // jsdom is the default + testEnvironment: + options.testEnvironment === 'none' || options.testEnvironment === 'jsdom' + ? '' + : options.testEnvironment, transformer, transformerOptions, js: !!options.js, diff --git a/packages/jest/src/generators/jest-project/schema.d.ts b/packages/jest/src/generators/jest-project/schema.d.ts index 2cd46971f899e..e5480c12866aa 100644 --- a/packages/jest/src/generators/jest-project/schema.d.ts +++ b/packages/jest/src/generators/jest-project/schema.d.ts @@ -7,7 +7,7 @@ export interface JestProjectSchema { skipSetupFile?: boolean; setupFile?: 'angular' | 'web-components' | 'none'; skipSerializers?: boolean; - testEnvironment?: 'node' | 'jsdom' | ''; + testEnvironment?: 'node' | 'jsdom' | 'none'; /** * @deprecated use compiler: "babel" instead */ diff --git a/packages/jest/src/generators/jest-project/schema.json b/packages/jest/src/generators/jest-project/schema.json index ce127efbbb64f..c1755115c9cc2 100644 --- a/packages/jest/src/generators/jest-project/schema.json +++ b/packages/jest/src/generators/jest-project/schema.json @@ -40,7 +40,7 @@ }, "testEnvironment": { "type": "string", - "enum": ["jsdom", "node"], + "enum": ["jsdom", "node", "none"], "description": "The test environment for jest.", "default": "jsdom", "x-priority": "important" diff --git a/packages/node/src/generators/init/init.ts b/packages/node/src/generators/init/init.ts index 34929de14cbe6..1e39be7088e4e 100644 --- a/packages/node/src/generators/init/init.ts +++ b/packages/node/src/generators/init/init.ts @@ -47,7 +47,9 @@ export async function initGenerator(tree: Tree, schema: Schema) { }) ); if (options.unitTestRunner === 'jest') { - tasks.push(await jestInitGenerator(tree, schema)); + tasks.push( + await jestInitGenerator(tree, { ...schema, testEnvironment: 'node' }) + ); } tasks.push(updateDependencies(tree)); diff --git a/packages/node/src/generators/library/library.spec.ts b/packages/node/src/generators/library/library.spec.ts index 1f2f00623228d..dabc88005c3b5 100644 --- a/packages/node/src/generators/library/library.spec.ts +++ b/packages/node/src/generators/library/library.spec.ts @@ -49,6 +49,12 @@ describe('lib', () => { }, }, }); + expect( + readJson(tree, 'package.json').devDependencies['jest-environment-jsdom'] + ).not.toBeDefined(); + expect( + readJson(tree, 'package.json').devDependencies['jest-environment-node'] + ).toBeDefined(); }); it('adds srcRootForCompilationRoot', async () => {