biome-to-oxc 0.4.1 → 0.5.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.
@@ -26,6 +26,7 @@ const MigrationOptionsSchema = z.object({
26
26
  report: z.string().optional()
27
27
  });
28
28
  const handleSignal = (signal, code) => {
29
+ console.error(pc.red(`\n✖ Received ${signal}, exiting...`));
29
30
  process.exit(code);
30
31
  };
31
32
  process.on("SIGINT", () => handleSignal("SIGINT", 130));
@@ -51,7 +52,7 @@ async function main() {
51
52
  const validationResult = MigrationOptionsSchema.safeParse(opts);
52
53
  if (!validationResult.success) {
53
54
  console.error(pc.red("✖ Invalid options:"));
54
- validationResult.error.errors.forEach((err) => {
55
+ validationResult.error.issues.forEach((err) => {
55
56
  console.error(` - ${err.path.join(".")}: ${err.message}`);
56
57
  });
57
58
  process.exit(1);
@@ -59,20 +60,67 @@ async function main() {
59
60
  const migrationOptions = validationResult.data;
60
61
  const report = await migrate(migrationOptions);
61
62
  if (report.success) {
63
+ const dryRun = migrationOptions.dryRun ?? false;
64
+ const heading = dryRun ? "✔ Migration preview" : "✔ Migration complete";
65
+ console.log(pc.green(`\n${heading}`));
66
+ console.log(pc.cyan(`\nConfiguration output${dryRun ? " (planned)" : ""}:`));
67
+ console.log(` ${dryRun ? "Would create" : "Created"} Oxlint config: ${report.summary.oxlintConfigPath}`);
68
+ console.log(` ${dryRun ? "Would create" : "Created"} Oxfmt config: ${report.summary.oxfmtConfigPath}`);
69
+ console.log(` Lint rules converted: ${report.summary.rulesConverted} (skipped: ${report.summary.rulesSkipped})`);
70
+ console.log(` Overrides converted: ${report.summary.overridesConverted} (formatter overrides: ${report.summary.formatterOverridesConverted})`);
71
+ if (report.packageJson) {
72
+ const pkg = report.packageJson;
73
+ console.log(pc.cyan(`\npackage.json updates${pkg.dryRun ? " (planned)" : ""}:`));
74
+ if (!pkg.found) console.log(" package.json not found; dependency and script updates skipped.");
75
+ else if (!pkg.changed) console.log(" No package.json changes needed.");
76
+ else {
77
+ for (const removal of pkg.dependenciesRemoved) {
78
+ const versionLabel = removal.version ? ` (${removal.version})` : "";
79
+ console.log(` ${pkg.dryRun ? "Would remove" : "Removed"} ${removal.name} from ${removal.dependencyType}${versionLabel}`);
80
+ }
81
+ const devDepChanges = pkg.devDependencies.filter((change) => change.action !== "already-present");
82
+ for (const change of devDepChanges) if (change.action === "added") console.log(` ${pkg.dryRun ? "Would add" : "Added"} devDependency ${change.name}@${change.to}`);
83
+ else {
84
+ const fromVersion = change.from ?? "unknown";
85
+ console.log(` ${pkg.dryRun ? "Would update" : "Updated"} devDependency ${change.name} ${fromVersion} → ${change.to}`);
86
+ }
87
+ for (const scriptChange of pkg.scriptsUpdated) console.log(` ${pkg.dryRun ? "Would update" : "Updated"} script "${scriptChange.name}": ${scriptChange.before} → ${scriptChange.after}`);
88
+ }
89
+ if (pkg.found && migrationOptions.updateScripts && pkg.scriptsUpdated.length === 0) console.log(" No Biome scripts found to update.");
90
+ }
62
91
  if (report.detectedIntegrations) {
63
- if (Object.entries(report.detectedIntegrations).filter(([_, detected]) => detected).map(([name]) => name).length > 0) {}
92
+ const integrations = Object.entries(report.detectedIntegrations).filter(([_, detected]) => detected).map(([name]) => name);
93
+ if (integrations.length > 0) {
94
+ console.log(pc.cyan("\nDetected integrations:"));
95
+ console.log(` ${integrations.join(", ")}`);
96
+ }
64
97
  }
65
98
  if (report.warnings.length > 0) {
66
- if (migrationOptions.verbose) report.warnings.forEach((w) => {});
99
+ console.log(pc.yellow(`\nWarnings (${report.warnings.length}):`));
100
+ if (migrationOptions.verbose) report.warnings.forEach((w) => {
101
+ console.log(` - ${w}`);
102
+ });
103
+ else console.log(" Run with --verbose to see all warning details.");
67
104
  }
68
105
  if (report.suggestions.length > 0) {
69
- if (migrationOptions.verbose) report.suggestions.forEach((s) => {});
106
+ console.log(pc.cyan(`\nNext steps (${report.suggestions.length}):`));
107
+ if (migrationOptions.verbose) report.suggestions.forEach((s) => {
108
+ console.log(` - ${s}`);
109
+ });
110
+ else console.log(" Run with --verbose to see all suggestions.");
70
111
  }
71
- if (!migrationOptions.updateScripts) {}
72
- if (migrationOptions.report) {}
112
+ if (!migrationOptions.updateScripts) console.log(pc.dim("\nNote: Script updates were skipped (use --update-scripts to enable)."));
113
+ if (migrationOptions.report) if (migrationOptions.dryRun) console.log(pc.dim(`\nReport output skipped in dry-run mode: ${migrationOptions.report}`));
114
+ else console.log(pc.green(`\nDetailed report written to: ${migrationOptions.report}`));
73
115
  process.exit(0);
74
116
  } else {
75
- if (report.errors.length > 0) report.errors.forEach((e) => {});
117
+ console.error(pc.red("\n✖ Migration failed."));
118
+ if (report.errors.length > 0) {
119
+ console.error(pc.red(`Errors (${report.errors.length}):`));
120
+ report.errors.forEach((e) => {
121
+ console.error(` - ${e}`);
122
+ });
123
+ }
76
124
  process.exit(1);
77
125
  }
78
126
  } catch (error) {
@@ -81,7 +129,7 @@ async function main() {
81
129
  process.exit(1);
82
130
  }
83
131
  });
84
- await program.parseAsync();
132
+ await program.parseAsync(process.argv);
85
133
  }
86
134
  main().catch((error) => {
87
135
  console.error(pc.red("✖ Fatal error:"), error);
@@ -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 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 \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('--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 \n\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.errors.forEach((err) => {\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 \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 if (report.warnings.length > 0) {\n \n if (migrationOptions.verbose) {\n report.warnings.forEach((w) => {});\n } else {\n \n }\n }\n\n if (report.suggestions.length > 0) {\n \n if (migrationOptions.verbose) {\n report.suggestions.forEach((s) => {});\n } else {\n \n }\n }\n\n \n \n \n \n \n \n\n if (!migrationOptions.updateScripts) {\n \n }\n\n if (migrationOptions.report) {\n \n }\n\n process.exit(0);\n } else {\n \n\n if (report.errors.length > 0) {\n \n report.errors.forEach((e) => {});\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();\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';\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 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('--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 const heading = dryRun ? '✔ Migration preview' : '✔ Migration complete';\n console.log(pc.green(`\\n${heading}`));\n\n console.log(pc.cyan(`\\nConfiguration output${dryRun ? ' (planned)' : ''}:`));\n console.log(\n ` ${dryRun ? 'Would create' : 'Created'} Oxlint config: ${report.summary.oxlintConfigPath}`,\n );\n console.log(\n ` ${dryRun ? 'Would create' : 'Created'} Oxfmt config: ${report.summary.oxfmtConfigPath}`,\n );\n console.log(\n ` Lint rules converted: ${report.summary.rulesConverted} (skipped: ${report.summary.rulesSkipped})`,\n );\n console.log(\n ` Overrides converted: ${report.summary.overridesConverted} (formatter overrides: ${report.summary.formatterOverridesConverted})`,\n );\n\n if (report.packageJson) {\n const pkg = report.packageJson;\n console.log(pc.cyan(`\\npackage.json updates${pkg.dryRun ? ' (planned)' : ''}:`));\n\n if (!pkg.found) {\n console.log(' package.json not found; dependency and script updates skipped.');\n } else if (!pkg.changed) {\n console.log(' No package.json changes needed.');\n } else {\n for (const removal of pkg.dependenciesRemoved) {\n const versionLabel = removal.version ? ` (${removal.version})` : '';\n console.log(\n ` ${pkg.dryRun ? 'Would remove' : 'Removed'} ${removal.name} from ${removal.dependencyType}${versionLabel}`,\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 console.log(\n ` ${pkg.dryRun ? 'Would add' : 'Added'} devDependency ${change.name}@${change.to}`,\n );\n } else {\n const fromVersion = change.from ?? 'unknown';\n console.log(\n ` ${pkg.dryRun ? 'Would update' : 'Updated'} devDependency ${change.name} ${fromVersion} → ${change.to}`,\n );\n }\n }\n\n for (const scriptChange of pkg.scriptsUpdated) {\n console.log(\n ` ${pkg.dryRun ? 'Would update' : 'Updated'} script \"${scriptChange.name}\": ${scriptChange.before} → ${scriptChange.after}`,\n );\n }\n }\n\n if (pkg.found && migrationOptions.updateScripts && pkg.scriptsUpdated.length === 0) {\n console.log(' No Biome scripts found to update.');\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 console.log(pc.cyan('\\nDetected integrations:'));\n console.log(` ${integrations.join(', ')}`);\n }\n }\n\n if (report.warnings.length > 0) {\n console.log(pc.yellow(`\\nWarnings (${report.warnings.length}):`));\n if (migrationOptions.verbose) {\n report.warnings.forEach((w) => {\n console.log(` - ${w}`);\n });\n } else {\n console.log(' Run with --verbose to see all warning details.');\n }\n }\n\n if (report.suggestions.length > 0) {\n console.log(pc.cyan(`\\nNext steps (${report.suggestions.length}):`));\n if (migrationOptions.verbose) {\n report.suggestions.forEach((s) => {\n console.log(` - ${s}`);\n });\n } else {\n console.log(' Run with --verbose to see all suggestions.');\n }\n }\n\n if (!migrationOptions.updateScripts) {\n console.log(pc.dim('\\nNote: Script updates were skipped (use --update-scripts to enable).'));\n }\n\n if (migrationOptions.report) {\n if (migrationOptions.dryRun) {\n console.log(pc.dim(`\\nReport output skipped in dry-run mode: ${migrationOptions.report}`));\n } else {\n console.log(pc.green(`\\nDetailed report written to: ${migrationOptions.report}`));\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});"],"mappings":"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"}
@@ -0,0 +1,162 @@
1
+ import { resolve } from "node:path";
2
+ import { existsSync, readFileSync, writeFileSync } from "node:fs";
3
+
4
+ //#region src/package-updater.ts
5
+ const OXLINT_VERSION = "^1.43.0";
6
+ const OXFMT_VERSION = "^0.28.0";
7
+ function updatePackageJson(projectDir, reporter, dryRun, options = {}) {
8
+ const packageJsonPath = resolve(projectDir, "package.json");
9
+ const summary = {
10
+ packageJsonPath,
11
+ found: false,
12
+ dryRun,
13
+ scriptsUpdated: [],
14
+ dependenciesRemoved: [],
15
+ devDependencies: [],
16
+ changed: false
17
+ };
18
+ if (!existsSync(packageJsonPath)) {
19
+ reporter.warn("package.json not found, skipping dependency and script updates");
20
+ return summary;
21
+ }
22
+ try {
23
+ summary.found = true;
24
+ const content = readFileSync(packageJsonPath, "utf-8");
25
+ const packageJson = JSON.parse(content);
26
+ let modified = false;
27
+ if ((options.updateScripts ?? false) && packageJson.scripts) modified = updateScripts(packageJson.scripts, reporter, summary.scriptsUpdated) || modified;
28
+ if (packageJson.devDependencies) modified = removeBiomeDependency(packageJson.devDependencies, "devDependencies", summary.dependenciesRemoved, reporter) || modified;
29
+ if (packageJson.dependencies) modified = removeBiomeDependency(packageJson.dependencies, "dependencies", summary.dependenciesRemoved, reporter) || modified;
30
+ if (!packageJson.devDependencies) packageJson.devDependencies = {};
31
+ modified = ensureDevDependency(packageJson.devDependencies, "oxlint", OXLINT_VERSION, summary.devDependencies) || modified;
32
+ modified = ensureDevDependency(packageJson.devDependencies, "oxfmt", OXFMT_VERSION, summary.devDependencies) || modified;
33
+ summary.changed = modified;
34
+ if (modified && !dryRun) {
35
+ writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2) + "\n", "utf-8");
36
+ reporter.info("Updated package.json");
37
+ } else if (modified && dryRun) reporter.info("Would update package.json (dry-run mode)");
38
+ return summary;
39
+ } catch (error) {
40
+ const message = error instanceof Error ? error.message : String(error);
41
+ reporter.error(`Failed to update package.json: ${message}`);
42
+ return summary;
43
+ }
44
+ }
45
+ function updateScripts(scripts, reporter, updates) {
46
+ let modified = false;
47
+ for (const [name, script] of Object.entries(scripts)) {
48
+ let newScript = stripExecBiome(script);
49
+ let updated = false;
50
+ for (const mapping of [
51
+ {
52
+ command: "check",
53
+ check: "oxlint && oxfmt --check",
54
+ fix: "oxlint --fix && oxfmt"
55
+ },
56
+ {
57
+ command: "ci",
58
+ check: "oxlint && oxfmt --check",
59
+ fix: "oxlint --fix && oxfmt"
60
+ },
61
+ {
62
+ command: "lint",
63
+ check: "oxlint",
64
+ fix: "oxlint --fix"
65
+ },
66
+ {
67
+ command: "format",
68
+ check: "oxfmt --check",
69
+ fix: "oxfmt"
70
+ }
71
+ ]) {
72
+ const result = replaceBiomeCommand(newScript, mapping.command, mapping.check, mapping.fix);
73
+ if (result.didReplace) updated = true;
74
+ newScript = result.updated;
75
+ }
76
+ if (updated) {
77
+ modified = true;
78
+ reporter.info(`Updated script "${name}" to use oxlint/oxfmt equivalents`);
79
+ }
80
+ if (newScript !== script) {
81
+ scripts[name] = newScript;
82
+ updates.push({
83
+ name,
84
+ before: script,
85
+ after: newScript
86
+ });
87
+ }
88
+ }
89
+ return modified;
90
+ }
91
+ function replaceBiomeCommand(script, command, checkReplacement, fixReplacement) {
92
+ let didReplace = false;
93
+ const regex = new RegExp(`\\bbiome\\s+${command}\\b([^&|]*)`, "g");
94
+ return {
95
+ updated: script.replace(regex, (_match, args) => {
96
+ didReplace = true;
97
+ const hasFix = /\s--(write|fix)\b/.test(args);
98
+ const cleanedArgs = args.replace(/\s--(write|fix)\b/g, "").trim();
99
+ const suffix = cleanedArgs.length > 0 ? ` ${cleanedArgs}` : "";
100
+ return applySuffixToCommands(hasFix ? fixReplacement : checkReplacement, suffix);
101
+ }),
102
+ didReplace
103
+ };
104
+ }
105
+ function applySuffixToCommands(replacement, suffix) {
106
+ if (!suffix) return replacement;
107
+ if (!replacement.includes("&&")) return `${replacement}${suffix}`;
108
+ return replacement.split("&&").map((part) => `${part.trim()}${suffix}`).join(" && ");
109
+ }
110
+ function stripExecBiome(script) {
111
+ return script.replace(/(^|[;&|()]|&&|\|\|)\s*exec\s+biome\b/g, (_match, prefix) => {
112
+ if (!prefix) return "biome";
113
+ return `${prefix}${prefix.length > 0 ? " " : ""}biome`;
114
+ });
115
+ }
116
+ function removeBiomeDependency(dependencies, dependencyType, removals, reporter) {
117
+ let modified = false;
118
+ if (dependencies["@biomejs/biome"]) {
119
+ const version = dependencies["@biomejs/biome"];
120
+ delete dependencies["@biomejs/biome"];
121
+ modified = true;
122
+ removals.push({
123
+ name: "@biomejs/biome",
124
+ dependencyType,
125
+ version
126
+ });
127
+ reporter.info(`Removed @biomejs/biome from ${dependencyType}`);
128
+ }
129
+ return modified;
130
+ }
131
+ function ensureDevDependency(dependencies, name, version, changes) {
132
+ const existing = dependencies[name];
133
+ if (!existing) {
134
+ dependencies[name] = version;
135
+ changes.push({
136
+ name,
137
+ action: "added",
138
+ to: version
139
+ });
140
+ return true;
141
+ }
142
+ if (existing !== version) {
143
+ dependencies[name] = version;
144
+ changes.push({
145
+ name,
146
+ action: "updated",
147
+ from: existing,
148
+ to: version
149
+ });
150
+ return true;
151
+ }
152
+ changes.push({
153
+ name,
154
+ action: "already-present",
155
+ to: existing
156
+ });
157
+ return false;
158
+ }
159
+
160
+ //#endregion
161
+ export { updatePackageJson as t };
162
+ //# sourceMappingURL=package-updater-DcxTVTb3.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-updater-DcxTVTb3.mjs","names":[],"sources":["../src/package-updater.ts"],"sourcesContent":["import { readFileSync, writeFileSync, existsSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport type {\n PackageDependencyRemoval,\n PackageDevDependencyChange,\n PackageScriptUpdate,\n PackageUpdateSummary,\n Reporter,\n} from './types.js';\n\ntype PackageJson = {\n scripts?: Record<string, string>;\n devDependencies?: Record<string, string>;\n dependencies?: Record<string, string>;\n [key: string]: unknown;\n};\n\nconst OXLINT_VERSION = '^1.43.0';\nconst OXFMT_VERSION = '^0.28.0';\n\nexport function updatePackageJson(\n projectDir: string,\n reporter: Reporter,\n dryRun: boolean,\n options: { updateScripts?: boolean } = {},\n): PackageUpdateSummary {\n const packageJsonPath = resolve(projectDir, 'package.json');\n const summary: PackageUpdateSummary = {\n packageJsonPath,\n found: false,\n dryRun,\n scriptsUpdated: [],\n dependenciesRemoved: [],\n devDependencies: [],\n changed: false,\n };\n\n if (!existsSync(packageJsonPath)) {\n reporter.warn('package.json not found, skipping dependency and script updates');\n return summary;\n }\n\n try {\n summary.found = true;\n const content = readFileSync(packageJsonPath, 'utf-8');\n const packageJson: PackageJson = JSON.parse(content);\n\n let modified = false;\n const updateScriptsEnabled = options.updateScripts ?? false;\n\n if (updateScriptsEnabled && packageJson.scripts) {\n modified =\n updateScripts(packageJson.scripts, reporter, summary.scriptsUpdated) || modified;\n }\n\n if (packageJson.devDependencies) {\n modified =\n removeBiomeDependency(\n packageJson.devDependencies,\n 'devDependencies',\n summary.dependenciesRemoved,\n reporter,\n ) || modified;\n }\n\n if (packageJson.dependencies) {\n modified =\n removeBiomeDependency(\n packageJson.dependencies,\n 'dependencies',\n summary.dependenciesRemoved,\n reporter,\n ) || modified;\n }\n\n if (!packageJson.devDependencies) {\n packageJson.devDependencies = {};\n }\n\n modified =\n ensureDevDependency(\n packageJson.devDependencies,\n 'oxlint',\n OXLINT_VERSION,\n summary.devDependencies,\n ) || modified;\n modified =\n ensureDevDependency(\n packageJson.devDependencies,\n 'oxfmt',\n OXFMT_VERSION,\n summary.devDependencies,\n ) || modified;\n\n summary.changed = modified;\n\n if (modified && !dryRun) {\n writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2) + '\\n', 'utf-8');\n reporter.info('Updated package.json');\n } else if (modified && dryRun) {\n reporter.info('Would update package.json (dry-run mode)');\n }\n\n return summary;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n reporter.error(`Failed to update package.json: ${message}`);\n return summary;\n }\n}\n\nfunction updateScripts(\n scripts: Record<string, string>,\n reporter: Reporter,\n updates: PackageScriptUpdate[],\n): boolean {\n let modified = false;\n\n for (const [name, script] of Object.entries(scripts)) {\n let newScript = stripExecBiome(script);\n let updated = false;\n\n const replacements = [\n {\n command: 'check',\n check: 'oxlint && oxfmt --check',\n fix: 'oxlint --fix && oxfmt',\n },\n {\n command: 'ci',\n check: 'oxlint && oxfmt --check',\n fix: 'oxlint --fix && oxfmt',\n },\n {\n command: 'lint',\n check: 'oxlint',\n fix: 'oxlint --fix',\n },\n {\n command: 'format',\n check: 'oxfmt --check',\n fix: 'oxfmt',\n },\n ];\n\n for (const mapping of replacements) {\n const result = replaceBiomeCommand(newScript, mapping.command, mapping.check, mapping.fix);\n if (result.didReplace) {\n updated = true;\n }\n newScript = result.updated;\n }\n\n if (updated) {\n modified = true;\n reporter.info(`Updated script \"${name}\" to use oxlint/oxfmt equivalents`);\n }\n\n if (newScript !== script) {\n scripts[name] = newScript;\n updates.push({ name, before: script, after: newScript });\n }\n }\n\n return modified;\n}\n\nfunction replaceBiomeCommand(\n script: string,\n command: string,\n checkReplacement: string,\n fixReplacement: string,\n): { updated: string; didReplace: boolean } {\n let didReplace = false;\n const regex = new RegExp(`\\\\bbiome\\\\s+${command}\\\\b([^&|]*)`, 'g');\n const updated = script.replace(regex, (_match, args: string) => {\n didReplace = true;\n const hasFix = /\\s--(write|fix)\\b/.test(args);\n const cleanedArgs = args.replace(/\\s--(write|fix)\\b/g, '').trim();\n const suffix = cleanedArgs.length > 0 ? ` ${cleanedArgs}` : '';\n const replacement = hasFix ? fixReplacement : checkReplacement;\n return applySuffixToCommands(replacement, suffix);\n });\n\n return { updated, didReplace };\n}\n\nfunction applySuffixToCommands(replacement: string, suffix: string): string {\n if (!suffix) {\n return replacement;\n }\n\n if (!replacement.includes('&&')) {\n return `${replacement}${suffix}`;\n }\n\n return replacement\n .split('&&')\n .map((part) => `${part.trim()}${suffix}`)\n .join(' && ');\n}\n\nfunction stripExecBiome(script: string): string {\n const execBiomePattern = /(^|[;&|()]|&&|\\|\\|)\\s*exec\\s+biome\\b/g;\n return script.replace(execBiomePattern, (_match, prefix: string) => {\n if (!prefix) {\n return 'biome';\n }\n\n const spacer = prefix.length > 0 ? ' ' : '';\n return `${prefix}${spacer}biome`;\n });\n}\n\nfunction removeBiomeDependency(\n dependencies: Record<string, string>,\n dependencyType: PackageDependencyRemoval['dependencyType'],\n removals: PackageDependencyRemoval[],\n reporter: Reporter,\n): boolean {\n let modified = false;\n\n if (dependencies['@biomejs/biome']) {\n const version = dependencies['@biomejs/biome'];\n delete dependencies['@biomejs/biome'];\n modified = true;\n removals.push({ name: '@biomejs/biome', dependencyType, version });\n reporter.info(`Removed @biomejs/biome from ${dependencyType}`);\n }\n\n return modified;\n}\n\nfunction ensureDevDependency(\n dependencies: Record<string, string>,\n name: string,\n version: string,\n changes: PackageDevDependencyChange[],\n): boolean {\n const existing = dependencies[name];\n\n if (!existing) {\n dependencies[name] = version;\n changes.push({ name, action: 'added', to: version });\n return true;\n }\n\n if (existing !== version) {\n dependencies[name] = version;\n changes.push({ name, action: 'updated', from: existing, to: version });\n return true;\n }\n\n changes.push({ name, action: 'already-present', to: existing });\n return false;\n}\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
- import { BiomeConfig, BiomeCssConfig, BiomeFilesConfig, BiomeFormatterConfig, BiomeJavaScriptConfig, BiomeJsonConfig, BiomeLinterConfig, BiomeLinterRules, BiomeOverride, BiomeRuleGroup, BiomeRuleSeverity, BiomeVcsConfig, MigrationOptions, MigrationReport, OxfmtConfig, OxfmtOverride, OxlintConfig, OxlintOverride, OxlintRuleSeverity, Reporter } from "./types.mjs";
1
+ import { BiomeConfig, BiomeCssConfig, BiomeFilesConfig, BiomeFormatterConfig, BiomeJavaScriptConfig, BiomeJsonConfig, BiomeLinterConfig, BiomeLinterRules, BiomeOverride, BiomeRuleGroup, BiomeRuleSeverity, BiomeVcsConfig, MigrationOptions, MigrationReport, OxfmtConfig, OxfmtOverride, OxlintConfig, OxlintOverride, OxlintRuleSeverity, PackageDependencyRemoval, PackageDevDependencyChange, PackageScriptUpdate, PackageUpdateSummary, Reporter } from "./types.mjs";
2
2
 
3
3
  //#region src/index.d.ts
4
4
  declare function migrate(options?: MigrationOptions): Promise<MigrationReport>;
5
5
  //#endregion
6
- export { BiomeConfig, BiomeCssConfig, BiomeFilesConfig, BiomeFormatterConfig, BiomeJavaScriptConfig, BiomeJsonConfig, BiomeLinterConfig, BiomeLinterRules, BiomeOverride, BiomeRuleGroup, BiomeRuleSeverity, BiomeVcsConfig, MigrationOptions, MigrationReport, OxfmtConfig, OxfmtOverride, OxlintConfig, OxlintOverride, OxlintRuleSeverity, Reporter, migrate };
6
+ export { BiomeConfig, BiomeCssConfig, BiomeFilesConfig, BiomeFormatterConfig, BiomeJavaScriptConfig, BiomeJsonConfig, BiomeLinterConfig, BiomeLinterRules, BiomeOverride, BiomeRuleGroup, BiomeRuleSeverity, BiomeVcsConfig, MigrationOptions, MigrationReport, OxfmtConfig, OxfmtOverride, OxlintConfig, OxlintOverride, OxlintRuleSeverity, PackageDependencyRemoval, PackageDevDependencyChange, PackageScriptUpdate, PackageUpdateSummary, Reporter, migrate };
7
7
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/index.ts"],"mappings":";;;iBAuCsB,OAAA,CAAQ,OAAA,GAAS,gBAAA,GAAwB,OAAA,CAAQ,eAAA"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/index.ts"],"mappings":";;;iBAwCsB,OAAA,CAAQ,OAAA,GAAS,gBAAA,GAAwB,OAAA,CAAQ,eAAA"}
@@ -4,7 +4,7 @@ import { t as generateOxlintConfig } from "../oxlint-generator-L7ui1BHE.mjs";
4
4
  import { t as generateOxfmtConfig } from "../formatter-mapper-BMQ4nHqQ.mjs";
5
5
  import { t as transformOverridesToOxlint } from "../overrides-transformer-D8lb8ijd.mjs";
6
6
  import { t as generateOxfmtOverrides } from "../oxfmt-overrides-BJtFUPt9.mjs";
7
- import { t as updatePackageJson } from "../package-updater-B-XgYVeR.mjs";
7
+ import { t as updatePackageJson } from "../package-updater-DcxTVTb3.mjs";
8
8
  import { n as generateTurborepoSuggestions, r as updateTurboConfig, t as detectTurborepo } from "../turbo-updater-3b20rC36.mjs";
9
9
  import { n as generateESLintBridgeSuggestions, r as generateESLintFormatterBridgeSuggestions, t as detectESLint } from "../eslint-detector-CiNY3vrg.mjs";
10
10
  import { n as generatePrettierMigrationSuggestions, t as detectPrettier } from "../prettier-detector-aLE389_O.mjs";
@@ -87,18 +87,20 @@ async function migrate(options = {}) {
87
87
  }
88
88
  const featureSuggestions = generateFeatureSpecificSuggestions(projectFeatures);
89
89
  if (featureSuggestions.length > 0) suggestions.push(...featureSuggestions);
90
+ let packageJsonSummary;
90
91
  if (!options.dryRun) {
91
92
  if (!options.noBackup) await backupExistingConfigs(oxlintConfigPath, oxfmtConfigPath, reporter);
92
93
  await writeFile(oxlintConfigPath, JSON.stringify(oxlintConfig, null, 2) + "\n", "utf-8");
93
94
  reporter.info(`Created Oxlint config: ${oxlintConfigPath}`);
94
95
  await writeFile(oxfmtConfigPath, JSON.stringify(oxfmtConfig, null, 2) + "\n", "utf-8");
95
96
  reporter.info(`Created Oxfmt config: ${oxfmtConfigPath}`);
96
- if (options.updateScripts) updatePackageJson(outputDir, reporter, false);
97
+ packageJsonSummary = updatePackageJson(outputDir, reporter, false, { updateScripts: options.updateScripts });
97
98
  if (options.turborepo && detectedIntegrations.turborepo) updateTurboConfig(outputDir, reporter, false);
98
99
  } else {
99
100
  reporter.info("Dry-run mode: No files will be written");
100
101
  reporter.info(`Would create: ${oxlintConfigPath}`);
101
102
  reporter.info(`Would create: ${oxfmtConfigPath}`);
103
+ packageJsonSummary = updatePackageJson(outputDir, reporter, true, { updateScripts: options.updateScripts });
102
104
  if (options.verbose) {}
103
105
  }
104
106
  const rulesConverted = Object.keys(oxlintConfig.rules || {}).length;
@@ -117,6 +119,7 @@ async function migrate(options = {}) {
117
119
  overridesConverted,
118
120
  formatterOverridesConverted: formatterOverridesCount
119
121
  },
122
+ packageJson: packageJsonSummary,
120
123
  detectedIntegrations
121
124
  };
122
125
  if (options.report && !options.dryRun) writeReportToFile(report, resolve(outputDir, options.report), reporter);
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../src/index.ts"],"sourcesContent":["import { writeFile, rename, stat } from 'node:fs/promises';\nimport { resolve, dirname } from 'node:path';\nimport type {\n BiomeConfig,\n MigrationOptions,\n MigrationReport,\n OxlintConfig,\n OxfmtConfig,\n} from './types.js';\nimport { DefaultReporter } from './reporter.js';\nimport { findBiomeConfig, loadBiomeConfig, resolveBiomeExtends } from './config-loader.js';\nimport { generateOxlintConfig } from './oxlint-generator.js';\nimport { generateOxfmtConfig } from './formatter-mapper.js';\nimport { transformOverridesToOxlint } from './overrides-transformer.js';\nimport { generateOxfmtOverrides } from './oxfmt-overrides.js';\nimport { updatePackageJson } from './package-updater.js';\nimport {\n detectTurborepo,\n updateTurboConfig,\n generateTurborepoSuggestions,\n} from './turbo-updater.js';\nimport {\n detectESLint,\n generateESLintBridgeSuggestions,\n generateESLintFormatterBridgeSuggestions,\n} from './eslint-detector.js';\nimport { detectPrettier, generatePrettierMigrationSuggestions } from './prettier-detector.js';\nimport { writeReportToFile, enhanceReportWithSuggestions } from './report-writer.js';\nimport { detectProjectFeatures, generateFeatureSpecificSuggestions } from './advanced-detection.js';\n\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await stat(path);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function migrate(options: MigrationOptions = {}): Promise<MigrationReport> {\n const reporter = new DefaultReporter();\n const cwd = process.cwd();\n const outputDir = options.outputDir || cwd;\n\n let biomeConfigPath: string | undefined;\n\n if (options.configPath) {\n biomeConfigPath = resolve(cwd, options.configPath);\n if (!(await fileExists(biomeConfigPath))) {\n reporter.error(`Biome config not found at: ${biomeConfigPath}`);\n return createErrorReport(reporter, biomeConfigPath);\n }\n } else {\n biomeConfigPath = await findBiomeConfig(cwd);\n if (!biomeConfigPath) {\n reporter.error('No Biome configuration file found. Looking for biome.json or biome.jsonc');\n return createErrorReport(reporter);\n }\n }\n\n reporter.info(`Found Biome config: ${biomeConfigPath}`);\n\n let biomeConfig: BiomeConfig;\n try {\n biomeConfig = await loadBiomeConfig(biomeConfigPath, reporter);\n const configDir = dirname(biomeConfigPath);\n biomeConfig = await resolveBiomeExtends(biomeConfig, configDir, reporter);\n } catch (error) {\n return createErrorReport(reporter, biomeConfigPath);\n }\n\n // Detect advanced project features for cutting-edge optimizations\n const projectFeatures = detectProjectFeatures(biomeConfig, reporter);\n\n const oxlintConfig = generateOxlintConfig(biomeConfig, reporter);\n const oxfmtConfig = generateOxfmtConfig(biomeConfig, reporter);\n\n let formatterOverridesCount = 0;\n\n if (biomeConfig.overrides) {\n const oxlintOverrides = transformOverridesToOxlint(biomeConfig.overrides, reporter);\n if (oxlintOverrides.length > 0) {\n oxlintConfig.overrides = oxlintOverrides;\n }\n\n const oxfmtOverrides = generateOxfmtOverrides(biomeConfig.overrides, reporter);\n if (oxfmtOverrides.length > 0) {\n oxfmtConfig.overrides = oxfmtOverrides;\n formatterOverridesCount = oxfmtOverrides.length;\n }\n }\n\n const detectedIntegrations = {\n turborepo: options.turborepo ? detectTurborepo(outputDir) : false,\n eslint: options.eslintBridge ? detectESLint(outputDir) : false,\n prettier: options.prettier ? !!detectPrettier(outputDir) : false,\n typescript: oxlintConfig.plugins?.includes('typescript') || false,\n };\n\n const oxlintConfigPath = resolve(outputDir, '.oxlintrc.json');\n const oxfmtConfigPath = resolve(outputDir, '.oxfmtrc.jsonc');\n\n const suggestions: string[] = [];\n\n if (options.typeAware && detectedIntegrations.typescript) {\n suggestions.push('Type-aware linting detected. Install oxlint-tsgolint:');\n suggestions.push(' pnpm add -D oxlint-tsgolint@latest');\n suggestions.push(' npx oxlint --type-aware');\n }\n\n if (detectedIntegrations.turborepo) {\n suggestions.push(...generateTurborepoSuggestions());\n }\n\n if (detectedIntegrations.eslint) {\n suggestions.push(...generateESLintBridgeSuggestions(reporter));\n suggestions.push(...generateESLintFormatterBridgeSuggestions());\n }\n\n if (detectedIntegrations.prettier) {\n const prettierPath = detectPrettier(outputDir);\n if (prettierPath) {\n suggestions.push(...generatePrettierMigrationSuggestions(prettierPath, reporter));\n }\n }\n\n // Add cutting-edge feature-specific suggestions\n const featureSuggestions = generateFeatureSpecificSuggestions(projectFeatures);\n if (featureSuggestions.length > 0) {\n suggestions.push(...featureSuggestions);\n }\n\n if (!options.dryRun) {\n if (!options.noBackup) {\n await backupExistingConfigs(oxlintConfigPath, oxfmtConfigPath, reporter);\n }\n\n await writeFile(oxlintConfigPath, JSON.stringify(oxlintConfig, null, 2) + '\\n', 'utf-8');\n reporter.info(`Created Oxlint config: ${oxlintConfigPath}`);\n\n await writeFile(oxfmtConfigPath, JSON.stringify(oxfmtConfig, null, 2) + '\\n', 'utf-8');\n reporter.info(`Created Oxfmt config: ${oxfmtConfigPath}`);\n\n if (options.updateScripts) {\n updatePackageJson(outputDir, reporter, false);\n }\n\n if (options.turborepo && detectedIntegrations.turborepo) {\n updateTurboConfig(outputDir, reporter, false);\n }\n } else {\n reporter.info('Dry-run mode: No files will be written');\n reporter.info(`Would create: ${oxlintConfigPath}`);\n reporter.info(`Would create: ${oxfmtConfigPath}`);\n\n if (options.verbose) {\n \n \n \n \n }\n }\n\n const rulesConverted = Object.keys(oxlintConfig.rules || {}).length;\n const overridesConverted = (oxlintConfig.overrides || []).length;\n\n let report: MigrationReport = {\n success: true,\n warnings: reporter.getWarnings(),\n errors: reporter.getErrors(),\n suggestions,\n summary: {\n biomeConfigPath,\n oxlintConfigPath,\n oxfmtConfigPath,\n rulesConverted,\n rulesSkipped: reporter.getWarnings().filter((w) => w.includes('No Oxlint equivalent')).length,\n overridesConverted,\n formatterOverridesConverted: formatterOverridesCount,\n },\n detectedIntegrations,\n };\n\n if (options.report && !options.dryRun) {\n const reportPath = resolve(outputDir, options.report);\n writeReportToFile(report, reportPath, reporter);\n }\n\n return report;\n}\n\nasync function backupExistingConfigs(\n oxlintConfigPath: string,\n oxfmtConfigPath: string,\n reporter: DefaultReporter,\n): Promise<void> {\n if (await fileExists(oxlintConfigPath)) {\n const backupPath = `${oxlintConfigPath}.backup`;\n await rename(oxlintConfigPath, backupPath);\n reporter.info(`Backed up existing Oxlint config to: ${backupPath}`);\n }\n\n if (await fileExists(oxfmtConfigPath)) {\n const backupPath = `${oxfmtConfigPath}.backup`;\n await rename(oxfmtConfigPath, backupPath);\n reporter.info(`Backed up existing Oxfmt config to: ${backupPath}`);\n }\n}\n\nfunction createErrorReport(reporter: DefaultReporter, biomeConfigPath?: string): MigrationReport {\n return {\n success: false,\n warnings: reporter.getWarnings(),\n errors: reporter.getErrors(),\n suggestions: [],\n summary: {\n biomeConfigPath: biomeConfigPath || 'not found',\n oxlintConfigPath: '',\n oxfmtConfigPath: '',\n rulesConverted: 0,\n rulesSkipped: 0,\n overridesConverted: 0,\n formatterOverridesConverted: 0,\n },\n };\n}\n\nexport * from './types.js';\n"],"mappings":";;;;;;;;;;;;;;;;AA8BA,eAAe,WAAW,MAAgC;AACxD,KAAI;AACF,QAAM,KAAK,KAAK;AAChB,SAAO;SACD;AACN,SAAO;;;AAIX,eAAsB,QAAQ,UAA4B,EAAE,EAA4B;CACtF,MAAM,WAAW,IAAI,iBAAiB;CACtC,MAAM,MAAM,QAAQ,KAAK;CACzB,MAAM,YAAY,QAAQ,aAAa;CAEvC,IAAI;AAEJ,KAAI,QAAQ,YAAY;AACtB,oBAAkB,QAAQ,KAAK,QAAQ,WAAW;AAClD,MAAI,CAAE,MAAM,WAAW,gBAAgB,EAAG;AACxC,YAAS,MAAM,8BAA8B,kBAAkB;AAC/D,UAAO,kBAAkB,UAAU,gBAAgB;;QAEhD;AACL,oBAAkB,MAAM,gBAAgB,IAAI;AAC5C,MAAI,CAAC,iBAAiB;AACpB,YAAS,MAAM,2EAA2E;AAC1F,UAAO,kBAAkB,SAAS;;;AAItC,UAAS,KAAK,uBAAuB,kBAAkB;CAEvD,IAAI;AACJ,KAAI;AACF,gBAAc,MAAM,gBAAgB,iBAAiB,SAAS;EAC9D,MAAM,YAAY,QAAQ,gBAAgB;AAC1C,gBAAc,MAAM,oBAAoB,aAAa,WAAW,SAAS;UAClE,OAAO;AACd,SAAO,kBAAkB,UAAU,gBAAgB;;CAIrD,MAAM,kBAAkB,sBAAsB,aAAa,SAAS;CAEpE,MAAM,eAAe,qBAAqB,aAAa,SAAS;CAChE,MAAM,cAAc,oBAAoB,aAAa,SAAS;CAE9D,IAAI,0BAA0B;AAE9B,KAAI,YAAY,WAAW;EACzB,MAAM,kBAAkB,2BAA2B,YAAY,WAAW,SAAS;AACnF,MAAI,gBAAgB,SAAS,EAC3B,cAAa,YAAY;EAG3B,MAAM,iBAAiB,uBAAuB,YAAY,WAAW,SAAS;AAC9E,MAAI,eAAe,SAAS,GAAG;AAC7B,eAAY,YAAY;AACxB,6BAA0B,eAAe;;;CAI7C,MAAM,uBAAuB;EAC3B,WAAW,QAAQ,YAAY,gBAAgB,UAAU,GAAG;EAC5D,QAAQ,QAAQ,eAAe,aAAa,UAAU,GAAG;EACzD,UAAU,QAAQ,WAAW,CAAC,CAAC,eAAe,UAAU,GAAG;EAC3D,YAAY,aAAa,SAAS,SAAS,aAAa,IAAI;EAC7D;CAED,MAAM,mBAAmB,QAAQ,WAAW,iBAAiB;CAC7D,MAAM,kBAAkB,QAAQ,WAAW,iBAAiB;CAE5D,MAAM,cAAwB,EAAE;AAEhC,KAAI,QAAQ,aAAa,qBAAqB,YAAY;AACxD,cAAY,KAAK,wDAAwD;AACzE,cAAY,KAAK,uCAAuC;AACxD,cAAY,KAAK,4BAA4B;;AAG/C,KAAI,qBAAqB,UACvB,aAAY,KAAK,GAAG,8BAA8B,CAAC;AAGrD,KAAI,qBAAqB,QAAQ;AAC/B,cAAY,KAAK,GAAG,gCAAgC,SAAS,CAAC;AAC9D,cAAY,KAAK,GAAG,0CAA0C,CAAC;;AAGjE,KAAI,qBAAqB,UAAU;EACjC,MAAM,eAAe,eAAe,UAAU;AAC9C,MAAI,aACF,aAAY,KAAK,GAAG,qCAAqC,cAAc,SAAS,CAAC;;CAKrF,MAAM,qBAAqB,mCAAmC,gBAAgB;AAC9E,KAAI,mBAAmB,SAAS,EAC9B,aAAY,KAAK,GAAG,mBAAmB;AAGzC,KAAI,CAAC,QAAQ,QAAQ;AACnB,MAAI,CAAC,QAAQ,SACX,OAAM,sBAAsB,kBAAkB,iBAAiB,SAAS;AAG1E,QAAM,UAAU,kBAAkB,KAAK,UAAU,cAAc,MAAM,EAAE,GAAG,MAAM,QAAQ;AACxF,WAAS,KAAK,0BAA0B,mBAAmB;AAE3D,QAAM,UAAU,iBAAiB,KAAK,UAAU,aAAa,MAAM,EAAE,GAAG,MAAM,QAAQ;AACtF,WAAS,KAAK,yBAAyB,kBAAkB;AAEzD,MAAI,QAAQ,cACV,mBAAkB,WAAW,UAAU,MAAM;AAG/C,MAAI,QAAQ,aAAa,qBAAqB,UAC5C,mBAAkB,WAAW,UAAU,MAAM;QAE1C;AACL,WAAS,KAAK,yCAAyC;AACvD,WAAS,KAAK,iBAAiB,mBAAmB;AAClD,WAAS,KAAK,iBAAiB,kBAAkB;AAEjD,MAAI,QAAQ,SAAS;;CAQvB,MAAM,iBAAiB,OAAO,KAAK,aAAa,SAAS,EAAE,CAAC,CAAC;CAC7D,MAAM,sBAAsB,aAAa,aAAa,EAAE,EAAE;CAE1D,IAAI,SAA0B;EAC5B,SAAS;EACT,UAAU,SAAS,aAAa;EAChC,QAAQ,SAAS,WAAW;EAC5B;EACA,SAAS;GACP;GACA;GACA;GACA;GACA,cAAc,SAAS,aAAa,CAAC,QAAQ,MAAM,EAAE,SAAS,uBAAuB,CAAC,CAAC;GACvF;GACA,6BAA6B;GAC9B;EACD;EACD;AAED,KAAI,QAAQ,UAAU,CAAC,QAAQ,OAE7B,mBAAkB,QADC,QAAQ,WAAW,QAAQ,OAAO,EACf,SAAS;AAGjD,QAAO;;AAGT,eAAe,sBACb,kBACA,iBACA,UACe;AACf,KAAI,MAAM,WAAW,iBAAiB,EAAE;EACtC,MAAM,aAAa,GAAG,iBAAiB;AACvC,QAAM,OAAO,kBAAkB,WAAW;AAC1C,WAAS,KAAK,wCAAwC,aAAa;;AAGrE,KAAI,MAAM,WAAW,gBAAgB,EAAE;EACrC,MAAM,aAAa,GAAG,gBAAgB;AACtC,QAAM,OAAO,iBAAiB,WAAW;AACzC,WAAS,KAAK,uCAAuC,aAAa;;;AAItE,SAAS,kBAAkB,UAA2B,iBAA2C;AAC/F,QAAO;EACL,SAAS;EACT,UAAU,SAAS,aAAa;EAChC,QAAQ,SAAS,WAAW;EAC5B,aAAa,EAAE;EACf,SAAS;GACP,iBAAiB,mBAAmB;GACpC,kBAAkB;GAClB,iBAAiB;GACjB,gBAAgB;GAChB,cAAc;GACd,oBAAoB;GACpB,6BAA6B;GAC9B;EACF"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../src/index.ts"],"sourcesContent":["import { writeFile, rename, stat } from 'node:fs/promises';\nimport { resolve, dirname } from 'node:path';\nimport type {\n BiomeConfig,\n MigrationOptions,\n MigrationReport,\n OxlintConfig,\n OxfmtConfig,\n PackageUpdateSummary,\n} from './types.js';\nimport { DefaultReporter } from './reporter.js';\nimport { findBiomeConfig, loadBiomeConfig, resolveBiomeExtends } from './config-loader.js';\nimport { generateOxlintConfig } from './oxlint-generator.js';\nimport { generateOxfmtConfig } from './formatter-mapper.js';\nimport { transformOverridesToOxlint } from './overrides-transformer.js';\nimport { generateOxfmtOverrides } from './oxfmt-overrides.js';\nimport { updatePackageJson } from './package-updater.js';\nimport {\n detectTurborepo,\n updateTurboConfig,\n generateTurborepoSuggestions,\n} from './turbo-updater.js';\nimport {\n detectESLint,\n generateESLintBridgeSuggestions,\n generateESLintFormatterBridgeSuggestions,\n} from './eslint-detector.js';\nimport { detectPrettier, generatePrettierMigrationSuggestions } from './prettier-detector.js';\nimport { writeReportToFile, enhanceReportWithSuggestions } from './report-writer.js';\nimport { detectProjectFeatures, generateFeatureSpecificSuggestions } from './advanced-detection.js';\n\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await stat(path);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function migrate(options: MigrationOptions = {}): Promise<MigrationReport> {\n const reporter = new DefaultReporter();\n const cwd = process.cwd();\n const outputDir = options.outputDir || cwd;\n\n let biomeConfigPath: string | undefined;\n\n if (options.configPath) {\n biomeConfigPath = resolve(cwd, options.configPath);\n if (!(await fileExists(biomeConfigPath))) {\n reporter.error(`Biome config not found at: ${biomeConfigPath}`);\n return createErrorReport(reporter, biomeConfigPath);\n }\n } else {\n biomeConfigPath = await findBiomeConfig(cwd);\n if (!biomeConfigPath) {\n reporter.error('No Biome configuration file found. Looking for biome.json or biome.jsonc');\n return createErrorReport(reporter);\n }\n }\n\n reporter.info(`Found Biome config: ${biomeConfigPath}`);\n\n let biomeConfig: BiomeConfig;\n try {\n biomeConfig = await loadBiomeConfig(biomeConfigPath, reporter);\n const configDir = dirname(biomeConfigPath);\n biomeConfig = await resolveBiomeExtends(biomeConfig, configDir, reporter);\n } catch (error) {\n return createErrorReport(reporter, biomeConfigPath);\n }\n\n // Detect advanced project features for cutting-edge optimizations\n const projectFeatures = detectProjectFeatures(biomeConfig, reporter);\n\n const oxlintConfig = generateOxlintConfig(biomeConfig, reporter);\n const oxfmtConfig = generateOxfmtConfig(biomeConfig, reporter);\n\n let formatterOverridesCount = 0;\n\n if (biomeConfig.overrides) {\n const oxlintOverrides = transformOverridesToOxlint(biomeConfig.overrides, reporter);\n if (oxlintOverrides.length > 0) {\n oxlintConfig.overrides = oxlintOverrides;\n }\n\n const oxfmtOverrides = generateOxfmtOverrides(biomeConfig.overrides, reporter);\n if (oxfmtOverrides.length > 0) {\n oxfmtConfig.overrides = oxfmtOverrides;\n formatterOverridesCount = oxfmtOverrides.length;\n }\n }\n\n const detectedIntegrations = {\n turborepo: options.turborepo ? detectTurborepo(outputDir) : false,\n eslint: options.eslintBridge ? detectESLint(outputDir) : false,\n prettier: options.prettier ? !!detectPrettier(outputDir) : false,\n typescript: oxlintConfig.plugins?.includes('typescript') || false,\n };\n\n const oxlintConfigPath = resolve(outputDir, '.oxlintrc.json');\n const oxfmtConfigPath = resolve(outputDir, '.oxfmtrc.jsonc');\n\n const suggestions: string[] = [];\n\n if (options.typeAware && detectedIntegrations.typescript) {\n suggestions.push('Type-aware linting detected. Install oxlint-tsgolint:');\n suggestions.push(' pnpm add -D oxlint-tsgolint@latest');\n suggestions.push(' npx oxlint --type-aware');\n }\n\n if (detectedIntegrations.turborepo) {\n suggestions.push(...generateTurborepoSuggestions());\n }\n\n if (detectedIntegrations.eslint) {\n suggestions.push(...generateESLintBridgeSuggestions(reporter));\n suggestions.push(...generateESLintFormatterBridgeSuggestions());\n }\n\n if (detectedIntegrations.prettier) {\n const prettierPath = detectPrettier(outputDir);\n if (prettierPath) {\n suggestions.push(...generatePrettierMigrationSuggestions(prettierPath, reporter));\n }\n }\n\n // Add cutting-edge feature-specific suggestions\n const featureSuggestions = generateFeatureSpecificSuggestions(projectFeatures);\n if (featureSuggestions.length > 0) {\n suggestions.push(...featureSuggestions);\n }\n\n let packageJsonSummary: PackageUpdateSummary | undefined;\n\n if (!options.dryRun) {\n if (!options.noBackup) {\n await backupExistingConfigs(oxlintConfigPath, oxfmtConfigPath, reporter);\n }\n\n await writeFile(oxlintConfigPath, JSON.stringify(oxlintConfig, null, 2) + '\\n', 'utf-8');\n reporter.info(`Created Oxlint config: ${oxlintConfigPath}`);\n\n await writeFile(oxfmtConfigPath, JSON.stringify(oxfmtConfig, null, 2) + '\\n', 'utf-8');\n reporter.info(`Created Oxfmt config: ${oxfmtConfigPath}`);\n\n packageJsonSummary = updatePackageJson(outputDir, reporter, false, {\n updateScripts: options.updateScripts,\n });\n\n if (options.turborepo && detectedIntegrations.turborepo) {\n updateTurboConfig(outputDir, reporter, false);\n }\n } else {\n reporter.info('Dry-run mode: No files will be written');\n reporter.info(`Would create: ${oxlintConfigPath}`);\n reporter.info(`Would create: ${oxfmtConfigPath}`);\n\n packageJsonSummary = updatePackageJson(outputDir, reporter, true, {\n updateScripts: options.updateScripts,\n });\n\n if (options.verbose) {\n\n\n\n\n }\n }\n\n const rulesConverted = Object.keys(oxlintConfig.rules || {}).length;\n const overridesConverted = (oxlintConfig.overrides || []).length;\n\n let report: MigrationReport = {\n success: true,\n warnings: reporter.getWarnings(),\n errors: reporter.getErrors(),\n suggestions,\n summary: {\n biomeConfigPath,\n oxlintConfigPath,\n oxfmtConfigPath,\n rulesConverted,\n rulesSkipped: reporter.getWarnings().filter((w) => w.includes('No Oxlint equivalent')).length,\n overridesConverted,\n formatterOverridesConverted: formatterOverridesCount,\n },\n packageJson: packageJsonSummary,\n detectedIntegrations,\n };\n\n if (options.report && !options.dryRun) {\n const reportPath = resolve(outputDir, options.report);\n writeReportToFile(report, reportPath, reporter);\n }\n\n return report;\n}\n\nasync function backupExistingConfigs(\n oxlintConfigPath: string,\n oxfmtConfigPath: string,\n reporter: DefaultReporter,\n): Promise<void> {\n if (await fileExists(oxlintConfigPath)) {\n const backupPath = `${oxlintConfigPath}.backup`;\n await rename(oxlintConfigPath, backupPath);\n reporter.info(`Backed up existing Oxlint config to: ${backupPath}`);\n }\n\n if (await fileExists(oxfmtConfigPath)) {\n const backupPath = `${oxfmtConfigPath}.backup`;\n await rename(oxfmtConfigPath, backupPath);\n reporter.info(`Backed up existing Oxfmt config to: ${backupPath}`);\n }\n}\n\nfunction createErrorReport(reporter: DefaultReporter, biomeConfigPath?: string): MigrationReport {\n return {\n success: false,\n warnings: reporter.getWarnings(),\n errors: reporter.getErrors(),\n suggestions: [],\n summary: {\n biomeConfigPath: biomeConfigPath || 'not found',\n oxlintConfigPath: '',\n oxfmtConfigPath: '',\n rulesConverted: 0,\n rulesSkipped: 0,\n overridesConverted: 0,\n formatterOverridesConverted: 0,\n },\n };\n}\n\nexport * from './types.js';\n"],"mappings":"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"}
@@ -1,7 +1,9 @@
1
- import { Reporter } from "./types.mjs";
1
+ import { PackageUpdateSummary, Reporter } from "./types.mjs";
2
2
 
3
3
  //#region src/package-updater.d.ts
4
- declare function updatePackageJson(projectDir: string, reporter: Reporter, dryRun: boolean): void;
4
+ declare function updatePackageJson(projectDir: string, reporter: Reporter, dryRun: boolean, options?: {
5
+ updateScripts?: boolean;
6
+ }): PackageUpdateSummary;
5
7
  //#endregion
6
8
  export { updatePackageJson };
7
9
  //# sourceMappingURL=package-updater.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"package-updater.d.mts","names":[],"sources":["../../src/package-updater.ts"],"mappings":";;;iBAWgB,iBAAA,CAAkB,UAAA,UAAoB,QAAA,EAAU,QAAA,EAAU,MAAA"}
1
+ {"version":3,"file":"package-updater.d.mts","names":[],"sources":["../../src/package-updater.ts"],"mappings":";;;iBAoBgB,iBAAA,CACd,UAAA,UACA,QAAA,EAAU,QAAA,EACV,MAAA,WACA,OAAA;EAAW,aAAA;AAAA,IACV,oBAAA"}
@@ -1,3 +1,3 @@
1
- import { t as updatePackageJson } from "../package-updater-B-XgYVeR.mjs";
1
+ import { t as updatePackageJson } from "../package-updater-DcxTVTb3.mjs";
2
2
 
3
3
  export { updatePackageJson };
@@ -212,11 +212,37 @@ type MigrationOptions = {
212
212
  prettier?: boolean;
213
213
  report?: string;
214
214
  };
215
+ type PackageScriptUpdate = {
216
+ name: string;
217
+ before: string;
218
+ after: string;
219
+ };
220
+ type PackageDependencyRemoval = {
221
+ name: string;
222
+ dependencyType: 'dependencies' | 'devDependencies';
223
+ version?: string;
224
+ };
225
+ type PackageDevDependencyChange = {
226
+ name: string;
227
+ action: 'added' | 'already-present' | 'updated';
228
+ from?: string;
229
+ to: string;
230
+ };
231
+ type PackageUpdateSummary = {
232
+ packageJsonPath: string;
233
+ found: boolean;
234
+ dryRun: boolean;
235
+ scriptsUpdated: PackageScriptUpdate[];
236
+ dependenciesRemoved: PackageDependencyRemoval[];
237
+ devDependencies: PackageDevDependencyChange[];
238
+ changed: boolean;
239
+ };
215
240
  type MigrationReport = {
216
241
  success: boolean;
217
242
  warnings: string[];
218
243
  errors: string[];
219
244
  suggestions: string[];
245
+ packageJson?: PackageUpdateSummary;
220
246
  summary: {
221
247
  biomeConfigPath: string;
222
248
  oxlintConfigPath: string;
@@ -241,5 +267,5 @@ type Reporter = {
241
267
  getErrors(): string[];
242
268
  };
243
269
  //#endregion
244
- export { BiomeConfig, BiomeCssConfig, BiomeFilesConfig, BiomeFormatterConfig, BiomeJavaScriptConfig, BiomeJsonConfig, BiomeLinterConfig, BiomeLinterRules, BiomeOverride, BiomeRuleGroup, BiomeRuleSeverity, BiomeVcsConfig, MigrationOptions, MigrationReport, OxfmtConfig, OxfmtOverride, OxlintConfig, OxlintOverride, OxlintRuleSeverity, Reporter };
270
+ export { BiomeConfig, BiomeCssConfig, BiomeFilesConfig, BiomeFormatterConfig, BiomeJavaScriptConfig, BiomeJsonConfig, BiomeLinterConfig, BiomeLinterRules, BiomeOverride, BiomeRuleGroup, BiomeRuleSeverity, BiomeVcsConfig, MigrationOptions, MigrationReport, OxfmtConfig, OxfmtOverride, OxlintConfig, OxlintOverride, OxlintRuleSeverity, PackageDependencyRemoval, PackageDevDependencyChange, PackageScriptUpdate, PackageUpdateSummary, Reporter };
245
271
  //# sourceMappingURL=types.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.mts","names":[],"sources":["../../src/types.ts"],"mappings":"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"}
1
+ {"version":3,"file":"types.d.mts","names":[],"sources":["../../src/types.ts"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "biome-to-oxc",
3
- "version": "0.4.1",
3
+ "version": "0.5.2",
4
4
  "description": "Migrate from Biome to Oxc ecosystem (oxlint + oxfmt) - Exhaustive, cutting-edge, with all experimental features",
5
5
  "keywords": [
6
6
  "biome",
@@ -36,9 +36,9 @@
36
36
  "zod": "^4.3.6"
37
37
  },
38
38
  "devDependencies": {
39
- "@types/node": "^25.1.0",
40
- "oxfmt": "^0.27.0",
41
- "oxlint": "^1.42.0",
39
+ "@types/node": "^25.2.0",
40
+ "oxfmt": "^0.28.0",
41
+ "oxlint": "^1.43.0",
42
42
  "oxlint-tsgolint": "^0.11.4",
43
43
  "tsdown": "0.20.1",
44
44
  "typescript": "^5.9.3",
@@ -1,69 +0,0 @@
1
- import { resolve } from "node:path";
2
- import { existsSync, readFileSync, writeFileSync } from "node:fs";
3
-
4
- //#region src/package-updater.ts
5
- function updatePackageJson(projectDir, reporter, dryRun) {
6
- const packageJsonPath = resolve(projectDir, "package.json");
7
- if (!existsSync(packageJsonPath)) {
8
- reporter.warn("package.json not found, skipping script updates");
9
- return;
10
- }
11
- try {
12
- const content = readFileSync(packageJsonPath, "utf-8");
13
- const packageJson = JSON.parse(content);
14
- let modified = false;
15
- if (packageJson.scripts) modified = updateScripts(packageJson.scripts, reporter) || modified;
16
- if (packageJson.devDependencies) modified = updateDependencies(packageJson.devDependencies, reporter) || modified;
17
- if (packageJson.dependencies) modified = updateDependencies(packageJson.dependencies, reporter) || modified;
18
- if (modified && !dryRun) {
19
- writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2) + "\n", "utf-8");
20
- reporter.info("Updated package.json");
21
- } else if (modified && dryRun) reporter.info("Would update package.json (dry-run mode)");
22
- } catch (error) {
23
- const message = error instanceof Error ? error.message : String(error);
24
- reporter.error(`Failed to update package.json: ${message}`);
25
- }
26
- }
27
- function updateScripts(scripts, reporter) {
28
- let modified = false;
29
- for (const [name, script] of Object.entries(scripts)) {
30
- let newScript = script;
31
- if (script.includes("biome check")) {
32
- newScript = newScript.replace(/biome check/g, "oxlint && oxfmt --check");
33
- modified = true;
34
- reporter.info(`Updated script "${name}": biome check → oxlint && oxfmt --check`);
35
- }
36
- if (script.includes("biome lint")) {
37
- newScript = newScript.replace(/biome lint/g, "oxlint");
38
- modified = true;
39
- reporter.info(`Updated script "${name}": biome lint → oxlint`);
40
- }
41
- if (script.includes("biome format")) {
42
- newScript = newScript.replace(/biome format/g, "oxfmt");
43
- modified = true;
44
- reporter.info(`Updated script "${name}": biome format → oxfmt`);
45
- }
46
- if (script.includes("biome ci")) {
47
- newScript = newScript.replace(/biome ci/g, "oxlint && oxfmt --check");
48
- modified = true;
49
- reporter.info(`Updated script "${name}": biome ci → oxlint && oxfmt --check`);
50
- }
51
- if (newScript !== script) scripts[name] = newScript;
52
- }
53
- return modified;
54
- }
55
- function updateDependencies(dependencies, reporter) {
56
- let modified = false;
57
- if (dependencies["@biomejs/biome"]) {
58
- delete dependencies["@biomejs/biome"];
59
- dependencies["oxlint"] = "^1.41.0";
60
- dependencies["oxfmt"] = "^0.26.0";
61
- modified = true;
62
- reporter.info("Replaced @biomejs/biome with oxlint and oxfmt in dependencies");
63
- }
64
- return modified;
65
- }
66
-
67
- //#endregion
68
- export { updatePackageJson as t };
69
- //# sourceMappingURL=package-updater-B-XgYVeR.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"package-updater-B-XgYVeR.mjs","names":[],"sources":["../src/package-updater.ts"],"sourcesContent":["import { readFileSync, writeFileSync, existsSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport type { Reporter } from './types.js';\n\ntype PackageJson = {\n scripts?: Record<string, string>;\n devDependencies?: Record<string, string>;\n dependencies?: Record<string, string>;\n [key: string]: unknown;\n};\n\nexport function updatePackageJson(projectDir: string, reporter: Reporter, dryRun: boolean): void {\n const packageJsonPath = resolve(projectDir, 'package.json');\n\n if (!existsSync(packageJsonPath)) {\n reporter.warn('package.json not found, skipping script updates');\n return;\n }\n\n try {\n const content = readFileSync(packageJsonPath, 'utf-8');\n const packageJson: PackageJson = JSON.parse(content);\n\n let modified = false;\n\n if (packageJson.scripts) {\n modified = updateScripts(packageJson.scripts, reporter) || modified;\n }\n\n if (packageJson.devDependencies) {\n modified = updateDependencies(packageJson.devDependencies, reporter) || modified;\n }\n\n if (packageJson.dependencies) {\n modified = updateDependencies(packageJson.dependencies, reporter) || modified;\n }\n\n if (modified && !dryRun) {\n writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2) + '\\n', 'utf-8');\n reporter.info('Updated package.json');\n } else if (modified && dryRun) {\n reporter.info('Would update package.json (dry-run mode)');\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n reporter.error(`Failed to update package.json: ${message}`);\n }\n}\n\nfunction updateScripts(scripts: Record<string, string>, reporter: Reporter): boolean {\n let modified = false;\n\n for (const [name, script] of Object.entries(scripts)) {\n let newScript = script;\n\n if (script.includes('biome check')) {\n newScript = newScript.replace(/biome check/g, 'oxlint && oxfmt --check');\n modified = true;\n reporter.info(`Updated script \"${name}\": biome check → oxlint && oxfmt --check`);\n }\n\n if (script.includes('biome lint')) {\n newScript = newScript.replace(/biome lint/g, 'oxlint');\n modified = true;\n reporter.info(`Updated script \"${name}\": biome lint → oxlint`);\n }\n\n if (script.includes('biome format')) {\n newScript = newScript.replace(/biome format/g, 'oxfmt');\n modified = true;\n reporter.info(`Updated script \"${name}\": biome format → oxfmt`);\n }\n\n if (script.includes('biome ci')) {\n newScript = newScript.replace(/biome ci/g, 'oxlint && oxfmt --check');\n modified = true;\n reporter.info(`Updated script \"${name}\": biome ci → oxlint && oxfmt --check`);\n }\n\n if (newScript !== script) {\n scripts[name] = newScript;\n }\n }\n\n return modified;\n}\n\nfunction updateDependencies(dependencies: Record<string, string>, reporter: Reporter): boolean {\n let modified = false;\n\n if (dependencies['@biomejs/biome']) {\n delete dependencies['@biomejs/biome'];\n dependencies['oxlint'] = '^1.41.0';\n dependencies['oxfmt'] = '^0.26.0';\n modified = true;\n reporter.info('Replaced @biomejs/biome with oxlint and oxfmt in dependencies');\n }\n\n return modified;\n}\n"],"mappings":";;;;AAWA,SAAgB,kBAAkB,YAAoB,UAAoB,QAAuB;CAC/F,MAAM,kBAAkB,QAAQ,YAAY,eAAe;AAE3D,KAAI,CAAC,WAAW,gBAAgB,EAAE;AAChC,WAAS,KAAK,kDAAkD;AAChE;;AAGF,KAAI;EACF,MAAM,UAAU,aAAa,iBAAiB,QAAQ;EACtD,MAAM,cAA2B,KAAK,MAAM,QAAQ;EAEpD,IAAI,WAAW;AAEf,MAAI,YAAY,QACd,YAAW,cAAc,YAAY,SAAS,SAAS,IAAI;AAG7D,MAAI,YAAY,gBACd,YAAW,mBAAmB,YAAY,iBAAiB,SAAS,IAAI;AAG1E,MAAI,YAAY,aACd,YAAW,mBAAmB,YAAY,cAAc,SAAS,IAAI;AAGvE,MAAI,YAAY,CAAC,QAAQ;AACvB,iBAAc,iBAAiB,KAAK,UAAU,aAAa,MAAM,EAAE,GAAG,MAAM,QAAQ;AACpF,YAAS,KAAK,uBAAuB;aAC5B,YAAY,OACrB,UAAS,KAAK,2CAA2C;UAEpD,OAAO;EACd,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AACtE,WAAS,MAAM,kCAAkC,UAAU;;;AAI/D,SAAS,cAAc,SAAiC,UAA6B;CACnF,IAAI,WAAW;AAEf,MAAK,MAAM,CAAC,MAAM,WAAW,OAAO,QAAQ,QAAQ,EAAE;EACpD,IAAI,YAAY;AAEhB,MAAI,OAAO,SAAS,cAAc,EAAE;AAClC,eAAY,UAAU,QAAQ,gBAAgB,0BAA0B;AACxE,cAAW;AACX,YAAS,KAAK,mBAAmB,KAAK,0CAA0C;;AAGlF,MAAI,OAAO,SAAS,aAAa,EAAE;AACjC,eAAY,UAAU,QAAQ,eAAe,SAAS;AACtD,cAAW;AACX,YAAS,KAAK,mBAAmB,KAAK,wBAAwB;;AAGhE,MAAI,OAAO,SAAS,eAAe,EAAE;AACnC,eAAY,UAAU,QAAQ,iBAAiB,QAAQ;AACvD,cAAW;AACX,YAAS,KAAK,mBAAmB,KAAK,yBAAyB;;AAGjE,MAAI,OAAO,SAAS,WAAW,EAAE;AAC/B,eAAY,UAAU,QAAQ,aAAa,0BAA0B;AACrE,cAAW;AACX,YAAS,KAAK,mBAAmB,KAAK,uCAAuC;;AAG/E,MAAI,cAAc,OAChB,SAAQ,QAAQ;;AAIpB,QAAO;;AAGT,SAAS,mBAAmB,cAAsC,UAA6B;CAC7F,IAAI,WAAW;AAEf,KAAI,aAAa,mBAAmB;AAClC,SAAO,aAAa;AACpB,eAAa,YAAY;AACzB,eAAa,WAAW;AACxB,aAAW;AACX,WAAS,KAAK,gEAAgE;;AAGhF,QAAO"}