Skip to content

Commit 7d57dd2

Browse files
alan-agius4filipesilva
authored andcommitted
feat(@schematics/angular): add migration to use new zone.js entry-points
1 parent f309516 commit 7d57dd2

File tree

4 files changed

+227
-1
lines changed

4 files changed

+227
-1
lines changed

packages/schematics/angular/migrations/migration-collection.json

+5
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,11 @@
129129
"version": "12.0.0-next.0",
130130
"factory": "./update-12/update-angular-config",
131131
"description": "Remove deprecated options from 'angular.json' that are no longer present in v12."
132+
},
133+
"update-zonejs": {
134+
"version": "12.0.0-next.1",
135+
"factory": "./update-12/update-zonejs",
136+
"description": "Update 'zone.js' to version 0.11.x. Read more about this here: https://github.com/angular/angular/blob/master/packages/zone.js/CHANGELOG.md#breaking-changes-since-zonejs-v0111"
132137
}
133138
}
134139
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
/**
2+
* @license
3+
* Copyright Google Inc. All Rights Reserved.
4+
*
5+
* Use of this source code is governed by an MIT-style license that can be
6+
* found in the LICENSE file at https://angular.io/license
7+
*/
8+
import { join } from '@angular-devkit/core';
9+
import { DirEntry, Rule } from '@angular-devkit/schematics';
10+
import { NodePackageInstallTask } from '@angular-devkit/schematics/tasks';
11+
import { addPackageJsonDependency, getPackageJsonDependency } from '../../utility/dependencies';
12+
13+
const fileExtensionRegexp = /\.(([cm]?j|t)sx?)$/;
14+
15+
function* visitJavaScriptFiles(directory: DirEntry): IterableIterator<string> {
16+
for (const path of directory.subfiles) {
17+
if (!fileExtensionRegexp.test(path)) {
18+
continue;
19+
}
20+
21+
yield join(directory.path, path);
22+
}
23+
24+
for (const path of directory.subdirs) {
25+
if (path === 'node_modules' || path.startsWith('.') || path === 'dist') {
26+
continue;
27+
}
28+
29+
yield* visitJavaScriptFiles(directory.dir(path));
30+
}
31+
}
32+
33+
export default function (): Rule {
34+
return (tree, context) => {
35+
const current = getPackageJsonDependency(tree, 'zone.js');
36+
if (current && current.version !== '~0.11.4') {
37+
addPackageJsonDependency(tree, {
38+
type: current.type,
39+
name: 'zone.js',
40+
version: '~0.11.4',
41+
overwrite: true,
42+
});
43+
44+
context.addTask(new NodePackageInstallTask());
45+
}
46+
47+
for (const path of visitJavaScriptFiles(tree.root)) {
48+
const buffer = tree.read(path);
49+
if (!buffer) {
50+
return;
51+
}
52+
53+
const content = buffer.toString();
54+
if (!content.includes('zone.js/dist/')) {
55+
continue;
56+
}
57+
58+
// RegExp that replaces
59+
// - import 'zone.js/dist/zone-testing' -> import 'zone.js/testing'
60+
// - require('zone.js/dist/zone-testing') -> require('zone.js/testing')
61+
// - import 'zone.js/dist/zone' -> import 'zone.js'
62+
// - require('zone.js/dist/zone') -> require('zone.js')
63+
// - import 'zone.js/dist/zone-error' -> import 'zone.js/plugins/zone-error'
64+
// - require('zone.js/dist/zone-error') -> require('zone.js/plugins/zone-error')
65+
tree.overwrite(
66+
path,
67+
content
68+
.replace(
69+
/(?<=(?:require\s*\(|import\s+)['"]zone\.js)\/dist\/zone-?\w*(?=['"]\)?)/g,
70+
match => {
71+
switch (match) {
72+
case '/dist/zone':
73+
case '/dist/zone-evergreen':
74+
return '';
75+
case '/dist/zone-testing':
76+
case '/dist/zone-evergreen-testing':
77+
return '/testing';
78+
case '/dist/zone-node':
79+
return '/node';
80+
case '/dist/zone-mix':
81+
return '/mix';
82+
default:
83+
return `/plugins${match.substr(5)}`;
84+
}
85+
},
86+
),
87+
);
88+
}
89+
};
90+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
/**
2+
* @license
3+
* Copyright Google Inc. All Rights Reserved.
4+
*
5+
* Use of this source code is governed by an MIT-style license that can be
6+
* found in the LICENSE file at https://angular.io/license
7+
*/
8+
import { EmptyTree } from '@angular-devkit/schematics';
9+
import { SchematicTestRunner, UnitTestTree } from '@angular-devkit/schematics/testing';
10+
import { getPackageJsonDependency } from '../../utility/dependencies';
11+
12+
const schematicName = 'update-zonejs';
13+
describe(`Migration to update 'zone.js' to 0.11.x. ${schematicName}`, () => {
14+
const schematicRunner = new SchematicTestRunner(
15+
'migrations',
16+
require.resolve('../migration-collection.json'),
17+
);
18+
19+
let tree: UnitTestTree;
20+
beforeEach(() => {
21+
tree = new UnitTestTree(new EmptyTree());
22+
tree.create('/package.json', JSON.stringify({ 'dependencies': { 'zone.js': '~0.10.0' } }, undefined, 2));
23+
});
24+
25+
it(`should update 'zone.js' dependency in 'package.json'`, async () => {
26+
const newTree = await schematicRunner.runSchematicAsync(schematicName, {}, tree).toPromise();
27+
expect(getPackageJsonDependency(newTree, 'zone.js')?.version).toBe('~0.11.4');
28+
});
29+
30+
it(`should update 'zone.js/dist/zone' import`, async () => {
31+
tree.create('file.ts', `
32+
import 'zone.js';
33+
import 'zone.js/dist/zone';
34+
import "zone.js/dist/zone";
35+
// import "zone.js/dist/zone";
36+
`);
37+
38+
const newTree = await schematicRunner.runSchematicAsync(schematicName, {}, tree).toPromise();
39+
expect(newTree.readContent('file.ts')).toBe(`
40+
import 'zone.js';
41+
import 'zone.js';
42+
import "zone.js";
43+
// import "zone.js";
44+
`);
45+
});
46+
47+
it(`should update 'zone.js/dist/zone' require`, async () => {
48+
tree.create('file.ts', `
49+
require('zone.js');
50+
require('zone.js/dist/zone');
51+
require("zone.js/dist/zone");
52+
// require("zone.js/dist/zone");
53+
`);
54+
55+
const newTree = await schematicRunner.runSchematicAsync(schematicName, {}, tree).toPromise();
56+
expect(newTree.readContent('file.ts')).toBe(`
57+
require('zone.js');
58+
require('zone.js');
59+
require("zone.js");
60+
// require("zone.js");
61+
`);
62+
});
63+
64+
it(`should update 'zone.js/dist/zone-error' import`, async () => {
65+
tree.create('file.ts', `
66+
import 'zone.js/plugins/zone-error';
67+
import 'zone.js/dist/zone-error';
68+
import "zone.js/dist/zone-error";
69+
// import "zone.js/dist/zone-error";
70+
`);
71+
72+
const newTree = await schematicRunner.runSchematicAsync(schematicName, {}, tree).toPromise();
73+
expect(newTree.readContent('file.ts')).toBe(`
74+
import 'zone.js/plugins/zone-error';
75+
import 'zone.js/plugins/zone-error';
76+
import "zone.js/plugins/zone-error";
77+
// import "zone.js/plugins/zone-error";
78+
`);
79+
});
80+
81+
it(`should update 'zone.js/dist/zone-error' require`, async () => {
82+
tree.create('file.ts', `
83+
require('zone.js/plugins/zone-error');
84+
require('zone.js/dist/zone-error');
85+
require("zone.js/dist/zone-error");
86+
// require("zone.js/dist/zone-error");
87+
`);
88+
89+
const newTree = await schematicRunner.runSchematicAsync(schematicName, {}, tree).toPromise();
90+
expect(newTree.readContent('file.ts')).toBe(`
91+
require('zone.js/plugins/zone-error');
92+
require('zone.js/plugins/zone-error');
93+
require("zone.js/plugins/zone-error");
94+
// require("zone.js/plugins/zone-error");
95+
`);
96+
});
97+
98+
it(`should update 'zone.js/dist/zone-testing' import`, async () => {
99+
tree.create('file.ts', `
100+
import 'zone.js/testing';
101+
import 'zone.js/dist/zone-testing';
102+
import "zone.js/dist/zone-testing";
103+
// import "zone.js/dist/zone-testing";
104+
`);
105+
106+
const newTree = await schematicRunner.runSchematicAsync(schematicName, {}, tree).toPromise();
107+
expect(newTree.readContent('file.ts')).toBe(`
108+
import 'zone.js/testing';
109+
import 'zone.js/testing';
110+
import "zone.js/testing";
111+
// import "zone.js/testing";
112+
`);
113+
});
114+
115+
it(`should update 'zone.js/dist/zone-testing' require`, async () => {
116+
tree.create('file.ts', `
117+
require('zone.js/testing');
118+
require('zone.js/dist/zone-testing');
119+
require("zone.js/dist/zone-testing");
120+
// require("zone.js/dist/zone-testing");
121+
`);
122+
123+
const newTree = await schematicRunner.runSchematicAsync(schematicName, {}, tree).toPromise();
124+
expect(newTree.readContent('file.ts')).toBe(`
125+
require('zone.js/testing');
126+
require('zone.js/testing');
127+
require("zone.js/testing");
128+
// require("zone.js/testing");
129+
`);
130+
});
131+
});

packages/schematics/angular/utility/latest-versions.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ export const latestVersions = {
1010
// These versions should be kept up to date with latest Angular peer dependencies.
1111
Angular: '~12.0.0-next.0',
1212
RxJs: '~6.6.0',
13-
ZoneJs: '~0.11.3',
13+
ZoneJs: '~0.11.4',
1414
TypeScript: '~4.1.2',
1515
TsLib: '^2.0.0',
1616

0 commit comments

Comments
 (0)