| 'use strict'; |
| const { relative } = require('node:path'); |
| const { inspect } = require('node:util'); |
| const cwd = process.cwd(); |
| |
| module.exports = async function* errorReporter(source) { |
| for await (const event of source) { |
| if (event.type === 'test:fail') { |
| const { name, details, line, column, file } = event.data; |
| let { error } = details; |
| |
| if (error?.failureType === 'subtestsFailed') { |
| // In the interest of keeping things concise, skip failures that are |
| // only due to nested failures. |
| continue; |
| } |
| |
| if (error?.code === 'ERR_TEST_FAILURE') { |
| error = error.cause; |
| } |
| |
| const output = [ |
| `Test failure: '${name}'`, |
| ]; |
| |
| if (file) { |
| output.push(`Location: ${relative(cwd, file)}:${line}:${column}`); |
| } |
| |
| output.push(inspect(error)); |
| output.push('\n'); |
| yield output.join('\n'); |
| |
| if (process.env.FAIL_FAST) { |
| yield `\nBailing on failed test: ${event.data.name}\n`; |
| process.exitCode = 1; |
| process.emit('SIGINT'); |
| } |
| } |
| } |
| }; |