Skip to content

Commit 4c75492

Browse files
authored
fix: fix external behavior with deps.optimizer (#9125)
1 parent a5d98fd commit 4c75492

File tree

10 files changed

+84
-0
lines changed

10 files changed

+84
-0
lines changed

packages/vitest/src/node/resolver.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { existsSync, promises as fsp } from 'node:fs'
33
import { isBuiltin } from 'node:module'
44
import { pathToFileURL } from 'node:url'
55
import { KNOWN_ASSET_RE } from '@vitest/utils/constants'
6+
import { cleanUrl } from '@vitest/utils/helpers'
67
import { findNearestPackageData } from '@vitest/utils/resolver'
78
import * as esModuleLexer from 'es-module-lexer'
89
import { dirname, extname, join, resolve } from 'pathe'
@@ -109,6 +110,10 @@ export function guessCJSversion(id: string): string | undefined {
109110

110111
// The code from https://github.com/unjs/mlly/blob/c5bcca0cda175921344fd6de1bc0c499e73e5dac/src/syntax.ts#L51-L98
111112
async function isValidNodeImport(id: string) {
113+
// clean url to strip off `?v=...` query etc.
114+
// node can natively import files with query params, so externalizing them is safe.
115+
id = cleanUrl(id)
116+
112117
const extension = extname(id)
113118

114119
if (BUILTIN_EXTENSIONS.has(extension)) {

pnpm-lock.yaml

Lines changed: 16 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export default {}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"name": "@vitest/test-dep-optimizer-external",
3+
"type": "module",
4+
"private": true,
5+
"main": "./index.js"
6+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export default {}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"name": "@vitest/test-dep-optimizer-optimized",
3+
"type": "module",
4+
"private": true,
5+
"main": "./index.js"
6+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { it, expect } from "vitest";
2+
// @ts-ignore
3+
import * as testDep from "@vitest/test-dep-optimizer-external"
4+
5+
it("passes", () => {
6+
expect(testDep.default).toBeDefined();
7+
});
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import { defineConfig } from "vitest/config";
2+
3+
export default defineConfig({
4+
test: {
5+
deps: {
6+
optimizer: {
7+
ssr: {
8+
enabled: true,
9+
// need at least one to trigger dep optimization
10+
include: ["@vitest/test-dep-optimizer-optimized"],
11+
},
12+
},
13+
},
14+
},
15+
plugins: [
16+
{
17+
name: 'test-external',
18+
transform(_code, id, _options) {
19+
if (id.includes('test-dep-optimizer-external')) {
20+
this.error('"@vitest/test-dep-optimizer-external" is expected to be externalized');
21+
}
22+
},
23+
}
24+
]
25+
});

test/config/package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
"@vitest/browser-preview": "workspace:*",
1212
"@vitest/browser-webdriverio": "workspace:*",
1313
"@vitest/test-dep-conditions": "file:./deps/test-dep-conditions",
14+
"@vitest/test-dep-optimizer-external": "file:./deps/optimizer/external",
15+
"@vitest/test-dep-optimizer-optimized": "file:./deps/optimizer/optimized",
1416
"inline-dep": "file:./deps/vite-ssr-resolve/inline-dep",
1517
"other-dep": "file:./deps/vite-ssr-resolve/other-dep",
1618
"ssr-no-external-dep": "file:./deps/vite-ssr-resolve/ssr-no-external-dep",

test/config/test/optimizer.test.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { expect, it } from 'vitest'
2+
import { runVitest } from '../../test-utils'
3+
4+
it('external works with optimizer', async () => {
5+
const { errorTree } = await runVitest({
6+
root: 'fixtures/optimizer/external',
7+
})
8+
expect(errorTree()).toMatchInlineSnapshot(`
9+
{
10+
"basic.test.ts": {
11+
"passes": "passed",
12+
},
13+
}
14+
`)
15+
})

0 commit comments

Comments
 (0)