From fdb2e7982a73e78113db4355075d48ad80963cfc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ari=20Perkki=C3=B6?= Date: Mon, 3 Nov 2025 18:02:36 +0200 Subject: [PATCH] fix(typecheck): handle re-runs outside `tsc` (#8920) --- packages/vitest/src/node/pool.ts | 6 +++++- .../src/node/pools/workers/typecheckWorker.ts | 14 +++++++++++--- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/packages/vitest/src/node/pool.ts b/packages/vitest/src/node/pool.ts index 2c0fc1722..cf32212f6 100644 --- a/packages/vitest/src/node/pool.ts +++ b/packages/vitest/src/node/pool.ts @@ -222,7 +222,11 @@ export function createPool(ctx: Vitest): ProcessPool { runTests: (files, invalidates) => executeTests('run', files, invalidates), collectTests: (files, invalidates) => executeTests('collect', files, invalidates), async close() { - await Promise.all([pool.close(), browserPool?.close?.()]) + await Promise.all([ + pool.close(), + browserPool?.close?.(), + ...ctx.projects.map(project => project.typechecker?.stop()), + ]) }, } } diff --git a/packages/vitest/src/node/pools/workers/typecheckWorker.ts b/packages/vitest/src/node/pools/workers/typecheckWorker.ts index f71cd0ec1..2ab63f4fe 100644 --- a/packages/vitest/src/node/pools/workers/typecheckWorker.ts +++ b/packages/vitest/src/node/pools/workers/typecheckWorker.ts @@ -93,7 +93,6 @@ async function onMessage(message: WorkerRequest, project: TestProject): Promise< case 'stop': { await runPromise - await project.typechecker?.stop() return { type: 'stopped', __vitest_worker_response__ } } } @@ -221,8 +220,9 @@ function createRunner(vitest: Vitest) { const files = specs.map(spec => spec.filepath) const promise = createDefer() + // check that watcher actually triggered rerun - const _p = new Promise((resolve) => { + const triggered = await new Promise((resolve) => { const _i = setInterval(() => { if (!project.typechecker || rerunTriggered.has(project)) { resolve(true) @@ -234,15 +234,23 @@ function createRunner(vitest: Vitest) { clearInterval(_i) }, 500).unref() }) - const triggered = await _p + + // Re-run but wasn't triggered by tsc + if (promisesMap.has(project) && !triggered) { + return promisesMap.get(project) + } + if (project.typechecker && !triggered) { const testFiles = project.typechecker.getTestFiles() + for (const file of testFiles) { await vitest._testRun.enqueued(project, file) } + await vitest._testRun.collected(project, testFiles) await onParseEnd(project, project.typechecker.getResult()) } + promises.push(promise) promisesMap.set(project, promise) promises.push(startTypechecker(project, files)) -- 2.51.2