feat(devkit): add a flag to keep existing versions when calling addDependenciesToPackageJson (#21123)
This commit is contained in:
parent
f02492301a
commit
253c0ff2ab
@ -1,6 +1,6 @@
|
|||||||
# Function: addDependenciesToPackageJson
|
# Function: addDependenciesToPackageJson
|
||||||
|
|
||||||
▸ **addDependenciesToPackageJson**(`tree`, `dependencies`, `devDependencies`, `packageJsonPath?`): [`GeneratorCallback`](../../devkit/documents/GeneratorCallback)
|
▸ **addDependenciesToPackageJson**(`tree`, `dependencies`, `devDependencies`, `packageJsonPath?`, `keepExistingVersions?`): [`GeneratorCallback`](../../devkit/documents/GeneratorCallback)
|
||||||
|
|
||||||
Add Dependencies and Dev Dependencies to package.json
|
Add Dependencies and Dev Dependencies to package.json
|
||||||
|
|
||||||
@ -14,12 +14,13 @@ This will **add** `react` and `jest` to the dependencies and devDependencies sec
|
|||||||
|
|
||||||
#### Parameters
|
#### Parameters
|
||||||
|
|
||||||
| Name | Type | Description |
|
| Name | Type | Description |
|
||||||
| :----------------- | :------------------------------------ | :---------------------------------------------------------------------- |
|
| :---------------------- | :------------------------------------ | :-------------------------------------------------------------------------- |
|
||||||
| `tree` | [`Tree`](../../devkit/documents/Tree) | Tree representing file system to modify |
|
| `tree` | [`Tree`](../../devkit/documents/Tree) | Tree representing file system to modify |
|
||||||
| `dependencies` | `Record`\<`string`, `string`\> | Dependencies to be added to the dependencies section of package.json |
|
| `dependencies` | `Record`\<`string`, `string`\> | Dependencies to be added to the dependencies section of package.json |
|
||||||
| `devDependencies` | `Record`\<`string`, `string`\> | Dependencies to be added to the devDependencies section of package.json |
|
| `devDependencies` | `Record`\<`string`, `string`\> | Dependencies to be added to the devDependencies section of package.json |
|
||||||
| `packageJsonPath?` | `string` | Path to package.json |
|
| `packageJsonPath?` | `string` | Path to package.json |
|
||||||
|
| `keepExistingVersions?` | `boolean` | If true, prevents existing dependencies from being bumped to newer versions |
|
||||||
|
|
||||||
#### Returns
|
#### Returns
|
||||||
|
|
||||||
|
|||||||
@ -446,6 +446,29 @@ describe('addDependenciesToPackageJson', () => {
|
|||||||
});
|
});
|
||||||
expect(installTask).toBeDefined();
|
expect(installTask).toBeDefined();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should allow existing versions to be kept', () => {
|
||||||
|
writeJson(tree, 'package.json', {
|
||||||
|
dependencies: {
|
||||||
|
foo: '1.0.0',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
addDependenciesToPackageJson(
|
||||||
|
tree,
|
||||||
|
{
|
||||||
|
foo: '2.0.0',
|
||||||
|
},
|
||||||
|
{},
|
||||||
|
undefined,
|
||||||
|
true
|
||||||
|
);
|
||||||
|
|
||||||
|
const result = readJson(tree, 'package.json');
|
||||||
|
expect(result.dependencies).toEqual({
|
||||||
|
foo: '1.0.0',
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('ensurePackage', () => {
|
describe('ensurePackage', () => {
|
||||||
|
|||||||
@ -132,13 +132,15 @@ function updateExistingDependenciesVersion(
|
|||||||
* @param dependencies Dependencies to be added to the dependencies section of package.json
|
* @param dependencies Dependencies to be added to the dependencies section of package.json
|
||||||
* @param devDependencies Dependencies to be added to the devDependencies section of package.json
|
* @param devDependencies Dependencies to be added to the devDependencies section of package.json
|
||||||
* @param packageJsonPath Path to package.json
|
* @param packageJsonPath Path to package.json
|
||||||
|
* @param keepExistingVersions If true, prevents existing dependencies from being bumped to newer versions
|
||||||
* @returns Callback to install dependencies only if necessary, no-op otherwise
|
* @returns Callback to install dependencies only if necessary, no-op otherwise
|
||||||
*/
|
*/
|
||||||
export function addDependenciesToPackageJson(
|
export function addDependenciesToPackageJson(
|
||||||
tree: Tree,
|
tree: Tree,
|
||||||
dependencies: Record<string, string>,
|
dependencies: Record<string, string>,
|
||||||
devDependencies: Record<string, string>,
|
devDependencies: Record<string, string>,
|
||||||
packageJsonPath: string = 'package.json'
|
packageJsonPath: string = 'package.json',
|
||||||
|
keepExistingVersions?: boolean
|
||||||
): GeneratorCallback {
|
): GeneratorCallback {
|
||||||
const currentPackageJson = readJson(tree, packageJsonPath);
|
const currentPackageJson = readJson(tree, packageJsonPath);
|
||||||
|
|
||||||
@ -155,6 +157,7 @@ export function addDependenciesToPackageJson(
|
|||||||
|
|
||||||
// filtered dependencies should consist of:
|
// filtered dependencies should consist of:
|
||||||
// - dependencies of the same type that are not present
|
// - dependencies of the same type that are not present
|
||||||
|
// by default, filtered dependencies also include these (unless keepExistingVersions is true):
|
||||||
// - dependencies of the same type that have greater version
|
// - dependencies of the same type that have greater version
|
||||||
// - specified dependencies of the other type that have greater version and are already installed as current type
|
// - specified dependencies of the other type that have greater version and are already installed as current type
|
||||||
filteredDependencies = {
|
filteredDependencies = {
|
||||||
@ -178,14 +181,25 @@ export function addDependenciesToPackageJson(
|
|||||||
),
|
),
|
||||||
};
|
};
|
||||||
|
|
||||||
filteredDependencies = removeLowerVersions(
|
if (keepExistingVersions) {
|
||||||
filteredDependencies,
|
filteredDependencies = removeExistingDependencies(
|
||||||
currentPackageJson.dependencies
|
filteredDependencies,
|
||||||
);
|
currentPackageJson.dependencies
|
||||||
filteredDevDependencies = removeLowerVersions(
|
);
|
||||||
filteredDevDependencies,
|
filteredDevDependencies = removeExistingDependencies(
|
||||||
currentPackageJson.devDependencies
|
filteredDevDependencies,
|
||||||
);
|
currentPackageJson.devDependencies
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
filteredDependencies = removeLowerVersions(
|
||||||
|
filteredDependencies,
|
||||||
|
currentPackageJson.dependencies
|
||||||
|
);
|
||||||
|
filteredDevDependencies = removeLowerVersions(
|
||||||
|
filteredDevDependencies,
|
||||||
|
currentPackageJson.devDependencies
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
requiresAddingOfPackages(
|
requiresAddingOfPackages(
|
||||||
@ -227,12 +241,24 @@ function removeLowerVersions(
|
|||||||
) {
|
) {
|
||||||
return Object.keys(incomingDeps).reduce((acc, d) => {
|
return Object.keys(incomingDeps).reduce((acc, d) => {
|
||||||
if (
|
if (
|
||||||
existingDeps?.[d] &&
|
!existingDeps?.[d] ||
|
||||||
!isIncomingVersionGreater(incomingDeps[d], existingDeps[d])
|
isIncomingVersionGreater(incomingDeps[d], existingDeps[d])
|
||||||
) {
|
) {
|
||||||
return acc;
|
acc[d] = incomingDeps[d];
|
||||||
}
|
}
|
||||||
return { ...acc, [d]: incomingDeps[d] };
|
return acc;
|
||||||
|
}, {});
|
||||||
|
}
|
||||||
|
|
||||||
|
function removeExistingDependencies(
|
||||||
|
incomingDeps: Record<string, string>,
|
||||||
|
existingDeps: Record<string, string>
|
||||||
|
): Record<string, string> {
|
||||||
|
return Object.keys(incomingDeps).reduce((acc, d) => {
|
||||||
|
if (!existingDeps?.[d]) {
|
||||||
|
acc[d] = incomingDeps[d];
|
||||||
|
}
|
||||||
|
return acc;
|
||||||
}, {});
|
}, {});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -129,6 +129,6 @@ describe('monorepo generator', () => {
|
|||||||
|
|
||||||
// Extracted base config files
|
// Extracted base config files
|
||||||
expect(tree.exists('tsconfig.base.json')).toBeTruthy();
|
expect(tree.exists('tsconfig.base.json')).toBeTruthy();
|
||||||
expect(tree.exists('jest.config.ts')).toBeTruthy();
|
expect(tree.exists('jest.preset.js')).toBeTruthy();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@ -25,7 +25,7 @@ export function moveProjectFiles(
|
|||||||
'.babelrc',
|
'.babelrc',
|
||||||
'.eslintrc.json',
|
'.eslintrc.json',
|
||||||
'eslint.config.js',
|
'eslint.config.js',
|
||||||
/^jest\.config\.(app|lib)\.[jt]s$/,
|
/^jest\.config\.((app|lib)\.)?[jt]s$/,
|
||||||
'vite.config.ts',
|
'vite.config.ts',
|
||||||
/^webpack.*\.js$/,
|
/^webpack.*\.js$/,
|
||||||
'index.html', // Vite
|
'index.html', // Vite
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user