Skip to content

Commit 74dc596

Browse files
authored
fix(vitest): correctly resolve optimizer status (#3992)
1 parent 41e828f commit 74dc596

File tree

7 files changed

+61
-31
lines changed

7 files changed

+61
-31
lines changed

docs/config/index.md

+7-3
Original file line numberDiff line numberDiff line change
@@ -207,10 +207,14 @@ You will not be able to edit your `node_modules` code for debugging, since the c
207207
#### deps.optimizer.{mode}.enabled
208208

209209
- **Type:** `boolean`
210-
- **Default:** `true`
210+
- **Default:** `true` if using >= Vite 4.3.2, `false` otherwise
211211

212212
Enable dependency optimization.
213213

214+
::: warning
215+
This option only works with Vite 4.3.2 and higher.
216+
:::
217+
214218
#### deps.web
215219

216220
- **Type:** `{ transformAssets?, ... }`
@@ -227,7 +231,7 @@ Usually, files inside `node_modules` are externalized, but these options also af
227231

228232
Should Vitest process assets (.png, .svg, .jpg, etc) files and resolve them like Vite does in the browser.
229233

230-
hese module will have a default export equal to the path to the asset, if no query is specified.
234+
This module will have a default export equal to the path to the asset, if no query is specified.
231235

232236
::: warning
233237
At the moment, this option only works with [`experimentalVmThreads`](#experimentalvmthreads) pool.
@@ -240,7 +244,7 @@ At the moment, this option only works with [`experimentalVmThreads`](#experiment
240244

241245
Should Vitest process CSS (.css, .scss, .sass, etc) files and resolve them like Vite does in the browser.
242246

243-
If CSS files are disabled with [`css`](#css) options, this option will just silence `UNKNOWN_EXTENSION` errors.
247+
If CSS files are disabled with [`css`](#css) options, this option will just silence `ERR_UNKNOWN_FILE_EXTENSION` errors.
244248

245249
::: warning
246250
At the moment, this option only works with [`experimentalVmThreads`](#experimentalvmthreads) pool.

packages/vitest/src/node/config.ts

+6
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,12 @@ export function resolveConfig(
137137
if (!resolved.deps.moduleDirectories.includes('/node_modules/'))
138138
resolved.deps.moduleDirectories.push('/node_modules/')
139139

140+
resolved.deps.optimizer ??= {}
141+
resolved.deps.optimizer.ssr ??= {}
142+
resolved.deps.optimizer.ssr.enabled ??= true
143+
resolved.deps.optimizer.web ??= {}
144+
resolved.deps.optimizer.web.enabled ??= true
145+
140146
resolved.deps.web ??= {}
141147
resolved.deps.web.transformAssets ??= true
142148
resolved.deps.web.transformCss ??= true

packages/vitest/src/node/plugins/index.ts

+3-10
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,9 @@ import { GlobalSetupPlugin } from './globalSetup'
1212
import { CSSEnablerPlugin } from './cssEnabler'
1313
import { CoverageTransform } from './coverageTransform'
1414
import { MocksPlugin } from './mocks'
15-
import { deleteDefineConfig, hijackVitePluginInject, resolveFsAllow, resolveOptimizerConfig } from './utils'
15+
import { deleteDefineConfig, hijackVitePluginInject, resolveFsAllow } from './utils'
1616
import { VitestResolver } from './vitestResolver'
17+
import { VitestOptimizer } from './optimizer'
1718

1819
export async function VitestPlugin(options: UserConfig = {}, ctx = new Vitest('test')): Promise<VitePlugin[]> {
1920
const userConfig = deepMerge({}, options) as UserConfig
@@ -112,15 +113,6 @@ export async function VitestPlugin(options: UserConfig = {}, ctx = new Vitest('t
112113
}
113114
}
114115

115-
const webOptimizer = resolveOptimizerConfig(testConfig.deps?.optimizer?.web, viteConfig.optimizeDeps, testConfig)
116-
const ssrOptimizer = resolveOptimizerConfig(testConfig.deps?.optimizer?.ssr, viteConfig.ssr?.optimizeDeps, testConfig)
117-
118-
config.cacheDir = webOptimizer.cacheDir || ssrOptimizer.cacheDir || config.cacheDir
119-
config.optimizeDeps = webOptimizer.optimizeDeps
120-
config.ssr = {
121-
optimizeDeps: ssrOptimizer.optimizeDeps,
122-
}
123-
124116
return config
125117
},
126118
async configResolved(viteConfig) {
@@ -195,6 +187,7 @@ export async function VitestPlugin(options: UserConfig = {}, ctx = new Vitest('t
195187
: null,
196188
MocksPlugin(),
197189
VitestResolver(ctx),
190+
VitestOptimizer(),
198191
]
199192
.filter(notNullish)
200193
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import type { Plugin } from 'vite'
2+
import { resolveOptimizerConfig } from './utils'
3+
4+
export function VitestOptimizer(): Plugin {
5+
return {
6+
name: 'vitest:normalize-optimizer',
7+
config: {
8+
order: 'post',
9+
handler(viteConfig) {
10+
const testConfig = viteConfig.test || {}
11+
const webOptimizer = resolveOptimizerConfig(testConfig.deps?.optimizer?.web, viteConfig.optimizeDeps, testConfig)
12+
const ssrOptimizer = resolveOptimizerConfig(testConfig.deps?.optimizer?.ssr, viteConfig.ssr?.optimizeDeps, testConfig)
13+
14+
viteConfig.cacheDir = webOptimizer.cacheDir || ssrOptimizer.cacheDir || viteConfig.cacheDir
15+
viteConfig.optimizeDeps = webOptimizer.optimizeDeps
16+
viteConfig.ssr = {
17+
optimizeDeps: ssrOptimizer.optimizeDeps,
18+
}
19+
},
20+
},
21+
}
22+
}

packages/vitest/src/node/plugins/utils.ts

+16-6
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { builtinModules } from 'node:module'
21
import { searchForWorkspaceRoot, version as viteVersion } from 'vite'
32
import type { DepOptimizationOptions, ResolvedConfig, UserConfig as ViteConfig } from 'vite'
43
import { dirname } from 'pathe'
@@ -7,10 +6,10 @@ import type { DepsOptimizationOptions, InlineConfig } from '../../types'
76
export function resolveOptimizerConfig(_testOptions: DepsOptimizationOptions | undefined, viteOptions: DepOptimizationOptions | undefined, testConfig: InlineConfig) {
87
const testOptions = _testOptions || {}
98
const newConfig: { cacheDir?: string; optimizeDeps: DepOptimizationOptions } = {} as any
10-
const [major, minor] = viteVersion.split('.').map(Number)
11-
const allowed = major >= 5 || (major === 4 && minor >= 3)
9+
const [major, minor, fix] = viteVersion.split('.').map(Number)
10+
const allowed = major >= 5 || (major === 4 && minor >= 4) || (major === 4 && minor === 3 && fix >= 2)
1211
if (!allowed && testOptions?.enabled === true)
13-
console.warn(`Vitest: "deps.optimizer" is only available in Vite >= 4.3.0, current Vite version: ${viteVersion}`)
12+
console.warn(`Vitest: "deps.optimizer" is only available in Vite >= 4.3.2, current Vite version: ${viteVersion}`)
1413
else
1514
// enable by default
1615
testOptions.enabled ??= true
@@ -24,15 +23,26 @@ export function resolveOptimizerConfig(_testOptions: DepsOptimizationOptions | u
2423
}
2524
else {
2625
const cacheDir = testConfig.cache !== false ? testConfig.cache?.dir : null
26+
const currentInclude = (testOptions.include || viteOptions?.include || [])
27+
const exclude = [
28+
'vitest',
29+
// Ideally, we shouldn't optimize react in test mode, otherwise we need to optimize _every_ dependency that uses react.
30+
'react',
31+
...(testOptions.exclude || viteOptions?.exclude || []),
32+
]
33+
const runtime = currentInclude.filter(n => n.endsWith('jsx-dev-runtime'))
34+
exclude.push(...runtime)
35+
36+
const include = (testOptions.include || viteOptions?.include || []).filter((n: string) => !exclude.includes(n))
2737
newConfig.cacheDir = cacheDir ?? 'node_modules/.vitest'
2838
newConfig.optimizeDeps = {
2939
...viteOptions,
3040
...testOptions,
3141
noDiscovery: true,
3242
disabled: false,
3343
entries: [],
34-
exclude: ['vitest', ...builtinModules, ...(testOptions.exclude || viteOptions?.exclude || [])],
35-
include: (testOptions.include || viteOptions?.include || []).filter((n: string) => n !== 'vitest'),
44+
exclude,
45+
include,
3646
}
3747
}
3848
return newConfig

packages/vitest/src/node/plugins/workspace.ts

+3-10
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,9 @@ import { CSSEnablerPlugin } from './cssEnabler'
1010
import { SsrReplacerPlugin } from './ssrReplacer'
1111
import { GlobalSetupPlugin } from './globalSetup'
1212
import { MocksPlugin } from './mocks'
13-
import { deleteDefineConfig, hijackVitePluginInject, resolveFsAllow, resolveOptimizerConfig } from './utils'
13+
import { deleteDefineConfig, hijackVitePluginInject, resolveFsAllow } from './utils'
1414
import { VitestResolver } from './vitestResolver'
15+
import { VitestOptimizer } from './optimizer'
1516

1617
interface WorkspaceOptions extends UserWorkspaceConfig {
1718
root?: string
@@ -95,15 +96,6 @@ export function WorkspaceVitestPlugin(project: WorkspaceProject, options: Worksp
9596
}
9697
}
9798

98-
const webOptimizer = resolveOptimizerConfig(testConfig.deps?.optimizer?.web, viteConfig.optimizeDeps, testConfig)
99-
const ssrOptimizer = resolveOptimizerConfig(testConfig.deps?.optimizer?.ssr, viteConfig.ssr?.optimizeDeps, testConfig)
100-
101-
config.cacheDir = webOptimizer.cacheDir || ssrOptimizer.cacheDir || config.cacheDir
102-
config.optimizeDeps = webOptimizer.optimizeDeps
103-
config.ssr = {
104-
optimizeDeps: ssrOptimizer.optimizeDeps,
105-
}
106-
10799
return config
108100
},
109101
configResolved(viteConfig) {
@@ -132,5 +124,6 @@ export function WorkspaceVitestPlugin(project: WorkspaceProject, options: Worksp
132124
GlobalSetupPlugin(project, project.ctx.logger),
133125
MocksPlugin(),
134126
VitestResolver(project.ctx),
127+
VitestOptimizer(),
135128
]
136129
}

packages/vitest/src/node/workspace.ts

+4-2
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,7 @@ export class WorkspaceProject {
285285
}
286286

287287
getSerializableConfig() {
288+
const optimizer = this.config.deps?.optimizer
288289
return deepMerge({
289290
...this.config,
290291
coverage: this.ctx.config.coverage,
@@ -293,10 +294,10 @@ export class WorkspaceProject {
293294
...this.config.deps,
294295
optimizer: {
295296
web: {
296-
enabled: this.config.deps?.optimizer?.web?.enabled ?? true,
297+
enabled: optimizer?.web?.enabled ?? true,
297298
},
298299
ssr: {
299-
enabled: this.config.deps?.optimizer?.ssr?.enabled ?? true,
300+
enabled: optimizer?.ssr?.enabled ?? true,
300301
},
301302
},
302303
},
@@ -315,6 +316,7 @@ export class WorkspaceProject {
315316
},
316317
inspect: this.ctx.config.inspect,
317318
inspectBrk: this.ctx.config.inspectBrk,
319+
alias: [],
318320
}, this.ctx.configOverride || {} as any,
319321
) as ResolvedConfig
320322
}

0 commit comments

Comments
 (0)