diff --git a/packages/browser/src/client/orchestrator.ts b/packages/browser/src/client/orchestrator.ts index 54bf0b69d..465ec1091 100644 --- a/packages/browser/src/client/orchestrator.ts +++ b/packages/browser/src/client/orchestrator.ts @@ -1,7 +1,7 @@ import type { GlobalChannelIncomingEvent, IframeChannelIncomingEvent, IframeChannelOutgoingEvent, IframeViewportDoneEvent, IframeViewportFailEvent } from '@vitest/browser/client' import type { BrowserTesterOptions, SerializedConfig } from 'vitest' import { channel, client, globalChannel } from '@vitest/browser/client' -import { generateHash } from '@vitest/runner/utils' +import { generateFileHash } from '@vitest/runner/utils' import { relative } from 'pathe' import { getUiAPI } from './ui' import { getBrowserState, getConfig } from './utils' @@ -291,9 +291,8 @@ async function sendEventToIframe(event: IframeChannelOutgoingEvent) { function generateFileId(file: string) { const config = getConfig() - const project = config.name || '' const path = relative(config.root, file) - return generateHash(`${path}${project}`) + return generateFileHash(path, config.name) } async function setIframeViewport( diff --git a/packages/browser/src/client/ui.ts b/packages/browser/src/client/ui.ts index c6a315060..4ea65f655 100644 --- a/packages/browser/src/client/ui.ts +++ b/packages/browser/src/client/ui.ts @@ -1,5 +1,6 @@ import type { BrowserUI } from 'vitest' +/* @__NO_SIDE_EFFECTS__ */ export function getUiAPI(): BrowserUI | undefined { // @ts-expect-error not typed global return window.__vitest_ui_api__ diff --git a/packages/runner/src/collect.ts b/packages/runner/src/collect.ts index 08e56e23b..3ffaa677c 100644 --- a/packages/runner/src/collect.ts +++ b/packages/runner/src/collect.ts @@ -2,7 +2,7 @@ import type { FileSpecification, VitestRunner } from './types/runner' import type { File, SuiteHooks } from './types/tasks' import { toArray } from '@vitest/utils' import { processError } from '@vitest/utils/error' -import { collectorContext } from './context' +import { collectorContext, setFileContext } from './context' import { getHooks, setHooks } from './map' import { runSetupFiles } from './setup' import { @@ -32,6 +32,7 @@ export async function collectTests( const testLocations = typeof spec === 'string' ? undefined : spec.testLocations const file = createFileTask(filepath, config.root, config.name, runner.pool) + setFileContext(file, Object.create(null)) file.shuffle = config.sequence.shuffle runner.onCollectStart?.(file) diff --git a/packages/runner/src/utils/collect.ts b/packages/runner/src/utils/collect.ts index fbf9b0b32..4635f0064 100644 --- a/packages/runner/src/utils/collect.ts +++ b/packages/runner/src/utils/collect.ts @@ -3,7 +3,6 @@ import type { File, Suite, TaskBase } from '../types/tasks' import { processError } from '@vitest/utils/error' import { parseSingleStack } from '@vitest/utils/source-map' import { relative } from 'pathe' -import { setFileContext } from '../context' /** * If any tasks been marked as `only`, mark all other tasks as `skip`. @@ -155,6 +154,7 @@ function checkAllowOnly(task: TaskBase, allowOnly?: boolean) { } } +/* @__NO_SIDE_EFFECTS__ */ export function generateHash(str: string): string { let hash = 0 if (str.length === 0) { @@ -197,7 +197,6 @@ export function createFileTask( pool, } file.file = file - setFileContext(file, Object.create(null)) return file } @@ -206,11 +205,12 @@ export function createFileTask( * @param file File relative to the root of the project to keep ID the same between different machines * @param projectName The name of the test project */ +/* @__NO_SIDE_EFFECTS__ */ export function generateFileHash( file: string, projectName: string | undefined, ): string { - return generateHash(`${file}${projectName || ''}`) + return /* @__PURE__ */ generateHash(`${file}${projectName || ''}`) } export function findTestFileStackTrace(testFilePath: string, error: string): ParsedStack | undefined {