/** * Compact test reporter: silent on pass, prints failures + final summary. * Usage: --test-reporter=./scripts/test-reporter-compact.mjs */ import { Transform } from 'node:stream'; export default class CompactReporter extends Transform { #pass = 0; #fail = 0; #skip = 0; #failures = []; constructor() { super({ objectMode: true }); } _transform(event, _enc, cb) { switch (event.type) { case 'test:pass': if (!event.data.skip) this.#pass++; else this.#skip++; break; case 'test:fail': { this.#fail++; const { name, details } = event.data; const err = details?.error; const msg = err?.message ?? String(err ?? 'unknown'); const loc = err?.cause?.stack?.split('\n')[1]?.trim() ?? ''; this.#failures.push(` āœ– ${name}\n ${msg}${loc ? `\n ${loc}` : ''}`); break; } } cb(); } _flush(cb) { if (this.#failures.length) { this.push(`\nāœ– failing tests:\n${this.#failures.join('\n\n')}\n`); } const status = this.#fail === 0 ? 'āœ”' : 'āœ–'; this.push(`\n${status} ${this.#pass} passed, ${this.#fail} failed, ${this.#skip} skipped\n`); cb(); } }