Skip to content

Commit 14df2aa

Browse files
committed
refactor(@schematics/angular): sync schematics dependencies using Renovate
With this change we sync workspace and library schematic dependencies using Renovate. We do this to avoid having to keep these in sync by hand. We could have used TypeScripts' `resolveJsonModule` to make the `latestVersion` object typesafe. But `ts_library` doesn't support JSON inputs.
1 parent bfecda7 commit 14df2aa

File tree

14 files changed

+66
-38
lines changed

14 files changed

+66
-38
lines changed

packages/schematics/angular/BUILD.bazel

+1
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ ts_library(
6464
include = [
6565
"collection.json",
6666
"package.json",
67+
"utility/latest-versions/package.json",
6768
"migrations/migration-collection.json",
6869
"*/schema.json",
6970
"*/files/**/*",

packages/schematics/angular/application/index.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ function addDependenciesToPackageJson(options: ApplicationOptions) {
5050
{
5151
type: NodeDependencyType.Dev,
5252
name: 'typescript',
53-
version: latestVersions.TypeScript,
53+
version: latestVersions['typescript'],
5454
},
5555
].forEach((dependency) => addPackageJsonDependency(host, dependency));
5656

packages/schematics/angular/application/index_spec.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -341,15 +341,15 @@ describe('Application Schematic', () => {
341341
.toPromise();
342342
const pkg = JSON.parse(tree.readContent('/package.json'));
343343
expect(pkg.devDependencies['@angular/compiler-cli']).toEqual(latestVersions.Angular);
344-
expect(pkg.devDependencies['typescript']).toEqual(latestVersions.TypeScript);
344+
expect(pkg.devDependencies['typescript']).toEqual(latestVersions['typescript']);
345345
});
346346

347347
it(`should not override existing users dependencies`, async () => {
348348
const oldPackageJson = workspaceTree.readContent('package.json');
349349
workspaceTree.overwrite(
350350
'package.json',
351351
oldPackageJson.replace(
352-
`"typescript": "${latestVersions.TypeScript}"`,
352+
`"typescript": "${latestVersions['typescript']}"`,
353353
`"typescript": "~2.5.2"`,
354354
),
355355
);

packages/schematics/angular/library/index.ts

+5-5
Original file line numberDiff line numberDiff line change
@@ -61,17 +61,17 @@ function addDependenciesToPackageJson() {
6161
{
6262
type: NodeDependencyType.Dev,
6363
name: 'ng-packagr',
64-
version: latestVersions.ngPackagr,
64+
version: latestVersions['ng-packagr'],
6565
},
6666
{
6767
type: NodeDependencyType.Default,
6868
name: 'tslib',
69-
version: latestVersions.TsLib,
69+
version: latestVersions['tslib'],
7070
},
7171
{
7272
type: NodeDependencyType.Dev,
7373
name: 'typescript',
74-
version: latestVersions.TypeScript,
74+
version: latestVersions['typescript'],
7575
},
7676
].forEach((dependency) => addPackageJsonDependency(host, dependency));
7777

@@ -162,8 +162,8 @@ export default function (options: LibraryOptions): Rule {
162162
distRoot,
163163
relativePathToWorkspaceRoot: relativePathToWorkspaceRoot(projectRoot),
164164
prefix,
165-
angularLatestVersion: latestVersions.Angular.replace('~', '').replace('^', ''),
166-
tsLibLatestVersion: latestVersions.TsLib.replace('~', '').replace('^', ''),
165+
angularLatestVersion: latestVersions.Angular.replace(/\~|\^/, ''),
166+
tsLibLatestVersion: latestVersions['tslib'].replace(/\~|\^/, ''),
167167
folderName,
168168
}),
169169
move(projectRoot),

packages/schematics/angular/library/index_spec.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ describe('Library Schematic', () => {
183183
.toPromise();
184184

185185
const packageJson = getJsonFileContent(tree, 'package.json');
186-
expect(packageJson.devDependencies['ng-packagr']).toEqual(latestVersions.ngPackagr);
186+
expect(packageJson.devDependencies['ng-packagr']).toEqual(latestVersions['ng-packagr']);
187187
});
188188

189189
it('should use the latest known versions in package.json', async () => {
@@ -192,15 +192,15 @@ describe('Library Schematic', () => {
192192
.toPromise();
193193
const pkg = JSON.parse(tree.readContent('/package.json'));
194194
expect(pkg.devDependencies['@angular/compiler-cli']).toEqual(latestVersions.Angular);
195-
expect(pkg.devDependencies['typescript']).toEqual(latestVersions.TypeScript);
195+
expect(pkg.devDependencies['typescript']).toEqual(latestVersions['typescript']);
196196
});
197197

198198
it(`should not override existing users dependencies`, async () => {
199199
const oldPackageJson = workspaceTree.readContent('package.json');
200200
workspaceTree.overwrite(
201201
'package.json',
202202
oldPackageJson.replace(
203-
`"typescript": "${latestVersions.TypeScript}"`,
203+
`"typescript": "${latestVersions['typescript']}"`,
204204
`"typescript": "~2.5.2"`,
205205
),
206206
);

packages/schematics/angular/migrations/update-10/update-dependencies.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ export default function (): Rule {
2222
'karma-jasmine': '~4.0.0',
2323
'karma-jasmine-html-reporter': '^1.5.0',
2424
'protractor': '~7.0.0',
25-
'ng-packagr': latestVersions.ngPackagr,
25+
'ng-packagr': latestVersions['ng-packagr'],
2626
'tslib': '^2.0.0',
2727
};
2828

packages/schematics/angular/migrations/update-11/update-dependencies.ts

-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
import { Rule } from '@angular-devkit/schematics';
1010
import { NodePackageInstallTask } from '@angular-devkit/schematics/tasks';
1111
import { addPackageJsonDependency, getPackageJsonDependency } from '../../utility/dependencies';
12-
import { latestVersions } from '../../utility/latest-versions';
1312

1413
export default function (): Rule {
1514
return (host, context) => {

packages/schematics/angular/migrations/update-9/add-tslib.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ export function addTsLib(): Rule {
2525

2626
addPackageJsonDependency(host, {
2727
name: 'tslib',
28-
version: latestVersions.TsLib,
28+
version: latestVersions['tslib'],
2929
type: NodeDependencyType.Default,
3030
overwrite: true,
3131
});

packages/schematics/angular/migrations/update-9/update-dependencies.ts

-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import {
1212
getPackageJsonDependency,
1313
removePackageJsonDependency,
1414
} from '../../utility/dependencies';
15-
import { latestVersions } from '../../utility/latest-versions';
1615

1716
export function updateDependencies(): Rule {
1817
return (host, context) => {

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

+8-7
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,19 @@
66
* found in the LICENSE file at https://angular.io/license
77
*/
88

9-
export const latestVersions = {
9+
export const latestVersions: Record<string, string> & {
10+
Angular: string;
11+
DevkitBuildAngular: string;
12+
} = {
13+
// We could have used TypeScripts' `resolveJsonModule` to make the `latestVersion` object typesafe,
14+
// but ts_library doesn't support JSON inputs.
15+
...require('./latest-versions/package.json')['dependencies'],
16+
1017
// These versions should be kept up to date with latest Angular peer dependencies.
1118
Angular: '~12.2.0-next.2',
12-
RxJs: '~6.6.0',
13-
ZoneJs: '~0.11.4',
14-
TypeScript: '~4.3.2',
15-
TsLib: '^2.2.0',
1619

1720
// Since @angular-devkit/build-angular and @schematics/angular are always
1821
// published together from the same monorepo, and they are both
1922
// non-experimental, they will always have the same version.
2023
DevkitBuildAngular: '~' + require('../package.json')['version'],
21-
22-
ngPackagr: '^12.1.0',
2324
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
{
2+
"description": "Package versions used by schematics in @schematics/angular.",
3+
"comment": "This file is needed so that depedencies are synced by Renovate.",
4+
"private": true,
5+
"dependencies": {
6+
"@types/jasmine": "~3.8.0",
7+
"@types/node": "^12.11.1",
8+
"jasmine-core": "~3.8.0",
9+
"karma-chrome-launcher": "~3.1.0",
10+
"karma-coverage": "~2.0.3",
11+
"karma-jasmine-html-reporter": "~1.7.0",
12+
"karma-jasmine": "~4.0.0",
13+
"karma": "~6.3.0",
14+
"ng-packagr": "^12.1.1",
15+
"rxjs": "~6.6.0",
16+
"tslib": "^2.3.0",
17+
"typescript": "~4.3.5",
18+
"zone.js": "~0.11.4"
19+
}
20+
}

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

+12-12
Original file line numberDiff line numberDiff line change
@@ -18,21 +18,21 @@
1818
"@angular/platform-browser": "<%= latestVersions.Angular %>",
1919
"@angular/platform-browser-dynamic": "<%= latestVersions.Angular %>",
2020
"@angular/router": "<%= latestVersions.Angular %>",
21-
"rxjs": "<%= latestVersions.RxJs %>",
22-
"tslib": "<%= latestVersions.TsLib %>",
23-
"zone.js": "<%= latestVersions.ZoneJs %>"
21+
"rxjs": "<%= latestVersions['rxjs'] %>",
22+
"tslib": "<%= latestVersions['tslib'] %>",
23+
"zone.js": "<%= latestVersions['zone.js'] %>"
2424
},
2525
"devDependencies": {
2626
"@angular/cli": "<%= '~' + version %>",
2727
"@angular/compiler-cli": "<%= latestVersions.Angular %>",<% if (!minimal) { %>
28-
"@types/jasmine": "~3.8.0",<% } %>
29-
"@types/node": "^12.11.1",<% if (!minimal) { %>
30-
"jasmine-core": "~3.8.0",
31-
"karma": "~6.3.0",
32-
"karma-chrome-launcher": "~3.1.0",
33-
"karma-coverage": "~2.0.3",
34-
"karma-jasmine": "~4.0.0",
35-
"karma-jasmine-html-reporter": "~1.7.0",<% } %>
36-
"typescript": "<%= latestVersions.TypeScript %>"
28+
"@types/jasmine": "<%= latestVersions['@types/jasmine'] %>",<% } %>
29+
"@types/node": "<%= latestVersions['@types/node'] %>",<% if (!minimal) { %>
30+
"jasmine-core": "<%= latestVersions['jasmine-core'] %>",
31+
"karma": "<%= latestVersions['karma'] %>",
32+
"karma-chrome-launcher": "<%= latestVersions['karma-chrome-launcher'] %>",
33+
"karma-coverage": "<%= latestVersions['karma-coverage'] %>",
34+
"karma-jasmine": "<%= latestVersions['karma-jasmine'] %>",
35+
"karma-jasmine-html-reporter": "<%= latestVersions['karma-jasmine-html-reporter'] %>",<% } %>
36+
"typescript": "<%= latestVersions['typescript'] %>"
3737
}
3838
}

packages/schematics/angular/workspace/index_spec.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,9 @@ describe('Workspace Schematic', () => {
5454
const tree = await schematicRunner.runSchematicAsync('workspace', defaultOptions).toPromise();
5555
const pkg = JSON.parse(tree.readContent('/package.json'));
5656
expect(pkg.dependencies['@angular/core']).toEqual(latestVersions.Angular);
57-
expect(pkg.dependencies['rxjs']).toEqual(latestVersions.RxJs);
58-
expect(pkg.dependencies['zone.js']).toEqual(latestVersions.ZoneJs);
59-
expect(pkg.devDependencies['typescript']).toEqual(latestVersions.TypeScript);
57+
expect(pkg.dependencies['rxjs']).toEqual(latestVersions['rxjs']);
58+
expect(pkg.dependencies['zone.js']).toEqual(latestVersions['zone.js']);
59+
expect(pkg.devDependencies['typescript']).toEqual(latestVersions['typescript']);
6060
});
6161

6262
it('should create correct files when using minimal', async () => {

renovate.json

+9-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,15 @@
4444
"enabled": false
4545
},
4646
{
47-
"excludePackagePatterns": ["^@angular/.*"],
47+
"matchPaths": ["packages/schematics/angular/utility/latest-versions/package.json"],
48+
"matchPackagePatterns": ["*"],
49+
"groupName": "schematics dependencies",
50+
"groupSlug": "all-schematics-ependencies"
51+
},
52+
{
53+
"excludePackagePatterns": [
54+
"!packages/schematics/angular/utility/latest-versions/package.json"
55+
],
4856
"matchPackagePatterns": ["*"],
4957
"matchUpdateTypes": ["minor", "patch"],
5058
"groupName": "all non-major dependencies",

0 commit comments

Comments
 (0)