Skip to content

Commit 6fb1528

Browse files
authoredMar 26, 2024··
fix(vite-node): fix isValidNodeImport to check "type": "module" first (#5416)
1 parent 16bacfa commit 6fb1528

File tree

8 files changed

+244
-103
lines changed

8 files changed

+244
-103
lines changed
 

‎packages/vite-node/src/externalize.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -61,16 +61,16 @@ async function isValidNodeImport(id: string) {
6161
if (extension !== '.js')
6262
return false
6363

64-
if (/\.(\w+-)?esm?(-\w+)?\.js$|\/(esm?)\//.test(id))
65-
return false
66-
6764
id = id.replace('file:///', '')
6865

6966
const package_ = await findNearestPackageData(dirname(id))
7067

7168
if (package_.type === 'module')
7269
return true
7370

71+
if (/\.(\w+-)?esm?(-\w+)?\.js$|\/(esm?)\//.test(id))
72+
return false
73+
7474
const code = await fsp.readFile(id, 'utf8').catch(() => '')
7575

7676
return !ESM_SYNTAX_RE.test(code)

‎pnpm-lock.yaml

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

‎test/vite-node/deps/dep1/esm/index.js

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
// esm/index.js was detected as isValidNodeImport(id) = false
2+
// event if package.json has type = module,
3+
// which causes dual package hazard when other external esm import esm/index.js.
4+
export const data = {}

‎test/vite-node/deps/dep1/package.json

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"name": "@vitest/test-dep1",
3+
"type": "module",
4+
"exports": "./esm/index.js"
5+
}

‎test/vite-node/deps/dep2/index.js

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { data } from '@vitest/test-dep1'

‎test/vite-node/deps/dep2/package.json

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"name": "@vitest/test-dep2",
3+
"type": "module",
4+
"exports": "./index.js",
5+
"peerDependencies": {
6+
"@vitest/test-dep1": "*"
7+
}
8+
}

‎test/vite-node/package.json

+2
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
},
1212
"devDependencies": {
1313
"@types/inquirer": "^9.0.3",
14+
"@vitest/test-dep1": "file:./deps/dep1",
15+
"@vitest/test-dep2": "file:./deps/dep2",
1416
"execa": "^6.1.0",
1517
"inquirer": "^9.2.7",
1618
"vite-node": "workspace:*",

‎test/vite-node/test/external.test.ts

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { expect, test } from 'vitest'
2+
3+
// @ts-expect-error no ts
4+
import * as dep1 from '@vitest/test-dep1'
5+
6+
// @ts-expect-error no ts
7+
import * as dep2 from '@vitest/test-dep2'
8+
9+
test('no dual package hazard by externalizing esm deps by default', async () => {
10+
dep1.data.hello = 'world'
11+
expect(dep2.data.hello).toBe('world')
12+
})

0 commit comments

Comments
 (0)
Please sign in to comment.