fix(devkit): do not duplicate dependencies (#10921)

This commit is contained in:
Colum Ferry 2022-08-03 17:23:25 +01:00 committed by GitHub
parent 1c66a225e5
commit f4ce897128
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 97 additions and 3 deletions

View File

@ -75,4 +75,72 @@ describe('addDependenciesToPackageJson', () => {
}); });
expect(installTask).toBeDefined(); expect(installTask).toBeDefined();
}); });
it('should not add dependencies when they exist in devDependencies or vice versa', () => {
// ARRANGE
writeJson(tree, 'package.json', {
dependencies: {
'@nrwl/angular': 'latest',
},
devDependencies: {
'@nrwl/next': 'latest',
},
});
// ACT
const installTask = addDependenciesToPackageJson(
tree,
{
'@nrwl/next': 'next',
},
{
'@nrwl/angular': 'next',
}
);
// ASSERT
const { dependencies, devDependencies } = readJson(tree, 'package.json');
expect(dependencies).toEqual({
'@nrwl/angular': 'latest',
});
expect(devDependencies).toEqual({
'@nrwl/next': 'latest',
});
expect(installTask).toBeDefined();
});
it('should add additional dependencies when they dont exist in devDependencies or vice versa and not update the ones that do exist', () => {
// ARRANGE
writeJson(tree, 'package.json', {
dependencies: {
'@nrwl/angular': 'latest',
},
devDependencies: {
'@nrwl/next': 'latest',
},
});
// ACT
const installTask = addDependenciesToPackageJson(
tree,
{
'@nrwl/next': 'next',
'@nrwl/cypress': 'latest',
},
{
'@nrwl/angular': 'next',
}
);
// ASSERT
const { dependencies, devDependencies } = readJson(tree, 'package.json');
expect(dependencies).toEqual({
'@nrwl/angular': 'latest',
'@nrwl/cypress': 'latest',
});
expect(devDependencies).toEqual({
'@nrwl/next': 'latest',
});
expect(installTask).toBeDefined();
});
}); });

View File

@ -3,6 +3,19 @@ import { installPackagesTask } from '../tasks/install-packages-task';
import type { Tree } from 'nx/src/generators/tree'; import type { Tree } from 'nx/src/generators/tree';
import { GeneratorCallback } from 'nx/src/config/misc-interfaces'; import { GeneratorCallback } from 'nx/src/config/misc-interfaces';
function filterExistingDependencies(
dependencies: Record<string, string>,
existingDependencies: Record<string, string>
) {
if (!existingDependencies) {
return dependencies;
}
return Object.keys(dependencies ?? {})
.filter((d) => !existingDependencies[d])
.reduce((acc, d) => ({ ...acc, [d]: dependencies[d] }), {});
}
/** /**
* Add Dependencies and Dev Dependencies to package.json * Add Dependencies and Dev Dependencies to package.json
* *
@ -26,18 +39,31 @@ export function addDependenciesToPackageJson(
): GeneratorCallback { ): GeneratorCallback {
const currentPackageJson = readJson(tree, packageJsonPath); const currentPackageJson = readJson(tree, packageJsonPath);
const filteredDependencies = filterExistingDependencies(
dependencies,
currentPackageJson.devDependencies
);
const filteredDevDependencies = filterExistingDependencies(
devDependencies,
currentPackageJson.dependencies
);
if ( if (
requiresAddingOfPackages(currentPackageJson, dependencies, devDependencies) requiresAddingOfPackages(
currentPackageJson,
filteredDependencies,
filteredDevDependencies
)
) { ) {
updateJson(tree, packageJsonPath, (json) => { updateJson(tree, packageJsonPath, (json) => {
json.dependencies = { json.dependencies = {
...(json.dependencies || {}), ...(json.dependencies || {}),
...dependencies, ...filteredDependencies,
...(json.dependencies || {}), ...(json.dependencies || {}),
}; };
json.devDependencies = { json.devDependencies = {
...(json.devDependencies || {}), ...(json.devDependencies || {}),
...devDependencies, ...filteredDevDependencies,
...(json.devDependencies || {}), ...(json.devDependencies || {}),
}; };
json.dependencies = sortObjectByKeys(json.dependencies); json.dependencies = sortObjectByKeys(json.dependencies);