From fbaa546c649bb34a0c4b1dde17bd91ce9ba8d32d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BF=A0=20/=20green?= Date: Sun, 22 May 2022 03:11:23 +0900 Subject: [PATCH] fix: handle error from pool.run (#1348) --- packages/vitest/src/node/pool.ts | 28 ++++++++++++++++++++-------- packages/vitest/src/utils/index.ts | 10 ++++++++++ 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/packages/vitest/src/node/pool.ts b/packages/vitest/src/node/pool.ts index 19b3b37a907e..a542178e27e1 100644 --- a/packages/vitest/src/node/pool.ts +++ b/packages/vitest/src/node/pool.ts @@ -8,6 +8,7 @@ import { createBirpc } from 'birpc' import type { RawSourceMap } from 'vite-node' import type { WorkerContext, WorkerRPC } from '../types' import { distDir } from '../constants' +import { AggregateError } from '../utils' import type { Vitest } from './core' export type RunWithFiles = (files: string[], invalidates?: string[]) => Promise @@ -41,10 +42,13 @@ export function createFakePool(ctx: Vitest): WorkerPool { id: 1, } - await worker[name](data, { transferList: [workerPort] }) - - port.close() - workerPort.close() + try { + await worker[name](data, { transferList: [workerPort] }) + } + finally { + port.close() + workerPort.close() + } } } @@ -80,7 +84,7 @@ export function createWorkerPool(ctx: Vitest): WorkerPool { return async (files, invalidates) => { let id = 0 const config = ctx.getSerializableConfig() - await Promise.all(files.map(async (file) => { + const results = await Promise.allSettled(files.map(async (file) => { const { workerPort, port } = createChannel(ctx) const data: WorkerContext = { @@ -91,10 +95,18 @@ export function createWorkerPool(ctx: Vitest): WorkerPool { id: ++id, } - await pool.run(data, { transferList: [workerPort], name }) - port.close() - workerPort.close() + try { + await pool.run(data, { transferList: [workerPort], name }) + } + finally { + port.close() + workerPort.close() + } })) + + const errors = results.filter((r): r is PromiseRejectedResult => r.status === 'rejected').map(r => r.reason) + if (errors.length > 0) + throw new AggregateError(errors, 'Errors occurred while running tests. For more information, see serialized error.') } } diff --git a/packages/vitest/src/utils/index.ts b/packages/vitest/src/utils/index.ts index 1765ccdf7f64..799340c7e329 100644 --- a/packages/vitest/src/utils/index.ts +++ b/packages/vitest/src/utils/index.ts @@ -129,3 +129,13 @@ export function getCallLastIndex(code: string) { } export { resolve as resolvePath } + +// AggregateError is supported in Node.js 15.0.0+ +class AggregateErrorPonyfill extends Error { + errors: unknown[] + constructor(errors: Iterable, message = '') { + super(message) + this.errors = [...errors] + } +} +export { AggregateErrorPonyfill as AggregateError }