fix: fix external behavior with deps.optimizer (#9125)

This commit is contained in:
Hiroshi Ogawa 2025-11-29 01:00:09 +09:00 committed by GitHub
parent a5d98fd0d8
commit 4c75492cca
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
10 changed files with 84 additions and 0 deletions

View File

@ -3,6 +3,7 @@ import { existsSync, promises as fsp } from 'node:fs'
import { isBuiltin } from 'node:module'
import { pathToFileURL } from 'node:url'
import { KNOWN_ASSET_RE } from '@vitest/utils/constants'
import { cleanUrl } from '@vitest/utils/helpers'
import { findNearestPackageData } from '@vitest/utils/resolver'
import * as esModuleLexer from 'es-module-lexer'
import { dirname, extname, join, resolve } from 'pathe'
@ -109,6 +110,10 @@ export function guessCJSversion(id: string): string | undefined {
// The code from https://github.com/unjs/mlly/blob/c5bcca0cda175921344fd6de1bc0c499e73e5dac/src/syntax.ts#L51-L98
async function isValidNodeImport(id: string) {
// clean url to strip off `?v=...` query etc.
// node can natively import files with query params, so externalizing them is safe.
id = cleanUrl(id)
const extension = extname(id)
if (BUILTIN_EXTENSIONS.has(extension)) {

16
pnpm-lock.yaml generated
View File

@ -1226,6 +1226,12 @@ importers:
'@vitest/test-dep-conditions':
specifier: file:./deps/test-dep-conditions
version: file:test/config/deps/test-dep-conditions
'@vitest/test-dep-optimizer-external':
specifier: file:./deps/optimizer/external
version: file:test/config/deps/optimizer/external
'@vitest/test-dep-optimizer-optimized':
specifier: file:./deps/optimizer/optimized
version: file:test/config/deps/optimizer/optimized
inline-dep:
specifier: file:./deps/vite-ssr-resolve/inline-dep
version: file:test/config/deps/vite-ssr-resolve/inline-dep
@ -4701,6 +4707,12 @@ packages:
'@vitest/test-dep-nested-cjs@file:test/core/deps/dep-nested-cjs':
resolution: {directory: test/core/deps/dep-nested-cjs, type: directory}
'@vitest/test-dep-optimizer-external@file:test/config/deps/optimizer/external':
resolution: {directory: test/config/deps/optimizer/external, type: directory}
'@vitest/test-dep-optimizer-optimized@file:test/config/deps/optimizer/optimized':
resolution: {directory: test/config/deps/optimizer/optimized, type: directory}
'@vitest/test-dep1@file:test/core/deps/dep1':
resolution: {directory: test/core/deps/dep1, type: directory}
@ -12848,6 +12860,10 @@ snapshots:
'@vitest/test-dep-nested-cjs@file:test/core/deps/dep-nested-cjs': {}
'@vitest/test-dep-optimizer-external@file:test/config/deps/optimizer/external': {}
'@vitest/test-dep-optimizer-optimized@file:test/config/deps/optimizer/optimized': {}
'@vitest/test-dep1@file:test/core/deps/dep1': {}
'@vitest/test-dep2@file:test/core/deps/dep2':

View File

@ -0,0 +1 @@
export default {}

View File

@ -0,0 +1,6 @@
{
"name": "@vitest/test-dep-optimizer-external",
"type": "module",
"private": true,
"main": "./index.js"
}

View File

@ -0,0 +1 @@
export default {}

View File

@ -0,0 +1,6 @@
{
"name": "@vitest/test-dep-optimizer-optimized",
"type": "module",
"private": true,
"main": "./index.js"
}

View File

@ -0,0 +1,7 @@
import { it, expect } from "vitest";
// @ts-ignore
import * as testDep from "@vitest/test-dep-optimizer-external"
it("passes", () => {
expect(testDep.default).toBeDefined();
});

View File

@ -0,0 +1,25 @@
import { defineConfig } from "vitest/config";
export default defineConfig({
test: {
deps: {
optimizer: {
ssr: {
enabled: true,
// need at least one to trigger dep optimization
include: ["@vitest/test-dep-optimizer-optimized"],
},
},
},
},
plugins: [
{
name: 'test-external',
transform(_code, id, _options) {
if (id.includes('test-dep-optimizer-external')) {
this.error('"@vitest/test-dep-optimizer-external" is expected to be externalized');
}
},
}
]
});

View File

@ -11,6 +11,8 @@
"@vitest/browser-preview": "workspace:*",
"@vitest/browser-webdriverio": "workspace:*",
"@vitest/test-dep-conditions": "file:./deps/test-dep-conditions",
"@vitest/test-dep-optimizer-external": "file:./deps/optimizer/external",
"@vitest/test-dep-optimizer-optimized": "file:./deps/optimizer/optimized",
"inline-dep": "file:./deps/vite-ssr-resolve/inline-dep",
"other-dep": "file:./deps/vite-ssr-resolve/other-dep",
"ssr-no-external-dep": "file:./deps/vite-ssr-resolve/ssr-no-external-dep",

View File

@ -0,0 +1,15 @@
import { expect, it } from 'vitest'
import { runVitest } from '../../test-utils'
it('external works with optimizer', async () => {
const { errorTree } = await runVitest({
root: 'fixtures/optimizer/external',
})
expect(errorTree()).toMatchInlineSnapshot(`
{
"basic.test.ts": {
"passes": "passed",
},
}
`)
})