/** * Consistent logging utility for AI-EDA packages */ export type LogLevel = 'debug' | 'info' | 'warn' | 'error'; export interface LoggerOptions { level: LogLevel; prefix?: string; timestamps?: boolean; } const LOG_LEVELS: Record = { debug: 0, info: 1, warn: 2, error: 3, }; export class Logger { private level: LogLevel; private prefix: string; private timestamps: boolean; constructor(options: Partial = {}) { this.level = options.level ?? 'info'; this.prefix = options.prefix ?? ''; this.timestamps = options.timestamps ?? false; } private shouldLog(level: LogLevel): boolean { return LOG_LEVELS[level] >= LOG_LEVELS[this.level]; } private formatMessage(level: LogLevel, message: string): string { const parts: string[] = []; if (this.timestamps) { parts.push(`[${new Date().toISOString()}]`); } parts.push(`[${level.toUpperCase()}]`); if (this.prefix) { parts.push(`[${this.prefix}]`); } parts.push(message); return parts.join(' '); } debug(message: string, ...args: unknown[]): void { if (this.shouldLog('debug')) { console.error(this.formatMessage('debug', message), ...args); } } info(message: string, ...args: unknown[]): void { if (this.shouldLog('info')) { console.error(this.formatMessage('info', message), ...args); } } warn(message: string, ...args: unknown[]): void { if (this.shouldLog('warn')) { console.error(this.formatMessage('warn', message), ...args); } } error(message: string, ...args: unknown[]): void { if (this.shouldLog('error')) { console.error(this.formatMessage('error', message), ...args); } } setLevel(level: LogLevel): void { this.level = level; } child(prefix: string): Logger { return new Logger({ level: this.level, prefix: this.prefix ? `${this.prefix}:${prefix}` : prefix, timestamps: this.timestamps, }); } } // Default logger instance export const logger = new Logger({ prefix: 'ai-eda' }); // Create package-specific loggers export function createLogger(packageName: string): Logger { return logger.child(packageName); }