Skip to content

Commit b465d3e

Browse files
authored
fix: nested dependencies from sub node_modules, fix #3254 (#4091)
1 parent 73344a9 commit b465d3e

File tree

10 files changed

+50
-23
lines changed

10 files changed

+50
-23
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1-
// TODO: Rework #3753, taking into account issues with #4005, #4012, #4014
2-
test.skip('handle nested package', async () => {
1+
test('handle nested package', async () => {
32
expect(await page.textContent('.a')).toBe('[email protected]')
43
expect(await page.textContent('.b')).toBe('[email protected]')
54
expect(await page.textContent('.nested-a')).toBe('[email protected]')
5+
const c = await page.textContent('.c')
6+
expect(c).toBe('[email protected]')
7+
expect(await page.textContent('.side-c')).toBe(c)
68
})

packages/playground/nested-deps/index.html

+11
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,25 @@ <h2>direct dependency B</h2>
77
<h2>nested dependency A</h2>
88
<pre class="nested-a"></pre>
99

10+
<h2>direct dependency C</h2>
11+
<pre class="c"></pre>
12+
13+
<h2>side dependency C</h2>
14+
<pre class="side-c"></pre>
15+
1016
<script type="module">
1117
import A from 'test-package-a'
1218
import B, { A as nestedA } from 'test-package-b'
19+
import C from 'test-package-c'
20+
import { C as sideC } from 'test-package-c/side'
1321

1422
text('.a', A)
1523
text('.b', B)
1624
text('.nested-a', nestedA)
1725

26+
text('.c', C)
27+
text('.side-c', sideC)
28+
1829
function text(sel, text) {
1930
document.querySelector(sel).textContent = text
2031
}

packages/playground/nested-deps/package.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
},
1111
"dependencies": {
1212
"test-package-a": "link:./test-package-a",
13-
"test-package-b": "link:./test-package-b"
13+
"test-package-b": "link:./test-package-b",
14+
"test-package-c": "link:./test-package-c"
1415
}
1516
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export default '[email protected]'
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
// this module should not be resolved
2+
export default '[email protected]'
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"name": "test-package-c",
3+
"version": "1.0.0",
4+
"main": "index.js",
5+
"module": "index-es.js"
6+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { default as C } from 'test-package-c'

packages/playground/nested-deps/vite.config.js

+6-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@
33
*/
44
module.exports = {
55
optimizeDeps: {
6-
include: ['test-package-a', 'test-package-b']
6+
include: [
7+
'test-package-a',
8+
'test-package-b',
9+
'test-package-c',
10+
'test-package-c/side'
11+
]
712
}
813
}

packages/vite/src/node/optimizer/esbuildDepPlugin.ts

+13-19
Original file line numberDiff line numberDiff line change
@@ -85,35 +85,29 @@ export function esbuildDepPlugin(
8585
}
8686
)
8787

88-
function resolveEntry(id: string, isEntry: boolean, resolveDir: string) {
88+
function resolveEntry(id: string) {
8989
const flatId = flattenId(id)
9090
if (flatId in qualified) {
91-
return isEntry
92-
? {
93-
path: flatId,
94-
namespace: 'dep'
95-
}
96-
: {
97-
path: require.resolve(qualified[flatId], {
98-
paths: [resolveDir]
99-
})
100-
}
91+
return {
92+
path: flatId,
93+
namespace: 'dep'
94+
}
10195
}
10296
}
10397

10498
build.onResolve(
10599
{ filter: /^[\w@][^:]/ },
106-
async ({ path: id, importer, kind, resolveDir }) => {
107-
const isEntry = !importer
100+
async ({ path: id, importer, kind }) => {
108101
// ensure esbuild uses our resolved entries
109102
let entry
110103
// if this is an entry, return entry namespace resolve result
111-
if ((entry = resolveEntry(id, isEntry, resolveDir))) return entry
112-
113-
// check if this is aliased to an entry - also return entry namespace
114-
const aliased = await _resolve(id, undefined, true)
115-
if (aliased && (entry = resolveEntry(aliased, isEntry, resolveDir))) {
116-
return entry
104+
if (!importer) {
105+
if ((entry = resolveEntry(id))) return entry
106+
// check if this is aliased to an entry - also return entry namespace
107+
const aliased = await _resolve(id, undefined, true)
108+
if (aliased && (entry = resolveEntry(aliased))) {
109+
return entry
110+
}
117111
}
118112

119113
// use vite's own resolver

yarn.lock

+4
Original file line numberDiff line numberDiff line change
@@ -7021,6 +7021,10 @@ test-exclude@^6.0.0:
70217021
version "0.0.0"
70227022
uid ""
70237023

7024+
"test-package-c@link:./packages/playground/nested-deps/test-package-c":
7025+
version "0.0.0"
7026+
uid ""
7027+
70247028
text-extensions@^1.0.0:
70257029
version "1.9.0"
70267030
resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.9.0.tgz#1853e45fee39c945ce6f6c36b2d659b5aabc2a26"

0 commit comments

Comments
 (0)