@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
@@ -1,3 +1,5 @@
1
+ import { isRecord } from "./validate-oxlint-rule.mjs";
2
+ import { portEslintRules } from "./port-eslint-rules.mjs";
1
3
  import { TOOLCHAIN_TEMPLATES } from "./toolchain-templates.mjs";
2
4
 
3
5
  //#region ../../packages/core/src/upgrade/codemods/oxc-toolchain.ts
@@ -19,7 +21,7 @@ const OXC_SCRIPTS = {
19
21
  "format:check": "oxfmt --ignore-path .gitignore --ignore-path .oxfmtignore --check ./src"
20
22
  };
21
23
  function legacyDependency(name) {
22
- return /^(eslint|prettier|@types\/prettier|eslint-config-prettier)$/.test(name) || name.startsWith("@typescript-eslint/") || /(?:^|\/)eslint-plugin-/.test(name) || /(?:^|\/)prettier-plugin-/.test(name) || name.startsWith("@prettier/plugin-");
24
+ return /^(eslint|prettier|typescript-eslint|@types\/prettier)$/.test(name) || name.startsWith("@typescript-eslint/") || /(?:^|\/)eslint-config-/.test(name) || /(?:^|\/)eslint-plugin-/.test(name) || /(?:^|\/)prettier-plugin-/.test(name) || name.startsWith("@prettier/plugin-");
23
25
  }
24
26
  function sameGenerated(source, expected) {
25
27
  try {
@@ -48,8 +50,14 @@ function migrateHealthSwitches(context, output) {
48
50
  if (value?.getText() !== "false") review(output, file, "Review custom healthCheckers; remove ESLint checkers and enable Oxlint. ESLint support is removed in 5.34.0.", property.getStartLineNumber());
49
51
  continue;
50
52
  }
51
- for (const spread of value.getProperties().filter(context.tsMorph.Node.isSpreadAssignment)) review(output, file, "Review spread healthCheckers options; set eslint: false and oxlint: true explicitly after the spread.", spread.getStartLineNumber());
52
- for (const [name, next] of [["eslint", "false"], ["oxlint", "true"]]) {
53
+ for (const spread of value.getProperties().filter(context.tsMorph.Node.isSpreadAssignment)) review(output, file, "Review spread healthCheckers options; remove eslint and enable oxlint after the spread.", spread.getStartLineNumber());
54
+ const eslint = value.getProperty("eslint");
55
+ if (!eslint) continue;
56
+ if (eslint) {
57
+ eslint.remove();
58
+ changed = true;
59
+ }
60
+ for (const [name, next] of [["oxlint", "true"]]) {
53
61
  const option = value.getProperty(name);
54
62
  if (!option) continue;
55
63
  if (!context.tsMorph.Node.isPropertyAssignment(option) || !["true", "false"].includes(option.getInitializer()?.getText() ?? "")) {
@@ -81,10 +89,13 @@ const oxcToolchain = {
81
89
  const source = context.text.read("package.json");
82
90
  if (source === void 0) return output;
83
91
  const pkg = JSON.parse(source);
84
- const legacyFiles = context.text.list().filter((file) => /^(eslint\.config\..+|\.eslintrc(?:\..+)?|\.prettierrc(?:\..+)?|prettier\.config\..+|\.prettierignore)$/.test(file));
92
+ const legacyFiles = context.text.list().filter((file) => /^(eslint\.config\..+|\.eslintrc(?:\..+)?|\.prettierrc(?:\..+)?|prettier\.config\..+|\.prettierignore|\.eslintignore)$/.test(file));
85
93
  const dependencies = [pkg.dependencies, pkg.devDependencies];
86
94
  const legacyScripts = Object.values(pkg.scripts ?? {}).some((script) => /\b(?:eslint|prettier)\b/.test(script));
87
- if (!legacyFiles.length && !legacyScripts && !dependencies.some((deps) => Object.keys(deps ?? {}).some(legacyDependency))) return output;
95
+ if (!legacyFiles.length && !legacyScripts && pkg.eslintConfig === void 0 && pkg.prettier === void 0 && !dependencies.some((deps) => Object.keys(deps ?? {}).some(legacyDependency))) {
96
+ if (/\beslint\b|EslintHealthChecker|ESLint/.test(context.text.read("warlock.config.ts") ?? "")) migrateHealthSwitches(context, output);
97
+ return output;
98
+ }
88
99
  const change = {
89
100
  line: 1,
90
101
  description: "Replace ESLint/Prettier with the default Oxlint/Oxfmt toolchain"
@@ -100,23 +111,52 @@ const oxcToolchain = {
100
111
  };
101
112
  if (/\beslint\b/.test(pkg.scripts.fix ?? "")) pkg.scripts.fix = OXC_SCRIPTS.lint;
102
113
  for (const [name, command] of Object.entries(pkg.scripts)) if (/\b(?:eslint|prettier)\b/.test(command)) review(output, "package.json", `Replace the custom ${name} script (${command}) with oxlint or oxfmt; the legacy tools have been removed from dependencies.`);
103
- context.text.write("package.json", `${JSON.stringify(pkg, null, 2)}\n`, change);
114
+ const hadOxlint = context.text.read(".oxlintrc.json") !== void 0;
104
115
  for (const file of [".oxlintrc.json", ".oxfmtrc.json"]) if (context.text.read(file) === void 0) context.text.write(file, asset(file.slice(1)), change);
116
+ if (pkg.eslintConfig !== void 0) {
117
+ const findings = output.manual.length;
118
+ if (portEslintRules(context, output, "package.json", source, hadOxlint, "eslintConfig")) pkg.devDependencies["oxlint-tsgolint"] = "7.0.2004";
119
+ if (output.manual.length === findings) delete pkg.eslintConfig;
120
+ }
121
+ if (pkg.prettier !== void 0) {
122
+ if (sameGenerated(JSON.stringify(pkg.prettier), asset("legacy-prettierrc.json"))) delete pkg.prettier;
123
+ else review(output, "package.json", "Port the custom prettier field to .oxfmtrc.json, then remove it. Prettier support is gone in 5.34.0.");
124
+ }
105
125
  for (const file of legacyFiles) {
106
126
  const content = context.text.read(file);
127
+ if (file === ".eslintignore" && content !== void 0) {
128
+ try {
129
+ const config = JSON.parse(context.text.read(".oxlintrc.json") ?? "{}");
130
+ if (!isRecord(config) || config.ignorePatterns !== void 0 && (!Array.isArray(config.ignorePatterns) || !config.ignorePatterns.every((pattern) => typeof pattern === "string"))) throw new Error("Invalid ignore patterns");
131
+ config.ignorePatterns = [.../* @__PURE__ */ new Set([...Array.isArray(config.ignorePatterns) ? config.ignorePatterns : [], ...content.split(/\r?\n/).filter((line) => line.trim() && !line.trimStart().startsWith("#"))])];
132
+ context.text.write(".oxlintrc.json", `${JSON.stringify(config, null, 2)}\n`, change);
133
+ } catch {
134
+ review(output, file, "Port these ignore patterns after repairing .oxlintrc.json; ESLint support is gone in 5.34.0.");
135
+ continue;
136
+ }
137
+ context.text.remove(file, change);
138
+ continue;
139
+ }
107
140
  const known = [
108
141
  "eslint.config.js",
109
142
  ".prettierrc.json",
110
143
  ".prettierignore"
111
144
  ].includes(file);
112
145
  if (content === void 0) continue;
113
- if (!known || !sameGenerated(content, asset(`legacy-${file.replace(/^\./, "")}`))) {
114
- review(output, file, "Customized legacy config retained. Port its rules, plugins, formatting or ignore patterns to .oxlintrc.json / .oxfmtrc.json / .oxfmtignore, then remove this file. Legacy support is removed in 5.34.0.");
146
+ const generated = known && sameGenerated(content, asset(`legacy-${file.replace(/^\./, "")}`));
147
+ if (!generated && /^(eslint\.config\..+|\.eslintrc(?:\..+)?)$/.test(file)) {
148
+ const findings = output.manual.length;
149
+ if (portEslintRules(context, output, file, content, hadOxlint)) pkg.devDependencies["oxlint-tsgolint"] = "7.0.2004";
150
+ if (output.manual.length === findings) context.text.remove(file, change);
151
+ continue;
152
+ }
153
+ if (!generated) {
154
+ review(output, file, "Port customized formatting or ignore options to .oxfmtrc.json / .oxfmtignore, then remove this file. Legacy support is gone in 5.34.0.");
115
155
  continue;
116
156
  }
117
157
  if (file === ".prettierignore") {
118
158
  const existing = context.text.read(".oxfmtignore");
119
- if (existing === void 0) context.text.write(".oxfmtignore", content, change);
159
+ if (existing === void 0) context.text.write(".oxfmtignore", `${content.trimEnd()}\n`, change);
120
160
  else if (existing.trim() !== content.trim()) {
121
161
  review(output, file, "Merge these ignore patterns into the existing .oxfmtignore, then remove .prettierignore.");
122
162
  continue;
@@ -129,14 +169,23 @@ const oxcToolchain = {
129
169
  const file = `.vscode/${name}`;
130
170
  const content = context.text.read(file);
131
171
  if (content === void 0) continue;
172
+ if (name === "settings.json" && sameGenerated(content, asset(`oxc-vscode-${name}`))) continue;
132
173
  if (name === "settings.json" && sameGenerated(content, asset(`legacy-vscode-${name}`))) context.text.write(file, asset(`oxc-vscode-${name}`), change);
133
174
  else review(output, file, "Review editor settings: select oxc.oxc-vscode as the formatter, enable source.fixAll.oxc and remove ESLint/Prettier extension recommendations.");
134
175
  }
135
176
  migrateHealthSwitches(context, output);
177
+ context.text.write("package.json", `${JSON.stringify(pkg, null, 2)}\n`, change);
136
178
  return output;
137
179
  }
138
180
  };
181
+ /** Run again for apps that skipped or partially completed the 5.33 migration. */
182
+ const oxcToolchainRemoval = {
183
+ ...oxcToolchain,
184
+ id: "oxc-toolchain-removal",
185
+ version: "5.34.0",
186
+ title: "ESLint/Prettier support is gone in 5.34.0; migrate to the Oxlint/Oxfmt default"
187
+ };
139
188
 
140
189
  //#endregion
141
- export { OXC_SCRIPTS, OXC_VERSIONS, oxcToolchain };
190
+ export { OXC_SCRIPTS, OXC_VERSIONS, oxcToolchain, oxcToolchainRemoval };
142
191
  //# sourceMappingURL=oxc-toolchain.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"oxc-toolchain.mjs","names":[],"sources":["../../../../../../../../../packages/core/src/upgrade/codemods/oxc-toolchain.ts"],"sourcesContent":["import type { Codemod, CodemodContext, CodemodOutput } from \"../types\";\nimport { TOOLCHAIN_TEMPLATES } from \"./toolchain-templates\";\n\n/** Snapshots ship with core; parity specs keep them aligned with create-warlock. */\nfunction asset(name: string): string {\n const content = TOOLCHAIN_TEMPLATES[name];\n if (content === undefined) throw new Error(`Unknown toolchain template: ${name}`);\n return content;\n}\n\nexport const OXC_VERSIONS = { oxlint: \"1.88.0\", oxfmt: \"0.73.0\", typescript: \"7.0.2\" };\nexport const OXC_SCRIPTS = {\n lint: \"oxlint --fix ./src --max-warnings=0\",\n \"lint:check\": \"oxlint ./src --max-warnings=0\",\n format: \"oxfmt --ignore-path .gitignore --ignore-path .oxfmtignore --write ./src\",\n \"format:check\": \"oxfmt --ignore-path .gitignore --ignore-path .oxfmtignore --check ./src\",\n};\n\nfunction legacyDependency(name: string): boolean {\n return (\n /^(eslint|prettier|@types\\/prettier|eslint-config-prettier)$/.test(name) ||\n name.startsWith(\"@typescript-eslint/\") ||\n /(?:^|\\/)eslint-plugin-/.test(name) ||\n /(?:^|\\/)prettier-plugin-/.test(name) ||\n name.startsWith(\"@prettier/plugin-\")\n );\n}\n\nfunction sameGenerated(source: string, expected: string): boolean {\n // JSON may have been reformatted by the app; compare its data. Executable\n // configs are deliberately exact (apart from line endings/trailing space).\n try {\n return JSON.stringify(JSON.parse(source)) === JSON.stringify(JSON.parse(expected));\n } catch {\n return source.replace(/\\r\\n/g, \"\\n\").trim() === expected.replace(/\\r\\n/g, \"\\n\").trim();\n }\n}\n\nfunction review(output: CodemodOutput, file: string, hint: string, line = 1): void {\n output.manual.push({ file, line, hint });\n}\n\nfunction migrateHealthSwitches(context: CodemodContext, output: CodemodOutput): void {\n const file = \"warlock.config.ts\";\n const source = context.text.read(file);\n if (source === undefined) return;\n const project = new context.tsMorph.Project({ useInMemoryFileSystem: true });\n const config = project.createSourceFile(file, source);\n const switches = config\n .getDescendantsOfKind(context.tsMorph.SyntaxKind.PropertyAssignment)\n .filter((property) => property.getName() === \"healthCheckers\");\n let changed = false;\n for (const property of switches) {\n const value = property.getInitializer();\n if (!value || !context.tsMorph.Node.isObjectLiteralExpression(value)) {\n if (value?.getText() !== \"false\")\n review(\n output,\n file,\n \"Review custom healthCheckers; remove ESLint checkers and enable Oxlint. ESLint support is removed in 5.34.0.\",\n property.getStartLineNumber(),\n );\n continue;\n }\n for (const spread of value.getProperties().filter(context.tsMorph.Node.isSpreadAssignment)) {\n review(\n output,\n file,\n \"Review spread healthCheckers options; set eslint: false and oxlint: true explicitly after the spread.\",\n spread.getStartLineNumber(),\n );\n }\n for (const [name, next] of [\n [\"eslint\", \"false\"],\n [\"oxlint\", \"true\"],\n ] as const) {\n const option = value.getProperty(name);\n if (!option) continue;\n if (\n !context.tsMorph.Node.isPropertyAssignment(option) ||\n ![\"true\", \"false\"].includes(option.getInitializer()?.getText() ?? \"\")\n ) {\n review(\n output,\n file,\n `Set healthCheckers.${name} to ${next} after reviewing this computed option.`,\n option.getStartLineNumber(),\n );\n continue;\n }\n if (option.getInitializer()?.getText() !== next) {\n option.setInitializer(next);\n changed = true;\n }\n }\n }\n if (changed)\n context.text.write(file, config.getFullText(), {\n line: 1,\n description: \"Select Oxlint instead of ESLint for background health checks\",\n });\n}\n\nexport const oxcToolchain: Codemod = {\n id: \"oxc-toolchain\",\n version: \"5.33.0\",\n package: \"@warlock.js/core\",\n title: \"Migrate ESLint and Prettier to Oxlint and Oxfmt\",\n skill: \"upgrade-from-5-29\",\n run(context) {\n const output: CodemodOutput = { edits: [], manual: [] };\n const source = context.text.read(\"package.json\");\n if (source === undefined) return output;\n const pkg = JSON.parse(source) as {\n scripts?: Record<string, string>;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n };\n const legacyFiles = context.text\n .list()\n .filter((file) =>\n /^(eslint\\.config\\..+|\\.eslintrc(?:\\..+)?|\\.prettierrc(?:\\..+)?|prettier\\.config\\..+|\\.prettierignore)$/.test(\n file,\n ),\n );\n const dependencies = [pkg.dependencies, pkg.devDependencies];\n const legacyScripts = Object.values(pkg.scripts ?? {}).some((script) =>\n /\\b(?:eslint|prettier)\\b/.test(script),\n );\n if (\n !legacyFiles.length &&\n !legacyScripts &&\n !dependencies.some((deps) => Object.keys(deps ?? {}).some(legacyDependency))\n )\n return output;\n\n const change = {\n line: 1,\n description: \"Replace ESLint/Prettier with the default Oxlint/Oxfmt toolchain\",\n };\n for (const deps of dependencies) {\n for (const name of Object.keys(deps ?? {})) {\n if (deps && (legacyDependency(name) || name in OXC_VERSIONS)) delete deps[name];\n }\n }\n pkg.devDependencies = { ...pkg.devDependencies, ...OXC_VERSIONS };\n pkg.scripts = { ...pkg.scripts, ...OXC_SCRIPTS };\n if (/\\beslint\\b/.test(pkg.scripts.fix ?? \"\")) pkg.scripts.fix = OXC_SCRIPTS.lint;\n for (const [name, command] of Object.entries(pkg.scripts)) {\n if (/\\b(?:eslint|prettier)\\b/.test(command))\n review(\n output,\n \"package.json\",\n `Replace the custom ${name} script (${command}) with oxlint or oxfmt; the legacy tools have been removed from dependencies.`,\n );\n }\n context.text.write(\"package.json\", `${JSON.stringify(pkg, null, 2)}\\n`, change);\n\n for (const file of [\".oxlintrc.json\", \".oxfmtrc.json\"]) {\n if (context.text.read(file) === undefined)\n context.text.write(file, asset(file.slice(1)), change);\n }\n for (const file of legacyFiles) {\n const content = context.text.read(file);\n const known = [\"eslint.config.js\", \".prettierrc.json\", \".prettierignore\"].includes(file);\n if (content === undefined) continue;\n if (!known || !sameGenerated(content, asset(`legacy-${file.replace(/^\\./, \"\")}`))) {\n review(\n output,\n file,\n \"Customized legacy config retained. Port its rules, plugins, formatting or ignore patterns to .oxlintrc.json / .oxfmtrc.json / .oxfmtignore, then remove this file. Legacy support is removed in 5.34.0.\",\n );\n continue;\n }\n if (file === \".prettierignore\") {\n const existing = context.text.read(\".oxfmtignore\");\n if (existing === undefined) context.text.write(\".oxfmtignore\", content, change);\n else if (existing.trim() !== content.trim()) {\n review(\n output,\n file,\n \"Merge these ignore patterns into the existing .oxfmtignore, then remove .prettierignore.\",\n );\n continue;\n }\n }\n context.text.remove(file, change);\n }\n // Oxfmt 0.73 uses .prettierignore by default (verified with --help).\n // Explicit script ignore paths make the migrated .oxfmtignore effective.\n if (context.text.read(\".oxfmtignore\") === undefined) {\n context.text.write(\".oxfmtignore\", \"node_modules\\ndist\\n\", change);\n }\n for (const name of [\"settings.json\", \"extensions.json\"]) {\n const file = `.vscode/${name}`;\n const content = context.text.read(file);\n if (content === undefined) continue;\n if (name === \"settings.json\" && sameGenerated(content, asset(`legacy-vscode-${name}`)))\n context.text.write(file, asset(`oxc-vscode-${name}`), change);\n else\n review(\n output,\n file,\n \"Review editor settings: select oxc.oxc-vscode as the formatter, enable source.fixAll.oxc and remove ESLint/Prettier extension recommendations.\",\n );\n }\n migrateHealthSwitches(context, output);\n return output;\n },\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"oxc-toolchain.mjs","names":[],"sources":["../../../../../../../../../packages/core/src/upgrade/codemods/oxc-toolchain.ts"],"sourcesContent":["import type { Codemod, CodemodContext, CodemodOutput } from \"../types\";\nimport { isRecord } from \"./validate-oxlint-rule\";\nimport { portEslintRules } from \"./port-eslint-rules\";\nimport { TOOLCHAIN_TEMPLATES } from \"./toolchain-templates\";\n\n/** Snapshots ship with core; parity specs keep them aligned with create-warlock. */\nfunction asset(name: string): string {\n const content = TOOLCHAIN_TEMPLATES[name];\n if (content === undefined) throw new Error(`Unknown toolchain template: ${name}`);\n return content;\n}\n\nexport const OXC_VERSIONS = { oxlint: \"1.88.0\", oxfmt: \"0.73.0\", typescript: \"7.0.2\" };\nexport const OXC_SCRIPTS = {\n lint: \"oxlint --fix ./src --max-warnings=0\",\n \"lint:check\": \"oxlint ./src --max-warnings=0\",\n format: \"oxfmt --ignore-path .gitignore --ignore-path .oxfmtignore --write ./src\",\n \"format:check\": \"oxfmt --ignore-path .gitignore --ignore-path .oxfmtignore --check ./src\",\n};\n\nfunction legacyDependency(name: string): boolean {\n return (\n /^(eslint|prettier|typescript-eslint|@types\\/prettier)$/.test(name) ||\n name.startsWith(\"@typescript-eslint/\") ||\n /(?:^|\\/)eslint-config-/.test(name) ||\n /(?:^|\\/)eslint-plugin-/.test(name) ||\n /(?:^|\\/)prettier-plugin-/.test(name) ||\n name.startsWith(\"@prettier/plugin-\")\n );\n}\n\nfunction sameGenerated(source: string, expected: string): boolean {\n // JSON may have been reformatted by the app; compare its data. Executable\n // configs are deliberately exact (apart from line endings/trailing space).\n try {\n return JSON.stringify(JSON.parse(source)) === JSON.stringify(JSON.parse(expected));\n } catch {\n return source.replace(/\\r\\n/g, \"\\n\").trim() === expected.replace(/\\r\\n/g, \"\\n\").trim();\n }\n}\n\nfunction review(output: CodemodOutput, file: string, hint: string, line = 1): void {\n output.manual.push({ file, line, hint });\n}\n\nfunction migrateHealthSwitches(context: CodemodContext, output: CodemodOutput): void {\n const file = \"warlock.config.ts\";\n const source = context.text.read(file);\n if (source === undefined) return;\n const project = new context.tsMorph.Project({ useInMemoryFileSystem: true });\n const config = project.createSourceFile(file, source);\n const switches = config\n .getDescendantsOfKind(context.tsMorph.SyntaxKind.PropertyAssignment)\n .filter((property) => property.getName() === \"healthCheckers\");\n let changed = false;\n for (const property of switches) {\n const value = property.getInitializer();\n if (!value || !context.tsMorph.Node.isObjectLiteralExpression(value)) {\n if (value?.getText() !== \"false\")\n review(\n output,\n file,\n \"Review custom healthCheckers; remove ESLint checkers and enable Oxlint. ESLint support is removed in 5.34.0.\",\n property.getStartLineNumber(),\n );\n continue;\n }\n for (const spread of value.getProperties().filter(context.tsMorph.Node.isSpreadAssignment)) {\n review(\n output,\n file,\n \"Review spread healthCheckers options; remove eslint and enable oxlint after the spread.\",\n spread.getStartLineNumber(),\n );\n }\n const eslint = value.getProperty(\"eslint\");\n if (!eslint) continue;\n if (eslint) {\n eslint.remove();\n changed = true;\n }\n for (const [name, next] of [[\"oxlint\", \"true\"]] as const) {\n const option = value.getProperty(name);\n if (!option) continue;\n if (\n !context.tsMorph.Node.isPropertyAssignment(option) ||\n ![\"true\", \"false\"].includes(option.getInitializer()?.getText() ?? \"\")\n ) {\n review(\n output,\n file,\n `Set healthCheckers.${name} to ${next} after reviewing this computed option.`,\n option.getStartLineNumber(),\n );\n continue;\n }\n if (option.getInitializer()?.getText() !== next) {\n option.setInitializer(next);\n changed = true;\n }\n }\n }\n if (changed)\n context.text.write(file, config.getFullText(), {\n line: 1,\n description: \"Select Oxlint instead of ESLint for background health checks\",\n });\n}\n\nexport const oxcToolchain: Codemod = {\n id: \"oxc-toolchain\",\n version: \"5.33.0\",\n package: \"@warlock.js/core\",\n title: \"Migrate ESLint and Prettier to Oxlint and Oxfmt\",\n skill: \"upgrade-from-5-29\",\n run(context) {\n const output: CodemodOutput = { edits: [], manual: [] };\n const source = context.text.read(\"package.json\");\n if (source === undefined) return output;\n const pkg = JSON.parse(source) as {\n scripts?: Record<string, string>;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n eslintConfig?: unknown;\n prettier?: unknown;\n };\n const legacyFiles = context.text\n .list()\n .filter((file) =>\n /^(eslint\\.config\\..+|\\.eslintrc(?:\\..+)?|\\.prettierrc(?:\\..+)?|prettier\\.config\\..+|\\.prettierignore|\\.eslintignore)$/.test(\n file,\n ),\n );\n const dependencies = [pkg.dependencies, pkg.devDependencies];\n const legacyScripts = Object.values(pkg.scripts ?? {}).some((script) =>\n /\\b(?:eslint|prettier)\\b/.test(script),\n );\n if (\n !legacyFiles.length &&\n !legacyScripts &&\n pkg.eslintConfig === undefined &&\n pkg.prettier === undefined &&\n !dependencies.some((deps) => Object.keys(deps ?? {}).some(legacyDependency))\n ) {\n if (\n /\\beslint\\b|EslintHealthChecker|ESLint/.test(context.text.read(\"warlock.config.ts\") ?? \"\")\n )\n migrateHealthSwitches(context, output);\n return output;\n }\n\n const change = {\n line: 1,\n description: \"Replace ESLint/Prettier with the default Oxlint/Oxfmt toolchain\",\n };\n for (const deps of dependencies) {\n for (const name of Object.keys(deps ?? {})) {\n if (deps && (legacyDependency(name) || name in OXC_VERSIONS)) delete deps[name];\n }\n }\n pkg.devDependencies = { ...pkg.devDependencies, ...OXC_VERSIONS };\n pkg.scripts = { ...pkg.scripts, ...OXC_SCRIPTS };\n if (/\\beslint\\b/.test(pkg.scripts.fix ?? \"\")) pkg.scripts.fix = OXC_SCRIPTS.lint;\n for (const [name, command] of Object.entries(pkg.scripts)) {\n if (/\\b(?:eslint|prettier)\\b/.test(command))\n review(\n output,\n \"package.json\",\n `Replace the custom ${name} script (${command}) with oxlint or oxfmt; the legacy tools have been removed from dependencies.`,\n );\n }\n\n const hadOxlint = context.text.read(\".oxlintrc.json\") !== undefined;\n for (const file of [\".oxlintrc.json\", \".oxfmtrc.json\"]) {\n if (context.text.read(file) === undefined)\n context.text.write(file, asset(file.slice(1)), change);\n }\n if (pkg.eslintConfig !== undefined) {\n const findings = output.manual.length;\n if (portEslintRules(context, output, \"package.json\", source, hadOxlint, \"eslintConfig\"))\n pkg.devDependencies[\"oxlint-tsgolint\"] = \"7.0.2004\";\n if (output.manual.length === findings) delete pkg.eslintConfig;\n }\n if (pkg.prettier !== undefined) {\n if (sameGenerated(JSON.stringify(pkg.prettier), asset(\"legacy-prettierrc.json\")))\n delete pkg.prettier;\n else\n review(\n output,\n \"package.json\",\n \"Port the custom prettier field to .oxfmtrc.json, then remove it. Prettier support is gone in 5.34.0.\",\n );\n }\n for (const file of legacyFiles) {\n const content = context.text.read(file);\n if (file === \".eslintignore\" && content !== undefined) {\n try {\n const config: unknown = JSON.parse(context.text.read(\".oxlintrc.json\") ?? \"{}\");\n if (\n !isRecord(config) ||\n (config.ignorePatterns !== undefined &&\n (!Array.isArray(config.ignorePatterns) ||\n !config.ignorePatterns.every((pattern) => typeof pattern === \"string\")))\n )\n throw new Error(\"Invalid ignore patterns\");\n config.ignorePatterns = [\n ...new Set([\n ...(Array.isArray(config.ignorePatterns) ? config.ignorePatterns : []),\n ...content\n .split(/\\r?\\n/)\n .filter((line) => line.trim() && !line.trimStart().startsWith(\"#\")),\n ]),\n ];\n context.text.write(\".oxlintrc.json\", `${JSON.stringify(config, null, 2)}\\n`, change);\n } catch {\n review(\n output,\n file,\n \"Port these ignore patterns after repairing .oxlintrc.json; ESLint support is gone in 5.34.0.\",\n );\n continue;\n }\n context.text.remove(file, change);\n continue;\n }\n const known = [\"eslint.config.js\", \".prettierrc.json\", \".prettierignore\"].includes(file);\n if (content === undefined) continue;\n const generated = known && sameGenerated(content, asset(`legacy-${file.replace(/^\\./, \"\")}`));\n if (!generated && /^(eslint\\.config\\..+|\\.eslintrc(?:\\..+)?)$/.test(file)) {\n const findings = output.manual.length;\n if (portEslintRules(context, output, file, content, hadOxlint))\n pkg.devDependencies[\"oxlint-tsgolint\"] = \"7.0.2004\";\n // Keep the source only when there is still something a person must translate.\n if (output.manual.length === findings) context.text.remove(file, change);\n continue;\n }\n if (!generated) {\n review(\n output,\n file,\n \"Port customized formatting or ignore options to .oxfmtrc.json / .oxfmtignore, then remove this file. Legacy support is gone in 5.34.0.\",\n );\n continue;\n }\n if (file === \".prettierignore\") {\n const existing = context.text.read(\".oxfmtignore\");\n if (existing === undefined)\n context.text.write(\".oxfmtignore\", `${content.trimEnd()}\\n`, change);\n else if (existing.trim() !== content.trim()) {\n review(\n output,\n file,\n \"Merge these ignore patterns into the existing .oxfmtignore, then remove .prettierignore.\",\n );\n continue;\n }\n }\n context.text.remove(file, change);\n }\n // Oxfmt 0.73 uses .prettierignore by default (verified with --help).\n // Explicit script ignore paths make the migrated .oxfmtignore effective.\n if (context.text.read(\".oxfmtignore\") === undefined) {\n context.text.write(\".oxfmtignore\", \"node_modules\\ndist\\n\", change);\n }\n for (const name of [\"settings.json\", \"extensions.json\"]) {\n const file = `.vscode/${name}`;\n const content = context.text.read(file);\n if (content === undefined) continue;\n if (name === \"settings.json\" && sameGenerated(content, asset(`oxc-vscode-${name}`))) continue;\n if (name === \"settings.json\" && sameGenerated(content, asset(`legacy-vscode-${name}`)))\n context.text.write(file, asset(`oxc-vscode-${name}`), change);\n else\n review(\n output,\n file,\n \"Review editor settings: select oxc.oxc-vscode as the formatter, enable source.fixAll.oxc and remove ESLint/Prettier extension recommendations.\",\n );\n }\n migrateHealthSwitches(context, output);\n context.text.write(\"package.json\", `${JSON.stringify(pkg, null, 2)}\\n`, change);\n return output;\n },\n};\n\n/** Run again for apps that skipped or partially completed the 5.33 migration. */\nexport const oxcToolchainRemoval: Codemod = {\n ...oxcToolchain,\n id: \"oxc-toolchain-removal\",\n version: \"5.34.0\",\n title: \"ESLint/Prettier support is gone in 5.34.0; migrate to the Oxlint/Oxfmt default\",\n};\n"],"mappings":"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"}