Skip to content

Commit 88cb5d3

Browse files
committed
fix(migration): add vitest to devDependencies for peer dep resolution (#1261)
## Summary - When migrating projects that have packages with `vitest` in their name (e.g., `vitest-browser-svelte`), the migration now adds `vitest` to `devDependencies`. Without this, pnpm resolves the real `vitest@4.x` for peer deps instead of the aliased `@voidzero-dev/vite-plus-test`, causing third-party type augmentations (like `page.render()` from `vitest-browser-svelte`) to target the wrong module and fail type checking. - Add `vite-plus-vitest-type-aug` reproduction project to ecosystem-ci for ongoing regression testing. - Add snap test `migration-vitest-peer-dep` to verify the migration behavior. ## Test plan - [x] Snap test `migration-vitest-peer-dep` verifies `vitest` is added to devDependencies when `vitest-browser-svelte` is present - [x] Ecosystem-ci `vite-plus-vitest-type-aug` passes `vp check --fix` locally with 0 type errors Closes #1256 🤖 Generated with [Claude Code](https://claude.com/claude-code)
1 parent cb849cd commit 88cb5d3

File tree

7 files changed

+80
-0
lines changed

7 files changed

+80
-0
lines changed

.github/workflows/e2e-test.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,10 @@ jobs:
304304
command: |
305305
npx playwright install chromium
306306
vp test
307+
- name: vite-plus-vitest-type-aug
308+
node-version: 24
309+
command: |
310+
vp check --fix
307311
exclude:
308312
# frm-stack uses Docker (testcontainers) which doesn't work the same way on Windows
309313
- os: windows-latest

ecosystem-ci/repo.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,5 +113,11 @@
113113
"repository": "https://github.com/why-reproductions-are-required/vitest-playwright-repro.git",
114114
"branch": "main",
115115
"hash": "f7252170025c01ec482fa9ad43e09b965f46928f"
116+
},
117+
"vite-plus-vitest-type-aug": {
118+
"repository": "https://github.com/why-reproductions-are-required/vite-plus-vitest-type-aug.git",
119+
"branch": "main",
120+
"hash": "6192f60653c124ae068efaf5d7d0a4134c95edbd",
121+
"forceFreshMigration": true
116122
}
117123
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"name": "migration-vitest-peer-dep",
3+
"scripts": {
4+
"dev": "vite",
5+
"build": "vite build",
6+
"test": "vitest"
7+
},
8+
"devDependencies": {
9+
"vite": "^7.0.0",
10+
"vitest-browser-svelte": "^2.1.0"
11+
}
12+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
> vp migrate --no-interactive # vitest should be added to devDeps when vitest-browser-svelte is present
2+
VITE+ - The Unified Toolchain for the Web
3+
4+
◇ Migrated . to Vite+<repeat>
5+
• Node <semver> pnpm <semver>
6+
• 2 config updates applied
7+
8+
> cat package.json # vitest should be in devDependencies
9+
{
10+
"name": "migration-vitest-peer-dep",
11+
"scripts": {
12+
"dev": "vp dev",
13+
"build": "vp build",
14+
"test": "vp test",
15+
"prepare": "vp config"
16+
},
17+
"devDependencies": {
18+
"vite": "catalog:",
19+
"vitest-browser-svelte": "^2.1.0",
20+
"vite-plus": "catalog:",
21+
"vitest": "catalog:"
22+
},
23+
"packageManager": "pnpm@<semver>"
24+
}
25+
26+
> cat pnpm-workspace.yaml
27+
catalog:
28+
vite: npm:@voidzero-dev/vite-plus-core@latest
29+
vitest: npm:@voidzero-dev/vite-plus-test@latest
30+
vite-plus: latest
31+
overrides:
32+
vite: 'catalog:'
33+
vitest: 'catalog:'
34+
peerDependencyRules:
35+
allowAny:
36+
- vite
37+
- vitest
38+
allowedVersions:
39+
vite: '*'
40+
vitest: '*'
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"commands": [
3+
"vp migrate --no-interactive # vitest should be added to devDeps when vitest-browser-svelte is present",
4+
"cat package.json # vitest should be in devDependencies",
5+
"cat pnpm-workspace.yaml"
6+
]
7+
}

packages/cli/src/migration/migrator.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1399,6 +1399,15 @@ export function rewritePackageJson(
13991399
...pkg.devDependencies,
14001400
[VITE_PLUS_NAME]: version,
14011401
};
1402+
// Add vitest to devDependencies when a remaining dependency likely peer-depends
1403+
// on vitest (e.g., vitest-browser-svelte). Without this, pnpm resolves the real
1404+
// vitest for peer deps instead of @voidzero-dev/vite-plus-test, causing
1405+
// third-party type augmentations to target the wrong module.
1406+
const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };
1407+
if (!allDeps.vitest && Object.keys(allDeps).some((name) => name.includes('vitest'))) {
1408+
const ver = VITE_PLUS_OVERRIDE_PACKAGES.vitest;
1409+
pkg.devDependencies.vitest = supportCatalog && !ver.startsWith('file:') ? 'catalog:' : ver;
1410+
}
14021411
}
14031412
return extractedStagedConfig;
14041413
}

packages/test/BUNDLING.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,8 @@ When upgrading the vitest version:
309309
- createNodeEntry() index-node.js with browser-provider
310310
- copyBrowserClientFiles()
311311
- createBrowserEntryFiles() browser/ entry files at package root
312+
- patchModuleAugmentations() Rewrite @vitest/expect, @vitest/runner augmentations
313+
- patchChaiTypeReference() Add @types/chai triple-slash reference
312314
- createPluginExports() dist/plugins/* for pnpm overrides
313315
- mergePackageJson()
314316
- validateExternalDeps()

0 commit comments

Comments
 (0)