biome-to-oxc 0.6.2 → 0.7.2

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 (64) hide show
  1. package/README.md +40 -24
  2. package/dist/bin/biome-to-oxc.mjs +13 -32
  3. package/dist/bin/biome-to-oxc.mjs.map +1 -1
  4. package/dist/magic-string.es-1uTtupLe.mjs +1014 -0
  5. package/dist/magic-string.es-1uTtupLe.mjs.map +1 -0
  6. package/dist/src/advanced-detection.d.mts +2 -2
  7. package/dist/src/advanced-detection.d.mts.map +1 -1
  8. package/dist/src/advanced-detection.mjs +5 -4
  9. package/dist/src/advanced-detection.mjs.map +1 -1
  10. package/dist/src/config-loader.d.mts.map +1 -1
  11. package/dist/src/config-loader.mjs +3 -3
  12. package/dist/src/config-loader.mjs.map +1 -1
  13. package/dist/src/eslint-detector.d.mts.map +1 -1
  14. package/dist/src/eslint-detector.mjs.map +1 -1
  15. package/dist/src/formatter-mapper.mjs +2 -2
  16. package/dist/src/formatter-mapper.mjs.map +1 -1
  17. package/dist/src/index.d.mts.map +1 -1
  18. package/dist/src/index.mjs +34 -22
  19. package/dist/src/index.mjs.map +1 -1
  20. package/dist/src/js-plugin-scaffolder.d.mts +3 -1
  21. package/dist/src/js-plugin-scaffolder.d.mts.map +1 -1
  22. package/dist/src/js-plugin-scaffolder.mjs +37 -2
  23. package/dist/src/js-plugin-scaffolder.mjs.map +1 -1
  24. package/dist/src/js-plugin-scaffolder.test.d.mts +1 -0
  25. package/dist/src/js-plugin-scaffolder.test.mjs +39 -0
  26. package/dist/src/js-plugin-scaffolder.test.mjs.map +1 -0
  27. package/dist/src/overrides-transformer.mjs.map +1 -1
  28. package/dist/src/oxfmt-overrides.mjs +1 -1
  29. package/dist/src/oxfmt-overrides.mjs.map +1 -1
  30. package/dist/src/oxlint-generator.d.mts +2 -2
  31. package/dist/src/oxlint-generator.d.mts.map +1 -1
  32. package/dist/src/oxlint-generator.mjs +6 -6
  33. package/dist/src/oxlint-generator.mjs.map +1 -1
  34. package/dist/src/package-updater.d.mts +1 -0
  35. package/dist/src/package-updater.d.mts.map +1 -1
  36. package/dist/src/package-updater.mjs +22 -21
  37. package/dist/src/package-updater.mjs.map +1 -1
  38. package/dist/src/package-updater.test.d.mts +1 -0
  39. package/dist/src/package-updater.test.mjs +79 -0
  40. package/dist/src/package-updater.test.mjs.map +1 -0
  41. package/dist/src/prettier-detector.d.mts.map +1 -1
  42. package/dist/src/prettier-detector.mjs.map +1 -1
  43. package/dist/src/report-writer.d.mts.map +1 -1
  44. package/dist/src/report-writer.mjs +2 -2
  45. package/dist/src/report-writer.mjs.map +1 -1
  46. package/dist/src/reporter.d.mts.map +1 -1
  47. package/dist/src/reporter.mjs.map +1 -1
  48. package/dist/src/rule-mapper.d.mts +1 -1
  49. package/dist/src/rule-mapper.d.mts.map +1 -1
  50. package/dist/src/rule-mapper.mjs +73 -5
  51. package/dist/src/rule-mapper.mjs.map +1 -1
  52. package/dist/src/rule-mapper.test.d.mts +1 -0
  53. package/dist/src/rule-mapper.test.mjs +108 -0
  54. package/dist/src/rule-mapper.test.mjs.map +1 -0
  55. package/dist/src/schema-normalizer.d.mts.map +1 -1
  56. package/dist/src/schema-normalizer.mjs.map +1 -1
  57. package/dist/src/turbo-updater.d.mts.map +1 -1
  58. package/dist/src/turbo-updater.mjs +3 -3
  59. package/dist/src/turbo-updater.mjs.map +1 -1
  60. package/dist/src/types.d.mts +47 -46
  61. package/dist/src/types.d.mts.map +1 -1
  62. package/dist/test.BwzWwv9M-PFbm26Y0.mjs +13259 -0
  63. package/dist/test.BwzWwv9M-PFbm26Y0.mjs.map +1 -0
  64. package/package.json +9 -6
package/README.md CHANGED
@@ -57,9 +57,12 @@ If a Biome rule has no native Oxlint equivalent yet, migration reports now surfa
57
57
 
58
58
  - Detects TypeScript usage
59
59
  - Provides `oxlint-tsgolint` installation guidance
60
- - Supports profile-based guidance:
61
- - `standard`: `oxlint --type-aware`
62
- - `strict`: `oxlint --type-aware --type-check`
60
+ - Supports explicit typed lint flags:
61
+ - `--type-aware`: `oxlint --type-aware`
62
+ - `--type-check` (implies `--type-aware`): `oxlint --type-aware --type-check`
63
+ - Supports profile-based compatibility guidance:
64
+ - `--type-aware-profile standard`: `oxlint --type-aware`
65
+ - `--type-aware-profile strict`: `oxlint --type-aware --type-check`
63
66
  - Surfaces alpha stability + TS compatibility caveats
64
67
 
65
68
  ✅ **Turborepo Integration** (`--turborepo`)
@@ -133,6 +136,9 @@ If a Biome rule has no native Oxlint equivalent yet, migration reports now surfa
133
136
  - `safe` → `--fix`
134
137
  - `suggestions` → `--fix --fix-suggestions`
135
138
  - `dangerous` → `--fix --fix-suggestions --fix-dangerously`
139
+ - Robust Biome fix conversion when rewriting scripts:
140
+ - `biome ... --write` maps to at least `safe`
141
+ - `biome ... --write --unsafe` maps to at least `dangerous`
136
142
 
137
143
  ## Installation
138
144
 
@@ -169,6 +175,7 @@ Options:
169
175
  --no-backup Skip backup of existing config files
170
176
  --update-scripts Update package.json scripts to use oxlint/oxfmt
171
177
  --type-aware Include type-aware linting guidance and dependencies
178
+ --type-check Enable strict typed linting mode (implies --type-aware)
172
179
  --type-aware-profile Type-aware profile: standard | strict
173
180
  --fix-strategy Fix mode for rewritten scripts: safe | suggestions | dangerous
174
181
  --js-plugins Emit jsPlugins scaffold for unsupported mappings
@@ -194,7 +201,7 @@ npx biome-to-oxc --dry-run --verbose
194
201
  npx biome-to-oxc --update-scripts
195
202
 
196
203
  # Full migration with all integrations
197
- npx biome-to-oxc --update-scripts --type-aware --type-aware-profile strict --fix-strategy suggestions --import-graph --js-plugins --js-plugin eslint-plugin-playwright --turborepo --eslint-bridge --prettier
204
+ npx biome-to-oxc --update-scripts --type-check --fix-strategy suggestions --import-graph --js-plugins --js-plugin eslint-plugin-playwright --turborepo --eslint-bridge --prettier
198
205
 
199
206
  # Generate detailed JSON report
200
207
  npx biome-to-oxc --report migration-report.json
@@ -211,6 +218,9 @@ npx biome-to-oxc --turborepo --update-scripts
211
218
  # TypeScript project with type-aware linting
212
219
  npx biome-to-oxc --type-aware --verbose
213
220
 
221
+ # TypeScript project with type-check diagnostics
222
+ npx biome-to-oxc --type-check --verbose
223
+
214
224
  # Strict type-aware profile + dangerous script fix strategy
215
225
  npx biome-to-oxc --type-aware --type-aware-profile strict --update-scripts --fix-strategy dangerous
216
226
 
@@ -307,11 +317,14 @@ npx biome-to-oxc --import-graph --import-cycle-max-depth 5
307
317
 
308
318
  # Run with type-aware rules
309
319
  npx oxlint --type-aware
310
-
311
- # Strict profile (include TS compiler diagnostics)
312
- npx oxlint --type-aware --type-check
313
320
  ```
314
321
 
322
+ # Strict profile (include TS compiler diagnostics)
323
+
324
+ npx oxlint --type-aware --type-check
325
+
326
+ ```
327
+
315
328
  ## Known Limitations
316
329
 
317
330
  - Not all Biome rules have direct Oxlint equivalents (warnings will be shown)
@@ -327,35 +340,38 @@ npx biome-to-oxc --import-graph --import-cycle-max-depth 5
327
340
  After migration, you'll see a comprehensive summary:
328
341
 
329
342
  ```
343
+
330
344
  ✓ Migration completed successfully!
331
345
 
332
346
  Summary:
333
- Biome config: /path/to/biome.json
334
- Oxlint config: /path/to/.oxlintrc.json
335
- Oxfmt config: /path/to/.oxfmtrc.jsonc
336
- Rules converted: 42
337
- Rules skipped: 3
338
- Linter overrides: 2
339
- Formatter overrides: 1
347
+ Biome config: /path/to/biome.json
348
+ Oxlint config: /path/to/.oxlintrc.json
349
+ Oxfmt config: /path/to/.oxfmtrc.jsonc
350
+ Rules converted: 42
351
+ Rules skipped: 3
352
+ Linter overrides: 2
353
+ Formatter overrides: 1
340
354
 
341
355
  🔍 Detected integrations: typescript, turborepo
342
356
 
343
357
  ⚠ Warnings (3):
344
- Run with --verbose to see all warnings
358
+ Run with --verbose to see all warnings
345
359
 
346
360
  💡 Suggestions:
347
- 5 suggestions available. Run with --verbose to see them.
361
+ 5 suggestions available. Run with --verbose to see them.
348
362
 
349
363
  📝 Next steps:
350
- 1. Review the generated .oxlintrc.json and .oxfmtrc.jsonc files
351
- 2. Install dependencies: pnpm add -D oxlint oxfmt
352
- 3. Run oxlint to lint your code
353
- 4. Run oxfmt to format your code
354
- 5. Update your CI/CD pipelines to use oxlint and oxfmt
355
- 6. Consider running with --update-scripts to update package.json
364
+
365
+ 1. Review the generated .oxlintrc.json and .oxfmtrc.jsonc files
366
+ 2. Install dependencies: pnpm add -D oxlint oxfmt
367
+ 3. Run oxlint to lint your code
368
+ 4. Run oxfmt to format your code
369
+ 5. Update your CI/CD pipelines to use oxlint and oxfmt
370
+ 6. Consider running with --update-scripts to update package.json
356
371
 
357
372
  📊 Detailed report saved to: migration-report.json
358
- ```
373
+
374
+ ````
359
375
 
360
376
  ### JSON Report Format
361
377
 
@@ -383,7 +399,7 @@ When using `--report`, a detailed JSON file is generated:
383
399
  "typescript": true
384
400
  }
385
401
  }
386
- ```
402
+ ````
387
403
 
388
404
  ## Troubleshooting
389
405
 
@@ -18,6 +18,7 @@ const MigrationOptionsSchema = z.object({
18
18
  updateScripts: z.boolean().default(false),
19
19
  verbose: z.boolean().default(false),
20
20
  typeAware: z.boolean().default(false),
21
+ typeCheck: z.boolean().default(false),
21
22
  typeAwareProfile: z.enum(["standard", "strict"]).default("standard"),
22
23
  fixStrategy: z.enum([
23
24
  "safe",
@@ -50,7 +51,7 @@ process.on("uncaughtException", (error) => {
50
51
  process.exit(1);
51
52
  });
52
53
  async function main() {
53
- program.name("biome-to-oxc").version(packageJson.version).description(packageJson.description).option("-c, --config <path>", "Path to biome.json or biome.jsonc").option("-o, --output-dir <path>", "Output directory for generated configs").option("--dry-run", "Show what would be done without making changes").option("--no-backup", "Skip backup of existing config files").option("--update-scripts", "Update package.json scripts to use oxlint/oxfmt").option("--type-aware", "Include type-aware linting guidance and dependencies").option("--type-aware-profile <profile>", "Type-aware profile: standard (--type-aware) or strict (--type-aware --type-check)", "standard").option("--fix-strategy <strategy>", "Fix mode for rewritten scripts: safe | suggestions | dangerous", "safe").option("--js-plugins", "Emit jsPlugins scaffold when unsupported rules are detected").option("--js-plugin <specifier>", "JS plugin specifier to scaffold (repeatable). Example: eslint-plugin-playwright", (value, previous = []) => {
54
+ program.name("biome-to-oxc").version(packageJson.version).description(packageJson.description).option("-c, --config <path>", "Path to biome.json or biome.jsonc").option("-o, --output-dir <path>", "Output directory for generated configs").option("--dry-run", "Show what would be done without making changes").option("--no-backup", "Skip backup of existing config files").option("--update-scripts", "Update package.json scripts to use oxlint/oxfmt").option("--type-aware", "Include type-aware linting guidance and dependencies").option("--type-check", "Enable strict typed linting mode (implies --type-aware)").option("--type-aware-profile <profile>", "Type-aware profile: standard (--type-aware) or strict (--type-aware --type-check)", "standard").option("--fix-strategy <strategy>", "Fix mode for rewritten scripts: safe | suggestions | dangerous", "safe").option("--js-plugins", "Emit jsPlugins scaffold when unsupported rules are detected").option("--js-plugin <specifier>", "JS plugin specifier to scaffold (repeatable). Example: eslint-plugin-playwright", (value, previous = []) => {
54
55
  previous.push(value);
55
56
  return previous;
56
57
  }, []).option("--import-graph", "Add import graph baseline (import/no-cycle) to generated Oxlint config").option("--import-cycle-max-depth <depth>", "Max depth for import/no-cycle when --import-graph is enabled", (value) => Number.parseInt(value, 10), 3).option("--turborepo", "Detect and update turbo.json for Turborepo integration").option("--eslint-bridge", "Provide ESLint bridge suggestions for running alongside ESLint").option("--prettier", "Detect Prettier config and provide migration suggestions").option("--report <path>", "Write detailed JSON migration report to specified path").option("-v, --verbose", "Show detailed migration information").action(async (rawOptions) => {
@@ -59,6 +60,11 @@ async function main() {
59
60
  ...rawOptions,
60
61
  noBackup: !rawOptions.backup
61
62
  };
63
+ const profile = opts.typeAwareProfile ?? "standard";
64
+ const derivedTypeCheck = (opts.typeCheck ?? false) || profile === "strict";
65
+ const derivedTypeAware = (opts.typeAware ?? false) || derivedTypeCheck;
66
+ opts.typeCheck = derivedTypeCheck;
67
+ opts.typeAware = derivedTypeAware;
62
68
  delete opts.backup;
63
69
  const validationResult = MigrationOptionsSchema.safeParse(opts);
64
70
  if (!validationResult.success) {
@@ -70,33 +76,8 @@ async function main() {
70
76
  }
71
77
  const migrationOptions = validationResult.data;
72
78
  const report = await migrate(migrationOptions);
73
- if (report.success) {
74
- migrationOptions.dryRun;
75
- if (report.packageJson) {
76
- const pkg = report.packageJson;
77
- if (!pkg.found) {} else if (!pkg.changed) {} else {
78
- for (const removal of pkg.dependenciesRemoved);
79
- const devDepChanges = pkg.devDependencies.filter((change) => change.action !== "already-present");
80
- for (const change of devDepChanges) if (change.action === "added") {}
81
- for (const _scriptChange of pkg.scriptsUpdated);
82
- }
83
- if (pkg.found && migrationOptions.updateScripts && pkg.scriptsUpdated.length === 0) {}
84
- }
85
- if (report.detectedIntegrations) {
86
- if (Object.entries(report.detectedIntegrations).filter(([_, detected]) => detected).map(([name]) => name).length > 0) {}
87
- }
88
- if (report.warnings.length > 0) {
89
- if (migrationOptions.verbose) report.warnings.forEach((w) => {});
90
- }
91
- if (report.suggestions.length > 0) {
92
- if (migrationOptions.verbose) report.suggestions.forEach((s) => {});
93
- }
94
- if (!migrationOptions.updateScripts) {}
95
- if (migrationOptions.report) {
96
- if (migrationOptions.dryRun) {}
97
- }
98
- process.exit(0);
99
- } else {
79
+ if (report.success) process.exit(0);
80
+ else {
100
81
  console.error(pc.red("\n✖ Migration failed."));
101
82
  if (report.errors.length > 0) {
102
83
  console.error(pc.red(`Errors (${report.errors.length}):`));
@@ -106,16 +87,16 @@ async function main() {
106
87
  }
107
88
  process.exit(1);
108
89
  }
109
- } catch (error) {
90
+ } catch (err) {
110
91
  console.error(pc.red("\n✖ Unexpected error during migration:"));
111
- console.error(error instanceof Error ? error.stack : error);
92
+ console.error(err instanceof Error ? err.stack : err);
112
93
  process.exit(1);
113
94
  }
114
95
  });
115
96
  await program.parseAsync(process.argv);
116
97
  }
117
- main().catch((error) => {
118
- console.error(pc.red("✖ Fatal error:"), error);
98
+ main().catch((err) => {
99
+ console.error(pc.red("✖ Fatal error:"), err);
119
100
  process.exit(1);
120
101
  });
121
102
 
@@ -1 +1 @@
1
- {"version":3,"file":"biome-to-oxc.mjs","names":[],"sources":["../../bin/biome-to-oxc.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { program } from 'commander';\nimport pc from 'picocolors';\nimport { z } from 'zod';\nimport { migrate } from '../src/index.js';\nimport type { MigrationOptions } from '../src/types.js';\n\nconst packageJson = {\n name: 'biome-to-oxc',\n version: '0.1.0',\n description: 'Migrate from Biome to Oxc ecosystem (oxlint + oxfmt)',\n};\n\n// Zod schema for runtime validation\nconst MigrationOptionsSchema = z.object({\n configPath: z.string().optional(),\n outputDir: z.string().optional(),\n dryRun: z.boolean().default(false),\n noBackup: z.boolean().default(false),\n updateScripts: z.boolean().default(false),\n verbose: z.boolean().default(false),\n typeAware: z.boolean().default(false),\n typeAwareProfile: z.enum(['standard', 'strict']).default('standard'),\n fixStrategy: z.enum(['safe', 'suggestions', 'dangerous']).default('safe'),\n jsPlugins: z.boolean().default(false),\n jsPlugin: z.array(z.string()).optional(),\n importGraph: z.boolean().default(false),\n importCycleMaxDepth: z.number().int().positive().default(3),\n turborepo: z.boolean().default(false),\n eslintBridge: z.boolean().default(false),\n prettier: z.boolean().default(false),\n report: z.string().optional(),\n});\n\n// Handle interrupt signals\nconst handleSignal = (signal: string, code: number) => {\n console.error(pc.red(`\\n✖ Received ${signal}, exiting...`));\n process.exit(code);\n};\n\nprocess.on('SIGINT', () => handleSignal('SIGINT', 130));\nprocess.on('SIGTERM', () => handleSignal('SIGTERM', 143));\n\nprocess.on('unhandledRejection', (reason) => {\n console.error(pc.red('\\n✖ Unhandled Promise Rejection:'));\n console.error(reason);\n process.exit(1);\n});\n\nprocess.on('uncaughtException', (error) => {\n console.error(pc.red('\\n✖ Uncaught Exception:'));\n console.error(error);\n process.exit(1);\n});\n\nasync function main() {\n program\n .name('biome-to-oxc')\n .version(packageJson.version)\n .description(packageJson.description)\n .option('-c, --config <path>', 'Path to biome.json or biome.jsonc')\n .option('-o, --output-dir <path>', 'Output directory for generated configs')\n .option('--dry-run', 'Show what would be done without making changes')\n .option('--no-backup', 'Skip backup of existing config files')\n .option('--update-scripts', 'Update package.json scripts to use oxlint/oxfmt')\n .option('--type-aware', 'Include type-aware linting guidance and dependencies')\n .option(\n '--type-aware-profile <profile>',\n 'Type-aware profile: standard (--type-aware) or strict (--type-aware --type-check)',\n 'standard',\n )\n .option(\n '--fix-strategy <strategy>',\n 'Fix mode for rewritten scripts: safe | suggestions | dangerous',\n 'safe',\n )\n .option('--js-plugins', 'Emit jsPlugins scaffold when unsupported rules are detected')\n .option(\n '--js-plugin <specifier>',\n 'JS plugin specifier to scaffold (repeatable). Example: eslint-plugin-playwright',\n (value: string, previous: string[] = []) => {\n previous.push(value);\n return previous;\n },\n [],\n )\n .option('--import-graph', 'Add import graph baseline (import/no-cycle) to generated Oxlint config')\n .option(\n '--import-cycle-max-depth <depth>',\n 'Max depth for import/no-cycle when --import-graph is enabled',\n (value: string) => Number.parseInt(value, 10),\n 3,\n )\n .option('--turborepo', 'Detect and update turbo.json for Turborepo integration')\n .option('--eslint-bridge', 'Provide ESLint bridge suggestions for running alongside ESLint')\n .option('--prettier', 'Detect Prettier config and provide migration suggestions')\n .option('--report <path>', 'Write detailed JSON migration report to specified path')\n .option('-v, --verbose', 'Show detailed migration information')\n .action(async (rawOptions) => {\n try {\n // Normalize options (commander transforms --no-backup to backup: false, we need to map it back)\n const opts = {\n ...rawOptions,\n noBackup: !rawOptions.backup, // map from commander's negation\n };\n // Remove the auxiliary backup prop from commander\n delete opts.backup;\n\n const validationResult = MigrationOptionsSchema.safeParse(opts);\n\n if (!validationResult.success) {\n console.error(pc.red('✖ Invalid options:'));\n validationResult.error.issues.forEach((err: z.ZodIssue) => {\n console.error(` - ${err.path.join('.')}: ${err.message}`);\n });\n process.exit(1);\n }\n\n const migrationOptions: MigrationOptions = validationResult.data;\n\n const report = await migrate(migrationOptions);\n\n if (report.success) {\n const dryRun = migrationOptions.dryRun ?? false;\n\n\n\n\n\n\n\n\n\n if (report.packageJson) {\n const pkg = report.packageJson;\n\n\n if (!pkg.found) {\n\n } else if (!pkg.changed) {\n\n } else {\n for (const removal of pkg.dependenciesRemoved) {\n\n\n }\n\n const devDepChanges = pkg.devDependencies.filter(\n (change) => change.action !== 'already-present',\n );\n\n for (const change of devDepChanges) {\n if (change.action === 'added') {\n\n } else {\n\n\n }\n }\n\n for (const _scriptChange of pkg.scriptsUpdated) {\n\n }\n }\n\n if (pkg.found && migrationOptions.updateScripts && pkg.scriptsUpdated.length === 0) {\n\n }\n }\n\n if (report.detectedIntegrations) {\n const integrations = Object.entries(report.detectedIntegrations)\n .filter(([_, detected]) => detected)\n .map(([name]) => name);\n\n if (integrations.length > 0) {\n\n\n }\n }\n\n if (report.warnings.length > 0) {\n\n if (migrationOptions.verbose) {\n report.warnings.forEach((w) => {\n\n });\n } else {\n\n }\n }\n\n if (report.suggestions.length > 0) {\n\n if (migrationOptions.verbose) {\n report.suggestions.forEach((s) => {\n\n });\n } else {\n\n }\n }\n\n if (!migrationOptions.updateScripts) {\n\n }\n\n if (migrationOptions.report) {\n if (migrationOptions.dryRun) {\n\n } else {\n\n }\n }\n\n process.exit(0);\n } else {\n console.error(pc.red('\\n✖ Migration failed.'));\n\n if (report.errors.length > 0) {\n console.error(pc.red(`Errors (${report.errors.length}):`));\n report.errors.forEach((e) => {\n console.error(` - ${e}`);\n });\n }\n\n process.exit(1);\n }\n } catch (error) {\n console.error(pc.red('\\n✖ Unexpected error during migration:'));\n console.error(error instanceof Error ? error.stack : error);\n process.exit(1);\n }\n });\n\n await program.parseAsync(process.argv);\n}\n\nmain().catch((error) => {\n console.error(pc.red('✖ Fatal error:'), error);\n process.exit(1);\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"biome-to-oxc.mjs","names":[],"sources":["../../bin/biome-to-oxc.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { program } from 'commander'\nimport pc from 'picocolors'\nimport { z } from 'zod'\n\nimport { migrate } from '../src/index.js'\nimport type { MigrationOptions } from '../src/types.js'\n\nconst packageJson = {\n name: 'biome-to-oxc',\n version: '0.1.0',\n description: 'Migrate from Biome to Oxc ecosystem (oxlint + oxfmt)',\n}\n\n// Zod schema for runtime validation\nconst MigrationOptionsSchema = z.object({\n configPath: z.string().optional(),\n outputDir: z.string().optional(),\n dryRun: z.boolean().default(false),\n noBackup: z.boolean().default(false),\n updateScripts: z.boolean().default(false),\n verbose: z.boolean().default(false),\n typeAware: z.boolean().default(false),\n typeCheck: z.boolean().default(false),\n typeAwareProfile: z.enum(['standard', 'strict']).default('standard'),\n fixStrategy: z.enum(['safe', 'suggestions', 'dangerous']).default('safe'),\n jsPlugins: z.boolean().default(false),\n jsPlugin: z.array(z.string()).optional(),\n importGraph: z.boolean().default(false),\n importCycleMaxDepth: z.number().int().positive().default(3),\n turborepo: z.boolean().default(false),\n eslintBridge: z.boolean().default(false),\n prettier: z.boolean().default(false),\n report: z.string().optional(),\n})\n\n// Handle interrupt signals\nconst handleSignal = (signal: string, code: number) => {\n console.error(pc.red(`\\n✖ Received ${signal}, exiting...`))\n process.exit(code)\n}\n\nprocess.on('SIGINT', () => handleSignal('SIGINT', 130))\nprocess.on('SIGTERM', () => handleSignal('SIGTERM', 143))\n\nprocess.on('unhandledRejection', (reason) => {\n console.error(pc.red('\\n✖ Unhandled Promise Rejection:'))\n console.error(reason)\n process.exit(1)\n})\n\nprocess.on('uncaughtException', (error) => {\n console.error(pc.red('\\n✖ Uncaught Exception:'))\n console.error(error)\n process.exit(1)\n})\n\nasync function main() {\n program\n .name('biome-to-oxc')\n .version(packageJson.version)\n .description(packageJson.description)\n .option('-c, --config <path>', 'Path to biome.json or biome.jsonc')\n .option('-o, --output-dir <path>', 'Output directory for generated configs')\n .option('--dry-run', 'Show what would be done without making changes')\n .option('--no-backup', 'Skip backup of existing config files')\n .option('--update-scripts', 'Update package.json scripts to use oxlint/oxfmt')\n .option('--type-aware', 'Include type-aware linting guidance and dependencies')\n .option('--type-check', 'Enable strict typed linting mode (implies --type-aware)')\n .option(\n '--type-aware-profile <profile>',\n 'Type-aware profile: standard (--type-aware) or strict (--type-aware --type-check)',\n 'standard',\n )\n .option(\n '--fix-strategy <strategy>',\n 'Fix mode for rewritten scripts: safe | suggestions | dangerous',\n 'safe',\n )\n .option('--js-plugins', 'Emit jsPlugins scaffold when unsupported rules are detected')\n .option(\n '--js-plugin <specifier>',\n 'JS plugin specifier to scaffold (repeatable). Example: eslint-plugin-playwright',\n (value: string, previous: string[] = []) => {\n previous.push(value)\n return previous\n },\n [],\n )\n .option(\n '--import-graph',\n 'Add import graph baseline (import/no-cycle) to generated Oxlint config',\n )\n .option(\n '--import-cycle-max-depth <depth>',\n 'Max depth for import/no-cycle when --import-graph is enabled',\n (value: string) => Number.parseInt(value, 10),\n 3,\n )\n .option('--turborepo', 'Detect and update turbo.json for Turborepo integration')\n .option('--eslint-bridge', 'Provide ESLint bridge suggestions for running alongside ESLint')\n .option('--prettier', 'Detect Prettier config and provide migration suggestions')\n .option('--report <path>', 'Write detailed JSON migration report to specified path')\n .option('-v, --verbose', 'Show detailed migration information')\n .action(async (rawOptions) => {\n try {\n // Normalize options (commander transforms --no-backup to backup: false, we need to map it back)\n const opts = {\n ...rawOptions,\n noBackup: !rawOptions.backup, // map from commander's negation\n }\n\n const profile = opts.typeAwareProfile ?? 'standard'\n const derivedTypeCheck = (opts.typeCheck ?? false) || profile === 'strict'\n const derivedTypeAware = (opts.typeAware ?? false) || derivedTypeCheck\n\n opts.typeCheck = derivedTypeCheck\n opts.typeAware = derivedTypeAware\n\n // Remove the auxiliary backup prop from commander\n delete opts.backup\n\n const validationResult = MigrationOptionsSchema.safeParse(opts)\n\n if (!validationResult.success) {\n console.error(pc.red('✖ Invalid options:'))\n validationResult.error.issues.forEach((err: z.ZodIssue) => {\n console.error(` - ${err.path.join('.')}: ${err.message}`)\n })\n process.exit(1)\n }\n\n const migrationOptions: MigrationOptions = validationResult.data\n\n const report = await migrate(migrationOptions)\n\n if (report.success) {\n\n\n\n\n\n\n\n\n process.exit(0)\n } else {\n console.error(pc.red('\\n✖ Migration failed.'))\n\n if (report.errors.length > 0) {\n console.error(pc.red(`Errors (${report.errors.length}):`))\n report.errors.forEach((e) => {\n console.error(` - ${e}`)\n })\n }\n\n process.exit(1)\n }\n } catch (err) {\n console.error(pc.red('\\n✖ Unexpected error during migration:'))\n console.error(err instanceof Error ? err.stack : err)\n process.exit(1)\n }\n })\n\n await program.parseAsync(process.argv)\n}\n\nmain().catch((err) => {\n console.error(pc.red('✖ Fatal error:'), err)\n process.exit(1)\n})\n"],"mappings":"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"}