From 9443c7a702c347ea28c587a1ff16619c7bc27d85 Mon Sep 17 00:00:00 2001 From: Hiroshi Ogawa <4232207+hi-ogawa@users.noreply.github.com> Date: Thu, 3 Sep 2026 18:22:19 +0900 Subject: [PATCH] refactor: load worker config over rpc Co-authored-by: OpenCode (gpt-5.6-sol) --- packages/extension/src/api.ts | 7 +++++-- packages/extension/src/apiProcess.ts | 11 +++++++++-- packages/extension/src/runner.ts | 8 ++++---- packages/shared/src/index.ts | 8 ++++++++ packages/worker-legacy/src/worker.ts | 4 ++++ packages/worker/src/worker.ts | 12 ++++++++++++ 6 files changed, 42 insertions(+), 8 deletions(-) diff --git a/packages/extension/src/api.ts b/packages/extension/src/api.ts index 60ce8cd..acbeb4e 100644 --- a/packages/extension/src/api.ts +++ b/packages/extension/src/api.ts @@ -192,8 +192,11 @@ async function createVitestProcessAPI( usedConfigs.add(project.config) } }) - const files = await meta.rpc.getFiles() - const config = new VitestProjectConfig(pkg, meta.projects, meta.workspaceSource) + const [files, workerConfig] = await Promise.all([ + meta.rpc.getFiles(), + meta.rpc.getExtensionConfig(), + ]) + const config = new VitestProjectConfig(pkg, meta.projects, meta.workspaceSource, workerConfig) const api = new VitestProcessAPI(config) return { api, files } }) diff --git a/packages/extension/src/apiProcess.ts b/packages/extension/src/apiProcess.ts index b4799fe..2e9431b 100644 --- a/packages/extension/src/apiProcess.ts +++ b/packages/extension/src/apiProcess.ts @@ -1,4 +1,4 @@ -import type { SerializedProject } from 'vitest-vscode-shared' +import type { ExtensionWorkerConfig, SerializedProject } from 'vitest-vscode-shared' import type { VitestPackage } from './spawn/pkg' import { usesJestTestNamePattern } from './spawn/pkg' import type { ExtensionWorkerEvents, VitestExtensionRPC } from './spawn/rpc' @@ -6,7 +6,7 @@ import type { ExtensionWorkerProcess } from './spawn/types' import type { ProcessSpawnOptions } from './spawn/ws' import type { TestFileMetadata } from './testTreeData' import { readFileSync } from 'node:fs' -import { normalize, relative } from 'pathe' +import { normalize, relative, resolve } from 'pathe' import pm from 'picomatch' import { createQueuedHandler } from 'vitest-vscode-shared' import * as vscode from 'vscode' @@ -24,6 +24,7 @@ export class VitestProjectConfig { readonly pkg: VitestPackage, readonly projects: SerializedProject[], readonly workspaceSource: string | false, + readonly workerConfig?: ExtensionWorkerConfig, ) { this.id = normalize(pkg.id) this.workspaceFolder = pkg.folder @@ -50,6 +51,12 @@ export class VitestProjectConfig { return usesJestTestNamePattern(this.pkg) } + get htmlReportPath() { + const config = this.workerConfig + if (!config?.htmlReporter) return + return resolve(config.root, config.htmlReporter.outputDir || '.vitest', 'index.html') + } + get package() { return this.pkg } diff --git a/packages/extension/src/runner.ts b/packages/extension/src/runner.ts index 9371b65..28ff046 100644 --- a/packages/extension/src/runner.ts +++ b/packages/extension/src/runner.ts @@ -8,7 +8,7 @@ import type { TraceReportManager } from './traceReport' import crypto from 'node:crypto' import path from 'node:path' import { stripVTControlCharacters } from 'node:util' -import { basename, normalize, relative, resolve } from 'pathe' +import { basename, normalize, relative } from 'pathe' import { normalizeDriveLetter } from 'vitest-vscode-shared' import * as vscode from 'vscode' import { getConfig } from './config' @@ -112,9 +112,9 @@ export class TestRunner extends vscode.Disposable { }) handle.handlers.onTestRunEnd(async (files, unhandledError, collecting, coverage) => { - if (!collecting) { - const reportPath = resolve(this.api.config.cwd, '.vitest/index.html') - this.traceReports?.update(this.api.id, reportPath, files, this.tree) + const htmlReportPath = this.api.config.htmlReportPath + if (!collecting && htmlReportPath) { + this.traceReports?.update(this.api.id, htmlReportPath, files, this.tree) } const testRun = this.testRun diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts index cfd4da4..6f351ea 100644 --- a/packages/shared/src/index.ts +++ b/packages/shared/src/index.ts @@ -50,7 +50,15 @@ export interface ExtensionEnvironment { }[] } +export interface ExtensionWorkerConfig { + root: string + htmlReporter?: { + outputDir?: string + } +} + export interface ExtensionWorkerTransport { + getExtensionConfig: () => ExtensionWorkerConfig getFiles: () => Promise collectTests: (testFile: ExtensionTestSpecification[]) => Promise cancelRun: () => Promise diff --git a/packages/worker-legacy/src/worker.ts b/packages/worker-legacy/src/worker.ts index 3205845..c730a07 100644 --- a/packages/worker-legacy/src/worker.ts +++ b/packages/worker-legacy/src/worker.ts @@ -43,6 +43,10 @@ export class ExtensionWorker implements ExtensionWorkerTransport { ) } + getExtensionConfig() { + return { root: this.vitest.config.root } + } + private get configOverride(): Partial { return (this.vitest as any).configOverride } diff --git a/packages/worker/src/worker.ts b/packages/worker/src/worker.ts index 6d1924b..f92b11a 100644 --- a/packages/worker/src/worker.ts +++ b/packages/worker/src/worker.ts @@ -26,6 +26,18 @@ export class ExtensionWorker implements ExtensionWorkerTransport { this.watcher = new ExtensionWorkerWatcher(vitest, this.runner) } + getExtensionConfig() { + let htmlReporter: { outputDir?: string } | undefined + for (const reporter of this.vitest.config.reporters) { + if (Array.isArray(reporter) && reporter[0] === 'html') { + const options = reporter[1] as { outputDir?: string } + htmlReporter = { outputDir: options.outputDir } + break + } + } + return { root: this.vitest.config.root, htmlReporter } + } + async getFiles(): Promise { return this.runner.getFiles() } -- 2.51.2