From d28cbf09780c6643e1c94f959907dfddb0a3beeb Mon Sep 17 00:00:00 2001 From: sapphi-red Date: Sat, 21 May 2022 21:21:23 +0900 Subject: [PATCH] fix: handle error from pool.run --- packages/vitest/src/node/pool.ts | 27 +++++++++++++++++++-------- packages/vitest/src/utils/index.ts | 11 +++++++++++ 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..cdfc72bd89f6 100644 --- a/packages/vitest/src/node/pool.ts +++ b/packages/vitest/src/node/pool.ts @@ -9,6 +9,7 @@ import type { RawSourceMap } from 'vite-node' import type { WorkerContext, WorkerRPC } from '../types' import { distDir } from '../constants' import type { Vitest } from './core' +import { AggregateError } from '../utils' export type RunWithFiles = (files: string[], invalidates?: string[]) => Promise @@ -41,10 +42,12 @@ 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 +83,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 +94,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) + } } } diff --git a/packages/vitest/src/utils/index.ts b/packages/vitest/src/utils/index.ts index 1765ccdf7f64..1fc7e5d65022 100644 --- a/packages/vitest/src/utils/index.ts +++ b/packages/vitest/src/utils/index.ts @@ -129,3 +129,14 @@ export function getCallLastIndex(code: string) { } export { resolve as resolvePath } + +class AggregateErrorPonyfill extends Error { + errors: unknown[] + constructor(errors: Iterable, message = '') { + super(message) + this.errors = [...errors] + } +} + +// AggregateError is supported in Node.js 15.0.0+ +export const AggregateError = global.AggregateError || AggregateErrorPonyfill