{"version":3,"file":"core.cjs","names":["DEFAULT_CONFIG","isBrowser","LOG_LEVELS","parseStackTrace","getConsoleMethod","createStyledOutput","LEVEL_STYLES","createPlainOutput","createLogEntry","formatTablePlain","isNode"],"sources":["../src/core.ts"],"sourcesContent":["/**\n * @fileoverview Core Logger Module - Minimal logging without advanced features\n * \n * This module provides the essential logging functionality without visual enhancements,\n * SVG support, or advanced styling. Perfect for lightweight applications or server-side usage.\n */\n\n// Core types\nimport type {\n    LogLevel,\n    Verbosity,\n    LoggerConfig,\n    ILogHandler,\n    LogMetadata,\n    TimerEntry\n} from './types/index.js';\n\n// Core utilities\nimport {\n    parseStackTrace,\n    formatTimestamp\n} from './utils/index.js';\n\n// Universal formatting and environment detection\nimport {\n    createPlainOutput,\n    getConsoleMethod,\n    createLogEntry,\n    formatTablePlain,\n    safeSerialize,\n    type OutputFormat\n} from './utils/formatting.js';\n\nimport {\n    isBrowser,\n    isNode\n} from './utils/environment-detector.js';\n\nimport { createStyledOutput } from './utils/output.js';\n\n// Constants\nimport { DEFAULT_CONFIG, LEVEL_STYLES } from './constants.js';\nimport { LOG_LEVELS } from './types/core.js';\n\n/**\n * Minimal Logger class with core functionality only\n * \n * @example\n * ```typescript\n * import { CoreLogger } from '@mks2508/better-logger/core';\n * \n * const logger = new CoreLogger();\n * logger.info('Hello world');\n * logger.error('Something went wrong', error);\n * ```\n */\nexport class CoreLogger {\n    private config: LoggerConfig;\n    private scopedPrefix?: string;\n    private handlers: ILogHandler[] = [];\n    private timers: Map<string, TimerEntry> = new Map();\n    private groupDepth: number = 0;\n\n    /**\n     * Creates a new CoreLogger instance\n     * @param config - Optional configuration\n     */\n    constructor(config: Partial<LoggerConfig> = {}) {\n        this.config = {\n            ...DEFAULT_CONFIG,\n            ...config,\n            // Auto-configure based on environment\n            enableColors: config.enableColors ?? (isBrowser ? true : false),\n            enableTimestamps: config.enableTimestamps ?? true,\n            enableStackTrace: config.enableStackTrace ?? false,\n            autoDetectTheme: config.autoDetectTheme ?? true,\n            outputFormat: config.outputFormat ?? 'auto'\n        };\n    }\n\n    // ===== CONFIGURATION METHODS =====\n\n    /**\n     * Get current configuration\n     */\n    getConfig(): LoggerConfig {\n        return { ...this.config };\n    }\n\n    /**\n     * Sets the global prefix for all log messages\n     */\n    setGlobalPrefix(prefix: string): void {\n        this.config.globalPrefix = prefix;\n    }\n\n    /**\n     * Sets the verbosity level for filtering log output\n     */\n    setVerbosity(level: Verbosity): void {\n        this.config.verbosity = level;\n    }\n\n    /**\n     * Creates a scoped logger with a specific prefix\n     */\n    scope(prefix: string): CoreLogger {\n        const scopedLogger = new CoreLogger(this.config);\n        scopedLogger.scopedPrefix = prefix;\n        scopedLogger.handlers = [...this.handlers];\n        return scopedLogger;\n    }\n\n    /**\n     * Adds a custom log handler for extensibility\n     */\n    addHandler(handler: ILogHandler): void {\n        this.handlers.push(handler);\n    }\n\n    // ===== CORE LOGGING METHODS =====\n\n    /**\n     * Checks if a log level should be output based on current verbosity\n     */\n    private shouldLog(level: LogLevel): boolean {\n        if (this.config.verbosity === 'silent') return false;\n        const verbosity = this.config.verbosity as LogLevel;\n        return LOG_LEVELS[level] >= LOG_LEVELS[verbosity];\n    }\n\n    /**\n     * Gets the effective prefix (global + scoped)\n     */\n    private getEffectivePrefix(): string | undefined {\n        const parts = [this.config.globalPrefix, this.scopedPrefix].filter(Boolean);\n        return parts.length > 0 ? parts.join(':') : undefined;\n    }\n\n    /**\n     * Core logging method with universal formatting\n     */\n    private log(level: LogLevel, ...args: unknown[]): void {\n        if (!this.shouldLog(level)) return;\n\n        const prefix = this.getEffectivePrefix();\n        const message = String(args[0] || '');\n        const stackInfo = this.config.enableStackTrace ? parseStackTrace() : null;\n        const consoleMethod = getConsoleMethod(level);\n\n        // Choose formatting based on environment and configuration\n        if (isBrowser && this.config.enableColors) {\n            // Browser with CSS styling\n            try {\n                const [format, ...styles] = createStyledOutput(\n                    level,\n                    LEVEL_STYLES,\n                    prefix,\n                    message,\n                    stackInfo,\n                    this.config.autoDetectTheme\n                );\n                console[consoleMethod](format, ...styles, ...args.slice(1));\n            } catch (error) {\n                // Fallback to plain formatting if CSS fails\n                const output = createPlainOutput(level, message, prefix, stackInfo);\n                console[consoleMethod](output, ...args.slice(1));\n            }\n        } else {\n            // Node.js or browser without colors - use plain formatting\n            const groupIndent = '  '.repeat(this.groupDepth);\n            const output = groupIndent + createPlainOutput(level, message, prefix, stackInfo);\n            console[consoleMethod](output, ...args.slice(1));\n        }\n\n        // Call custom handlers with structured metadata\n        const logEntry = createLogEntry(level, message, args, prefix, stackInfo);\n        const metadata: LogMetadata = {\n            timestamp: logEntry.timestamp,\n            level,\n            prefix,\n            stackInfo: logEntry.location,\n        };\n\n        this.handlers.forEach(handler => {\n            try {\n                handler.handle(level, message, args, metadata);\n            } catch (error) {\n                console.error('Log handler failed:', error);\n            }\n        });\n    }\n\n    /**\n     * Logs debug information (lowest priority)\n     */\n    debug(...args: unknown[]): void {\n        this.log('debug', ...args);\n    }\n\n    /**\n     * Logs informational messages\n     */\n    info(...args: unknown[]): void {\n        this.log('info', ...args);\n    }\n\n    /**\n     * Logs warning messages\n     */\n    warn(...args: unknown[]): void {\n        this.log('warn', ...args);\n    }\n\n    /**\n     * Logs error messages\n     */\n    error(...args: unknown[]): void {\n        this.log('error', ...args);\n    }\n\n    /**\n     * Logs critical errors (highest priority)\n     */\n    critical(...args: unknown[]): void {\n        this.log('critical', ...args);\n    }\n\n    /**\n     * Logs trace information (detailed debugging)\n     */\n    trace(...args: unknown[]): void {\n        this.log('debug', ...args);\n        if (this.shouldLog('debug')) {\n            console.trace(...args);\n        }\n    }\n\n    // ===== BASIC ADVANCED FEATURES =====\n\n    /**\n     * Displays data in a table format\n     */\n    table(data: any, columns?: string[]): void {\n        if (!this.shouldLog('info')) return;\n\n        const prefix = this.getEffectivePrefix();\n        const tableHeader = `[TABLE]${prefix ? ` [${prefix}]` : ''}:`;\n        \n        if (isBrowser && typeof console.table === 'function') {\n            // Browser has native table support\n            console.log(tableHeader);\n            if (columns) {\n                console.table(data, columns);\n            } else {\n                console.table(data);\n            }\n        } else {\n            // Node.js or fallback - use plain text formatting\n            console.log(tableHeader);\n            const tableText = formatTablePlain(data, columns);\n            console.log(tableText);\n        }\n    }\n\n    /**\n     * Starts a collapsible group in the console\n     */\n    group(label: string, collapsed: boolean = false): void {\n        const prefix = this.getEffectivePrefix();\n        const fullLabel = `${prefix ? `[${prefix}] ` : ''}${label}`;\n        \n        if (isBrowser && console.group && console.groupCollapsed) {\n            // Browser supports native grouping\n            if (collapsed) {\n                console.groupCollapsed(fullLabel);\n            } else {\n                console.group(fullLabel);\n            }\n        } else {\n            // Node.js fallback - just log the group label\n            const groupStart = '┌─ ' + fullLabel;\n            console.log(groupStart);\n        }\n        \n        this.groupDepth++;\n    }\n\n    /**\n     * Ends the current console group\n     */\n    groupEnd(): void {\n        if (this.groupDepth > 0) {\n            if (isBrowser && console.groupEnd) {\n                console.groupEnd();\n            } else {\n                // Node.js fallback - log group end\n                const groupEnd = '└─ (end group)';\n                console.log(groupEnd);\n            }\n            this.groupDepth--;\n        }\n    }\n\n    /**\n     * Starts a timer with the given label\n     */\n    time(label: string): void {\n        const startTime = this.getPerformanceNow();\n        const timer: TimerEntry = {\n            label,\n            startTime,\n        };\n        this.timers.set(label, timer);\n        \n        const prefix = this.getEffectivePrefix();\n        const message = `Timer started: ${label}`;\n        const output = createPlainOutput('info', message, prefix);\n        console.log(output);\n    }\n\n    /**\n     * Ends a timer and logs the elapsed time\n     */\n    timeEnd(label: string): void {\n        const timer = this.timers.get(label);\n        if (!timer) {\n            this.warn(`Timer '${label}' does not exist`);\n            return;\n        }\n\n        const elapsed = this.getPerformanceNow() - timer.startTime;\n        this.timers.delete(label);\n        \n        const prefix = this.getEffectivePrefix();\n        const message = `Timer ended: ${label} - ${elapsed.toFixed(2)}ms`;\n        const output = createPlainOutput('info', message, prefix);\n        console.log(output);\n    }\n\n    /**\n     * Gets performance.now() or fallback for older environments\n     */\n    private getPerformanceNow(): number {\n        if (typeof performance !== 'undefined' && performance.now) {\n            return performance.now();\n        }\n        \n        if (isNode && process.hrtime) {\n            // Node.js high-resolution time\n            const [seconds, nanoseconds] = process.hrtime();\n            return seconds * 1000 + nanoseconds / 1000000;\n        }\n        \n        // Fallback to Date.now()\n        return Date.now();\n    }\n}\n\n// Create and export singleton instance for convenience\nconst coreLogger = new CoreLogger();\n\n/**\n * Export individual methods for convenience (with proper binding)\n */\nexport const debug = (...args: any[]) => coreLogger.debug(...args);\nexport const info = (...args: any[]) => coreLogger.info(...args);\nexport const warn = (...args: any[]) => coreLogger.warn(...args);\nexport const error = (...args: any[]) => coreLogger.error(...args);\nexport const critical = (...args: any[]) => coreLogger.critical(...args);\nexport const trace = (...args: any[]) => coreLogger.trace(...args);\nexport const table = (data: any, columns?: string[]) => coreLogger.table(data, columns);\nexport const group = (label: string, collapsed?: boolean) => coreLogger.group(label, collapsed);\nexport const groupEnd = () => coreLogger.groupEnd();\nexport const time = (label: string) => coreLogger.time(label);\nexport const timeEnd = (label: string) => coreLogger.timeEnd(label);\nexport const setGlobalPrefix = (prefix: string) => coreLogger.setGlobalPrefix(prefix);\nexport const scope = (prefix: string) => coreLogger.scope(prefix);\nexport const setVerbosity = (level: Verbosity) => coreLogger.setVerbosity(level);\nexport const addHandler = (handler: ILogHandler) => coreLogger.addHandler(handler);\n\n// Export the singleton as default\nexport default coreLogger;\n\n// Re-export core types\nexport type {\n    LogLevel,\n    Verbosity,\n    LoggerConfig,\n    ILogHandler,\n    LogMetadata\n} from './types/index.js';"],"mappings":"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"}