73 lines
2.3 KiB
JavaScript
73 lines
2.3 KiB
JavaScript
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 };
|