Skip to content

Commit 104971d

Browse files
decsbluwy
authored andcommitted
fix(resolve): support submodules of optional peer deps (#14489)
1 parent 0c6d289 commit 104971d

File tree

7 files changed

+68
-2
lines changed

7 files changed

+68
-2
lines changed

packages/vite/src/node/plugins/resolve.ts

+4-2
Original file line numberDiff line numberDiff line change
@@ -730,9 +730,11 @@ export function tryNodeResolve(
730730
) {
731731
const mainPkg = findNearestMainPackageData(basedir, packageCache)?.data
732732
if (mainPkg) {
733+
const pkgName = getNpmPackageName(id)
733734
if (
734-
mainPkg.peerDependencies?.[id] &&
735-
mainPkg.peerDependenciesMeta?.[id]?.optional
735+
pkgName != null &&
736+
mainPkg.peerDependencies?.[pkgName] &&
737+
mainPkg.peerDependenciesMeta?.[pkgName]?.optional
736738
) {
737739
return {
738740
id: `${optionalPeerDepId}:${id}:${mainPkg.name}`,

playground/optimize-deps/__tests__/optimize-deps.spec.ts

+13
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,19 @@ test('dep with optional peer dep', async () => {
108108
}
109109
})
110110

111+
test('dep with optional peer dep submodule', async () => {
112+
expect(
113+
await page.textContent('.dep-with-optional-peer-dep-submodule'),
114+
).toMatch(`[success]`)
115+
if (isServe) {
116+
expect(browserErrors.map((error) => error.message)).toEqual(
117+
expect.arrayContaining([
118+
'Could not resolve "foobar/baz" imported by "@vitejs/test-dep-with-optional-peer-dep-submodule". Is it installed?',
119+
]),
120+
)
121+
}
122+
})
123+
111124
test('dep with css import', async () => {
112125
expect(await getColor('.dep-linked-include')).toBe('red')
113126
})
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
export function callItself() {
2+
return '[success]'
3+
}
4+
5+
export async function callPeerDepSubmodule() {
6+
return await import('foobar/baz')
7+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
{
2+
"name": "@vitejs/test-dep-with-optional-peer-dep-submodule",
3+
"private": true,
4+
"version": "0.0.0",
5+
"main": "index.js",
6+
"type": "module",
7+
"peerDependencies": {
8+
"foobar": "0.0.0"
9+
},
10+
"peerDependenciesMeta": {
11+
"foobar": {
12+
"optional": true
13+
}
14+
}
15+
}

playground/optimize-deps/index.html

+13
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,9 @@ <h2>Import from dependency with dynamic import</h2>
6565
<h2>Import from dependency with optional peer dep</h2>
6666
<div class="dep-with-optional-peer-dep"></div>
6767

68+
<h2>Import from dependency with optional peer dep submodule</h2>
69+
<div class="dep-with-optional-peer-dep-submodule"></div>
70+
6871
<h2>Externalize known non-js files in optimize included dep</h2>
6972
<div class="externalize-known-non-js"></div>
7073

@@ -205,6 +208,16 @@ <h2>Pre bundle css modules require</h2>
205208
callPeerDep()
206209
</script>
207210

211+
<script type="module">
212+
import {
213+
callItself,
214+
callPeerDepSubmodule,
215+
} from '@vitejs/test-dep-with-optional-peer-dep-submodule'
216+
text('.dep-with-optional-peer-dep-submodule', callItself())
217+
// expect error as optional peer dep not installed
218+
callPeerDepSubmodule()
219+
</script>
220+
208221
<script type="module">
209222
// should error on builtin modules (named import)
210223
// no node: protocol intentionally

playground/optimize-deps/package.json

+1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
"@vitejs/test-dep-with-builtin-module-esm": "file:./dep-with-builtin-module-esm",
3131
"@vitejs/test-dep-with-dynamic-import": "file:./dep-with-dynamic-import",
3232
"@vitejs/test-dep-with-optional-peer-dep": "file:./dep-with-optional-peer-dep",
33+
"@vitejs/test-dep-with-optional-peer-dep-submodule": "file:./dep-with-optional-peer-dep-submodule",
3334
"@vitejs/test-dep-non-optimized": "file:./dep-non-optimized",
3435
"@vitejs/test-added-in-entries": "file:./added-in-entries",
3536
"lodash-es": "^4.17.21",

pnpm-lock.yaml

+15
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)