@stll/oxlint-config 0.12.2 → 0.14.1

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.
Files changed (82) hide show
  1. package/README.md +234 -1
  2. package/dist/cloud-setup-cli.cjs +6 -4
  3. package/dist/cloud-setup-cli.cjs.map +1 -1
  4. package/dist/cloud-setup-cli.mjs +3 -1
  5. package/dist/cloud-setup-cli.mjs.map +1 -1
  6. package/dist/compiler-packages.cjs +28 -0
  7. package/dist/compiler-packages.cjs.map +1 -0
  8. package/dist/compiler-packages.mjs +17 -0
  9. package/dist/compiler-packages.mjs.map +1 -0
  10. package/dist/consumer-compat-cli.cjs +1091 -0
  11. package/dist/consumer-compat-cli.cjs.map +1 -0
  12. package/dist/consumer-compat-cli.d.cts +1 -0
  13. package/dist/consumer-compat-cli.d.mts +1 -0
  14. package/dist/consumer-compat-cli.mjs +1089 -0
  15. package/dist/consumer-compat-cli.mjs.map +1 -0
  16. package/dist/publish-build-target-nuxt-helper.cjs +71 -0
  17. package/dist/publish-build-target-nuxt-helper.cjs.map +1 -0
  18. package/dist/publish-build-target-nuxt-helper.d.cts +10 -0
  19. package/dist/publish-build-target-nuxt-helper.d.mts +10 -0
  20. package/dist/publish-build-target-nuxt-helper.mjs +68 -0
  21. package/dist/publish-build-target-nuxt-helper.mjs.map +1 -0
  22. package/dist/publish-build-target-vite-dts-helper.cjs +3 -0
  23. package/dist/publish-build-target-vite-dts-helper.d.cts +24 -0
  24. package/dist/publish-build-target-vite-dts-helper.d.mts +24 -0
  25. package/dist/publish-build-target-vite-dts-helper.mjs +2 -0
  26. package/dist/publish-build-target-vite-dts-helper2.cjs +372 -0
  27. package/dist/publish-build-target-vite-dts-helper2.cjs.map +1 -0
  28. package/dist/publish-build-target-vite-dts-helper2.mjs +359 -0
  29. package/dist/publish-build-target-vite-dts-helper2.mjs.map +1 -0
  30. package/dist/publish-contract-cli.cjs +983 -0
  31. package/dist/publish-contract-cli.cjs.map +1 -0
  32. package/dist/publish-contract-cli.d.cts +1 -0
  33. package/dist/publish-contract-cli.d.mts +1 -0
  34. package/dist/publish-contract-cli.mjs +981 -0
  35. package/dist/publish-contract-cli.mjs.map +1 -0
  36. package/dist/publish-contract.cjs +431 -0
  37. package/dist/publish-contract.cjs.map +1 -0
  38. package/dist/publish-contract.mjs +396 -0
  39. package/dist/publish-contract.mjs.map +1 -0
  40. package/dist/rolldown-runtime.cjs +28 -0
  41. package/dist/toolchain-changed-cli.cjs +34 -0
  42. package/dist/toolchain-changed-cli.cjs.map +1 -0
  43. package/dist/toolchain-changed-cli.d.cts +1 -0
  44. package/dist/toolchain-changed-cli.d.mts +1 -0
  45. package/dist/toolchain-changed-cli.mjs +34 -0
  46. package/dist/toolchain-changed-cli.mjs.map +1 -0
  47. package/dist/toolchain-changed.cjs +1470 -0
  48. package/dist/toolchain-changed.cjs.map +1 -0
  49. package/dist/toolchain-changed.mjs +1463 -0
  50. package/dist/toolchain-changed.mjs.map +1 -0
  51. package/dist/toolchain-check-cli.cjs +2 -1
  52. package/dist/toolchain-check-cli.cjs.map +1 -1
  53. package/dist/toolchain-check-cli.mjs +2 -1
  54. package/dist/toolchain-check-cli.mjs.map +1 -1
  55. package/dist/toolchain-guard.cjs +360 -1161
  56. package/dist/toolchain-guard.cjs.map +1 -1
  57. package/dist/toolchain-guard.mjs +338 -1100
  58. package/dist/toolchain-guard.mjs.map +1 -1
  59. package/dist/toolchain-inputs.cjs +926 -0
  60. package/dist/toolchain-inputs.cjs.map +1 -0
  61. package/dist/toolchain-inputs.mjs +816 -0
  62. package/dist/toolchain-inputs.mjs.map +1 -0
  63. package/dist/toolchain-schema.cjs +702 -0
  64. package/dist/toolchain-schema.cjs.map +1 -0
  65. package/dist/toolchain-schema.mjs +580 -0
  66. package/dist/toolchain-schema.mjs.map +1 -0
  67. package/dist/typecheck-parity-cli.cjs +38 -898
  68. package/dist/typecheck-parity-cli.cjs.map +1 -1
  69. package/dist/typecheck-parity-cli.mjs +39 -899
  70. package/dist/typecheck-parity-cli.mjs.map +1 -1
  71. package/dist/typecheck-parity.cjs +905 -0
  72. package/dist/typecheck-parity.cjs.map +1 -0
  73. package/dist/typecheck-parity.mjs +894 -0
  74. package/dist/typecheck-parity.mjs.map +1 -0
  75. package/dist/typecheck-probe-cli.cjs +176 -0
  76. package/dist/typecheck-probe-cli.cjs.map +1 -0
  77. package/dist/typecheck-probe-cli.d.cts +1 -0
  78. package/dist/typecheck-probe-cli.d.mts +1 -0
  79. package/dist/typecheck-probe-cli.mjs +174 -0
  80. package/dist/typecheck-probe-cli.mjs.map +1 -0
  81. package/package.json +43 -5
  82. package/toolchain.json +9 -1
@@ -0,0 +1,396 @@
1
+ import { t as githubAutomationFileKind } from "./toolchain-inputs.mjs";
2
+ import { r as consumerNodeSupportMatches } from "./toolchain-schema.mjs";
3
+ import { lte, parse, satisfies } from "semver";
4
+ import { parseDocument } from "yaml";
5
+ import { isDeepStrictEqual } from "node:util";
6
+ //#region src/consumer-release-pack.ts
7
+ const record$1 = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
8
+ const exactVersion = /^(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)$/;
9
+ const outputDirectory = "<consumer-release-pack-output>";
10
+ const packerSetupExpression = /^npm\s+install\s+((?:(?:--global|-g|--ignore-scripts)\s+)+)(npm|pnpm)@([^\s]+)$/;
11
+ const defaultRunShell = (defaults) => {
12
+ if (!record$1(defaults) || !record$1(defaults["run"])) return void 0;
13
+ return defaults["run"]["shell"];
14
+ };
15
+ const packArguments = (line) => {
16
+ const command = /^(npm|pnpm)\s+pack(?:\s+(.*))?$/.exec(line);
17
+ const manager = command?.[1];
18
+ if (manager !== "npm" && manager !== "pnpm") throw new Error("Unsupported release pack command");
19
+ const tokens = (command?.[2] ?? "").match(/"[^"\n]*"|'[^'\n]*'|[^\s]+/g) ?? [];
20
+ const args = [];
21
+ let destination = false;
22
+ for (let index = 0; index < tokens.length; index++) {
23
+ const token = tokens.at(index);
24
+ if (token === "--pack-destination") {
25
+ if (destination) throw new Error("Repeated release pack destination");
26
+ const value = tokens.at(++index);
27
+ if (value === void 0 || !/^(?:"\$GITHUB_WORKSPACE\/[A-Za-z0-9_/-]+"|[A-Za-z0-9_/-]+)$/.test(value) || value.split("/").includes("..")) throw new Error("Unsupported release pack destination");
28
+ destination = true;
29
+ args.push(token, outputDirectory);
30
+ continue;
31
+ }
32
+ if (token !== "--ignore-scripts" && !(manager === "pnpm" && token === "--config.ignore-scripts=true") && token !== "--json" && token !== "--silent") throw new Error("Unsupported release pack arguments");
33
+ if (args.includes(token)) throw new Error("Repeated release pack flag");
34
+ args.push(token);
35
+ }
36
+ if (!destination || !args.includes("--ignore-scripts") && !args.includes("--config.ignore-scripts=true")) throw new Error("Release pack requires scripts disabled and --pack-destination");
37
+ return {
38
+ manager,
39
+ arguments: args
40
+ };
41
+ };
42
+ /** Both setup provenance and packing require unconditional shell commands. */
43
+ const assertReleaseShellContext = ({ step, kind, location, inheritedShell }) => {
44
+ const run = step["run"];
45
+ if (typeof run !== "string") throw new Error(`Unsupported release ${kind} shell context: ${location}`);
46
+ const shell = step["shell"] === void 0 ? inheritedShell : step["shell"];
47
+ if (shell !== void 0 && shell !== "bash" && shell !== "sh") throw new Error(`Unsupported release ${kind} shell context: ${location}`);
48
+ let quote;
49
+ let code = "";
50
+ for (let index = 0; index < run.length; index += 1) {
51
+ const char = run[index];
52
+ if (char === "\n") {
53
+ if (quote !== void 0) throw new Error(`Unsupported release ${kind} shell context: ${location}`);
54
+ code += "\n";
55
+ continue;
56
+ }
57
+ if (quote !== "single" && char === "\\") {
58
+ if (run[index + 1] === "\n" || run[index + 1] === "\r" && run[index + 2] === "\n") throw new Error(`Unsupported release ${kind} shell context: ${location}`);
59
+ index += 1;
60
+ code += " ";
61
+ continue;
62
+ }
63
+ if (quote !== "single" && (char === "`" || char === "$" && run[index + 1] === "(")) throw new Error(`Unsupported release ${kind} shell context: ${location}`);
64
+ if (quote === "single") {
65
+ if (char === "'") quote = void 0;
66
+ code += " ";
67
+ continue;
68
+ }
69
+ if (quote === "double") {
70
+ if (char === "\"") quote = void 0;
71
+ code += " ";
72
+ continue;
73
+ }
74
+ if (char === "'") {
75
+ quote = "single";
76
+ code += " ";
77
+ continue;
78
+ }
79
+ if (char === "\"") {
80
+ quote = "double";
81
+ code += " ";
82
+ continue;
83
+ }
84
+ if (char === "#" && (index === 0 || /\s/.test(run[index - 1] ?? ""))) {
85
+ while (index + 1 < run.length && run[index + 1] !== "\n") index += 1;
86
+ continue;
87
+ }
88
+ code += char;
89
+ }
90
+ if (quote !== void 0 || /[;&|<>]/.test(code) || code.split("\n").some((line) => /^\s*(?:if|then|elif|else|fi|for|do|done|while|until|case|esac|function|select|exit|return|exec|break|continue|trap|eval|source|hash|alias|unalias)\b/.test(line)) || /(?:^|\n)\s*\.(?:\s|$)/.test(code) || /(?:^|\n)\s*[A-Za-z_]\w*\s*\(\s*\)\s*[{(]/.test(code) || kind === "setup" && /[(){}]/.test(code)) throw new Error(`Unsupported release ${kind} shell context: ${location}`);
91
+ if (kind !== "setup") return;
92
+ for (const line of run.split("\n")) {
93
+ const command = line.trim();
94
+ if (command === "" || command.startsWith("#")) continue;
95
+ if (packerSetupExpression.test(command) || /^(?:npm|pnpm)\s+pack(?:\s|$)/.test(command) || [
96
+ "set -e",
97
+ "set -eu",
98
+ "set -euo pipefail"
99
+ ].includes(command)) continue;
100
+ throw new Error(`Unsupported release setup command context: ${location}`);
101
+ }
102
+ };
103
+ /** Resolve the repository's release packer without substituting another manager. */
104
+ const resolveConsumerReleasePack = (files) => {
105
+ const candidates = [];
106
+ for (const [file, text] of Object.entries(files)) {
107
+ if (githubAutomationFileKind(file) !== "workflow") continue;
108
+ const document = parseDocument(text, {
109
+ uniqueKeys: true,
110
+ merge: true
111
+ });
112
+ if (document.errors.length > 0) throw new Error(`Invalid release workflow YAML: ${file}`);
113
+ const source = document.toJS({ maxAliasCount: 100 });
114
+ if (!record$1(source) || !record$1(source["jobs"])) continue;
115
+ for (const [jobName, job] of Object.entries(source["jobs"])) {
116
+ if (!record$1(job) || !Array.isArray(job["steps"])) continue;
117
+ if (!job["steps"].some((step) => record$1(step) && typeof step["run"] === "string" && step["run"].split("\n").some((line) => !line.trimStart().startsWith("#") && /\b(?:npm|pnpm)\s+pack\b/.test(line)))) continue;
118
+ const jobShell = defaultRunShell(job["defaults"]);
119
+ const inheritedShell = jobShell === void 0 ? defaultRunShell(source["defaults"]) : jobShell;
120
+ const versions = /* @__PURE__ */ new Map();
121
+ let packed;
122
+ for (const step of job["steps"]) {
123
+ if (!record$1(step)) continue;
124
+ if (typeof step["uses"] === "string" && step["uses"].startsWith("pnpm/action-setup@")) {
125
+ if (step["if"] !== void 0 || step["continue-on-error"] !== void 0) throw new Error(`Conditional release packer setup: ${file}:${jobName}`);
126
+ const inputs = step["with"];
127
+ const version = record$1(inputs) ? inputs["version"] : void 0;
128
+ if (typeof version !== "string" || !exactVersion.test(version)) throw new Error(`Release pnpm setup requires an exact version: ${file}:${jobName}`);
129
+ const values = versions.get("pnpm") ?? [];
130
+ values.push(version);
131
+ versions.set("pnpm", values);
132
+ }
133
+ if (typeof step["run"] !== "string") continue;
134
+ for (const rawLine of step["run"].split("\n")) {
135
+ const line = rawLine.trim();
136
+ if (line.startsWith("#")) continue;
137
+ const setupCommand = /\bnpm\s+(?:install|i)\b[^\n]*\b(?:npm|pnpm)@/.test(line);
138
+ if (setupCommand) assertReleaseShellContext({
139
+ step,
140
+ kind: "setup",
141
+ location: `${file}:${jobName}`,
142
+ inheritedShell
143
+ });
144
+ const setup = packerSetupExpression.exec(line);
145
+ if (setupCommand && setup === null) throw new Error(`Unsupported release packer setup command: ${file}:${jobName}`);
146
+ if (setup !== null && /(?:^|\s)(?:--global|-g)(?:\s|$)/.test(setup[1] ?? "")) {
147
+ if (step["if"] !== void 0 || step["continue-on-error"] !== void 0) throw new Error(`Conditional release packer setup: ${file}:${jobName}`);
148
+ const manager = setup[2];
149
+ const version = setup[3];
150
+ if (manager === void 0 || version === void 0 || !exactVersion.test(version)) throw new Error(`Release packer setup requires an exact version: ${file}:${jobName}`);
151
+ const values = versions.get(manager) ?? [];
152
+ values.push(version);
153
+ versions.set(manager, values);
154
+ }
155
+ if (!/\b(?:npm|pnpm)\s+pack\b/.test(line)) continue;
156
+ if (job["if"] !== void 0 || step["if"] !== void 0 || step["continue-on-error"] !== void 0 || packed !== void 0) throw new Error(`Ambiguous release pack command: ${file}:${jobName}`);
157
+ assertReleaseShellContext({
158
+ step,
159
+ kind: "pack",
160
+ location: `${file}:${jobName}`,
161
+ inheritedShell
162
+ });
163
+ const command = packArguments(line);
164
+ const selected = versions.get(command.manager);
165
+ const version = selected?.at(0);
166
+ if (selected?.length !== 1 || version === void 0) throw new Error(`Missing or ambiguous exact release packer version: ${file}:${jobName}`);
167
+ packed = {
168
+ manager: command.manager,
169
+ version,
170
+ arguments: command.arguments
171
+ };
172
+ }
173
+ }
174
+ if (packed !== void 0) candidates.push(packed);
175
+ }
176
+ }
177
+ const selected = candidates.at(0);
178
+ if (candidates.length !== 1 || selected === void 0) throw new Error("Require exactly one identifiable release pack job");
179
+ return selected;
180
+ };
181
+ const consumerReleasePackArguments = ({ packer, directory }) => {
182
+ if (directory.length === 0) throw new Error("Release pack output directory is required");
183
+ return ["pack", ...packer.arguments.map((argument) => argument === outputDirectory ? directory : argument)];
184
+ };
185
+ //#endregion
186
+ //#region src/publish-contract.ts
187
+ const record = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
188
+ const object = (value, field) => {
189
+ if (!record(value)) throw new Error(`${field} must be an object`);
190
+ return value;
191
+ };
192
+ const closedKeys = (value, allowed, field) => {
193
+ for (const key of Object.keys(value)) if (!allowed.includes(key)) throw new Error(`${field}.${key} is unsupported`);
194
+ };
195
+ const text = (value, field) => {
196
+ if (typeof value !== "string" || value.trim() === "") throw new Error(`${field} must be a nonempty string`);
197
+ return value;
198
+ };
199
+ const stringMap = (value, field) => {
200
+ const result = /* @__PURE__ */ new Map();
201
+ for (const [key, entry] of Object.entries(object(value, field))) result.set(text(key, field), text(entry, `${field}.${key}`));
202
+ return Object.fromEntries(result);
203
+ };
204
+ const exportTarget = (value, field) => {
205
+ if (value === null) return null;
206
+ if (typeof value === "string") return text(value, field);
207
+ if (Array.isArray(value)) return value.map((entry, index) => exportTarget(entry, `${field}[${index}]`));
208
+ const result = /* @__PURE__ */ new Map();
209
+ for (const [key, entry] of Object.entries(object(value, field))) result.set(text(key, field), exportTarget(entry, `${field}.${key}`));
210
+ return Object.fromEntries(result);
211
+ };
212
+ const typesVersions = (value) => {
213
+ const result = /* @__PURE__ */ new Map();
214
+ for (const [range, paths] of Object.entries(object(value, "typesVersions"))) {
215
+ const mappings = /* @__PURE__ */ new Map();
216
+ for (const [pattern, entries] of Object.entries(object(paths, `typesVersions.${range}`))) {
217
+ if (!Array.isArray(entries)) throw new Error(`typesVersions.${range}.${pattern} must be an array`);
218
+ mappings.set(text(pattern, "typesVersions pattern"), entries.map((entry) => text(entry, "typesVersions path")));
219
+ }
220
+ result.set(text(range, "typesVersions range"), Object.fromEntries(mappings));
221
+ }
222
+ return Object.fromEntries(result);
223
+ };
224
+ const entryPointKeys = [
225
+ "type",
226
+ "exports",
227
+ "main",
228
+ "module",
229
+ "types",
230
+ "typings",
231
+ "bin",
232
+ "typesVersions"
233
+ ];
234
+ const publishConfigOverrideKeys = entryPointKeys.filter((key) => key !== "type");
235
+ const entryPoints = (value) => {
236
+ const source = object(value, "entryPoints");
237
+ closedKeys(source, entryPointKeys, "entryPoints");
238
+ const result = {};
239
+ if ("type" in source) {
240
+ if (source["type"] !== "module" && source["type"] !== "commonjs") throw new Error("entryPoints.type must be module or commonjs");
241
+ result.type = source["type"];
242
+ }
243
+ if ("exports" in source) result.exports = exportTarget(source["exports"], "entryPoints.exports");
244
+ for (const key of [
245
+ "main",
246
+ "module",
247
+ "types",
248
+ "typings"
249
+ ]) if (key in source) result[key] = text(source[key], `entryPoints.${key}`);
250
+ if ("bin" in source) result.bin = typeof source["bin"] === "string" ? text(source["bin"], "entryPoints.bin") : stringMap(source["bin"], "entryPoints.bin");
251
+ if ("typesVersions" in source) result.typesVersions = typesVersions(source["typesVersions"]);
252
+ return result;
253
+ };
254
+ const publishTarget = (value) => {
255
+ const source = object(value, "target");
256
+ if (source["type"] === "types-only") {
257
+ closedKeys(source, ["type"], "target");
258
+ return { type: "types-only" };
259
+ }
260
+ if (source["type"] !== "javascript") throw new Error("target.type must be javascript or types-only");
261
+ closedKeys(source, ["type", "targets"], "target");
262
+ if (!Array.isArray(source["targets"]) || source["targets"].length === 0) throw new Error("target.targets must be a nonempty array");
263
+ const targets = Array.from(source["targets"]).map((entry) => {
264
+ const target = text(entry, "target.targets");
265
+ if (/[\s,]/.test(target) || Array.from(target).some((character) => character.charCodeAt(0) < 32 || character.charCodeAt(0) === 127)) throw new Error("target.targets must contain resolved target identifiers");
266
+ return target;
267
+ });
268
+ return {
269
+ type: "javascript",
270
+ targets: [...new Set(targets)].sort()
271
+ };
272
+ };
273
+ const parsePublishContract = (value) => {
274
+ const source = object(value, "publish contract");
275
+ closedKeys(source, [
276
+ "engines",
277
+ "peerDependencies",
278
+ "target",
279
+ "entryPoints"
280
+ ], "publish contract");
281
+ return {
282
+ engines: stringMap(source["engines"], "engines"),
283
+ peerDependencies: stringMap(source["peerDependencies"], "peerDependencies"),
284
+ target: publishTarget(source["target"]),
285
+ entryPoints: entryPoints(source["entryPoints"])
286
+ };
287
+ };
288
+ const publishPackers = ["npm", "pnpm"];
289
+ const resolveManifestContract = ({ packer, manifest, target }) => {
290
+ if (!publishPackers.includes(packer)) throw new Error("publish packer must be npm or pnpm");
291
+ const source = object(manifest, "package manifest");
292
+ const config = "publishConfig" in source ? object(source["publishConfig"], "publishConfig") : {};
293
+ closedKeys(config, [
294
+ ...publishConfigOverrideKeys,
295
+ "access",
296
+ "registry"
297
+ ], "publishConfig");
298
+ if (packer === "npm") {
299
+ for (const key of publishConfigOverrideKeys) if (Object.hasOwn(config, key) && !(key === "exports" || key === "typesVersions" ? JSON.stringify(config[key]) === JSON.stringify(source[key]) : isDeepStrictEqual(config[key], source[key]))) throw new Error(`npm pack does not apply differing publishConfig.${key}; move the published entry to package.json or use pnpm`);
300
+ }
301
+ for (const field of [
302
+ "browser",
303
+ "esnext",
304
+ "es2015",
305
+ "unpkg",
306
+ "umd:main"
307
+ ]) if (Object.hasOwn(source, field) || Object.hasOwn(config, field)) throw new Error(`published entry field ${field} is unsupported`);
308
+ const published = {};
309
+ for (const key of entryPointKeys) if (packer === "pnpm" && key !== "type" && key in config) published[key] = config[key];
310
+ else if (key in source) published[key] = source[key];
311
+ if (typeof published["bin"] === "string") {
312
+ const command = text(source["name"], "package name for bin").split("/").at(-1);
313
+ if (command === void 0 || command === "") throw new Error("package name must determine its bin command");
314
+ published["bin"] = { [command]: published["bin"] };
315
+ }
316
+ let engines = {};
317
+ if (Object.hasOwn(source, "engines")) engines = source["engines"];
318
+ return parsePublishContract({
319
+ engines,
320
+ peerDependencies: Object.hasOwn(source, "peerDependencies") ? source["peerDependencies"] : {},
321
+ target,
322
+ entryPoints: published
323
+ });
324
+ };
325
+ const consumerPolicy = (policy) => {
326
+ closedKeys(object(policy, "consumer policy"), ["node", "typescript"], "consumer policy");
327
+ for (const [field, major] of [["node", 22], ["typescript", 6]]) {
328
+ const version = parse(policy[field]);
329
+ if (version === null || version.version !== policy[field] || version.major !== major || version.prerelease.length !== 0) throw new Error(`consumer policy ${field} must pin an exact stable ${major}.x release`);
330
+ }
331
+ };
332
+ /** Share the accepted Node target grammar between static and packed checks. */
333
+ const publishedNodeTargetSupportsConsumer = ({ target, node }) => {
334
+ const match = /^node([1-9]\d*)(?:\.(0|[1-9]\d*))?(?:\.(0|[1-9]\d*))?$/i.exec(target);
335
+ const version = match === null ? null : parse(`${match[1]}.${match[2] ?? "0"}.${match[3] ?? "0"}`);
336
+ return version !== null && lte(version, node);
337
+ };
338
+ const checkPublishContract = ({ packer, manifest, target, contract, policy }) => {
339
+ consumerPolicy(policy);
340
+ const current = resolveManifestContract({
341
+ packer,
342
+ manifest,
343
+ target
344
+ });
345
+ const committed = parsePublishContract(contract);
346
+ const diagnostics = [];
347
+ const add = (field, message) => diagnostics.push({
348
+ field,
349
+ message
350
+ });
351
+ const compare = (field, expected, actual) => {
352
+ if (field !== "entryPoints.exports" && field !== "entryPoints.typesVersions" && record(expected) && record(actual)) {
353
+ for (const key of /* @__PURE__ */ new Set([...Object.keys(expected), ...Object.keys(actual)])) compare(`${field}.${key}`, Object.hasOwn(expected, key) ? expected[key] : void 0, Object.hasOwn(actual, key) ? actual[key] : void 0);
354
+ return;
355
+ }
356
+ if (JSON.stringify(expected) !== JSON.stringify(actual)) add(field, `published ${field} differs from the committed contract`);
357
+ };
358
+ for (const field of [
359
+ "engines",
360
+ "peerDependencies",
361
+ "target",
362
+ "entryPoints"
363
+ ]) compare(field, committed[field], current[field]);
364
+ const support = (field, range, version) => {
365
+ if (range !== void 0 && !satisfies(version, range)) add(field, `${field} must support consumer version ${version}`);
366
+ };
367
+ if (!consumerNodeSupportMatches({
368
+ range: current.engines["node"],
369
+ node: policy.node
370
+ })) add("engines.node", `engines.node must support consumer version ${policy.node}`);
371
+ support("engines.typescript", current.engines["typescript"], policy.typescript);
372
+ support("peerDependencies.typescript", current.peerDependencies["typescript"], policy.typescript);
373
+ if ("bun" in current.engines) add("engines.bun", "published packages must not require Bun");
374
+ for (const peer of [
375
+ "bun",
376
+ "bun-types",
377
+ "@types/bun",
378
+ "@typescript/native"
379
+ ]) if (Object.hasOwn(current.peerDependencies, peer)) add(`peerDependencies.${peer}`, "published packages must not require development runtime or compiler packages");
380
+ if (current.target.type === "javascript") for (const selected of current.target.targets) {
381
+ if (/^bun(?:$|[0-9])/i.test(selected)) {
382
+ add("target", "published JavaScript must not require Bun");
383
+ continue;
384
+ }
385
+ if (!/^node/i.test(selected)) continue;
386
+ if (!publishedNodeTargetSupportsConsumer({
387
+ target: selected,
388
+ node: policy.node
389
+ })) add("target", `JavaScript target ${selected} must support consumer Node ${policy.node}`);
390
+ }
391
+ return diagnostics;
392
+ };
393
+ //#endregion
394
+ export { consumerReleasePackArguments as a, resolveManifestContract as i, parsePublishContract as n, resolveConsumerReleasePack as o, publishedNodeTargetSupportsConsumer as r, checkPublishContract as t };
395
+
396
+ //# sourceMappingURL=publish-contract.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish-contract.mjs","names":["record"],"sources":["../src/consumer-release-pack.ts","../src/publish-contract.ts"],"sourcesContent":["import { parseDocument } from \"yaml\";\n\nimport { githubAutomationFileKind } from \"./toolchain-inputs\";\n\nconst record = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\nconst exactVersion = /^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)$/;\nconst outputDirectory = \"<consumer-release-pack-output>\";\nconst packerSetupExpression =\n /^npm\\s+install\\s+((?:(?:--global|-g|--ignore-scripts)\\s+)+)(npm|pnpm)@([^\\s]+)$/;\nconst defaultRunShell = (defaults: unknown) => {\n if (!record(defaults) || !record(defaults[\"run\"])) return undefined;\n return defaults[\"run\"][\"shell\"];\n};\n\nexport type ConsumerReleasePack = {\n manager: \"npm\" | \"pnpm\";\n version: string;\n arguments: string[];\n};\n\nconst packArguments = (line: string) => {\n const command = /^(npm|pnpm)\\s+pack(?:\\s+(.*))?$/.exec(line);\n const manager = command?.[1];\n if (manager !== \"npm\" && manager !== \"pnpm\")\n throw new Error(\"Unsupported release pack command\");\n const raw = command?.[2] ?? \"\";\n const tokens = raw.match(/\"[^\"\\n]*\"|'[^'\\n]*'|[^\\s]+/g) ?? [];\n const args: string[] = [];\n let destination = false;\n for (let index = 0; index < tokens.length; index++) {\n const token = tokens.at(index);\n if (token === \"--pack-destination\") {\n if (destination) throw new Error(\"Repeated release pack destination\");\n const value = tokens.at(++index);\n if (\n value === undefined ||\n !/^(?:\"\\$GITHUB_WORKSPACE\\/[A-Za-z0-9_/-]+\"|[A-Za-z0-9_/-]+)$/.test(\n value,\n ) ||\n value.split(\"/\").includes(\"..\")\n )\n throw new Error(\"Unsupported release pack destination\");\n destination = true;\n args.push(token, outputDirectory);\n continue;\n }\n if (\n token !== \"--ignore-scripts\" &&\n !(manager === \"pnpm\" && token === \"--config.ignore-scripts=true\") &&\n token !== \"--json\" &&\n token !== \"--silent\"\n )\n throw new Error(\"Unsupported release pack arguments\");\n if (args.includes(token)) throw new Error(\"Repeated release pack flag\");\n args.push(token);\n }\n if (\n !destination ||\n (!args.includes(\"--ignore-scripts\") &&\n !args.includes(\"--config.ignore-scripts=true\"))\n )\n throw new Error(\n \"Release pack requires scripts disabled and --pack-destination\",\n );\n return { manager, arguments: args } satisfies Pick<\n ConsumerReleasePack,\n \"manager\" | \"arguments\"\n >;\n};\n\ntype ReleaseShellContextOptions = {\n step: Record<string, unknown>;\n kind: \"setup\" | \"pack\";\n location: string;\n inheritedShell: unknown;\n};\n\n/** Both setup provenance and packing require unconditional shell commands. */\nconst assertReleaseShellContext = ({\n step,\n kind,\n location,\n inheritedShell,\n}: ReleaseShellContextOptions) => {\n const run = step[\"run\"];\n if (typeof run !== \"string\")\n throw new Error(`Unsupported release ${kind} shell context: ${location}`);\n const shell = step[\"shell\"] === undefined ? inheritedShell : step[\"shell\"];\n if (shell !== undefined && shell !== \"bash\" && shell !== \"sh\")\n throw new Error(`Unsupported release ${kind} shell context: ${location}`);\n let quote: \"single\" | \"double\" | undefined;\n let code = \"\";\n for (let index = 0; index < run.length; index += 1) {\n const char = run[index];\n if (char === \"\\n\") {\n if (quote !== undefined)\n throw new Error(\n `Unsupported release ${kind} shell context: ${location}`,\n );\n code += \"\\n\";\n continue;\n }\n if (quote !== \"single\" && char === \"\\\\\") {\n if (\n run[index + 1] === \"\\n\" ||\n (run[index + 1] === \"\\r\" && run[index + 2] === \"\\n\")\n )\n throw new Error(\n `Unsupported release ${kind} shell context: ${location}`,\n );\n index += 1;\n code += \" \";\n continue;\n }\n if (\n quote !== \"single\" &&\n (char === \"`\" || (char === \"$\" && run[index + 1] === \"(\"))\n )\n throw new Error(`Unsupported release ${kind} shell context: ${location}`);\n if (quote === \"single\") {\n if (char === \"'\") quote = undefined;\n code += \" \";\n continue;\n }\n if (quote === \"double\") {\n if (char === '\"') quote = undefined;\n code += \" \";\n continue;\n }\n if (char === \"'\") {\n quote = \"single\";\n code += \" \";\n continue;\n }\n if (char === '\"') {\n quote = \"double\";\n code += \" \";\n continue;\n }\n if (char === \"#\" && (index === 0 || /\\s/.test(run[index - 1] ?? \"\"))) {\n while (index + 1 < run.length && run[index + 1] !== \"\\n\") index += 1;\n continue;\n }\n code += char;\n }\n if (\n quote !== undefined ||\n /[;&|<>]/.test(code) ||\n code\n .split(\"\\n\")\n .some((line) =>\n /^\\s*(?:if|then|elif|else|fi|for|do|done|while|until|case|esac|function|select|exit|return|exec|break|continue|trap|eval|source|hash|alias|unalias)\\b/.test(\n line,\n ),\n ) ||\n /(?:^|\\n)\\s*\\.(?:\\s|$)/.test(code) ||\n /(?:^|\\n)\\s*[A-Za-z_]\\w*\\s*\\(\\s*\\)\\s*[{(]/.test(code) ||\n (kind === \"setup\" && /[(){}]/.test(code))\n )\n throw new Error(`Unsupported release ${kind} shell context: ${location}`);\n if (kind !== \"setup\") return;\n for (const line of run.split(\"\\n\")) {\n const command = line.trim();\n if (command === \"\" || command.startsWith(\"#\")) continue;\n if (\n packerSetupExpression.test(command) ||\n /^(?:npm|pnpm)\\s+pack(?:\\s|$)/.test(command) ||\n [\"set -e\", \"set -eu\", \"set -euo pipefail\"].includes(command)\n )\n continue;\n throw new Error(`Unsupported release setup command context: ${location}`);\n }\n};\n\n/** Resolve the repository's release packer without substituting another manager. */\nexport const resolveConsumerReleasePack = (\n files: Record<string, string>,\n): ConsumerReleasePack => {\n const candidates: ConsumerReleasePack[] = [];\n for (const [file, text] of Object.entries(files)) {\n if (githubAutomationFileKind(file) !== \"workflow\") continue;\n const document = parseDocument(text, { uniqueKeys: true, merge: true });\n if (document.errors.length > 0)\n throw new Error(`Invalid release workflow YAML: ${file}`);\n const source: unknown = document.toJS({ maxAliasCount: 100 });\n if (!record(source) || !record(source[\"jobs\"])) continue;\n for (const [jobName, job] of Object.entries(source[\"jobs\"])) {\n if (!record(job) || !Array.isArray(job[\"steps\"])) continue;\n const packsRelease = job[\"steps\"].some(\n (step: unknown) =>\n record(step) &&\n typeof step[\"run\"] === \"string\" &&\n step[\"run\"]\n .split(\"\\n\")\n .some(\n (line) =>\n !line.trimStart().startsWith(\"#\") &&\n /\\b(?:npm|pnpm)\\s+pack\\b/.test(line),\n ),\n );\n if (!packsRelease) continue;\n const jobShell = defaultRunShell(job[\"defaults\"]);\n const inheritedShell =\n jobShell === undefined ? defaultRunShell(source[\"defaults\"]) : jobShell;\n const versions = new Map<string, string[]>();\n let packed: ConsumerReleasePack | undefined;\n for (const step of job[\"steps\"]) {\n if (!record(step)) continue;\n if (\n typeof step[\"uses\"] === \"string\" &&\n step[\"uses\"].startsWith(\"pnpm/action-setup@\")\n ) {\n if (\n step[\"if\"] !== undefined ||\n step[\"continue-on-error\"] !== undefined\n )\n throw new Error(\n `Conditional release packer setup: ${file}:${jobName}`,\n );\n const inputs = step[\"with\"];\n const version = record(inputs) ? inputs[\"version\"] : undefined;\n if (typeof version !== \"string\" || !exactVersion.test(version))\n throw new Error(\n `Release pnpm setup requires an exact version: ${file}:${jobName}`,\n );\n const values = versions.get(\"pnpm\") ?? [];\n values.push(version);\n versions.set(\"pnpm\", values);\n }\n if (typeof step[\"run\"] !== \"string\") continue;\n for (const rawLine of step[\"run\"].split(\"\\n\")) {\n const line = rawLine.trim();\n if (line.startsWith(\"#\")) continue;\n const setupCommand =\n /\\bnpm\\s+(?:install|i)\\b[^\\n]*\\b(?:npm|pnpm)@/.test(line);\n if (setupCommand)\n assertReleaseShellContext({\n step,\n kind: \"setup\",\n location: `${file}:${jobName}`,\n inheritedShell,\n });\n const setup = packerSetupExpression.exec(line);\n if (setupCommand && setup === null)\n throw new Error(\n `Unsupported release packer setup command: ${file}:${jobName}`,\n );\n if (\n setup !== null &&\n /(?:^|\\s)(?:--global|-g)(?:\\s|$)/.test(setup[1] ?? \"\")\n ) {\n if (\n step[\"if\"] !== undefined ||\n step[\"continue-on-error\"] !== undefined\n )\n throw new Error(\n `Conditional release packer setup: ${file}:${jobName}`,\n );\n const manager = setup[2];\n const version = setup[3];\n if (\n manager === undefined ||\n version === undefined ||\n !exactVersion.test(version)\n )\n throw new Error(\n `Release packer setup requires an exact version: ${file}:${jobName}`,\n );\n const values = versions.get(manager) ?? [];\n values.push(version);\n versions.set(manager, values);\n }\n if (!/\\b(?:npm|pnpm)\\s+pack\\b/.test(line)) continue;\n if (\n job[\"if\"] !== undefined ||\n step[\"if\"] !== undefined ||\n step[\"continue-on-error\"] !== undefined ||\n packed !== undefined\n )\n throw new Error(\n `Ambiguous release pack command: ${file}:${jobName}`,\n );\n assertReleaseShellContext({\n step,\n kind: \"pack\",\n location: `${file}:${jobName}`,\n inheritedShell,\n });\n const command = packArguments(line);\n const selected = versions.get(command.manager);\n const version = selected?.at(0);\n if (selected?.length !== 1 || version === undefined)\n throw new Error(\n `Missing or ambiguous exact release packer version: ${file}:${jobName}`,\n );\n packed = {\n manager: command.manager,\n version,\n arguments: command.arguments,\n };\n }\n }\n if (packed !== undefined) candidates.push(packed);\n }\n }\n const selected = candidates.at(0);\n if (candidates.length !== 1 || selected === undefined)\n throw new Error(\"Require exactly one identifiable release pack job\");\n return selected;\n};\n\ntype ConsumerReleasePackArgumentsOptions = {\n packer: ConsumerReleasePack;\n directory: string;\n};\nexport const consumerReleasePackArguments = ({\n packer,\n directory,\n}: ConsumerReleasePackArgumentsOptions) => {\n if (directory.length === 0)\n throw new Error(\"Release pack output directory is required\");\n return [\n \"pack\",\n ...packer.arguments.map((argument) =>\n argument === outputDirectory ? directory : argument,\n ),\n ];\n};\n","import { isDeepStrictEqual } from \"node:util\";\nimport { lte, parse, satisfies } from \"semver\";\n\nimport { consumerNodeSupportMatches } from \"./consumer-node-support\";\n\nexport type PublishTarget =\n | { type: \"javascript\"; targets: readonly string[] }\n | { type: \"types-only\" };\n\ntype ExportTarget =\n | string\n | null\n | ExportTarget[]\n | { [condition: string]: ExportTarget };\n\ntype EntryPoints = {\n type?: \"module\" | \"commonjs\";\n exports?: ExportTarget;\n main?: string;\n module?: string;\n types?: string;\n typings?: string;\n bin?: string | Record<string, string>;\n typesVersions?: Record<string, Record<string, string[]>>;\n};\n\nexport type PublishContract = {\n engines: Record<string, string>;\n peerDependencies: Record<string, string>;\n target: PublishTarget;\n entryPoints: EntryPoints;\n};\n\nexport type ConsumerPolicy = { node: string; typescript: string };\nexport type PublishContractDiagnostic = { field: string; message: string };\n\nconst record = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst object = (value: unknown, field: string) => {\n if (!record(value)) throw new Error(`${field} must be an object`);\n return value;\n};\n\nconst closedKeys = (\n value: Record<string, unknown>,\n allowed: readonly string[],\n field: string,\n) => {\n for (const key of Object.keys(value))\n if (!allowed.includes(key))\n throw new Error(`${field}.${key} is unsupported`);\n};\n\nconst text = (value: unknown, field: string) => {\n if (typeof value !== \"string\" || value.trim() === \"\")\n throw new Error(`${field} must be a nonempty string`);\n return value;\n};\n\nconst stringMap = (value: unknown, field: string) => {\n const result = new Map<string, string>();\n for (const [key, entry] of Object.entries(object(value, field)))\n result.set(text(key, field), text(entry, `${field}.${key}`));\n return Object.fromEntries(result);\n};\n\nconst exportTarget = (value: unknown, field: string): ExportTarget => {\n if (value === null) return null;\n if (typeof value === \"string\") return text(value, field);\n if (Array.isArray(value))\n return value.map((entry: unknown, index) =>\n exportTarget(entry, `${field}[${index}]`),\n );\n const result = new Map<string, ExportTarget>();\n for (const [key, entry] of Object.entries(object(value, field)))\n result.set(text(key, field), exportTarget(entry, `${field}.${key}`));\n return Object.fromEntries(result);\n};\n\nconst typesVersions = (value: unknown) => {\n const result = new Map<string, Record<string, string[]>>();\n for (const [range, paths] of Object.entries(object(value, \"typesVersions\"))) {\n const mappings = new Map<string, string[]>();\n for (const [pattern, entries] of Object.entries(\n object(paths, `typesVersions.${range}`),\n )) {\n if (!Array.isArray(entries))\n throw new Error(`typesVersions.${range}.${pattern} must be an array`);\n mappings.set(\n text(pattern, \"typesVersions pattern\"),\n entries.map((entry: unknown) => text(entry, \"typesVersions path\")),\n );\n }\n result.set(\n text(range, \"typesVersions range\"),\n Object.fromEntries(mappings),\n );\n }\n return Object.fromEntries(result);\n};\n\nconst entryPointKeys = [\n \"type\",\n \"exports\",\n \"main\",\n \"module\",\n \"types\",\n \"typings\",\n \"bin\",\n \"typesVersions\",\n] as const;\n\nexport const publishConfigOverrideKeys = entryPointKeys.filter(\n (key) => key !== \"type\",\n);\n\nconst entryPoints = (value: unknown): EntryPoints => {\n const source = object(value, \"entryPoints\");\n closedKeys(source, entryPointKeys, \"entryPoints\");\n const result: EntryPoints = {};\n if (\"type\" in source) {\n if (source[\"type\"] !== \"module\" && source[\"type\"] !== \"commonjs\")\n throw new Error(\"entryPoints.type must be module or commonjs\");\n result.type = source[\"type\"];\n }\n if (\"exports\" in source)\n result.exports = exportTarget(source[\"exports\"], \"entryPoints.exports\");\n for (const key of [\"main\", \"module\", \"types\", \"typings\"] as const)\n if (key in source) result[key] = text(source[key], `entryPoints.${key}`);\n if (\"bin\" in source)\n result.bin =\n typeof source[\"bin\"] === \"string\"\n ? text(source[\"bin\"], \"entryPoints.bin\")\n : stringMap(source[\"bin\"], \"entryPoints.bin\");\n if (\"typesVersions\" in source)\n result.typesVersions = typesVersions(source[\"typesVersions\"]);\n return result;\n};\n\nconst publishTarget = (value: unknown): PublishTarget => {\n const source = object(value, \"target\");\n if (source[\"type\"] === \"types-only\") {\n closedKeys(source, [\"type\"], \"target\");\n return { type: \"types-only\" };\n }\n if (source[\"type\"] !== \"javascript\")\n throw new Error(\"target.type must be javascript or types-only\");\n closedKeys(source, [\"type\", \"targets\"], \"target\");\n if (!Array.isArray(source[\"targets\"]) || source[\"targets\"].length === 0)\n throw new Error(\"target.targets must be a nonempty array\");\n const targets = Array.from(source[\"targets\"]).map((entry: unknown) => {\n const target = text(entry, \"target.targets\");\n if (\n /[\\s,]/.test(target) ||\n Array.from(target).some(\n (character) =>\n character.charCodeAt(0) < 32 || character.charCodeAt(0) === 127,\n )\n )\n throw new Error(\n \"target.targets must contain resolved target identifiers\",\n );\n return target;\n });\n return { type: \"javascript\", targets: [...new Set(targets)].sort() };\n};\n\nexport const parsePublishContract = (value: unknown): PublishContract => {\n const source = object(value, \"publish contract\");\n closedKeys(\n source,\n [\"engines\", \"peerDependencies\", \"target\", \"entryPoints\"],\n \"publish contract\",\n );\n return {\n engines: stringMap(source[\"engines\"], \"engines\"),\n peerDependencies: stringMap(source[\"peerDependencies\"], \"peerDependencies\"),\n target: publishTarget(source[\"target\"]),\n entryPoints: entryPoints(source[\"entryPoints\"]),\n };\n};\n\nconst publishPackers = [\"npm\", \"pnpm\"] as const;\nexport type PublishPacker = (typeof publishPackers)[number];\n\ntype ResolveManifestContractOptions = {\n packer: PublishPacker;\n manifest: unknown;\n target: PublishTarget;\n};\n\nexport const resolveManifestContract = ({\n packer,\n manifest,\n target,\n}: ResolveManifestContractOptions): PublishContract => {\n if (!publishPackers.includes(packer))\n throw new Error(\"publish packer must be npm or pnpm\");\n const source = object(manifest, \"package manifest\");\n const config =\n \"publishConfig\" in source\n ? object(source[\"publishConfig\"], \"publishConfig\")\n : {};\n closedKeys(\n config,\n [...publishConfigOverrideKeys, \"access\", \"registry\"],\n \"publishConfig\",\n );\n if (packer === \"npm\")\n for (const key of publishConfigOverrideKeys)\n if (\n Object.hasOwn(config, key) &&\n !(key === \"exports\" || key === \"typesVersions\"\n ? JSON.stringify(config[key]) === JSON.stringify(source[key])\n : isDeepStrictEqual(config[key], source[key]))\n )\n throw new Error(\n `npm pack does not apply differing publishConfig.${key}; move the published entry to package.json or use pnpm`,\n );\n for (const field of [\"browser\", \"esnext\", \"es2015\", \"unpkg\", \"umd:main\"])\n if (Object.hasOwn(source, field) || Object.hasOwn(config, field))\n throw new Error(`published entry field ${field} is unsupported`);\n const published: Record<string, unknown> = {};\n for (const key of entryPointKeys) {\n if (packer === \"pnpm\" && key !== \"type\" && key in config)\n published[key] = config[key];\n else if (key in source) published[key] = source[key];\n }\n if (typeof published[\"bin\"] === \"string\") {\n const name = text(source[\"name\"], \"package name for bin\");\n const command = name.split(\"/\").at(-1);\n if (command === undefined || command === \"\")\n throw new Error(\"package name must determine its bin command\");\n published[\"bin\"] = { [command]: published[\"bin\"] };\n }\n let engines: unknown = {};\n if (Object.hasOwn(source, \"engines\")) engines = source[\"engines\"];\n return parsePublishContract({\n engines,\n peerDependencies: Object.hasOwn(source, \"peerDependencies\")\n ? source[\"peerDependencies\"]\n : {},\n target,\n entryPoints: published,\n });\n};\n\nconst consumerPolicy = (policy: ConsumerPolicy) => {\n closedKeys(\n object(policy, \"consumer policy\"),\n [\"node\", \"typescript\"],\n \"consumer policy\",\n );\n for (const [field, major] of [\n [\"node\", 22],\n [\"typescript\", 6],\n ] as const) {\n const version = parse(policy[field]);\n if (\n version === null ||\n version.version !== policy[field] ||\n version.major !== major ||\n version.prerelease.length !== 0\n )\n throw new Error(\n `consumer policy ${field} must pin an exact stable ${major}.x release`,\n );\n }\n};\n\ntype CheckPublishContractOptions = ResolveManifestContractOptions & {\n contract: unknown;\n policy: ConsumerPolicy;\n};\n\n/** Share the accepted Node target grammar between static and packed checks. */\nexport const publishedNodeTargetSupportsConsumer = ({\n target,\n node,\n}: {\n target: string;\n node: string;\n}) => {\n const match = /^node([1-9]\\d*)(?:\\.(0|[1-9]\\d*))?(?:\\.(0|[1-9]\\d*))?$/i.exec(\n target,\n );\n const version =\n match === null\n ? null\n : parse(`${match[1]}.${match[2] ?? \"0\"}.${match[3] ?? \"0\"}`);\n return version !== null && lte(version, node);\n};\n\nexport const checkPublishContract = ({\n packer,\n manifest,\n target,\n contract,\n policy,\n}: CheckPublishContractOptions) => {\n consumerPolicy(policy);\n const current = resolveManifestContract({ packer, manifest, target });\n const committed = parsePublishContract(contract);\n const diagnostics: PublishContractDiagnostic[] = [];\n const add = (field: string, message: string) =>\n diagnostics.push({ field, message });\n const compare = (field: string, expected: unknown, actual: unknown) => {\n if (\n field !== \"entryPoints.exports\" &&\n field !== \"entryPoints.typesVersions\" &&\n record(expected) &&\n record(actual)\n ) {\n for (const key of new Set([\n ...Object.keys(expected),\n ...Object.keys(actual),\n ]))\n compare(\n `${field}.${key}`,\n Object.hasOwn(expected, key) ? expected[key] : undefined,\n Object.hasOwn(actual, key) ? actual[key] : undefined,\n );\n return;\n }\n if (JSON.stringify(expected) !== JSON.stringify(actual))\n add(field, `published ${field} differs from the committed contract`);\n };\n for (const field of [\n \"engines\",\n \"peerDependencies\",\n \"target\",\n \"entryPoints\",\n ] as const)\n compare(field, committed[field], current[field]);\n const support = (\n field: string,\n range: string | undefined,\n version: string,\n ) => {\n if (range !== undefined && !satisfies(version, range))\n add(field, `${field} must support consumer version ${version}`);\n };\n if (\n !consumerNodeSupportMatches({\n range: current.engines[\"node\"],\n node: policy.node,\n })\n )\n add(\n \"engines.node\",\n `engines.node must support consumer version ${policy.node}`,\n );\n support(\n \"engines.typescript\",\n current.engines[\"typescript\"],\n policy.typescript,\n );\n support(\n \"peerDependencies.typescript\",\n current.peerDependencies[\"typescript\"],\n policy.typescript,\n );\n if (\"bun\" in current.engines)\n add(\"engines.bun\", \"published packages must not require Bun\");\n for (const peer of [\"bun\", \"bun-types\", \"@types/bun\", \"@typescript/native\"])\n if (Object.hasOwn(current.peerDependencies, peer))\n add(\n `peerDependencies.${peer}`,\n \"published packages must not require development runtime or compiler packages\",\n );\n if (current.target.type === \"javascript\")\n for (const selected of current.target.targets) {\n if (/^bun(?:$|[0-9])/i.test(selected)) {\n add(\"target\", \"published JavaScript must not require Bun\");\n continue;\n }\n if (!/^node/i.test(selected)) continue;\n if (\n !publishedNodeTargetSupportsConsumer({\n target: selected,\n node: policy.node,\n })\n )\n add(\n \"target\",\n `JavaScript target ${selected} must support consumer Node ${policy.node}`,\n );\n }\n return diagnostics;\n};\n"],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ //#region \0rolldown/runtime.js
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __copyProps = (to, from, except, desc) => {
9
+ if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
10
+ key = keys[i];
11
+ if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
12
+ get: ((k) => from[k]).bind(null, key),
13
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
14
+ });
15
+ }
16
+ return to;
17
+ };
18
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
19
+ value: mod,
20
+ enumerable: true
21
+ }) : target, mod));
22
+ //#endregion
23
+ Object.defineProperty(exports, "__toESM", {
24
+ enumerable: true,
25
+ get: function() {
26
+ return __toESM;
27
+ }
28
+ });
@@ -0,0 +1,34 @@
1
+ #!/usr/bin/env node
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const require_toolchain_changed = require("./toolchain-changed.cjs");
4
+ //#region src/toolchain-changed-args.ts
5
+ const changedUsage = "Usage: stll-toolchain-changed --since <git-ref>\n stll-toolchain-changed --help";
6
+ const parseChangedArguments = (args) => {
7
+ if (args.length === 1 && args.at(0) === "--help") return { mode: "help" };
8
+ const since = args.at(1);
9
+ if (args.length !== 2 || args.at(0) !== "--since" || since === void 0 || since.trim() === "" || since.startsWith("-")) throw new Error(changedUsage);
10
+ return {
11
+ mode: "compare",
12
+ since
13
+ };
14
+ };
15
+ //#endregion
16
+ //#region src/toolchain-changed-cli.ts
17
+ const main = async () => {
18
+ const args = parseChangedArguments(process.argv.slice(2));
19
+ if (args.mode === "help") {
20
+ process.stdout.write(`${changedUsage}\n`);
21
+ return;
22
+ }
23
+ process.stdout.write(`${JSON.stringify(await require_toolchain_changed.detectToolchainChanges({
24
+ repo: process.cwd(),
25
+ since: args.since
26
+ }))}\n`);
27
+ };
28
+ main().catch((error) => {
29
+ process.stderr.write(`toolchain-changed: ${error instanceof Error ? error.message : String(error)}\n`);
30
+ process.exitCode = 1;
31
+ });
32
+ //#endregion
33
+
34
+ //# sourceMappingURL=toolchain-changed-cli.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolchain-changed-cli.cjs","names":["detectToolchainChanges"],"sources":["../src/toolchain-changed-args.ts","../src/toolchain-changed-cli.ts"],"sourcesContent":["export const changedUsage =\n \"Usage: stll-toolchain-changed --since <git-ref>\\n stll-toolchain-changed --help\";\n\nexport const parseChangedArguments = (args: readonly string[]) => {\n if (args.length === 1 && args.at(0) === \"--help\")\n return { mode: \"help\" } as const;\n const since = args.at(1);\n if (\n args.length !== 2 ||\n args.at(0) !== \"--since\" ||\n since === undefined ||\n since.trim() === \"\" ||\n since.startsWith(\"-\")\n )\n throw new Error(changedUsage);\n return { mode: \"compare\", since } as const;\n};\n","#!/usr/bin/env node\nimport { detectToolchainChanges } from \"./toolchain-changed\";\nimport { changedUsage, parseChangedArguments } from \"./toolchain-changed-args\";\n\nconst main = async () => {\n const args = parseChangedArguments(process.argv.slice(2));\n if (args.mode === \"help\") {\n process.stdout.write(`${changedUsage}\\n`);\n return;\n }\n // Unreadable history is a successful, fail-safe changed=true detector result.\n process.stdout.write(\n `${JSON.stringify(await detectToolchainChanges({ repo: process.cwd(), since: args.since }))}\\n`,\n );\n};\n\nmain().catch((error: unknown) => {\n process.stderr.write(\n `toolchain-changed: ${error instanceof Error ? error.message : String(error)}\\n`,\n );\n process.exitCode = 1;\n});\n"],"mappings":";;;;AAAA,MAAa,eACX;AAEF,MAAa,yBAAyB,SAA4B;CAChE,IAAI,KAAK,WAAW,KAAK,KAAK,GAAG,CAAC,MAAM,UACtC,OAAO,EAAE,MAAM,OAAO;CACxB,MAAM,QAAQ,KAAK,GAAG,CAAC;CACvB,IACE,KAAK,WAAW,KAChB,KAAK,GAAG,CAAC,MAAM,aACf,UAAU,KAAA,KACV,MAAM,KAAK,MAAM,MACjB,MAAM,WAAW,GAAG,GAEpB,MAAM,IAAI,MAAM,YAAY;CAC9B,OAAO;EAAE,MAAM;EAAW;CAAM;AAClC;;;ACZA,MAAM,OAAO,YAAY;CACvB,MAAM,OAAO,sBAAsB,QAAQ,KAAK,MAAM,CAAC,CAAC;CACxD,IAAI,KAAK,SAAS,QAAQ;EACxB,QAAQ,OAAO,MAAM,GAAG,aAAa,GAAG;EACxC;CACF;CAEA,QAAQ,OAAO,MACb,GAAG,KAAK,UAAU,MAAMA,0BAAAA,uBAAuB;EAAE,MAAM,QAAQ,IAAI;EAAG,OAAO,KAAK;CAAM,CAAC,CAAC,EAAE,GAC9F;AACF;AAEA,KAAK,CAAC,CAAC,OAAO,UAAmB;CAC/B,QAAQ,OAAO,MACb,sBAAsB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE,GAC/E;CACA,QAAQ,WAAW;AACrB,CAAC"}
@@ -0,0 +1 @@
1
+ export {}
@@ -0,0 +1 @@
1
+ export {}
@@ -0,0 +1,34 @@
1
+ #!/usr/bin/env node
2
+ import { t as detectToolchainChanges } from "./toolchain-changed.mjs";
3
+ //#region src/toolchain-changed-args.ts
4
+ const changedUsage = "Usage: stll-toolchain-changed --since <git-ref>\n stll-toolchain-changed --help";
5
+ const parseChangedArguments = (args) => {
6
+ if (args.length === 1 && args.at(0) === "--help") return { mode: "help" };
7
+ const since = args.at(1);
8
+ if (args.length !== 2 || args.at(0) !== "--since" || since === void 0 || since.trim() === "" || since.startsWith("-")) throw new Error(changedUsage);
9
+ return {
10
+ mode: "compare",
11
+ since
12
+ };
13
+ };
14
+ //#endregion
15
+ //#region src/toolchain-changed-cli.ts
16
+ const main = async () => {
17
+ const args = parseChangedArguments(process.argv.slice(2));
18
+ if (args.mode === "help") {
19
+ process.stdout.write(`${changedUsage}\n`);
20
+ return;
21
+ }
22
+ process.stdout.write(`${JSON.stringify(await detectToolchainChanges({
23
+ repo: process.cwd(),
24
+ since: args.since
25
+ }))}\n`);
26
+ };
27
+ main().catch((error) => {
28
+ process.stderr.write(`toolchain-changed: ${error instanceof Error ? error.message : String(error)}\n`);
29
+ process.exitCode = 1;
30
+ });
31
+ //#endregion
32
+ export {};
33
+
34
+ //# sourceMappingURL=toolchain-changed-cli.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolchain-changed-cli.mjs","names":[],"sources":["../src/toolchain-changed-args.ts","../src/toolchain-changed-cli.ts"],"sourcesContent":["export const changedUsage =\n \"Usage: stll-toolchain-changed --since <git-ref>\\n stll-toolchain-changed --help\";\n\nexport const parseChangedArguments = (args: readonly string[]) => {\n if (args.length === 1 && args.at(0) === \"--help\")\n return { mode: \"help\" } as const;\n const since = args.at(1);\n if (\n args.length !== 2 ||\n args.at(0) !== \"--since\" ||\n since === undefined ||\n since.trim() === \"\" ||\n since.startsWith(\"-\")\n )\n throw new Error(changedUsage);\n return { mode: \"compare\", since } as const;\n};\n","#!/usr/bin/env node\nimport { detectToolchainChanges } from \"./toolchain-changed\";\nimport { changedUsage, parseChangedArguments } from \"./toolchain-changed-args\";\n\nconst main = async () => {\n const args = parseChangedArguments(process.argv.slice(2));\n if (args.mode === \"help\") {\n process.stdout.write(`${changedUsage}\\n`);\n return;\n }\n // Unreadable history is a successful, fail-safe changed=true detector result.\n process.stdout.write(\n `${JSON.stringify(await detectToolchainChanges({ repo: process.cwd(), since: args.since }))}\\n`,\n );\n};\n\nmain().catch((error: unknown) => {\n process.stderr.write(\n `toolchain-changed: ${error instanceof Error ? error.message : String(error)}\\n`,\n );\n process.exitCode = 1;\n});\n"],"mappings":";;;AAAA,MAAa,eACX;AAEF,MAAa,yBAAyB,SAA4B;CAChE,IAAI,KAAK,WAAW,KAAK,KAAK,GAAG,CAAC,MAAM,UACtC,OAAO,EAAE,MAAM,OAAO;CACxB,MAAM,QAAQ,KAAK,GAAG,CAAC;CACvB,IACE,KAAK,WAAW,KAChB,KAAK,GAAG,CAAC,MAAM,aACf,UAAU,KAAA,KACV,MAAM,KAAK,MAAM,MACjB,MAAM,WAAW,GAAG,GAEpB,MAAM,IAAI,MAAM,YAAY;CAC9B,OAAO;EAAE,MAAM;EAAW;CAAM;AAClC;;;ACZA,MAAM,OAAO,YAAY;CACvB,MAAM,OAAO,sBAAsB,QAAQ,KAAK,MAAM,CAAC,CAAC;CACxD,IAAI,KAAK,SAAS,QAAQ;EACxB,QAAQ,OAAO,MAAM,GAAG,aAAa,GAAG;EACxC;CACF;CAEA,QAAQ,OAAO,MACb,GAAG,KAAK,UAAU,MAAM,uBAAuB;EAAE,MAAM,QAAQ,IAAI;EAAG,OAAO,KAAK;CAAM,CAAC,CAAC,EAAE,GAC9F;AACF;AAEA,KAAK,CAAC,CAAC,OAAO,UAAmB;CAC/B,QAAQ,OAAO,MACb,sBAAsB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE,GAC/E;CACA,QAAQ,WAAW;AACrB,CAAC"}