Skip to content

Commit 7e1faf3

Browse files
authoredNov 5, 2024··
fix(vite-node): improve esm check to decide external (#6816)
1 parent a2175c7 commit 7e1faf3

File tree

9 files changed

+41
-28
lines changed

9 files changed

+41
-28
lines changed
 

‎packages/vite-node/package.json

+1
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@
8484
"dependencies": {
8585
"cac": "^6.7.14",
8686
"debug": "^4.3.7",
87+
"es-module-lexer": "^1.5.4",
8788
"pathe": "^1.1.2",
8889
"vite": "^5.0.0"
8990
},

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

+10-8
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,15 @@
11
import type { DepsHandlingOptions } from './types'
22
import { existsSync, promises as fsp } from 'node:fs'
3+
import * as esModuleLexer from 'es-module-lexer'
34
import { dirname, extname, join } from 'pathe'
45
import { KNOWN_ASSET_RE } from './constants'
56
import { findNearestPackageData, isNodeBuiltin, slash } from './utils'
67

78
const BUILTIN_EXTENSIONS = new Set(['.mjs', '.cjs', '.node', '.wasm'])
89

9-
const ESM_SYNTAX_RE
10-
= /(?:[\s;]|^)(?:import[\s\w*,{}]*from|import\s*["'*{]|export\b\s*(?:[*{]|default|class|type|function|const|var|let|async function)|import\.meta\b)/m
1110
const ESM_EXT_RE = /\.(es|esm|esm-browser|esm-bundler|es6|module)\.js$/
1211
const ESM_FOLDER_RE = /\/(es|esm)\/(.*\.js)$/
1312

14-
// https://stackoverflow.com/a/15123777
15-
const COMMENT_RE = /\/\*[\s\S]*?\*\/|([^\\:]|^)\/\/.*$/gm
16-
1713
const defaultInline = [
1814
/virtual:/,
1915
/\.[mc]?ts$/,
@@ -80,9 +76,15 @@ async function isValidNodeImport(id: string) {
8076
return false
8177
}
8278

83-
const code = await fsp.readFile(id, 'utf8').catch(() => '')
84-
85-
return !ESM_SYNTAX_RE.test(code.replace(COMMENT_RE, ''))
79+
try {
80+
await esModuleLexer.init
81+
const code = await fsp.readFile(id, 'utf8')
82+
const [, , , hasModuleSyntax] = esModuleLexer.parse(code)
83+
return !hasModuleSyntax
84+
}
85+
catch {
86+
return false
87+
}
8688
}
8789

8890
const _defaultExternalizeCache = new Map<string, Promise<string | false>>()

‎pnpm-lock.yaml

+10-12
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
File renamed without changes.

‎test/core/deps/dep-cjs/esm-string.js

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
module.exports = { test: ' import.meta' }

‎test/core/deps/dep-cjs/package.json

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"name": "@vitest/test-dep-cjs",
3+
"type": "commonjs",
4+
"exports": {
5+
"./esm-comment": "./esm-comment.js",
6+
"./esm-string": "./esm-string.js"
7+
}
8+
}

‎test/core/deps/dep-esm-comment/package.json

-5
This file was deleted.

‎test/core/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
"@vitest/expect": "workspace:*",
1717
"@vitest/mocker": "workspace:*",
1818
"@vitest/runner": "workspace:*",
19-
"@vitest/test-dep-esm-comment": "file:./deps/dep-esm-comment",
19+
"@vitest/test-dep-cjs": "file:./deps/dep-cjs",
2020
"@vitest/test-dep1": "file:./deps/dep1",
2121
"@vitest/test-dep2": "file:./deps/dep2",
2222
"@vitest/utils": "workspace:*",

‎test/core/test/dual-package-hazard.test.ts

+10-2
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,10 @@ import * as dep1 from '@vitest/test-dep1'
88
import * as dep2 from '@vitest/test-dep2'
99

1010
// @ts-expect-error no ts
11-
import depEsmComment from '@vitest/test-dep-esm-comment'
11+
import depEsmComment from '@vitest/test-dep-cjs/esm-comment'
12+
13+
// @ts-expect-error no ts
14+
import depEsmString from '@vitest/test-dep-cjs/esm-string'
1215

1316
const require = createRequire(import.meta.url)
1417

@@ -18,6 +21,11 @@ test('no dual package hazard by externalizing esm deps by default', async () =>
1821
})
1922

2023
test('externalize cjs with esm comment', async () => {
21-
const depEsmCommentRequire = require('@vitest/test-dep-esm-comment')
24+
const depEsmCommentRequire = require('@vitest/test-dep-cjs/esm-comment')
2225
expect(depEsmComment).toBe(depEsmCommentRequire)
2326
})
27+
28+
test('externalize cjs with esm string', async () => {
29+
const depEsmStringRequire = require('@vitest/test-dep-cjs/esm-string')
30+
expect(depEsmString).toBe(depEsmStringRequire)
31+
})

0 commit comments

Comments
 (0)
Please sign in to comment.