Skip to content

Commit 7015e4d

Browse files
committed
refactor(@schematics/angular): generate Baseline date in ng generate config browserslist
This changes `ng generate config browserslist` to no longer generate a list of browsers used by Angular, but instead generate a dependency on `browserslist-config-baseline` and configures the date to match Angular. This used to generate a `.browserslistrc` file, however since the config is a single line and `browserslist-config-baseline` requires a separate config in the `package.json`, it feels a little more ergonomic to put both in the `package.json` file instead.
1 parent e8a6967 commit 7015e4d

File tree

5 files changed

+50
-26
lines changed

5 files changed

+50
-26
lines changed

packages/schematics/angular/BUILD.bazel

+10
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
# found in the LICENSE file at https://angular.dev/license
55

66
load("@npm2//:defs.bzl", "npm_link_all_packages")
7+
load("//:constants.bzl", "BASELINE_DATE")
78
load("//tools:defaults2.bzl", "copy_to_bin", "jasmine_test", "npm_package", "ts_project")
89
load("//tools:ts_json_schema.bzl", "ts_json_schema")
910

@@ -42,11 +43,20 @@ copy_to_bin(
4243
srcs = glob(["**/schema.json"]),
4344
)
4445

46+
# Vendor the Baseline configuration into this package.
47+
genrule(
48+
name = "angular_baseline_date",
49+
srcs = [],
50+
outs = ["config/baseline.txt"],
51+
cmd = "echo \"%s\" > $@" % BASELINE_DATE,
52+
)
53+
4554
RUNTIME_ASSETS = [
4655
"collection.json",
4756
"migrations/migration-collection.json",
4857
"package.json",
4958
"utility/latest-versions/package.json",
59+
":angular_baseline_date",
5060
] + glob(
5161
include = [
5262
"*/schema.json",

packages/schematics/angular/config/files/.browserslistrc.template

-17
This file was deleted.

packages/schematics/angular/config/index.ts

+30-7
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,20 @@ import {
1414
filter,
1515
mergeWith,
1616
move,
17+
noop,
1718
strings,
1819
url,
1920
} from '@angular-devkit/schematics';
21+
import { promises as fs } from 'node:fs';
2022
import { posix as path } from 'node:path';
2123
import { relativePathToWorkspaceRoot } from '../utility/paths';
2224
import { getWorkspace as readWorkspace, updateWorkspace } from '../utility/workspace';
2325
import { Builders as AngularBuilder } from '../utility/workspace-models';
2426
import { Schema as ConfigOptions, Type as ConfigType } from './schema';
27+
import { JSONFile } from '../utility/json-file';
28+
import { addPackageJsonDependency, NodeDependencyType } from '../utility/dependencies';
29+
import { NodePackageInstallTask } from '@angular-devkit/schematics/tasks';
30+
import { latestVersions } from '../utility/latest-versions';
2531

2632
export default function (options: ConfigOptions): Rule {
2733
switch (options.type) {
@@ -35,20 +41,37 @@ export default function (options: ConfigOptions): Rule {
3541
}
3642

3743
function addBrowserslistConfig(options: ConfigOptions): Rule {
38-
return async (host) => {
44+
return async (host, context) => {
3945
const workspace = await readWorkspace(host);
4046
const project = workspace.projects.get(options.project);
4147
if (!project) {
4248
throw new SchematicsException(`Project name "${options.project}" doesn't not exist.`);
4349
}
4450

45-
return mergeWith(
46-
apply(url('./files'), [
47-
filter((p) => p.endsWith('.browserslistrc.template')),
48-
applyTemplates({}),
49-
move(project.root),
50-
]),
51+
// Read Angular's default vendored `.browserslistrc` file.
52+
const widelyAvailableOnDate = await fs.readFile(path.join(__dirname, 'baseline.txt'), 'utf8');
53+
54+
const pkgJson = new JSONFile(host, 'package.json');
55+
pkgJson.modify(
56+
['browserslist'],
57+
['extends browserslist-config-baseline'],
58+
/* insertInOrder */ false,
5159
);
60+
pkgJson.modify(
61+
['browserslist-config-baseline'],
62+
{ widelyAvailableOnDate },
63+
/* insertInOrder */ false,
64+
);
65+
66+
addPackageJsonDependency(host, {
67+
type: NodeDependencyType.Dev,
68+
name: 'browserslist-config-baseline',
69+
version: latestVersions['browserslist-config-baseline'],
70+
});
71+
72+
context.addTask(new NodePackageInstallTask());
73+
74+
return noop;
5275
};
5376
}
5477

packages/schematics/angular/config/index_spec.ts

+9-2
Original file line numberDiff line numberDiff line change
@@ -92,9 +92,16 @@ describe('Config Schematic', () => {
9292
});
9393

9494
describe(`when 'type' is 'browserslist'`, () => {
95-
it('should create a .browserslistrc file', async () => {
95+
it('should create a browserslist configuration', async () => {
9696
const tree = await runConfigSchematic(ConfigType.Browserslist);
97-
expect(tree.exists('projects/foo/.browserslistrc')).toBeTrue();
97+
const config = JSON.parse(tree.readContent('package.json'));
98+
99+
expect(config.browserslist).toEqual(['extends browserslist-config-baseline']);
100+
expect(config['browserslist-config-baseline']).toEqual({
101+
widelyAvailableOnDate: jasmine.stringMatching(/\d\d\d\d-\d\d-\d\d/), // YYYY-MM-DD
102+
});
103+
104+
expect(config.devDependencies['browserslist-config-baseline']).toBeDefined();
98105
});
99106
});
100107
});

packages/schematics/angular/utility/latest-versions/package.json

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
"@types/jasmine": "~5.1.0",
88
"@types/node": "^20.17.19",
99
"browser-sync": "^3.0.0",
10+
"browserslist-config-baseline": "^0.4.0",
1011
"express": "^5.1.0",
1112
"jasmine-core": "~5.6.0",
1213
"jasmine-spec-reporter": "~7.0.0",

0 commit comments

Comments
 (0)