import { blue, datetime, red, reset, yellow } from "./deps.ts";
const LOG_LEVELS = { debug: { color: reset, symbol: "✔", }, info: { color: blue, symbol: "ℹ", }, warn: { color: yellow, symbol: "⚠", }, error: { color: red, symbol: "✖", },};
export type LogLevel = "debug" | "info" | "warn" | "error";
export class Log { private datetimeFormat: string; private levelSign: (logLevel: LogLevel) => string; private suffix: string[];
constructor({ minLogLevel = "debug", levelIndicator = "symbol", datetimeFormat = "YYYY-MM-ddTHH:mm:ssZ", addNewLine = false, }: { minLogLevel?: LogLevel; levelIndicator?: "none" | "full" | "initial" | "symbol"; datetimeFormat?: string; addNewLine?: boolean; } = {}) { for (const level of Object.keys(LOG_LEVELS) as LogLevel[]) { if (minLogLevel === level) break; this[level] = () => ({}); }
this.datetimeFormat = datetimeFormat; this.suffix = addNewLine ? ["\n"] : [];
this.levelSign = { none: () => "", full: (logLevel: LogLevel) => " " + logLevel.toUpperCase().padEnd(5), initial: (logLevel: LogLevel) => " " + logLevel[0].toUpperCase(), symbol: (logLevel: LogLevel) => " " + LOG_LEVELS[logLevel].symbol, }[levelIndicator]; }
private prefix(date: Date, logLevel: LogLevel) { const timestamp = datetime(date).format(this.datetimeFormat); const prefix = `${timestamp}${this.levelSign(logLevel)}`.trimStart(); return prefix ? [LOG_LEVELS[logLevel].color(prefix)] : []; }
private output(date: Date, logLevel: LogLevel, args: unknown[]) { const prefix = this.prefix(date, logLevel); console[logLevel](...prefix, ...args, ...this.suffix); }
debug(...args: unknown[]) { this.output(new Date(), "debug", args); }
info(...args: unknown[]) { this.output(new Date(), "info", args); }
warn(...args: unknown[]) { this.output(new Date(), "warn", args); }
error(...args: unknown[]) { this.output(new Date(), "error", args); }}