1- import { builtinModules } from 'node:module'
2- import { version as viteVersion } from 'vite'
31import type { UserConfig as ViteConfig , Plugin as VitePlugin } from 'vite'
42import { relative } from 'pathe'
53import { configDefaults } from '../../defaults'
@@ -14,6 +12,7 @@ import { GlobalSetupPlugin } from './globalSetup'
1412import { CSSEnablerPlugin } from './cssEnabler'
1513import { CoverageTransform } from './coverageTransform'
1614import { MocksPlugin } from './mocks'
15+ import { resolveOptimizerConfig } from './utils'
1716
1817export async function VitestPlugin ( options : UserConfig = { } , ctx = new Vitest ( 'test' ) ) : Promise < VitePlugin [ ] > {
1918 const userConfig = deepMerge ( { } , options ) as UserConfig
@@ -42,13 +41,13 @@ export async function VitestPlugin(options: UserConfig = {}, ctx = new Vitest('t
4241 // preliminary merge of options to be able to create server options for vite
4342 // however to allow vitest plugins to modify vitest config values
4443 // this is repeated in configResolved where the config is final
45- const preOptions = deepMerge (
44+ const testConfig = deepMerge (
4645 { } as UserConfig ,
4746 configDefaults ,
4847 options ,
4948 removeUndefinedValues ( viteConfig . test ?? { } ) ,
5049 )
51- preOptions . api = resolveApiServerConfig ( preOptions )
50+ testConfig . api = resolveApiServerConfig ( testConfig )
5251
5352 if ( viteConfig . define ) {
5453 delete viteConfig . define [ 'import.meta.vitest' ]
@@ -90,8 +89,8 @@ export async function VitestPlugin(options: UserConfig = {}, ctx = new Vitest('t
9089
9190 let open : string | boolean | undefined
9291
93- if ( preOptions . ui && preOptions . open )
94- open = preOptions . uiBase ?? '/__vitest__/'
92+ if ( testConfig . ui && testConfig . open )
93+ open = testConfig . uiBase ?? '/__vitest__/'
9594
9695 const config : ViteConfig = {
9796 root : viteConfig . test ?. root || options . root ,
@@ -105,24 +104,24 @@ export async function VitestPlugin(options: UserConfig = {}, ctx = new Vitest('t
105104 // by default Vite resolves `module` field, which not always a native ESM module
106105 // setting this option can bypass that and fallback to cjs version
107106 mainFields : [ ] ,
108- alias : preOptions . alias ,
107+ alias : testConfig . alias ,
109108 conditions : [ 'node' ] ,
110109 // eslint-disable-next-line @typescript-eslint/prefer-ts-expect-error
111110 // @ts -ignore we support Vite ^3.0, but browserField is available in Vite ^3.2
112111 browserField : false ,
113112 } ,
114113 server : {
115- ...preOptions . api ,
114+ ...testConfig . api ,
116115 watch : {
117- ignored : preOptions . watchExclude ,
116+ ignored : testConfig . watchExclude ,
118117 } ,
119118 open,
120119 hmr : false ,
121120 preTransformRequests : false ,
122121 } ,
123122 }
124123
125- const classNameStrategy = ( typeof preOptions . css !== 'boolean' && preOptions . css ?. modules ?. classNameStrategy ) || 'stable'
124+ const classNameStrategy = ( typeof testConfig . css !== 'boolean' && testConfig . css ?. modules ?. classNameStrategy ) || 'stable'
126125
127126 if ( classNameStrategy !== 'scoped' ) {
128127 config . css ??= { }
@@ -135,45 +134,14 @@ export async function VitestPlugin(options: UserConfig = {}, ctx = new Vitest('t
135134 }
136135 }
137136
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 ,
175144 }
176- Object . assign ( config , optimizeConfig )
177145
178146 return config
179147 } ,
0 commit comments