{"version":3,"file":"index.cjs","sources":["../src/styling/StyleCache.ts","../src/index.ts","../src/handlers/AnalyticsLogHandler.ts","../src/writers/BufferWriter.ts","../src/transports/ConsoleTransport.ts","../src/handlers/FileLogHandler.ts","../src/transports/FileTransport.ts","../src/transports/HttpTransport.ts"],"sourcesContent":["import type { LogLevel, DevToolsTheme } from '../types/core.js';\n\ninterface CacheKey {\n    level: LogLevel | 'success';\n    theme: DevToolsTheme;\n    presetName?: string;\n    hasPrefix: boolean;\n    hasLocation: boolean;\n}\n\ninterface CacheEntry {\n    styles: string[];\n    format: string;\n    createdAt: number;\n    hits: number;\n}\n\nexport interface StyleCacheConfig {\n    maxEntries?: number;\n    ttl?: number;\n    enabled?: boolean;\n}\n\nconst DEFAULT_CONFIG: Required<StyleCacheConfig> = {\n    maxEntries: 100,\n    ttl: 5 * 60 * 1000,\n    enabled: true\n};\n\nexport class StyleCache {\n    private cache: Map<string, CacheEntry> = new Map();\n    private config: Required<StyleCacheConfig>;\n    private hitCount = 0;\n    private missCount = 0;\n\n    constructor(config: StyleCacheConfig = {}) {\n        this.config = { ...DEFAULT_CONFIG, ...config };\n    }\n\n    private generateKey(key: CacheKey): string {\n        return `${key.level}:${key.theme}:${key.presetName || 'default'}:${key.hasPrefix}:${key.hasLocation}`;\n    }\n\n    get(key: CacheKey): CacheEntry | null {\n        if (!this.config.enabled) return null;\n\n        const cacheKey = this.generateKey(key);\n        const entry = this.cache.get(cacheKey);\n\n        if (!entry) {\n            this.missCount++;\n            return null;\n        }\n\n        if (Date.now() - entry.createdAt > this.config.ttl) {\n            this.cache.delete(cacheKey);\n            this.missCount++;\n            return null;\n        }\n\n        entry.hits++;\n        this.cache.delete(cacheKey);\n        this.cache.set(cacheKey, entry);\n        this.hitCount++;\n\n        return entry;\n    }\n\n    set(key: CacheKey, format: string, styles: string[]): void {\n        if (!this.config.enabled) return;\n\n        const cacheKey = this.generateKey(key);\n\n        if (this.cache.size >= this.config.maxEntries) {\n            const firstKey = this.cache.keys().next().value;\n            if (firstKey) {\n                this.cache.delete(firstKey);\n            }\n        }\n\n        this.cache.set(cacheKey, {\n            format,\n            styles: [...styles],\n            createdAt: Date.now(),\n            hits: 0\n        });\n    }\n\n    clear(): void {\n        this.cache.clear();\n        this.hitCount = 0;\n        this.missCount = 0;\n    }\n\n    getStats(): {\n        size: number;\n        maxSize: number;\n        hitRate: number;\n        hits: number;\n        misses: number;\n    } {\n        const total = this.hitCount + this.missCount;\n        return {\n            size: this.cache.size,\n            maxSize: this.config.maxEntries,\n            hitRate: total > 0 ? this.hitCount / total : 0,\n            hits: this.hitCount,\n            misses: this.missCount\n        };\n    }\n\n    setEnabled(enabled: boolean): void {\n        this.config.enabled = enabled;\n        if (!enabled) {\n            this.clear();\n        }\n    }\n\n    isEnabled(): boolean {\n        return this.config.enabled;\n    }\n}\n\nlet _styleCache: StyleCache | null = null;\n\nexport function getStyleCache(): StyleCache {\n    if (!_styleCache) {\n        _styleCache = new StyleCache();\n    }\n    return _styleCache;\n}\n","/**\n * @fileoverview Better Logger - Librería completa con todas las características\n * @version 0.3.0\n * @since 2024\n * \n * Punto de entrada principal que proporciona la experiencia completa de Better Logger\n * con características avanzadas incluyendo estilos CSS, soporte SVG, animaciones,\n * capacidades de exportación y logging remoto.\n * \n * @module @mks2508/better-logger\n */\n\n// Main Logger class with all features\nimport { Logger } from './Logger.js';\nimport type {\n    LogLevel,\n    Verbosity,\n    ThemeVariant,\n    BannerType,\n    StyleOptions,\n    ILogHandler,\n    CLILogLevel,\n    IBoxOptions,\n    ITableOptions,\n} from './types/index.js';\n\n// Lazy singleton - se inicializa solo cuando se necesita\nlet _logger: Logger | null = null;\n\nfunction getLogger(): Logger {\n    if (!_logger) {\n        _logger = new Logger();\n    }\n    return _logger;\n}\n\n/**\n * Clase principal Logger con conjunto completo de características\n * \n * @example\n * // Importación y uso básico\n * import { Logger } from '@mks2508/better-logger';\n * \n * const logger = new Logger();\n * logger.preset('cyberpunk');  // Aplicar preset completo\n * logger.info('¡Hola mundo!');\n * \n * @example\n * // Logger con scope para componentes\n * const auth = logger.component('Auth');\n * auth.info('Usuario autenticando...');\n * auth.success('Login exitoso');\n * \n * @example\n * // Logger para APIs con badges\n * const api = logger.api('GraphQL');\n * api.badges(['v2', 'cached']).info('Query ejecutada');\n * \n * @since 0.3.0\n */\nexport { Logger };\n\n/**\n * Instancia singleton del logger lista para usar\n * @default\n * \n * @example\n * // Uso directo sin crear instancia\n * import logger from '@mks2508/better-logger';\n * \n * logger.info('Aplicación iniciada');\n * logger.success('Conexión establecida');\n * logger.warn('Memoria al 80%');\n * logger.error('Fallo en conexión');\n */\nexport default getLogger();\n\n/**\n * Métodos de logging individuales (enlazados al singleton)\n * \n * @example\n * // Importar solo los métodos necesarios\n * import { info, error, success } from '@mks2508/better-logger';\n * \n * info('Proceso iniciado');\n * success('✓ Completado exitosamente');\n * error('Error:', errorDetails);\n * \n * @since 0.3.0\n */\nexport const debug = (...args: any[]) => getLogger().debug(...args);\nexport const info = (...args: any[]) => getLogger().info(...args);\nexport const warn = (...args: any[]) => getLogger().warn(...args);\nexport const error = (...args: any[]) => getLogger().error(...args);\nexport const success = (...args: any[]) => getLogger().success(...args);\nexport const critical = (...args: any[]) => getLogger().critical(...args);\nexport const trace = (...args: any[]) => getLogger().trace(...args);\nexport const table = (data: any, columns?: string[]) => getLogger().table(data, columns);\nexport const group = (label: string, collapsed?: boolean) => getLogger().group(label, collapsed);\nexport const groupEnd = () => getLogger().groupEnd();\nexport const time = (label: string) => getLogger().time(label);\nexport const timeEnd = (label: string) => getLogger().timeEnd(label);\nexport const setGlobalPrefix = (prefix: string) => getLogger().setGlobalPrefix(prefix);\nexport const scope = (name: string) => getLogger().scope(name);\nexport const component = (name: string) => getLogger().component(name);\nexport const api = (name: string) => getLogger().api(name);\nexport const badges = (badgeList: string[]) => getLogger().badges(badgeList);\nexport const badge = (badgeName: string) => getLogger().badge(badgeName);\nexport const clearBadges = () => getLogger().clearBadges();\nexport const setVerbosity = (level: Verbosity) => getLogger().setVerbosity(level);\nexport const addHandler = (handler: ILogHandler) => getLogger().addHandler(handler);\nexport const setTheme = (theme: ThemeVariant) => getLogger().setTheme(theme);\nexport const setBannerType = (bannerType: BannerType) => getLogger().setBannerType(bannerType);\nexport const showBanner = (bannerType?: BannerType) => getLogger().showBanner(bannerType);\nexport const logWithSVG = (message: string, svgContent?: string, options?: StyleOptions) => \n    getLogger().logWithSVG(message, svgContent, options);\nexport const logAnimated = (message: string, duration?: number) => \n    getLogger().logAnimated(message, duration);\nexport const cli = (command: string) => getLogger().cli(command);\n\n// CLI Primitives (v5.0)\nexport const step = (current: number, total: number, message: string) => getLogger().step(current, total, message);\nexport const spinner = (message: string) => getLogger().spinner(message);\nexport const box = (content: string, options?: IBoxOptions) => getLogger().box(content, options);\nexport const cliTable = (rows: Record<string, unknown>[], options?: ITableOptions) => getLogger().cliTable(rows, options);\nexport const header = (title: string, subtitle?: string) => getLogger().header(title, subtitle);\nexport const divider = () => getLogger().divider();\nexport const blank = () => getLogger().blank();\nexport const setCLILevel = (level: CLILogLevel) => getLogger().setCLILevel(level);\n\n// Type exports\nexport type {\n    LogLevel,\n    Verbosity,\n    ThemeVariant,\n    BannerType,\n    StyleOptions,\n    ILogHandler,\n    LoggerConfig,\n    LogMetadata,\n    StackInfo,\n    TimerEntry,\n    TimerResult,\n    OutputFormat,\n    IScopedLogger,\n    IAPILogger,\n    IComponentLogger,\n    Bindings,\n    SerializerFn,\n    SerializerContext,\n    SerializerConfig,\n    ISerializerRegistry,\n    HookLogEntry,\n    HookEvent,\n    HookCallback,\n    MiddlewareFn,\n    IHookManager,\n    TransportRecord,\n    TransportOptions,\n    TransportTarget,\n    ITransport,\n    StyleCacheConfig,\n    BadgeStyle,\n    TimestampFormat,\n    ColumnAlign,\n    ColumnConfig,\n    LogOptions,\n    CLILogLevel,\n    ISpinnerHandle,\n    IBoxOptions,\n    ITableOptions,\n} from './types/index.js';\n\n// Styling utilities\nexport { \n    StyleBuilder,\n    StylePresets,\n    THEME_PRESETS,\n    THEME_BANNERS,\n    BANNER_VARIANTS\n} from './styling/index.js';\n\n// Handler exports\nexport {\n    FileLogHandler,\n    RemoteLogHandler,\n    AnalyticsLogHandler\n} from './handlers/index.js';\n\n// Serializers\nexport { SerializerRegistry } from './serializers/index.js';\n\n// Hooks & Middleware\nexport { HookManager } from './hooks/index.js';\n\n// Transports\nexport {\n    TransportManager,\n    ConsoleTransport,\n    FileTransport,\n    HttpTransport\n} from './transports/index.js';\n\n// Style Cache\nexport { StyleCache, getStyleCache } from './styling/StyleCache.js';\n\n// Enterprise feature function exports\nimport type { SerializerFn, HookEvent, HookCallback, MiddlewareFn, TransportTarget } from './types/index.js';\nexport const addSerializer = <T>(\n    type: new (...args: any[]) => T,\n    serializer: SerializerFn<T>,\n    priority?: number\n) => getLogger().addSerializer(type, serializer, priority);\nexport const removeSerializer = <T>(type: new (...args: any[]) => T) =>\n    getLogger().removeSerializer(type);\nexport const on = (event: HookEvent, callback: HookCallback, priority?: number) =>\n    getLogger().on(event, callback, priority);\nexport const once = (event: HookEvent, callback: HookCallback, priority?: number) =>\n    getLogger().once(event, callback, priority);\nexport const off = (event: HookEvent, callback: HookCallback) =>\n    getLogger().off(event, callback);\nexport const use = (middleware: MiddlewareFn, priority?: number) =>\n    getLogger().use(middleware, priority);\nexport const addTransport = (target: TransportTarget) =>\n    getLogger().addTransport(target);\nexport const removeTransport = (id: string) =>\n    getLogger().removeTransport(id);\nexport const flushTransports = () =>\n    getLogger().flushTransports();\nexport const closeTransports = () =>\n    getLogger().closeTransports();\n\n// Scoped loggers\nexport {\n    ScopedLogger,\n    APILogger,\n    ComponentLogger,\n    ContextLogger\n} from './ScopedLogger.js';\n\n// Constants\nexport { DEFAULT_CONFIG } from './constants.js';\n\n// Utility exports\nexport {\n    parseStackTrace,\n    formatTimestamp,\n    detectOptimalFormat,\n    createOutput,\n    createANSIOutput,\n    createBuildOutput,\n    createCIOutput\n} from './utils/index.js';\n\n// ANSI color utilities\nexport {\n    ansiStyle,\n    ansiColor,\n    ansiBackground,\n    ansiBold,\n    ansiDim,\n    ansiUnderline,\n    formatLogLevelANSI,\n    formatSuccessANSI,\n    BUILD_FORMATTERS,\n    sanitizeEmojis\n} from './utils/ansi-colors.js';\n\n// Environment detection and presets\nexport {\n    BUILD_PRESETS,\n    ENVIRONMENT_DETECTION,\n    detectEnvironmentPreset,\n    getOptimalConfig\n} from './constants.js';\n\n/**\n * Utilidades de estilo para crear estilos personalizados de consola\n * \n * @example\n * // Crear estilo personalizado\n * import { createStyle, stylePresets } from '@mks2508/better-logger';\n * \n * const miEstilo = createStyle()\n *   .bg('linear-gradient(45deg, #ff6b6b, #feca57)')\n *   .color('white')\n *   .padding('10px')\n *   .rounded('8px')\n *   .bold()\n *   .build();\n * \n * console.log('%cMensaje estilizado', miEstilo);\n * \n * @example\n * // Usar presets predefinidos\n * console.log('%cÉxito!', stylePresets.success);\n * console.log('%cError!', stylePresets.error);\n * \n * @since 0.3.0\n */\nimport { StyleBuilder, StylePresets } from './styling/index.js';\n\n/**\n * Crea una nueva instancia de StyleBuilder para estilos personalizados de consola\n * \n * @returns {StyleBuilder} Constructor de estilos encadenable\n * \n * @example\n * const estilo = createStyle()\n *   .gradient('#667eea', '#764ba2')\n *   .color('white')\n *   .padding('8px 16px')\n *   .rounded('4px')\n *   .shadow('0 2px 4px rgba(0,0,0,0.2)')\n *   .build();\n * \n * @since 0.3.0\n */\nexport const createStyle = () => new StyleBuilder();\n\n/**\n * Presets de estilo predefinidos para casos de uso comunes\n * \n * @constant {Object} stylePresets\n * \n * @example\n * console.log('%cOperación exitosa', stylePresets.success);\n * console.log('%cAdvertencia', stylePresets.warning);\n * console.log('%cError crítico', stylePresets.error);\n * console.log('%cInformación', stylePresets.info);\n * console.log('%cDestacado', stylePresets.accent);\n * \n * @since 0.3.0\n */\nexport const stylePresets = {\n    success: StylePresets.success().build(),\n    error: StylePresets.error().build(),\n    warning: StylePresets.warning().build(),\n    info: StylePresets.info().build(),\n    accent: StylePresets.accent().build(),\n};\n\n// Terminal formatting utilities\nexport {\n    formatWithRightAlign,\n    formatColumns,\n    formatKeyValue,\n    formatBadge,\n    formatTimestamp as formatTimestampExt,\n    formatRelativeTime,\n    formatElapsedTime,\n    resetStartTime,\n    isKeyValueObject,\n    stripAnsi,\n    getVisibleLength,\n    padToWidth,\n    applyLogOptions,\n} from './terminal/formatter.js';\n\n// Color converter utilities\nexport {\n    hexToRgb,\n    rgbToHex,\n    hexTo256,\n    colorToHex,\n    getANSIForeground,\n    getANSIBackground,\n    getANSI256Foreground,\n    getANSI256Background,\n    cssColorToANSI,\n    ANSI,\n} from './terminal/color-converter.js';\n\nexport type { RGB, ColorCapability } from './terminal/color-converter.js';\n\n// Terminal renderer\nexport { TerminalRenderer } from './terminal/terminal-renderer.js';\nexport type { ANSIStyle, ChalkLikeInterface } from './terminal/terminal-renderer.js';\n\n// Environment detection\nexport {\n    getEnvironment,\n    isRunningInTerminal,\n    supportsANSI,\n    getColorCapability,\n    getTerminalWidth,\n    getTerminalHeight,\n    getEnvironmentInfo,\n} from './utils/environment-detector.js';\n\nexport type { Environment } from './utils/environment-detector.js';\n\n// Output writers for custom log destinations\nexport { BufferWriter, type BufferEntry } from './writers/index.js';\nexport type { OutputWriter, OutputMode } from './types/core.js';","/**\n * @fileoverview Analytics log handler for Advanced Logger\n */\n\nimport type { ILogHandler, LogLevel, LogMetadata } from '../types/index.js';\n\n/**\n * Example custom handler for analytics demonstration\n */\nexport class AnalyticsLogHandler implements ILogHandler {\n    handle(level: LogLevel, message: string, _args: any[], metadata: LogMetadata): void {\n        // In a real implementation, this could send analytics data\n        if (level === 'error' || level === 'critical') {\n            // Track errors for analytics\n            console.debug('Analytics: Error tracked', { \n                level, \n                message, \n                timestamp: metadata.timestamp \n            });\n        }\n    }\n}","/**\n * @fileoverview BufferWriter - Collects log output in memory for later use\n * @version 4.0.0\n */\n\nimport type { LogLevel, OutputWriter } from '../types/core.js';\n\n/**\n * Entry in the log buffer\n */\nexport interface BufferEntry {\n    message: string;\n    level: LogLevel;\n    styles: string[];\n    timestamp: number;\n}\n\n/**\n * BufferWriter collects log messages in memory instead of outputting to console.\n * Useful for:\n * - CLI operations with spinners (buffer logs during spinner, show after)\n * - Testing (capture logs for assertions)\n * - Batch processing (collect logs, process together)\n *\n * @implements {OutputWriter}\n * @since 4.0.0\n *\n * @example\n * import logger, { BufferWriter } from '@mks2508/better-logger';\n *\n * const buffer = new BufferWriter();\n * logger.updateConfig({\n *   outputMode: 'custom',\n *   outputWriter: buffer\n * });\n *\n * // Logs go to buffer, not console\n * spinner.start('Loading...');\n * logger.info('Connecting...');\n * logger.info('Processing...');\n * spinner.stop();\n *\n * // Show buffered logs\n * logger.updateConfig({ outputMode: 'console' });\n * buffer.flush(); // Outputs all buffered logs to console\n */\nexport class BufferWriter implements OutputWriter {\n    private buffer: BufferEntry[] = [];\n    private maxSize: number;\n\n    /**\n     * Creates a new BufferWriter\n     * @param maxSize - Maximum number of entries to buffer (default: 1000)\n     */\n    constructor(maxSize: number = 1000) {\n        this.maxSize = maxSize;\n    }\n\n    /**\n     * Writes a log entry to the buffer\n     * @param message - Formatted log message\n     * @param level - Log level\n     * @param styles - CSS styles (for browser console)\n     */\n    write(message: string, level: LogLevel, styles: string[]): void {\n        if (this.buffer.length >= this.maxSize) {\n            this.buffer.shift(); // Remove oldest entry\n        }\n\n        this.buffer.push({\n            message,\n            level,\n            styles,\n            timestamp: Date.now()\n        });\n    }\n\n    /**\n     * Returns all buffered entries\n     * @returns Copy of the buffer array\n     */\n    getBuffer(): BufferEntry[] {\n        return [...this.buffer];\n    }\n\n    /**\n     * Returns buffered entries filtered by log level\n     * @param levels - Log levels to include\n     * @returns Filtered buffer entries\n     */\n    getByLevel(...levels: LogLevel[]): BufferEntry[] {\n        return this.buffer.filter(entry => levels.includes(entry.level));\n    }\n\n    /**\n     * Returns the number of buffered entries\n     */\n    get size(): number {\n        return this.buffer.length;\n    }\n\n    /**\n     * Checks if buffer is empty\n     */\n    get isEmpty(): boolean {\n        return this.buffer.length === 0;\n    }\n\n    /**\n     * Clears all buffered entries\n     */\n    clear(): void {\n        this.buffer = [];\n    }\n\n    /**\n     * Outputs all buffered entries to console and clears the buffer\n     */\n    flush(): void {\n        this.buffer.forEach(entry => {\n            if (entry.styles.length > 0) {\n                console.log(entry.message, ...entry.styles);\n            } else {\n                console.log(entry.message);\n            }\n        });\n        this.clear();\n    }\n\n    /**\n     * Outputs buffered entries to console without clearing\n     */\n    replay(): void {\n        this.buffer.forEach(entry => {\n            if (entry.styles.length > 0) {\n                console.log(entry.message, ...entry.styles);\n            } else {\n                console.log(entry.message);\n            }\n        });\n    }\n\n    /**\n     * Returns all messages as an array of strings\n     */\n    toArray(): string[] {\n        return this.buffer.map(entry => entry.message);\n    }\n\n    /**\n     * Returns all messages joined as a single string\n     * @param separator - String to join messages with (default: newline)\n     */\n    toString(separator: string = '\\n'): string {\n        return this.toArray().join(separator);\n    }\n}\n","import type { TransportRecord, TransportOptions, ITransport, LogLevel } from '../types/index.js';\n\nexport class ConsoleTransport implements ITransport {\n    readonly name = 'console';\n\n    constructor(private options?: TransportOptions) {}\n\n    write(record: TransportRecord): void {\n        const method = this.getConsoleMethod(record.level);\n        const prefix = record.prefix ? `[${record.prefix}] ` : '';\n        const location = record.location\n            ? ` (${record.location.file}:${record.location.line})`\n            : '';\n\n        console[method](`[${record.level.toUpperCase()}]${prefix} ${record.msg}${location}`);\n    }\n\n    private getConsoleMethod(level: LogLevel): 'log' | 'info' | 'warn' | 'error' {\n        switch (level) {\n            case 'debug': return 'log';\n            case 'info': return 'info';\n            case 'warn': return 'warn';\n            case 'error':\n            case 'critical': return 'error';\n            default: return 'log';\n        }\n    }\n}\n","/**\n * @fileoverview File-based log handler for Advanced Logger\n */\n\nimport type { ILogHandler, LogLevel, LogMetadata } from '../types/index.js';\nimport { isNode, isBrowser } from '../utils/environment.js';\nimport { safeSerialize } from '../utils/formatting.js';\n\n/**\n * Universal file-based log handler for persistent logging\n * Works in both Node.js (real files) and browser (localStorage)\n */\nexport class FileLogHandler implements ILogHandler {\n    private filename: string;\n    private maxSize?: number;\n    private fs?: any; // Node.js fs module\n\n    constructor(filename: string = 'app.log', maxSize?: number) {\n        this.filename = filename;\n        this.maxSize = maxSize;\n        \n        // Load Node.js fs module if in Node environment\n        if (isNode) {\n            try {\n                this.fs = require('fs');\n            } catch (error) {\n                console.warn('FileLogHandler: Unable to load fs module:', error);\n            }\n        }\n    }\n\n    handle(level: LogLevel, message: string, args: any[], metadata: LogMetadata): void {\n        const logEntry = {\n            timestamp: metadata.timestamp,\n            level: level.toUpperCase(),\n            prefix: metadata.prefix,\n            message,\n            args: args.slice(1).map(arg => safeSerialize(arg)),\n            location: metadata.stackInfo,\n        };\n\n        const logLine = this.formatLogLine(logEntry);\n\n        if (isNode && this.fs) {\n            this.writeToFileNode(logLine);\n        } else if (isBrowser) {\n            this.writeToFileLocal(logLine);\n        } else {\n            // Fallback - just console output\n            console.log(`[FILE-LOG] ${logLine}`);\n        }\n    }\n\n    /**\n     * Format log entry as a single line for file storage\n     */\n    private formatLogLine(entry: any): string {\n        const parts = [\n            entry.timestamp,\n            `[${entry.level}]`,\n            entry.prefix ? `[${entry.prefix}]` : '',\n            entry.message\n        ].filter(Boolean);\n\n        let line = parts.join(' ');\n        \n        if (entry.args && entry.args.length > 0) {\n            line += ' ' + entry.args.map((arg: any) => \n                typeof arg === 'object' ? JSON.stringify(arg) : String(arg)\n            ).join(' ');\n        }\n        \n        if (entry.location) {\n            line += ` (${entry.location.file}:${entry.location.line}:${entry.location.column})`;\n        }\n        \n        return line;\n    }\n\n    /**\n     * Write to actual file in Node.js environment\n     */\n    private writeToFileNode(logLine: string): void {\n        if (!this.fs) return;\n\n        try {\n            // Check file size if maxSize is set\n            if (this.maxSize) {\n                try {\n                    const stats = this.fs.statSync(this.filename);\n                    if (stats.size > this.maxSize) {\n                        // Simple rotation: backup current file and start fresh\n                        const backupName = `${this.filename}.bak`;\n                        this.fs.renameSync(this.filename, backupName);\n                    }\n                } catch (error) {\n                    // File doesn't exist yet, that's fine\n                }\n            }\n\n            // Append to file\n            this.fs.appendFileSync(this.filename, logLine + '\\n', 'utf8');\n        } catch (error) {\n            console.error('FileLogHandler: Failed to write to file:', error);\n        }\n    }\n\n    /**\n     * Write to localStorage in browser environment\n     */\n    private writeToFileLocal(logLine: string): void {\n        try {\n            const storageKey = `logger_${this.filename}`;\n            const existingLogs = localStorage.getItem(storageKey) || '';\n            \n            let newLogs = existingLogs;\n            if (existingLogs.length > 0) {\n                newLogs += '\\n';\n            }\n            newLogs += logLine;\n            \n            // Simple size management - keep last 1000 lines max\n            if (this.maxSize || newLogs.split('\\n').length > 1000) {\n                const lines = newLogs.split('\\n');\n                const maxLines = this.maxSize ? Math.floor(this.maxSize / 100) : 1000;\n                if (lines.length > maxLines) {\n                    newLogs = lines.slice(-maxLines).join('\\n');\n                }\n            }\n            \n            localStorage.setItem(storageKey, newLogs);\n        } catch (error) {\n            console.error('FileLogHandler: Failed to write to localStorage:', error);\n        }\n    }\n\n    /**\n     * Get stored logs (useful for debugging)\n     */\n    getLogs(): string | null {\n        if (isNode && this.fs) {\n            try {\n                return this.fs.readFileSync(this.filename, 'utf8');\n            } catch (error) {\n                return null;\n            }\n        } else if (isBrowser) {\n            const storageKey = `logger_${this.filename}`;\n            return localStorage.getItem(storageKey);\n        }\n        return null;\n    }\n\n    /**\n     * Clear stored logs\n     */\n    clearLogs(): void {\n        if (isNode && this.fs) {\n            try {\n                this.fs.writeFileSync(this.filename, '', 'utf8');\n            } catch (error) {\n                console.error('FileLogHandler: Failed to clear file:', error);\n            }\n        } else if (isBrowser) {\n            const storageKey = `logger_${this.filename}`;\n            localStorage.removeItem(storageKey);\n        }\n    }\n}","import type { TransportRecord, TransportOptions, ITransport } from '../types/index.js';\n\nexport interface FileTransportOptions extends TransportOptions {\n    destination?: string;\n}\n\nexport class FileTransport implements ITransport {\n    readonly name = 'file';\n    private buffer: string[] = [];\n    private flushTimer?: ReturnType<typeof setInterval>;\n    private options: FileTransportOptions;\n\n    constructor(options?: FileTransportOptions) {\n        this.options = options || {};\n\n        if (this.options.flushInterval) {\n            this.flushTimer = setInterval(() => this.flush(), this.options.flushInterval);\n        }\n    }\n\n    write(record: TransportRecord): void {\n        const line = JSON.stringify(record) + '\\n';\n        this.buffer.push(line);\n\n        if (this.buffer.length >= (this.options.batchSize || 100)) {\n            this.flush();\n        }\n    }\n\n    async flush(): Promise<void> {\n        if (this.buffer.length === 0) return;\n\n        const lines = this.buffer.join('');\n        this.buffer = [];\n\n        if (typeof globalThis.process !== 'undefined' && typeof require === 'function') {\n            try {\n                const fs = require('fs');\n                const dest = this.options.destination || 'app.log';\n                fs.appendFileSync(dest, lines);\n            } catch {\n                // Silent fail in browser or if fs not available\n            }\n        }\n    }\n\n    close(): void {\n        if (this.flushTimer) {\n            clearInterval(this.flushTimer);\n        }\n        this.flush();\n    }\n}\n","import type { TransportRecord, TransportOptions, ITransport } from '../types/index.js';\n\nexport interface HttpTransportOptions extends TransportOptions {\n    url?: string;\n    headers?: Record<string, string>;\n}\n\nexport class HttpTransport implements ITransport {\n    readonly name = 'http';\n    private buffer: TransportRecord[] = [];\n    private flushTimer?: ReturnType<typeof setInterval>;\n    private options: HttpTransportOptions;\n\n    constructor(options?: HttpTransportOptions) {\n        this.options = options || {};\n\n        if (this.options.flushInterval) {\n            this.flushTimer = setInterval(() => this.flush(), this.options.flushInterval);\n        }\n    }\n\n    write(record: TransportRecord): void {\n        this.buffer.push(record);\n\n        if (this.buffer.length >= (this.options.batchSize || 50)) {\n            this.flush();\n        }\n    }\n\n    async flush(): Promise<void> {\n        if (this.buffer.length === 0 || !this.options.url) return;\n\n        const records = [...this.buffer];\n        this.buffer = [];\n\n        try {\n            await fetch(this.options.url, {\n                method: 'POST',\n                headers: {\n                    'Content-Type': 'application/json',\n                    ...this.options.headers\n                },\n                body: JSON.stringify({ logs: records })\n            });\n        } catch {\n            this.buffer.unshift(...records);\n        }\n    }\n\n    close(): void {\n        if (this.flushTimer) {\n            clearInterval(this.flushTimer);\n        }\n        this.flush();\n    }\n}\n"],"names":["DEFAULT_CONFIG","maxEntries","ttl","enabled","StyleCache","cache","Map","config","hitCount","missCount","constructor","this","generateKey","key","level","theme","presetName","hasPrefix","hasLocation","get","cacheKey","entry","Date","now","createdAt","delete","hits","set","format","styles","size","firstKey","keys","next","value","clear","getStats","total","maxSize","hitRate","misses","setEnabled","isEnabled","_styleCache","_logger","getLogger","Logger","index","stylePresets","success","StylePresets","build","error","warning","info","accent","handle","message","_args","metadata","timestamp","buffer","write","length","shift","push","getBuffer","getByLevel","levels","filter","includes","isEmpty","flush","forEach","console","log","replay","toArray","map","toString","separator","join","options","name","record","method","getConsoleMethod","prefix","location","file","line","toUpperCase","msg","filename","fs","isNode","require","warn","args","logEntry","slice","arg","safeSerialize","stackInfo","logLine","formatLogLine","writeToFileNode","isBrowser","writeToFileLocal","Boolean","JSON","stringify","String","column","statSync","backupName","renameSync","appendFileSync","storageKey","existingLogs","localStorage","getItem","newLogs","split","lines","maxLines","Math","floor","setItem","getLogs","readFileSync","clearLogs","writeFileSync","removeItem","flushTimer","flushInterval","setInterval","batchSize","globalThis","process","dest","destination","close","clearInterval","url","records","fetch","headers","body","logs","unshift","handler","addHandler","type","serializer","priority","addSerializer","target","addTransport","api","badgeName","badge","badgeList","badges","blank","content","box","clearBadges","command","cli","rows","cliTable","closeTransports","component","StyleBuilder","critical","debug","divider","flushTransports","label","collapsed","group","groupEnd","title","subtitle","header","duration","logAnimated","svgContent","logWithSVG","event","callback","off","on","once","removeSerializer","id","removeTransport","scope","bannerType","setBannerType","setCLILevel","setGlobalPrefix","setTheme","setVerbosity","showBanner","spinner","current","step","data","columns","table","time","timeEnd","trace","middleware","use"],"mappings":"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"}