1
- import { builtinModules } from 'node:module'
2
- import { version as viteVersion } from 'vite'
3
1
import type { UserConfig as ViteConfig , Plugin as VitePlugin } from 'vite'
4
2
import { relative } from 'pathe'
5
3
import { configDefaults } from '../../defaults'
@@ -14,6 +12,7 @@ import { GlobalSetupPlugin } from './globalSetup'
14
12
import { CSSEnablerPlugin } from './cssEnabler'
15
13
import { CoverageTransform } from './coverageTransform'
16
14
import { MocksPlugin } from './mocks'
15
+ import { resolveOptimizerConfig } from './utils'
17
16
18
17
export async function VitestPlugin ( options : UserConfig = { } , ctx = new Vitest ( 'test' ) ) : Promise < VitePlugin [ ] > {
19
18
const userConfig = deepMerge ( { } , options ) as UserConfig
@@ -42,13 +41,13 @@ export async function VitestPlugin(options: UserConfig = {}, ctx = new Vitest('t
42
41
// preliminary merge of options to be able to create server options for vite
43
42
// however to allow vitest plugins to modify vitest config values
44
43
// this is repeated in configResolved where the config is final
45
- const preOptions = deepMerge (
44
+ const testConfig = deepMerge (
46
45
{ } as UserConfig ,
47
46
configDefaults ,
48
47
options ,
49
48
removeUndefinedValues ( viteConfig . test ?? { } ) ,
50
49
)
51
- preOptions . api = resolveApiServerConfig ( preOptions )
50
+ testConfig . api = resolveApiServerConfig ( testConfig )
52
51
53
52
if ( viteConfig . define ) {
54
53
delete viteConfig . define [ 'import.meta.vitest' ]
@@ -90,8 +89,8 @@ export async function VitestPlugin(options: UserConfig = {}, ctx = new Vitest('t
90
89
91
90
let open : string | boolean | undefined
92
91
93
- if ( preOptions . ui && preOptions . open )
94
- open = preOptions . uiBase ?? '/__vitest__/'
92
+ if ( testConfig . ui && testConfig . open )
93
+ open = testConfig . uiBase ?? '/__vitest__/'
95
94
96
95
const config : ViteConfig = {
97
96
root : viteConfig . test ?. root || options . root ,
@@ -105,24 +104,24 @@ export async function VitestPlugin(options: UserConfig = {}, ctx = new Vitest('t
105
104
// by default Vite resolves `module` field, which not always a native ESM module
106
105
// setting this option can bypass that and fallback to cjs version
107
106
mainFields : [ ] ,
108
- alias : preOptions . alias ,
107
+ alias : testConfig . alias ,
109
108
conditions : [ 'node' ] ,
110
109
// eslint-disable-next-line @typescript-eslint/prefer-ts-expect-error
111
110
// @ts -ignore we support Vite ^3.0, but browserField is available in Vite ^3.2
112
111
browserField : false ,
113
112
} ,
114
113
server : {
115
- ...preOptions . api ,
114
+ ...testConfig . api ,
116
115
watch : {
117
- ignored : preOptions . watchExclude ,
116
+ ignored : testConfig . watchExclude ,
118
117
} ,
119
118
open,
120
119
hmr : false ,
121
120
preTransformRequests : false ,
122
121
} ,
123
122
}
124
123
125
- const classNameStrategy = ( typeof preOptions . css !== 'boolean' && preOptions . css ?. modules ?. classNameStrategy ) || 'stable'
124
+ const classNameStrategy = ( typeof testConfig . css !== 'boolean' && testConfig . css ?. modules ?. classNameStrategy ) || 'stable'
126
125
127
126
if ( classNameStrategy !== 'scoped' ) {
128
127
config . css ??= { }
@@ -135,45 +134,14 @@ export async function VitestPlugin(options: UserConfig = {}, ctx = new Vitest('t
135
134
}
136
135
}
137
136
138
- const optimizeConfig : Partial < ViteConfig > = { }
139
- const optimizer = preOptions . deps ?. experimentalOptimizer
140
- const [ major , minor ] = viteVersion . split ( '.' ) . map ( Number )
141
- const allowed = major >= 5 || ( major === 4 && minor >= 3 )
142
- if ( ! allowed && optimizer ?. enabled === true )
143
- console . warn ( `Vitest: "deps.experimentalOptimizer" is only available in Vite >= 4.3.0, current Vite version: ${ viteVersion } ` )
144
- if ( ! allowed || optimizer ?. enabled !== true ) {
145
- optimizeConfig . cacheDir = undefined
146
- optimizeConfig . optimizeDeps = {
147
- // experimental in Vite >2.9.2, entries remains to help with older versions
148
- disabled : true ,
149
- entries : [ ] ,
150
- }
151
- }
152
- else {
153
- const cacheDir = preOptions . cache !== false ? preOptions . cache ?. dir : null
154
- optimizeConfig . cacheDir = cacheDir ?? 'node_modules/.vitest'
155
- const exclude = [
156
- 'vitest' ,
157
- ...builtinModules ,
158
- ...optimizer . exclude || [ ] ,
159
- ...viteConfig . optimizeDeps ?. exclude || [ ] ,
160
- ]
161
- const include = [
162
- ...optimizer . include || [ ] ,
163
- ...viteConfig . optimizeDeps ?. include || [ ] ,
164
- ] . filter ( ( n : string ) => ! exclude . includes ( n ) )
165
-
166
- optimizeConfig . optimizeDeps = {
167
- ...viteConfig . optimizeDeps ,
168
- ...optimizer ,
169
- noDiscovery : true ,
170
- disabled : false ,
171
- entries : [ ] ,
172
- exclude,
173
- include,
174
- }
137
+ const webOptimizer = resolveOptimizerConfig ( testConfig . deps ?. experimentalOptimizer ?. web , viteConfig . optimizeDeps , testConfig )
138
+ const ssrOptimizer = resolveOptimizerConfig ( testConfig . deps ?. experimentalOptimizer ?. ssr , viteConfig . ssr ?. optimizeDeps , testConfig )
139
+
140
+ config . cacheDir = webOptimizer . cacheDir || ssrOptimizer . cacheDir || config . cacheDir
141
+ config . optimizeDeps = webOptimizer . optimizeDeps
142
+ config . ssr = {
143
+ optimizeDeps : ssrOptimizer . optimizeDeps ,
175
144
}
176
- Object . assign ( config , optimizeConfig )
177
145
178
146
return config
179
147
} ,
0 commit comments