import { defineConfig } from "vitest/config"; import { loadPatternListFromEnv, narrowIncludePatternsForCli } from "./vitest.pattern-file.ts"; import { sharedVitestConfig } from "./vitest.shared.config.ts"; import { unitFastTestFiles } from "./vitest.unit-fast-paths.mjs"; function normalizePathPattern(value: string): string { return value.replaceAll("\\", "/"); } function relativizeScopedPattern(value: string, dir: string): string { const normalizedValue = normalizePathPattern(value); const normalizedDir = normalizePathPattern(dir).replace(/\/+$/u, ""); if (!normalizedDir) { return normalizedValue; } if (normalizedValue === normalizedDir) { return "."; } const prefix = `${normalizedDir}/`; return normalizedValue.startsWith(prefix) ? normalizedValue.slice(prefix.length) : normalizedValue; } function relativizeScopedPatterns(values: string[], dir?: string): string[] { if (!dir) { return values.map(normalizePathPattern); } return values.map((value) => relativizeScopedPattern(value, dir)); } export function resolveVitestIsolation( _env: Record = process.env, ): boolean { return false; } export function createScopedVitestConfig( include: string[], options?: { deps?: Record; dir?: string; env?: Record; environment?: string; exclude?: string[]; argv?: string[]; includeOpenClawRuntimeSetup?: boolean; isolate?: boolean; name?: string; pool?: "forks" | "threads"; passWithNoTests?: boolean; setupFiles?: string[]; useNonIsolatedRunner?: boolean; }, ) { const base = sharedVitestConfig as Record; const baseTest = sharedVitestConfig.test ?? {}; const scopedDir = options?.dir; const env = options?.env; const includeFromEnv = loadPatternListFromEnv("OPENCLAW_VITEST_INCLUDE_FILE", env); const cliInclude = narrowIncludePatternsForCli(include, options?.argv); const exclude = relativizeScopedPatterns( [...(baseTest.exclude ?? []), ...unitFastTestFiles, ...(options?.exclude ?? [])], scopedDir, ); const isolate = options?.isolate ?? resolveVitestIsolation(options?.env); const setupFiles = [ ...new Set([ ...(baseTest.setupFiles ?? []), ...(options?.setupFiles ?? []), ...(options?.includeOpenClawRuntimeSetup === false ? [] : ["test/setup-openclaw-runtime.ts"]), ]), ]; const useNonIsolatedRunner = options?.useNonIsolatedRunner ?? !isolate; const runner = useNonIsolatedRunner ? "./test/non-isolated-runner.ts" : undefined; return defineConfig({ ...base, test: { ...baseTest, ...(options?.deps ? { deps: options.deps } : {}), ...(options?.name ? { name: options.name } : {}), ...(options?.environment ? { environment: options.environment } : {}), isolate, ...(runner ? { runner } : { runner: undefined }), setupFiles, ...(scopedDir ? { dir: scopedDir } : {}), include: relativizeScopedPatterns(includeFromEnv ?? cliInclude ?? include, scopedDir), exclude, ...(options?.pool ? { pool: options.pool } : {}), ...(options?.passWithNoTests !== undefined || cliInclude !== null ? { passWithNoTests: options?.passWithNoTests ?? true } : {}), }, }); }