Skip to content

Commit 0760dad

Browse files
devversionjelbourn
authored andcommitted
fix(ng-add): inserted dependencies should be sorted (#12847)
In case someone runs `ng add @angular/material`, all required dependencies are just inserted at the end of the `dependencies` object. We should sort the dependencies after adding dependencies.
1 parent c09da0b commit 0760dad

File tree

3 files changed

+28
-15
lines changed

3 files changed

+28
-15
lines changed

src/lib/schematics/install/index.spec.ts

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,17 @@ describe('material-install-schematic', () => {
3030
it('should update package.json', () => {
3131
const tree = runner.runSchematic('ng-add', {}, appTree);
3232
const packageJson = JSON.parse(getFileContent(tree, '/package.json'));
33-
const angularCoreVersion = packageJson.dependencies['@angular/core'];
33+
const dependencies = packageJson.dependencies;
34+
const angularCoreVersion = dependencies['@angular/core'];
3435

35-
expect(packageJson.dependencies['@angular/material']).toBeDefined();
36-
expect(packageJson.dependencies['@angular/cdk']).toBeDefined();
37-
expect(packageJson.dependencies['hammerjs']).toBeDefined();
38-
expect(packageJson.dependencies['@angular/animations']).toBe(angularCoreVersion,
36+
expect(dependencies['@angular/material']).toBeDefined();
37+
expect(dependencies['@angular/cdk']).toBeDefined();
38+
expect(dependencies['hammerjs']).toBeDefined();
39+
expect(dependencies['@angular/animations']).toBe(angularCoreVersion,
3940
'Expected the @angular/animations package to have the same version as @angular/core.');
41+
42+
expect(Object.keys(dependencies)).toEqual(Object.keys(dependencies).sort(),
43+
'Expected the modified "dependencies" to be sorted alphabetically.');
4044
});
4145

4246
it('should add hammerjs import to project main file', () => {

src/lib/schematics/install/index.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,13 +57,13 @@ function addMaterialToPackageJson(options: Schema) {
5757
// have the same version tag if possible.
5858
const ngCoreVersionTag = getPackageVersionFromPackageJson(host, '@angular/core');
5959

60-
addPackageToPackageJson(host, 'dependencies', '@angular/cdk', `^${materialVersion}`);
61-
addPackageToPackageJson(host, 'dependencies', '@angular/material', `^${materialVersion}`);
62-
addPackageToPackageJson(host, 'dependencies', '@angular/animations',
60+
addPackageToPackageJson(host, '@angular/cdk', `^${materialVersion}`);
61+
addPackageToPackageJson(host, '@angular/material', `^${materialVersion}`);
62+
addPackageToPackageJson(host, '@angular/animations',
6363
ngCoreVersionTag || requiredAngularVersionRange);
6464

6565
if (options.gestures) {
66-
addPackageToPackageJson(host, 'dependencies', 'hammerjs', hammerjsVersion);
66+
addPackageToPackageJson(host, 'hammerjs', hammerjsVersion);
6767
}
6868

6969
context.addTask(new NodePackageInstallTask());

src/lib/schematics/utils/package-json.ts

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,28 @@
88

99
import {Tree} from '@angular-devkit/schematics';
1010

11+
/**
12+
* Sorts the keys of the given object.
13+
* @returns A new object instance with sorted keys
14+
*/
15+
function sortObjectByKeys(obj: object) {
16+
return Object.keys(obj).sort().reduce((result, key) => (result[key] = obj[key]) && result, {});
17+
}
18+
1119
/** Adds a package to the package.json in the given host tree. */
12-
export function addPackageToPackageJson(host: Tree, type: string, pkg: string,
13-
version: string): Tree {
20+
export function addPackageToPackageJson(host: Tree, pkg: string, version: string): Tree {
1421

1522
if (host.exists('package.json')) {
1623
const sourceText = host.read('package.json')!.toString('utf-8');
1724
const json = JSON.parse(sourceText);
18-
if (!json[type]) {
19-
json[type] = {};
25+
26+
if (!json.dependencies) {
27+
json.dependencies = {};
2028
}
2129

22-
if (!json[type][pkg]) {
23-
json[type][pkg] = version;
30+
if (!json.dependencies[pkg]) {
31+
json.dependencies[pkg] = version;
32+
json.dependencies = sortObjectByKeys(json.dependencies);
2433
}
2534

2635
host.overwrite('package.json', JSON.stringify(json, null, 2));

0 commit comments

Comments
 (0)