From c03404e48c6585ccb4addf856861e0567f65dae2 Mon Sep 17 00:00:00 2001 From: "MK (fengmk2)" Date: Mon, 14 Sep 2026 17:02:12 +0800 Subject: [PATCH] Revert "fix(migrate): finish leftover Oxc config migration (#2654)" This reverts commit e3bd9dba2eb466f43de509df5d0a157d2ce2adcc. Preserve standalone Oxc configs when migrating existing Vite+ projects. The added merge step can delete referenced configs and copy JSON extends paths into incompatible inline config. --- .../.oxfmtrc.json | 4 - .../package.json | 9 -- .../snapshots.toml | 32 ----- .../migration_existing_oxc_configs.md | 91 ------------- ...gration_existing_oxc_configs_inline_fmt.md | 84 ------------ .../src/index.ts | 1 - .../vite.config.ts | 1 - .../src/migration/__tests__/migrator.spec.ts | 128 ------------------ packages/cli/src/migration/bin.ts | 1 - .../migration/migrator/core-finalization.ts | 26 ---- 10 files changed, 377 deletions(-) delete mode 100644 crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/migration_existing_oxc_configs/.oxfmtrc.json delete mode 100644 crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/migration_existing_oxc_configs/package.json delete mode 100644 crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/migration_existing_oxc_configs/snapshots.toml delete mode 100644 crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/migration_existing_oxc_configs/snapshots/migration_existing_oxc_configs.md delete mode 100644 crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/migration_existing_oxc_configs/snapshots/migration_existing_oxc_configs_inline_fmt.md delete mode 100644 crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/migration_existing_oxc_configs/src/index.ts delete mode 100644 crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/migration_existing_oxc_configs/vite.config.ts diff --git a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/migration_existing_oxc_configs/.oxfmtrc.json b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/migration_existing_oxc_configs/.oxfmtrc.json deleted file mode 100644 index fd496a820e..0000000000 --- a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/migration_existing_oxc_configs/.oxfmtrc.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "singleQuote": true, - "semi": false -} diff --git a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/migration_existing_oxc_configs/package.json b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/migration_existing_oxc_configs/package.json deleted file mode 100644 index cdaf891df3..0000000000 --- a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/migration_existing_oxc_configs/package.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "migration-existing-oxc-configs", - "private": true, - "type": "module", - "packageManager": "pnpm@12.3.4", - "devDependencies": { - "vite-plus": "latest" - } -} diff --git a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/migration_existing_oxc_configs/snapshots.toml b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/migration_existing_oxc_configs/snapshots.toml deleted file mode 100644 index eb4e7224f9..0000000000 --- a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/migration_existing_oxc_configs/snapshots.toml +++ /dev/null @@ -1,32 +0,0 @@ -[[case]] -name = "migration_existing_oxc_configs" -vp = "global" -steps = [ - { argv = ["vp", "migrate", "--no-interactive", "--no-hooks", "--no-agent", "--no-editor"], comment = "finish a leftover Oxfmt config even when Vite+ is already installed" }, - ["vpt", "print-file", "vite.config.ts"], - ["vpt", "stat-file", ".oxfmtrc.json", "--assert-not", "file"], - { argv = ["vp", "fmt", "src/index.ts"], comment = "the migrated options must affect formatting" }, - ["vpt", "print-file", "src/index.ts"], - { argv = ["vp", "migrate", "--no-interactive", "--no-hooks", "--no-agent", "--no-editor"], comment = "a completed migration should be a no-op on retry" }, - ["vpt", "print-file", "vite.config.ts"], - ["vpt", "stat-file", "AGENTS.md", "--assert-not", "file"], - ["vpt", "stat-file", ".vite-hooks", "--assert-not", "dir"], - ["vpt", "stat-file", ".vscode", "--assert-not", "dir"], -] - -[[case]] -name = "migration_existing_oxc_configs_inline_fmt" -vp = "global" -steps = [ - { argv = ["vpt", "write-file", "vite.config.ts", "export default { fmt: { singleQuote: false, semi: false } };\n"], snapshot = false }, - { argv = ["vp", "fmt", "src/index.ts"], comment = "the existing inline fmt config takes precedence over the standalone config" }, - ["vpt", "print-file", "src/index.ts"], - { argv = ["vpt", "write-file", "src/index.ts", "export const message = \"preserved\";\n"], snapshot = false }, - { argv = ["vp", "migrate", "--no-interactive", "--no-hooks", "--no-agent", "--no-editor"], comment = "remove the leftover standalone config without changing the existing fmt config" }, - ["vpt", "print-file", "vite.config.ts"], - ["vpt", "stat-file", ".oxfmtrc.json", "--assert-not", "file"], - { argv = ["vp", "fmt", "src/index.ts"], comment = "formatting must still use the existing inline options after migration" }, - ["vpt", "print-file", "src/index.ts"], - { argv = ["vp", "migrate", "--no-interactive", "--no-hooks", "--no-agent", "--no-editor"], comment = "retrying the completed migration should be a no-op" }, - ["vpt", "print-file", "vite.config.ts"], -] diff --git a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/migration_existing_oxc_configs/snapshots/migration_existing_oxc_configs.md b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/migration_existing_oxc_configs/snapshots/migration_existing_oxc_configs.md deleted file mode 100644 index d124881fe9..0000000000 --- a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/migration_existing_oxc_configs/snapshots/migration_existing_oxc_configs.md +++ /dev/null @@ -1,91 +0,0 @@ -# migration_existing_oxc_configs - -## `vp migrate --no-interactive --no-hooks --no-agent --no-editor` - -finish a leftover Oxfmt config even when Vite+ is already installed - -``` -VITE+ - The Unified Toolchain for the Web - -◇ Updated . to Vite+ -• Node pnpm -• Dependencies: - vite-plus latest → - vite → -• 1 config update applied -• Package manager settings configured -``` - -## `vpt print-file vite.config.ts` - -``` -export default { - fmt: { - "singleQuote": true, - "semi": false - }, - -} -``` - -## `vpt stat-file .oxfmtrc.json --assert-not file` - -``` -.oxfmtrc.json: missing -``` - -## `vp fmt src/index.ts` - -the migrated options must affect formatting - -``` -VITE+ - The Unified Toolchain for the Web - -Finished in on 1 files using threads. -``` - -## `vpt print-file src/index.ts` - -``` -export const message = 'preserved' -``` - -## `vp migrate --no-interactive --no-hooks --no-agent --no-editor` - -a completed migration should be a no-op on retry - -``` -VITE+ - The Unified Toolchain for the Web - -This project is already using Vite+! Happy coding! -``` - -## `vpt print-file vite.config.ts` - -``` -export default { - fmt: { - "singleQuote": true, - "semi": false - }, - -} -``` - -## `vpt stat-file AGENTS.md --assert-not file` - -``` -AGENTS.md: missing -``` - -## `vpt stat-file .vite-hooks --assert-not dir` - -``` -.vite-hooks: missing -``` - -## `vpt stat-file .vscode --assert-not dir` - -``` -.vscode: missing -``` diff --git a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/migration_existing_oxc_configs/snapshots/migration_existing_oxc_configs_inline_fmt.md b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/migration_existing_oxc_configs/snapshots/migration_existing_oxc_configs_inline_fmt.md deleted file mode 100644 index 5e5db5b33d..0000000000 --- a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/migration_existing_oxc_configs/snapshots/migration_existing_oxc_configs_inline_fmt.md +++ /dev/null @@ -1,84 +0,0 @@ -# migration_existing_oxc_configs_inline_fmt - -## `vpt write-file vite.config.ts 'export default { fmt: { singleQuote: false, semi: false } }; -'` - - -## `vp fmt src/index.ts` - -the existing inline fmt config takes precedence over the standalone config - -``` -VITE+ - The Unified Toolchain for the Web - -Finished in on 1 files using threads. -``` - -## `vpt print-file src/index.ts` - -``` -export const message = "preserved" -``` - -## `vpt write-file src/index.ts 'export const message = "preserved"; -'` - - -## `vp migrate --no-interactive --no-hooks --no-agent --no-editor` - -remove the leftover standalone config without changing the existing fmt config - -``` -VITE+ - The Unified Toolchain for the Web - -◇ Updated . to Vite+ -• Node pnpm -• Dependencies: - vite-plus latest → - vite → -• Package manager settings configured -``` - -## `vpt print-file vite.config.ts` - -``` -export default { fmt: { singleQuote: false, semi: false } }; -``` - -## `vpt stat-file .oxfmtrc.json --assert-not file` - -``` -.oxfmtrc.json: missing -``` - -## `vp fmt src/index.ts` - -formatting must still use the existing inline options after migration - -``` -VITE+ - The Unified Toolchain for the Web - -Finished in on 1 files using threads. -``` - -## `vpt print-file src/index.ts` - -``` -export const message = "preserved" -``` - -## `vp migrate --no-interactive --no-hooks --no-agent --no-editor` - -retrying the completed migration should be a no-op - -``` -VITE+ - The Unified Toolchain for the Web - -This project is already using Vite+! Happy coding! -``` - -## `vpt print-file vite.config.ts` - -``` -export default { fmt: { singleQuote: false, semi: false } }; -``` diff --git a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/migration_existing_oxc_configs/src/index.ts b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/migration_existing_oxc_configs/src/index.ts deleted file mode 100644 index 38b0fa8a2f..0000000000 --- a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/migration_existing_oxc_configs/src/index.ts +++ /dev/null @@ -1 +0,0 @@ -export const message = "preserved"; diff --git a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/migration_existing_oxc_configs/vite.config.ts b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/migration_existing_oxc_configs/vite.config.ts deleted file mode 100644 index ff8b4c5632..0000000000 --- a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/migration_existing_oxc_configs/vite.config.ts +++ /dev/null @@ -1 +0,0 @@ -export default {}; diff --git a/packages/cli/src/migration/__tests__/migrator.spec.ts b/packages/cli/src/migration/__tests__/migrator.spec.ts index 026874eb0a..c395b594db 100644 --- a/packages/cli/src/migration/__tests__/migrator.spec.ts +++ b/packages/cli/src/migration/__tests__/migrator.spec.ts @@ -8796,7 +8796,6 @@ describe('existing Vite+ core migration finalization', () => { scripts: true, tsconfigTypes: true, imports: true, - oxcConfigs: false, tsdownConfig: false, }); @@ -8828,96 +8827,6 @@ describe('existing Vite+ core migration finalization', () => { }); }); - it.each(['.oxfmtrc.json', '.oxfmtrc.jsonc'])( - 'finishes a leftover %s config and remains idempotent', - (configFile) => { - fs.writeFileSync( - path.join(tmpDir, 'package.json'), - JSON.stringify({ name: 'test', devDependencies: { 'vite-plus': 'latest' } }), - ); - fs.writeFileSync(path.join(tmpDir, 'vite.config.ts'), 'export default {};\n'); - fs.writeFileSync(path.join(tmpDir, configFile), '{"singleQuote":true,"semi":false}\n'); - const workspaceInfo = makeWorkspaceInfo(tmpDir, PackageManager.npm); - const report = createMigrationReport(); - - expect(finalizeCoreMigrationForExistingVitePlus(workspaceInfo, true, report).oxcConfigs).toBe( - true, - ); - const config = fs.readFileSync(path.join(tmpDir, 'vite.config.ts'), 'utf8'); - expect(config).toContain('fmt:'); - expect(config).toContain('"singleQuote":true'); - expect(config).toContain('"semi":false'); - expect(fs.existsSync(path.join(tmpDir, configFile))).toBe(false); - expect(report.mergedConfigCount).toBe(1); - expect(finalizeCoreMigrationForExistingVitePlus(workspaceInfo, true).oxcConfigs).toBe(false); - expect(fs.readFileSync(path.join(tmpDir, 'vite.config.ts'), 'utf8')).toBe(config); - }, - ); - - it('finishes leftover lint and format configs in workspace packages', () => { - const appDir = path.join(tmpDir, 'packages', 'app'); - fs.mkdirSync(appDir, { recursive: true }); - fs.writeFileSync( - path.join(tmpDir, 'package.json'), - JSON.stringify({ name: 'root', devDependencies: { 'vite-plus': 'latest' } }), - ); - fs.writeFileSync(path.join(appDir, 'package.json'), JSON.stringify({ name: 'app' })); - fs.writeFileSync(path.join(appDir, '.oxfmtrc.json'), '{"singleQuote":true}\n'); - fs.writeFileSync(path.join(appDir, '.oxlintrc.json'), '{"rules":{"no-console":"error"}}\n'); - const workspaceInfo = { - ...makeWorkspaceInfo(tmpDir, PackageManager.pnpm), - isMonorepo: true, - packages: [{ name: 'app', path: 'packages/app' }], - }; - - expect(finalizeCoreMigrationForExistingVitePlus(workspaceInfo, true).oxcConfigs).toBe(true); - const config = fs.readFileSync(path.join(appDir, 'vite.config.ts'), 'utf8'); - expect(config).toContain('fmt:'); - expect(config).toContain('lint:'); - expect(config).toMatch(/"no-console":\s*"error"/); - expect(fs.existsSync(path.join(appDir, '.oxfmtrc.json'))).toBe(false); - expect(fs.existsSync(path.join(appDir, '.oxlintrc.json'))).toBe(false); - expect(finalizeCoreMigrationForExistingVitePlus(workspaceInfo, true).oxcConfigs).toBe(false); - }); - - it('preserves existing inline config when removing a redundant standalone config', () => { - fs.writeFileSync( - path.join(tmpDir, 'package.json'), - JSON.stringify({ name: 'test', devDependencies: { 'vite-plus': 'latest' } }), - ); - const config = 'export default { fmt: { singleQuote: false } };\n'; - fs.writeFileSync(path.join(tmpDir, 'vite.config.ts'), config); - fs.writeFileSync(path.join(tmpDir, '.oxfmtrc.json'), '{"singleQuote":true}\n'); - const workspaceInfo = makeWorkspaceInfo(tmpDir, PackageManager.npm); - - expect(finalizeCoreMigrationForExistingVitePlus(workspaceInfo, true).oxcConfigs).toBe(true); - expect(fs.readFileSync(path.join(tmpDir, 'vite.config.ts'), 'utf8')).toBe(config); - expect(fs.existsSync(path.join(tmpDir, '.oxfmtrc.json'))).toBe(false); - expect(finalizeCoreMigrationForExistingVitePlus(workspaceInfo, true).oxcConfigs).toBe(false); - }); - - it('keeps an unmergeable config and reports the incomplete migration', () => { - fs.writeFileSync( - path.join(tmpDir, 'package.json'), - JSON.stringify({ name: 'test', devDependencies: { 'vite-plus': 'latest' } }), - ); - fs.writeFileSync( - path.join(tmpDir, 'vite.config.ts'), - 'const config = {}; export default config;\n', - ); - fs.writeFileSync(path.join(tmpDir, '.oxfmtrc.json'), '{"singleQuote":true}\n'); - const report = createMigrationReport(); - - const result = finalizeCoreMigrationForExistingVitePlus( - makeWorkspaceInfo(tmpDir, PackageManager.npm), - true, - report, - ); - expect(result.oxcConfigs).toBe(false); - expect(fs.existsSync(path.join(tmpDir, '.oxfmtrc.json'))).toBe(true); - expect(report.warnings.some((warning) => warning.includes('Failed to merge'))).toBe(true); - }); - it('detects package-level legacy signals in workspaces', () => { const appDir = path.join(tmpDir, 'packages', 'app'); fs.mkdirSync(appDir, { recursive: true }); @@ -8943,40 +8852,6 @@ describe('existing Vite+ core migration finalization', () => { expect(appPkg.scripts.dev).toBe('vp dev'); }); - it('finishes leftover Oxc and tsdown configs together and remains idempotent', () => { - fs.writeFileSync( - path.join(tmpDir, 'package.json'), - JSON.stringify({ name: 'test', devDependencies: { 'vite-plus': 'latest' } }), - ); - fs.writeFileSync(path.join(tmpDir, 'vite.config.ts'), 'export default {};\n'); - fs.writeFileSync(path.join(tmpDir, '.oxfmtrc.json'), '{"singleQuote":true,"semi":false}\n'); - fs.writeFileSync( - path.join(tmpDir, 'tsdown.config.ts'), - "import { defineConfig } from 'tsdown'; export default defineConfig({ entry: 'src/index.ts' });\n", - ); - const workspaceInfo = makeWorkspaceInfo(tmpDir, PackageManager.pnpm); - - const result = finalizeCoreMigrationForExistingVitePlus(workspaceInfo, true); - expect(result.oxcConfigs).toBe(true); - expect(result.tsdownConfig).toBe(true); - const config = fs.readFileSync(path.join(tmpDir, 'vite.config.ts'), 'utf8'); - expect(config).toContain('pack: tsdownConfig'); - expect(config).toContain('"singleQuote":true'); - expect(config).toContain('"semi":false'); - expect(fs.existsSync(path.join(tmpDir, '.oxfmtrc.json'))).toBe(false); - expect(fs.readFileSync(path.join(tmpDir, 'tsdown.config.ts'), 'utf8')).toContain( - "from 'vite-plus/pack'", - ); - expect(finalizeCoreMigrationForExistingVitePlus(workspaceInfo, true)).toEqual({ - scripts: false, - tsconfigTypes: false, - imports: false, - oxcConfigs: false, - tsdownConfig: false, - }); - expect(fs.readFileSync(path.join(tmpDir, 'vite.config.ts'), 'utf8')).toBe(config); - }); - it('makes a leftover tsdown config discoverable in an existing Vite+ project', () => { fs.writeFileSync( path.join(tmpDir, 'package.json'), @@ -8998,7 +8873,6 @@ export default defineConfig({ tsconfigTypes: false, imports: true, tsdownConfig: true, - oxcConfigs: false, }); expect(fs.readFileSync(path.join(tmpDir, 'vite.config.ts'), 'utf8')).toContain( "import tsdownConfig from './tsdown.config.js';", @@ -9015,7 +8889,6 @@ export default defineConfig({ tsconfigTypes: false, imports: false, tsdownConfig: false, - oxcConfigs: false, }); }); @@ -9052,7 +8925,6 @@ export default defineConfig({ entry: 'src/index.ts' }); tsconfigTypes: false, imports: true, tsdownConfig: false, - oxcConfigs: false, }); expect(fs.readFileSync(path.join(tmpDir, 'vite.config.ts'), 'utf8')).toBe(originalViteConfig); expect(report.tsdownImportCount).toBe(0); diff --git a/packages/cli/src/migration/bin.ts b/packages/cli/src/migration/bin.ts index 673df61615..ceaaa61ce8 100644 --- a/packages/cli/src/migration/bin.ts +++ b/packages/cli/src/migration/bin.ts @@ -1115,7 +1115,6 @@ async function main() { coreMigrationResult.scripts || coreMigrationResult.tsconfigTypes || coreMigrationResult.imports || - coreMigrationResult.oxcConfigs || coreMigrationResult.tsdownConfig ) { didMigrate = true; diff --git a/packages/cli/src/migration/migrator/core-finalization.ts b/packages/cli/src/migration/migrator/core-finalization.ts index ea2467186e..46b0d51d76 100644 --- a/packages/cli/src/migration/migrator/core-finalization.ts +++ b/packages/cli/src/migration/migrator/core-finalization.ts @@ -5,11 +5,9 @@ import { rewriteScripts } from '../../../binding/index.js'; import { type WorkspacePackage } from '../../types/index.ts'; import { editJsonFile, readJsonFile } from '../../utils/json.ts'; import { rulesDir } from '../../utils/path.ts'; -import { detectConfigs } from '../detector.ts'; import { hasTsconfigTypesToRewrite, mergeTsdownConfigFile, - mergeViteConfigFiles, rewriteAllImports, rewriteTsconfigTypes, } from '../migrator.ts'; @@ -83,7 +81,6 @@ export type CoreMigrationFinalizationResult = { scripts: boolean; tsconfigTypes: boolean; imports: boolean; - oxcConfigs: boolean; tsdownConfig: boolean; }; @@ -149,7 +146,6 @@ export function finalizeCoreMigrationForExistingVitePlus( scripts: false, tsconfigTypes: false, imports: false, - oxcConfigs: false, tsdownConfig: false, }; @@ -175,27 +171,5 @@ export function finalizeCoreMigrationForExistingVitePlus( result.tsdownConfig = mergeTsdownConfigFile(projectPath, silent, report) || result.tsdownConfig; } - // A failed migration may have installed Vite+ before merging these files. - // Finish that core work without opting into unrelated first-time setup. - for (const projectPath of projectPaths) { - const configs = detectConfigs(projectPath); - const standaloneConfigs = [configs.oxlintConfig, configs.oxfmtConfig].filter( - (config) => config !== undefined, - ); - if (standaloneConfigs.length === 0) { - continue; - } - mergeViteConfigFiles( - projectPath, - silent, - report, - workspaceInfo.packages, - workspaceInfo.rootDir, - ); - if (standaloneConfigs.some((config) => !fs.existsSync(path.join(projectPath, config)))) { - result.oxcConfigs = true; - } - } - return result; }