diff --git a/src/log.ts b/src/log.ts index e36c494..0906003 100644 --- a/src/log.ts +++ b/src/log.ts @@ -10,20 +10,20 @@ export const log = { args[args.length - 1] = args.at(-1).slice(0, process.platform === 'win32' ? -2 : -1) const time = new Date().toLocaleTimeString() - if (process.env.NODE_ENV === 'dev') { + if (process.env.EXTENSION_NODE_ENV === 'dev') { console[type](`[INFO ${time}]`, '[Worker]', ...args) } _log.appendLine(`[INFO ${time}] [Worker] ${args.join(' ')}`) }, info: (...args: any[]) => { - if (process.env.NODE_ENV === 'dev') { + if (process.env.EXTENSION_NODE_ENV === 'dev') { console.log(...args) } const time = new Date().toLocaleTimeString() _log.appendLine(`[INFO ${time}] ${args.join(' ')}`) }, error: (...args: any[]) => { - if (process.env.NODE_ENV === 'dev') { + if (process.env.EXTENSION_NODE_ENV === 'dev') { console.error(...args) } const time = new Date().toLocaleTimeString() @@ -39,7 +39,7 @@ export const log = { ? undefined : (...args: string[]) => { const time = new Date().toLocaleTimeString() - if (process.env.NODE_ENV === 'dev') { + if (process.env.EXTENSION_NODE_ENV === 'dev') { console.log(`[${time}]`, ...args) } _log.appendLine(`[${time}] ${args.join(' ')}`) diff --git a/src/runner/runner.ts b/src/runner/runner.ts index 0f6b694..dfdfd71 100644 --- a/src/runner/runner.ts +++ b/src/runner/runner.ts @@ -340,7 +340,7 @@ export class TestRunner extends vscode.Disposable { const testItems = request.include || this.tree.getFileTestItems(file) function enqueue(test: vscode.TestItem) { - log.verbose?.(`Enqueuing "${test.label}`) + log.verbose?.(`Enqueuing "${test.label}"`) run.enqueued(test) test.children.forEach(enqueue) } @@ -367,9 +367,11 @@ export class TestRunner extends vscode.Disposable { }) } - private markSuite(_testRun: vscode.TestRun, test: vscode.TestItem, result?: TaskResult) { - if (!result) + private markSuite(testRun: vscode.TestRun, test: vscode.TestItem, result?: TaskResult) { + if (!result) { + testRun.started(test) return + } if (result.state === 'fail') { // errors in a suite are stored only if it happens during discovery diff --git a/src/worker/coverage.ts b/src/worker/coverage.ts index 155a1ad..bd74220 100644 --- a/src/worker/coverage.ts +++ b/src/worker/coverage.ts @@ -39,17 +39,21 @@ export class VitestCoverage { }) } - private get config(): ResolvedCoverageOptions { + public get config(): ResolvedCoverageOptions { return { ...this._config, enabled: this.enabled, } } - private get enabled() { + public get enabled() { return this._enabled && !this.vitest.collecting } + public get resolved() { + return !!this._provider + } + public async enable() { const vitest = this.ctx this._enabled = true @@ -59,7 +63,7 @@ export class VitestCoverage { this._config.reportOnFailure = true this._config.reportsDirectory = join(tmpdir(), `vitest-coverage-${randomUUID()}`) - this.ctx.logger.log('Running coverage with configuration:', this._config) + this.ctx.logger.log('Running coverage with configuration:', this.config) if (!this._provider) { // @ts-expect-error private method diff --git a/src/worker/vitest.ts b/src/worker/vitest.ts index 6eaa03b..0e204e3 100644 --- a/src/worker/vitest.ts +++ b/src/worker/vitest.ts @@ -116,6 +116,26 @@ export class Vitest implements VitestMethods { return await this.ctx.globTestFiles(filters) } + private coverageProcessedFiles = new Set() + + private invalidateTree(mod: any, seen = new Set()) { + if (seen.has(mod)) { + return + } + if (this.coverageProcessedFiles.has(mod.file)) { + return + } + this.coverageProcessedFiles.add(mod.file) + seen.add(mod) + this.ctx.server.moduleGraph.invalidateModule(mod) + mod.clientImportedModules.forEach((mod: any) => { + this.invalidateTree(mod) + }) + mod.ssrImportedModules.forEach((mod: any) => { + this.invalidateTree(mod) + }) + } + private async runTestFiles(files: string[], testNamePattern?: string | undefined, runAllFiles = false) { await this.ctx.runningPromise this.watcher.markRerun(false) @@ -126,6 +146,18 @@ export class Vitest implements VitestMethods { if (this.debug) await this.globTestFiles(files) + if (this.coverage.resolved) { + files.forEach((file) => { + if (!this.coverageProcessedFiles.has(file)) { + const mod = this.ctx.server.moduleGraph.getModuleById(file) + if (mod) { + this.invalidateTree(mod) + } + this.coverageProcessedFiles.add(file) + } + }) + } + await this.rerunTests(files, runAllFiles) }