import { cyan, green, red, yellow, bold, dim, gray } from "@std/fmt/colors"; export enum LogLevel { DEBUG = 0, INFO = 1, WARN = 2, ERROR = 3, } class Logger { private level: LogLevel = LogLevel.INFO; private verbose = false; setVerbose(verbose: boolean) { this.verbose = verbose; if (verbose) { this.level = LogLevel.DEBUG; } } debug(message: string, ...args: unknown[]) { if (this.level <= LogLevel.DEBUG) { console.log(dim(" debug"), message, ...args); } } info(message: string, ...args: unknown[]) { if (this.level <= LogLevel.INFO) { console.log("• ", message, ...args); } } warn(message: string, ...args: unknown[]) { if (this.level <= LogLevel.WARN) { console.warn(yellow("!"), message, ...args); } } error(message: string, ...args: unknown[]) { if (this.level <= LogLevel.ERROR) { console.error(red("✗"), message, ...args); } } success(message: string, ...args: unknown[]) { console.log(green("✓"), message, ...args); } step(message: string, ...args: unknown[]) { console.log(cyan("→"), message, ...args); } progress(message: string, current: number, total: number) { const percentage = Math.round((current / total) * 100); const filled = Math.floor(percentage / 4); const bar = "█".repeat(filled) + gray("░".repeat(25 - filled)); Deno.stdout.writeSync(new TextEncoder().encode(`\r ${cyan("→")} ${message} ${bar} ${current}/${total}`)); if (current === total) { console.log(); } } section(title: string) { console.log(); console.log(bold(title)); } result(message: string, value?: string) { if (value) { console.log(` ${message} ${dim(value)}`); } else { console.log(` ${message}`); } } list(items: string[]) { items.forEach(item => { console.log(`• ${item}`); }); } table(headers: string[], rows: string[][]) { console.log(` ${headers.join(" ")}`); console.log(` ${headers.map(h => "─".repeat(h.length)).join(" ")}`); rows.forEach(row => { console.log(` ${row.join(" ")}`); }); } } export const logger = new Logger();