Skip to content

Commit 6713cd1

Browse files
clydinalan-agius4
authored andcommitted
refactor(@schematics/angular): use new dependency management utilities
Refactors several schematics (`application`, `library`, `service-worker`, and two migrations) to use the new, centralized dependency management utilities (`addDependency`, `removeDependency`, `getDependency`). This change migrates away from the older, class-based `dependencies.ts` helper and consolidates all dependency logic on the more robust, functional `dependency.ts` utility. This improves consistency and leverages the enhanced features of the new utilities, such as automatic and configurable installation task management.
1 parent ff71111 commit 6713cd1

File tree

5 files changed

+83
-97
lines changed

5 files changed

+83
-97
lines changed

packages/schematics/angular/application/index.ts

Lines changed: 43 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,12 @@ import {
2525
} from '@angular-devkit/schematics';
2626
import { NodePackageInstallTask } from '@angular-devkit/schematics/tasks';
2727
import { Schema as ComponentOptions } from '../component/schema';
28-
import { NodeDependencyType, addPackageJsonDependency } from '../utility/dependencies';
28+
import {
29+
DependencyType,
30+
ExistingBehavior,
31+
InstallBehavior,
32+
addDependency,
33+
} from '../utility/dependency';
2934
import { JSONFile } from '../utility/json-file';
3035
import { latestVersions } from '../utility/latest-versions';
3136
import { relativePathToWorkspaceRoot } from '../utility/paths';
@@ -130,48 +135,46 @@ export default function (options: ApplicationOptions): Rule {
130135
};
131136
}
132137

133-
function addDependenciesToPackageJson(options: ApplicationOptions) {
134-
return (host: Tree, context: SchematicContext) => {
135-
[
136-
{
137-
type: NodeDependencyType.Dev,
138-
name: '@angular/compiler-cli',
139-
version: latestVersions.Angular,
140-
},
141-
{
142-
type: NodeDependencyType.Dev,
143-
name: '@angular/build',
144-
version: latestVersions.AngularBuild,
145-
},
146-
{
147-
type: NodeDependencyType.Dev,
148-
name: 'typescript',
149-
version: latestVersions['typescript'],
150-
},
151-
].forEach((dependency) => addPackageJsonDependency(host, dependency));
152-
153-
if (!options.zoneless) {
154-
addPackageJsonDependency(host, {
155-
type: NodeDependencyType.Default,
156-
name: 'zone.js',
157-
version: latestVersions['zone.js'],
158-
});
159-
}
138+
function addDependenciesToPackageJson(options: ApplicationOptions): Rule {
139+
const rules: Rule[] = [
140+
addDependency('@angular/compiler-cli', latestVersions.Angular, {
141+
type: DependencyType.Dev,
142+
existing: ExistingBehavior.Skip,
143+
install: options.skipInstall ? InstallBehavior.None : InstallBehavior.Auto,
144+
}),
145+
addDependency('@angular/build', latestVersions.AngularBuild, {
146+
type: DependencyType.Dev,
147+
existing: ExistingBehavior.Skip,
148+
install: options.skipInstall ? InstallBehavior.None : InstallBehavior.Auto,
149+
}),
150+
addDependency('typescript', latestVersions['typescript'], {
151+
type: DependencyType.Dev,
152+
existing: ExistingBehavior.Skip,
153+
install: options.skipInstall ? InstallBehavior.None : InstallBehavior.Auto,
154+
}),
155+
];
160156

161-
if (options.style === Style.Less) {
162-
addPackageJsonDependency(host, {
163-
type: NodeDependencyType.Dev,
164-
name: 'less',
165-
version: latestVersions['less'],
166-
});
167-
}
157+
if (!options.zoneless) {
158+
rules.push(
159+
addDependency('zone.js', latestVersions['zone.js'], {
160+
type: DependencyType.Default,
161+
existing: ExistingBehavior.Skip,
162+
install: options.skipInstall ? InstallBehavior.None : InstallBehavior.Auto,
163+
}),
164+
);
165+
}
168166

169-
if (!options.skipInstall) {
170-
context.addTask(new NodePackageInstallTask());
171-
}
167+
if (options.style === Style.Less) {
168+
rules.push(
169+
addDependency('less', latestVersions['less'], {
170+
type: DependencyType.Dev,
171+
existing: ExistingBehavior.Skip,
172+
install: options.skipInstall ? InstallBehavior.None : InstallBehavior.Auto,
173+
}),
174+
);
175+
}
172176

173-
return host;
174-
};
177+
return chain(rules);
175178
}
176179

177180
function addAppToWorkspaceFile(options: ApplicationOptions, appDir: string): Rule {

packages/schematics/angular/library/index.ts

Lines changed: 29 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,11 @@ import {
2323
import { NodePackageInstallTask } from '@angular-devkit/schematics/tasks';
2424
import { join } from 'node:path/posix';
2525
import {
26-
NodeDependencyType,
27-
addPackageJsonDependency,
28-
getPackageJsonDependency,
29-
} from '../utility/dependencies';
26+
DependencyType,
27+
ExistingBehavior,
28+
addDependency,
29+
getDependency,
30+
} from '../utility/dependency';
3031
import { JSONFile } from '../utility/json-file';
3132
import { latestVersions } from '../utility/latest-versions';
3233
import { relativePathToWorkspaceRoot } from '../utility/paths';
@@ -62,38 +63,29 @@ function addTsProjectReference(...paths: string[]) {
6263
};
6364
}
6465

65-
function addDependenciesToPackageJson() {
66-
return (host: Tree) => {
67-
[
68-
{
69-
type: NodeDependencyType.Dev,
70-
name: '@angular/compiler-cli',
71-
version: latestVersions.Angular,
72-
},
73-
{
74-
type: NodeDependencyType.Dev,
75-
name: '@angular/build',
76-
version: latestVersions.AngularBuild,
77-
},
78-
{
79-
type: NodeDependencyType.Dev,
80-
name: 'ng-packagr',
81-
version: latestVersions.NgPackagr,
82-
},
83-
{
84-
type: NodeDependencyType.Default,
85-
name: 'tslib',
86-
version: latestVersions['tslib'],
87-
},
88-
{
89-
type: NodeDependencyType.Dev,
90-
name: 'typescript',
91-
version: latestVersions['typescript'],
92-
},
93-
].forEach((dependency) => addPackageJsonDependency(host, dependency));
94-
95-
return host;
96-
};
66+
function addDependenciesToPackageJson(): Rule {
67+
return chain([
68+
addDependency('@angular/compiler-cli', latestVersions.Angular, {
69+
type: DependencyType.Dev,
70+
existing: ExistingBehavior.Skip,
71+
}),
72+
addDependency('@angular/build', latestVersions.AngularBuild, {
73+
type: DependencyType.Dev,
74+
existing: ExistingBehavior.Skip,
75+
}),
76+
addDependency('ng-packagr', latestVersions.NgPackagr, {
77+
type: DependencyType.Dev,
78+
existing: ExistingBehavior.Skip,
79+
}),
80+
addDependency('tslib', latestVersions['tslib'], {
81+
type: DependencyType.Default,
82+
existing: ExistingBehavior.Skip,
83+
}),
84+
addDependency('typescript', latestVersions['typescript'], {
85+
type: DependencyType.Dev,
86+
existing: ExistingBehavior.Skip,
87+
}),
88+
]);
9789
}
9890

9991
function addLibToWorkspaceFile(
@@ -177,7 +169,7 @@ export default function (options: LibraryOptions): Rule {
177169
move(libDir),
178170
]);
179171

180-
const hasZoneDependency = getPackageJsonDependency(host, 'zone.js') !== null;
172+
const hasZoneDependency = getDependency(host, 'zone.js') !== null;
181173

182174
return chain([
183175
mergeWith(templateSource),

packages/schematics/angular/migrations/replace-provide-server-rendering-import/migration.ts

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
*/
88

99
import { DirEntry, Rule } from '@angular-devkit/schematics';
10-
import * as ts from '../../third_party/github.com/Microsoft/TypeScript/lib/typescript';
11-
import { NodeDependencyType, addPackageJsonDependency } from '../../utility/dependencies';
10+
import ts from '../../third_party/github.com/Microsoft/TypeScript/lib/typescript';
11+
import { addDependency } from '../../utility/dependency';
1212
import { latestVersions } from '../../utility/latest-versions';
1313

1414
function* visit(directory: DirEntry): IterableIterator<[fileName: string, contents: string]> {
@@ -39,7 +39,7 @@ function* visit(directory: DirEntry): IterableIterator<[fileName: string, conten
3939

4040
export default function (): Rule {
4141
return async (tree) => {
42-
let angularSSRAdded = false;
42+
let rule: Rule | undefined;
4343

4444
for (const [filePath, content] of visit(tree.root)) {
4545
let updatedContent = content;
@@ -100,17 +100,12 @@ export default function (): Rule {
100100
if (content !== updatedContent) {
101101
tree.overwrite(filePath, updatedContent);
102102

103-
if (!angularSSRAdded) {
104-
addPackageJsonDependency(tree, {
105-
name: '@angular/ssr',
106-
version: latestVersions.AngularSSR,
107-
type: NodeDependencyType.Default,
108-
overwrite: false,
109-
});
110-
111-
angularSSRAdded = true;
103+
if (rule === undefined) {
104+
rule = addDependency('@angular/ssr', latestVersions.AngularSSR);
112105
}
113106
}
114107
}
108+
109+
return rule;
115110
};
116111
}

packages/schematics/angular/migrations/use-application-builder/migration.ts

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,11 @@ import {
1515
externalSchematic,
1616
} from '@angular-devkit/schematics';
1717
import { dirname, join } from 'node:path/posix';
18-
import { removePackageJsonDependency } from '../../utility/dependencies';
1918
import {
2019
DependencyType,
2120
ExistingBehavior,
22-
InstallBehavior,
2321
addDependency,
22+
removeDependency,
2423
} from '../../utility/dependency';
2524
import { JSONFile } from '../../utility/json-file';
2625
import { latestVersions } from '../../utility/latest-versions';
@@ -270,13 +269,10 @@ function updateProjects(tree: Tree, context: SchematicContext) {
270269
rules.push(
271270
addDependency('@angular/build', latestVersions.DevkitBuildAngular, {
272271
type: DependencyType.Dev,
273-
// Always is set here since removePackageJsonDependency below does not automatically
274-
// trigger the package manager execution.
275-
install: InstallBehavior.Always,
276272
existing: ExistingBehavior.Replace,
277273
}),
274+
removeDependency('@angular-devkit/build-angular'),
278275
);
279-
removePackageJsonDependency(tree, '@angular-devkit/build-angular');
280276

281277
// Add less dependency if any projects contain a Less stylesheet file.
282278
// This check does not consider Node.js packages due to the performance

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import * as ts from '../third_party/github.com/Microsoft/TypeScript/lib/typescri
2323
import { addDependency, addRootProvider, readWorkspace, writeWorkspace } from '../utility';
2424
import { addSymbolToNgModuleMetadata, insertImport } from '../utility/ast-utils';
2525
import { applyToUpdateRecorder } from '../utility/change';
26-
import { getPackageJsonDependency } from '../utility/dependencies';
26+
import { getDependency } from '../utility/dependency';
2727
import { getAppModulePath, isStandaloneApp } from '../utility/ng-ast-utils';
2828
import { relativePathToWorkspaceRoot } from '../utility/paths';
2929
import { targetBuildNotFoundError } from '../utility/project-targets';
@@ -34,7 +34,7 @@ import { Schema as ServiceWorkerOptions } from './schema';
3434

3535
function addDependencies(): Rule {
3636
return (host: Tree) => {
37-
const coreDep = getPackageJsonDependency(host, '@angular/core');
37+
const coreDep = getDependency(host, '@angular/core');
3838
if (!coreDep) {
3939
throw new SchematicsException('Could not find "@angular/core" version.');
4040
}

0 commit comments

Comments
 (0)