From 070e2e75c32b96126b2aa83af3835baea8c99d65 Mon Sep 17 00:00:00 2001 From: naokihaba <59875779+naokihaba@users.noreply.github.com> Date: Fri, 27 Mar 2026 02:29:41 +0900 Subject: [PATCH 01/16] feat(config): add support for .nvmrc file detection --- packages/cli/src/migration/detector.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/cli/src/migration/detector.ts b/packages/cli/src/migration/detector.ts index e93cdedd79..e649ee3eac 100644 --- a/packages/cli/src/migration/detector.ts +++ b/packages/cli/src/migration/detector.ts @@ -11,6 +11,7 @@ export interface ConfigFiles { eslintLegacyConfig?: string; prettierConfig?: string; // e.g. '.prettierrc.json', 'prettier.config.js', PRETTIER_PACKAGE_JSON_CONFIG prettierIgnore?: boolean; + nvmrcFile?: boolean; } // Sentinel value indicating Prettier config lives inside package.json "prettier" key. @@ -178,5 +179,10 @@ export function detectConfigs(projectPath: string): ConfigFiles { configs.prettierIgnore = true; } + // Check for .nvmrc (nvm) + if (fs.existsSync(path.join(projectPath, '.nvmrc'))) { + configs.nvmrcFile = true; + } + return configs; } From 8cf6d89e134376e9c9d7f83f5ebb997ca5793b8e Mon Sep 17 00:00:00 2001 From: naokihaba <59875779+naokihaba@users.noreply.github.com> Date: Fri, 27 Mar 2026 02:45:06 +0900 Subject: [PATCH 02/16] feat(nvm): add support for detecting and migrating .nvmrc to .node-version --- packages/cli/src/migration/migrator.ts | 79 ++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/packages/cli/src/migration/migrator.ts b/packages/cli/src/migration/migrator.ts index 7d55e73501..baf451a2c7 100644 --- a/packages/cli/src/migration/migrator.ts +++ b/packages/cli/src/migration/migrator.ts @@ -1977,3 +1977,82 @@ function setPackageManager( return pkg; }); } + +export interface NodeVersionManagerDetection { + file: string; +} + +/** + * Detect a .nvmrc file in the project directory. + * Returns undefined if not found or .node-version already exists. + */ +export function detectNodeVersionManagerFile( + projectPath: string, +): NodeVersionManagerDetection | undefined { + // already has .node-version — skip detection to avoid false positives and preserve existing file + if (fs.existsSync(path.join(projectPath, '.node-version'))) { + return undefined; + } + + const configs = detectConfigs(projectPath); + if (configs.nvmrcFile) { + return { file: '.nvmrc' }; + } + return undefined; +} + +/** + * Parse a version string from a .nvmrc file. + * Returns null for unsupported aliases like "node", "stable", "system". + */ +export function parseNvmrcVersion(content: string): string | null { + const version = content.split('\n')[0]?.trim(); + + if (!version) { + return null; + } + + // Unsupported nvm aliases that have no direct version equivalent + if (['node', 'stable', 'iojs', 'system', 'default'].includes(version)) { + return null; + } + + // LTS aliases (lts/*, lts/iron, etc.) pass through as-is + if (version.startsWith('lts/')) { + return version; + } + + // Strip optional 'v' prefix + return version.startsWith('v') ? version.slice(1) : version; +} + +/** + * Migrate .nvmrc to .node-version and remove .nvmrc. + * Returns true on success, false if migration was skipped or failed. + */ +export function migrateNodeVersionManagerFile( + projectPath: string, + _detection: NodeVersionManagerDetection, + report?: MigrationReport, +): boolean { + const sourcePath = path.join(projectPath, '.nvmrc'); + const nodeVersionPath = path.join(projectPath, '.node-version'); + const content = fs.readFileSync(sourcePath, 'utf8'); + const version = parseNvmrcVersion(content); + + if (!version) { + warnMigration( + '.nvmrc contains an unsupported version alias. Create .node-version manually with your desired Node.js version.', + report, + ); + return false; + } + + fs.writeFileSync(nodeVersionPath, `${version}\n`); + fs.unlinkSync(sourcePath); + + if (report) { + report.nodeVersionFileMigrated = true; + } + return true; +} From 5b302a2d30e142f284de866067e33e7a5dda4462 Mon Sep 17 00:00:00 2001 From: naokihaba <59875779+naokihaba@users.noreply.github.com> Date: Fri, 27 Mar 2026 02:45:22 +0900 Subject: [PATCH 03/16] feat(report): add nodeVersionFileMigrated field to MigrationReport --- packages/cli/src/migration/report.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/cli/src/migration/report.ts b/packages/cli/src/migration/report.ts index 0201da93ac..a15c6b9cf7 100644 --- a/packages/cli/src/migration/report.ts +++ b/packages/cli/src/migration/report.ts @@ -9,6 +9,7 @@ export interface MigrationReport { rewrittenImportErrors: Array<{ path: string; message: string }>; eslintMigrated: boolean; prettierMigrated: boolean; + nodeVersionFileMigrated: boolean; gitHooksConfigured: boolean; warnings: string[]; manualSteps: string[]; @@ -26,6 +27,7 @@ export function createMigrationReport(): MigrationReport { rewrittenImportErrors: [], eslintMigrated: false, prettierMigrated: false, + nodeVersionFileMigrated: false, gitHooksConfigured: false, warnings: [], manualSteps: [], From ff66ccf63a3eded428192b4fc0afc96b73d83530 Mon Sep 17 00:00:00 2001 From: naokihaba <59875779+naokihaba@users.noreply.github.com> Date: Fri, 27 Mar 2026 02:51:16 +0900 Subject: [PATCH 04/16] feat(migration): add support for migrating node version manager files to .node-version --- packages/cli/src/migration/bin.ts | 49 ++++++++++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/packages/cli/src/migration/bin.ts b/packages/cli/src/migration/bin.ts index a20400f774..eeb00b8a22 100644 --- a/packages/cli/src/migration/bin.ts +++ b/packages/cli/src/migration/bin.ts @@ -44,14 +44,17 @@ import { checkVitestVersion, checkViteVersion, detectEslintProject, + detectNodeVersionManagerFile, detectPrettierProject, installGitHooks, mergeViteConfigFiles, migrateEslintToOxlint, + migrateNodeVersionManagerFile, migratePrettierToOxfmt, preflightGitHooksSetup, rewriteMonorepo, rewriteStandaloneProject, + type NodeVersionManagerDetection, } from './migrator.js'; import { createMigrationReport, type MigrationReport } from './report.js'; @@ -168,6 +171,21 @@ async function promptPrettierMigration( return true; } +async function confirmNodeVersionFileMigration(interactive: boolean): Promise { + if (interactive) { + const confirmed = await prompts.confirm({ + message: 'Migrate .nvmrc to .node-version?', + initialValue: true, + }); + if (prompts.isCancel(confirmed)) { + cancelAndExit(); + } + return !!confirmed; + } + prompts.log.info('.nvmrc detected. Auto-migrating to .node-version...'); + return true; +} + const helpMessage = renderCliDoc({ usage: 'vp migrate [PATH] [OPTIONS]', summary: @@ -319,6 +337,8 @@ interface MigrationPlan { eslintConfigFile?: string; migratePrettier: boolean; prettierConfigFile?: string; + migrateNodeVersionFile: boolean; + nodeVersionDetection?: NodeVersionManagerDetection; } async function collectMigrationPlan( @@ -436,6 +456,13 @@ async function collectMigrationPlan( warnPackageLevelPrettier(); } + // 10. Node version manager file detection + prompt + const nodeVersionDetection = detectNodeVersionManagerFile(rootDir); + let migrateNodeVersionFile = false; + if (nodeVersionDetection) { + migrateNodeVersionFile = await confirmNodeVersionFileMigration(options.interactive); + } + const plan: MigrationPlan = { packageManager, shouldSetupHooks, @@ -447,6 +474,8 @@ async function collectMigrationPlan( eslintConfigFile: eslintProject.configFile, migratePrettier, prettierConfigFile: prettierProject.configFile, + migrateNodeVersionFile, + nodeVersionDetection, }; return plan; @@ -523,6 +552,9 @@ function showMigrationSummary(options: { if (report.prettierMigrated) { log(`${styleText('gray', '•')} Prettier migrated to Oxfmt`); } + if (report.nodeVersionFileMigrated) { + log(`${styleText('gray', '•')} Node version manager file migrated to .node-version`); + } if (report.gitHooksConfigured) { log(`${styleText('gray', '•')} Git hooks configured`); } @@ -633,7 +665,13 @@ async function executeMigrationPlan( cancelAndExit('Vite+ cannot automatically migrate this project yet.', 1); } - // 3. Run vp install to ensure the project is ready + // 3. Migrate node version manager file → .node-version (independent of vite version) + if (plan.migrateNodeVersionFile && plan.nodeVersionDetection) { + updateMigrationProgress('Migrating node version file'); + migrateNodeVersionManagerFile(workspaceInfo.rootDir, plan.nodeVersionDetection, report); + } + + // 4. Run vp install to ensure the project is ready updateMigrationProgress('Installing dependencies'); const initialInstallSummary = await runViteInstall( workspaceInfo.rootDir, @@ -816,6 +854,15 @@ async function main() { workspaceInfoOptional.packages, ); + // Check if node version manager file migration is needed + const nodeVersionDetection = detectNodeVersionManagerFile(workspaceInfoOptional.rootDir); + if (nodeVersionDetection) { + const confirmed = await confirmNodeVersionFileMigration(options.interactive); + if (confirmed && migrateNodeVersionManagerFile(workspaceInfoOptional.rootDir, nodeVersionDetection, report)) { + didMigrate = true; + } + } + // Merge configs and reinstall once if any tool migration happened if (eslintMigrated || prettierMigrated) { updateMigrationProgress('Rewriting configs'); From d2e4dfd821500580bbd976a95112978f02944b64 Mon Sep 17 00:00:00 2001 From: naokihaba <59875779+naokihaba@users.noreply.github.com> Date: Fri, 27 Mar 2026 02:51:43 +0900 Subject: [PATCH 05/16] feat(tests): add tests for parsing and migrating .nvmrc to .node-version --- .../src/migration/__tests__/migrator.spec.ts | 109 +++++++++++++++++- 1 file changed, 107 insertions(+), 2 deletions(-) diff --git a/packages/cli/src/migration/__tests__/migrator.spec.ts b/packages/cli/src/migration/__tests__/migrator.spec.ts index bc2bb12ddd..fdbcd5725c 100644 --- a/packages/cli/src/migration/__tests__/migrator.spec.ts +++ b/packages/cli/src/migration/__tests__/migrator.spec.ts @@ -1,4 +1,8 @@ -import { describe, expect, it, vi } from 'vitest'; +import fs from 'node:fs'; +import os from 'node:os'; +import path from 'node:path'; + +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; import { PackageManager } from '../../types/index.js'; @@ -10,7 +14,12 @@ vi.mock('../../utils/constants.js', async (importOriginal) => { return { ...mod, VITE_PLUS_VERSION: 'latest' }; }); -const { rewritePackageJson } = await import('../migrator.js'); +const { + rewritePackageJson, + parseNvmrcVersion, + detectNodeVersionManagerFile, + migrateNodeVersionManagerFile, +} = await import('../migrator.js'); describe('rewritePackageJson', () => { it('should rewrite package.json scripts and extract staged config', async () => { @@ -121,3 +130,99 @@ describe('rewritePackageJson', () => { expect(pkg).toMatchSnapshot(); }); }); + +describe('parseNvmrcVersion', () => { + it('strips v prefix', () => { + expect(parseNvmrcVersion('v20.5.0\n')).toBe('20.5.0'); + expect(parseNvmrcVersion('v20.5.0')).toBe('20.5.0'); + }); + + it('passes through version without prefix', () => { + expect(parseNvmrcVersion('20.5.0\n')).toBe('20.5.0'); + expect(parseNvmrcVersion('20\n')).toBe('20'); + }); + + it('passes through lts aliases', () => { + expect(parseNvmrcVersion('lts/*\n')).toBe('lts/*'); + expect(parseNvmrcVersion('lts/iron\n')).toBe('lts/iron'); + expect(parseNvmrcVersion('lts/-1\n')).toBe('lts/-1'); + }); + + it('returns null for unsupported aliases', () => { + expect(parseNvmrcVersion('node\n')).toBeNull(); + expect(parseNvmrcVersion('stable\n')).toBeNull(); + expect(parseNvmrcVersion('system\n')).toBeNull(); + expect(parseNvmrcVersion('')).toBeNull(); + }); +}); + +describe('detectNodeVersionManagerFile', () => { + let tmpDir: string; + + beforeEach(() => { + tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'vp-test-')); + }); + + afterEach(() => { + fs.rmSync(tmpDir, { recursive: true, force: true }); + }); + + it('returns undefined when no version files found', () => { + expect(detectNodeVersionManagerFile(tmpDir)).toBeUndefined(); + }); + + it('returns undefined when .node-version already exists', () => { + fs.writeFileSync(path.join(tmpDir, '.node-version'), '20.5.0\n'); + fs.writeFileSync(path.join(tmpDir, '.nvmrc'), 'v20.5.0\n'); + expect(detectNodeVersionManagerFile(tmpDir)).toBeUndefined(); + }); + + it('detects .nvmrc', () => { + fs.writeFileSync(path.join(tmpDir, '.nvmrc'), 'v20.5.0\n'); + expect(detectNodeVersionManagerFile(tmpDir)).toEqual({ file: '.nvmrc' }); + }); +}); + +describe('migrateNodeVersionManagerFile', () => { + let tmpDir: string; + + beforeEach(() => { + tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'vp-test-')); + }); + + afterEach(() => { + fs.rmSync(tmpDir, { recursive: true, force: true }); + }); + + it('migrates .nvmrc to .node-version and removes .nvmrc', () => { + fs.writeFileSync(path.join(tmpDir, '.nvmrc'), 'v20.5.0\n'); + const ok = migrateNodeVersionManagerFile(tmpDir, { file: '.nvmrc' }); + expect(ok).toBe(true); + expect(fs.readFileSync(path.join(tmpDir, '.node-version'), 'utf8')).toBe('20.5.0\n'); + expect(fs.existsSync(path.join(tmpDir, '.nvmrc'))).toBe(false); + }); + + it('returns false and warns for unsupported alias', () => { + fs.writeFileSync(path.join(tmpDir, '.nvmrc'), 'node\n'); + const report = { + createdViteConfigCount: 0, + mergedConfigCount: 0, + mergedStagedConfigCount: 0, + inlinedLintStagedConfigCount: 0, + removedConfigCount: 0, + tsdownImportCount: 0, + rewrittenImportFileCount: 0, + rewrittenImportErrors: [], + eslintMigrated: false, + prettierMigrated: false, + nodeVersionFileMigrated: false, + gitHooksConfigured: false, + warnings: [], + manualSteps: [], + }; + const ok = migrateNodeVersionManagerFile(tmpDir, { file: '.nvmrc' }, report); + expect(ok).toBe(false); + expect(report.warnings.length).toBe(1); + expect(fs.existsSync(path.join(tmpDir, '.node-version'))).toBe(false); + }); +}); From 5a2b00f3dae9163b4b83299dc9185b16fae0115e Mon Sep 17 00:00:00 2001 From: naokihaba <59875779+naokihaba@users.noreply.github.com> Date: Fri, 27 Mar 2026 03:27:49 +0900 Subject: [PATCH 06/16] style(bin): format conditional statement for better readability --- packages/cli/src/migration/bin.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/cli/src/migration/bin.ts b/packages/cli/src/migration/bin.ts index eeb00b8a22..86f9800199 100644 --- a/packages/cli/src/migration/bin.ts +++ b/packages/cli/src/migration/bin.ts @@ -858,7 +858,10 @@ async function main() { const nodeVersionDetection = detectNodeVersionManagerFile(workspaceInfoOptional.rootDir); if (nodeVersionDetection) { const confirmed = await confirmNodeVersionFileMigration(options.interactive); - if (confirmed && migrateNodeVersionManagerFile(workspaceInfoOptional.rootDir, nodeVersionDetection, report)) { + if ( + confirmed && + migrateNodeVersionManagerFile(workspaceInfoOptional.rootDir, nodeVersionDetection, report) + ) { didMigrate = true; } } From db3da182a1882fb5665db5dc40f7c27251613d3b Mon Sep 17 00:00:00 2001 From: naokihaba <59875779+naokihaba@users.noreply.github.com> Date: Fri, 27 Mar 2026 03:41:59 +0900 Subject: [PATCH 07/16] feat(tests): add test for invalid version strings in parseNvmrcVersion --- packages/cli/src/migration/__tests__/migrator.spec.ts | 6 ++++++ packages/cli/src/migration/migrator.ts | 8 ++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/packages/cli/src/migration/__tests__/migrator.spec.ts b/packages/cli/src/migration/__tests__/migrator.spec.ts index fdbcd5725c..9e748fb24f 100644 --- a/packages/cli/src/migration/__tests__/migrator.spec.ts +++ b/packages/cli/src/migration/__tests__/migrator.spec.ts @@ -154,6 +154,12 @@ describe('parseNvmrcVersion', () => { expect(parseNvmrcVersion('system\n')).toBeNull(); expect(parseNvmrcVersion('')).toBeNull(); }); + + it('returns null for invalid version strings', () => { + expect(parseNvmrcVersion('v\n')).toBeNull(); + expect(parseNvmrcVersion('laetst\n')).toBeNull(); + expect(parseNvmrcVersion('20.5.0.1\n')).toBeNull(); + }); }); describe('detectNodeVersionManagerFile', () => { diff --git a/packages/cli/src/migration/migrator.ts b/packages/cli/src/migration/migrator.ts index baf451a2c7..75f829491c 100644 --- a/packages/cli/src/migration/migrator.ts +++ b/packages/cli/src/migration/migrator.ts @@ -2022,8 +2022,12 @@ export function parseNvmrcVersion(content: string): string | null { return version; } - // Strip optional 'v' prefix - return version.startsWith('v') ? version.slice(1) : version; + // Strip optional 'v' prefix, then validate as a semver version or range + const normalized = version.startsWith('v') ? version.slice(1) : version; + if (!normalized || !semver.validRange(normalized)) { + return null; + } + return normalized; } /** From b80bf48eb50eff71059f0841b54bbf8828f73c95 Mon Sep 17 00:00:00 2001 From: naokihaba <59875779+naokihaba@users.noreply.github.com> Date: Fri, 27 Mar 2026 14:07:29 +0900 Subject: [PATCH 08/16] feat(migration): enhance parseNvmrcVersion to handle additional unsupported aliases --- packages/cli/src/migration/__tests__/migrator.spec.ts | 4 +++- packages/cli/src/migration/migrator.ts | 6 +++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/cli/src/migration/__tests__/migrator.spec.ts b/packages/cli/src/migration/__tests__/migrator.spec.ts index 9e748fb24f..f887defbec 100644 --- a/packages/cli/src/migration/__tests__/migrator.spec.ts +++ b/packages/cli/src/migration/__tests__/migrator.spec.ts @@ -151,7 +151,9 @@ describe('parseNvmrcVersion', () => { it('returns null for unsupported aliases', () => { expect(parseNvmrcVersion('node\n')).toBeNull(); expect(parseNvmrcVersion('stable\n')).toBeNull(); + expect(parseNvmrcVersion('iojs\n')).toBeNull(); expect(parseNvmrcVersion('system\n')).toBeNull(); + expect(parseNvmrcVersion('default\n')).toBeNull(); expect(parseNvmrcVersion('')).toBeNull(); }); @@ -209,7 +211,7 @@ describe('migrateNodeVersionManagerFile', () => { }); it('returns false and warns for unsupported alias', () => { - fs.writeFileSync(path.join(tmpDir, '.nvmrc'), 'node\n'); + fs.writeFileSync(path.join(tmpDir, '.nvmrc'), 'system\n'); const report = { createdViteConfigCount: 0, mergedConfigCount: 0, diff --git a/packages/cli/src/migration/migrator.ts b/packages/cli/src/migration/migrator.ts index 75f829491c..5c3c7c7d18 100644 --- a/packages/cli/src/migration/migrator.ts +++ b/packages/cli/src/migration/migrator.ts @@ -2012,7 +2012,11 @@ export function parseNvmrcVersion(content: string): string | null { return null; } - // Unsupported nvm aliases that have no direct version equivalent + // These aliases are intentionally not mapped to lts/* even though it might seem natural. + // "node" and "stable" resolve to the latest Node.js release, which is not always an LTS + // (e.g. Node 25 is the latest but not LTS). Silently converting to lts/* could downgrade + // users to Node 22 without them noticing. We emit a warning instead and let users decide. + // "iojs", "system", and "default" have no meaningful equivalent at all. if (['node', 'stable', 'iojs', 'system', 'default'].includes(version)) { return null; } From 759bcc93849829abad4190f78b9b4281ed314a13 Mon Sep 17 00:00:00 2001 From: naokihaba <59875779+naokihaba@users.noreply.github.com> Date: Fri, 27 Mar 2026 14:08:49 +0900 Subject: [PATCH 09/16] feat(migration): add migration support for .nvmrc files to .node-version --- .../snap-tests-global/migration-nvmrc-lts/.nvmrc | 1 + .../migration-nvmrc-lts/package.json | 6 ++++++ .../migration-nvmrc-lts/snap.txt | 14 ++++++++++++++ .../migration-nvmrc-lts/steps.json | 7 +++++++ .../migration-nvmrc-node-alias/.nvmrc | 1 + .../migration-nvmrc-node-alias/package.json | 6 ++++++ .../migration-nvmrc-node-alias/snap.txt | 15 +++++++++++++++ .../migration-nvmrc-node-alias/steps.json | 7 +++++++ .../cli/snap-tests-global/migration-nvmrc/.nvmrc | 1 + .../migration-nvmrc/package.json | 6 ++++++ .../snap-tests-global/migration-nvmrc/snap.txt | 14 ++++++++++++++ .../snap-tests-global/migration-nvmrc/steps.json | 7 +++++++ 12 files changed, 85 insertions(+) create mode 100644 packages/cli/snap-tests-global/migration-nvmrc-lts/.nvmrc create mode 100644 packages/cli/snap-tests-global/migration-nvmrc-lts/package.json create mode 100644 packages/cli/snap-tests-global/migration-nvmrc-lts/snap.txt create mode 100644 packages/cli/snap-tests-global/migration-nvmrc-lts/steps.json create mode 100644 packages/cli/snap-tests-global/migration-nvmrc-node-alias/.nvmrc create mode 100644 packages/cli/snap-tests-global/migration-nvmrc-node-alias/package.json create mode 100644 packages/cli/snap-tests-global/migration-nvmrc-node-alias/snap.txt create mode 100644 packages/cli/snap-tests-global/migration-nvmrc-node-alias/steps.json create mode 100644 packages/cli/snap-tests-global/migration-nvmrc/.nvmrc create mode 100644 packages/cli/snap-tests-global/migration-nvmrc/package.json create mode 100644 packages/cli/snap-tests-global/migration-nvmrc/snap.txt create mode 100644 packages/cli/snap-tests-global/migration-nvmrc/steps.json diff --git a/packages/cli/snap-tests-global/migration-nvmrc-lts/.nvmrc b/packages/cli/snap-tests-global/migration-nvmrc-lts/.nvmrc new file mode 100644 index 0000000000..9de2256827 --- /dev/null +++ b/packages/cli/snap-tests-global/migration-nvmrc-lts/.nvmrc @@ -0,0 +1 @@ +lts/iron diff --git a/packages/cli/snap-tests-global/migration-nvmrc-lts/package.json b/packages/cli/snap-tests-global/migration-nvmrc-lts/package.json new file mode 100644 index 0000000000..9f77e80435 --- /dev/null +++ b/packages/cli/snap-tests-global/migration-nvmrc-lts/package.json @@ -0,0 +1,6 @@ +{ + "name": "migration-nvmrc-lts", + "devDependencies": { + "vite": "^7.0.0" + } +} diff --git a/packages/cli/snap-tests-global/migration-nvmrc-lts/snap.txt b/packages/cli/snap-tests-global/migration-nvmrc-lts/snap.txt new file mode 100644 index 0000000000..03af699ba4 --- /dev/null +++ b/packages/cli/snap-tests-global/migration-nvmrc-lts/snap.txt @@ -0,0 +1,14 @@ +> vp migrate --no-interactive # migration should detect .nvmrc with lts alias and auto-migrate +VITE+ - The Unified Toolchain for the Web + + +.nvmrc detected. Auto-migrating to .node-version... +◇ Migrated . to Vite+ +• Node pnpm +• 2 config updates applied +• Node version manager file migrated to .node-version + +> cat .node-version # check lts alias is preserved as-is +lts/iron + +> test ! -f .nvmrc # check .nvmrc is removed \ No newline at end of file diff --git a/packages/cli/snap-tests-global/migration-nvmrc-lts/steps.json b/packages/cli/snap-tests-global/migration-nvmrc-lts/steps.json new file mode 100644 index 0000000000..6b171382e1 --- /dev/null +++ b/packages/cli/snap-tests-global/migration-nvmrc-lts/steps.json @@ -0,0 +1,7 @@ +{ + "commands": [ + "vp migrate --no-interactive # migration should detect .nvmrc with lts alias and auto-migrate", + "cat .node-version # check lts alias is preserved as-is", + "test ! -f .nvmrc # check .nvmrc is removed" + ] +} diff --git a/packages/cli/snap-tests-global/migration-nvmrc-node-alias/.nvmrc b/packages/cli/snap-tests-global/migration-nvmrc-node-alias/.nvmrc new file mode 100644 index 0000000000..64f5a0a681 --- /dev/null +++ b/packages/cli/snap-tests-global/migration-nvmrc-node-alias/.nvmrc @@ -0,0 +1 @@ +node diff --git a/packages/cli/snap-tests-global/migration-nvmrc-node-alias/package.json b/packages/cli/snap-tests-global/migration-nvmrc-node-alias/package.json new file mode 100644 index 0000000000..aff9054c01 --- /dev/null +++ b/packages/cli/snap-tests-global/migration-nvmrc-node-alias/package.json @@ -0,0 +1,6 @@ +{ + "name": "migration-nvmrc-node-alias", + "devDependencies": { + "vite": "^7.0.0" + } +} diff --git a/packages/cli/snap-tests-global/migration-nvmrc-node-alias/snap.txt b/packages/cli/snap-tests-global/migration-nvmrc-node-alias/snap.txt new file mode 100644 index 0000000000..3e4fcf4eda --- /dev/null +++ b/packages/cli/snap-tests-global/migration-nvmrc-node-alias/snap.txt @@ -0,0 +1,15 @@ +> vp migrate --no-interactive # 'node' alias should be migrated to lts/* +VITE+ - The Unified Toolchain for the Web + + +.nvmrc detected. Auto-migrating to .node-version... +◇ Migrated . to Vite+ +• Node pnpm +• 2 config updates applied +! Warnings: + - .nvmrc contains an unsupported version alias. Create .node-version manually with your desired Node.js version. + +[1]> cat .node-version # check node alias is converted to lts/* +cat: .node-version: No such file or directory + +[1]> test ! -f .nvmrc # check .nvmrc is removed \ No newline at end of file diff --git a/packages/cli/snap-tests-global/migration-nvmrc-node-alias/steps.json b/packages/cli/snap-tests-global/migration-nvmrc-node-alias/steps.json new file mode 100644 index 0000000000..0e859a6cb3 --- /dev/null +++ b/packages/cli/snap-tests-global/migration-nvmrc-node-alias/steps.json @@ -0,0 +1,7 @@ +{ + "commands": [ + "vp migrate --no-interactive # 'node' alias cannot be auto-migrated, should warn", + "test ! -f .node-version # check .node-version is NOT created", + "test -f .nvmrc # check .nvmrc is preserved" + ] +} diff --git a/packages/cli/snap-tests-global/migration-nvmrc/.nvmrc b/packages/cli/snap-tests-global/migration-nvmrc/.nvmrc new file mode 100644 index 0000000000..d7fd7cd552 --- /dev/null +++ b/packages/cli/snap-tests-global/migration-nvmrc/.nvmrc @@ -0,0 +1 @@ +v25.8.2 diff --git a/packages/cli/snap-tests-global/migration-nvmrc/package.json b/packages/cli/snap-tests-global/migration-nvmrc/package.json new file mode 100644 index 0000000000..da19acdd77 --- /dev/null +++ b/packages/cli/snap-tests-global/migration-nvmrc/package.json @@ -0,0 +1,6 @@ +{ + "name": "migration-nvmrc", + "devDependencies": { + "vite": "^7.0.0" + } +} diff --git a/packages/cli/snap-tests-global/migration-nvmrc/snap.txt b/packages/cli/snap-tests-global/migration-nvmrc/snap.txt new file mode 100644 index 0000000000..0217d4b181 --- /dev/null +++ b/packages/cli/snap-tests-global/migration-nvmrc/snap.txt @@ -0,0 +1,14 @@ +> vp migrate --no-interactive # migration should detect .nvmrc and auto-migrate to .node-version +VITE+ - The Unified Toolchain for the Web + + +.nvmrc detected. Auto-migrating to .node-version... +◇ Migrated . to Vite+ +• Node pnpm +• 2 config updates applied +• Node version manager file migrated to .node-version + +> cat .node-version # check .node-version is created with v prefix stripped +25.8.2 + +> test ! -f .nvmrc # check .nvmrc is removed \ No newline at end of file diff --git a/packages/cli/snap-tests-global/migration-nvmrc/steps.json b/packages/cli/snap-tests-global/migration-nvmrc/steps.json new file mode 100644 index 0000000000..f4b82e6b0a --- /dev/null +++ b/packages/cli/snap-tests-global/migration-nvmrc/steps.json @@ -0,0 +1,7 @@ +{ + "commands": [ + "vp migrate --no-interactive # migration should detect .nvmrc and auto-migrate to .node-version", + "cat .node-version # check .node-version is created with v prefix stripped", + "test ! -f .nvmrc # check .nvmrc is removed" + ] +} From 93ae0f5f67025cd47d43ac85f846cc6a369c6dff Mon Sep 17 00:00:00 2001 From: naokihaba <59875779+naokihaba@users.noreply.github.com> Date: Fri, 27 Mar 2026 14:19:26 +0900 Subject: [PATCH 10/16] feat(migration): update parseNvmrcVersion to map 'node' and 'stable' to 'lts/*' with logging --- .../src/migration/__tests__/migrator.spec.ts | 9 +++++--- packages/cli/src/migration/migrator.ts | 21 +++++++++++++------ 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/packages/cli/src/migration/__tests__/migrator.spec.ts b/packages/cli/src/migration/__tests__/migrator.spec.ts index f887defbec..e61752bee0 100644 --- a/packages/cli/src/migration/__tests__/migrator.spec.ts +++ b/packages/cli/src/migration/__tests__/migrator.spec.ts @@ -148,9 +148,12 @@ describe('parseNvmrcVersion', () => { expect(parseNvmrcVersion('lts/-1\n')).toBe('lts/-1'); }); - it('returns null for unsupported aliases', () => { - expect(parseNvmrcVersion('node\n')).toBeNull(); - expect(parseNvmrcVersion('stable\n')).toBeNull(); + it('converts node/stable aliases to lts/*', () => { + expect(parseNvmrcVersion('node\n')).toBe('lts/*'); + expect(parseNvmrcVersion('stable\n')).toBe('lts/*'); + }); + + it('returns null for untranslatable aliases', () => { expect(parseNvmrcVersion('iojs\n')).toBeNull(); expect(parseNvmrcVersion('system\n')).toBeNull(); expect(parseNvmrcVersion('default\n')).toBeNull(); diff --git a/packages/cli/src/migration/migrator.ts b/packages/cli/src/migration/migrator.ts index 5c3c7c7d18..810f8f1b02 100644 --- a/packages/cli/src/migration/migrator.ts +++ b/packages/cli/src/migration/migrator.ts @@ -2012,12 +2012,16 @@ export function parseNvmrcVersion(content: string): string | null { return null; } - // These aliases are intentionally not mapped to lts/* even though it might seem natural. - // "node" and "stable" resolve to the latest Node.js release, which is not always an LTS - // (e.g. Node 25 is the latest but not LTS). Silently converting to lts/* could downgrade - // users to Node 22 without them noticing. We emit a warning instead and let users decide. - // "iojs", "system", and "default" have no meaningful equivalent at all. - if (['node', 'stable', 'iojs', 'system', 'default'].includes(version)) { + // "node" and "stable" mean "latest stable release" which maps closely to lts/*. + // Starting from Node 27, all releases will be LTS, so the gap is shrinking. + // We map these to lts/* and log the conversion so users are aware. + if (version === 'node' || version === 'stable') { + return 'lts/*'; + } + + // "iojs", "system", and "default" have no meaningful equivalent and cannot be auto-migrated. + // TODO: consider an interactive prompt (e.g. "pin to lts/* or skip?") for these cases. + if (version === 'iojs' || version === 'system' || version === 'default') { return null; } @@ -2046,6 +2050,7 @@ export function migrateNodeVersionManagerFile( const sourcePath = path.join(projectPath, '.nvmrc'); const nodeVersionPath = path.join(projectPath, '.node-version'); const content = fs.readFileSync(sourcePath, 'utf8'); + const originalAlias = content.split('\n')[0]?.trim(); const version = parseNvmrcVersion(content); if (!version) { @@ -2056,6 +2061,10 @@ export function migrateNodeVersionManagerFile( return false; } + if (version === 'lts/*' && (originalAlias === 'node' || originalAlias === 'stable')) { + infoMigration(`"${originalAlias}" in .nvmrc is not a specific version; automatically mapping to "lts/*"`, report); + } + fs.writeFileSync(nodeVersionPath, `${version}\n`); fs.unlinkSync(sourcePath); From 7d64b46ef84c45430188dc189617006b067a85b8 Mon Sep 17 00:00:00 2001 From: naokihaba <59875779+naokihaba@users.noreply.github.com> Date: Fri, 27 Mar 2026 14:22:49 +0900 Subject: [PATCH 11/16] feat(migration): update migration warning for 'node' alias and clarify manual follow-up steps --- .../migration-nvmrc-node-alias/snap.txt | 13 +++++++------ .../migration-nvmrc-node-alias/steps.json | 6 +++--- packages/cli/src/migration/migrator.ts | 2 +- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/packages/cli/snap-tests-global/migration-nvmrc-node-alias/snap.txt b/packages/cli/snap-tests-global/migration-nvmrc-node-alias/snap.txt index 3e4fcf4eda..8727c58177 100644 --- a/packages/cli/snap-tests-global/migration-nvmrc-node-alias/snap.txt +++ b/packages/cli/snap-tests-global/migration-nvmrc-node-alias/snap.txt @@ -1,4 +1,4 @@ -> vp migrate --no-interactive # 'node' alias should be migrated to lts/* +> vp migrate --no-interactive # 'node' alias should be mapped to lts/* with an info message VITE+ - The Unified Toolchain for the Web @@ -6,10 +6,11 @@ VITE+ - The Unified Toolchain for the Web ◇ Migrated . to Vite+ • Node pnpm • 2 config updates applied -! Warnings: - - .nvmrc contains an unsupported version alias. Create .node-version manually with your desired Node.js version. +• Node version manager file migrated to .node-version +→ Manual follow-up: + - "node" in .nvmrc is not a specific version; automatically mapping to "lts/*" -[1]> cat .node-version # check node alias is converted to lts/* -cat: .node-version: No such file or directory +> cat .node-version # check node alias is mapped to lts/* +lts/* -[1]> test ! -f .nvmrc # check .nvmrc is removed \ No newline at end of file +> test ! -f .nvmrc # check .nvmrc is removed \ No newline at end of file diff --git a/packages/cli/snap-tests-global/migration-nvmrc-node-alias/steps.json b/packages/cli/snap-tests-global/migration-nvmrc-node-alias/steps.json index 0e859a6cb3..4b4ef84a0e 100644 --- a/packages/cli/snap-tests-global/migration-nvmrc-node-alias/steps.json +++ b/packages/cli/snap-tests-global/migration-nvmrc-node-alias/steps.json @@ -1,7 +1,7 @@ { "commands": [ - "vp migrate --no-interactive # 'node' alias cannot be auto-migrated, should warn", - "test ! -f .node-version # check .node-version is NOT created", - "test -f .nvmrc # check .nvmrc is preserved" + "vp migrate --no-interactive # 'node' alias should be mapped to lts/* with an info message", + "cat .node-version # check node alias is mapped to lts/*", + "test ! -f .nvmrc # check .nvmrc is removed" ] } diff --git a/packages/cli/src/migration/migrator.ts b/packages/cli/src/migration/migrator.ts index 810f8f1b02..57368f3491 100644 --- a/packages/cli/src/migration/migrator.ts +++ b/packages/cli/src/migration/migrator.ts @@ -2062,7 +2062,7 @@ export function migrateNodeVersionManagerFile( } if (version === 'lts/*' && (originalAlias === 'node' || originalAlias === 'stable')) { - infoMigration(`"${originalAlias}" in .nvmrc is not a specific version; automatically mapping to "lts/*"`, report); + prompts.log.info(`"${originalAlias}" in .nvmrc is not a specific version; automatically mapping to "lts/*"`); } fs.writeFileSync(nodeVersionPath, `${version}\n`); From 374677a670ed6b99dc9f0342d2bbd108dacc6240 Mon Sep 17 00:00:00 2001 From: naokihaba <59875779+naokihaba@users.noreply.github.com> Date: Fri, 27 Mar 2026 14:23:48 +0900 Subject: [PATCH 12/16] feat(migration): update migration message for 'node' alias and remove manual follow-up note --- .../cli/snap-tests-global/migration-nvmrc-node-alias/snap.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/cli/snap-tests-global/migration-nvmrc-node-alias/snap.txt b/packages/cli/snap-tests-global/migration-nvmrc-node-alias/snap.txt index 8727c58177..a5751a0a18 100644 --- a/packages/cli/snap-tests-global/migration-nvmrc-node-alias/snap.txt +++ b/packages/cli/snap-tests-global/migration-nvmrc-node-alias/snap.txt @@ -3,12 +3,12 @@ VITE+ - The Unified Toolchain for the Web .nvmrc detected. Auto-migrating to .node-version... + +"node" in .nvmrc is not a specific version; automatically mapping to "lts/*" ◇ Migrated . to Vite+ • Node pnpm • 2 config updates applied • Node version manager file migrated to .node-version -→ Manual follow-up: - - "node" in .nvmrc is not a specific version; automatically mapping to "lts/*" > cat .node-version # check node alias is mapped to lts/* lts/* From 4668548b0665eef468d6a5584a55cd72e080f7b4 Mon Sep 17 00:00:00 2001 From: naokihaba <59875779+naokihaba@users.noreply.github.com> Date: Fri, 27 Mar 2026 14:26:37 +0900 Subject: [PATCH 13/16] feat(migration): improve logging for automatic mapping of .nvmrc aliases to lts/* --- packages/cli/src/migration/migrator.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/cli/src/migration/migrator.ts b/packages/cli/src/migration/migrator.ts index 57368f3491..2aeff95f31 100644 --- a/packages/cli/src/migration/migrator.ts +++ b/packages/cli/src/migration/migrator.ts @@ -2062,7 +2062,9 @@ export function migrateNodeVersionManagerFile( } if (version === 'lts/*' && (originalAlias === 'node' || originalAlias === 'stable')) { - prompts.log.info(`"${originalAlias}" in .nvmrc is not a specific version; automatically mapping to "lts/*"`); + prompts.log.info( + `"${originalAlias}" in .nvmrc is not a specific version; automatically mapping to "lts/*"`, + ); } fs.writeFileSync(nodeVersionPath, `${version}\n`); From 065b3217fd36796b6e572cf4dca07d28390b0ac2 Mon Sep 17 00:00:00 2001 From: naokihaba <59875779+naokihaba@users.noreply.github.com> Date: Fri, 27 Mar 2026 14:31:01 +0900 Subject: [PATCH 14/16] feat(migration): update comments for nvmrc version handling and logging --- packages/cli/src/migration/migrator.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/cli/src/migration/migrator.ts b/packages/cli/src/migration/migrator.ts index 2aeff95f31..6ea796b9ee 100644 --- a/packages/cli/src/migration/migrator.ts +++ b/packages/cli/src/migration/migrator.ts @@ -2020,7 +2020,6 @@ export function parseNvmrcVersion(content: string): string | null { } // "iojs", "system", and "default" have no meaningful equivalent and cannot be auto-migrated. - // TODO: consider an interactive prompt (e.g. "pin to lts/* or skip?") for these cases. if (version === 'iojs' || version === 'system' || version === 'default') { return null; } @@ -2061,6 +2060,8 @@ export function migrateNodeVersionManagerFile( return false; } + // TODO: remove this log once Node 27+ makes all releases LTS, at which point + // "node"/"stable" and "lts/*" will be effectively equivalent. if (version === 'lts/*' && (originalAlias === 'node' || originalAlias === 'stable')) { prompts.log.info( `"${originalAlias}" in .nvmrc is not a specific version; automatically mapping to "lts/*"`, From d3997a3867a350606e99b2408df728f0d5dc74a7 Mon Sep 17 00:00:00 2001 From: naokihaba <59875779+naokihaba@users.noreply.github.com> Date: Fri, 27 Mar 2026 17:36:50 +0900 Subject: [PATCH 15/16] refactor(migrator): simplify parseNvmrcVersion function and improve alias handling --- .../src/migration/__tests__/migrator.spec.ts | 27 +++++++++---------- packages/cli/src/migration/migrator.ts | 13 ++++----- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/packages/cli/src/migration/__tests__/migrator.spec.ts b/packages/cli/src/migration/__tests__/migrator.spec.ts index e61752bee0..47a9086448 100644 --- a/packages/cli/src/migration/__tests__/migrator.spec.ts +++ b/packages/cli/src/migration/__tests__/migrator.spec.ts @@ -133,37 +133,36 @@ describe('rewritePackageJson', () => { describe('parseNvmrcVersion', () => { it('strips v prefix', () => { - expect(parseNvmrcVersion('v20.5.0\n')).toBe('20.5.0'); expect(parseNvmrcVersion('v20.5.0')).toBe('20.5.0'); }); it('passes through version without prefix', () => { - expect(parseNvmrcVersion('20.5.0\n')).toBe('20.5.0'); - expect(parseNvmrcVersion('20\n')).toBe('20'); + expect(parseNvmrcVersion('20.5.0')).toBe('20.5.0'); + expect(parseNvmrcVersion('20')).toBe('20'); }); it('passes through lts aliases', () => { - expect(parseNvmrcVersion('lts/*\n')).toBe('lts/*'); - expect(parseNvmrcVersion('lts/iron\n')).toBe('lts/iron'); - expect(parseNvmrcVersion('lts/-1\n')).toBe('lts/-1'); + expect(parseNvmrcVersion('lts/*')).toBe('lts/*'); + expect(parseNvmrcVersion('lts/iron')).toBe('lts/iron'); + expect(parseNvmrcVersion('lts/-1')).toBe('lts/-1'); }); it('converts node/stable aliases to lts/*', () => { - expect(parseNvmrcVersion('node\n')).toBe('lts/*'); - expect(parseNvmrcVersion('stable\n')).toBe('lts/*'); + expect(parseNvmrcVersion('node')).toBe('lts/*'); + expect(parseNvmrcVersion('stable')).toBe('lts/*'); }); it('returns null for untranslatable aliases', () => { - expect(parseNvmrcVersion('iojs\n')).toBeNull(); - expect(parseNvmrcVersion('system\n')).toBeNull(); - expect(parseNvmrcVersion('default\n')).toBeNull(); + expect(parseNvmrcVersion('iojs')).toBeNull(); + expect(parseNvmrcVersion('system')).toBeNull(); + expect(parseNvmrcVersion('default')).toBeNull(); expect(parseNvmrcVersion('')).toBeNull(); }); it('returns null for invalid version strings', () => { - expect(parseNvmrcVersion('v\n')).toBeNull(); - expect(parseNvmrcVersion('laetst\n')).toBeNull(); - expect(parseNvmrcVersion('20.5.0.1\n')).toBeNull(); + expect(parseNvmrcVersion('v')).toBeNull(); + expect(parseNvmrcVersion('laetst')).toBeNull(); + expect(parseNvmrcVersion('20.5.0.1')).toBeNull(); }); }); diff --git a/packages/cli/src/migration/migrator.ts b/packages/cli/src/migration/migrator.ts index d987a9188b..6b3111062c 100644 --- a/packages/cli/src/migration/migrator.ts +++ b/packages/cli/src/migration/migrator.ts @@ -2002,11 +2002,12 @@ export function detectNodeVersionManagerFile( } /** - * Parse a version string from a .nvmrc file. - * Returns null for unsupported aliases like "node", "stable", "system". + * Parse a version alias from a .nvmrc file into a .node-version compatible string. + * Accepts the first line of .nvmrc (pre-trimmed). + * Returns null for unsupported aliases like "system", "default", "iojs". */ -export function parseNvmrcVersion(content: string): string | null { - const version = content.split('\n')[0]?.trim(); +export function parseNvmrcVersion(alias: string): string | null { + const version = alias.trim(); if (!version) { return null; @@ -2049,8 +2050,8 @@ export function migrateNodeVersionManagerFile( const sourcePath = path.join(projectPath, '.nvmrc'); const nodeVersionPath = path.join(projectPath, '.node-version'); const content = fs.readFileSync(sourcePath, 'utf8'); - const originalAlias = content.split('\n')[0]?.trim(); - const version = parseNvmrcVersion(content); + const originalAlias = content.split('\n')[0]?.trim() ?? ''; + const version = parseNvmrcVersion(originalAlias); if (!version) { warnMigration( From 085b9df522d6a0f91c0094d5d189c7e99582e361 Mon Sep 17 00:00:00 2001 From: naokihaba <59875779+naokihaba@users.noreply.github.com> Date: Fri, 27 Mar 2026 17:58:48 +0900 Subject: [PATCH 16/16] refactor(migration): remove redundant auto-migration log message for .nvmrc --- packages/cli/snap-tests-global/migration-nvmrc-lts/snap.txt | 2 -- .../cli/snap-tests-global/migration-nvmrc-node-alias/snap.txt | 2 -- packages/cli/snap-tests-global/migration-nvmrc/snap.txt | 2 -- packages/cli/src/migration/bin.ts | 1 - 4 files changed, 7 deletions(-) diff --git a/packages/cli/snap-tests-global/migration-nvmrc-lts/snap.txt b/packages/cli/snap-tests-global/migration-nvmrc-lts/snap.txt index 03af699ba4..674e0956ca 100644 --- a/packages/cli/snap-tests-global/migration-nvmrc-lts/snap.txt +++ b/packages/cli/snap-tests-global/migration-nvmrc-lts/snap.txt @@ -1,8 +1,6 @@ > vp migrate --no-interactive # migration should detect .nvmrc with lts alias and auto-migrate VITE+ - The Unified Toolchain for the Web - -.nvmrc detected. Auto-migrating to .node-version... ◇ Migrated . to Vite+ • Node pnpm • 2 config updates applied diff --git a/packages/cli/snap-tests-global/migration-nvmrc-node-alias/snap.txt b/packages/cli/snap-tests-global/migration-nvmrc-node-alias/snap.txt index a5751a0a18..d4ddebebb5 100644 --- a/packages/cli/snap-tests-global/migration-nvmrc-node-alias/snap.txt +++ b/packages/cli/snap-tests-global/migration-nvmrc-node-alias/snap.txt @@ -2,8 +2,6 @@ VITE+ - The Unified Toolchain for the Web -.nvmrc detected. Auto-migrating to .node-version... - "node" in .nvmrc is not a specific version; automatically mapping to "lts/*" ◇ Migrated . to Vite+ • Node pnpm diff --git a/packages/cli/snap-tests-global/migration-nvmrc/snap.txt b/packages/cli/snap-tests-global/migration-nvmrc/snap.txt index 0217d4b181..2c8deae314 100644 --- a/packages/cli/snap-tests-global/migration-nvmrc/snap.txt +++ b/packages/cli/snap-tests-global/migration-nvmrc/snap.txt @@ -1,8 +1,6 @@ > vp migrate --no-interactive # migration should detect .nvmrc and auto-migrate to .node-version VITE+ - The Unified Toolchain for the Web - -.nvmrc detected. Auto-migrating to .node-version... ◇ Migrated . to Vite+ • Node pnpm • 2 config updates applied diff --git a/packages/cli/src/migration/bin.ts b/packages/cli/src/migration/bin.ts index 86f9800199..335ffc2d97 100644 --- a/packages/cli/src/migration/bin.ts +++ b/packages/cli/src/migration/bin.ts @@ -182,7 +182,6 @@ async function confirmNodeVersionFileMigration(interactive: boolean): Promise