diff --git a/docs/generated/packages/jest/generators/configuration.json b/docs/generated/packages/jest/generators/configuration.json index 2c335da76c..8f8e48f52e 100644 --- a/docs/generated/packages/jest/generators/configuration.json +++ b/docs/generated/packages/jest/generators/configuration.json @@ -79,6 +79,12 @@ "runtimeTsconfigFileName": { "type": "string", "description": "The name of the project's tsconfig file that includes the runtime source files. If not provided, it will default to `tsconfig.lib.json` for libraries and `tsconfig.app.json` for applications." + }, + "keepExistingVersions": { + "type": "boolean", + "x-priority": "internal", + "description": "Keep existing dependencies versions", + "default": true } }, "required": [], diff --git a/e2e/js/src/js-generators.ts b/e2e/js/src/js-generators.ts index 0f0022936a..fcd90d488d 100644 --- a/e2e/js/src/js-generators.ts +++ b/e2e/js/src/js-generators.ts @@ -2,12 +2,15 @@ import { checkFilesDoNotExist, checkFilesExist, cleanupProject, + detectPackageManager, + getPackageManagerCommand, newProject, readFile, readJson, rmDist, runCLI, runCLIAsync, + runCommand, uniq, updateFile, updateJson, @@ -187,4 +190,23 @@ describe('js e2e', () => { 'Test Suites: 1 passed, 1 total' ); }, 500_000); + + it('should not update dependencies if they already exist', () => { + const lib = uniq('@my-org/mylib'); + const currentJestVersion = '28.0.0'; + const pm = detectPackageManager(); + // set jest version + updateJson('package.json', (json) => { + json.devDependencies['jest'] = currentJestVersion; + return json; + }); + + runCommand(getPackageManagerCommand({ packageManager: pm }).install); + + runCLI(`generate @nx/js:lib ${lib} --bundler=tsc --unitTestRunner=jest`); + + const jestVersionAfterInstall = + readJson('package.json').devDependencies['jest']; + expect(jestVersionAfterInstall).toEqual(currentJestVersion); + }); }); diff --git a/packages/jest/src/generators/configuration/configuration.ts b/packages/jest/src/generators/configuration/configuration.ts index 30a4968ff1..bdd2fa6e6c 100644 --- a/packages/jest/src/generators/configuration/configuration.ts +++ b/packages/jest/src/generators/configuration/configuration.ts @@ -71,6 +71,7 @@ function normalizeOptions( return { ...schemaDefaults, ...options, + keepExistingVersions: options.keepExistingVersions ?? true, rootProject: project.root === '.' || project.root === '', isTsSolutionSetup: isUsingTsSolutionSetup(tree), }; diff --git a/packages/jest/src/generators/configuration/lib/ensure-dependencies.ts b/packages/jest/src/generators/configuration/lib/ensure-dependencies.ts index e821bbd26e..c83e2f5362 100644 --- a/packages/jest/src/generators/configuration/lib/ensure-dependencies.ts +++ b/packages/jest/src/generators/configuration/lib/ensure-dependencies.ts @@ -44,5 +44,11 @@ export function ensureDependencies( devDeps['@swc/jest'] = swcJestVersion; } - return addDependenciesToPackageJson(tree, dependencies, devDeps); + return addDependenciesToPackageJson( + tree, + dependencies, + devDeps, + undefined, + options.keepExistingVersions + ); } diff --git a/packages/jest/src/generators/configuration/schema.d.ts b/packages/jest/src/generators/configuration/schema.d.ts index 6f3d4a8629..2adf947fda 100644 --- a/packages/jest/src/generators/configuration/schema.d.ts +++ b/packages/jest/src/generators/configuration/schema.d.ts @@ -30,6 +30,7 @@ export interface JestProjectSchema { * @deprecated Use the `setupFile` option instead. It will be removed in Nx v22. */ skipSetupFile?: boolean; + keepExistingVersions?: boolean; } export type NormalizedJestProjectSchema = JestProjectSchema & { diff --git a/packages/jest/src/generators/configuration/schema.json b/packages/jest/src/generators/configuration/schema.json index 1125f2e191..9eca4736ce 100644 --- a/packages/jest/src/generators/configuration/schema.json +++ b/packages/jest/src/generators/configuration/schema.json @@ -78,6 +78,12 @@ "runtimeTsconfigFileName": { "type": "string", "description": "The name of the project's tsconfig file that includes the runtime source files. If not provided, it will default to `tsconfig.lib.json` for libraries and `tsconfig.app.json` for applications." + }, + "keepExistingVersions": { + "type": "boolean", + "x-priority": "internal", + "description": "Keep existing dependencies versions", + "default": true } }, "required": []