@mks2508/better-logger 1.0.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (183) hide show
  1. package/.claude/settings.local.json +5 -3
  2. package/CHANGELOG.md +63 -0
  3. package/bun.lock +10 -0
  4. package/dist/Logger.d.ts.map +1 -0
  5. package/dist/ScopedLogger.d.ts.map +1 -0
  6. package/dist/chunks/{Logger-CTAaDeZi.js → Logger-BynuRJQf.js} +12 -6
  7. package/dist/chunks/Logger-BynuRJQf.js.map +1 -0
  8. package/dist/chunks/{Logger-D8pK7XXt.js → Logger-DMjlVQWi.js} +2 -2
  9. package/dist/chunks/Logger-DMjlVQWi.js.map +1 -0
  10. package/dist/chunks/{ScopedLogger-hS0qSkZD.js → ScopedLogger-Bl56WovH.js} +2 -2
  11. package/dist/chunks/{ScopedLogger-hS0qSkZD.js.map → ScopedLogger-Bl56WovH.js.map} +1 -1
  12. package/dist/chunks/{ScopedLogger-D-7q8uVP.js → ScopedLogger-D2HzayKH.js} +2 -2
  13. package/dist/chunks/{ScopedLogger-D-7q8uVP.js.map → ScopedLogger-D2HzayKH.js.map} +1 -1
  14. package/dist/chunks/environment--eaTrhRu.js +4 -0
  15. package/dist/chunks/environment--eaTrhRu.js.map +1 -0
  16. package/dist/chunks/environment-BanAyF-K.js +1172 -0
  17. package/dist/chunks/environment-BanAyF-K.js.map +1 -0
  18. package/dist/chunks/formatting-BSNvAxLK.js +2 -0
  19. package/dist/chunks/formatting-BSNvAxLK.js.map +1 -0
  20. package/dist/chunks/formatting-CgQSWgXR.js +380 -0
  21. package/dist/chunks/formatting-CgQSWgXR.js.map +1 -0
  22. package/dist/cli/CommandProcessor.d.ts.map +1 -0
  23. package/dist/cli/commands/ConfigCommand.d.ts.map +1 -0
  24. package/dist/cli/commands/ExportCommand.d.ts.map +1 -0
  25. package/dist/cli/commands/HistoryCommand.d.ts.map +1 -0
  26. package/dist/cli/commands/StatusCommand.d.ts.map +1 -0
  27. package/dist/cli/commands/ThemeCommand.d.ts.map +1 -0
  28. package/dist/cli/help.d.ts.map +1 -0
  29. package/dist/cli/index.d.ts.map +1 -0
  30. package/dist/{types/constants.d.ts → constants.d.ts} +108 -0
  31. package/dist/constants.d.ts.map +1 -0
  32. package/dist/core.cjs +1 -1
  33. package/dist/core.cjs.map +1 -1
  34. package/dist/core.d.ts +127 -0
  35. package/dist/core.d.ts.map +1 -0
  36. package/dist/core.js +6 -5
  37. package/dist/core.js.map +1 -1
  38. package/dist/example.d.ts.map +1 -0
  39. package/dist/exports-module.d.ts.map +1 -0
  40. package/dist/exports.cjs +1 -1
  41. package/dist/exports.js +2 -2
  42. package/dist/handlers/AnalyticsLogHandler.d.ts.map +1 -0
  43. package/dist/handlers/ExportLogHandler.d.ts.map +1 -0
  44. package/dist/handlers/FileLogHandler.d.ts.map +1 -0
  45. package/dist/handlers/RemoteLogHandler.d.ts.map +1 -0
  46. package/dist/handlers/index.d.ts.map +1 -0
  47. package/dist/index.cjs +1 -1
  48. package/dist/index.cjs.map +1 -1
  49. package/dist/index.d.ts +124 -0
  50. package/dist/index.d.ts.map +1 -0
  51. package/dist/index.js +25 -5
  52. package/dist/index.js.map +1 -1
  53. package/dist/main.d.ts.map +1 -0
  54. package/dist/styling/LogStyleBuilder.d.ts.map +1 -0
  55. package/dist/styling/SemanticStyles.d.ts.map +1 -0
  56. package/dist/styling/SmartPresets.d.ts.map +1 -0
  57. package/dist/styling/StyleBuilder.d.ts.map +1 -0
  58. package/dist/styling/banners.d.ts.map +1 -0
  59. package/dist/styling/index.d.ts.map +1 -0
  60. package/dist/styling/themes.d.ts.map +1 -0
  61. package/dist/styling-module.d.ts.map +1 -0
  62. package/dist/styling.cjs +1 -1
  63. package/dist/styling.js +3 -3
  64. package/dist/terminal/terminal-renderer.d.ts +63 -0
  65. package/dist/terminal/terminal-renderer.d.ts.map +1 -0
  66. package/dist/types/core.d.ts +229 -122
  67. package/dist/types/core.d.ts.map +1 -1
  68. package/dist/types/handlers.d.ts.map +1 -0
  69. package/dist/types/index.d.ts +4 -119
  70. package/dist/types/index.d.ts.map +1 -1
  71. package/dist/utils/adapter.d.ts +48 -0
  72. package/dist/utils/adapter.d.ts.map +1 -0
  73. package/dist/utils/ansi-colors.d.ts +156 -0
  74. package/dist/utils/ansi-colors.d.ts.map +1 -0
  75. package/dist/utils/environment-detector.d.ts +35 -0
  76. package/dist/utils/environment-detector.d.ts.map +1 -0
  77. package/dist/{types/utils → utils}/environment.d.ts +1 -1
  78. package/dist/utils/environment.d.ts.map +1 -0
  79. package/dist/{types/utils → utils}/formatting.d.ts +22 -1
  80. package/dist/utils/formatting.d.ts.map +1 -0
  81. package/dist/{types/utils → utils}/index.d.ts +1 -0
  82. package/dist/utils/index.d.ts.map +1 -0
  83. package/dist/utils/opentui-detection.d.ts.map +1 -0
  84. package/dist/{types/utils → utils}/output.d.ts +7 -2
  85. package/dist/utils/output.d.ts.map +1 -0
  86. package/dist/utils/stackTrace.d.ts.map +1 -0
  87. package/dist/utils/timestamps.d.ts.map +1 -0
  88. package/package.json +10 -2
  89. package/src/Logger.ts +24 -19
  90. package/src/constants.ts +131 -1
  91. package/src/core.ts +11 -7
  92. package/src/handlers/ExportLogHandler.ts +2 -1
  93. package/src/index.ts +30 -2
  94. package/src/styling/SemanticStyles.ts +1 -1
  95. package/src/terminal/terminal-renderer.ts +339 -0
  96. package/src/types/core.ts +15 -1
  97. package/src/types/index.ts +1 -0
  98. package/src/utils/adapter.ts +291 -0
  99. package/src/utils/ansi-colors.ts +333 -0
  100. package/src/utils/environment-detector.ts +148 -0
  101. package/src/utils/formatting.ts +196 -6
  102. package/src/utils/index.ts +23 -11
  103. package/src/utils/output.ts +43 -1
  104. package/vite.config.ts +1 -1
  105. package/dist/chunks/Logger-CTAaDeZi.js.map +0 -1
  106. package/dist/chunks/Logger-D8pK7XXt.js.map +0 -1
  107. package/dist/chunks/environment-Bxbnw4pd.js +0 -544
  108. package/dist/chunks/environment-Bxbnw4pd.js.map +0 -1
  109. package/dist/chunks/environment-Dm66zOML.js +0 -4
  110. package/dist/chunks/environment-Dm66zOML.js.map +0 -1
  111. package/dist/chunks/formatting-C0riPC5_.js +0 -95
  112. package/dist/chunks/formatting-C0riPC5_.js.map +0 -1
  113. package/dist/chunks/formatting-DNCAV66-.js +0 -2
  114. package/dist/chunks/formatting-DNCAV66-.js.map +0 -1
  115. package/dist/types/Logger.d.ts.map +0 -1
  116. package/dist/types/ScopedLogger.d.ts.map +0 -1
  117. package/dist/types/cli/CommandProcessor.d.ts.map +0 -1
  118. package/dist/types/cli/commands/ConfigCommand.d.ts.map +0 -1
  119. package/dist/types/cli/commands/ExportCommand.d.ts.map +0 -1
  120. package/dist/types/cli/commands/HistoryCommand.d.ts.map +0 -1
  121. package/dist/types/cli/commands/StatusCommand.d.ts.map +0 -1
  122. package/dist/types/cli/commands/ThemeCommand.d.ts.map +0 -1
  123. package/dist/types/cli/help.d.ts.map +0 -1
  124. package/dist/types/cli/index.d.ts.map +0 -1
  125. package/dist/types/constants.d.ts.map +0 -1
  126. package/dist/types/example.d.ts.map +0 -1
  127. package/dist/types/exports-module.d.ts.map +0 -1
  128. package/dist/types/handlers/AnalyticsLogHandler.d.ts.map +0 -1
  129. package/dist/types/handlers/ExportLogHandler.d.ts.map +0 -1
  130. package/dist/types/handlers/FileLogHandler.d.ts.map +0 -1
  131. package/dist/types/handlers/RemoteLogHandler.d.ts.map +0 -1
  132. package/dist/types/handlers/index.d.ts.map +0 -1
  133. package/dist/types/main.d.ts.map +0 -1
  134. package/dist/types/styling/LogStyleBuilder.d.ts.map +0 -1
  135. package/dist/types/styling/SemanticStyles.d.ts.map +0 -1
  136. package/dist/types/styling/SmartPresets.d.ts.map +0 -1
  137. package/dist/types/styling/StyleBuilder.d.ts.map +0 -1
  138. package/dist/types/styling/banners.d.ts.map +0 -1
  139. package/dist/types/styling/index.d.ts.map +0 -1
  140. package/dist/types/styling/themes.d.ts.map +0 -1
  141. package/dist/types/styling-module.d.ts.map +0 -1
  142. package/dist/types/types/core.d.ts +0 -221
  143. package/dist/types/types/core.d.ts.map +0 -1
  144. package/dist/types/types/handlers.d.ts.map +0 -1
  145. package/dist/types/types/index.d.ts +0 -7
  146. package/dist/types/types/index.d.ts.map +0 -1
  147. package/dist/types/utils/environment.d.ts.map +0 -1
  148. package/dist/types/utils/formatting.d.ts.map +0 -1
  149. package/dist/types/utils/index.d.ts.map +0 -1
  150. package/dist/types/utils/opentui-detection.d.ts.map +0 -1
  151. package/dist/types/utils/output.d.ts.map +0 -1
  152. package/dist/types/utils/stackTrace.d.ts.map +0 -1
  153. package/dist/types/utils/timestamps.d.ts.map +0 -1
  154. /package/dist/{types/Logger.d.ts → Logger.d.ts} +0 -0
  155. /package/dist/{types/ScopedLogger.d.ts → ScopedLogger.d.ts} +0 -0
  156. /package/dist/{types/cli → cli}/CommandProcessor.d.ts +0 -0
  157. /package/dist/{types/cli → cli}/commands/ConfigCommand.d.ts +0 -0
  158. /package/dist/{types/cli → cli}/commands/ExportCommand.d.ts +0 -0
  159. /package/dist/{types/cli → cli}/commands/HistoryCommand.d.ts +0 -0
  160. /package/dist/{types/cli → cli}/commands/StatusCommand.d.ts +0 -0
  161. /package/dist/{types/cli → cli}/commands/ThemeCommand.d.ts +0 -0
  162. /package/dist/{types/cli → cli}/help.d.ts +0 -0
  163. /package/dist/{types/cli → cli}/index.d.ts +0 -0
  164. /package/dist/{types/example.d.ts → example.d.ts} +0 -0
  165. /package/dist/{types/exports-module.d.ts → exports-module.d.ts} +0 -0
  166. /package/dist/{types/handlers → handlers}/AnalyticsLogHandler.d.ts +0 -0
  167. /package/dist/{types/handlers → handlers}/ExportLogHandler.d.ts +0 -0
  168. /package/dist/{types/handlers → handlers}/FileLogHandler.d.ts +0 -0
  169. /package/dist/{types/handlers → handlers}/RemoteLogHandler.d.ts +0 -0
  170. /package/dist/{types/handlers → handlers}/index.d.ts +0 -0
  171. /package/dist/{types/main.d.ts → main.d.ts} +0 -0
  172. /package/dist/{types/styling → styling}/LogStyleBuilder.d.ts +0 -0
  173. /package/dist/{types/styling → styling}/SemanticStyles.d.ts +0 -0
  174. /package/dist/{types/styling → styling}/SmartPresets.d.ts +0 -0
  175. /package/dist/{types/styling → styling}/StyleBuilder.d.ts +0 -0
  176. /package/dist/{types/styling → styling}/banners.d.ts +0 -0
  177. /package/dist/{types/styling → styling}/index.d.ts +0 -0
  178. /package/dist/{types/styling → styling}/themes.d.ts +0 -0
  179. /package/dist/{types/styling-module.d.ts → styling-module.d.ts} +0 -0
  180. /package/dist/types/{types/handlers.d.ts → handlers.d.ts} +0 -0
  181. /package/dist/{types/utils → utils}/opentui-detection.d.ts +0 -0
  182. /package/dist/{types/utils → utils}/stackTrace.d.ts +0 -0
  183. /package/dist/{types/utils → utils}/timestamps.d.ts +0 -0
package/dist/core.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"core.cjs","sources":["../src/core.ts"],"sourcesContent":["/**\n * @fileoverview Core Logger Module - Minimal logging without advanced features\n * @version 0.0.1\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} from './utils/formatting.js';\n\nimport {\n isBrowser,\n isNode,\n getRuntimeEnvironment,\n supportsColors,\n supportsCSSColors\n} from './utils/environment.js';\n\nimport { createStyledOutput } from './utils/output.js';\n\n// Constants\nimport { DEFAULT_CONFIG, LEVEL_STYLES } from './constants.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 };\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 levels = { debug: 0, info: 1, warn: 2, error: 3, critical: 4 };\n return levels[level] >= levels[this.config.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: any[]): 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 && supportsCSSColors()) {\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 text 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 text\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: any[]): void {\n this.log('debug', ...args);\n }\n\n /**\n * Logs informational messages\n */\n info(...args: any[]): void {\n this.log('info', ...args);\n }\n\n /**\n * Logs warning messages\n */\n warn(...args: any[]): void {\n this.log('warn', ...args);\n }\n\n /**\n * Logs error messages\n */\n error(...args: any[]): void {\n this.log('error', ...args);\n }\n\n /**\n * Logs critical errors (highest priority)\n */\n critical(...args: any[]): void {\n this.log('critical', ...args);\n }\n\n /**\n * Logs trace information (detailed debugging)\n */\n trace(...args: any[]): 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';"],"names":["CoreLogger","config","scopedPrefix","handlers","timers","Map","groupDepth","constructor","this","DEFAULT_CONFIG","enableColors","isBrowser","enableTimestamps","enableStackTrace","autoDetectTheme","getConfig","setGlobalPrefix","prefix","globalPrefix","setVerbosity","level","verbosity","scope","scopedLogger","addHandler","handler","push","shouldLog","levels","debug","info","warn","error","critical","getEffectivePrefix","parts","filter","Boolean","length","join","log","args","message","String","stackInfo","parseStackTrace","consoleMethod","getConsoleMethod","supportsCSSColors","format","styles","createStyledOutput","LEVEL_STYLES","console","slice","output","createPlainOutput","repeat","logEntry","createLogEntry","metadata","timestamp","location","forEach","handle","trace","table","data","columns","tableHeader","tableText","formatTablePlain","group","label","collapsed","fullLabel","groupCollapsed","groupStart","groupEnd","time","timer","startTime","getPerformanceNow","set","timeEnd","get","elapsed","delete","toFixed","performance","now","isNode","process","hrtime","seconds","nanoseconds","Date","coreLogger"],"mappings":"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"}
1
+ {"version":3,"file":"core.cjs","sources":["../src/core.ts"],"sourcesContent":["/**\n * @fileoverview Core Logger Module - Minimal logging without advanced features\n * @version 0.0.1\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 createOutput,\n getConsoleMethod,\n createLogEntry,\n formatTablePlain,\n safeSerialize,\n detectOptimalFormat,\n type OutputFormat\n} from './utils/formatting.js';\n\nimport {\n isBrowser,\n isNode,\n getRuntimeEnvironment,\n supportsColors,\n supportsCSSColors\n} from './utils/environment.js';\n\nimport { createStyledOutput } from './utils/output.js';\n\n// Constants\nimport { DEFAULT_CONFIG, LEVEL_STYLES } from './constants.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 levels = { debug: 0, info: 1, warn: 2, error: 3, critical: 4 };\n return levels[level] >= levels[this.config.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: any[]): 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 && supportsCSSColors()) {\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 universal formatting if CSS fails\n const output = createOutput(level, message, prefix, stackInfo, this.config.outputFormat);\n console[consoleMethod](output, ...args.slice(1));\n }\n } else {\n // Node.js or browser without colors - use universal formatting\n const groupIndent = ' '.repeat(this.groupDepth);\n const output = groupIndent + createOutput(level, message, prefix, stackInfo, this.config.outputFormat);\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: any[]): void {\n this.log('debug', ...args);\n }\n\n /**\n * Logs informational messages\n */\n info(...args: any[]): void {\n this.log('info', ...args);\n }\n\n /**\n * Logs warning messages\n */\n warn(...args: any[]): void {\n this.log('warn', ...args);\n }\n\n /**\n * Logs error messages\n */\n error(...args: any[]): void {\n this.log('error', ...args);\n }\n\n /**\n * Logs critical errors (highest priority)\n */\n critical(...args: any[]): void {\n this.log('critical', ...args);\n }\n\n /**\n * Logs trace information (detailed debugging)\n */\n trace(...args: any[]): 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';"],"names":["CoreLogger","config","scopedPrefix","handlers","timers","Map","groupDepth","constructor","this","DEFAULT_CONFIG","enableColors","isBrowser","enableTimestamps","enableStackTrace","autoDetectTheme","outputFormat","getConfig","setGlobalPrefix","prefix","globalPrefix","setVerbosity","level","verbosity","scope","scopedLogger","addHandler","handler","push","shouldLog","levels","debug","info","warn","error","critical","getEffectivePrefix","parts","filter","Boolean","length","join","log","args","message","String","stackInfo","parseStackTrace","consoleMethod","getConsoleMethod","supportsCSSColors","format","styles","createStyledOutput","LEVEL_STYLES","console","slice","output","createOutput","repeat","logEntry","createLogEntry","metadata","timestamp","location","forEach","handle","trace","table","data","columns","tableHeader","tableText","formatTablePlain","group","label","collapsed","fullLabel","groupCollapsed","groupStart","groupEnd","time","timer","startTime","getPerformanceNow","set","createPlainOutput","timeEnd","get","elapsed","delete","toFixed","performance","now","isNode","process","hrtime","seconds","nanoseconds","Date","coreLogger"],"mappings":"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"}
package/dist/core.d.ts ADDED
@@ -0,0 +1,127 @@
1
+ import { Verbosity, LoggerConfig, ILogHandler } from './types/index.js';
2
+ /**
3
+ * Minimal Logger class with core functionality only
4
+ *
5
+ * @example
6
+ * ```typescript
7
+ * import { CoreLogger } from '@mks2508/better-logger/core';
8
+ *
9
+ * const logger = new CoreLogger();
10
+ * logger.info('Hello world');
11
+ * logger.error('Something went wrong', error);
12
+ * ```
13
+ */
14
+ export declare class CoreLogger {
15
+ private config;
16
+ private scopedPrefix?;
17
+ private handlers;
18
+ private timers;
19
+ private groupDepth;
20
+ /**
21
+ * Creates a new CoreLogger instance
22
+ * @param config - Optional configuration
23
+ */
24
+ constructor(config?: Partial<LoggerConfig>);
25
+ /**
26
+ * Get current configuration
27
+ */
28
+ getConfig(): LoggerConfig;
29
+ /**
30
+ * Sets the global prefix for all log messages
31
+ */
32
+ setGlobalPrefix(prefix: string): void;
33
+ /**
34
+ * Sets the verbosity level for filtering log output
35
+ */
36
+ setVerbosity(level: Verbosity): void;
37
+ /**
38
+ * Creates a scoped logger with a specific prefix
39
+ */
40
+ scope(prefix: string): CoreLogger;
41
+ /**
42
+ * Adds a custom log handler for extensibility
43
+ */
44
+ addHandler(handler: ILogHandler): void;
45
+ /**
46
+ * Checks if a log level should be output based on current verbosity
47
+ */
48
+ private shouldLog;
49
+ /**
50
+ * Gets the effective prefix (global + scoped)
51
+ */
52
+ private getEffectivePrefix;
53
+ /**
54
+ * Core logging method with universal formatting
55
+ */
56
+ private log;
57
+ /**
58
+ * Logs debug information (lowest priority)
59
+ */
60
+ debug(...args: any[]): void;
61
+ /**
62
+ * Logs informational messages
63
+ */
64
+ info(...args: any[]): void;
65
+ /**
66
+ * Logs warning messages
67
+ */
68
+ warn(...args: any[]): void;
69
+ /**
70
+ * Logs error messages
71
+ */
72
+ error(...args: any[]): void;
73
+ /**
74
+ * Logs critical errors (highest priority)
75
+ */
76
+ critical(...args: any[]): void;
77
+ /**
78
+ * Logs trace information (detailed debugging)
79
+ */
80
+ trace(...args: any[]): void;
81
+ /**
82
+ * Displays data in a table format
83
+ */
84
+ table(data: any, columns?: string[]): void;
85
+ /**
86
+ * Starts a collapsible group in the console
87
+ */
88
+ group(label: string, collapsed?: boolean): void;
89
+ /**
90
+ * Ends the current console group
91
+ */
92
+ groupEnd(): void;
93
+ /**
94
+ * Starts a timer with the given label
95
+ */
96
+ time(label: string): void;
97
+ /**
98
+ * Ends a timer and logs the elapsed time
99
+ */
100
+ timeEnd(label: string): void;
101
+ /**
102
+ * Gets performance.now() or fallback for older environments
103
+ */
104
+ private getPerformanceNow;
105
+ }
106
+ declare const coreLogger: CoreLogger;
107
+ /**
108
+ * Export individual methods for convenience (with proper binding)
109
+ */
110
+ export declare const debug: (...args: any[]) => void;
111
+ export declare const info: (...args: any[]) => void;
112
+ export declare const warn: (...args: any[]) => void;
113
+ export declare const error: (...args: any[]) => void;
114
+ export declare const critical: (...args: any[]) => void;
115
+ export declare const trace: (...args: any[]) => void;
116
+ export declare const table: (data: any, columns?: string[]) => void;
117
+ export declare const group: (label: string, collapsed?: boolean) => void;
118
+ export declare const groupEnd: () => void;
119
+ export declare const time: (label: string) => void;
120
+ export declare const timeEnd: (label: string) => void;
121
+ export declare const setGlobalPrefix: (prefix: string) => void;
122
+ export declare const scope: (prefix: string) => CoreLogger;
123
+ export declare const setVerbosity: (level: Verbosity) => void;
124
+ export declare const addHandler: (handler: ILogHandler) => void;
125
+ export default coreLogger;
126
+ export type { LogLevel, Verbosity, LoggerConfig, ILogHandler, LogMetadata } from './types/index.js';
127
+ //# sourceMappingURL=core.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"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"}
package/dist/core.js CHANGED
@@ -1,5 +1,5 @@
1
- import { D as DEFAULT_CONFIG, a as isBrowser, p as parseStackTrace, s as supportsCSSColors, c as createStyledOutput, L as LEVEL_STYLES, i as isNode } from "./chunks/environment-Bxbnw4pd.js";
2
- import { g as getConsoleMethod, c as createPlainOutput, a as createLogEntry, f as formatTablePlain } from "./chunks/formatting-C0riPC5_.js";
1
+ import { D as DEFAULT_CONFIG, a as isBrowser, p as parseStackTrace, s as supportsCSSColors, c as createStyledOutput, L as LEVEL_STYLES, i as isNode } from "./chunks/environment-BanAyF-K.js";
2
+ import { o as getConsoleMethod, c as createOutput, p as createLogEntry, q as formatTablePlain, r as createPlainOutput } from "./chunks/formatting-CgQSWgXR.js";
3
3
  class CoreLogger {
4
4
  config;
5
5
  scopedPrefix;
@@ -18,7 +18,8 @@ class CoreLogger {
18
18
  enableColors: config.enableColors ?? (isBrowser ? true : false),
19
19
  enableTimestamps: config.enableTimestamps ?? true,
20
20
  enableStackTrace: config.enableStackTrace ?? false,
21
- autoDetectTheme: config.autoDetectTheme ?? true
21
+ autoDetectTheme: config.autoDetectTheme ?? true,
22
+ outputFormat: config.outputFormat ?? "auto"
22
23
  };
23
24
  }
24
25
  // ===== CONFIGURATION METHODS =====
@@ -92,12 +93,12 @@ class CoreLogger {
92
93
  );
93
94
  console[consoleMethod](format, ...styles, ...args.slice(1));
94
95
  } catch (error2) {
95
- const output = createPlainOutput(level, message, prefix, stackInfo);
96
+ const output = createOutput(level, message, prefix, stackInfo, this.config.outputFormat);
96
97
  console[consoleMethod](output, ...args.slice(1));
97
98
  }
98
99
  } else {
99
100
  const groupIndent = " ".repeat(this.groupDepth);
100
- const output = groupIndent + createPlainOutput(level, message, prefix, stackInfo);
101
+ const output = groupIndent + createOutput(level, message, prefix, stackInfo, this.config.outputFormat);
101
102
  console[consoleMethod](output, ...args.slice(1));
102
103
  }
103
104
  const logEntry = createLogEntry(level, message, args, prefix, stackInfo);
package/dist/core.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"core.js","sources":["../src/core.ts"],"sourcesContent":["/**\n * @fileoverview Core Logger Module - Minimal logging without advanced features\n * @version 0.0.1\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} from './utils/formatting.js';\n\nimport {\n isBrowser,\n isNode,\n getRuntimeEnvironment,\n supportsColors,\n supportsCSSColors\n} from './utils/environment.js';\n\nimport { createStyledOutput } from './utils/output.js';\n\n// Constants\nimport { DEFAULT_CONFIG, LEVEL_STYLES } from './constants.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 };\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 levels = { debug: 0, info: 1, warn: 2, error: 3, critical: 4 };\n return levels[level] >= levels[this.config.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: any[]): 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 && supportsCSSColors()) {\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 text 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 text\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: any[]): void {\n this.log('debug', ...args);\n }\n\n /**\n * Logs informational messages\n */\n info(...args: any[]): void {\n this.log('info', ...args);\n }\n\n /**\n * Logs warning messages\n */\n warn(...args: any[]): void {\n this.log('warn', ...args);\n }\n\n /**\n * Logs error messages\n */\n error(...args: any[]): void {\n this.log('error', ...args);\n }\n\n /**\n * Logs critical errors (highest priority)\n */\n critical(...args: any[]): void {\n this.log('critical', ...args);\n }\n\n /**\n * Logs trace information (detailed debugging)\n */\n trace(...args: any[]): 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';"],"names":["error","groupEnd"],"mappings":"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"}
1
+ {"version":3,"file":"core.js","sources":["../src/core.ts"],"sourcesContent":["/**\n * @fileoverview Core Logger Module - Minimal logging without advanced features\n * @version 0.0.1\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 createOutput,\n getConsoleMethod,\n createLogEntry,\n formatTablePlain,\n safeSerialize,\n detectOptimalFormat,\n type OutputFormat\n} from './utils/formatting.js';\n\nimport {\n isBrowser,\n isNode,\n getRuntimeEnvironment,\n supportsColors,\n supportsCSSColors\n} from './utils/environment.js';\n\nimport { createStyledOutput } from './utils/output.js';\n\n// Constants\nimport { DEFAULT_CONFIG, LEVEL_STYLES } from './constants.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 levels = { debug: 0, info: 1, warn: 2, error: 3, critical: 4 };\n return levels[level] >= levels[this.config.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: any[]): 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 && supportsCSSColors()) {\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 universal formatting if CSS fails\n const output = createOutput(level, message, prefix, stackInfo, this.config.outputFormat);\n console[consoleMethod](output, ...args.slice(1));\n }\n } else {\n // Node.js or browser without colors - use universal formatting\n const groupIndent = ' '.repeat(this.groupDepth);\n const output = groupIndent + createOutput(level, message, prefix, stackInfo, this.config.outputFormat);\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: any[]): void {\n this.log('debug', ...args);\n }\n\n /**\n * Logs informational messages\n */\n info(...args: any[]): void {\n this.log('info', ...args);\n }\n\n /**\n * Logs warning messages\n */\n warn(...args: any[]): void {\n this.log('warn', ...args);\n }\n\n /**\n * Logs error messages\n */\n error(...args: any[]): void {\n this.log('error', ...args);\n }\n\n /**\n * Logs critical errors (highest priority)\n */\n critical(...args: any[]): void {\n this.log('critical', ...args);\n }\n\n /**\n * Logs trace information (detailed debugging)\n */\n trace(...args: any[]): 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';"],"names":["error","groupEnd"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"example.d.ts","sourceRoot":"","sources":["../src/example.ts"],"names":[],"mappings":"AAAA;;GAEG;AA0BH,wBAAgB,kBAAkB,SAQjC;AAED,wBAAgB,iBAAiB,SAUhC;AAED,wBAAgB,cAAc,SAW7B;AAED,wBAAgB,qBAAqB,SAGpC;AAED,wBAAgB,cAAc,SAgB7B;AAED,wBAAgB,kBAAkB,SAWjC;AAGD,wBAAgB,uBAAuB,SAUtC;AAED,wBAAgB,gBAAgB,SAS/B;AAED,wBAAgB,mBAAmB,SAgBlC;AAED,wBAAgB,iBAAiB,SAShC;AAED,wBAAgB,uBAAuB,SAWtC;AAED,wBAAgB,gBAAgB,SAQ/B;AAED,wBAAgB,uBAAuB,SActC;AAGD,wBAAgB,sBAAsB,SAcrC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exports-module.d.ts","sourceRoot":"","sources":["../src/exports-module.ts"],"names":[],"mappings":"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"}
package/dist/exports.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("./chunks/Logger-D8pK7XXt.js");require("./chunks/environment-Dm66zOML.js");const r=require("./chunks/RemoteLogHandler-ymkQ97xl.js");class ExportLogger extends e.Logger{exportLogHandler;remoteHandlers=[];constructor(r={}){super(r),r.bufferSize&&(this.exportLogHandler=new e.ExportLogHandler(r.bufferSize),this.addHandler(this.exportLogHandler))}async exportLogs(e,r){if(!this.exportLogHandler)throw new Error("Export handler not initialized. Set bufferSize in constructor.");return JSON.stringify([])}getLogs(){return this.exportLogHandler,[]}clearLogs(){this.exportLogHandler}getLogStats(){return this.exportLogHandler,{}}addRemoteHandler(e,t){const o=new r.RemoteLogHandler(e,t);this.remoteHandlers.push(o),this.addHandler(o)}clearRemoteHandlers(){const e=this.getHandlers();this.remoteHandlers.forEach(r=>{const t=e.indexOf(r);t>-1&&e.splice(t,1)}),this.remoteHandlers=[]}async flushRemoteHandlers(){const e=this.remoteHandlers.map(e=>Promise.resolve());await Promise.all(e)}}const t=new ExportLogger({bufferSize:1e3}),o={exportCSV:async e=>await t.exportLogs("csv",e),exportJSON:async e=>await t.exportLogs("json",e),exportXML:async e=>await t.exportLogs("xml",e),getStats:()=>t.getLogStats(),clear(){t.clearLogs()}},s={addEndpoint(e,r){t.addRemoteHandler(e,r)},clearEndpoints(){t.clearRemoteHandlers()},async flush(){await t.flushRemoteHandlers()}};exports.ExportLogHandler=e.ExportLogHandler,exports.RemoteLogHandler=r.RemoteLogHandler,exports.ExportLogger=ExportLogger,exports.addHandler=e=>t.addHandler(e),exports.addRemoteHandler=(e,r)=>t.addRemoteHandler(e,r),exports.clearLogs=()=>t.clearLogs(),exports.clearRemoteHandlers=()=>t.clearRemoteHandlers(),exports.critical=(...e)=>t.critical(...e),exports.debug=(...e)=>t.debug(...e),exports.default=t,exports.error=(...e)=>t.error(...e),exports.exportLogs=async(e,r)=>await t.exportLogs(e,r),exports.exportUtils=o,exports.flushRemoteHandlers=async()=>await t.flushRemoteHandlers(),exports.getLogStats=()=>t.getLogStats(),exports.getLogs=()=>t.getLogs(),exports.group=(e,r)=>t.group(e,r),exports.groupEnd=()=>t.groupEnd(),exports.info=(...e)=>t.info(...e),exports.remoteUtils=s,exports.scope=e=>t.scope(e),exports.setGlobalPrefix=e=>t.setGlobalPrefix(e),exports.setVerbosity=e=>t.setVerbosity(e),exports.success=(...e)=>t.success(...e),exports.table=(e,r)=>t.table(e,r),exports.time=e=>t.time(e),exports.timeEnd=e=>t.timeEnd(e),exports.trace=(...e)=>t.trace(...e),exports.warn=(...e)=>t.warn(...e);
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("./chunks/Logger-DMjlVQWi.js");require("./chunks/environment--eaTrhRu.js");const r=require("./chunks/RemoteLogHandler-ymkQ97xl.js");class ExportLogger extends e.Logger{exportLogHandler;remoteHandlers=[];constructor(r={}){super(r),r.bufferSize&&(this.exportLogHandler=new e.ExportLogHandler(r.bufferSize),this.addHandler(this.exportLogHandler))}async exportLogs(e,r){if(!this.exportLogHandler)throw new Error("Export handler not initialized. Set bufferSize in constructor.");return JSON.stringify([])}getLogs(){return this.exportLogHandler,[]}clearLogs(){this.exportLogHandler}getLogStats(){return this.exportLogHandler,{}}addRemoteHandler(e,t){const o=new r.RemoteLogHandler(e,t);this.remoteHandlers.push(o),this.addHandler(o)}clearRemoteHandlers(){const e=this.getHandlers();this.remoteHandlers.forEach(r=>{const t=e.indexOf(r);t>-1&&e.splice(t,1)}),this.remoteHandlers=[]}async flushRemoteHandlers(){const e=this.remoteHandlers.map(e=>Promise.resolve());await Promise.all(e)}}const t=new ExportLogger({bufferSize:1e3}),o={exportCSV:async e=>await t.exportLogs("csv",e),exportJSON:async e=>await t.exportLogs("json",e),exportXML:async e=>await t.exportLogs("xml",e),getStats:()=>t.getLogStats(),clear(){t.clearLogs()}},s={addEndpoint(e,r){t.addRemoteHandler(e,r)},clearEndpoints(){t.clearRemoteHandlers()},async flush(){await t.flushRemoteHandlers()}};exports.ExportLogHandler=e.ExportLogHandler,exports.RemoteLogHandler=r.RemoteLogHandler,exports.ExportLogger=ExportLogger,exports.addHandler=e=>t.addHandler(e),exports.addRemoteHandler=(e,r)=>t.addRemoteHandler(e,r),exports.clearLogs=()=>t.clearLogs(),exports.clearRemoteHandlers=()=>t.clearRemoteHandlers(),exports.critical=(...e)=>t.critical(...e),exports.debug=(...e)=>t.debug(...e),exports.default=t,exports.error=(...e)=>t.error(...e),exports.exportLogs=async(e,r)=>await t.exportLogs(e,r),exports.exportUtils=o,exports.flushRemoteHandlers=async()=>await t.flushRemoteHandlers(),exports.getLogStats=()=>t.getLogStats(),exports.getLogs=()=>t.getLogs(),exports.group=(e,r)=>t.group(e,r),exports.groupEnd=()=>t.groupEnd(),exports.info=(...e)=>t.info(...e),exports.remoteUtils=s,exports.scope=e=>t.scope(e),exports.setGlobalPrefix=e=>t.setGlobalPrefix(e),exports.setVerbosity=e=>t.setVerbosity(e),exports.success=(...e)=>t.success(...e),exports.table=(e,r)=>t.table(e,r),exports.time=e=>t.time(e),exports.timeEnd=e=>t.timeEnd(e),exports.trace=(...e)=>t.trace(...e),exports.warn=(...e)=>t.warn(...e);
2
2
  //# sourceMappingURL=exports.cjs.map
package/dist/exports.js CHANGED
@@ -1,5 +1,5 @@
1
- import { L as Logger, E as ExportLogHandler } from "./chunks/Logger-CTAaDeZi.js";
2
- import "./chunks/environment-Bxbnw4pd.js";
1
+ import { L as Logger, E as ExportLogHandler } from "./chunks/Logger-BynuRJQf.js";
2
+ import "./chunks/environment-BanAyF-K.js";
3
3
  import { R as RemoteLogHandler } from "./chunks/RemoteLogHandler-CjWpWZGl.js";
4
4
  class ExportLogger extends Logger {
5
5
  exportLogHandler;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnalyticsLogHandler.d.ts","sourceRoot":"","sources":["../../src/handlers/AnalyticsLogHandler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAE5E;;GAEG;AACH,qBAAa,mBAAoB,YAAW,WAAW;IACnD,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,WAAW,GAAG,IAAI;CAWtF"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExportLogHandler.d.ts","sourceRoot":"","sources":["../../src/handlers/ExportLogHandler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACR,WAAW,EACX,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,aAAa,EACb,aAAa,EACb,YAAY,EACZ,WAAW,EACX,YAAY,EACf,MAAM,mBAAmB,CAAC;AAK3B;;GAEG;AACH,qBAAa,gBAAiB,YAAW,WAAW;IAChD,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,YAAY,CAAC,CAAS;gBAElB,OAAO,GAAE,MAAmC;IAIxD;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,WAAW,GAAG,IAAI;IAsBlF;;OAEG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI;IAKrD;;OAEG;IACH,cAAc,IAAI,WAAW;IAuC7B;;OAEG;IACH,WAAW,IAAI,IAAI;IAInB;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IASjC;;OAEG;IACH,OAAO,CAAC,UAAU;IAkElB;;OAEG;IACH,OAAO,CAAC,UAAU;IAkBlB;;OAEG;IACH,OAAO,CAAC,SAAS;IA2BjB;;OAEG;IACH,OAAO,CAAC,cAAc;IAsDtB;;OAEG;IACH,OAAO,CAAC,WAAW;IAWnB;;OAEG;IACH,OAAO,CAAC,UAAU;IA2DlB;;OAEG;IACH,OAAO,CAAC,aAAa;IAWrB;;OAEG;IACH,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,GAAE,aAAkB,EAAE,OAAO,GAAE,aAAkB,GAAG,YAAY;IAqCpG;;OAEG;IACG,eAAe,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,GAAE,aAAkB,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,OAAO,CAAC;IA0BvH;;OAEG;IACH,UAAU,IAAI,QAAQ,EAAE;IAIxB;;OAEG;IACG,UAAU,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,GAAE,aAAkB,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,OAAO,CAAC;IA0BlH;;OAEG;IACH,OAAO,CAAC,WAAW;IAWnB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAOxB;;OAEG;IACG,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,EAAE,OAAO,GAAE;QAC3E,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,MAAM,CAAC,EAAE,YAAY,CAAA;KACnB,GAAG,OAAO,CAAC,OAAO,CAAC;IA4CzB;;OAEG;IACH,kBAAkB,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,GAAE,aAAkB,EAAE,OAAO,GAAE,aAAkB,GAAG,YAAY;IAsBhH;;OAEG;IACH,OAAO,CAAC,mBAAmB;CAQ9B"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileLogHandler.d.ts","sourceRoot":"","sources":["../../src/handlers/FileLogHandler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAI5E;;;GAGG;AACH,qBAAa,cAAe,YAAW,WAAW;IAC9C,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,OAAO,CAAC,CAAS;IACzB,OAAO,CAAC,EAAE,CAAC,CAAM;gBAEL,QAAQ,GAAE,MAAkB,EAAE,OAAO,CAAC,EAAE,MAAM;IAc1D,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,WAAW,GAAG,IAAI;IAsBlF;;OAEG;IACH,OAAO,CAAC,aAAa;IAuBrB;;OAEG;IACH,OAAO,CAAC,eAAe;IAyBvB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA0BxB;;OAEG;IACH,OAAO,IAAI,MAAM,GAAG,IAAI;IAcxB;;OAEG;IACH,SAAS,IAAI,IAAI;CAYpB"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RemoteLogHandler.d.ts","sourceRoot":"","sources":["../../src/handlers/RemoteLogHandler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAE5E;;GAEG;AACH,qBAAa,gBAAiB,YAAW,WAAW;IAChD,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,MAAM,CAAC,CAAS;gBAEZ,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;IAKvC,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;CAuBpG"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/handlers/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC"}
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("./chunks/Logger-D8pK7XXt.js"),t=require("./chunks/environment-Dm66zOML.js"),r=require("./chunks/formatting-DNCAV66-.js"),o=require("./chunks/RemoteLogHandler-ymkQ97xl.js");let s=null;function getLogger(){return s||(s=new e.Logger),s}const i=getLogger(),l={success:t.StylePresets.success().build(),error:t.StylePresets.error().build(),warning:t.StylePresets.warning().build(),info:t.StylePresets.info().build(),accent:t.StylePresets.accent().build()};exports.BANNER_VARIANTS=e.BANNER_VARIANTS,exports.Logger=e.Logger,exports.THEME_BANNERS=e.THEME_BANNERS,exports.THEME_PRESETS=e.THEME_PRESETS,exports.DEFAULT_CONFIG=t.DEFAULT_CONFIG,exports.StyleBuilder=t.StyleBuilder,exports.StylePresets=t.StylePresets,exports.formatTimestamp=t.formatTimestamp,exports.parseStackTrace=t.parseStackTrace,exports.RemoteLogHandler=o.RemoteLogHandler,exports.AnalyticsLogHandler=class{handle(e,t,r,o){"error"!==e&&"critical"!==e||o.timestamp}},exports.FileLogHandler=class{filename;maxSize;fs;constructor(e="app.log",r){if(this.filename=e,this.maxSize=r,t.isNode)try{this.fs=require("fs")}catch(o){console.warn("FileLogHandler: Unable to load fs module:",o)}}handle(e,o,s,i){const l={timestamp:i.timestamp,level:e.toUpperCase(),prefix:i.prefix,message:o,args:s.slice(1).map(e=>r.safeSerialize(e)),location:i.stackInfo},g=this.formatLogLine(l);t.isNode&&this.fs?this.writeToFileNode(g):t.isBrowser?this.writeToFileLocal(g):console.log(`[FILE-LOG] ${g}`)}formatLogLine(e){let t=[e.timestamp,`[${e.level}]`,e.prefix?`[${e.prefix}]`:"",e.message].filter(Boolean).join(" ");return e.args&&e.args.length>0&&(t+=" "+e.args.map(e=>"object"==typeof e?JSON.stringify(e):String(e)).join(" ")),e.location&&(t+=` (${e.location.file}:${e.location.line}:${e.location.column})`),t}writeToFileNode(e){if(this.fs)try{if(this.maxSize)try{if(this.fs.statSync(this.filename).size>this.maxSize){const e=`${this.filename}.bak`;this.fs.renameSync(this.filename,e)}}catch(t){}this.fs.appendFileSync(this.filename,e+"\n","utf8")}catch(t){console.error("FileLogHandler: Failed to write to file:",t)}}writeToFileLocal(e){try{const t=`logger_${this.filename}`,r=localStorage.getItem(t)||"";let o=r;if(r.length>0&&(o+="\n"),o+=e,this.maxSize||o.split("\n").length>1e3){const e=o.split("\n"),t=this.maxSize?Math.floor(this.maxSize/100):1e3;e.length>t&&(o=e.slice(-t).join("\n"))}localStorage.setItem(t,o)}catch(t){console.error("FileLogHandler: Failed to write to localStorage:",t)}}getLogs(){if(t.isNode&&this.fs)try{return this.fs.readFileSync(this.filename,"utf8")}catch(e){return null}else if(t.isBrowser){const e=`logger_${this.filename}`;return localStorage.getItem(e)}return null}clearLogs(){if(t.isNode&&this.fs)try{this.fs.writeFileSync(this.filename,"","utf8")}catch(e){console.error("FileLogHandler: Failed to clear file:",e)}else if(t.isBrowser){const e=`logger_${this.filename}`;localStorage.removeItem(e)}}},exports.addHandler=e=>getLogger().addHandler(e),exports.cli=e=>getLogger().cli(e),exports.createStyle=()=>new t.StyleBuilder,exports.critical=(...e)=>getLogger().critical(...e),exports.debug=(...e)=>getLogger().debug(...e),exports.default=i,exports.error=(...e)=>getLogger().error(...e),exports.group=(e,t)=>getLogger().group(e,t),exports.groupEnd=()=>getLogger().groupEnd(),exports.info=(...e)=>getLogger().info(...e),exports.logAnimated=(e,t)=>getLogger().logAnimated(e,t),exports.logWithSVG=(e,t,r)=>getLogger().logWithSVG(e,t,r),exports.scope=e=>getLogger().scope(e),exports.setBannerType=e=>getLogger().setBannerType(e),exports.setGlobalPrefix=e=>getLogger().setGlobalPrefix(e),exports.setTheme=e=>getLogger().setTheme(e),exports.setVerbosity=e=>getLogger().setVerbosity(e),exports.showBanner=e=>getLogger().showBanner(e),exports.stylePresets=l,exports.success=(...e)=>getLogger().success(...e),exports.table=(e,t)=>getLogger().table(e,t),exports.time=e=>getLogger().time(e),exports.timeEnd=e=>getLogger().timeEnd(e),exports.trace=(...e)=>getLogger().trace(...e),exports.warn=(...e)=>getLogger().warn(...e);
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("./chunks/Logger-DMjlVQWi.js"),t=require("./chunks/environment--eaTrhRu.js"),r=require("./chunks/formatting-BSNvAxLK.js"),o=require("./chunks/RemoteLogHandler-ymkQ97xl.js");let s=null;function getLogger(){return s||(s=new e.Logger),s}const i=getLogger(),a={success:t.StylePresets.success().build(),error:t.StylePresets.error().build(),warning:t.StylePresets.warning().build(),info:t.StylePresets.info().build(),accent:t.StylePresets.accent().build()};exports.BANNER_VARIANTS=e.BANNER_VARIANTS,exports.Logger=e.Logger,exports.THEME_BANNERS=e.THEME_BANNERS,exports.THEME_PRESETS=e.THEME_PRESETS,exports.BUILD_PRESETS=t.BUILD_PRESETS,exports.DEFAULT_CONFIG=t.DEFAULT_CONFIG,exports.ENVIRONMENT_DETECTION=t.ENVIRONMENT_DETECTION,exports.StyleBuilder=t.StyleBuilder,exports.StylePresets=t.StylePresets,exports.detectEnvironmentPreset=t.detectEnvironmentPreset,exports.formatTimestamp=t.formatTimestamp,exports.getOptimalConfig=t.getOptimalConfig,exports.parseStackTrace=t.parseStackTrace,exports.BUILD_FORMATTERS=r.BUILD_FORMATTERS,exports.ansiBackground=r.ansiBackground,exports.ansiBold=r.ansiBold,exports.ansiColor=r.ansiColor,exports.ansiDim=r.ansiDim,exports.ansiStyle=r.ansiStyle,exports.ansiUnderline=r.ansiUnderline,exports.createANSIOutput=r.createANSIOutput,exports.createBuildOutput=r.createBuildOutput,exports.createCIOutput=r.createCIOutput,exports.createOutput=r.createOutput,exports.detectOptimalFormat=r.detectOptimalFormat,exports.formatLogLevelANSI=r.formatLogLevelANSI,exports.formatSuccessANSI=r.formatSuccessANSI,exports.sanitizeEmojis=r.sanitizeEmojis,exports.RemoteLogHandler=o.RemoteLogHandler,exports.AnalyticsLogHandler=class{handle(e,t,r,o){"error"!==e&&"critical"!==e||o.timestamp}},exports.FileLogHandler=class{filename;maxSize;fs;constructor(e="app.log",r){if(this.filename=e,this.maxSize=r,t.isNode)try{this.fs=require("fs")}catch(o){console.warn("FileLogHandler: Unable to load fs module:",o)}}handle(e,o,s,i){const a={timestamp:i.timestamp,level:e.toUpperCase(),prefix:i.prefix,message:o,args:s.slice(1).map(e=>r.safeSerialize(e)),location:i.stackInfo},l=this.formatLogLine(a);t.isNode&&this.fs?this.writeToFileNode(l):t.isBrowser?this.writeToFileLocal(l):console.log(`[FILE-LOG] ${l}`)}formatLogLine(e){let t=[e.timestamp,`[${e.level}]`,e.prefix?`[${e.prefix}]`:"",e.message].filter(Boolean).join(" ");return e.args&&e.args.length>0&&(t+=" "+e.args.map(e=>"object"==typeof e?JSON.stringify(e):String(e)).join(" ")),e.location&&(t+=` (${e.location.file}:${e.location.line}:${e.location.column})`),t}writeToFileNode(e){if(this.fs)try{if(this.maxSize)try{if(this.fs.statSync(this.filename).size>this.maxSize){const e=`${this.filename}.bak`;this.fs.renameSync(this.filename,e)}}catch(t){}this.fs.appendFileSync(this.filename,e+"\n","utf8")}catch(t){console.error("FileLogHandler: Failed to write to file:",t)}}writeToFileLocal(e){try{const t=`logger_${this.filename}`,r=localStorage.getItem(t)||"";let o=r;if(r.length>0&&(o+="\n"),o+=e,this.maxSize||o.split("\n").length>1e3){const e=o.split("\n"),t=this.maxSize?Math.floor(this.maxSize/100):1e3;e.length>t&&(o=e.slice(-t).join("\n"))}localStorage.setItem(t,o)}catch(t){console.error("FileLogHandler: Failed to write to localStorage:",t)}}getLogs(){if(t.isNode&&this.fs)try{return this.fs.readFileSync(this.filename,"utf8")}catch(e){return null}else if(t.isBrowser){const e=`logger_${this.filename}`;return localStorage.getItem(e)}return null}clearLogs(){if(t.isNode&&this.fs)try{this.fs.writeFileSync(this.filename,"","utf8")}catch(e){console.error("FileLogHandler: Failed to clear file:",e)}else if(t.isBrowser){const e=`logger_${this.filename}`;localStorage.removeItem(e)}}},exports.addHandler=e=>getLogger().addHandler(e),exports.cli=e=>getLogger().cli(e),exports.createStyle=()=>new t.StyleBuilder,exports.critical=(...e)=>getLogger().critical(...e),exports.debug=(...e)=>getLogger().debug(...e),exports.default=i,exports.error=(...e)=>getLogger().error(...e),exports.group=(e,t)=>getLogger().group(e,t),exports.groupEnd=()=>getLogger().groupEnd(),exports.info=(...e)=>getLogger().info(...e),exports.logAnimated=(e,t)=>getLogger().logAnimated(e,t),exports.logWithSVG=(e,t,r)=>getLogger().logWithSVG(e,t,r),exports.scope=e=>getLogger().scope(e),exports.setBannerType=e=>getLogger().setBannerType(e),exports.setGlobalPrefix=e=>getLogger().setGlobalPrefix(e),exports.setTheme=e=>getLogger().setTheme(e),exports.setVerbosity=e=>getLogger().setVerbosity(e),exports.showBanner=e=>getLogger().showBanner(e),exports.stylePresets=a,exports.success=(...e)=>getLogger().success(...e),exports.table=(e,t)=>getLogger().table(e,t),exports.time=e=>getLogger().time(e),exports.timeEnd=e=>getLogger().timeEnd(e),exports.trace=(...e)=>getLogger().trace(...e),exports.warn=(...e)=>getLogger().warn(...e);
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/index.ts","../src/handlers/AnalyticsLogHandler.ts","../src/handlers/FileLogHandler.ts"],"sourcesContent":["/**\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} 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 = (prefix: string) => getLogger().scope(prefix);\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// 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} 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// Constants\nexport { DEFAULT_CONFIG } from './constants.js';\n\n// Utility exports\nexport {\n parseStackTrace,\n formatTimestamp\n} from './utils/index.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 * @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 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}"],"names":["_logger","getLogger","Logger","index","stylePresets","success","StylePresets","build","error","warning","info","accent","handle","level","message","_args","metadata","timestamp","filename","maxSize","fs","constructor","this","isNode","require","console","warn","args","logEntry","toUpperCase","prefix","slice","map","arg","safeSerialize","location","stackInfo","logLine","formatLogLine","writeToFileNode","isBrowser","writeToFileLocal","log","entry","line","filter","Boolean","join","length","JSON","stringify","String","file","column","statSync","size","backupName","renameSync","appendFileSync","storageKey","existingLogs","localStorage","getItem","newLogs","split","lines","maxLines","Math","floor","setItem","getLogs","readFileSync","clearLogs","writeFileSync","removeItem","handler","addHandler","command","cli","StyleBuilder","critical","debug","label","collapsed","group","groupEnd","duration","logAnimated","svgContent","options","logWithSVG","scope","bannerType","setBannerType","setGlobalPrefix","theme","setTheme","setVerbosity","showBanner","data","columns","table","time","timeEnd","trace"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../src/index.ts","../src/handlers/AnalyticsLogHandler.ts","../src/handlers/FileLogHandler.ts"],"sourcesContent":["/**\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} 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 = (prefix: string) => getLogger().scope(prefix);\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// 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 OutputFormat\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// 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 * @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 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}"],"names":["_logger","getLogger","Logger","index","stylePresets","success","StylePresets","build","error","warning","info","accent","handle","level","message","_args","metadata","timestamp","filename","maxSize","fs","constructor","this","isNode","require","console","warn","args","logEntry","toUpperCase","prefix","slice","map","arg","safeSerialize","location","stackInfo","logLine","formatLogLine","writeToFileNode","isBrowser","writeToFileLocal","log","entry","line","filter","Boolean","join","length","JSON","stringify","String","file","column","statSync","size","backupName","renameSync","appendFileSync","storageKey","existingLogs","localStorage","getItem","newLogs","split","lines","maxLines","Math","floor","setItem","getLogs","readFileSync","clearLogs","writeFileSync","removeItem","handler","addHandler","command","cli","StyleBuilder","critical","debug","label","collapsed","group","groupEnd","duration","logAnimated","svgContent","options","logWithSVG","scope","bannerType","setBannerType","setGlobalPrefix","theme","setTheme","setVerbosity","showBanner","data","columns","table","time","timeEnd","trace"],"mappings":"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"}