From c7f845b017a492116a1bc2f2aaa6325b68193e79 Mon Sep 17 00:00:00 2001 From: Juri Date: Fri, 17 Jan 2020 12:03:47 +0100 Subject: [PATCH] fix(misc): update package.json only if needed Adjusts the schematic to only touch the package.json if really required ISSUES CLOSED: #2317 --- packages/jest/src/schematics/init/init.ts | 107 ++++++++++++++++++---- 1 file changed, 89 insertions(+), 18 deletions(-) diff --git a/packages/jest/src/schematics/init/init.ts b/packages/jest/src/schematics/init/init.ts index 8fb9cdfb5fa89b..8a9ec58378b600 100644 --- a/packages/jest/src/schematics/init/init.ts +++ b/packages/jest/src/schematics/init/init.ts @@ -1,5 +1,9 @@ import { mergeWith, chain, url, Tree } from '@angular-devkit/schematics'; -import { addDepsToPackageJson, updateJsonInTree } from '@nrwl/workspace'; +import { + addDepsToPackageJson, + updateJsonInTree, + readJsonInTree +} from '@nrwl/workspace'; import { jestVersion, jestTypesVersion, @@ -9,22 +13,89 @@ import { import { Rule } from '@angular-devkit/schematics'; import { stripIndents } from '@angular-devkit/core/src/utils/literals'; -const updatePackageJson = chain([ - addDepsToPackageJson( - {}, - { - '@nrwl/jest': nxVersion, - jest: jestVersion, - '@types/jest': jestTypesVersion, - 'ts-jest': tsJestVersion - } - ), - updateJsonInTree('package.json', json => { - json.dependencies = json.dependencies || {}; - delete json.dependencies['@nrwl/jest']; - return json; - }) -]); +/** + * verifies whether the given packageJson dependencies require an update + * given the deps & devDeps passed in + */ +const requiresAddingOfPackages = (packageJsonFile, deps, devDeps): boolean => { + let needsDepsUpdate = false; + let needsDevDepsUpdate = false; + + if (Object.keys(deps).length > 0 && packageJsonFile.dependencies) { + needsDepsUpdate = !Object.keys(deps).find( + entry => packageJsonFile.dependencies[entry] + ); + } + + if (Object.keys(devDeps).length > 0 && packageJsonFile.dependencies) { + needsDevDepsUpdate = !Object.keys(devDeps).find( + entry => packageJsonFile.devDependencies[entry] + ); + } + + return needsDepsUpdate || needsDevDepsUpdate; +}; + +const updatePackageJson = (host: Tree): Rule => { + const rules = []; + + // check whether to update the packge.json is necessary + const currentPackageJson = readJsonInTree(host, 'package.json'); + const devDepstoUpdate = { + '@nrwl/jest': nxVersion, + jest: jestVersion, + '@types/jest': jestTypesVersion, + 'ts-jest': tsJestVersion + }; + + if (requiresAddingOfPackages(currentPackageJson, {}, devDepstoUpdate)) { + rules.push( + addDepsToPackageJson( + {}, + { + '@nrwl/jest': nxVersion, + jest: jestVersion, + '@types/jest': jestTypesVersion, + 'ts-jest': tsJestVersion + } + ) + ); + } + + if ( + currentPackageJson.dependencies && + currentPackageJson.dependencies['@nrwl/jest'] + ) { + rules.push( + updateJsonInTree('package.json', json => { + json.dependencies = json.dependencies || {}; + delete json.dependencies['@nrwl/jest']; + return json; + }) + ); + } + + return chain(rules); +}; + +const updatePackageJson2 = () => { + return chain([ + addDepsToPackageJson( + {}, + { + '@nrwl/jest': nxVersion, + jest: jestVersion, + '@types/jest': jestTypesVersion, + 'ts-jest': tsJestVersion + } + ), + updateJsonInTree('package.json', json => { + json.dependencies = json.dependencies || {}; + delete json.dependencies['@nrwl/jest']; + return json; + }) + ]); +}; const createJestConfig = (host: Tree) => { if (!host.exists('jest.config.js')) { @@ -46,5 +117,5 @@ const createJestConfig = (host: Tree) => { }; export default function(): Rule { - return chain([createJestConfig, updatePackageJson]); + return chain([createJestConfig, updatePackageJson2]); }