fix(devkit): do not duplicate dependencies (#10921)
This commit is contained in:
parent
1c66a225e5
commit
f4ce897128
@ -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();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user