Skip to content

Commit 7ca250a

Browse files
committed
fix(@schematics/angular): skip zone.js dependency for zoneless applications
A newly generated application no longer adds the `zone.js` dependency to the workspace if the `zoneless` option is enabled.
1 parent bec42f7 commit 7ca250a

File tree

6 files changed

+68
-6
lines changed

6 files changed

+68
-6
lines changed

packages/schematics/angular/application/index.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,14 @@ function addDependenciesToPackageJson(options: ApplicationOptions) {
149149
},
150150
].forEach((dependency) => addPackageJsonDependency(host, dependency));
151151

152+
if (!options.zoneless) {
153+
addPackageJsonDependency(host, {
154+
type: NodeDependencyType.Default,
155+
name: 'zone.js',
156+
version: latestVersions['zone.js'],
157+
});
158+
}
159+
152160
if (!options.skipInstall) {
153161
context.addTask(new NodePackageInstallTask());
154162
}

packages/schematics/angular/application/index_spec.ts

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,48 @@ describe('Application Schematic', () => {
268268
expect(pkg.devDependencies['typescript']).toEqual(latestVersions['typescript']);
269269
});
270270

271+
it('should include zone.js if "zoneless" option is false', async () => {
272+
const tree = await schematicRunner.runSchematic(
273+
'application',
274+
{
275+
...defaultOptions,
276+
zoneless: false,
277+
},
278+
workspaceTree,
279+
);
280+
281+
const pkg = JSON.parse(tree.readContent('/package.json'));
282+
expect(pkg.dependencies['zone.js']).toEqual(latestVersions['zone.js']);
283+
});
284+
285+
it('should include zone.js if "zoneless" option is not present', async () => {
286+
const tree = await schematicRunner.runSchematic(
287+
'application',
288+
{
289+
...defaultOptions,
290+
zoneless: undefined,
291+
},
292+
workspaceTree,
293+
);
294+
295+
const pkg = JSON.parse(tree.readContent('/package.json'));
296+
expect(pkg.dependencies['zone.js']).toEqual(latestVersions['zone.js']);
297+
});
298+
299+
it('should not include zone.js if "zoneless" option is true', async () => {
300+
const tree = await schematicRunner.runSchematic(
301+
'application',
302+
{
303+
...defaultOptions,
304+
zoneless: true,
305+
},
306+
workspaceTree,
307+
);
308+
309+
const pkg = JSON.parse(tree.readContent('/package.json'));
310+
expect(pkg.dependencies['zone.js']).toBeUndefined();
311+
});
312+
271313
it(`should not override existing users dependencies`, async () => {
272314
const oldPackageJson = workspaceTree.readContent('package.json');
273315
workspaceTree.overwrite(

packages/schematics/angular/library/index.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,11 @@ import {
2222
} from '@angular-devkit/schematics';
2323
import { NodePackageInstallTask } from '@angular-devkit/schematics/tasks';
2424
import { join } from 'node:path/posix';
25-
import { NodeDependencyType, addPackageJsonDependency } from '../utility/dependencies';
25+
import {
26+
NodeDependencyType,
27+
addPackageJsonDependency,
28+
getPackageJsonDependency,
29+
} from '../utility/dependencies';
2630
import { JSONFile } from '../utility/json-file';
2731
import { latestVersions } from '../utility/latest-versions';
2832
import { relativePathToWorkspaceRoot } from '../utility/paths';
@@ -96,6 +100,7 @@ function addLibToWorkspaceFile(
96100
options: LibraryOptions,
97101
projectRoot: string,
98102
projectName: string,
103+
hasZoneDependency: boolean,
99104
): Rule {
100105
return updateWorkspace((workspace) => {
101106
workspace.projects.add({
@@ -121,7 +126,7 @@ function addLibToWorkspaceFile(
121126
builder: Builders.BuildKarma,
122127
options: {
123128
tsConfig: `${projectRoot}/tsconfig.spec.json`,
124-
polyfills: ['zone.js', 'zone.js/testing'],
129+
polyfills: hasZoneDependency ? ['zone.js', 'zone.js/testing'] : undefined,
125130
},
126131
},
127132
},
@@ -172,9 +177,11 @@ export default function (options: LibraryOptions): Rule {
172177
move(libDir),
173178
]);
174179

180+
const hasZoneDependency = getPackageJsonDependency(host, 'zone.js') !== null;
181+
175182
return chain([
176183
mergeWith(templateSource),
177-
addLibToWorkspaceFile(options, libDir, packageName),
184+
addLibToWorkspaceFile(options, libDir, packageName, hasZoneDependency),
178185
options.skipPackageJson ? noop() : addDependenciesToPackageJson(),
179186
options.skipTsConfig ? noop() : updateTsConfig(packageName, './' + distRoot),
180187
options.skipTsConfig

packages/schematics/angular/library/index_spec.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,13 @@ describe('Library Schematic', () => {
195195
expect(workspace.projects.foo.prefix).toEqual('pre');
196196
});
197197

198+
it(`should not add zone.js to test polyfills when no zone.js dependency`, async () => {
199+
const tree = await schematicRunner.runSchematic('library', defaultOptions, workspaceTree);
200+
201+
const workspace = getJsonFileContent(tree, '/angular.json');
202+
expect(workspace.projects.foo.architect.test.options.polyfills).toBeUndefined();
203+
});
204+
198205
it('should handle a pascalCasedName', async () => {
199206
const options = { ...defaultOptions, name: 'pascalCasedName' };
200207
const tree = await schematicRunner.runSchematic('library', options, workspaceTree);

packages/schematics/angular/workspace/files/package.json.template

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,7 @@
1717
"@angular/platform-browser": "<%= latestVersions.Angular %>",
1818
"@angular/router": "<%= latestVersions.Angular %>",
1919
"rxjs": "<%= latestVersions['rxjs'] %>",
20-
"tslib": "<%= latestVersions['tslib'] %>",
21-
"zone.js": "<%= latestVersions['zone.js'] %>"
20+
"tslib": "<%= latestVersions['tslib'] %>"
2221
},
2322
"devDependencies": {
2423
"@angular/cli": "<%= '^' + version %>",

packages/schematics/angular/workspace/index_spec.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@ describe('Workspace Schematic', () => {
5858
const pkg = JSON.parse(tree.readContent('/package.json'));
5959
expect(pkg.dependencies['@angular/core']).toEqual(latestVersions.Angular);
6060
expect(pkg.dependencies['rxjs']).toEqual(latestVersions['rxjs']);
61-
expect(pkg.dependencies['zone.js']).toEqual(latestVersions['zone.js']);
6261
expect(pkg.devDependencies['typescript']).toEqual(latestVersions['typescript']);
6362
});
6463

0 commit comments

Comments
 (0)