enum Color { Reset = "\x1b[0m", Gray = "\x1b[90m", Blue = "\x1b[34m", Yellow = "\x1b[33m", Red = "\x1b[31m", } export class Logger { private timers = new Map(); constructor(private readonly context?: string) {} debug(message: string, ...meta: unknown[]): void { this.log("DEBUG", Color.Gray, message, meta); } info(message: string, ...meta: unknown[]): void { this.log("INFO ", Color.Blue, message, meta); } warn(message: string, ...meta: unknown[]): void { this.log("WARN ", Color.Yellow, message, meta); } error(message: string, ...meta: unknown[]): void { this.log("ERROR", Color.Red, message, meta); } time(label: string = "default"): void { this.timers.set(label, performance.now()); } timeEnd(label: string = "default"): void { const start = this.timers.get(label); if (start === undefined) { this.warn(`Timer '${label}' does not exist`); return; } const duration = performance.now() - start; this.timers.delete(label); this.info(`${label}: ${duration.toFixed(3)}ms`); } private log( level: string, color: Color, message: string, meta: unknown[] ): void { const timestamp = new Date().toISOString(); const context = this.context ? ` [${this.context}]` : ""; console.log( `${color}[${timestamp}] ${level}${context}: ${message}${Color.Reset}`, ...meta ); } }