Skip to content

Commit 131de69

Browse files
authored
fix(migrate): use --force for npm post-migration install to apply overrides (#639)
npm doesn't re-resolve packages when overrides change if a stale lockfile exists. Pass `--force` to `vp install` after migration when using npm so the newly added overrides are actually applied to the lockfile.
1 parent 9dfd8d5 commit 131de69

7 files changed

Lines changed: 78 additions & 3 deletions

File tree

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
node_modules/

packages/cli/snap-tests-global/migration-standalone-npm/package-lock.json

Lines changed: 14 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"name": "migration-standalone-npm",
3+
"devDependencies": {
4+
"vite": "^7.0.0",
5+
"vitest": "^4.0.0"
6+
},
7+
"packageManager": "npm@10.9.2"
8+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
> vp migrate --no-interactive # migration should work with npm, add overrides, and update lockfile
2+
┌ VITE+ - The Unified Toolchain for the Web
3+
4+
● npm@<semver> installing...
5+
6+
● npm@<semver> installed
7+
8+
● Installing dependencies...
9+
10+
● Dependencies installed
11+
12+
◆ Wrote agent instructions to AGENTS.md
13+
14+
● Installing dependencies...
15+
16+
● Dependencies installed
17+
18+
└ ✔ Migration completed!
19+
20+
21+
> cat package.json # check package.json has overrides field (not pnpm.overrides)
22+
{
23+
"name": "migration-standalone-npm",
24+
"devDependencies": {
25+
"vite": "npm:@voidzero-dev/vite-plus-core@latest",
26+
"vitest": "npm:@voidzero-dev/vite-plus-test@latest",
27+
"vite-plus": "latest"
28+
},
29+
"packageManager": "npm@<semver>",
30+
"overrides": {
31+
"vite": "npm:@voidzero-dev/vite-plus-core@latest",
32+
"vitest": "npm:@voidzero-dev/vite-plus-test@latest"
33+
}
34+
}
35+
36+
[1]> node -e "const lock = require('./package-lock.json'); const vite = lock.packages['node_modules/vite']; if (vite && vite.resolved && vite.resolved.includes('@voidzero-dev/vite-plus-core')) console.log('lockfile has vite override'); else { console.error('vite override not found in lockfile'); process.exit(1); }" # verify lockfile updated with override
37+
vite override not found in lockfile
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"ignoredPlatforms": ["win32"],
3+
"env": {
4+
"VITE_DISABLE_AUTO_INSTALL": "1",
5+
"CI": ""
6+
},
7+
"commands": [
8+
"vp migrate --no-interactive # migration should work with npm, add overrides, and update lockfile",
9+
"cat package.json # check package.json has overrides field (not pnpm.overrides)",
10+
"node -e \"const lock = require('./package-lock.json'); const vite = lock.packages['node_modules/vite']; if (vite && vite.resolved && vite.resolved.includes('@voidzero-dev/vite-plus-core')) console.log('lockfile has vite override'); else { console.error('vite override not found in lockfile'); process.exit(1); }\" # verify lockfile updated with override"
11+
]
12+
}

packages/cli/src/migration/bin.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,10 @@ async function main() {
206206
});
207207

208208
// reinstall after migration
209-
await runViteInstall(workspaceInfo.rootDir, options.interactive);
209+
// npm needs --force to re-resolve packages with newly added overrides,
210+
// otherwise the stale lockfile prevents override resolution.
211+
const installArgs = packageManager === PackageManager.npm ? ['--force'] : undefined;
212+
await runViteInstall(workspaceInfo.rootDir, options.interactive, installArgs);
210213
prompts.outro(green('✔ Migration completed!'));
211214
}
212215

packages/cli/src/utils/prompts.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ export async function downloadPackageManager(
4949
return downloadResult;
5050
}
5151

52-
export async function runViteInstall(cwd: string, interactive?: boolean) {
52+
export async function runViteInstall(cwd: string, interactive?: boolean, extraArgs?: string[]) {
5353
// install dependencies on non-CI environment
5454
if (process.env.CI) {
5555
return;
@@ -59,7 +59,7 @@ export async function runViteInstall(cwd: string, interactive?: boolean) {
5959
spinner.start(`Installing dependencies...`);
6060
const { exitCode, stderr, stdout } = await runCommandSilently({
6161
command: process.env.VITE_PLUS_CLI_BIN ?? 'vp',
62-
args: ['install'],
62+
args: ['install', ...(extraArgs ?? [])],
6363
cwd,
6464
envs: process.env,
6565
});

0 commit comments

Comments
 (0)