import { formatWithOptions } from 'node:util'; import { sep } from 'node:path'; function parseStack(stack, message) { const cwd = process.cwd() + sep; const lines = stack.split("\n").splice(message.split("\n").length).map((l) => l.trim().replace("file://", "").replace(cwd, "")); return lines; } function writeStream(data, stream) { const write = stream.__write || stream.write; return write.call(stream, data); } const bracket = (x) => x ? `[${x}]` : ""; class BasicReporter { formatStack(stack, message, opts) { const indent = " ".repeat((opts?.errorLevel || 0) + 1); return indent + parseStack(stack, message).join(` ${indent}`); } formatError(err, opts) { const message = err.message ?? formatWithOptions(opts, err); const stack = err.stack ? this.formatStack(err.stack, message, opts) : ""; const level = opts?.errorLevel || 0; const causedPrefix = level > 0 ? `${" ".repeat(level)}[cause]: ` : ""; const causedError = err.cause ? "\n\n" + this.formatError(err.cause, { ...opts, errorLevel: level + 1 }) : ""; return causedPrefix + message + "\n" + stack + causedError; } formatArgs(args, opts) { const _args = args.map((arg) => { if (arg && typeof arg.stack === "string") { return this.formatError(arg, opts); } return arg; }); return formatWithOptions(opts, ..._args); } formatDate(date, opts) { return opts.date ? date.toLocaleTimeString() : ""; } filterAndJoin(arr) { return arr.filter(Boolean).join(" "); } formatLogObj(logObj, opts) { const message = this.formatArgs(logObj.args, opts); if (logObj.type === "box") { return "\n" + [ bracket(logObj.tag), logObj.title && logObj.title, ...message.split("\n") ].filter(Boolean).map((l) => " > " + l).join("\n") + "\n"; } return this.filterAndJoin([ bracket(logObj.type), bracket(logObj.tag), message ]); } log(logObj, ctx) { const line = this.formatLogObj(logObj, { columns: ctx.options.stdout.columns || 0, ...ctx.options.formatOptions }); return writeStream( line + "\n", logObj.level < 2 ? ctx.options.stderr || process.stderr : ctx.options.stdout || process.stdout ); } } export { BasicReporter as B, parseStack as p };