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.
- package/README.md +40 -24
- package/dist/bin/biome-to-oxc.mjs +13 -32
- package/dist/bin/biome-to-oxc.mjs.map +1 -1
- package/dist/magic-string.es-1uTtupLe.mjs +1014 -0
- package/dist/magic-string.es-1uTtupLe.mjs.map +1 -0
- package/dist/src/advanced-detection.d.mts +2 -2
- package/dist/src/advanced-detection.d.mts.map +1 -1
- package/dist/src/advanced-detection.mjs +5 -4
- package/dist/src/advanced-detection.mjs.map +1 -1
- package/dist/src/config-loader.d.mts.map +1 -1
- package/dist/src/config-loader.mjs +3 -3
- package/dist/src/config-loader.mjs.map +1 -1
- package/dist/src/eslint-detector.d.mts.map +1 -1
- package/dist/src/eslint-detector.mjs.map +1 -1
- package/dist/src/formatter-mapper.mjs +2 -2
- package/dist/src/formatter-mapper.mjs.map +1 -1
- package/dist/src/index.d.mts.map +1 -1
- package/dist/src/index.mjs +34 -22
- package/dist/src/index.mjs.map +1 -1
- package/dist/src/js-plugin-scaffolder.d.mts +3 -1
- package/dist/src/js-plugin-scaffolder.d.mts.map +1 -1
- package/dist/src/js-plugin-scaffolder.mjs +37 -2
- package/dist/src/js-plugin-scaffolder.mjs.map +1 -1
- package/dist/src/js-plugin-scaffolder.test.d.mts +1 -0
- package/dist/src/js-plugin-scaffolder.test.mjs +39 -0
- package/dist/src/js-plugin-scaffolder.test.mjs.map +1 -0
- package/dist/src/overrides-transformer.mjs.map +1 -1
- package/dist/src/oxfmt-overrides.mjs +1 -1
- package/dist/src/oxfmt-overrides.mjs.map +1 -1
- package/dist/src/oxlint-generator.d.mts +2 -2
- package/dist/src/oxlint-generator.d.mts.map +1 -1
- package/dist/src/oxlint-generator.mjs +6 -6
- package/dist/src/oxlint-generator.mjs.map +1 -1
- package/dist/src/package-updater.d.mts +1 -0
- package/dist/src/package-updater.d.mts.map +1 -1
- package/dist/src/package-updater.mjs +22 -21
- package/dist/src/package-updater.mjs.map +1 -1
- package/dist/src/package-updater.test.d.mts +1 -0
- package/dist/src/package-updater.test.mjs +79 -0
- package/dist/src/package-updater.test.mjs.map +1 -0
- package/dist/src/prettier-detector.d.mts.map +1 -1
- package/dist/src/prettier-detector.mjs.map +1 -1
- package/dist/src/report-writer.d.mts.map +1 -1
- package/dist/src/report-writer.mjs +2 -2
- package/dist/src/report-writer.mjs.map +1 -1
- package/dist/src/reporter.d.mts.map +1 -1
- package/dist/src/reporter.mjs.map +1 -1
- package/dist/src/rule-mapper.d.mts +1 -1
- package/dist/src/rule-mapper.d.mts.map +1 -1
- package/dist/src/rule-mapper.mjs +73 -5
- package/dist/src/rule-mapper.mjs.map +1 -1
- package/dist/src/rule-mapper.test.d.mts +1 -0
- package/dist/src/rule-mapper.test.mjs +108 -0
- package/dist/src/rule-mapper.test.mjs.map +1 -0
- package/dist/src/schema-normalizer.d.mts.map +1 -1
- package/dist/src/schema-normalizer.mjs.map +1 -1
- package/dist/src/turbo-updater.d.mts.map +1 -1
- package/dist/src/turbo-updater.mjs +3 -3
- package/dist/src/turbo-updater.mjs.map +1 -1
- package/dist/src/types.d.mts +47 -46
- package/dist/src/types.d.mts.map +1 -1
- package/dist/test.BwzWwv9M-PFbm26Y0.mjs +13259 -0
- package/dist/test.BwzWwv9M-PFbm26Y0.mjs.map +1 -0
- 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
|
|
61
|
-
-
|
|
62
|
-
- `
|
|
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-
|
|
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
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
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
|
-
|
|
358
|
+
Run with --verbose to see all warnings
|
|
345
359
|
|
|
346
360
|
💡 Suggestions:
|
|
347
|
-
|
|
361
|
+
5 suggestions available. Run with --verbose to see them.
|
|
348
362
|
|
|
349
363
|
📝 Next steps:
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
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
|
-
|
|
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 (
|
|
90
|
+
} catch (err) {
|
|
110
91
|
console.error(pc.red("\n✖ Unexpected error during migration:"));
|
|
111
|
-
console.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((
|
|
118
|
-
console.error(pc.red("✖ Fatal 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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"}
|