diff --git a/packages/browser/src/client/client.ts b/packages/browser/src/client/client.ts index ae248a8b9..df2ff58cd 100644 --- a/packages/browser/src/client/client.ts +++ b/packages/browser/src/client/client.ts @@ -5,12 +5,14 @@ import { parse, stringify } from 'flatted' import type { VitestBrowserClientMocker } from './mocker' import { getBrowserState } from './utils' +const PAGE_TYPE = getBrowserState().type + export const PORT = import.meta.hot ? '51204' : location.port export const HOST = [location.hostname, PORT].filter(Boolean).join(':') export const SESSION_ID = crypto.randomUUID() export const ENTRY_URL = `${ location.protocol === 'https:' ? 'wss:' : 'ws:' -}//${HOST}/__vitest_browser_api__?type=${getBrowserState().type}&sessionId=${SESSION_ID}` +}//${HOST}/__vitest_browser_api__?type=${PAGE_TYPE}&sessionId=${SESSION_ID}` let setCancel = (_: CancelReason) => {} export const onCancel = new Promise((resolve) => { @@ -51,6 +53,11 @@ function createClient() { const exports = await mocker.resolve(id) return Object.keys(exports) }, + async createTesters(files: string[]) { + if (PAGE_TYPE !== 'orchestrator') + return + getBrowserState().createTesters?.(files) + }, }, { post: msg => ctx.ws.send(msg), on: fn => (onMessage = fn), diff --git a/packages/browser/src/client/orchestrator.ts b/packages/browser/src/client/orchestrator.ts index bb4750967..36d783dca 100644 --- a/packages/browser/src/client/orchestrator.ts +++ b/packages/browser/src/client/orchestrator.ts @@ -12,6 +12,15 @@ const ID_ALL = '__vitest_all__' const iframes = new Map() +let promiseTesters: Promise | undefined +getBrowserState().createTesters = async (files) => { + await promiseTesters + promiseTesters = createTesters(files).finally(() => { + promiseTesters = undefined + }) + await promiseTesters +} + function debug(...args: unknown[]) { const debug = getConfig().env.VITEST_BROWSER_DEBUG if (debug && debug !== 'false') @@ -20,7 +29,7 @@ function debug(...args: unknown[]) { function createIframe(container: HTMLDivElement, file: string) { if (iframes.has(file)) { - container.removeChild(iframes.get(file)!) + iframes.get(file)!.remove() iframes.delete(file) } @@ -75,7 +84,6 @@ async function getContainer(config: ResolvedConfig): Promise { } client.ws.addEventListener('open', async () => { - const config = getConfig() const testFiles = getBrowserState().files debug('test files', testFiles.join(', ')) @@ -86,7 +94,6 @@ client.ws.addEventListener('open', async () => { return } - const container = await getContainer(config) const runningFiles = new Set(testFiles) channel.addEventListener('message', async (e: MessageEvent): Promise => { @@ -137,6 +144,13 @@ client.ws.addEventListener('open', async () => { } }) + await createTesters(testFiles) +}) + +async function createTesters(testFiles: string[]) { + const config = getConfig() + const container = await getContainer(config) + if (config.browser.ui) { container.className = '' container.textContent = '' @@ -174,7 +188,7 @@ client.ws.addEventListener('open', async () => { }) } } -}) +} function generateFileId(file: string) { const config = getConfig() diff --git a/packages/browser/src/client/tester.ts b/packages/browser/src/client/tester.ts index e2793b71e..1d0c02c84 100644 --- a/packages/browser/src/client/tester.ts +++ b/packages/browser/src/client/tester.ts @@ -74,7 +74,7 @@ async function prepareTestEnvironment(files: string[]) { worker: './browser.js', workerId: 1, config, - projectName: config.name, + projectName: config.name || '', files, environment: { name: 'browser', diff --git a/packages/browser/src/client/utils.ts b/packages/browser/src/client/utils.ts index 8c13e93dc..d26abf515 100644 --- a/packages/browser/src/client/utils.ts +++ b/packages/browser/src/client/utils.ts @@ -16,7 +16,8 @@ interface BrowserRunnerState { config: ResolvedConfig type: 'tester' | 'orchestrator' wrapModule: (module: () => T) => T - runTests: (tests: string[]) => Promise + runTests?: (tests: string[]) => Promise + createTesters?: (files: string[]) => Promise } export function getBrowserState(): BrowserRunnerState { diff --git a/packages/runner/src/types/tasks.ts b/packages/runner/src/types/tasks.ts index 885e8e9bd..d22367841 100644 --- a/packages/runner/src/types/tasks.ts +++ b/packages/runner/src/types/tasks.ts @@ -60,7 +60,7 @@ export interface Suite extends TaskBase { export interface File extends Suite { filepath: string - projectName: string + projectName: string | undefined collectDuration?: number setupDuration?: number } diff --git a/packages/ui/client/components/FileDetails.vue b/packages/ui/client/components/FileDetails.vue index cb0807a27..41e004ea0 100644 --- a/packages/ui/client/components/FileDetails.vue +++ b/packages/ui/client/components/FileDetails.vue @@ -1,6 +1,6 @@