@browser-compat/cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +16 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +274 -0
- package/dist/index.js.map +1 -0
- package/dist/projectConfig.d.ts +17 -0
- package/dist/projectConfig.d.ts.map +1 -0
- package/dist/projectConfig.js +161 -0
- package/dist/projectConfig.js.map +1 -0
- package/package.json +39 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Browser Compat Contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# @browser-compat/cli
|
|
2
|
+
|
|
3
|
+
CLI for browser-compat.
|
|
4
|
+
|
|
5
|
+
Install package: `@browser-compat/cli`
|
|
6
|
+
Command: `browser-compat`
|
|
7
|
+
|
|
8
|
+
```bash
|
|
9
|
+
browser-compat generate --project . --out generated/browser-compat.manifest.json --strict-browserslist
|
|
10
|
+
browser-compat check --project . --manifest generated/browser-compat.manifest.json --strict-browserslist
|
|
11
|
+
browser-compat report --project . --out generated/browser-compat.capabilities.json --format json
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
The CLI uses the consuming project's explicit browserslist configuration by
|
|
15
|
+
default. It does not include built-in project-specific browser versions,
|
|
16
|
+
memory thresholds, or business routes.
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { mapCapabilities, toManifestCapabilities } from "@browser-compat/capabilities";
|
|
5
|
+
import { compareManifestWithCurrentTargets, createCompatManifest, validateCompatManifest, } from "@browser-compat/core";
|
|
6
|
+
import { scanCompatCss } from "@browser-compat/postcss";
|
|
7
|
+
import { BrowserslistConfigError, resolveBrowserslistConfig } from "./projectConfig.js";
|
|
8
|
+
const CLI_PACKAGE_VERSION = "0.1.0";
|
|
9
|
+
async function main(argv) {
|
|
10
|
+
const args = parseArgs(argv);
|
|
11
|
+
if (args.help || !args.command) {
|
|
12
|
+
printHelp();
|
|
13
|
+
return args.command ? 0 : 1;
|
|
14
|
+
}
|
|
15
|
+
try {
|
|
16
|
+
if (args.command === "prepare") {
|
|
17
|
+
await prepare(args);
|
|
18
|
+
return 0;
|
|
19
|
+
}
|
|
20
|
+
if (args.command === "check") {
|
|
21
|
+
await check(args);
|
|
22
|
+
return 0;
|
|
23
|
+
}
|
|
24
|
+
if (args.command === "report") {
|
|
25
|
+
await report(args);
|
|
26
|
+
return 0;
|
|
27
|
+
}
|
|
28
|
+
if (args.command === "generate") {
|
|
29
|
+
await generate(args);
|
|
30
|
+
return 0;
|
|
31
|
+
}
|
|
32
|
+
throw new CliError(`Unknown command: ${args.command}`);
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
if (error instanceof CliError || error instanceof BrowserslistConfigError) {
|
|
36
|
+
console.error(`browser-compat: ${error.message}`);
|
|
37
|
+
return 1;
|
|
38
|
+
}
|
|
39
|
+
console.error(error);
|
|
40
|
+
return 1;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
async function prepare(args) {
|
|
44
|
+
const projectDir = path.resolve(args.project ?? process.cwd());
|
|
45
|
+
if (!args.out) {
|
|
46
|
+
throw new CliError("prepare requires --out <file>");
|
|
47
|
+
}
|
|
48
|
+
const resolved = await resolveBrowserslistConfig({
|
|
49
|
+
projectDir,
|
|
50
|
+
targetsOverride: args.targets,
|
|
51
|
+
strictBrowserslist: args.strictBrowserslist,
|
|
52
|
+
});
|
|
53
|
+
const capabilities = args.withCapabilities
|
|
54
|
+
? toManifestCapabilities(await mapCapabilities({
|
|
55
|
+
projectDir,
|
|
56
|
+
targets: resolved.normalizedTargets,
|
|
57
|
+
}))
|
|
58
|
+
: undefined;
|
|
59
|
+
const manifest = createCompatManifest({
|
|
60
|
+
source: resolved.source,
|
|
61
|
+
targets: resolved.targets,
|
|
62
|
+
normalizedTargets: resolved.normalizedTargets,
|
|
63
|
+
browserslistVersion: resolved.browserslistVersion,
|
|
64
|
+
packageVersion: CLI_PACKAGE_VERSION,
|
|
65
|
+
capabilities,
|
|
66
|
+
});
|
|
67
|
+
const validation = validateCompatManifest(manifest);
|
|
68
|
+
if (!validation.ok) {
|
|
69
|
+
throw new CliError(`generated manifest failed validation: ${validation.errors.join("; ")}`);
|
|
70
|
+
}
|
|
71
|
+
const outPath = path.resolve(args.out);
|
|
72
|
+
await mkdir(path.dirname(outPath), { recursive: true });
|
|
73
|
+
await writeFile(outPath, `${JSON.stringify(manifest, null, 2)}\n`, "utf8");
|
|
74
|
+
console.log(`Wrote ${outPath}`);
|
|
75
|
+
}
|
|
76
|
+
async function generate(args) {
|
|
77
|
+
const projectDir = path.resolve(args.project ?? process.cwd());
|
|
78
|
+
if (!args.out) {
|
|
79
|
+
throw new CliError("generate requires --out <manifest-file>");
|
|
80
|
+
}
|
|
81
|
+
const resolved = await resolveBrowserslistConfig({
|
|
82
|
+
projectDir,
|
|
83
|
+
targetsOverride: args.targets,
|
|
84
|
+
strictBrowserslist: args.strictBrowserslist,
|
|
85
|
+
});
|
|
86
|
+
const capabilityReport = await mapCapabilities({
|
|
87
|
+
projectDir,
|
|
88
|
+
targets: resolved.normalizedTargets,
|
|
89
|
+
});
|
|
90
|
+
const manifest = createCompatManifest({
|
|
91
|
+
source: resolved.source,
|
|
92
|
+
targets: resolved.targets,
|
|
93
|
+
normalizedTargets: resolved.normalizedTargets,
|
|
94
|
+
browserslistVersion: resolved.browserslistVersion,
|
|
95
|
+
packageVersion: CLI_PACKAGE_VERSION,
|
|
96
|
+
capabilities: toManifestCapabilities(capabilityReport),
|
|
97
|
+
});
|
|
98
|
+
const validation = validateCompatManifest(manifest);
|
|
99
|
+
if (!validation.ok) {
|
|
100
|
+
throw new CliError(`generated manifest failed validation: ${validation.errors.join("; ")}`);
|
|
101
|
+
}
|
|
102
|
+
const outPath = path.resolve(args.out);
|
|
103
|
+
await mkdir(path.dirname(outPath), { recursive: true });
|
|
104
|
+
await writeFile(outPath, `${JSON.stringify(manifest, null, 2)}\n`, "utf8");
|
|
105
|
+
if (args.capabilities) {
|
|
106
|
+
const capabilitiesPath = path.resolve(args.capabilities);
|
|
107
|
+
await mkdir(path.dirname(capabilitiesPath), { recursive: true });
|
|
108
|
+
await writeFile(capabilitiesPath, `${JSON.stringify(capabilityReport, null, 2)}\n`, "utf8");
|
|
109
|
+
}
|
|
110
|
+
if (args.cssReport || args.cssOut) {
|
|
111
|
+
const cssReport = await scanCompatCss({
|
|
112
|
+
projectDir,
|
|
113
|
+
mode: args.cssMode ?? (args.cssOut ? "generate" : "report"),
|
|
114
|
+
});
|
|
115
|
+
if (args.cssReport) {
|
|
116
|
+
const cssReportPath = path.resolve(args.cssReport);
|
|
117
|
+
await mkdir(path.dirname(cssReportPath), { recursive: true });
|
|
118
|
+
await writeFile(cssReportPath, `${JSON.stringify(cssReport, null, 2)}\n`, "utf8");
|
|
119
|
+
}
|
|
120
|
+
if (args.cssOut) {
|
|
121
|
+
const cssOutPath = path.resolve(args.cssOut);
|
|
122
|
+
await mkdir(path.dirname(cssOutPath), { recursive: true });
|
|
123
|
+
await writeFile(cssOutPath, `${cssReport.generatedCss ?? ""}\n`, "utf8");
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
console.log(`Wrote ${outPath}`);
|
|
127
|
+
}
|
|
128
|
+
async function check(args) {
|
|
129
|
+
const projectDir = path.resolve(args.project ?? process.cwd());
|
|
130
|
+
if (!args.manifest) {
|
|
131
|
+
throw new CliError("check requires --manifest <file>");
|
|
132
|
+
}
|
|
133
|
+
const manifestPath = path.resolve(args.manifest);
|
|
134
|
+
const manifest = JSON.parse(await readFile(manifestPath, "utf8"));
|
|
135
|
+
const validation = validateCompatManifest(manifest);
|
|
136
|
+
if (!validation.ok) {
|
|
137
|
+
throw new CliError(`manifest schema invalid: ${validation.errors.join("; ")}`);
|
|
138
|
+
}
|
|
139
|
+
const typedManifest = manifest;
|
|
140
|
+
const resolved = await resolveBrowserslistConfig({
|
|
141
|
+
projectDir,
|
|
142
|
+
strictBrowserslist: args.strictBrowserslist,
|
|
143
|
+
});
|
|
144
|
+
const errors = compareManifestWithCurrentTargets(typedManifest, resolved.source, resolved.targets, resolved.normalizedTargets);
|
|
145
|
+
if (errors.length > 0) {
|
|
146
|
+
throw new CliError(`manifest is out of date: ${errors.join("; ")}`);
|
|
147
|
+
}
|
|
148
|
+
console.log(`Manifest is current: ${manifestPath}`);
|
|
149
|
+
}
|
|
150
|
+
async function report(args) {
|
|
151
|
+
const projectDir = path.resolve(args.project ?? process.cwd());
|
|
152
|
+
const resolved = await resolveBrowserslistConfig({
|
|
153
|
+
projectDir,
|
|
154
|
+
targetsOverride: args.targets,
|
|
155
|
+
strictBrowserslist: args.strictBrowserslist,
|
|
156
|
+
});
|
|
157
|
+
const capabilityReport = await mapCapabilities({
|
|
158
|
+
projectDir,
|
|
159
|
+
targets: resolved.normalizedTargets,
|
|
160
|
+
});
|
|
161
|
+
const output = `${JSON.stringify(capabilityReport, null, 2)}\n`;
|
|
162
|
+
const cssReport = args.cssReport
|
|
163
|
+
? await scanCompatCss({ projectDir, mode: args.cssMode ?? "report" })
|
|
164
|
+
: undefined;
|
|
165
|
+
if (args.out) {
|
|
166
|
+
const outPath = path.resolve(args.out);
|
|
167
|
+
await mkdir(path.dirname(outPath), { recursive: true });
|
|
168
|
+
await writeFile(outPath, output, "utf8");
|
|
169
|
+
console.log(`Wrote ${outPath}`);
|
|
170
|
+
}
|
|
171
|
+
if (args.cssReport && cssReport) {
|
|
172
|
+
const cssReportPath = path.resolve(args.cssReport);
|
|
173
|
+
await mkdir(path.dirname(cssReportPath), { recursive: true });
|
|
174
|
+
await writeFile(cssReportPath, `${JSON.stringify(cssReport, null, 2)}\n`, "utf8");
|
|
175
|
+
}
|
|
176
|
+
if (!args.out) {
|
|
177
|
+
process.stdout.write(output);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
function parseArgs(argv) {
|
|
181
|
+
const parsed = {
|
|
182
|
+
command: argv[0],
|
|
183
|
+
withCapabilities: false,
|
|
184
|
+
strictBrowserslist: false,
|
|
185
|
+
help: false,
|
|
186
|
+
};
|
|
187
|
+
for (let index = 1; index < argv.length; index += 1) {
|
|
188
|
+
const arg = argv[index];
|
|
189
|
+
if (arg === "--help" || arg === "-h") {
|
|
190
|
+
parsed.help = true;
|
|
191
|
+
continue;
|
|
192
|
+
}
|
|
193
|
+
if (arg === "--strict-browserslist") {
|
|
194
|
+
parsed.strictBrowserslist = true;
|
|
195
|
+
continue;
|
|
196
|
+
}
|
|
197
|
+
if (arg === "--with-capabilities") {
|
|
198
|
+
parsed.withCapabilities = true;
|
|
199
|
+
continue;
|
|
200
|
+
}
|
|
201
|
+
if (arg === "--project") {
|
|
202
|
+
parsed.project = readValue(argv, ++index, "--project");
|
|
203
|
+
continue;
|
|
204
|
+
}
|
|
205
|
+
if (arg === "--out") {
|
|
206
|
+
parsed.out = readValue(argv, ++index, "--out");
|
|
207
|
+
continue;
|
|
208
|
+
}
|
|
209
|
+
if (arg === "--manifest") {
|
|
210
|
+
parsed.manifest = readValue(argv, ++index, "--manifest");
|
|
211
|
+
continue;
|
|
212
|
+
}
|
|
213
|
+
if (arg === "--capabilities") {
|
|
214
|
+
parsed.capabilities = readValue(argv, ++index, "--capabilities");
|
|
215
|
+
continue;
|
|
216
|
+
}
|
|
217
|
+
if (arg === "--css-report") {
|
|
218
|
+
parsed.cssReport = readValue(argv, ++index, "--css-report");
|
|
219
|
+
continue;
|
|
220
|
+
}
|
|
221
|
+
if (arg === "--css-out") {
|
|
222
|
+
parsed.cssOut = readValue(argv, ++index, "--css-out");
|
|
223
|
+
continue;
|
|
224
|
+
}
|
|
225
|
+
if (arg === "--css-mode") {
|
|
226
|
+
const value = readValue(argv, ++index, "--css-mode");
|
|
227
|
+
if (value !== "report" && value !== "generate") {
|
|
228
|
+
throw new CliError("--css-mode must be report or generate");
|
|
229
|
+
}
|
|
230
|
+
parsed.cssMode = value;
|
|
231
|
+
continue;
|
|
232
|
+
}
|
|
233
|
+
if (arg === "--targets") {
|
|
234
|
+
parsed.targets = readValue(argv, ++index, "--targets");
|
|
235
|
+
continue;
|
|
236
|
+
}
|
|
237
|
+
if (arg === "--format") {
|
|
238
|
+
parsed.format = readValue(argv, ++index, "--format");
|
|
239
|
+
if (parsed.format !== "json") {
|
|
240
|
+
throw new CliError("--format currently supports only json");
|
|
241
|
+
}
|
|
242
|
+
continue;
|
|
243
|
+
}
|
|
244
|
+
throw new CliError(`Unknown option: ${arg}`);
|
|
245
|
+
}
|
|
246
|
+
return parsed;
|
|
247
|
+
}
|
|
248
|
+
function readValue(argv, index, option) {
|
|
249
|
+
const value = argv[index];
|
|
250
|
+
if (!value || value.startsWith("--")) {
|
|
251
|
+
throw new CliError(`${option} requires a value`);
|
|
252
|
+
}
|
|
253
|
+
return value;
|
|
254
|
+
}
|
|
255
|
+
function printHelp() {
|
|
256
|
+
console.log(`browser-compat
|
|
257
|
+
|
|
258
|
+
Usage:
|
|
259
|
+
browser-compat prepare --project <dir> --out <file> [--strict-browserslist] [--targets "..."] [--with-capabilities]
|
|
260
|
+
browser-compat check --project <dir> --manifest <file> [--strict-browserslist]
|
|
261
|
+
browser-compat report --project <dir> [--out <file>] [--css-report <file>] [--strict-browserslist] [--format json]
|
|
262
|
+
browser-compat generate --project <dir> --out <manifest-file> [--capabilities <file>] [--css-report <file>] [--css-out <file>] [--css-mode report|generate] [--strict-browserslist]
|
|
263
|
+
`);
|
|
264
|
+
}
|
|
265
|
+
class CliError extends Error {
|
|
266
|
+
constructor(message) {
|
|
267
|
+
super(message);
|
|
268
|
+
this.name = "CliError";
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
main(process.argv.slice(2)).then((code) => {
|
|
272
|
+
process.exitCode = code;
|
|
273
|
+
});
|
|
274
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACvF,OAAO,EACL,iCAAiC,EACjC,oBAAoB,EACpB,sBAAsB,GAEvB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,aAAa,EAAsB,MAAM,yBAAyB,CAAC;AAC5E,OAAO,EAAE,uBAAuB,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAExF,MAAM,mBAAmB,GAAG,OAAO,CAAC;AAkBpC,KAAK,UAAU,IAAI,CAAC,IAAc;IAChC,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAE7B,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAC/B,SAAS,EAAE,CAAC;QACZ,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9B,CAAC;IAED,IAAI,CAAC;QACH,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAC/B,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;YACpB,OAAO,CAAC,CAAC;QACX,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;YAC7B,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;YAClB,OAAO,CAAC,CAAC;QACX,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YAC9B,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;YACnB,OAAO,CAAC,CAAC;QACX,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;YAChC,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;YACrB,OAAO,CAAC,CAAC;QACX,CAAC;QAED,MAAM,IAAI,QAAQ,CAAC,oBAAoB,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IACzD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,QAAQ,IAAI,KAAK,YAAY,uBAAuB,EAAE,CAAC;YAC1E,OAAO,CAAC,KAAK,CAAC,mBAAmB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAClD,OAAO,CAAC,CAAC;QACX,CAAC;QAED,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACrB,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAED,KAAK,UAAU,OAAO,CAAC,IAAgB;IACrC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAE/D,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QACd,MAAM,IAAI,QAAQ,CAAC,+BAA+B,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,yBAAyB,CAAC;QAC/C,UAAU;QACV,eAAe,EAAE,IAAI,CAAC,OAAO;QAC7B,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;KAC5C,CAAC,CAAC;IACH,MAAM,YAAY,GAAG,IAAI,CAAC,gBAAgB;QACxC,CAAC,CAAC,sBAAsB,CACpB,MAAM,eAAe,CAAC;YACpB,UAAU;YACV,OAAO,EAAE,QAAQ,CAAC,iBAAiB;SACpC,CAAC,CACH;QACH,CAAC,CAAC,SAAS,CAAC;IAEd,MAAM,QAAQ,GAAG,oBAAoB,CAAC;QACpC,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB;QAC7C,mBAAmB,EAAE,QAAQ,CAAC,mBAAmB;QACjD,cAAc,EAAE,mBAAmB;QACnC,YAAY;KACb,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IACpD,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC;QACnB,MAAM,IAAI,QAAQ,CAAC,yCAAyC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9F,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACvC,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,MAAM,SAAS,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC3E,OAAO,CAAC,GAAG,CAAC,SAAS,OAAO,EAAE,CAAC,CAAC;AAClC,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,IAAgB;IACtC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAE/D,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QACd,MAAM,IAAI,QAAQ,CAAC,yCAAyC,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,yBAAyB,CAAC;QAC/C,UAAU;QACV,eAAe,EAAE,IAAI,CAAC,OAAO;QAC7B,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;KAC5C,CAAC,CAAC;IACH,MAAM,gBAAgB,GAAG,MAAM,eAAe,CAAC;QAC7C,UAAU;QACV,OAAO,EAAE,QAAQ,CAAC,iBAAiB;KACpC,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,oBAAoB,CAAC;QACpC,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB;QAC7C,mBAAmB,EAAE,QAAQ,CAAC,mBAAmB;QACjD,cAAc,EAAE,mBAAmB;QACnC,YAAY,EAAE,sBAAsB,CAAC,gBAAgB,CAAC;KACvD,CAAC,CAAC;IACH,MAAM,UAAU,GAAG,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IAEpD,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC;QACnB,MAAM,IAAI,QAAQ,CAAC,yCAAyC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9F,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACvC,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,MAAM,SAAS,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAE3E,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACzD,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACjE,MAAM,SAAS,CAAC,gBAAgB,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC9F,CAAC;IAED,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAClC,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC;YACpC,UAAU;YACV,IAAI,EAAE,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC;SAC5D,CAAC,CAAC;QAEH,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACnD,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC9D,MAAM,SAAS,CAAC,aAAa,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACpF,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC7C,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC3D,MAAM,SAAS,CAAC,UAAU,EAAE,GAAG,SAAS,CAAC,YAAY,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,SAAS,OAAO,EAAE,CAAC,CAAC;AAClC,CAAC;AAED,KAAK,UAAU,KAAK,CAAC,IAAgB;IACnC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAE/D,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACnB,MAAM,IAAI,QAAQ,CAAC,kCAAkC,CAAC,CAAC;IACzD,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAY,CAAC;IAC7E,MAAM,UAAU,GAAG,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IAEpD,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC;QACnB,MAAM,IAAI,QAAQ,CAAC,4BAA4B,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjF,CAAC;IAED,MAAM,aAAa,GAAG,QAA0B,CAAC;IACjD,MAAM,QAAQ,GAAG,MAAM,yBAAyB,CAAC;QAC/C,UAAU;QACV,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;KAC5C,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,iCAAiC,CAC9C,aAAa,EACb,QAAQ,CAAC,MAAM,EACf,QAAQ,CAAC,OAAO,EAChB,QAAQ,CAAC,iBAAiB,CAC3B,CAAC;IAEF,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,QAAQ,CAAC,4BAA4B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACtE,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,wBAAwB,YAAY,EAAE,CAAC,CAAC;AACtD,CAAC;AAED,KAAK,UAAU,MAAM,CAAC,IAAgB;IACpC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAC/D,MAAM,QAAQ,GAAG,MAAM,yBAAyB,CAAC;QAC/C,UAAU;QACV,eAAe,EAAE,IAAI,CAAC,OAAO;QAC7B,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;KAC5C,CAAC,CAAC;IACH,MAAM,gBAAgB,GAAG,MAAM,eAAe,CAAC;QAC7C,UAAU;QACV,OAAO,EAAE,QAAQ,CAAC,iBAAiB;KACpC,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;IAChE,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS;QAC9B,CAAC,CAAC,MAAM,aAAa,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,IAAI,QAAQ,EAAE,CAAC;QACrE,CAAC,CAAC,SAAS,CAAC;IAEd,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACvC,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,MAAM,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,SAAS,OAAO,EAAE,CAAC,CAAC;IAClC,CAAC;IAED,IAAI,IAAI,CAAC,SAAS,IAAI,SAAS,EAAE,CAAC;QAChC,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACnD,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9D,MAAM,SAAS,CAAC,aAAa,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACpF,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,IAAc;IAC/B,MAAM,MAAM,GAAe;QACzB,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QAChB,gBAAgB,EAAE,KAAK;QACvB,kBAAkB,EAAE,KAAK;QACzB,IAAI,EAAE,KAAK;KACZ,CAAC;IAEF,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACpD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QAExB,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACrC,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;YACnB,SAAS;QACX,CAAC;QAED,IAAI,GAAG,KAAK,uBAAuB,EAAE,CAAC;YACpC,MAAM,CAAC,kBAAkB,GAAG,IAAI,CAAC;YACjC,SAAS;QACX,CAAC;QAED,IAAI,GAAG,KAAK,qBAAqB,EAAE,CAAC;YAClC,MAAM,CAAC,gBAAgB,GAAG,IAAI,CAAC;YAC/B,SAAS;QACX,CAAC;QAED,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;YACxB,MAAM,CAAC,OAAO,GAAG,SAAS,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;YACvD,SAAS;QACX,CAAC;QAED,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;YACpB,MAAM,CAAC,GAAG,GAAG,SAAS,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;YAC/C,SAAS;QACX,CAAC;QAED,IAAI,GAAG,KAAK,YAAY,EAAE,CAAC;YACzB,MAAM,CAAC,QAAQ,GAAG,SAAS,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC;YACzD,SAAS;QACX,CAAC;QAED,IAAI,GAAG,KAAK,gBAAgB,EAAE,CAAC;YAC7B,MAAM,CAAC,YAAY,GAAG,SAAS,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,gBAAgB,CAAC,CAAC;YACjE,SAAS;QACX,CAAC;QAED,IAAI,GAAG,KAAK,cAAc,EAAE,CAAC;YAC3B,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;YAC5D,SAAS;QACX,CAAC;QAED,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;YACxB,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;YACtD,SAAS;QACX,CAAC;QAED,IAAI,GAAG,KAAK,YAAY,EAAE,CAAC;YACzB,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC;YACrD,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,UAAU,EAAE,CAAC;gBAC/C,MAAM,IAAI,QAAQ,CAAC,uCAAuC,CAAC,CAAC;YAC9D,CAAC;YACD,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC;YACvB,SAAS;QACX,CAAC;QAED,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;YACxB,MAAM,CAAC,OAAO,GAAG,SAAS,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;YACvD,SAAS;QACX,CAAC;QAED,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;YACvB,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;YACrD,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBAC7B,MAAM,IAAI,QAAQ,CAAC,uCAAuC,CAAC,CAAC;YAC9D,CAAC;YACD,SAAS;QACX,CAAC;QAED,MAAM,IAAI,QAAQ,CAAC,mBAAmB,GAAG,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,SAAS,CAAC,IAAc,EAAE,KAAa,EAAE,MAAc;IAC9D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1B,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,QAAQ,CAAC,GAAG,MAAM,mBAAmB,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,SAAS;IAChB,OAAO,CAAC,GAAG,CAAC;;;;;;;CAOb,CAAC,CAAC;AACH,CAAC;AAED,MAAM,QAAS,SAAQ,KAAK;IAC1B,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF;AAED,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;IACxC,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;AAC1B,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { BrowserslistSource } from "@browser-compat/core";
|
|
2
|
+
export interface ResolvedBrowserslist {
|
|
3
|
+
source: BrowserslistSource;
|
|
4
|
+
targets: string[];
|
|
5
|
+
normalizedTargets: string[];
|
|
6
|
+
browserslistVersion?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare class BrowserslistConfigError extends Error {
|
|
9
|
+
constructor(message: string);
|
|
10
|
+
}
|
|
11
|
+
export declare function resolveBrowserslistConfig(options: {
|
|
12
|
+
projectDir: string;
|
|
13
|
+
targetsOverride?: string;
|
|
14
|
+
strictBrowserslist?: boolean;
|
|
15
|
+
}): Promise<ResolvedBrowserslist>;
|
|
16
|
+
export declare function hashStable(value: unknown): string;
|
|
17
|
+
//# sourceMappingURL=projectConfig.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projectConfig.d.ts","sourceRoot":"","sources":["../src/projectConfig.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE/D,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,kBAAkB,CAAC;IAC3B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,qBAAa,uBAAwB,SAAQ,KAAK;gBACpC,OAAO,EAAE,MAAM;CAI5B;AAED,wBAAsB,yBAAyB,CAAC,OAAO,EAAE;IACvD,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B,GAAG,OAAO,CAAC,oBAAoB,CAAC,CA+BhC;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEjD"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { readFile } from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import browserslist from "browserslist";
|
|
5
|
+
export class BrowserslistConfigError extends Error {
|
|
6
|
+
constructor(message) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.name = "BrowserslistConfigError";
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export async function resolveBrowserslistConfig(options) {
|
|
12
|
+
const projectDir = path.resolve(options.projectDir);
|
|
13
|
+
if (options.targetsOverride) {
|
|
14
|
+
const targets = parseTargetsOverride(options.targetsOverride);
|
|
15
|
+
return {
|
|
16
|
+
source: {
|
|
17
|
+
type: "cli-override",
|
|
18
|
+
raw: options.targetsOverride,
|
|
19
|
+
hash: hashStable(options.targetsOverride),
|
|
20
|
+
},
|
|
21
|
+
targets,
|
|
22
|
+
normalizedTargets: normalizeTargets(targets, projectDir),
|
|
23
|
+
browserslistVersion: browserslistVersion(),
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
const packageJson = await readPackageBrowserslist(projectDir);
|
|
27
|
+
if (packageJson) {
|
|
28
|
+
return packageJson;
|
|
29
|
+
}
|
|
30
|
+
const browserslistrc = await readBrowserslistrc(projectDir);
|
|
31
|
+
if (browserslistrc) {
|
|
32
|
+
return browserslistrc;
|
|
33
|
+
}
|
|
34
|
+
const message = options.strictBrowserslist
|
|
35
|
+
? "No explicit browserslist found. Add package.json#browserslist or .browserslistrc."
|
|
36
|
+
: "No explicit browserslist found. Refusing to use package defaults.";
|
|
37
|
+
throw new BrowserslistConfigError(message);
|
|
38
|
+
}
|
|
39
|
+
export function hashStable(value) {
|
|
40
|
+
return createHash("sha256").update(stableStringify(value)).digest("hex");
|
|
41
|
+
}
|
|
42
|
+
function parseTargetsOverride(value) {
|
|
43
|
+
const targets = value
|
|
44
|
+
.split(/[\n,]/)
|
|
45
|
+
.map((item) => item.trim())
|
|
46
|
+
.filter(Boolean);
|
|
47
|
+
if (targets.length === 0) {
|
|
48
|
+
throw new BrowserslistConfigError("--targets must contain at least one browserslist query");
|
|
49
|
+
}
|
|
50
|
+
return targets;
|
|
51
|
+
}
|
|
52
|
+
async function readPackageBrowserslist(projectDir) {
|
|
53
|
+
const packageJsonPath = path.join(projectDir, "package.json");
|
|
54
|
+
let packageJsonText;
|
|
55
|
+
try {
|
|
56
|
+
packageJsonText = await readFile(packageJsonPath, "utf8");
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
let packageJson;
|
|
62
|
+
try {
|
|
63
|
+
packageJson = JSON.parse(packageJsonText);
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
throw new BrowserslistConfigError(`Failed to parse ${packageJsonPath}: ${error instanceof Error ? error.message : String(error)}`);
|
|
67
|
+
}
|
|
68
|
+
if (!isRecord(packageJson) || !("browserslist" in packageJson)) {
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
const raw = packageJson.browserslist;
|
|
72
|
+
const targets = extractPackageBrowserslistTargets(raw);
|
|
73
|
+
return {
|
|
74
|
+
source: {
|
|
75
|
+
type: "package-json",
|
|
76
|
+
path: path.relative(projectDir, packageJsonPath),
|
|
77
|
+
raw,
|
|
78
|
+
hash: hashStable(raw),
|
|
79
|
+
},
|
|
80
|
+
targets,
|
|
81
|
+
normalizedTargets: normalizeTargets(targets, projectDir),
|
|
82
|
+
browserslistVersion: browserslistVersion(),
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
async function readBrowserslistrc(projectDir) {
|
|
86
|
+
const browserslistrcPath = path.join(projectDir, ".browserslistrc");
|
|
87
|
+
let text;
|
|
88
|
+
try {
|
|
89
|
+
text = await readFile(browserslistrcPath, "utf8");
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
const targets = parseBrowserslistrc(text);
|
|
95
|
+
if (targets.length === 0) {
|
|
96
|
+
throw new BrowserslistConfigError(`${browserslistrcPath} does not contain any browserslist query`);
|
|
97
|
+
}
|
|
98
|
+
return {
|
|
99
|
+
source: {
|
|
100
|
+
type: "browserslistrc",
|
|
101
|
+
path: path.relative(projectDir, browserslistrcPath),
|
|
102
|
+
raw: text,
|
|
103
|
+
hash: hashStable(text),
|
|
104
|
+
},
|
|
105
|
+
targets,
|
|
106
|
+
normalizedTargets: normalizeTargets(targets, projectDir),
|
|
107
|
+
browserslistVersion: browserslistVersion(),
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
function extractPackageBrowserslistTargets(raw) {
|
|
111
|
+
if (Array.isArray(raw) && raw.every((item) => typeof item === "string")) {
|
|
112
|
+
return raw;
|
|
113
|
+
}
|
|
114
|
+
if (typeof raw === "string") {
|
|
115
|
+
return parseBrowserslistrc(raw);
|
|
116
|
+
}
|
|
117
|
+
if (isRecord(raw)) {
|
|
118
|
+
const production = raw.production;
|
|
119
|
+
if (Array.isArray(production) && production.every((item) => typeof item === "string")) {
|
|
120
|
+
return production;
|
|
121
|
+
}
|
|
122
|
+
const defaults = raw.defaults;
|
|
123
|
+
if (Array.isArray(defaults) && defaults.every((item) => typeof item === "string")) {
|
|
124
|
+
return defaults;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
throw new BrowserslistConfigError("package.json#browserslist must be a string array, a string, or an object with production/defaults string array");
|
|
128
|
+
}
|
|
129
|
+
function parseBrowserslistrc(text) {
|
|
130
|
+
return text
|
|
131
|
+
.split(/\r?\n/)
|
|
132
|
+
.map((line) => line.replace(/#.*/, "").trim())
|
|
133
|
+
.filter((line) => line.length > 0 && !line.startsWith("["));
|
|
134
|
+
}
|
|
135
|
+
function normalizeTargets(targets, projectDir) {
|
|
136
|
+
try {
|
|
137
|
+
return browserslist(targets, { path: projectDir }).sort();
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
throw new BrowserslistConfigError(`Invalid browserslist query: ${error instanceof Error ? error.message : String(error)}`);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
function browserslistVersion() {
|
|
144
|
+
return undefined;
|
|
145
|
+
}
|
|
146
|
+
function stableStringify(value) {
|
|
147
|
+
if (Array.isArray(value)) {
|
|
148
|
+
return `[${value.map(stableStringify).join(",")}]`;
|
|
149
|
+
}
|
|
150
|
+
if (isRecord(value)) {
|
|
151
|
+
return `{${Object.keys(value)
|
|
152
|
+
.sort()
|
|
153
|
+
.map((key) => `${JSON.stringify(key)}:${stableStringify(value[key])}`)
|
|
154
|
+
.join(",")}}`;
|
|
155
|
+
}
|
|
156
|
+
return JSON.stringify(value);
|
|
157
|
+
}
|
|
158
|
+
function isRecord(value) {
|
|
159
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=projectConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projectConfig.js","sourceRoot":"","sources":["../src/projectConfig.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@browser-compat/cli",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "CLI for generating and checking browser-compat manifests and reports.",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"bin": {
|
|
8
|
+
"browser-compat": "dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"main": "./dist/index.js",
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"files": [
|
|
13
|
+
"dist/**/*.js",
|
|
14
|
+
"dist/**/*.js.map",
|
|
15
|
+
"dist/**/*.d.ts",
|
|
16
|
+
"dist/**/*.d.ts.map",
|
|
17
|
+
"README.md",
|
|
18
|
+
"LICENSE"
|
|
19
|
+
],
|
|
20
|
+
"exports": {
|
|
21
|
+
".": {
|
|
22
|
+
"types": "./dist/index.d.ts",
|
|
23
|
+
"default": "./dist/index.js"
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
"publishConfig": {
|
|
27
|
+
"access": "public"
|
|
28
|
+
},
|
|
29
|
+
"dependencies": {
|
|
30
|
+
"@browser-compat/capabilities": "0.1.0",
|
|
31
|
+
"@browser-compat/core": "0.1.0",
|
|
32
|
+
"@browser-compat/postcss": "0.1.0",
|
|
33
|
+
"browserslist": "^4.24.4"
|
|
34
|
+
},
|
|
35
|
+
"scripts": {
|
|
36
|
+
"build": "tsc -b",
|
|
37
|
+
"typecheck": "tsc -b --noEmit"
|
|
38
|
+
}
|
|
39
|
+
}
|