From 3463f9bbd48bcf04a5c0b5794faa96983da8ce31 Mon Sep 17 00:00:00 2001 From: Vladimir Sheremet Date: Thu, 28 Mar 2024 16:06:01 +0100 Subject: [PATCH] fix(vitest): correctly send console events when state changes --- packages/vitest/src/runtime/console.ts | 16 ++++++++++------ packages/vitest/src/runtime/setup-node.ts | 8 ++++---- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/packages/vitest/src/runtime/console.ts b/packages/vitest/src/runtime/console.ts index 14ea15532325..349ec24ad5de 100644 --- a/packages/vitest/src/runtime/console.ts +++ b/packages/vitest/src/runtime/console.ts @@ -3,7 +3,7 @@ import { Console } from 'node:console' import { relative } from 'node:path' import { getColors, getSafeTimers } from '@vitest/utils' import { RealDate } from '../integrations/mock/date' -import type { WorkerGlobalState } from '../types' +import { getWorkerState } from '../utils' export const UNKNOWN_TEST_ID = '__vitest__unknown_test__' @@ -27,13 +27,15 @@ function getTaskIdByStack(root: string) { return UNKNOWN_TEST_ID } -export function createCustomConsole(state: WorkerGlobalState) { +export function createCustomConsole() { const stdoutBuffer = new Map() const stderrBuffer = new Map() const timers = new Map() const { setTimeout, clearTimeout } = getSafeTimers() + const state = () => getWorkerState() + // group sync console.log calls with macro task function schedule(taskId: string) { const timer = timers.get(taskId)! @@ -56,7 +58,7 @@ export function createCustomConsole(state: WorkerGlobalState) { return const content = buffer.map(i => String(i)).join('') const timer = timers.get(taskId)! - state.rpc.onUserConsoleLog({ + state().rpc.onUserConsoleLog({ type: 'stdout', content: content || '', taskId, @@ -72,7 +74,7 @@ export function createCustomConsole(state: WorkerGlobalState) { return const content = buffer.map(i => String(i)).join('') const timer = timers.get(taskId)! - state.rpc.onUserConsoleLog({ + state().rpc.onUserConsoleLog({ type: 'stderr', content: content || '', taskId, @@ -85,7 +87,8 @@ export function createCustomConsole(state: WorkerGlobalState) { const stdout = new Writable({ write(data, encoding, callback) { - const id = state?.current?.id || state?.current?.file?.id || getTaskIdByStack(state.ctx.config.root) + const s = state() + const id = s?.current?.id || s?.current?.file?.id || getTaskIdByStack(s.config.root) let timer = timers.get(id) if (timer) { timer.stdoutTime = timer.stdoutTime || RealDate.now() @@ -106,7 +109,8 @@ export function createCustomConsole(state: WorkerGlobalState) { }) const stderr = new Writable({ write(data, encoding, callback) { - const id = state?.current?.id || state?.current?.file?.id || getTaskIdByStack(state.ctx.config.root) + const s = state() + const id = s?.current?.id || s?.current?.file?.id || getTaskIdByStack(s.config.root) let timer = timers.get(id) if (timer) { timer.stderrTime = timer.stderrTime || RealDate.now() diff --git a/packages/vitest/src/runtime/setup-node.ts b/packages/vitest/src/runtime/setup-node.ts index 1c13e0704578..809eaccfe70a 100644 --- a/packages/vitest/src/runtime/setup-node.ts +++ b/packages/vitest/src/runtime/setup-node.ts @@ -4,7 +4,7 @@ import timers from 'node:timers' import { isatty } from 'node:tty' import { installSourcemapsSupport } from 'vite-node/source-map' import { createColors, setupColors } from '@vitest/utils' -import type { EnvironmentOptions, ResolvedConfig, ResolvedTestEnvironment, WorkerGlobalState } from '../types' +import type { EnvironmentOptions, ResolvedConfig, ResolvedTestEnvironment } from '../types' import { VitestSnapshotEnvironment } from '../integrations/snapshot/environments/node' import { getSafeTimers, getWorkerState } from '../utils' import * as VitestIndex from '../index' @@ -56,13 +56,13 @@ export async function setupGlobalEnv(config: ResolvedConfig, { environment }: Re }) if (!config.disableConsoleIntercept) - await setupConsoleLogSpy(state) + await setupConsoleLogSpy() } -export async function setupConsoleLogSpy(state: WorkerGlobalState) { +export async function setupConsoleLogSpy() { const { createCustomConsole } = await import('./console') - globalThis.console = createCustomConsole(state) + globalThis.console = createCustomConsole() } export async function withEnv(