1
1
import type { Stats } from 'node:fs'
2
2
import type { HtmlTagDescriptor } from 'vite'
3
3
import type { Vitest } from 'vitest/node'
4
- import type { BrowserServer } from './server '
4
+ import type { ParentBrowserProject } from './projectParent '
5
5
import { lstatSync , readFileSync } from 'node:fs'
6
6
import { createRequire } from 'node:module'
7
7
import { dynamicImportPlugin } from '@vitest/mocker/node'
@@ -21,9 +21,9 @@ export type { BrowserCommand } from 'vitest/node'
21
21
22
22
const versionRegexp = / (?: \? | & ) v = \w { 8 } /
23
23
24
- export default ( browserServer : BrowserServer , base = '/' ) : Plugin [ ] => {
24
+ export default ( parentServer : ParentBrowserProject , base = '/' ) : Plugin [ ] => {
25
25
function isPackageExists ( pkg : string , root : string ) {
26
- return browserServer . vitest . packageInstaller . isPackageExists ?.( pkg , {
26
+ return parentServer . vitest . packageInstaller . isPackageExists ?.( pkg , {
27
27
paths : [ root ] ,
28
28
} )
29
29
}
@@ -33,7 +33,7 @@ export default (browserServer: BrowserServer, base = '/'): Plugin[] => {
33
33
enforce : 'pre' ,
34
34
name : 'vitest:browser' ,
35
35
async configureServer ( server ) {
36
- browserServer . setServer ( server )
36
+ parentServer . setServer ( server )
37
37
38
38
// eslint-disable-next-line prefer-arrow-callback
39
39
server . middlewares . use ( function vitestHeaders ( _req , res , next ) {
@@ -45,8 +45,8 @@ export default (browserServer: BrowserServer, base = '/'): Plugin[] => {
45
45
}
46
46
next ( )
47
47
} )
48
- server . middlewares . use ( createOrchestratorMiddleware ( browserServer ) )
49
- server . middlewares . use ( createTesterMiddleware ( browserServer ) )
48
+ server . middlewares . use ( createOrchestratorMiddleware ( parentServer ) )
49
+ server . middlewares . use ( createTesterMiddleware ( parentServer ) )
50
50
51
51
server . middlewares . use (
52
52
`${ base } favicon.svg` ,
@@ -57,7 +57,7 @@ export default (browserServer: BrowserServer, base = '/'): Plugin[] => {
57
57
} ,
58
58
)
59
59
60
- const coverageFolder = resolveCoverageFolder ( browserServer . vitest )
60
+ const coverageFolder = resolveCoverageFolder ( parentServer . vitest )
61
61
const coveragePath = coverageFolder ? coverageFolder [ 1 ] : undefined
62
62
if ( coveragePath && base === coveragePath ) {
63
63
throw new Error (
@@ -81,12 +81,12 @@ export default (browserServer: BrowserServer, base = '/'): Plugin[] => {
81
81
)
82
82
}
83
83
84
- const screenshotFailures = browserServer . config . browser . ui && browserServer . config . browser . screenshotFailures
84
+ const uiEnabled = parentServer . config . browser . ui
85
85
86
- if ( screenshotFailures ) {
86
+ if ( uiEnabled ) {
87
87
// eslint-disable-next-line prefer-arrow-callback
88
88
server . middlewares . use ( `${ base } __screenshot-error` , function vitestBrowserScreenshotError ( req , res ) {
89
- if ( ! req . url || ! browserServer . provider ) {
89
+ if ( ! req . url ) {
90
90
res . statusCode = 404
91
91
res . end ( )
92
92
return
@@ -152,17 +152,17 @@ export default (browserServer: BrowserServer, base = '/'): Plugin[] => {
152
152
name : 'vitest:browser:tests' ,
153
153
enforce : 'pre' ,
154
154
async config ( ) {
155
- const project = browserServer . vitest . getProjectByName ( browserServer . config . name )
155
+ const project = parentServer . vitest . getProjectByName ( parentServer . config . name )
156
156
const { testFiles : allTestFiles } = await project . globTestFiles ( )
157
157
const browserTestFiles = allTestFiles . filter (
158
158
file => getFilePoolName ( project , file ) === 'browser' ,
159
159
)
160
- const setupFiles = toArray ( browserServer . config . setupFiles )
160
+ const setupFiles = toArray ( project . config . setupFiles )
161
161
162
162
// replace env values - cannot be reassign at runtime
163
163
const define : Record < string , string > = { }
164
- for ( const env in ( browserServer . config . env || { } ) ) {
165
- const stringValue = JSON . stringify ( browserServer . config . env [ env ] )
164
+ for ( const env in ( project . config . env || { } ) ) {
165
+ const stringValue = JSON . stringify ( project . config . env [ env ] )
166
166
define [ `import.meta.env.${ env } ` ] = stringValue
167
167
}
168
168
@@ -173,7 +173,7 @@ export default (browserServer: BrowserServer, base = '/'): Plugin[] => {
173
173
resolve ( vitestDist , 'browser.js' ) ,
174
174
resolve ( vitestDist , 'runners.js' ) ,
175
175
resolve ( vitestDist , 'utils.js' ) ,
176
- ...( browserServer . config . snapshotSerializers || [ ] ) ,
176
+ ...( project . config . snapshotSerializers || [ ] ) ,
177
177
]
178
178
179
179
const exclude = [
@@ -199,22 +199,22 @@ export default (browserServer: BrowserServer, base = '/'): Plugin[] => {
199
199
'msw/browser' ,
200
200
]
201
201
202
- if ( typeof browserServer . config . diff === 'string' ) {
203
- entries . push ( browserServer . config . diff )
202
+ if ( typeof project . config . diff === 'string' ) {
203
+ entries . push ( project . config . diff )
204
204
}
205
205
206
- if ( browserServer . vitest . coverageProvider ) {
207
- const coverage = browserServer . vitest . config . coverage
206
+ if ( parentServer . vitest . coverageProvider ) {
207
+ const coverage = parentServer . vitest . config . coverage
208
208
const provider = coverage . provider
209
209
if ( provider === 'v8' ) {
210
- const path = tryResolve ( '@vitest/coverage-v8' , [ browserServer . config . root ] )
210
+ const path = tryResolve ( '@vitest/coverage-v8' , [ parentServer . config . root ] )
211
211
if ( path ) {
212
212
entries . push ( path )
213
213
exclude . push ( '@vitest/coverage-v8/browser' )
214
214
}
215
215
}
216
216
else if ( provider === 'istanbul' ) {
217
- const path = tryResolve ( '@vitest/coverage-istanbul' , [ browserServer . config . root ] )
217
+ const path = tryResolve ( '@vitest/coverage-istanbul' , [ parentServer . config . root ] )
218
218
if ( path ) {
219
219
entries . push ( path )
220
220
exclude . push ( '@vitest/coverage-istanbul' )
@@ -235,7 +235,7 @@ export default (browserServer: BrowserServer, base = '/'): Plugin[] => {
235
235
'@vitest/browser > @testing-library/dom' ,
236
236
]
237
237
238
- const fileRoot = browserTestFiles [ 0 ] ? dirname ( browserTestFiles [ 0 ] ) : browserServer . config . root
238
+ const fileRoot = browserTestFiles [ 0 ] ? dirname ( browserTestFiles [ 0 ] ) : project . config . root
239
239
240
240
const svelte = isPackageExists ( 'vitest-browser-svelte' , fileRoot )
241
241
if ( svelte ) {
@@ -302,14 +302,14 @@ export default (browserServer: BrowserServer, base = '/'): Plugin[] => {
302
302
}
303
303
} ,
304
304
transform ( code , id ) {
305
- if ( id . includes ( browserServer . vite . config . cacheDir ) && id . includes ( 'loupe.js' ) ) {
305
+ if ( id . includes ( parentServer . vite . config . cacheDir ) && id . includes ( 'loupe.js' ) ) {
306
306
// loupe bundle has a nastry require('util') call that leaves a warning in the console
307
307
const utilRequire = 'nodeUtil = require_util();'
308
308
return code . replace ( utilRequire , ' ' . repeat ( utilRequire . length ) )
309
309
}
310
310
} ,
311
311
} ,
312
- BrowserContext ( browserServer ) ,
312
+ BrowserContext ( parentServer ) ,
313
313
dynamicImportPlugin ( {
314
314
globalThisAccessor : '"__vitest_browser_runner__"' ,
315
315
filter ( id ) {
@@ -329,7 +329,7 @@ export default (browserServer: BrowserServer, base = '/'): Plugin[] => {
329
329
viteConfig . esbuild . legalComments = 'inline'
330
330
}
331
331
332
- const defaultPort = browserServer . vitest . _browserLastPort ++
332
+ const defaultPort = parentServer . vitest . _browserLastPort ++
333
333
334
334
const api = resolveApiServerConfig (
335
335
viteConfig . test ?. browser || { } ,
@@ -347,8 +347,8 @@ export default (browserServer: BrowserServer, base = '/'): Plugin[] => {
347
347
viteConfig . server . fs . allow = viteConfig . server . fs . allow || [ ]
348
348
viteConfig . server . fs . allow . push (
349
349
...resolveFsAllow (
350
- browserServer . vitest . config . root ,
351
- browserServer . vitest . server . config . configFile ,
350
+ parentServer . vitest . config . root ,
351
+ parentServer . vitest . vite . config . configFile ,
352
352
) ,
353
353
distRoot ,
354
354
)
@@ -363,7 +363,7 @@ export default (browserServer: BrowserServer, base = '/'): Plugin[] => {
363
363
{
364
364
name : 'vitest:browser:in-source-tests' ,
365
365
transform ( code , id ) {
366
- const project = browserServer . vitest . getProjectByName ( browserServer . config . name )
366
+ const project = parentServer . vitest . getProjectByName ( parentServer . config . name )
367
367
if ( ! project . isCachedTestFile ( id ) || ! code . includes ( 'import.meta.vitest' ) ) {
368
368
return
369
369
}
@@ -395,34 +395,38 @@ export default (browserServer: BrowserServer, base = '/'): Plugin[] => {
395
395
name : 'vitest:browser:transform-tester-html' ,
396
396
enforce : 'pre' ,
397
397
async transformIndexHtml ( html , ctx ) {
398
- if ( ctx . filename !== browserServer . testerFilepath ) {
398
+ const projectBrowser = [ ...parentServer . children ] . find ( ( server ) => {
399
+ return ctx . filename === server . testerFilepath
400
+ } )
401
+ if ( ! projectBrowser ) {
399
402
return
400
403
}
401
404
402
- if ( ! browserServer . testerScripts ) {
403
- const testerScripts = await browserServer . formatScripts (
404
- browserServer . config . browser . testerScripts ,
405
+ if ( ! parentServer . testerScripts ) {
406
+ const testerScripts = await parentServer . formatScripts (
407
+ parentServer . config . browser . testerScripts ,
405
408
)
406
- browserServer . testerScripts = testerScripts
409
+ parentServer . testerScripts = testerScripts
407
410
}
408
- const stateJs = typeof browserServer . stateJs === 'string'
409
- ? browserServer . stateJs
410
- : await browserServer . stateJs
411
+ const stateJs = typeof parentServer . stateJs === 'string'
412
+ ? parentServer . stateJs
413
+ : await parentServer . stateJs
411
414
412
415
const testerTags : HtmlTagDescriptor [ ] = [ ]
413
- const isDefaultTemplate = resolve ( distRoot , 'client/tester/tester.html' ) === browserServer . testerFilepath
416
+
417
+ const isDefaultTemplate = resolve ( distRoot , 'client/tester/tester.html' ) === projectBrowser . testerFilepath
414
418
if ( ! isDefaultTemplate ) {
415
- const manifestContent = browserServer . manifest instanceof Promise
416
- ? await browserServer . manifest
417
- : browserServer . manifest
419
+ const manifestContent = parentServer . manifest instanceof Promise
420
+ ? await parentServer . manifest
421
+ : parentServer . manifest
418
422
const testerEntry = manifestContent [ 'tester/tester.html' ]
419
423
420
424
testerTags . push ( {
421
425
tag : 'script' ,
422
426
attrs : {
423
427
type : 'module' ,
424
428
crossorigin : '' ,
425
- src : `${ browserServer . base } ${ testerEntry . file } ` ,
429
+ src : `${ parentServer . base } ${ testerEntry . file } ` ,
426
430
} ,
427
431
injectTo : 'head' ,
428
432
} )
@@ -434,7 +438,7 @@ export default (browserServer: BrowserServer, base = '/'): Plugin[] => {
434
438
{
435
439
tag : 'link' ,
436
440
attrs : {
437
- href : `${ browserServer . base } ${ entryManifest . file } ` ,
441
+ href : `${ parentServer . base } ${ entryManifest . file } ` ,
438
442
rel : 'modulepreload' ,
439
443
crossorigin : '' ,
440
444
} ,
@@ -478,21 +482,21 @@ body {
478
482
tag : 'script' ,
479
483
attrs : {
480
484
type : 'module' ,
481
- src : browserServer . errorCatcherUrl ,
485
+ src : parentServer . errorCatcherUrl ,
482
486
} ,
483
487
injectTo : 'head' as const ,
484
488
} ,
485
- browserServer . locatorsUrl
489
+ parentServer . locatorsUrl
486
490
? {
487
491
tag : 'script' ,
488
492
attrs : {
489
493
type : 'module' ,
490
- src : browserServer . locatorsUrl ,
494
+ src : parentServer . locatorsUrl ,
491
495
} ,
492
496
injectTo : 'head' ,
493
497
} as const
494
498
: null ,
495
- ...browserServer . testerScripts ,
499
+ ...parentServer . testerScripts ,
496
500
...testerTags ,
497
501
{
498
502
tag : 'script' ,
0 commit comments