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