Skip to content

Commit 5ce058c

Browse files
committed
refactor: Consolidate adding dependencies
1 parent 48fd3e5 commit 5ce058c

File tree

9 files changed

+425
-144
lines changed

9 files changed

+425
-144
lines changed

packages/schematics/angular/application/index.ts

+19-24
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import {
2929
addProjectToWorkspace,
3030
getWorkspace,
3131
} from '../utility/config';
32+
import { NodeDependencyType, addPackageJsonDependency } from '../utility/dependencies';
3233
import { latestVersions } from '../utility/latest-versions';
3334
import { validateProjectName } from '../utility/validation';
3435
import { Schema as ApplicationOptions } from './schema';
@@ -60,29 +61,23 @@ import { Schema as ApplicationOptions } from './schema';
6061

6162
function addDependenciesToPackageJson() {
6263
return (host: Tree) => {
63-
const packageJsonPath = 'package.json';
64-
65-
if (!host.exists('package.json')) { return host; }
66-
67-
const source = host.read('package.json');
68-
if (!source) { return host; }
69-
70-
const sourceText = source.toString('utf-8');
71-
const json = JSON.parse(sourceText);
72-
73-
if (!json['devDependencies']) {
74-
json['devDependencies'] = {};
75-
}
76-
77-
json.devDependencies = {
78-
'@angular/compiler-cli': latestVersions.Angular,
79-
'@angular-devkit/build-angular': latestVersions.DevkitBuildAngular,
80-
'typescript': latestVersions.TypeScript,
81-
// De-structure last keeps existing user dependencies.
82-
...json.devDependencies,
83-
};
84-
85-
host.overwrite(packageJsonPath, JSON.stringify(json, null, 2));
64+
[
65+
{
66+
type: NodeDependencyType.Dev,
67+
name: '@angular/compiler-cli',
68+
version: latestVersions.Angular,
69+
},
70+
{
71+
type: NodeDependencyType.Dev,
72+
name: '@angular-devkit/build-angular',
73+
version: latestVersions.DevkitBuildAngular,
74+
},
75+
{
76+
type: NodeDependencyType.Dev,
77+
name: 'typescript',
78+
version: latestVersions.TypeScript,
79+
},
80+
].forEach(dependency => addPackageJsonDependency(host, dependency));
8681

8782
return host;
8883
};
@@ -350,6 +345,6 @@ export default function (options: ApplicationOptions): Rule {
350345
move(sourceDir),
351346
]), MergeStrategy.Overwrite),
352347
schematic('e2e', e2eOptions),
353-
]);
348+
])(host, context);
354349
};
355350
}

packages/schematics/angular/library/index.ts

+43-45
Original file line numberDiff line numberDiff line change
@@ -27,23 +27,15 @@ import {
2727
addProjectToWorkspace,
2828
getWorkspace,
2929
} from '../utility/config';
30+
import {
31+
NodeDependencyType,
32+
addPackageJsonDependency,
33+
} from '../utility/dependencies';
3034
import { latestVersions } from '../utility/latest-versions';
3135
import { validateProjectName } from '../utility/validation';
3236
import { Schema as LibraryOptions } from './schema';
3337

3438

35-
type PackageJsonPartialType = {
36-
scripts: {
37-
[key: string]: string;
38-
},
39-
dependencies: {
40-
[key: string]: string;
41-
},
42-
devDependencies: {
43-
[key: string]: string;
44-
},
45-
};
46-
4739
interface UpdateJsonFn<T> {
4840
(obj: T): T | void;
4941
}
@@ -96,39 +88,45 @@ function updateTsConfig(packageName: string, distRoot: string) {
9688
function addDependenciesToPackageJson() {
9789

9890
return (host: Tree) => {
99-
if (!host.exists('package.json')) { return host; }
100-
101-
return updateJsonFile(host, 'package.json', (json: PackageJsonPartialType) => {
102-
103-
104-
if (!json['dependencies']) {
105-
json['dependencies'] = {};
106-
}
107-
108-
json.dependencies = {
109-
'@angular/common': latestVersions.Angular,
110-
'@angular/core': latestVersions.Angular,
111-
'@angular/compiler': latestVersions.Angular,
112-
// De-structure last keeps existing user dependencies.
113-
...json.dependencies,
114-
};
115-
116-
if (!json['devDependencies']) {
117-
json['devDependencies'] = {};
118-
}
91+
[
92+
{
93+
type: NodeDependencyType.Dev,
94+
name: '@angular/compiler-cli',
95+
version: latestVersions.Angular,
96+
},
97+
{
98+
type: NodeDependencyType.Dev,
99+
name: '@angular-devkit/build-ng-packagr',
100+
version: latestVersions.DevkitBuildNgPackagr,
101+
},
102+
{
103+
type: NodeDependencyType.Dev,
104+
name: '@angular-devkit/build-angular',
105+
version: latestVersions.DevkitBuildNgPackagr,
106+
},
107+
{
108+
type: NodeDependencyType.Dev,
109+
name: 'ng-packagr',
110+
version: '^3.0.0',
111+
},
112+
{
113+
type: NodeDependencyType.Dev,
114+
name: 'tsickle',
115+
version: '>=0.29.0',
116+
},
117+
{
118+
type: NodeDependencyType.Dev,
119+
name: 'tslib',
120+
version: '^1.9.0',
121+
},
122+
{
123+
type: NodeDependencyType.Dev,
124+
name: 'typescript',
125+
version: latestVersions.TypeScript,
126+
},
127+
].forEach(dependency => addPackageJsonDependency(host, dependency));
119128

120-
json.devDependencies = {
121-
'@angular/compiler-cli': latestVersions.Angular,
122-
'@angular-devkit/build-ng-packagr': latestVersions.DevkitBuildNgPackagr,
123-
'@angular-devkit/build-angular': latestVersions.DevkitBuildNgPackagr,
124-
'ng-packagr': '^3.0.0',
125-
'tsickle': '>=0.29.0',
126-
'tslib': '^1.9.0',
127-
'typescript': latestVersions.TypeScript,
128-
// De-structure last keeps existing user dependencies.
129-
...json.devDependencies,
130-
};
131-
});
129+
return host;
132130
};
133131
}
134132

@@ -257,6 +255,6 @@ export default function (options: LibraryOptions): Rule {
257255
context.addTask(new NodePackageInstallTask());
258256
}
259257
},
260-
]);
258+
])(host, context);
261259
};
262260
}

packages/schematics/angular/migrations/update-6/index.ts

+15-47
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,16 @@ import {
2626
} from '@angular-devkit/schematics';
2727
import { NodePackageInstallTask } from '@angular-devkit/schematics/tasks';
2828
import { AppConfig, CliConfig } from '../../utility/config';
29-
import { latestVersions } from '../../utility/latest-versions';
3029
import {
31-
appendPropertyInAstObject,
30+
NodeDependency,
31+
NodeDependencyType,
32+
addPackageJsonDependency,
33+
} from '../../utility/dependencies';
34+
import {
3235
appendValueInAstArray,
3336
findPropertyInAstObject,
34-
} from './json-utils';
37+
} from '../../utility/json-utils';
38+
import { latestVersions } from '../../utility/latest-versions';
3539

3640
const defaults = {
3741
appRoot: 'src',
@@ -648,49 +652,13 @@ function updateSpecTsConfig(config: CliConfig): Rule {
648652

649653
function updatePackageJson(config: CliConfig) {
650654
return (host: Tree, context: SchematicContext) => {
651-
const pkgPath = '/package.json';
652-
const buffer = host.read(pkgPath);
653-
if (buffer == null) {
654-
throw new SchematicsException('Could not read package.json');
655-
}
656-
const pkgAst = parseJsonAst(buffer.toString(), JsonParseMode.Strict);
657-
658-
if (pkgAst.kind != 'object') {
659-
throw new SchematicsException('Error reading package.json');
660-
}
661-
662-
const devDependenciesNode = findPropertyInAstObject(pkgAst, 'devDependencies');
663-
if (devDependenciesNode && devDependenciesNode.kind != 'object') {
664-
throw new SchematicsException('Error reading package.json; devDependency is not an object.');
665-
}
666-
667-
const recorder = host.beginUpdate(pkgPath);
668-
const depName = '@angular-devkit/build-angular';
669-
if (!devDependenciesNode) {
670-
// Haven't found the devDependencies key, add it to the root of the package.json.
671-
appendPropertyInAstObject(recorder, pkgAst, 'devDependencies', {
672-
[depName]: latestVersions.DevkitBuildAngular,
673-
});
674-
} else {
675-
// Check if there's a build-angular key.
676-
const buildAngularNode = findPropertyInAstObject(devDependenciesNode, depName);
677-
678-
if (!buildAngularNode) {
679-
// No build-angular package, add it.
680-
appendPropertyInAstObject(
681-
recorder,
682-
devDependenciesNode,
683-
depName,
684-
latestVersions.DevkitBuildAngular,
685-
);
686-
} else {
687-
const { end, start } = buildAngularNode;
688-
recorder.remove(start.offset, end.offset - start.offset);
689-
recorder.insertRight(start.offset, JSON.stringify(latestVersions.DevkitBuildAngular));
690-
}
691-
}
692-
693-
host.commitUpdate(recorder);
655+
const dependency: NodeDependency = {
656+
type: NodeDependencyType.Dev,
657+
name: '@angular-devkit/build-angular',
658+
version: latestVersions.DevkitBuildAngular,
659+
overwrite: true,
660+
};
661+
addPackageJsonDependency(host, dependency);
694662

695663
context.addTask(new NodePackageInstallTask({
696664
packageManager: config.packageManager === 'default' ? undefined : config.packageManager,
@@ -786,6 +754,6 @@ export default function (): Rule {
786754

787755
return host;
788756
},
789-
]);
757+
])(host, context);
790758
};
791759
}

packages/schematics/angular/service-worker/index.ts

+10-13
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,10 @@ import {
2626
getWorkspace,
2727
getWorkspacePath,
2828
} from '../utility/config';
29+
import { addPackageJsonDependency, getPackageJsonDependency } from '../utility/dependencies';
2930
import { getAppModulePath } from '../utility/ng-ast-utils';
3031
import { Schema as ServiceWorkerOptions } from './schema';
3132

32-
const packageJsonPath = '/package.json';
33-
3433
function updateConfigFile(options: ServiceWorkerOptions): Rule {
3534
return (host: Tree, context: SchematicContext) => {
3635
context.logger.debug('updating config file.');
@@ -72,17 +71,15 @@ function addDependencies(): Rule {
7271
return (host: Tree, context: SchematicContext) => {
7372
const packageName = '@angular/service-worker';
7473
context.logger.debug(`adding dependency (${packageName})`);
75-
const buffer = host.read(packageJsonPath);
76-
if (buffer === null) {
77-
throw new SchematicsException('Could not find package.json');
74+
const coreDep = getPackageJsonDependency(host, '@angular/core');
75+
if (coreDep === null) {
76+
throw new SchematicsException('Could not find version.');
7877
}
79-
80-
const packageObject = JSON.parse(buffer.toString());
81-
82-
const ngCoreVersion = packageObject.dependencies['@angular/core'];
83-
packageObject.dependencies[packageName] = ngCoreVersion;
84-
85-
host.overwrite(packageJsonPath, JSON.stringify(packageObject, null, 2));
78+
const platformServerDep = {
79+
...coreDep,
80+
name: packageName,
81+
};
82+
addPackageJsonDependency(host, platformServerDep);
8683

8784
return host;
8885
};
@@ -187,6 +184,6 @@ export default function (options: ServiceWorkerOptions): Rule {
187184
updateConfigFile(options),
188185
addDependencies(),
189186
updateAppModule(options),
190-
]);
187+
])(host, context);
191188
};
192189
}

packages/schematics/angular/universal/index.ts

+10-12
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import * as ts from 'typescript';
3434
import { findNode, getDecoratorMetadata } from '../utility/ast-utils';
3535
import { InsertChange } from '../utility/change';
3636
import { getWorkspace } from '../utility/config';
37+
import { addPackageJsonDependency, getPackageJsonDependency } from '../utility/dependencies';
3738
import { findBootstrapModuleCall, findBootstrapModulePath } from '../utility/ng-ast-utils';
3839
import { Schema as UniversalOptions } from './schema';
3940

@@ -172,18 +173,15 @@ function addServerTransition(options: UniversalOptions): Rule {
172173

173174
function addDependencies(): Rule {
174175
return (host: Tree) => {
175-
const pkgPath = '/package.json';
176-
const buffer = host.read(pkgPath);
177-
if (buffer === null) {
178-
throw new SchematicsException('Could not find package.json');
176+
const coreDep = getPackageJsonDependency(host, '@angular/core');
177+
if (coreDep === null) {
178+
throw new SchematicsException('Could not find version.');
179179
}
180-
181-
const pkg = JSON.parse(buffer.toString());
182-
183-
const ngCoreVersion = pkg.dependencies['@angular/core'];
184-
pkg.dependencies['@angular/platform-server'] = ngCoreVersion;
185-
186-
host.overwrite(pkgPath, JSON.stringify(pkg, null, 2));
180+
const platformServerDep = {
181+
...coreDep,
182+
name: '@angular/platform-server',
183+
};
184+
addPackageJsonDependency(host, platformServerDep);
187185

188186
return host;
189187
};
@@ -251,6 +249,6 @@ export default function (options: UniversalOptions): Rule {
251249
updateConfigFile(options, tsConfigDirectory),
252250
wrapBootstrapCall(options),
253251
addServerTransition(options),
254-
]);
252+
])(host, context);
255253
};
256254
}

0 commit comments

Comments
 (0)