@warlock.js/core 5.33.0 → 5.34.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 (120) hide show
  1. package/CHANGELOG.md +36 -46
  2. package/esm/cli/commands/check/check-command.action.mjs +2 -1
  3. package/esm/cli/commands/check/check-command.action.mjs.map +1 -1
  4. package/esm/cli/commands/check.command.mjs +2 -2
  5. package/esm/cli/commands/check.command.mjs.map +1 -1
  6. package/esm/cli/commands/e2e.command.mjs +63 -0
  7. package/esm/cli/commands/e2e.command.mjs.map +1 -0
  8. package/esm/cli/commands/load-e2e-spec.mjs +47 -0
  9. package/esm/cli/commands/load-e2e-spec.mjs.map +1 -0
  10. package/esm/cli/framework-cli-commands.mjs +2 -0
  11. package/esm/cli/framework-cli-commands.mjs.map +1 -1
  12. package/esm/dev-server/health-checker/checkers/oxlint-health-checker.mjs +1 -1
  13. package/esm/dev-server/health-checker/default-health-checkers.mjs +1 -6
  14. package/esm/dev-server/health-checker/default-health-checkers.mjs.map +1 -1
  15. package/esm/dev-server/health-checker/file-health-checker.contract.d.mts +0 -2
  16. package/esm/dev-server/health-checker/file-health-checker.contract.d.mts.map +1 -1
  17. package/esm/dev-server/health-checker/file-health-result.d.mts +1 -1
  18. package/esm/dev-server/health-checker/file-health-result.mjs.map +1 -1
  19. package/esm/e2e/browser.d.mts +4 -0
  20. package/esm/e2e/browser.d.mts.map +1 -0
  21. package/esm/e2e/browser.mjs +88 -0
  22. package/esm/e2e/browser.mjs.map +1 -0
  23. package/esm/e2e/cdp.d.mts +152 -0
  24. package/esm/e2e/cdp.d.mts.map +1 -0
  25. package/esm/e2e/cdp.mjs +106 -0
  26. package/esm/e2e/cdp.mjs.map +1 -0
  27. package/esm/e2e/fixture.mjs +195 -0
  28. package/esm/e2e/fixture.mjs.map +1 -0
  29. package/esm/e2e/index.d.mts +5 -0
  30. package/esm/e2e/index.mjs +6 -0
  31. package/esm/e2e/owned-process.mjs +193 -0
  32. package/esm/e2e/owned-process.mjs.map +1 -0
  33. package/esm/e2e/page.d.mts +64 -0
  34. package/esm/e2e/page.d.mts.map +1 -0
  35. package/esm/e2e/page.mjs +376 -0
  36. package/esm/e2e/page.mjs.map +1 -0
  37. package/esm/e2e/run-e2e.d.mts +17 -0
  38. package/esm/e2e/run-e2e.d.mts.map +1 -0
  39. package/esm/e2e/run-e2e.mjs +143 -0
  40. package/esm/e2e/run-e2e.mjs.map +1 -0
  41. package/esm/e2e/types.d.mts +123 -0
  42. package/esm/e2e/types.d.mts.map +1 -0
  43. package/esm/e2e/types.mjs +24 -0
  44. package/esm/e2e/types.mjs.map +1 -0
  45. package/esm/generations/features/web.feature.mjs +7 -4
  46. package/esm/generations/features/web.feature.mjs.map +1 -1
  47. package/esm/generations/stubs.mjs +18 -35
  48. package/esm/generations/stubs.mjs.map +1 -1
  49. package/esm/index.d.mts +2 -2
  50. package/esm/secrets/errors.d.mts +1 -1
  51. package/esm/secrets/errors.d.mts.map +1 -1
  52. package/esm/secrets/errors.mjs +2 -0
  53. package/esm/secrets/errors.mjs.map +1 -1
  54. package/esm/secrets/file-backend.mjs +1 -0
  55. package/esm/secrets/file-backend.mjs.map +1 -1
  56. package/esm/secrets/index.d.mts +2 -2
  57. package/esm/secrets/keyring-backend.mjs +1 -0
  58. package/esm/secrets/keyring-backend.mjs.map +1 -1
  59. package/esm/secrets/memory-backend.d.mts +1 -0
  60. package/esm/secrets/memory-backend.d.mts.map +1 -1
  61. package/esm/secrets/memory-backend.mjs +1 -0
  62. package/esm/secrets/memory-backend.mjs.map +1 -1
  63. package/esm/secrets/resolve-driver.mjs +14 -0
  64. package/esm/secrets/resolve-driver.mjs.map +1 -0
  65. package/esm/secrets/secret-store.d.mts +4 -2
  66. package/esm/secrets/secret-store.d.mts.map +1 -1
  67. package/esm/secrets/secret-store.mjs +22 -8
  68. package/esm/secrets/secret-store.mjs.map +1 -1
  69. package/esm/secrets/secrets.d.mts +2 -0
  70. package/esm/secrets/secrets.d.mts.map +1 -1
  71. package/esm/secrets/secrets.mjs +13 -1
  72. package/esm/secrets/secrets.mjs.map +1 -1
  73. package/esm/secrets/types.d.mts +8 -0
  74. package/esm/secrets/types.d.mts.map +1 -1
  75. package/esm/tooling/check/lint-step.d.mts +3 -3
  76. package/esm/tooling/check/lint-step.d.mts.map +1 -1
  77. package/esm/tooling/check/lint-step.mjs +3 -47
  78. package/esm/tooling/check/lint-step.mjs.map +1 -1
  79. package/esm/tooling/check/run-check.d.mts +2 -2
  80. package/esm/tooling/check/run-check.mjs +4 -2
  81. package/esm/tooling/check/run-check.mjs.map +1 -1
  82. package/esm/tooling/problem.d.mts +1 -1
  83. package/esm/tooling/problem.d.mts.map +1 -1
  84. package/esm/tooling/problem.mjs.map +1 -1
  85. package/esm/updater/package-manager.mjs +5 -1
  86. package/esm/updater/package-manager.mjs.map +1 -1
  87. package/esm/upgrade/codemods/index.mjs +2 -1
  88. package/esm/upgrade/codemods/index.mjs.map +1 -1
  89. package/esm/upgrade/codemods/oxc-toolchain.mjs +59 -10
  90. package/esm/upgrade/codemods/oxc-toolchain.mjs.map +1 -1
  91. package/esm/upgrade/codemods/oxlint-rule-schemas.mjs +6 -0
  92. package/esm/upgrade/codemods/oxlint-rule-schemas.mjs.map +1 -0
  93. package/esm/upgrade/codemods/port-eslint-rules.mjs +343 -0
  94. package/esm/upgrade/codemods/port-eslint-rules.mjs.map +1 -0
  95. package/esm/upgrade/codemods/toolchain-templates.mjs +1 -1
  96. package/esm/upgrade/codemods/toolchain-templates.mjs.map +1 -1
  97. package/esm/upgrade/codemods/validate-oxlint-rule.mjs +60 -0
  98. package/esm/upgrade/codemods/validate-oxlint-rule.mjs.map +1 -0
  99. package/esm/upgrade/notes.mjs +14 -7
  100. package/esm/upgrade/notes.mjs.map +1 -1
  101. package/esm/warlock-config/types.d.mts +0 -1
  102. package/esm/warlock-config/types.d.mts.map +1 -1
  103. package/llms-full.txt +269 -44
  104. package/llms.txt +4 -3
  105. package/package.json +19 -20
  106. package/skills/create-module/SKILL.md +2 -2
  107. package/skills/run-app/SKILL.md +3 -3
  108. package/skills/store-secrets/SKILL.md +60 -2
  109. package/skills/test-browser/SKILL.md +119 -0
  110. package/skills/upgrade-from-5-29/SKILL.md +70 -29
  111. package/skills/warlock-check/SKILL.md +3 -3
  112. package/skills/warlock-doctor/SKILL.md +2 -3
  113. package/skills/write-cli-command/SKILL.md +6 -2
  114. package/esm/dev-server/health-checker/checkers/eslint-health-checker.mjs +0 -152
  115. package/esm/dev-server/health-checker/checkers/eslint-health-checker.mjs.map +0 -1
  116. package/esm/dev-server/health-checker/eslint-support.mjs +0 -27
  117. package/esm/dev-server/health-checker/eslint-support.mjs.map +0 -1
  118. package/esm/dev-server/health-checker/workers/eslint-health.worker.d.mts +0 -1
  119. package/esm/dev-server/health-checker/workers/eslint-health.worker.mjs +0 -183
  120. package/esm/dev-server/health-checker/workers/eslint-health.worker.mjs.map +0 -1
@@ -0,0 +1,343 @@
1
+ import { isRecord, matchesSchema } from "./validate-oxlint-rule.mjs";
2
+ import { OXLINT_RULE_SCHEMAS } from "./oxlint-rule-schemas.mjs";
3
+
4
+ //#region ../../packages/core/src/upgrade/codemods/port-eslint-rules.ts
5
+ const CHANGE = {
6
+ line: 1,
7
+ description: "Port custom ESLint rules to native Oxlint rules and overrides"
8
+ };
9
+ /** Parse literals, never import/execute an application's executable configuration. */
10
+ function portEslintRules(context, output, file, source, preserveExisting = true, configKey) {
11
+ const { Node, SyntaxKind } = context.tsMorph;
12
+ const project = new context.tsMorph.Project({ useInMemoryFileSystem: true });
13
+ const json = file.endsWith(".json") || file === ".eslintrc";
14
+ const parsed = project.createSourceFile(`${file}.ts`, json ? `export default ${source};` : source);
15
+ let config;
16
+ const existing = context.text.read(".oxlintrc.json");
17
+ try {
18
+ const value = JSON.parse(existing ?? "{}");
19
+ if (!isRecord(value)) throw new Error("Config must be an object");
20
+ config = value;
21
+ } catch {
22
+ output.manual.push({
23
+ file,
24
+ line: 1,
25
+ hint: "Cannot merge rules into the existing .oxlintrc.json; review its JSON before porting this config. ESLint support is gone in 5.34.0."
26
+ });
27
+ return false;
28
+ }
29
+ const protectedRules = isRecord(config.rules) ? { ...config.rules } : {};
30
+ const protectedOverrides = Array.isArray(config.overrides) ? [...config.overrides] : [];
31
+ let changed = false;
32
+ let typeAware = false;
33
+ const finding = (node, rule, scope, reason) => {
34
+ output.manual.push({
35
+ file,
36
+ line: node.getStartLineNumber(),
37
+ hint: `Port ${rule} for files ${scope}: ${reason}. ESLint support is gone in 5.34.0.`
38
+ });
39
+ };
40
+ const resolve = (node, seen = /* @__PURE__ */ new Set()) => {
41
+ if (Node.isParenthesizedExpression(node) || Node.isAsExpression(node) || Node.isSatisfiesExpression(node)) return resolve(node.getExpression(), seen);
42
+ if (Node.isPropertyAccessExpression(node)) {
43
+ const marker = `property:${node.getText()}`;
44
+ if (seen.has(marker)) throw new Error("cyclic config property");
45
+ const next = /* @__PURE__ */ new Set([...seen, marker]);
46
+ const object = resolve(node.getExpression(), next);
47
+ if (Node.isObjectLiteralExpression(object)) {
48
+ const value = property(object, node.getName());
49
+ if (value) return resolve(value, next);
50
+ }
51
+ }
52
+ if (Node.isIdentifier(node)) {
53
+ const name = node.getText();
54
+ if (seen.has(name)) throw new Error(`cyclic config constant ${name}`);
55
+ const value = parsed.getVariableDeclaration(name)?.getInitializer();
56
+ if (value) return resolve(value, /* @__PURE__ */ new Set([...seen, name]));
57
+ }
58
+ return node;
59
+ };
60
+ const literal = (input, depth = 0) => {
61
+ if (depth > 30) throw new Error("cyclic or deeply nested config value");
62
+ const node = resolve(input);
63
+ if (Node.isStringLiteral(node) || Node.isNoSubstitutionTemplateLiteral(node) || Node.isNumericLiteral(node)) return node.getLiteralValue();
64
+ if (node.getKind() === SyntaxKind.TrueKeyword) return true;
65
+ if (node.getKind() === SyntaxKind.FalseKeyword) return false;
66
+ if (node.getKind() === SyntaxKind.NullKeyword) return null;
67
+ if (Node.isPrefixUnaryExpression(node) && node.getOperatorToken() === SyntaxKind.MinusToken) {
68
+ const value = literal(node.getOperand(), depth + 1);
69
+ if (typeof value === "number") return -value;
70
+ }
71
+ if (Node.isArrayLiteralExpression(node)) return node.getElements().flatMap((entry) => {
72
+ if (Node.isSpreadElement(entry)) {
73
+ const value = literal(entry.getExpression(), depth + 1);
74
+ if (!Array.isArray(value)) throw new Error("computed array spread");
75
+ return value;
76
+ }
77
+ return [literal(entry, depth + 1)];
78
+ });
79
+ if (Node.isObjectLiteralExpression(node)) {
80
+ const value = {};
81
+ for (const entry of node.getProperties()) if (Node.isSpreadAssignment(entry)) {
82
+ const spread = literal(entry.getExpression(), depth + 1);
83
+ if (!isRecord(spread)) throw new Error("computed object spread");
84
+ Object.assign(value, spread);
85
+ } else if (Node.isPropertyAssignment(entry)) {
86
+ const key = entry.getNameNode();
87
+ if (Node.isComputedPropertyName(key)) throw new Error("computed property name");
88
+ value[Node.isStringLiteral(key) ? key.getLiteralValue() : key.getText()] = literal(entry.getInitializerOrThrow(), depth + 1);
89
+ } else throw new Error("computed object member");
90
+ return value;
91
+ }
92
+ throw new Error(`nonliteral expression ${node.getText()}`);
93
+ };
94
+ const property = (block, name) => {
95
+ for (const member of block.getProperties()) {
96
+ if (Node.isShorthandPropertyAssignment(member) && member.getName() === name) return member.getNameNode();
97
+ if (!Node.isPropertyAssignment(member)) continue;
98
+ const key = member.getNameNode();
99
+ if ((Node.isStringLiteral(key) ? key.getLiteralValue() : key.getText()) === name) return member.getInitializer();
100
+ }
101
+ };
102
+ const strings = (node) => {
103
+ if (!node) return void 0;
104
+ const value = literal(node);
105
+ if (typeof value === "string") return [value];
106
+ if (Array.isArray(value) && value.every((entry) => typeof entry === "string")) return value;
107
+ throw new Error("file patterns must be literal strings");
108
+ };
109
+ const severityOf = (value) => value === 0 || value === "off" ? "off" : value === 1 || value === "warn" ? "warn" : value === 2 || value === "error" ? "error" : void 0;
110
+ const mergeRules = (input, rules, scope, depth = 0, state = {}) => {
111
+ if (depth > 30) {
112
+ finding(input, "rules", scope, "cyclic or deeply nested rule spread");
113
+ return;
114
+ }
115
+ let node;
116
+ try {
117
+ node = resolve(input);
118
+ } catch {
119
+ finding(input, "rules", scope, "cyclic config constant");
120
+ return;
121
+ }
122
+ if (!Node.isObjectLiteralExpression(node)) {
123
+ finding(input, "rules", scope, "the rules object is computed or imported");
124
+ return;
125
+ }
126
+ for (const entry of node.getProperties()) {
127
+ if (Node.isSpreadAssignment(entry)) {
128
+ if (!(entry.getExpression().getText() === "prettierConfig.rules" && parsed.getImportDeclarations().some((declaration) => declaration.getModuleSpecifierValue() === "eslint-config-prettier" && declaration.getDefaultImport()?.getText() === "prettierConfig"))) mergeRules(entry.getExpression(), rules, scope, depth + 1, state);
129
+ continue;
130
+ }
131
+ if (!Node.isPropertyAssignment(entry)) {
132
+ finding(entry, entry.getText(), scope, "computed rule declaration");
133
+ continue;
134
+ }
135
+ const nameNode = entry.getNameNode();
136
+ const name = Node.isStringLiteral(nameNode) ? nameNode.getLiteralValue() : nameNode.getText();
137
+ if (name === "prettier/prettier") continue;
138
+ let target = name.replace(/^@typescript-eslint\//, "typescript/").replace(/^eslint\//, "");
139
+ if (target.startsWith("typescript/") && !(target in OXLINT_RULE_SCHEMAS.rules)) target = target.slice(11);
140
+ if (name === "unused-imports/no-unused-vars") target = "no-unused-vars";
141
+ if (name === "unused-imports/no-unused-imports") target = "no-unused-vars";
142
+ const schema = OXLINT_RULE_SCHEMAS.rules[target];
143
+ try {
144
+ const value = literal(entry.getInitializerOrThrow(), depth + 1);
145
+ const severity = Array.isArray(value) ? value[0] : value;
146
+ if (name === "unused-imports/no-unused-imports") {
147
+ const level = severityOf(severity);
148
+ if (level === void 0 || Array.isArray(value) && value.length > 1) finding(entry, name, scope, "unsupported import rule options");
149
+ else if (level !== "off") state.imports = {
150
+ severity: level,
151
+ node: entry
152
+ };
153
+ else delete state.imports;
154
+ continue;
155
+ }
156
+ if (schema === void 0 && (severity === 0 || severity === "off")) continue;
157
+ if (schema === void 0 || !matchesSchema(value, schema, OXLINT_RULE_SCHEMAS.definitions)) {
158
+ finding(entry, name, scope, schema === void 0 ? "no native Oxlint equivalent (selectors and external plugins need a manual replacement)" : "these options are not supported by Oxlint 1.88.0");
159
+ continue;
160
+ }
161
+ if (OXLINT_RULE_SCHEMAS.typeAware.includes(target) && severity !== 0 && severity !== "off") typeAware = true;
162
+ const active = severityOf(severity) !== "off";
163
+ const previous = rules[target];
164
+ const previousSeverity = Array.isArray(previous) ? previous[0] : previous;
165
+ const extension = name.startsWith("@typescript-eslint/") && !target.startsWith("typescript/");
166
+ if (extension && active) {
167
+ state.extensions ??= {};
168
+ state.extensions[target] = value;
169
+ } else if (extension && previous !== void 0 && severityOf(previousSeverity) !== "off") continue;
170
+ else if (state.extensions && target in state.extensions) {
171
+ if (active && JSON.stringify(state.extensions[target]) !== JSON.stringify(value)) finding(entry, name, scope, "Oxlint unifies this base rule with its TypeScript extension; the TypeScript options were kept");
172
+ continue;
173
+ }
174
+ rules[target] = value;
175
+ } catch (error) {
176
+ finding(entry, name, scope, error instanceof Error ? error.message : "computed options");
177
+ }
178
+ }
179
+ const imports = state.imports;
180
+ if (depth === 0 && imports) {
181
+ const previous = rules["no-unused-vars"];
182
+ const options = Array.isArray(previous) && isRecord(previous[1]) ? previous[1] : {};
183
+ const severity = severityOf(Array.isArray(previous) ? previous[0] : previous);
184
+ rules["no-unused-vars"] = [severity === "error" || imports.severity === "error" ? "error" : "warn", {
185
+ ...options,
186
+ fix: {
187
+ imports: "safe-fix",
188
+ variables: "off"
189
+ }
190
+ }];
191
+ if (severity !== void 0 && severity !== "off" && severity !== imports.severity) finding(imports.node, "unused-imports/no-unused-imports", scope, "Oxlint shares no-unused-vars severity for imports and variables; the migrated rule uses the stronger severity, review if separate severities are required");
192
+ }
193
+ };
194
+ const visited = /* @__PURE__ */ new Set();
195
+ const visit = (input) => {
196
+ let node;
197
+ try {
198
+ node = resolve(input);
199
+ } catch (error) {
200
+ finding(input, "config", "**/*", error instanceof Error ? error.message : "computed config");
201
+ return;
202
+ }
203
+ if (visited.has(node)) {
204
+ finding(input, "config", "**/*", "cyclic or repeated config reference");
205
+ return;
206
+ }
207
+ visited.add(node);
208
+ if (Node.isArrayLiteralExpression(node)) {
209
+ for (const entry of node.getElements()) visit(Node.isSpreadElement(entry) ? entry.getExpression() : entry);
210
+ return;
211
+ }
212
+ if (Node.isCallExpression(node)) {
213
+ const callee = node.getExpression();
214
+ if (parsed.getImportDeclarations().some((declaration) => {
215
+ const module = declaration.getModuleSpecifierValue();
216
+ if (module === "eslint/config" && Node.isIdentifier(callee)) return declaration.getNamedImports().some((specifier) => specifier.getName() === "defineConfig" && (specifier.getAliasNode()?.getText() ?? specifier.getName()) === callee.getText());
217
+ return module === "typescript-eslint" && Node.isPropertyAccessExpression(callee) && callee.getName() === "config" && (declaration.getDefaultImport()?.getText() ?? declaration.getNamespaceImport()?.getText()) === callee.getExpression().getText();
218
+ })) {
219
+ for (const argument of node.getArguments()) visit(Node.isSpreadElement(argument) ? argument.getExpression() : argument);
220
+ return;
221
+ }
222
+ }
223
+ if (!Node.isObjectLiteralExpression(node)) {
224
+ finding(input, "config", "**/*", "computed/imported config cannot be evaluated safely");
225
+ return;
226
+ }
227
+ let files;
228
+ let excludes;
229
+ try {
230
+ files = strings(property(node, "files"));
231
+ excludes = strings(property(node, "ignores") ?? property(node, "excludedFiles"));
232
+ } catch {
233
+ finding(node, "config", "computed files", "review file/ignore patterns before porting its rules");
234
+ return;
235
+ }
236
+ const scope = (files ?? ["**/*"]).join(", ");
237
+ const rules = {};
238
+ const ruleNode = property(node, "rules");
239
+ if (ruleNode) mergeRules(ruleNode, rules, scope);
240
+ const portable = {};
241
+ const setting = (name, settingNode) => {
242
+ if (!settingNode) return;
243
+ try {
244
+ let value = literal(settingNode);
245
+ if (name === "globals" && isRecord(value)) value = Object.fromEntries(Object.entries(value).map(([key, state]) => [key, state === true || state === "writeable" ? "writable" : state === false || state === "readable" ? "readonly" : state]));
246
+ const schema = OXLINT_RULE_SCHEMAS.config[name];
247
+ if (schema === void 0 || !matchesSchema(value, schema, OXLINT_RULE_SCHEMAS.definitions)) throw new Error("unsupported options");
248
+ portable[name] = value;
249
+ } catch {
250
+ finding(settingNode, name, scope, "computed or unsupported global/environment settings");
251
+ }
252
+ };
253
+ setting("env", property(node, "env"));
254
+ setting("globals", property(node, "globals"));
255
+ const languageOptions = property(node, "languageOptions");
256
+ if (languageOptions) {
257
+ const language = resolve(languageOptions);
258
+ if (Node.isObjectLiteralExpression(language)) setting("globals", property(language, "globals"));
259
+ else finding(languageOptions, "languageOptions", scope, "computed language settings");
260
+ }
261
+ const nestedOverrides = [];
262
+ for (const member of node.getProperties()) if (Node.isSpreadAssignment(member)) finding(member, "config spread", scope, "review inherited settings and rules");
263
+ else if (Node.isPropertyAssignment(member) && [
264
+ "extends",
265
+ "settings",
266
+ "processor",
267
+ "overrides",
268
+ "linterOptions"
269
+ ].includes(member.getName().replace(/^["']|["']$/g, ""))) {
270
+ if (member.getName().replace(/^["']|["']$/g, "") === "overrides") {
271
+ const nested = member.getInitializer();
272
+ if (nested) nestedOverrides.push(nested);
273
+ } else finding(member, member.getName(), scope, "review settings that have no direct native rule mapping");
274
+ }
275
+ if (excludes && !ruleNode && !files) {
276
+ const patterns = Array.isArray(config.ignorePatterns) ? config.ignorePatterns : [];
277
+ config.ignorePatterns = [.../* @__PURE__ */ new Set([...patterns, ...excludes])];
278
+ changed = true;
279
+ }
280
+ if (preserveExisting) for (const [name, value] of Object.entries(rules)) {
281
+ const rootConflict = !files && name in protectedRules && JSON.stringify(protectedRules[name]) !== JSON.stringify(value);
282
+ const overrideConflict = protectedOverrides.some((entry) => isRecord(entry) && isRecord(entry.rules) && (!files || JSON.stringify(entry.files) === JSON.stringify(files)) && name in entry.rules && JSON.stringify(entry.rules[name]) !== JSON.stringify(value));
283
+ if (rootConflict || overrideConflict) {
284
+ finding(ruleNode ?? node, name, scope, "the existing Oxlint rule conflicts; kept its current value");
285
+ delete rules[name];
286
+ }
287
+ }
288
+ if (Object.keys(rules).length === 0 && Object.keys(portable).length === 0) {
289
+ for (const nested of nestedOverrides) visit(nested);
290
+ return;
291
+ }
292
+ if (files || excludes || Array.isArray(config.overrides)) {
293
+ const overrides = Array.isArray(config.overrides) ? config.overrides : [];
294
+ const override = {
295
+ files: files ?? ["**/*"],
296
+ ...excludes ? { excludeFiles: excludes } : {},
297
+ ...portable,
298
+ rules
299
+ };
300
+ if (!overrides.some((value) => JSON.stringify(value) === JSON.stringify(override))) {
301
+ config.overrides = [...overrides, override];
302
+ changed = true;
303
+ }
304
+ } else {
305
+ const current = isRecord(config.rules) ? config.rules : {};
306
+ for (const [name, value] of Object.entries(rules)) if (name in current && JSON.stringify(current[name]) !== JSON.stringify(value) && preserveExisting) finding(ruleNode ?? node, name, scope, "the existing Oxlint rule conflicts; kept its current value");
307
+ else if (JSON.stringify(current[name]) !== JSON.stringify(value)) {
308
+ current[name] = value;
309
+ changed = true;
310
+ }
311
+ config.rules = current;
312
+ for (const [name, value] of Object.entries(portable)) {
313
+ const previous = isRecord(config[name]) ? config[name] : {};
314
+ if (isRecord(previous) && isRecord(value)) {
315
+ for (const [key, state] of Object.entries(value)) if (preserveExisting && key in previous && previous[key] !== state) finding(node, `${name}.${key}`, scope, "existing Oxc value conflicts and was kept");
316
+ else if (previous[key] !== state) {
317
+ previous[key] = state;
318
+ changed = true;
319
+ }
320
+ config[name] = previous;
321
+ }
322
+ }
323
+ }
324
+ for (const nested of nestedOverrides) visit(nested);
325
+ };
326
+ let exported = parsed.getExportAssignments()[0]?.getExpression() ?? parsed.getDescendantsOfKind(SyntaxKind.BinaryExpression).find((entry) => entry.getLeft().getText() === "module.exports")?.getRight();
327
+ if (configKey && exported && Node.isObjectLiteralExpression(exported)) exported = property(exported, configKey);
328
+ if (exported) visit(exported);
329
+ else finding(parsed, "config", "**/*", "no literal exported config was found");
330
+ if (changed) {
331
+ config.plugins = [.../* @__PURE__ */ new Set([...Array.isArray(config.plugins) ? config.plugins : [], "typescript"])];
332
+ if (typeAware) config.options = {
333
+ ...isRecord(config.options) ? config.options : {},
334
+ typeAware: true
335
+ };
336
+ context.text.write(".oxlintrc.json", `${JSON.stringify(config, null, 2)}\n`, CHANGE);
337
+ }
338
+ return typeAware;
339
+ }
340
+
341
+ //#endregion
342
+ export { portEslintRules };
343
+ //# sourceMappingURL=port-eslint-rules.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"port-eslint-rules.mjs","names":[],"sources":["../../../../../../../../../packages/core/src/upgrade/codemods/port-eslint-rules.ts"],"sourcesContent":["import type { Node, ObjectLiteralExpression } from \"ts-morph\";\nimport type { CodemodContext, CodemodOutput } from \"../types\";\nimport { OXLINT_RULE_SCHEMAS } from \"./oxlint-rule-schemas\";\nimport { isRecord, matchesSchema } from \"./validate-oxlint-rule\";\n\ntype OxcConfig = Record<string, unknown>;\nconst CHANGE = {\n line: 1,\n description: \"Port custom ESLint rules to native Oxlint rules and overrides\",\n};\n\n/** Parse literals, never import/execute an application's executable configuration. */\nexport function portEslintRules(\n context: CodemodContext,\n output: CodemodOutput,\n file: string,\n source: string,\n preserveExisting = true,\n configKey?: string,\n): boolean {\n const { Node, SyntaxKind } = context.tsMorph;\n const project = new context.tsMorph.Project({ useInMemoryFileSystem: true });\n const json = file.endsWith(\".json\") || file === \".eslintrc\";\n const parsed = project.createSourceFile(\n `${file}.ts`,\n json ? `export default ${source};` : source,\n );\n let config: OxcConfig;\n const existing = context.text.read(\".oxlintrc.json\");\n try {\n const value: unknown = JSON.parse(existing ?? \"{}\");\n if (!isRecord(value)) throw new Error(\"Config must be an object\");\n config = value;\n } catch {\n output.manual.push({\n file,\n line: 1,\n hint: \"Cannot merge rules into the existing .oxlintrc.json; review its JSON before porting this config. ESLint support is gone in 5.34.0.\",\n });\n return false;\n }\n const protectedRules = isRecord(config.rules) ? { ...config.rules } : {};\n const protectedOverrides = Array.isArray(config.overrides) ? [...config.overrides] : [];\n let changed = false;\n let typeAware = false;\n const finding = (node: Node, rule: string, scope: string, reason: string) => {\n output.manual.push({\n file,\n line: node.getStartLineNumber(),\n hint: `Port ${rule} for files ${scope}: ${reason}. ESLint support is gone in 5.34.0.`,\n });\n };\n const resolve = (node: Node, seen = new Set<string>()): Node => {\n if (\n Node.isParenthesizedExpression(node) ||\n Node.isAsExpression(node) ||\n Node.isSatisfiesExpression(node)\n )\n return resolve(node.getExpression(), seen);\n if (Node.isPropertyAccessExpression(node)) {\n const marker = `property:${node.getText()}`;\n if (seen.has(marker)) throw new Error(\"cyclic config property\");\n const next = new Set([...seen, marker]);\n const object = resolve(node.getExpression(), next);\n if (Node.isObjectLiteralExpression(object)) {\n const value = property(object, node.getName());\n if (value) return resolve(value, next);\n }\n }\n if (Node.isIdentifier(node)) {\n const name = node.getText();\n if (seen.has(name)) throw new Error(`cyclic config constant ${name}`);\n const declaration = parsed.getVariableDeclaration(name);\n const value = declaration?.getInitializer();\n if (value) return resolve(value, new Set([...seen, name]));\n }\n return node;\n };\n const literal = (input: Node, depth = 0): unknown => {\n if (depth > 30) throw new Error(\"cyclic or deeply nested config value\");\n const node = resolve(input);\n if (\n Node.isStringLiteral(node) ||\n Node.isNoSubstitutionTemplateLiteral(node) ||\n Node.isNumericLiteral(node)\n )\n return node.getLiteralValue();\n if (node.getKind() === SyntaxKind.TrueKeyword) return true;\n if (node.getKind() === SyntaxKind.FalseKeyword) return false;\n if (node.getKind() === SyntaxKind.NullKeyword) return null;\n if (Node.isPrefixUnaryExpression(node) && node.getOperatorToken() === SyntaxKind.MinusToken) {\n const value = literal(node.getOperand(), depth + 1);\n if (typeof value === \"number\") return -value;\n }\n if (Node.isArrayLiteralExpression(node))\n return node.getElements().flatMap((entry) => {\n if (Node.isSpreadElement(entry)) {\n const value = literal(entry.getExpression(), depth + 1);\n if (!Array.isArray(value)) throw new Error(\"computed array spread\");\n return value;\n }\n return [literal(entry, depth + 1)];\n });\n if (Node.isObjectLiteralExpression(node)) {\n const value: Record<string, unknown> = {};\n for (const entry of node.getProperties()) {\n if (Node.isSpreadAssignment(entry)) {\n const spread = literal(entry.getExpression(), depth + 1);\n if (!isRecord(spread)) throw new Error(\"computed object spread\");\n Object.assign(value, spread);\n } else if (Node.isPropertyAssignment(entry)) {\n const key = entry.getNameNode();\n if (Node.isComputedPropertyName(key)) throw new Error(\"computed property name\");\n value[Node.isStringLiteral(key) ? key.getLiteralValue() : key.getText()] = literal(\n entry.getInitializerOrThrow(),\n depth + 1,\n );\n } else throw new Error(\"computed object member\");\n }\n return value;\n }\n throw new Error(`nonliteral expression ${node.getText()}`);\n };\n const property = (block: ObjectLiteralExpression, name: string): Node | undefined => {\n for (const member of block.getProperties()) {\n if (Node.isShorthandPropertyAssignment(member) && member.getName() === name)\n return member.getNameNode();\n if (!Node.isPropertyAssignment(member)) continue;\n const key = member.getNameNode();\n if ((Node.isStringLiteral(key) ? key.getLiteralValue() : key.getText()) === name)\n return member.getInitializer();\n }\n return undefined;\n };\n const strings = (node: Node | undefined): string[] | undefined => {\n if (!node) return undefined;\n const value = literal(node);\n if (typeof value === \"string\") return [value];\n if (Array.isArray(value) && value.every((entry): entry is string => typeof entry === \"string\"))\n return value;\n throw new Error(\"file patterns must be literal strings\");\n };\n const severityOf = (value: unknown): \"off\" | \"warn\" | \"error\" | undefined =>\n value === 0 || value === \"off\"\n ? \"off\"\n : value === 1 || value === \"warn\"\n ? \"warn\"\n : value === 2 || value === \"error\"\n ? \"error\"\n : undefined;\n const mergeRules = (\n input: Node,\n rules: Record<string, unknown>,\n scope: string,\n depth = 0,\n state: {\n imports?: { severity: \"warn\" | \"error\"; node: Node };\n extensions?: Record<string, unknown>;\n } = {},\n ): void => {\n if (depth > 30) {\n finding(input, \"rules\", scope, \"cyclic or deeply nested rule spread\");\n return;\n }\n let node: Node;\n try {\n node = resolve(input);\n } catch {\n finding(input, \"rules\", scope, \"cyclic config constant\");\n return;\n }\n if (!Node.isObjectLiteralExpression(node)) {\n finding(input, \"rules\", scope, \"the rules object is computed or imported\");\n return;\n }\n for (const entry of node.getProperties()) {\n if (Node.isSpreadAssignment(entry)) {\n // Formatting is now Oxfmt's job; the generated Prettier compatibility spread has no lint rules to port.\n const formattingSpread =\n entry.getExpression().getText() === \"prettierConfig.rules\" &&\n parsed\n .getImportDeclarations()\n .some(\n (declaration) =>\n declaration.getModuleSpecifierValue() === \"eslint-config-prettier\" &&\n declaration.getDefaultImport()?.getText() === \"prettierConfig\",\n );\n if (!formattingSpread) mergeRules(entry.getExpression(), rules, scope, depth + 1, state);\n continue;\n }\n if (!Node.isPropertyAssignment(entry)) {\n finding(entry, entry.getText(), scope, \"computed rule declaration\");\n continue;\n }\n const nameNode = entry.getNameNode();\n const name = Node.isStringLiteral(nameNode) ? nameNode.getLiteralValue() : nameNode.getText();\n if (name === \"prettier/prettier\") continue;\n let target = name.replace(/^@typescript-eslint\\//, \"typescript/\").replace(/^eslint\\//, \"\");\n if (target.startsWith(\"typescript/\") && !(target in OXLINT_RULE_SCHEMAS.rules))\n target = target.slice(\"typescript/\".length);\n if (name === \"unused-imports/no-unused-vars\") target = \"no-unused-vars\";\n if (name === \"unused-imports/no-unused-imports\") target = \"no-unused-vars\";\n const schema = OXLINT_RULE_SCHEMAS.rules[target];\n try {\n const value = literal(entry.getInitializerOrThrow(), depth + 1);\n const severity = Array.isArray(value) ? value[0] : value;\n if (name === \"unused-imports/no-unused-imports\") {\n const level = severityOf(severity);\n if (level === undefined || (Array.isArray(value) && value.length > 1)) {\n finding(entry, name, scope, \"unsupported import rule options\");\n } else if (level !== \"off\") state.imports = { severity: level, node: entry };\n else delete state.imports;\n continue;\n }\n if (schema === undefined && (severity === 0 || severity === \"off\")) continue;\n if (\n schema === undefined ||\n !matchesSchema(value, schema, OXLINT_RULE_SCHEMAS.definitions)\n ) {\n finding(\n entry,\n name,\n scope,\n schema === undefined\n ? \"no native Oxlint equivalent (selectors and external plugins need a manual replacement)\"\n : \"these options are not supported by Oxlint 1.88.0\",\n );\n continue;\n }\n if (OXLINT_RULE_SCHEMAS.typeAware.includes(target) && severity !== 0 && severity !== \"off\")\n typeAware = true;\n const active = severityOf(severity) !== \"off\";\n const previous = rules[target];\n const previousSeverity = Array.isArray(previous) ? previous[0] : previous;\n const extension =\n name.startsWith(\"@typescript-eslint/\") && !target.startsWith(\"typescript/\");\n if (extension && active) {\n state.extensions ??= {};\n state.extensions[target] = value;\n } else if (extension && previous !== undefined && severityOf(previousSeverity) !== \"off\")\n continue;\n else if (state.extensions && target in state.extensions) {\n if (active && JSON.stringify(state.extensions[target]) !== JSON.stringify(value))\n finding(\n entry,\n name,\n scope,\n \"Oxlint unifies this base rule with its TypeScript extension; the TypeScript options were kept\",\n );\n continue;\n }\n rules[target] = value;\n } catch (error) {\n finding(entry, name, scope, error instanceof Error ? error.message : \"computed options\");\n }\n }\n const imports = state.imports;\n if (depth === 0 && imports) {\n const previous = rules[\"no-unused-vars\"];\n const options = Array.isArray(previous) && isRecord(previous[1]) ? previous[1] : {};\n // Native no-unused-vars covers imports and variables together. Preserve variable options,\n // and enable the safe import fix without enabling dangerous variable removal.\n const severity = severityOf(Array.isArray(previous) ? previous[0] : previous);\n const level = severity === \"error\" || imports.severity === \"error\" ? \"error\" : \"warn\";\n rules[\"no-unused-vars\"] = [\n level,\n { ...options, fix: { imports: \"safe-fix\", variables: \"off\" } },\n ];\n if (severity !== undefined && severity !== \"off\" && severity !== imports.severity) {\n finding(\n imports.node,\n \"unused-imports/no-unused-imports\",\n scope,\n \"Oxlint shares no-unused-vars severity for imports and variables; the migrated rule uses the stronger severity, review if separate severities are required\",\n );\n }\n }\n };\n const visited = new Set<Node>();\n const visit = (input: Node): void => {\n let node: Node;\n try {\n node = resolve(input);\n } catch (error) {\n finding(input, \"config\", \"**/*\", error instanceof Error ? error.message : \"computed config\");\n return;\n }\n if (visited.has(node)) {\n finding(input, \"config\", \"**/*\", \"cyclic or repeated config reference\");\n return;\n }\n visited.add(node);\n if (Node.isArrayLiteralExpression(node)) {\n for (const entry of node.getElements())\n visit(Node.isSpreadElement(entry) ? entry.getExpression() : entry);\n return;\n }\n if (Node.isCallExpression(node)) {\n const callee = node.getExpression();\n const combiner = parsed.getImportDeclarations().some((declaration) => {\n const module = declaration.getModuleSpecifierValue();\n if (module === \"eslint/config\" && Node.isIdentifier(callee))\n return declaration\n .getNamedImports()\n .some(\n (specifier) =>\n specifier.getName() === \"defineConfig\" &&\n (specifier.getAliasNode()?.getText() ?? specifier.getName()) === callee.getText(),\n );\n return (\n module === \"typescript-eslint\" &&\n Node.isPropertyAccessExpression(callee) &&\n callee.getName() === \"config\" &&\n (declaration.getDefaultImport()?.getText() ??\n declaration.getNamespaceImport()?.getText()) === callee.getExpression().getText()\n );\n });\n if (combiner) {\n for (const argument of node.getArguments())\n visit(Node.isSpreadElement(argument) ? argument.getExpression() : argument);\n return;\n }\n }\n if (!Node.isObjectLiteralExpression(node)) {\n finding(input, \"config\", \"**/*\", \"computed/imported config cannot be evaluated safely\");\n return;\n }\n let files: string[] | undefined;\n let excludes: string[] | undefined;\n try {\n files = strings(property(node, \"files\"));\n excludes = strings(property(node, \"ignores\") ?? property(node, \"excludedFiles\"));\n } catch {\n finding(\n node,\n \"config\",\n \"computed files\",\n \"review file/ignore patterns before porting its rules\",\n );\n return;\n }\n const scope = (files ?? [\"**/*\"]).join(\", \");\n const rules: Record<string, unknown> = {};\n const ruleNode = property(node, \"rules\");\n if (ruleNode) mergeRules(ruleNode, rules, scope);\n const portable: Record<string, unknown> = {};\n const setting = (name: \"globals\" | \"env\", settingNode: Node | undefined) => {\n if (!settingNode) return;\n try {\n let value = literal(settingNode);\n if (name === \"globals\" && isRecord(value))\n value = Object.fromEntries(\n Object.entries(value).map(([key, state]) => [\n key,\n state === true || state === \"writeable\"\n ? \"writable\"\n : state === false || state === \"readable\"\n ? \"readonly\"\n : state,\n ]),\n );\n const schema = OXLINT_RULE_SCHEMAS.config[name];\n if (schema === undefined || !matchesSchema(value, schema, OXLINT_RULE_SCHEMAS.definitions))\n throw new Error(\"unsupported options\");\n portable[name] = value;\n } catch {\n finding(settingNode, name, scope, \"computed or unsupported global/environment settings\");\n }\n };\n setting(\"env\", property(node, \"env\"));\n setting(\"globals\", property(node, \"globals\"));\n const languageOptions = property(node, \"languageOptions\");\n if (languageOptions) {\n const language = resolve(languageOptions);\n if (Node.isObjectLiteralExpression(language))\n setting(\"globals\", property(language, \"globals\"));\n else finding(languageOptions, \"languageOptions\", scope, \"computed language settings\");\n }\n const nestedOverrides: Node[] = [];\n for (const member of node.getProperties()) {\n if (Node.isSpreadAssignment(member))\n finding(member, \"config spread\", scope, \"review inherited settings and rules\");\n else if (\n Node.isPropertyAssignment(member) &&\n [\"extends\", \"settings\", \"processor\", \"overrides\", \"linterOptions\"].includes(\n member.getName().replace(/^[\"']|[\"']$/g, \"\"),\n )\n ) {\n if (member.getName().replace(/^[\"']|[\"']$/g, \"\") === \"overrides\") {\n const nested = member.getInitializer();\n if (nested) nestedOverrides.push(nested);\n } else\n finding(\n member,\n member.getName(),\n scope,\n \"review settings that have no direct native rule mapping\",\n );\n }\n }\n if (excludes && !ruleNode && !files) {\n const patterns = Array.isArray(config.ignorePatterns) ? config.ignorePatterns : [];\n config.ignorePatterns = [...new Set([...patterns, ...excludes])];\n changed = true;\n }\n if (preserveExisting) {\n for (const [name, value] of Object.entries(rules)) {\n const rootConflict =\n !files &&\n name in protectedRules &&\n JSON.stringify(protectedRules[name]) !== JSON.stringify(value);\n const overrideConflict = protectedOverrides.some(\n (entry) =>\n isRecord(entry) &&\n isRecord(entry.rules) &&\n (!files || JSON.stringify(entry.files) === JSON.stringify(files)) &&\n name in entry.rules &&\n JSON.stringify(entry.rules[name]) !== JSON.stringify(value),\n );\n if (rootConflict || overrideConflict) {\n finding(\n ruleNode ?? node,\n name,\n scope,\n \"the existing Oxlint rule conflicts; kept its current value\",\n );\n delete rules[name];\n }\n }\n }\n if (Object.keys(rules).length === 0 && Object.keys(portable).length === 0) {\n for (const nested of nestedOverrides) visit(nested);\n return;\n }\n if (files || excludes || Array.isArray(config.overrides)) {\n const overrides = Array.isArray(config.overrides) ? config.overrides : [];\n const override = {\n files: files ?? [\"**/*\"],\n ...(excludes ? { excludeFiles: excludes } : {}),\n ...portable,\n rules,\n };\n if (!overrides.some((value) => JSON.stringify(value) === JSON.stringify(override))) {\n config.overrides = [...overrides, override];\n changed = true;\n }\n } else {\n const current = isRecord(config.rules) ? config.rules : {};\n for (const [name, value] of Object.entries(rules)) {\n if (\n name in current &&\n JSON.stringify(current[name]) !== JSON.stringify(value) &&\n preserveExisting\n ) {\n finding(\n ruleNode ?? node,\n name,\n scope,\n \"the existing Oxlint rule conflicts; kept its current value\",\n );\n } else if (JSON.stringify(current[name]) !== JSON.stringify(value)) {\n current[name] = value;\n changed = true;\n }\n }\n config.rules = current;\n for (const [name, value] of Object.entries(portable)) {\n const previous = isRecord(config[name]) ? config[name] : {};\n if (isRecord(previous) && isRecord(value)) {\n for (const [key, state] of Object.entries(value)) {\n if (preserveExisting && key in previous && previous[key] !== state)\n finding(node, `${name}.${key}`, scope, \"existing Oxc value conflicts and was kept\");\n else if (previous[key] !== state) {\n previous[key] = state;\n changed = true;\n }\n }\n config[name] = previous;\n }\n }\n }\n for (const nested of nestedOverrides) visit(nested);\n };\n let exported: Node | undefined =\n parsed.getExportAssignments()[0]?.getExpression() ??\n parsed\n .getDescendantsOfKind(SyntaxKind.BinaryExpression)\n .find((entry) => entry.getLeft().getText() === \"module.exports\")\n ?.getRight();\n if (configKey && exported && Node.isObjectLiteralExpression(exported))\n exported = property(exported, configKey);\n if (exported) visit(exported);\n else finding(parsed, \"config\", \"**/*\", \"no literal exported config was found\");\n if (changed) {\n config.plugins = [\n ...new Set([...(Array.isArray(config.plugins) ? config.plugins : []), \"typescript\"]),\n ];\n if (typeAware)\n config.options = { ...(isRecord(config.options) ? config.options : {}), typeAware: true };\n context.text.write(\".oxlintrc.json\", `${JSON.stringify(config, null, 2)}\\n`, CHANGE);\n }\n return typeAware;\n}\n"],"mappings":"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"}
@@ -216,7 +216,7 @@ dist
216
216
  "$schema": "./node_modules/oxlint/configuration_schema.json",
217
217
  "plugins": ["typescript", "import", "react"],
218
218
  "env": { "node": true, "es2021": true },
219
- "categories": { "correctness": "off" },
219
+ "categories": { "correctness": "error" },
220
220
  "rules": {
221
221
  "typescript/no-explicit-any": "off",
222
222
  "no-unused-vars": [
@@ -1 +1 @@
1
- {"version":3,"file":"toolchain-templates.mjs","names":[],"sources":["../../../../../../../../../packages/core/src/upgrade/codemods/toolchain-templates.ts"],"sourcesContent":["/** Bundled create-warlock snapshots. oxc-toolchain.spec.ts checks template parity. */\nexport const TOOLCHAIN_TEMPLATES: Readonly<Record<string, string>> = {\n \"legacy-eslint.config.js\": `import tsPlugin from \"@typescript-eslint/eslint-plugin\";\nimport tsParser from \"@typescript-eslint/parser\";\nimport prettierConfig from \"eslint-config-prettier\";\nimport prettierPlugin from \"eslint-plugin-prettier\";\nimport unusedImports from \"eslint-plugin-unused-imports\";\n\nexport default [\n // Global configuration\n {\n languageOptions: {\n ecmaVersion: \"latest\",\n sourceType: \"module\",\n globals: {\n // Node.js globals\n console: \"readonly\",\n process: \"readonly\",\n Buffer: \"readonly\",\n __dirname: \"readonly\",\n __filename: \"readonly\",\n global: \"readonly\",\n module: \"readonly\",\n require: \"readonly\",\n exports: \"readonly\",\n // ES2021 globals\n Promise: \"readonly\",\n // Jest globals\n describe: \"readonly\",\n it: \"readonly\",\n test: \"readonly\",\n expect: \"readonly\",\n beforeEach: \"readonly\",\n afterEach: \"readonly\",\n beforeAll: \"readonly\",\n afterAll: \"readonly\",\n jest: \"readonly\",\n },\n },\n },\n\n // TypeScript files configuration\n {\n files: [\"**/*.ts\", \"**/*.tsx\"],\n languageOptions: {\n parser: tsParser,\n parserOptions: {\n ecmaVersion: \"latest\",\n sourceType: \"module\",\n },\n },\n plugins: {\n \"@typescript-eslint\": tsPlugin,\n prettier: prettierPlugin,\n \"unused-imports\": unusedImports,\n },\n rules: {\n // Prettier integration\n ...prettierConfig.rules,\n \"prettier/prettier\": \"error\",\n\n // TypeScript rules\n \"@typescript-eslint/no-explicit-any\": \"off\",\n \"@typescript-eslint/no-unused-vars\": \"off\",\n \"no-unused-vars\": \"off\",\n \"unused-imports/no-unused-vars\": [\n \"warn\",\n {\n vars: \"all\",\n varsIgnorePattern: \"^_\",\n args: \"after-used\",\n argsIgnorePattern: \"^_\",\n },\n ],\n \"unused-imports/no-unused-imports\": \"error\",\n \"@typescript-eslint/explicit-member-accessibility\": [\n \"error\",\n { accessibility: \"explicit\" },\n ],\n \"@typescript-eslint/consistent-type-imports\": [\n \"error\",\n {\n prefer: \"type-imports\",\n disallowTypeAnnotations: false,\n },\n ],\n },\n },\n\n // Ignore patterns\n {\n ignores: [\n \"dist/\",\n \"node_modules/\",\n \"**/*.js\",\n \"!**/*.config.js\",\n \"!eslint.config.js\",\n ],\n },\n];\n`,\n \"legacy-prettierignore\": `node_modules\ndist\n\n\n`,\n \"legacy-prettierrc.json\": `{\n \"semi\": true,\n \"tabWidth\": 2,\n \"printWidth\": 100,\n \"singleQuote\": false,\n \"arrowParens\": \"always\",\n \"trailingComma\": \"all\",\n \"endOfLine\": \"lf\",\n \"plugins\": [\"@ianvs/prettier-plugin-sort-imports\"],\n \"importOrder\": [\"<BUILTIN_MODULES>\", \"<THIRD_PARTY_MODULES>\", \"^(app|web|@shared)/\", \"^[.]\"],\n \"importOrderParserPlugins\": [\"typescript\", \"jsx\", \"decorators\"]\n}\n`,\n \"legacy-vscode-settings.json\": `{\n \"editor.defaultFormatter\": \"esbenp.prettier-vscode\",\n \"editor.formatOnSave\": true,\n \"editor.codeActionsOnSave\": {\n \"source.fixAll.eslint\": \"explicit\",\n \"source.organizeImports\": \"never\"\n },\n \"[typescript]\": {\n \"editor.defaultFormatter\": \"esbenp.prettier-vscode\",\n \"editor.formatOnSave\": true\n },\n \"[typescriptreact]\": {\n \"editor.defaultFormatter\": \"esbenp.prettier-vscode\",\n \"editor.formatOnSave\": true\n },\n \"[javascript]\": {\n \"editor.defaultFormatter\": \"esbenp.prettier-vscode\",\n \"editor.formatOnSave\": true\n },\n \"[javascriptreact]\": {\n \"editor.defaultFormatter\": \"esbenp.prettier-vscode\",\n \"editor.formatOnSave\": true\n },\n \"[json]\": {\n \"editor.defaultFormatter\": \"esbenp.prettier-vscode\",\n \"editor.formatOnSave\": true\n },\n \"[css]\": {\n \"editor.defaultFormatter\": \"esbenp.prettier-vscode\",\n \"editor.formatOnSave\": true\n },\n \"prettier.configPath\": \".prettierrc.json\",\n \"prettier.requireConfig\": true,\n \"prettier.ignorePath\": \".prettierignore\",\n \"prettier.documentSelectors\": [\"**/*.{ts,tsx,js,jsx,json,css,md}\"],\n \"prettier.enable\": true,\n \"prettier.useEditorConfig\": false,\n \"prettier.resolveGlobalModules\": false,\n \"eslint.format.enable\": false,\n \"eslint.codeActionsOnSave.mode\": \"all\"\n}\n`,\n \"oxc-vscode-settings.json\": `{\n \"editor.defaultFormatter\": \"oxc.oxc-vscode\",\n \"editor.formatOnSave\": true,\n \"editor.codeActionsOnSave\": {\n \"source.fixAll.oxc\": \"explicit\",\n \"source.organizeImports\": \"never\"\n },\n \"[typescript]\": {\n \"editor.defaultFormatter\": \"oxc.oxc-vscode\",\n \"editor.formatOnSave\": true\n },\n \"[typescriptreact]\": {\n \"editor.defaultFormatter\": \"oxc.oxc-vscode\",\n \"editor.formatOnSave\": true\n },\n \"[javascript]\": {\n \"editor.defaultFormatter\": \"oxc.oxc-vscode\",\n \"editor.formatOnSave\": true\n },\n \"[javascriptreact]\": {\n \"editor.defaultFormatter\": \"oxc.oxc-vscode\",\n \"editor.formatOnSave\": true\n },\n \"[json]\": {\n \"editor.defaultFormatter\": \"oxc.oxc-vscode\",\n \"editor.formatOnSave\": true\n },\n \"[css]\": {\n \"editor.defaultFormatter\": \"oxc.oxc-vscode\",\n \"editor.formatOnSave\": true\n },\n \"oxc.enable.oxlint\": true,\n \"oxc.enable.oxfmt\": true,\n \"oxc.requireConfig\": true\n}\n`,\n \"oxfmtrc.json\": `{\n \"$schema\": \"./node_modules/oxfmt/configuration_schema.json\",\n \"semi\": true,\n \"tabWidth\": 2,\n \"printWidth\": 100,\n \"singleQuote\": false,\n \"arrowParens\": \"always\",\n \"trailingComma\": \"all\",\n \"endOfLine\": \"lf\",\n \"sortImports\": {\n \"newlinesBetween\": false,\n \"internalPattern\": [\"app/\", \"web/\", \"@shared/\"]\n },\n \"ignorePatterns\": [\"node_modules/\", \"dist/\"]\n}\n`,\n \"oxlintrc.json\": `{\n \"$schema\": \"./node_modules/oxlint/configuration_schema.json\",\n \"plugins\": [\"typescript\", \"import\", \"react\"],\n \"env\": { \"node\": true, \"es2021\": true },\n \"categories\": { \"correctness\": \"off\" },\n \"rules\": {\n \"typescript/no-explicit-any\": \"off\",\n \"no-unused-vars\": [\n \"warn\",\n {\n \"vars\": \"all\",\n \"varsIgnorePattern\": \"^_\",\n \"args\": \"after-used\",\n \"argsIgnorePattern\": \"^_\"\n }\n ],\n \"typescript/explicit-member-accessibility\": [\"error\", { \"accessibility\": \"explicit\" }],\n \"typescript/consistent-type-imports\": [\n \"error\",\n { \"prefer\": \"type-imports\", \"disallowTypeAnnotations\": false }\n ]\n },\n \"ignorePatterns\": [\"node_modules/\", \"dist/\"]\n}\n`,\n};\n"],"mappings":";;AACA,MAAa,sBAAwD;CACnE,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmG3B,yBAAyB;;;;;CAKzB,0BAA0B;;;;;;;;;;;;;CAa1B,+BAA+B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0C/B,4BAA4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoC5B,gBAAgB;;;;;;;;;;;;;;;;CAgBhB,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;AAyBnB"}
1
+ {"version":3,"file":"toolchain-templates.mjs","names":[],"sources":["../../../../../../../../../packages/core/src/upgrade/codemods/toolchain-templates.ts"],"sourcesContent":["/** Bundled create-warlock snapshots. oxc-toolchain.spec.ts checks template parity. */\nexport const TOOLCHAIN_TEMPLATES: Readonly<Record<string, string>> = {\n \"legacy-eslint.config.js\": `import tsPlugin from \"@typescript-eslint/eslint-plugin\";\nimport tsParser from \"@typescript-eslint/parser\";\nimport prettierConfig from \"eslint-config-prettier\";\nimport prettierPlugin from \"eslint-plugin-prettier\";\nimport unusedImports from \"eslint-plugin-unused-imports\";\n\nexport default [\n // Global configuration\n {\n languageOptions: {\n ecmaVersion: \"latest\",\n sourceType: \"module\",\n globals: {\n // Node.js globals\n console: \"readonly\",\n process: \"readonly\",\n Buffer: \"readonly\",\n __dirname: \"readonly\",\n __filename: \"readonly\",\n global: \"readonly\",\n module: \"readonly\",\n require: \"readonly\",\n exports: \"readonly\",\n // ES2021 globals\n Promise: \"readonly\",\n // Jest globals\n describe: \"readonly\",\n it: \"readonly\",\n test: \"readonly\",\n expect: \"readonly\",\n beforeEach: \"readonly\",\n afterEach: \"readonly\",\n beforeAll: \"readonly\",\n afterAll: \"readonly\",\n jest: \"readonly\",\n },\n },\n },\n\n // TypeScript files configuration\n {\n files: [\"**/*.ts\", \"**/*.tsx\"],\n languageOptions: {\n parser: tsParser,\n parserOptions: {\n ecmaVersion: \"latest\",\n sourceType: \"module\",\n },\n },\n plugins: {\n \"@typescript-eslint\": tsPlugin,\n prettier: prettierPlugin,\n \"unused-imports\": unusedImports,\n },\n rules: {\n // Prettier integration\n ...prettierConfig.rules,\n \"prettier/prettier\": \"error\",\n\n // TypeScript rules\n \"@typescript-eslint/no-explicit-any\": \"off\",\n \"@typescript-eslint/no-unused-vars\": \"off\",\n \"no-unused-vars\": \"off\",\n \"unused-imports/no-unused-vars\": [\n \"warn\",\n {\n vars: \"all\",\n varsIgnorePattern: \"^_\",\n args: \"after-used\",\n argsIgnorePattern: \"^_\",\n },\n ],\n \"unused-imports/no-unused-imports\": \"error\",\n \"@typescript-eslint/explicit-member-accessibility\": [\n \"error\",\n { accessibility: \"explicit\" },\n ],\n \"@typescript-eslint/consistent-type-imports\": [\n \"error\",\n {\n prefer: \"type-imports\",\n disallowTypeAnnotations: false,\n },\n ],\n },\n },\n\n // Ignore patterns\n {\n ignores: [\n \"dist/\",\n \"node_modules/\",\n \"**/*.js\",\n \"!**/*.config.js\",\n \"!eslint.config.js\",\n ],\n },\n];\n`,\n \"legacy-prettierignore\": `node_modules\ndist\n\n\n`,\n \"legacy-prettierrc.json\": `{\n \"semi\": true,\n \"tabWidth\": 2,\n \"printWidth\": 100,\n \"singleQuote\": false,\n \"arrowParens\": \"always\",\n \"trailingComma\": \"all\",\n \"endOfLine\": \"lf\",\n \"plugins\": [\"@ianvs/prettier-plugin-sort-imports\"],\n \"importOrder\": [\"<BUILTIN_MODULES>\", \"<THIRD_PARTY_MODULES>\", \"^(app|web|@shared)/\", \"^[.]\"],\n \"importOrderParserPlugins\": [\"typescript\", \"jsx\", \"decorators\"]\n}\n`,\n \"legacy-vscode-settings.json\": `{\n \"editor.defaultFormatter\": \"esbenp.prettier-vscode\",\n \"editor.formatOnSave\": true,\n \"editor.codeActionsOnSave\": {\n \"source.fixAll.eslint\": \"explicit\",\n \"source.organizeImports\": \"never\"\n },\n \"[typescript]\": {\n \"editor.defaultFormatter\": \"esbenp.prettier-vscode\",\n \"editor.formatOnSave\": true\n },\n \"[typescriptreact]\": {\n \"editor.defaultFormatter\": \"esbenp.prettier-vscode\",\n \"editor.formatOnSave\": true\n },\n \"[javascript]\": {\n \"editor.defaultFormatter\": \"esbenp.prettier-vscode\",\n \"editor.formatOnSave\": true\n },\n \"[javascriptreact]\": {\n \"editor.defaultFormatter\": \"esbenp.prettier-vscode\",\n \"editor.formatOnSave\": true\n },\n \"[json]\": {\n \"editor.defaultFormatter\": \"esbenp.prettier-vscode\",\n \"editor.formatOnSave\": true\n },\n \"[css]\": {\n \"editor.defaultFormatter\": \"esbenp.prettier-vscode\",\n \"editor.formatOnSave\": true\n },\n \"prettier.configPath\": \".prettierrc.json\",\n \"prettier.requireConfig\": true,\n \"prettier.ignorePath\": \".prettierignore\",\n \"prettier.documentSelectors\": [\"**/*.{ts,tsx,js,jsx,json,css,md}\"],\n \"prettier.enable\": true,\n \"prettier.useEditorConfig\": false,\n \"prettier.resolveGlobalModules\": false,\n \"eslint.format.enable\": false,\n \"eslint.codeActionsOnSave.mode\": \"all\"\n}\n`,\n \"oxc-vscode-settings.json\": `{\n \"editor.defaultFormatter\": \"oxc.oxc-vscode\",\n \"editor.formatOnSave\": true,\n \"editor.codeActionsOnSave\": {\n \"source.fixAll.oxc\": \"explicit\",\n \"source.organizeImports\": \"never\"\n },\n \"[typescript]\": {\n \"editor.defaultFormatter\": \"oxc.oxc-vscode\",\n \"editor.formatOnSave\": true\n },\n \"[typescriptreact]\": {\n \"editor.defaultFormatter\": \"oxc.oxc-vscode\",\n \"editor.formatOnSave\": true\n },\n \"[javascript]\": {\n \"editor.defaultFormatter\": \"oxc.oxc-vscode\",\n \"editor.formatOnSave\": true\n },\n \"[javascriptreact]\": {\n \"editor.defaultFormatter\": \"oxc.oxc-vscode\",\n \"editor.formatOnSave\": true\n },\n \"[json]\": {\n \"editor.defaultFormatter\": \"oxc.oxc-vscode\",\n \"editor.formatOnSave\": true\n },\n \"[css]\": {\n \"editor.defaultFormatter\": \"oxc.oxc-vscode\",\n \"editor.formatOnSave\": true\n },\n \"oxc.enable.oxlint\": true,\n \"oxc.enable.oxfmt\": true,\n \"oxc.requireConfig\": true\n}\n`,\n \"oxfmtrc.json\": `{\n \"$schema\": \"./node_modules/oxfmt/configuration_schema.json\",\n \"semi\": true,\n \"tabWidth\": 2,\n \"printWidth\": 100,\n \"singleQuote\": false,\n \"arrowParens\": \"always\",\n \"trailingComma\": \"all\",\n \"endOfLine\": \"lf\",\n \"sortImports\": {\n \"newlinesBetween\": false,\n \"internalPattern\": [\"app/\", \"web/\", \"@shared/\"]\n },\n \"ignorePatterns\": [\"node_modules/\", \"dist/\"]\n}\n`,\n \"oxlintrc.json\": `{\n \"$schema\": \"./node_modules/oxlint/configuration_schema.json\",\n \"plugins\": [\"typescript\", \"import\", \"react\"],\n \"env\": { \"node\": true, \"es2021\": true },\n \"categories\": { \"correctness\": \"error\" },\n \"rules\": {\n \"typescript/no-explicit-any\": \"off\",\n \"no-unused-vars\": [\n \"warn\",\n {\n \"vars\": \"all\",\n \"varsIgnorePattern\": \"^_\",\n \"args\": \"after-used\",\n \"argsIgnorePattern\": \"^_\"\n }\n ],\n \"typescript/explicit-member-accessibility\": [\"error\", { \"accessibility\": \"explicit\" }],\n \"typescript/consistent-type-imports\": [\n \"error\",\n { \"prefer\": \"type-imports\", \"disallowTypeAnnotations\": false }\n ]\n },\n \"ignorePatterns\": [\"node_modules/\", \"dist/\"]\n}\n`,\n};\n"],"mappings":";;AACA,MAAa,sBAAwD;CACnE,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmG3B,yBAAyB;;;;;CAKzB,0BAA0B;;;;;;;;;;;;;CAa1B,+BAA+B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0C/B,4BAA4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoC5B,gBAAgB;;;;;;;;;;;;;;;;CAgBhB,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;AAyBnB"}
@@ -0,0 +1,60 @@
1
+ //#region ../../packages/core/src/upgrade/codemods/validate-oxlint-rule.ts
2
+ function isRecord(value) {
3
+ return typeof value === "object" && value !== null && !Array.isArray(value);
4
+ }
5
+ /** Conservative validation before copying literal rule options into Oxc config. */
6
+ function matchesSchema(value, schema, definitions) {
7
+ if (typeof schema === "boolean") return schema;
8
+ if (schema.$ref) {
9
+ const target = definitions[schema.$ref.replace("#/definitions/", "")];
10
+ if (target === void 0 || !matchesSchema(value, target, definitions)) return false;
11
+ }
12
+ const matches = (candidate) => matchesSchema(value, candidate, definitions);
13
+ if (schema.allOf && !schema.allOf.every(matches)) return false;
14
+ if (schema.anyOf && !schema.anyOf.some(matches)) return false;
15
+ if (schema.oneOf && schema.oneOf.filter(matches).length !== 1) return false;
16
+ if (schema.not !== void 0 && matches(schema.not)) return false;
17
+ if (schema.enum && !schema.enum.some((entry) => JSON.stringify(entry) === JSON.stringify(value))) return false;
18
+ if ("const" in schema && JSON.stringify(schema.const) !== JSON.stringify(value)) return false;
19
+ if (schema.type) {
20
+ const types = Array.isArray(schema.type) ? schema.type : [schema.type];
21
+ const type = value === null ? "null" : Array.isArray(value) ? "array" : typeof value;
22
+ if (!types.includes(type) && !(types.includes("integer") && typeof value === "number" && Number.isInteger(value))) return false;
23
+ }
24
+ if (Array.isArray(value)) {
25
+ if (schema.minItems !== void 0 && value.length < schema.minItems) return false;
26
+ if (schema.maxItems !== void 0 && value.length > schema.maxItems) return false;
27
+ if (schema.uniqueItems && new Set(value.map((entry) => JSON.stringify(entry))).size !== value.length) return false;
28
+ const items = schema.items;
29
+ if (items !== void 0 && !value.every((entry, index) => {
30
+ return matchesSchema(entry, Array.isArray(items) ? items[index] ?? schema.additionalItems ?? true : items, definitions);
31
+ })) return false;
32
+ }
33
+ if (isRecord(value)) {
34
+ if (schema.required?.some((key) => !(key in value))) return false;
35
+ for (const [key, entry] of Object.entries(value)) {
36
+ const property = schema.properties?.[key];
37
+ const patterns = Object.entries(schema.patternProperties ?? {}).filter(([pattern]) => new RegExp(pattern).test(key));
38
+ if (property !== void 0 && !matchesSchema(entry, property, definitions)) return false;
39
+ if (!patterns.every(([, pattern]) => matchesSchema(entry, pattern, definitions))) return false;
40
+ if (property === void 0 && patterns.length === 0 && schema.additionalProperties !== void 0 && !matchesSchema(entry, schema.additionalProperties, definitions)) return false;
41
+ }
42
+ }
43
+ if (typeof value === "number") {
44
+ if (schema.minimum !== void 0 && value < schema.minimum) return false;
45
+ if (schema.maximum !== void 0 && value > schema.maximum) return false;
46
+ if (schema.exclusiveMinimum !== void 0 && value <= schema.exclusiveMinimum) return false;
47
+ if (schema.exclusiveMaximum !== void 0 && value >= schema.exclusiveMaximum) return false;
48
+ if (schema.multipleOf !== void 0 && value % schema.multipleOf !== 0) return false;
49
+ }
50
+ if (typeof value === "string") {
51
+ if (schema.minLength !== void 0 && value.length < schema.minLength) return false;
52
+ if (schema.maxLength !== void 0 && value.length > schema.maxLength) return false;
53
+ if (schema.pattern !== void 0 && !new RegExp(schema.pattern).test(value)) return false;
54
+ }
55
+ return true;
56
+ }
57
+
58
+ //#endregion
59
+ export { isRecord, matchesSchema };
60
+ //# sourceMappingURL=validate-oxlint-rule.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-oxlint-rule.mjs","names":[],"sources":["../../../../../../../../../packages/core/src/upgrade/codemods/validate-oxlint-rule.ts"],"sourcesContent":["/** JSON Schema assertions used by the pinned Oxlint rule schema snapshot. */\nexport type Schema =\n | boolean\n | {\n $ref?: string;\n type?: string | string[];\n enum?: unknown[];\n const?: unknown;\n allOf?: Schema[];\n anyOf?: Schema[];\n oneOf?: Schema[];\n not?: Schema;\n properties?: Record<string, Schema>;\n patternProperties?: Record<string, Schema>;\n additionalProperties?: Schema;\n required?: string[];\n items?: Schema | Schema[];\n additionalItems?: Schema;\n minItems?: number;\n maxItems?: number;\n uniqueItems?: boolean;\n minimum?: number;\n maximum?: number;\n exclusiveMinimum?: number;\n exclusiveMaximum?: number;\n multipleOf?: number;\n minLength?: number;\n maxLength?: number;\n pattern?: string;\n };\nexport type RuleSchemas = {\n rules: Record<string, Schema>;\n config: Record<string, Schema>;\n definitions: Record<string, Schema>;\n typeAware: string[];\n};\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/** Conservative validation before copying literal rule options into Oxc config. */\nexport function matchesSchema(\n value: unknown,\n schema: Schema,\n definitions: Record<string, Schema>,\n): boolean {\n if (typeof schema === \"boolean\") return schema;\n if (schema.$ref) {\n const target = definitions[schema.$ref.replace(\"#/definitions/\", \"\")];\n if (target === undefined || !matchesSchema(value, target, definitions)) return false;\n }\n const matches = (candidate: Schema) => matchesSchema(value, candidate, definitions);\n if (schema.allOf && !schema.allOf.every(matches)) return false;\n if (schema.anyOf && !schema.anyOf.some(matches)) return false;\n if (schema.oneOf && schema.oneOf.filter(matches).length !== 1) return false;\n if (schema.not !== undefined && matches(schema.not)) return false;\n if (schema.enum && !schema.enum.some((entry) => JSON.stringify(entry) === JSON.stringify(value)))\n return false;\n if (\"const\" in schema && JSON.stringify(schema.const) !== JSON.stringify(value)) return false;\n if (schema.type) {\n const types = Array.isArray(schema.type) ? schema.type : [schema.type];\n const type = value === null ? \"null\" : Array.isArray(value) ? \"array\" : typeof value;\n if (\n !types.includes(type) &&\n !(types.includes(\"integer\") && typeof value === \"number\" && Number.isInteger(value))\n )\n return false;\n }\n if (Array.isArray(value)) {\n if (schema.minItems !== undefined && value.length < schema.minItems) return false;\n if (schema.maxItems !== undefined && value.length > schema.maxItems) return false;\n if (\n schema.uniqueItems &&\n new Set(value.map((entry) => JSON.stringify(entry))).size !== value.length\n )\n return false;\n const items = schema.items;\n if (\n items !== undefined &&\n !value.every((entry, index) => {\n const item = Array.isArray(items)\n ? (items[index] ?? schema.additionalItems ?? true)\n : items;\n return matchesSchema(entry, item, definitions);\n })\n )\n return false;\n }\n if (isRecord(value)) {\n if (schema.required?.some((key) => !(key in value))) return false;\n for (const [key, entry] of Object.entries(value)) {\n const property = schema.properties?.[key];\n const patterns = Object.entries(schema.patternProperties ?? {}).filter(([pattern]) =>\n new RegExp(pattern).test(key),\n );\n if (property !== undefined && !matchesSchema(entry, property, definitions)) return false;\n if (!patterns.every(([, pattern]) => matchesSchema(entry, pattern, definitions)))\n return false;\n if (\n property === undefined &&\n patterns.length === 0 &&\n schema.additionalProperties !== undefined &&\n !matchesSchema(entry, schema.additionalProperties, definitions)\n )\n return false;\n }\n }\n if (typeof value === \"number\") {\n if (schema.minimum !== undefined && value < schema.minimum) return false;\n if (schema.maximum !== undefined && value > schema.maximum) return false;\n if (schema.exclusiveMinimum !== undefined && value <= schema.exclusiveMinimum) return false;\n if (schema.exclusiveMaximum !== undefined && value >= schema.exclusiveMaximum) return false;\n if (schema.multipleOf !== undefined && value % schema.multipleOf !== 0) return false;\n }\n if (typeof value === \"string\") {\n if (schema.minLength !== undefined && value.length < schema.minLength) return false;\n if (schema.maxLength !== undefined && value.length > schema.maxLength) return false;\n if (schema.pattern !== undefined && !new RegExp(schema.pattern).test(value)) return false;\n }\n return true;\n}\n"],"mappings":"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"}
@@ -3,13 +3,20 @@
3
3
  * Breaking changes with nothing to edit in source: they change data or
4
4
  * operations. Printed so the rollout plans for them.
5
5
  */
6
- const UPGRADE_NOTES = [{
7
- version: "5.30.0",
8
- text: "Auth login throttle keys are hashed: counters and lockouts written by 5.29 are forgotten on upgrade (locked accounts and IPs unlock)."
9
- }, {
10
- version: "5.30.0",
11
- text: "Image derivatives use a new cache layout: the first request re-renders each one. Delete the old two-level cache folders once the rollout is done."
12
- }];
6
+ const UPGRADE_NOTES = [
7
+ {
8
+ version: "5.34.0",
9
+ text: "ESLint and Prettier support is gone in 5.34.0. Oxlint/Oxfmt is the only toolchain. The oxc-toolchain-removal step migrates remaining legacy configs/dependencies; review its manual findings. New/migrated templates enable correctness: error, which may report additional defects."
10
+ },
11
+ {
12
+ version: "5.30.0",
13
+ text: "Auth login throttle keys are hashed: counters and lockouts written by 5.29 are forgotten on upgrade (locked accounts and IPs unlock)."
14
+ },
15
+ {
16
+ version: "5.30.0",
17
+ text: "Image derivatives use a new cache layout: the first request re-renders each one. Delete the old two-level cache folders once the rollout is done."
18
+ }
19
+ ];
13
20
 
14
21
  //#endregion
15
22
  export { UPGRADE_NOTES };
@@ -1 +1 @@
1
- {"version":3,"file":"notes.mjs","names":[],"sources":["../../../../../../../../packages/core/src/upgrade/notes.ts"],"sourcesContent":["import type { UpgradeNote } from \"./types\";\n\n/**\n * Breaking changes with nothing to edit in source: they change data or\n * operations. Printed so the rollout plans for them.\n */\nexport const UPGRADE_NOTES: readonly UpgradeNote[] = [\n {\n version: \"5.30.0\",\n text: \"Auth login throttle keys are hashed: counters and lockouts written by 5.29 are forgotten on upgrade (locked accounts and IPs unlock).\",\n },\n {\n version: \"5.30.0\",\n text: \"Image derivatives use a new cache layout: the first request re-renders each one. Delete the old two-level cache folders once the rollout is done.\",\n },\n];\n"],"mappings":";;;;;AAMA,MAAa,gBAAwC,CACnD;CACE,SAAS;CACT,MAAM;AACR,GACA;CACE,SAAS;CACT,MAAM;AACR,CACF"}
1
+ {"version":3,"file":"notes.mjs","names":[],"sources":["../../../../../../../../packages/core/src/upgrade/notes.ts"],"sourcesContent":["import type { UpgradeNote } from \"./types\";\n\n/**\n * Breaking changes with nothing to edit in source: they change data or\n * operations. Printed so the rollout plans for them.\n */\nexport const UPGRADE_NOTES: readonly UpgradeNote[] = [\n {\n version: \"5.34.0\",\n text: \"ESLint and Prettier support is gone in 5.34.0. Oxlint/Oxfmt is the only toolchain. The oxc-toolchain-removal step migrates remaining legacy configs/dependencies; review its manual findings. New/migrated templates enable correctness: error, which may report additional defects.\",\n },\n {\n version: \"5.30.0\",\n text: \"Auth login throttle keys are hashed: counters and lockouts written by 5.29 are forgotten on upgrade (locked accounts and IPs unlock).\",\n },\n {\n version: \"5.30.0\",\n text: \"Image derivatives use a new cache layout: the first request re-renders each one. Delete the old two-level cache folders once the rollout is done.\",\n },\n];\n"],"mappings":";;;;;AAMA,MAAa,gBAAwC;CACnD;EACE,SAAS;EACT,MAAM;CACR;CACA;EACE,SAAS;EACT,MAAM;CACR;CACA;EACE,SAAS;EACT,MAAM;CACR;AACF"}
@@ -170,7 +170,6 @@ export type WarlockConfig = {
170
170
  /**
171
171
  * Built-in checker switches, custom checker array, or false to disable.
172
172
  * TypeScript and installed/configured Oxlint run by default.
173
- * ESLint requires `{ eslint: true }` and is deprecated (removed in 5.34.0).
174
173
  */
175
174
  healthCheckers?: FileHealthCheckerContract[] | BuiltInHealthCheckerOptions | false;
176
175
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.mts","names":[],"sources":["../../../../../../../../packages/core/src/warlock-config/types.ts"],"mappings":";;;;;;;;;;;YAcY;;;;EAIV;;;;IAIE;;;;IAIA;;;;IAIA;;;;;;;;;;;;;EAcF,QAAQ,KAAK;;;;;;IAMX;;;;;;;;;;;IAWA;;;;;;IAMA;;;;;;;IAOA;;;;;;;;;;;;;;;;;IAiBA;;;;;;;;;;;;;;;;IAgBA;;;;;;IAMA;;;;;;IAMA;;;;;;;;;;;;;;;;;;;;;;;;;;EA2BF,aAAa;;;;EAKb;IACE,WAAW;;;;;EAMb;;;;IAIE;;;;;;MAME;;;;;;MAMA;;;;;;;IAOF,iBAAiB,8BAA8B;;;;;IAK/C;;;;;;;;;IASA;;;;;;;;;IASA;;;;;;;;;;IAUA;;;;;;;;;;;;IAYA;;;;;;;;;;IAUA;;;;;;;;;IASA;;MAIM;;MAEA;;MAEA;;;;;;EAOR;;;;;;;;;;;;;;;;;;IAkBE,aAAa,MAAM;;;;;;;;EASrB;;;;;;;;;IASE;;;;;;;;IASA"}
1
+ {"version":3,"file":"types.d.mts","names":[],"sources":["../../../../../../../../packages/core/src/warlock-config/types.ts"],"mappings":";;;;;;;;;;;YAcY;;;;EAIV;;;;IAIE;;;;IAIA;;;;IAIA;;;;;;;;;;;;;EAcF,QAAQ,KAAK;;;;;;IAMX;;;;;;;;;;;IAWA;;;;;;IAMA;;;;;;;IAOA;;;;;;;;;;;;;;;;;IAiBA;;;;;;;;;;;;;;;;IAgBA;;;;;;IAMA;;;;;;IAMA;;;;;;;;;;;;;;;;;;;;;;;;;;EA2BF,aAAa;;;;EAKb;IACE,WAAW;;;;;EAMb;;;;IAIE;;;;;;MAME;;;;;;MAMA;;;;;;IAMF,iBAAiB,8BAA8B;;;;;IAK/C;;;;;;;;;IASA;;;;;;;;;IASA;;;;;;;;;;IAUA;;;;;;;;;;;;IAYA;;;;;;;;;;IAUA;;;;;;;;;IASA;;MAIM;;MAEA;;MAEA;;;;;;EAOR;;;;;;;;;;;;;;;;;;IAkBE,aAAa,MAAM;;;;;;;;EASrB;;;;;;;;;IASE;;;;;;;;IASA"}