import type { Envelope } from "@/interfaces"; let jsonMode = false; export const setJsonMode = (on: boolean): void => { jsonMode = on; }; export const isJsonMode = (): boolean => jsonMode; export const printJson = (env: Envelope): void => { process.stdout.write(`${JSON.stringify(env)}\n`); }; export const printHuman = (text: string): void => { process.stdout.write(`${text}\n`); }; const toStderr = (line: string): void => { process.stderr.write(`${line}\n`); }; export const logInfo = (line: string): void => { if (jsonMode) toStderr(line); else process.stderr.write(`${line}\n`); }; export const logWarn = (line: string): void => { toStderr(line); }; export const enterJsonMode = (on: boolean): void => { setJsonMode(on); if (on) installJsonLogRedirect(); }; export const installJsonLogRedirect = (): void => { // In JSON mode, stdout must stay machine-parseable, so we redirect every // console stream (including the ones chalk/crawler utilities use) to stderr. const writeErr = (args: unknown[]): void => { const text = args.map((a) => (typeof a === "string" ? a : JSON.stringify(a))).join(" "); process.stderr.write(`${text}\n`); }; console.info = (...args: unknown[]) => writeErr(args); console.warn = (...args: unknown[]) => writeErr(args); console.error = (...args: unknown[]) => writeErr(args); // eslint-disable-next-line no-console console.log = (...args: unknown[]) => writeErr(args); };