rewritingOutput

tcmts.cli.main.rewritingOutput · #qt5yy4fc · term · runs on the server

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;
  }
}

used by