Skip to content

Commit 603e323

Browse files
committed
fix: make sure the cloned config doesn't reference the root config
1 parent 1e41e34 commit 603e323

24 files changed

+498
-350
lines changed

eslint.config.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ export default antfu(
7979
'no-restricted-imports': [
8080
'error',
8181
{
82-
paths: ['vitest', 'path'],
82+
paths: ['vitest', 'path', 'vitest/node'],
8383
},
8484
],
8585
},

packages/browser/src/node/index.ts

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
import type { Plugin } from 'vitest/config'
2-
import type { BrowserServer as IBrowserServer, TestProject } from 'vitest/node'
2+
import type { TestProject } from 'vitest/node'
33
import c from 'tinyrainbow'
44
import { createViteLogger, createViteServer } from 'vitest/node'
55
import { version } from '../../package.json'
66
import BrowserPlugin from './plugin'
7+
import { ParentBrowserProject } from './projectParent'
78
import { setupBrowserRpc } from './rpc'
8-
import { BrowserServer } from './server'
99

1010
export { distRoot } from './constants'
1111
export { createBrowserPool } from './pool'
1212

13-
export type { BrowserServer } from './server'
13+
export type { ProjectBrowser } from './project'
1414

1515
export async function createBrowserServer(
1616
project: TestProject,
@@ -28,7 +28,7 @@ export async function createBrowserServer(
2828
)
2929
}
3030

31-
const server = new BrowserServer(project, '/')
31+
const server = new ParentBrowserProject(project, '/')
3232

3333
const configPath = typeof configFile === 'string' ? configFile : false
3434

@@ -77,15 +77,3 @@ export async function createBrowserServer(
7777

7878
return server
7979
}
80-
81-
export function cloneBrowserServer(
82-
project: TestProject,
83-
browserServer: IBrowserServer,
84-
) {
85-
const clone = new BrowserServer(
86-
project,
87-
'/',
88-
)
89-
clone.setServer(browserServer.vite)
90-
return clone
91-
}
Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,25 @@
11
import type { Connect } from 'vite'
2-
import type { BrowserServer } from '../server'
2+
import type { ParentBrowserProject } from '../projectParent'
33
import { resolveOrchestrator } from '../serverOrchestrator'
44
import { allowIframes, disableCache } from './utils'
55

6-
export function createOrchestratorMiddleware(browserServer: BrowserServer): Connect.NextHandleFunction {
6+
export function createOrchestratorMiddleware(parentServer: ParentBrowserProject): Connect.NextHandleFunction {
77
return async function vitestOrchestratorMiddleware(req, res, next) {
88
if (!req.url) {
99
return next()
1010
}
1111
const url = new URL(req.url, 'http://localhost')
12-
if (url.pathname !== browserServer.base) {
12+
if (url.pathname !== parentServer.base) {
1313
return next()
1414
}
1515

16-
disableCache(res)
17-
allowIframes(res)
16+
const html = await resolveOrchestrator(parentServer, url, res)
17+
if (html) {
18+
disableCache(res)
19+
allowIframes(res)
1820

19-
const html = await resolveOrchestrator(browserServer, url, res)
20-
res.write(html, 'utf-8')
21-
res.end()
21+
res.write(html, 'utf-8')
22+
res.end()
23+
}
2224
}
2325
}

packages/browser/src/node/middlewares/testerMiddleware.ts

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import type { Connect } from 'vite'
2-
import type { BrowserServer } from '../server'
2+
import type { ParentBrowserProject } from '../projectParent'
33
import { resolveTester } from '../serverTester'
44
import { allowIframes, disableCache } from './utils'
55

6-
export function createTesterMiddleware(browserServer: BrowserServer): Connect.NextHandleFunction {
6+
export function createTesterMiddleware(browserServer: ParentBrowserProject): Connect.NextHandleFunction {
77
return async function vitestTesterMiddleware(req, res, next) {
88
if (!req.url) {
99
return next()
@@ -13,11 +13,10 @@ export function createTesterMiddleware(browserServer: BrowserServer): Connect.Ne
1313
return next()
1414
}
1515

16-
disableCache(res)
17-
allowIframes(res)
18-
1916
const html = await resolveTester(browserServer, url, res, next)
2017
if (html) {
18+
disableCache(res)
19+
allowIframes(res)
2120
res.write(html, 'utf-8')
2221
res.end()
2322
}

packages/browser/src/node/plugin.ts

Lines changed: 50 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import type { Stats } from 'node:fs'
22
import type { HtmlTagDescriptor } from 'vite'
33
import type { Vitest } from 'vitest/node'
4-
import type { BrowserServer } from './server'
4+
import type { ParentBrowserProject } from './projectParent'
55
import { lstatSync, readFileSync } from 'node:fs'
66
import { createRequire } from 'node:module'
77
import { dynamicImportPlugin } from '@vitest/mocker/node'
@@ -21,9 +21,9 @@ export type { BrowserCommand } from 'vitest/node'
2121

2222
const versionRegexp = /(?:\?|&)v=\w{8}/
2323

24-
export default (browserServer: BrowserServer, base = '/'): Plugin[] => {
24+
export default (parentServer: ParentBrowserProject, base = '/'): Plugin[] => {
2525
function isPackageExists(pkg: string, root: string) {
26-
return browserServer.vitest.packageInstaller.isPackageExists?.(pkg, {
26+
return parentServer.vitest.packageInstaller.isPackageExists?.(pkg, {
2727
paths: [root],
2828
})
2929
}
@@ -33,7 +33,7 @@ export default (browserServer: BrowserServer, base = '/'): Plugin[] => {
3333
enforce: 'pre',
3434
name: 'vitest:browser',
3535
async configureServer(server) {
36-
browserServer.setServer(server)
36+
parentServer.setServer(server)
3737

3838
// eslint-disable-next-line prefer-arrow-callback
3939
server.middlewares.use(function vitestHeaders(_req, res, next) {
@@ -45,8 +45,8 @@ export default (browserServer: BrowserServer, base = '/'): Plugin[] => {
4545
}
4646
next()
4747
})
48-
server.middlewares.use(createOrchestratorMiddleware(browserServer))
49-
server.middlewares.use(createTesterMiddleware(browserServer))
48+
server.middlewares.use(createOrchestratorMiddleware(parentServer))
49+
server.middlewares.use(createTesterMiddleware(parentServer))
5050

5151
server.middlewares.use(
5252
`${base}favicon.svg`,
@@ -57,7 +57,7 @@ export default (browserServer: BrowserServer, base = '/'): Plugin[] => {
5757
},
5858
)
5959

60-
const coverageFolder = resolveCoverageFolder(browserServer.vitest)
60+
const coverageFolder = resolveCoverageFolder(parentServer.vitest)
6161
const coveragePath = coverageFolder ? coverageFolder[1] : undefined
6262
if (coveragePath && base === coveragePath) {
6363
throw new Error(
@@ -81,12 +81,12 @@ export default (browserServer: BrowserServer, base = '/'): Plugin[] => {
8181
)
8282
}
8383

84-
const screenshotFailures = browserServer.config.browser.ui && browserServer.config.browser.screenshotFailures
84+
const uiEnabled = parentServer.config.browser.ui
8585

86-
if (screenshotFailures) {
86+
if (uiEnabled) {
8787
// eslint-disable-next-line prefer-arrow-callback
8888
server.middlewares.use(`${base}__screenshot-error`, function vitestBrowserScreenshotError(req, res) {
89-
if (!req.url || !browserServer.provider) {
89+
if (!req.url) {
9090
res.statusCode = 404
9191
res.end()
9292
return
@@ -152,17 +152,17 @@ export default (browserServer: BrowserServer, base = '/'): Plugin[] => {
152152
name: 'vitest:browser:tests',
153153
enforce: 'pre',
154154
async config() {
155-
const project = browserServer.vitest.getProjectByName(browserServer.config.name)
155+
const project = parentServer.vitest.getProjectByName(parentServer.config.name)
156156
const { testFiles: allTestFiles } = await project.globTestFiles()
157157
const browserTestFiles = allTestFiles.filter(
158158
file => getFilePoolName(project, file) === 'browser',
159159
)
160-
const setupFiles = toArray(browserServer.config.setupFiles)
160+
const setupFiles = toArray(project.config.setupFiles)
161161

162162
// replace env values - cannot be reassign at runtime
163163
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])
166166
define[`import.meta.env.${env}`] = stringValue
167167
}
168168

@@ -173,7 +173,7 @@ export default (browserServer: BrowserServer, base = '/'): Plugin[] => {
173173
resolve(vitestDist, 'browser.js'),
174174
resolve(vitestDist, 'runners.js'),
175175
resolve(vitestDist, 'utils.js'),
176-
...(browserServer.config.snapshotSerializers || []),
176+
...(project.config.snapshotSerializers || []),
177177
]
178178

179179
const exclude = [
@@ -199,22 +199,22 @@ export default (browserServer: BrowserServer, base = '/'): Plugin[] => {
199199
'msw/browser',
200200
]
201201

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)
204204
}
205205

206-
if (browserServer.vitest.coverageProvider) {
207-
const coverage = browserServer.vitest.config.coverage
206+
if (parentServer.vitest.coverageProvider) {
207+
const coverage = parentServer.vitest.config.coverage
208208
const provider = coverage.provider
209209
if (provider === 'v8') {
210-
const path = tryResolve('@vitest/coverage-v8', [browserServer.config.root])
210+
const path = tryResolve('@vitest/coverage-v8', [parentServer.config.root])
211211
if (path) {
212212
entries.push(path)
213213
exclude.push('@vitest/coverage-v8/browser')
214214
}
215215
}
216216
else if (provider === 'istanbul') {
217-
const path = tryResolve('@vitest/coverage-istanbul', [browserServer.config.root])
217+
const path = tryResolve('@vitest/coverage-istanbul', [parentServer.config.root])
218218
if (path) {
219219
entries.push(path)
220220
exclude.push('@vitest/coverage-istanbul')
@@ -235,7 +235,7 @@ export default (browserServer: BrowserServer, base = '/'): Plugin[] => {
235235
'@vitest/browser > @testing-library/dom',
236236
]
237237

238-
const fileRoot = browserTestFiles[0] ? dirname(browserTestFiles[0]) : browserServer.config.root
238+
const fileRoot = browserTestFiles[0] ? dirname(browserTestFiles[0]) : project.config.root
239239

240240
const svelte = isPackageExists('vitest-browser-svelte', fileRoot)
241241
if (svelte) {
@@ -302,14 +302,14 @@ export default (browserServer: BrowserServer, base = '/'): Plugin[] => {
302302
}
303303
},
304304
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')) {
306306
// loupe bundle has a nastry require('util') call that leaves a warning in the console
307307
const utilRequire = 'nodeUtil = require_util();'
308308
return code.replace(utilRequire, ' '.repeat(utilRequire.length))
309309
}
310310
},
311311
},
312-
BrowserContext(browserServer),
312+
BrowserContext(parentServer),
313313
dynamicImportPlugin({
314314
globalThisAccessor: '"__vitest_browser_runner__"',
315315
filter(id) {
@@ -329,7 +329,7 @@ export default (browserServer: BrowserServer, base = '/'): Plugin[] => {
329329
viteConfig.esbuild.legalComments = 'inline'
330330
}
331331

332-
const defaultPort = browserServer.vitest._browserLastPort++
332+
const defaultPort = parentServer.vitest._browserLastPort++
333333

334334
const api = resolveApiServerConfig(
335335
viteConfig.test?.browser || {},
@@ -347,8 +347,8 @@ export default (browserServer: BrowserServer, base = '/'): Plugin[] => {
347347
viteConfig.server.fs.allow = viteConfig.server.fs.allow || []
348348
viteConfig.server.fs.allow.push(
349349
...resolveFsAllow(
350-
browserServer.vitest.config.root,
351-
browserServer.vitest.server.config.configFile,
350+
parentServer.vitest.config.root,
351+
parentServer.vitest.vite.config.configFile,
352352
),
353353
distRoot,
354354
)
@@ -363,7 +363,7 @@ export default (browserServer: BrowserServer, base = '/'): Plugin[] => {
363363
{
364364
name: 'vitest:browser:in-source-tests',
365365
transform(code, id) {
366-
const project = browserServer.vitest.getProjectByName(browserServer.config.name)
366+
const project = parentServer.vitest.getProjectByName(parentServer.config.name)
367367
if (!project.isCachedTestFile(id) || !code.includes('import.meta.vitest')) {
368368
return
369369
}
@@ -395,34 +395,38 @@ export default (browserServer: BrowserServer, base = '/'): Plugin[] => {
395395
name: 'vitest:browser:transform-tester-html',
396396
enforce: 'pre',
397397
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) {
399402
return
400403
}
401404

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,
405408
)
406-
browserServer.testerScripts = testerScripts
409+
parentServer.testerScripts = testerScripts
407410
}
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
411414

412415
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
414418
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
418422
const testerEntry = manifestContent['tester/tester.html']
419423

420424
testerTags.push({
421425
tag: 'script',
422426
attrs: {
423427
type: 'module',
424428
crossorigin: '',
425-
src: `${browserServer.base}${testerEntry.file}`,
429+
src: `${parentServer.base}${testerEntry.file}`,
426430
},
427431
injectTo: 'head',
428432
})
@@ -434,7 +438,7 @@ export default (browserServer: BrowserServer, base = '/'): Plugin[] => {
434438
{
435439
tag: 'link',
436440
attrs: {
437-
href: `${browserServer.base}${entryManifest.file}`,
441+
href: `${parentServer.base}${entryManifest.file}`,
438442
rel: 'modulepreload',
439443
crossorigin: '',
440444
},
@@ -478,21 +482,21 @@ body {
478482
tag: 'script',
479483
attrs: {
480484
type: 'module',
481-
src: browserServer.errorCatcherUrl,
485+
src: parentServer.errorCatcherUrl,
482486
},
483487
injectTo: 'head' as const,
484488
},
485-
browserServer.locatorsUrl
489+
parentServer.locatorsUrl
486490
? {
487491
tag: 'script',
488492
attrs: {
489493
type: 'module',
490-
src: browserServer.locatorsUrl,
494+
src: parentServer.locatorsUrl,
491495
},
492496
injectTo: 'head',
493497
} as const
494498
: null,
495-
...browserServer.testerScripts,
499+
...parentServer.testerScripts,
496500
...testerTags,
497501
{
498502
tag: 'script',

0 commit comments

Comments
 (0)