@warlock.js/core 5.32.0 → 5.34.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (173) hide show
  1. package/CHANGELOG.md +64 -46
  2. package/esm/application/application-config-types.d.mts +8 -0
  3. package/esm/application/application-config-types.d.mts.map +1 -1
  4. package/esm/application/boot-signal.d.mts +8 -8
  5. package/esm/application/boot-signal.d.mts.map +1 -1
  6. package/esm/application/boot-signal.mjs +15 -9
  7. package/esm/application/boot-signal.mjs.map +1 -1
  8. package/esm/cli/commands/ai/ai-command.action.mjs +140 -0
  9. package/esm/cli/commands/ai/ai-command.action.mjs.map +1 -0
  10. package/esm/cli/commands/ai.command.mjs +50 -0
  11. package/esm/cli/commands/ai.command.mjs.map +1 -0
  12. package/esm/cli/commands/check/check-command.action.mjs +4 -0
  13. package/esm/cli/commands/check/check-command.action.mjs.map +1 -1
  14. package/esm/cli/commands/check.command.mjs +6 -1
  15. package/esm/cli/commands/check.command.mjs.map +1 -1
  16. package/esm/cli/commands/e2e.command.mjs +63 -0
  17. package/esm/cli/commands/e2e.command.mjs.map +1 -0
  18. package/esm/cli/commands/load-e2e-spec.mjs +47 -0
  19. package/esm/cli/commands/load-e2e-spec.mjs.map +1 -0
  20. package/esm/cli/commands/pm2/pm2-command.action.mjs +91 -0
  21. package/esm/cli/commands/pm2/pm2-command.action.mjs.map +1 -0
  22. package/esm/cli/commands/pm2/pm2-config.mjs +115 -0
  23. package/esm/cli/commands/pm2/pm2-config.mjs.map +1 -0
  24. package/esm/cli/commands/pm2.command.mjs +53 -0
  25. package/esm/cli/commands/pm2.command.mjs.map +1 -0
  26. package/esm/cli/framework-cli-commands.mjs +6 -0
  27. package/esm/cli/framework-cli-commands.mjs.map +1 -1
  28. package/esm/connectors/connectors-manager.d.mts.map +1 -1
  29. package/esm/connectors/connectors-manager.mjs +1 -4
  30. package/esm/connectors/connectors-manager.mjs.map +1 -1
  31. package/esm/connectors/shutdown-timeout.mjs +7 -0
  32. package/esm/connectors/shutdown-timeout.mjs.map +1 -0
  33. package/esm/connectors/socket-connector.d.mts.map +1 -1
  34. package/esm/connectors/socket-connector.mjs +8 -1
  35. package/esm/connectors/socket-connector.mjs.map +1 -1
  36. package/esm/dev-server/health-checker/checkers/oxlint-health-checker.mjs +1 -1
  37. package/esm/dev-server/health-checker/default-health-checkers.mjs +2 -16
  38. package/esm/dev-server/health-checker/default-health-checkers.mjs.map +1 -1
  39. package/esm/dev-server/health-checker/file-health-checker.contract.d.mts +1 -2
  40. package/esm/dev-server/health-checker/file-health-checker.contract.d.mts.map +1 -1
  41. package/esm/dev-server/health-checker/file-health-result.d.mts +1 -1
  42. package/esm/dev-server/health-checker/file-health-result.mjs.map +1 -1
  43. package/esm/e2e/browser.d.mts +4 -0
  44. package/esm/e2e/browser.d.mts.map +1 -0
  45. package/esm/e2e/browser.mjs +88 -0
  46. package/esm/e2e/browser.mjs.map +1 -0
  47. package/esm/e2e/cdp.d.mts +152 -0
  48. package/esm/e2e/cdp.d.mts.map +1 -0
  49. package/esm/e2e/cdp.mjs +106 -0
  50. package/esm/e2e/cdp.mjs.map +1 -0
  51. package/esm/e2e/fixture.mjs +195 -0
  52. package/esm/e2e/fixture.mjs.map +1 -0
  53. package/esm/e2e/index.d.mts +5 -0
  54. package/esm/e2e/index.mjs +6 -0
  55. package/esm/e2e/owned-process.mjs +193 -0
  56. package/esm/e2e/owned-process.mjs.map +1 -0
  57. package/esm/e2e/page.d.mts +64 -0
  58. package/esm/e2e/page.d.mts.map +1 -0
  59. package/esm/e2e/page.mjs +376 -0
  60. package/esm/e2e/page.mjs.map +1 -0
  61. package/esm/e2e/run-e2e.d.mts +17 -0
  62. package/esm/e2e/run-e2e.d.mts.map +1 -0
  63. package/esm/e2e/run-e2e.mjs +143 -0
  64. package/esm/e2e/run-e2e.mjs.map +1 -0
  65. package/esm/e2e/types.d.mts +123 -0
  66. package/esm/e2e/types.d.mts.map +1 -0
  67. package/esm/e2e/types.mjs +24 -0
  68. package/esm/e2e/types.mjs.map +1 -0
  69. package/esm/generations/features/index.mjs +2 -0
  70. package/esm/generations/features/index.mjs.map +1 -1
  71. package/esm/generations/features/process.feature.mjs +65 -0
  72. package/esm/generations/features/process.feature.mjs.map +1 -0
  73. package/esm/http/port-preflight.d.mts.map +1 -1
  74. package/esm/http/port-preflight.mjs +2 -0
  75. package/esm/http/port-preflight.mjs.map +1 -1
  76. package/esm/index.d.mts +7 -2
  77. package/esm/index.mjs +7 -2
  78. package/esm/secrets/errors.d.mts +9 -0
  79. package/esm/secrets/errors.d.mts.map +1 -0
  80. package/esm/secrets/errors.mjs +24 -0
  81. package/esm/secrets/errors.mjs.map +1 -0
  82. package/esm/secrets/file-backend.mjs +167 -0
  83. package/esm/secrets/file-backend.mjs.map +1 -0
  84. package/esm/secrets/index.d.mts +6 -0
  85. package/esm/secrets/index.mjs +6 -0
  86. package/esm/secrets/keyring-backend.mjs +50 -0
  87. package/esm/secrets/keyring-backend.mjs.map +1 -0
  88. package/esm/secrets/memory-backend.d.mts +12 -0
  89. package/esm/secrets/memory-backend.d.mts.map +1 -0
  90. package/esm/secrets/memory-backend.mjs +28 -0
  91. package/esm/secrets/memory-backend.mjs.map +1 -0
  92. package/esm/secrets/resolve-driver.mjs +14 -0
  93. package/esm/secrets/resolve-driver.mjs.map +1 -0
  94. package/esm/secrets/secret-store.d.mts +25 -0
  95. package/esm/secrets/secret-store.d.mts.map +1 -0
  96. package/esm/secrets/secret-store.mjs +120 -0
  97. package/esm/secrets/secret-store.mjs.map +1 -0
  98. package/esm/secrets/secrets.d.mts +11 -0
  99. package/esm/secrets/secrets.d.mts.map +1 -0
  100. package/esm/secrets/secrets.mjs +72 -0
  101. package/esm/secrets/secrets.mjs.map +1 -0
  102. package/esm/secrets/types.d.mts +26 -0
  103. package/esm/secrets/types.d.mts.map +1 -0
  104. package/esm/socket/index.d.mts +2 -2
  105. package/esm/socket/index.mjs +2 -2
  106. package/esm/socket/utils.d.mts +7 -0
  107. package/esm/socket/utils.d.mts.map +1 -1
  108. package/esm/socket/utils.mjs +12 -1
  109. package/esm/socket/utils.mjs.map +1 -1
  110. package/esm/tests/fakes/index.d.mts +2 -1
  111. package/esm/tests/fakes/index.mjs +2 -1
  112. package/esm/tests/fakes/secrets-fake.d.mts +13 -0
  113. package/esm/tests/fakes/secrets-fake.d.mts.map +1 -0
  114. package/esm/tests/fakes/secrets-fake.mjs +50 -0
  115. package/esm/tests/fakes/secrets-fake.mjs.map +1 -0
  116. package/esm/tests/fakes/test-fakes.d.mts +2 -2
  117. package/esm/tests/fakes/test-fakes.d.mts.map +1 -1
  118. package/esm/tests/fakes/test-fakes.mjs +5 -2
  119. package/esm/tests/fakes/test-fakes.mjs.map +1 -1
  120. package/esm/tests/index.d.mts +2 -1
  121. package/esm/tests/index.mjs +2 -1
  122. package/esm/tests/vitest-setup.d.mts +1 -1
  123. package/esm/tests/vitest-setup.mjs.map +1 -1
  124. package/esm/tooling/check/lint-step.d.mts +2 -8
  125. package/esm/tooling/check/lint-step.d.mts.map +1 -1
  126. package/esm/tooling/check/lint-step.mjs +1 -42
  127. package/esm/tooling/check/lint-step.mjs.map +1 -1
  128. package/esm/tooling/check/run-check.d.mts +2 -0
  129. package/esm/tooling/check/run-check.d.mts.map +1 -1
  130. package/esm/tooling/check/run-check.mjs +3 -1
  131. package/esm/tooling/check/run-check.mjs.map +1 -1
  132. package/esm/tooling/problem.d.mts +1 -1
  133. package/esm/tooling/problem.d.mts.map +1 -1
  134. package/esm/tooling/problem.mjs.map +1 -1
  135. package/esm/updater/package-manager.mjs +5 -1
  136. package/esm/updater/package-manager.mjs.map +1 -1
  137. package/esm/upgrade/codemods/index.mjs +3 -0
  138. package/esm/upgrade/codemods/index.mjs.map +1 -1
  139. package/esm/upgrade/codemods/oxc-toolchain.mjs +191 -0
  140. package/esm/upgrade/codemods/oxc-toolchain.mjs.map +1 -0
  141. package/esm/upgrade/codemods/oxlint-rule-schemas.mjs +6 -0
  142. package/esm/upgrade/codemods/oxlint-rule-schemas.mjs.map +1 -0
  143. package/esm/upgrade/codemods/port-eslint-rules.mjs +343 -0
  144. package/esm/upgrade/codemods/port-eslint-rules.mjs.map +1 -0
  145. package/esm/upgrade/codemods/toolchain-templates.mjs +244 -0
  146. package/esm/upgrade/codemods/toolchain-templates.mjs.map +1 -0
  147. package/esm/upgrade/codemods/validate-oxlint-rule.mjs +60 -0
  148. package/esm/upgrade/codemods/validate-oxlint-rule.mjs.map +1 -0
  149. package/esm/upgrade/notes.mjs +14 -7
  150. package/esm/upgrade/notes.mjs.map +1 -1
  151. package/esm/upgrade/run-upgrade.mjs +25 -6
  152. package/esm/upgrade/run-upgrade.mjs.map +1 -1
  153. package/esm/warlock-config/types.d.mts +1 -1
  154. package/llms-full.txt +538 -29
  155. package/llms.txt +5 -3
  156. package/package.json +29 -20
  157. package/skills/README.md +2 -1
  158. package/skills/create-module/SKILL.md +2 -2
  159. package/skills/index.md +1 -1
  160. package/skills/run-app/SKILL.md +115 -6
  161. package/skills/store-secrets/SKILL.md +141 -0
  162. package/skills/test-browser/SKILL.md +119 -0
  163. package/skills/test-fakes/SKILL.md +13 -11
  164. package/skills/upgrade-from-5-29/SKILL.md +85 -7
  165. package/skills/warlock-check/SKILL.md +7 -3
  166. package/skills/warlock-doctor/SKILL.md +8 -0
  167. package/skills/wire-socket/SKILL.md +19 -0
  168. package/skills/write-cli-command/SKILL.md +21 -0
  169. package/esm/dev-server/health-checker/checkers/eslint-health-checker.mjs +0 -154
  170. package/esm/dev-server/health-checker/checkers/eslint-health-checker.mjs.map +0 -1
  171. package/esm/dev-server/health-checker/workers/eslint-health.worker.d.mts +0 -1
  172. package/esm/dev-server/health-checker/workers/eslint-health.worker.mjs +0 -192
  173. 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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"}
@@ -0,0 +1,244 @@
1
+ //#region ../../packages/core/src/upgrade/codemods/toolchain-templates.ts
2
+ /** Bundled create-warlock snapshots. oxc-toolchain.spec.ts checks template parity. */
3
+ const TOOLCHAIN_TEMPLATES = {
4
+ "legacy-eslint.config.js": `import tsPlugin from "@typescript-eslint/eslint-plugin";
5
+ import tsParser from "@typescript-eslint/parser";
6
+ import prettierConfig from "eslint-config-prettier";
7
+ import prettierPlugin from "eslint-plugin-prettier";
8
+ import unusedImports from "eslint-plugin-unused-imports";
9
+
10
+ export default [
11
+ // Global configuration
12
+ {
13
+ languageOptions: {
14
+ ecmaVersion: "latest",
15
+ sourceType: "module",
16
+ globals: {
17
+ // Node.js globals
18
+ console: "readonly",
19
+ process: "readonly",
20
+ Buffer: "readonly",
21
+ __dirname: "readonly",
22
+ __filename: "readonly",
23
+ global: "readonly",
24
+ module: "readonly",
25
+ require: "readonly",
26
+ exports: "readonly",
27
+ // ES2021 globals
28
+ Promise: "readonly",
29
+ // Jest globals
30
+ describe: "readonly",
31
+ it: "readonly",
32
+ test: "readonly",
33
+ expect: "readonly",
34
+ beforeEach: "readonly",
35
+ afterEach: "readonly",
36
+ beforeAll: "readonly",
37
+ afterAll: "readonly",
38
+ jest: "readonly",
39
+ },
40
+ },
41
+ },
42
+
43
+ // TypeScript files configuration
44
+ {
45
+ files: ["**/*.ts", "**/*.tsx"],
46
+ languageOptions: {
47
+ parser: tsParser,
48
+ parserOptions: {
49
+ ecmaVersion: "latest",
50
+ sourceType: "module",
51
+ },
52
+ },
53
+ plugins: {
54
+ "@typescript-eslint": tsPlugin,
55
+ prettier: prettierPlugin,
56
+ "unused-imports": unusedImports,
57
+ },
58
+ rules: {
59
+ // Prettier integration
60
+ ...prettierConfig.rules,
61
+ "prettier/prettier": "error",
62
+
63
+ // TypeScript rules
64
+ "@typescript-eslint/no-explicit-any": "off",
65
+ "@typescript-eslint/no-unused-vars": "off",
66
+ "no-unused-vars": "off",
67
+ "unused-imports/no-unused-vars": [
68
+ "warn",
69
+ {
70
+ vars: "all",
71
+ varsIgnorePattern: "^_",
72
+ args: "after-used",
73
+ argsIgnorePattern: "^_",
74
+ },
75
+ ],
76
+ "unused-imports/no-unused-imports": "error",
77
+ "@typescript-eslint/explicit-member-accessibility": [
78
+ "error",
79
+ { accessibility: "explicit" },
80
+ ],
81
+ "@typescript-eslint/consistent-type-imports": [
82
+ "error",
83
+ {
84
+ prefer: "type-imports",
85
+ disallowTypeAnnotations: false,
86
+ },
87
+ ],
88
+ },
89
+ },
90
+
91
+ // Ignore patterns
92
+ {
93
+ ignores: [
94
+ "dist/",
95
+ "node_modules/",
96
+ "**/*.js",
97
+ "!**/*.config.js",
98
+ "!eslint.config.js",
99
+ ],
100
+ },
101
+ ];
102
+ `,
103
+ "legacy-prettierignore": `node_modules
104
+ dist
105
+
106
+
107
+ `,
108
+ "legacy-prettierrc.json": `{
109
+ "semi": true,
110
+ "tabWidth": 2,
111
+ "printWidth": 100,
112
+ "singleQuote": false,
113
+ "arrowParens": "always",
114
+ "trailingComma": "all",
115
+ "endOfLine": "lf",
116
+ "plugins": ["@ianvs/prettier-plugin-sort-imports"],
117
+ "importOrder": ["<BUILTIN_MODULES>", "<THIRD_PARTY_MODULES>", "^(app|web|@shared)/", "^[.]"],
118
+ "importOrderParserPlugins": ["typescript", "jsx", "decorators"]
119
+ }
120
+ `,
121
+ "legacy-vscode-settings.json": `{
122
+ "editor.defaultFormatter": "esbenp.prettier-vscode",
123
+ "editor.formatOnSave": true,
124
+ "editor.codeActionsOnSave": {
125
+ "source.fixAll.eslint": "explicit",
126
+ "source.organizeImports": "never"
127
+ },
128
+ "[typescript]": {
129
+ "editor.defaultFormatter": "esbenp.prettier-vscode",
130
+ "editor.formatOnSave": true
131
+ },
132
+ "[typescriptreact]": {
133
+ "editor.defaultFormatter": "esbenp.prettier-vscode",
134
+ "editor.formatOnSave": true
135
+ },
136
+ "[javascript]": {
137
+ "editor.defaultFormatter": "esbenp.prettier-vscode",
138
+ "editor.formatOnSave": true
139
+ },
140
+ "[javascriptreact]": {
141
+ "editor.defaultFormatter": "esbenp.prettier-vscode",
142
+ "editor.formatOnSave": true
143
+ },
144
+ "[json]": {
145
+ "editor.defaultFormatter": "esbenp.prettier-vscode",
146
+ "editor.formatOnSave": true
147
+ },
148
+ "[css]": {
149
+ "editor.defaultFormatter": "esbenp.prettier-vscode",
150
+ "editor.formatOnSave": true
151
+ },
152
+ "prettier.configPath": ".prettierrc.json",
153
+ "prettier.requireConfig": true,
154
+ "prettier.ignorePath": ".prettierignore",
155
+ "prettier.documentSelectors": ["**/*.{ts,tsx,js,jsx,json,css,md}"],
156
+ "prettier.enable": true,
157
+ "prettier.useEditorConfig": false,
158
+ "prettier.resolveGlobalModules": false,
159
+ "eslint.format.enable": false,
160
+ "eslint.codeActionsOnSave.mode": "all"
161
+ }
162
+ `,
163
+ "oxc-vscode-settings.json": `{
164
+ "editor.defaultFormatter": "oxc.oxc-vscode",
165
+ "editor.formatOnSave": true,
166
+ "editor.codeActionsOnSave": {
167
+ "source.fixAll.oxc": "explicit",
168
+ "source.organizeImports": "never"
169
+ },
170
+ "[typescript]": {
171
+ "editor.defaultFormatter": "oxc.oxc-vscode",
172
+ "editor.formatOnSave": true
173
+ },
174
+ "[typescriptreact]": {
175
+ "editor.defaultFormatter": "oxc.oxc-vscode",
176
+ "editor.formatOnSave": true
177
+ },
178
+ "[javascript]": {
179
+ "editor.defaultFormatter": "oxc.oxc-vscode",
180
+ "editor.formatOnSave": true
181
+ },
182
+ "[javascriptreact]": {
183
+ "editor.defaultFormatter": "oxc.oxc-vscode",
184
+ "editor.formatOnSave": true
185
+ },
186
+ "[json]": {
187
+ "editor.defaultFormatter": "oxc.oxc-vscode",
188
+ "editor.formatOnSave": true
189
+ },
190
+ "[css]": {
191
+ "editor.defaultFormatter": "oxc.oxc-vscode",
192
+ "editor.formatOnSave": true
193
+ },
194
+ "oxc.enable.oxlint": true,
195
+ "oxc.enable.oxfmt": true,
196
+ "oxc.requireConfig": true
197
+ }
198
+ `,
199
+ "oxfmtrc.json": `{
200
+ "$schema": "./node_modules/oxfmt/configuration_schema.json",
201
+ "semi": true,
202
+ "tabWidth": 2,
203
+ "printWidth": 100,
204
+ "singleQuote": false,
205
+ "arrowParens": "always",
206
+ "trailingComma": "all",
207
+ "endOfLine": "lf",
208
+ "sortImports": {
209
+ "newlinesBetween": false,
210
+ "internalPattern": ["app/", "web/", "@shared/"]
211
+ },
212
+ "ignorePatterns": ["node_modules/", "dist/"]
213
+ }
214
+ `,
215
+ "oxlintrc.json": `{
216
+ "$schema": "./node_modules/oxlint/configuration_schema.json",
217
+ "plugins": ["typescript", "import", "react"],
218
+ "env": { "node": true, "es2021": true },
219
+ "categories": { "correctness": "error" },
220
+ "rules": {
221
+ "typescript/no-explicit-any": "off",
222
+ "no-unused-vars": [
223
+ "warn",
224
+ {
225
+ "vars": "all",
226
+ "varsIgnorePattern": "^_",
227
+ "args": "after-used",
228
+ "argsIgnorePattern": "^_"
229
+ }
230
+ ],
231
+ "typescript/explicit-member-accessibility": ["error", { "accessibility": "explicit" }],
232
+ "typescript/consistent-type-imports": [
233
+ "error",
234
+ { "prefer": "type-imports", "disallowTypeAnnotations": false }
235
+ ]
236
+ },
237
+ "ignorePatterns": ["node_modules/", "dist/"]
238
+ }
239
+ `
240
+ };
241
+
242
+ //#endregion
243
+ export { TOOLCHAIN_TEMPLATES };
244
+ //# sourceMappingURL=toolchain-templates.mjs.map