rewritingOutput
uses process
Run fn with what it prints rewritten by rewrite: through console, and written to stdout and stderr (as the
checker's diagnostics are).
export function rewritingOutput<T>(rewrite: (s: string) => string, fn: () => T): T { const log = console.log; const error = console.error; const out = process.stdout.write; const err = process.stderr.write; const map = (args: unknown[]) => args.map((a) => (typeof a === "string" ? rewrite(a) : a)); console.log = (...args: unknown[]) => log(...map(args)); console.error = (...args: unknown[]) => error(...map(args)); const wrap = (write: typeof process.stdout.write, stream: NodeJS.WriteStream) => (chunk: unknown, ...rest: unknown[]) => (write as (...a: unknown[]) => boolean).call( stream, typeof chunk === "string" ? rewrite(chunk) : chunk, ...rest, ); process.stdout.write = wrap(out, process.stdout) as typeof process.stdout.write; process.stderr.write = wrap(err, process.stderr) as typeof process.stderr.write; try { return fn(); } finally { console.log = log; console.error = error; process.stdout.write = out; process.stderr.write = err; } }