diff --git a/packages/vitest/src/runtime/entry.ts b/packages/vitest/src/runtime/entry.ts index 024bcf6c2810..4dfbccc54196 100644 --- a/packages/vitest/src/runtime/entry.ts +++ b/packages/vitest/src/runtime/entry.ts @@ -1,7 +1,6 @@ import { promises as fs } from 'fs' -import type { ResolvedConfig, VitestEnvironment } from '../types' +import type { EnvironmentOptions, ResolvedConfig, VitestEnvironment } from '../types' import { getWorkerState, resetModules } from '../utils' -import { envs } from '../integrations/env' import { setupGlobalEnv, withEnv } from './setup' import { startTests } from './run' @@ -22,45 +21,29 @@ export async function run(files: string[], config: ResolvedConfig): Promise { const code = await fs.readFile(file, 'utf-8') const env = code.match(/@(?:vitest|jest)-environment\s+?([\w-]+)\b/)?.[1] || config.environment || 'node' + const envOptions = JSON.parse(code.match(/@(?:vitest|jest)-environment-options\s+?(.+)/)?.[1] || 'null') return { file, env: env as VitestEnvironment, + envOptions: envOptions as EnvironmentOptions | undefined, } })) - const filesByEnv = filesWithEnv.reduce((acc, { file, env }) => { - acc[env] ||= [] - acc[env].push(file) - return acc - }, {} as Record) - - const orderedEnvs = envs.concat( - Object.keys(filesByEnv).filter(env => !envs.includes(env)), - ) - - for (const env of orderedEnvs) { - const environment = env as VitestEnvironment - const files = filesByEnv[environment] - - if (!files || !files.length) - continue - - await withEnv(environment, config.environmentOptions || {}, async () => { - for (const file of files) { - // it doesn't matter if running with --threads - // if running with --no-threads, we usually want to reset everything before running a test - // but we have --isolate option to disable this - if (config.isolate) { - workerState.mockMap.clear() - resetModules(workerState.moduleCache, true) - } + for (const { file, env, envOptions } of filesWithEnv) { + await withEnv(env, envOptions || config.environmentOptions, async () => { + // it doesn't matter if running with --threads + // if running with --no-threads, we usually want to reset everything before running a test + // but we have --isolate option to disable this + if (config.isolate) { + workerState.mockMap.clear() + resetModules(workerState.moduleCache, true) + } - workerState.filepath = file + workerState.filepath = file - await startTests([file], config) + await startTests([file], config) - workerState.filepath = undefined - } + workerState.filepath = undefined }) } }