@mks2508/better-logger 2.0.0 → 2.1.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 (125) hide show
  1. package/bun.lock +333 -0
  2. package/dist/Logger.d.ts +704 -0
  3. package/dist/Logger.d.ts.map +1 -0
  4. package/dist/ScopedLogger.d.ts +310 -0
  5. package/dist/ScopedLogger.d.ts.map +1 -0
  6. package/dist/chunks/Logger-B7L-ujY4.js +3503 -0
  7. package/dist/chunks/Logger-B7L-ujY4.js.map +1 -0
  8. package/dist/chunks/Logger-DzU_c5sX.js +2 -0
  9. package/dist/chunks/Logger-DzU_c5sX.js.map +1 -0
  10. package/dist/chunks/RemoteLogHandler-CjWpWZGl.js +33 -0
  11. package/dist/chunks/RemoteLogHandler-CjWpWZGl.js.map +1 -0
  12. package/dist/chunks/RemoteLogHandler-ymkQ97xl.js +2 -0
  13. package/dist/chunks/RemoteLogHandler-ymkQ97xl.js.map +1 -0
  14. package/dist/chunks/ScopedLogger-BY3-E8Ov.js +2 -0
  15. package/dist/chunks/ScopedLogger-BY3-E8Ov.js.map +1 -0
  16. package/dist/chunks/ScopedLogger-D-RbiFZn.js +361 -0
  17. package/dist/chunks/ScopedLogger-D-RbiFZn.js.map +1 -0
  18. package/dist/chunks/environment-Ba5kShbx.js +4 -0
  19. package/dist/chunks/environment-Ba5kShbx.js.map +1 -0
  20. package/dist/chunks/environment-TI2ByCPT.js +1209 -0
  21. package/dist/chunks/environment-TI2ByCPT.js.map +1 -0
  22. package/dist/chunks/formatting-Blwy-f0W.js +2 -0
  23. package/dist/chunks/formatting-Blwy-f0W.js.map +1 -0
  24. package/dist/chunks/formatting-CuNUqGks.js +380 -0
  25. package/dist/chunks/formatting-CuNUqGks.js.map +1 -0
  26. package/dist/cli/CommandProcessor.d.ts +100 -0
  27. package/dist/cli/CommandProcessor.d.ts.map +1 -0
  28. package/dist/cli/commands/ConfigCommand.d.ts +14 -0
  29. package/dist/cli/commands/ConfigCommand.d.ts.map +1 -0
  30. package/dist/cli/commands/ExportCommand.d.ts +48 -0
  31. package/dist/cli/commands/ExportCommand.d.ts.map +1 -0
  32. package/dist/cli/commands/HistoryCommand.d.ts +47 -0
  33. package/dist/cli/commands/HistoryCommand.d.ts.map +1 -0
  34. package/dist/cli/commands/StatusCommand.d.ts +30 -0
  35. package/dist/cli/commands/StatusCommand.d.ts.map +1 -0
  36. package/dist/cli/commands/ThemeCommand.d.ts +30 -0
  37. package/dist/cli/commands/ThemeCommand.d.ts.map +1 -0
  38. package/dist/cli/help.d.ts +12 -0
  39. package/dist/cli/help.d.ts.map +1 -0
  40. package/dist/cli/index.d.ts +15 -0
  41. package/dist/cli/index.d.ts.map +1 -0
  42. package/dist/constants.d.ts +227 -0
  43. package/dist/constants.d.ts.map +1 -0
  44. package/dist/core.cjs +2 -0
  45. package/dist/core.cjs.map +1 -0
  46. package/dist/core.d.ts +127 -0
  47. package/dist/core.d.ts.map +1 -0
  48. package/dist/core.js +291 -0
  49. package/dist/core.js.map +1 -0
  50. package/dist/example.d.ts +18 -0
  51. package/dist/example.d.ts.map +1 -0
  52. package/dist/exports-module.d.ts +196 -0
  53. package/dist/exports-module.d.ts.map +1 -0
  54. package/dist/exports.cjs +2 -0
  55. package/dist/exports.cjs.map +1 -0
  56. package/dist/exports.js +238 -0
  57. package/dist/exports.js.map +1 -0
  58. package/dist/handlers/AnalyticsLogHandler.d.ts +8 -0
  59. package/dist/handlers/AnalyticsLogHandler.d.ts.map +1 -0
  60. package/dist/handlers/ExportLogHandler.d.ts +100 -0
  61. package/dist/handlers/ExportLogHandler.d.ts.map +1 -0
  62. package/dist/handlers/FileLogHandler.d.ts +33 -0
  63. package/dist/handlers/FileLogHandler.d.ts.map +1 -0
  64. package/dist/handlers/RemoteLogHandler.d.ts +11 -0
  65. package/dist/handlers/RemoteLogHandler.d.ts.map +1 -0
  66. package/dist/handlers/index.d.ts +8 -0
  67. package/dist/handlers/index.d.ts.map +1 -0
  68. package/dist/index.cjs +2 -0
  69. package/dist/index.cjs.map +1 -0
  70. package/dist/index.d.ts +124 -0
  71. package/dist/index.d.ts.map +1 -0
  72. package/dist/index.js +247 -0
  73. package/dist/index.js.map +1 -0
  74. package/dist/main.d.ts +2 -0
  75. package/dist/main.d.ts.map +1 -0
  76. package/dist/styling/LogStyleBuilder.d.ts +146 -0
  77. package/dist/styling/LogStyleBuilder.d.ts.map +1 -0
  78. package/dist/styling/SemanticStyles.d.ts +178 -0
  79. package/dist/styling/SemanticStyles.d.ts.map +1 -0
  80. package/dist/styling/SmartPresets.d.ts +22 -0
  81. package/dist/styling/SmartPresets.d.ts.map +1 -0
  82. package/dist/styling/StyleBuilder.d.ts +140 -0
  83. package/dist/styling/StyleBuilder.d.ts.map +1 -0
  84. package/dist/styling/banners.d.ts +42 -0
  85. package/dist/styling/banners.d.ts.map +1 -0
  86. package/dist/styling/index.d.ts +10 -0
  87. package/dist/styling/index.d.ts.map +1 -0
  88. package/dist/styling/themes.d.ts +7 -0
  89. package/dist/styling/themes.d.ts.map +1 -0
  90. package/dist/styling-module.d.ts +178 -0
  91. package/dist/styling-module.d.ts.map +1 -0
  92. package/dist/styling.cjs +2 -0
  93. package/dist/styling.cjs.map +1 -0
  94. package/dist/styling.js +146 -0
  95. package/dist/styling.js.map +1 -0
  96. package/dist/terminal/terminal-renderer.d.ts +63 -0
  97. package/dist/terminal/terminal-renderer.d.ts.map +1 -0
  98. package/dist/types/core.d.ts +234 -0
  99. package/dist/types/core.d.ts.map +1 -0
  100. package/dist/types/handlers.d.ts +85 -0
  101. package/dist/types/handlers.d.ts.map +1 -0
  102. package/dist/types/index.d.ts +7 -0
  103. package/dist/types/index.d.ts.map +1 -0
  104. package/dist/utils/adapter.d.ts +48 -0
  105. package/dist/utils/adapter.d.ts.map +1 -0
  106. package/dist/utils/ansi-colors.d.ts +156 -0
  107. package/dist/utils/ansi-colors.d.ts.map +1 -0
  108. package/dist/utils/environment-detector.d.ts +35 -0
  109. package/dist/utils/environment-detector.d.ts.map +1 -0
  110. package/dist/utils/environment.d.ts +47 -0
  111. package/dist/utils/environment.d.ts.map +1 -0
  112. package/dist/utils/formatting.d.ts +58 -0
  113. package/dist/utils/formatting.d.ts.map +1 -0
  114. package/dist/utils/index.d.ts +8 -0
  115. package/dist/utils/index.d.ts.map +1 -0
  116. package/dist/utils/opentui-detection.d.ts +34 -0
  117. package/dist/utils/opentui-detection.d.ts.map +1 -0
  118. package/dist/utils/output.d.ts +46 -0
  119. package/dist/utils/output.d.ts.map +1 -0
  120. package/dist/utils/stackTrace.d.ts +6 -0
  121. package/dist/utils/stackTrace.d.ts.map +1 -0
  122. package/dist/utils/timestamps.d.ts +20 -0
  123. package/dist/utils/timestamps.d.ts.map +1 -0
  124. package/dist/vite.svg +1 -0
  125. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScopedLogger-BY3-E8Ov.js","sources":["../../src/ScopedLogger.ts"],"sourcesContent":["/**\n * @fileoverview ScopedLogger con badges y logging contextual\n * @version 0.3.0\n * @since 2024\n * \n * Proporciona loggers especializados con contexto, badges automáticos\n * y características avanzadas para componentes y APIs.\n */\n\nimport { Logger } from './Logger.js';\nimport type { LoggerConfig, LogLevel, Verbosity, BannerType, StyleOptions, ILogHandler } from './types/index.js';\n\n/**\n * Logger con scope mejorado con badges y API simplificada\n * \n * @class ScopedLogger\n * @extends Logger\n * @description Logger contextual que añade prefijos y badges automáticamente\n * \n * @example\n * const dbLogger = logger.scope('Database');\n * dbLogger.info('Conectando...'); // [Database] Conectando...\n * \n * // Con badges personalizados\n * dbLogger.badge('SLOW').warn('Query lenta detectada');\n * // [SLOW] [Database] Query lenta detectada\n * \n * @since 0.3.0\n */\nexport class ScopedLogger extends Logger {\n private parentLogger: Logger;\n private scopeName: string;\n private badgeList: string[] = [];\n private contextStack: string[] = [];\n\n constructor(parentLogger: Logger, scopeName: string, config?: Partial<LoggerConfig>) {\n // Initialize with parent's config plus any overrides\n super({ ...parentLogger.getConfig(), ...config });\n this.parentLogger = parentLogger;\n this.scopeName = scopeName;\n \n // Inherit parent's handlers\n const parentHandlers = parentLogger.getHandlers();\n parentHandlers.forEach(handler => this.addHandler(handler));\n }\n\n /**\n * Añade múltiples badges a este logger con scope\n * \n * @param {string[]} badges - Array de badges a añadir\n * @returns {ScopedLogger} Esta instancia para encadenamiento\n * \n * @example\n * const api = logger.scope('API');\n * api.badges(['v2', 'beta', 'cached'])\n * .info('Respuesta desde caché');\n * // [v2] [beta] [cached] [API] Respuesta desde caché\n * \n * @since 0.3.0\n */\n badges(badges: string[]): ScopedLogger {\n this.badgeList = [...badges];\n return this;\n }\n\n /**\n * Añade un badge individual\n * \n * @param {string} badge - Badge a añadir\n * @returns {ScopedLogger} Esta instancia para encadenamiento\n * \n * @example\n * dbLogger.badge('SLOW').warn('Query tardó 3s');\n * // [SLOW] [Database] Query tardó 3s\n * \n * @since 0.3.0\n */\n badge(badge: string): ScopedLogger {\n if (!this.badgeList.includes(badge)) {\n this.badgeList.push(badge);\n }\n return this;\n }\n\n /**\n * Elimina todos los badges\n * \n * @returns {ScopedLogger} Esta instancia para encadenamiento\n * \n * @example\n * api.clearBadges().info('Sin badges');\n * // [API] Sin badges\n * \n * @since 0.3.0\n */\n clearBadges(): ScopedLogger {\n this.badgeList = [];\n return this;\n }\n\n /**\n * Establece un preset de estilo para este logger con scope\n * \n * @param {string} presetName - Nombre del preset a aplicar\n * @returns {ScopedLogger} Esta instancia para encadenamiento\n * \n * @example\n * const errorLogger = logger.scope('ErrorHandler')\n * .style('cyberpunk');\n * \n * @since 0.3.0\n */\n style(presetName: string): ScopedLogger {\n this.setTheme(presetName as any); // Will be updated when we implement presets\n return this;\n }\n\n /**\n * Crea un contexto temporal que se limpia automáticamente\n * \n * @param {string} contextName - Nombre del contexto\n * @returns {ContextLogger} Logger con contexto temporal\n * \n * @example\n * const db = logger.scope('Database');\n * \n * // Contexto temporal para una operación\n * db.context('Migration').run(() => {\n * db.info('Iniciando migración');\n * db.success('Tablas creadas');\n * });\n * // Contexto automáticamente limpiado\n * \n * @since 0.3.0\n */\n context(contextName: string): ContextLogger {\n return new ContextLogger(this, contextName);\n }\n\n /**\n * Sobrescribe el logging principal para incluir badges\n * @protected\n * @param {LogLevel} level - Nivel del log\n * @param {...any} args - Argumentos del log\n */\n protected log(level: LogLevel, ...args: any[]): void {\n // Build the enhanced message with badges\n const badges = this.getBadgeString();\n const scopePrefix = this.getScopePrefix();\n \n let enhancedMessage = '';\n if (badges) enhancedMessage += badges + ' ';\n if (scopePrefix) enhancedMessage += `[${scopePrefix}] `;\n \n if (args.length > 0) {\n enhancedMessage += String(args[0]);\n // Replace the first argument with our enhanced message\n args[0] = enhancedMessage;\n }\n\n // Call parent's log method\n super.log(level, ...args);\n }\n\n /**\n * Obtiene la cadena de badges formateada\n * @private\n * @returns {string} Badges formateados como [BADGE1][BADGE2]\n */\n private getBadgeString(): string {\n if (this.badgeList.length === 0) return '';\n return this.badgeList.map(badge => `[${badge}]`).join('');\n }\n\n /**\n * Obtiene el prefijo del scope (incluye stack de contexto)\n * @private\n * @returns {string} Prefijo completo con contextos\n */\n private getScopePrefix(): string {\n const parts = [this.scopeName, ...this.contextStack].filter(Boolean);\n return parts.join(':');\n }\n\n /**\n * Método interno para añadir contexto\n * @internal\n */\n _pushContext(context: string): void {\n this.contextStack.push(context);\n }\n\n /**\n * Método interno para eliminar contexto\n * @internal\n */\n _popContext(): void {\n this.contextStack.pop();\n }\n}\n\n/**\n * Logger específico para APIs con badges comunes de API\n * \n * @class APILogger\n * @extends ScopedLogger\n * @description Logger especializado para endpoints y servicios API\n * \n * @example\n * const api = logger.api('REST');\n * api.info('GET /users');\n * // [API] [REST] GET /users\n * \n * api.slow('Query lenta', 3500);\n * // [API] [SLOW] [REST] Query lenta (3500ms)\n * \n * @since 0.3.0\n */\nexport class APILogger extends ScopedLogger {\n constructor(parentLogger: Logger, apiName: string, config?: Partial<LoggerConfig>) {\n super(parentLogger, `API:${apiName}`, config);\n this.badge('API');\n }\n\n /**\n * Registra operaciones lentas\n * \n * @param {string} message - Mensaje sobre la operación lenta\n * @param {number} duration - Duración en milisegundos (opcional)\n * \n * @example\n * api.slow('Query compleja', 5000);\n * api.slow('Procesamiento pesado');\n * \n * @since 0.3.0\n */\n slow(message: string, duration?: number): void {\n this.badge('SLOW');\n const msg = duration ? `${message} (${duration}ms)` : message;\n this.warn(msg);\n }\n\n /**\n * Registra límites de tasa alcanzados\n * \n * @param {string} message - Mensaje sobre el límite\n * \n * @example\n * api.rateLimit('Límite excedido: 100 req/min');\n * \n * @since 0.3.0\n */\n rateLimit(message: string): void {\n this.badge('RATE_LIMIT');\n this.warn(message);\n }\n\n /**\n * Registra problemas de autenticación\n * \n * @param {string} message - Mensaje de autenticación\n * \n * @example\n * api.auth('Token inválido o expirado');\n * api.auth('Credenciales incorrectas');\n * \n * @since 0.3.0\n */\n auth(message: string): void {\n this.badge('AUTH');\n this.error(message);\n }\n\n /**\n * Registra advertencias de deprecación\n * \n * @param {string} message - Mensaje de deprecación\n * \n * @example\n * api.deprecated('Este endpoint será eliminado en v2.0');\n * api.deprecated('Usar /v2/users en lugar de /users');\n * \n * @since 0.3.0\n */\n deprecated(message: string): void {\n this.badge('DEPRECATED');\n this.warn(message);\n }\n}\n\n/**\n * Logger específico para componentes de UI\n * \n * @class ComponentLogger\n * @extends ScopedLogger\n * @description Logger especializado para componentes con eventos de ciclo de vida\n * \n * @example\n * const authForm = logger.component('AuthForm');\n * authForm.lifecycle('mounted');\n * authForm.stateChange('idle', 'loading');\n * \n * @since 0.3.0\n */\nexport class ComponentLogger extends ScopedLogger {\n constructor(parentLogger: Logger, componentName: string, config?: Partial<LoggerConfig>) {\n super(parentLogger, componentName, config);\n this.badge('COMPONENT');\n }\n\n /**\n * Registra eventos del ciclo de vida del componente\n * \n * @param {string} event - Nombre del evento (mounted, unmounted, updated, etc)\n * @param {string} message - Mensaje adicional (opcional)\n * \n * @example\n * component.lifecycle('mounted', 'Componente listo');\n * component.lifecycle('beforeDestroy');\n * \n * @since 0.3.0\n */\n lifecycle(event: string, message?: string): void {\n this.badge('LIFECYCLE');\n const msg = message ? `${event}: ${message}` : event;\n this.info(msg);\n }\n\n /**\n * Registra cambios de estado\n * \n * @param {string} from - Estado anterior\n * @param {string} to - Estado nuevo\n * @param {any} data - Datos adicionales (opcional)\n * \n * @example\n * component.stateChange('idle', 'loading');\n * component.stateChange('loading', 'error', { code: 404 });\n * \n * @since 0.3.0\n */\n stateChange(from: string, to: string, data?: any): void {\n this.badge('STATE');\n const msg = `${from} → ${to}`;\n if (data) {\n this.info(msg, data);\n } else {\n this.info(msg);\n }\n }\n\n /**\n * Registra cambios en las propiedades\n * \n * @param {Record<string, any>} changes - Objeto con los cambios\n * \n * @example\n * component.propsChange({\n * user: newUser,\n * isActive: true\n * });\n * \n * @since 0.3.0\n */\n propsChange(changes: Record<string, any>): void {\n this.badge('PROPS');\n this.debug('Props changed:', changes);\n }\n}\n\n/**\n * Logger de contexto temporal que se limpia automáticamente\n * \n * @class ContextLogger\n * @description Proporciona un contexto temporal para operaciones agrupadas\n * \n * @example\n * const db = logger.scope('Database');\n * \n * // El contexto se limpia automáticamente al finalizar\n * db.context('Transaction').run(() => {\n * db.info('Iniciando transacción');\n * db.success('Transacción completada');\n * });\n * \n * @since 0.3.0\n */\nexport class ContextLogger {\n private parentLogger: ScopedLogger;\n private contextName: string;\n\n constructor(parentLogger: ScopedLogger, contextName: string) {\n this.parentLogger = parentLogger;\n this.contextName = contextName;\n }\n\n /**\n * Ejecuta una función con este contexto activo\n * \n * @template T - Tipo de retorno de la función\n * @param {Function} fn - Función a ejecutar\n * @returns {T} Resultado de la función\n * \n * @example\n * const result = logger.context('Process').run(() => {\n * logger.info('Procesando...');\n * return processData();\n * });\n * \n * @since 0.3.0\n */\n run<T>(fn: () => T): T {\n this.parentLogger._pushContext(this.contextName);\n try {\n return fn();\n } finally {\n this.parentLogger._popContext();\n }\n }\n\n /**\n * Run an async function with this context active\n */\n async runAsync<T>(fn: () => Promise<T>): Promise<T> {\n this.parentLogger._pushContext(this.contextName);\n try {\n return await fn();\n } finally {\n this.parentLogger._popContext();\n }\n }\n\n /**\n * Start the context (manual mode)\n */\n start(): void {\n this.parentLogger._pushContext(this.contextName);\n }\n\n /**\n * End the context (manual mode)\n */\n end(): void {\n this.parentLogger._popContext();\n }\n\n // Delegate logging methods to parent with context\n debug(...args: any[]): void { this.parentLogger.debug(...args); }\n info(...args: any[]): void { this.parentLogger.info(...args); }\n warn(...args: any[]): void { this.parentLogger.warn(...args); }\n error(...args: any[]): void { this.parentLogger.error(...args); }\n success(...args: any[]): void { this.parentLogger.success(...args); }\n critical(...args: any[]): void { this.parentLogger.critical(...args); }\n}"],"names":["ScopedLogger","Logger","parentLogger","scopeName","badgeList","contextStack","constructor","config","super","getConfig","this","getHandlers","forEach","handler","addHandler","badges","badge","includes","push","clearBadges","style","presetName","setTheme","context","contextName","ContextLogger","log","level","args","getBadgeString","scopePrefix","getScopePrefix","enhancedMessage","length","String","map","join","filter","Boolean","_pushContext","_popContext","pop","run","fn","runAsync","start","end","debug","info","warn","error","success","critical","apiName","slow","message","duration","msg","rateLimit","auth","deprecated","componentName","lifecycle","event","stateChange","from","to","data","propsChange","changes"],"mappings":"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"}
@@ -0,0 +1,361 @@
1
+ import { L as Logger } from "./Logger-B7L-ujY4.js";
2
+ class ScopedLogger extends Logger {
3
+ parentLogger;
4
+ scopeName;
5
+ badgeList = [];
6
+ contextStack = [];
7
+ constructor(parentLogger, scopeName, config) {
8
+ super({ ...parentLogger.getConfig(), ...config });
9
+ this.parentLogger = parentLogger;
10
+ this.scopeName = scopeName;
11
+ const parentHandlers = parentLogger.getHandlers();
12
+ parentHandlers.forEach((handler) => this.addHandler(handler));
13
+ }
14
+ /**
15
+ * Añade múltiples badges a este logger con scope
16
+ *
17
+ * @param {string[]} badges - Array de badges a añadir
18
+ * @returns {ScopedLogger} Esta instancia para encadenamiento
19
+ *
20
+ * @example
21
+ * const api = logger.scope('API');
22
+ * api.badges(['v2', 'beta', 'cached'])
23
+ * .info('Respuesta desde caché');
24
+ * // [v2] [beta] [cached] [API] Respuesta desde caché
25
+ *
26
+ * @since 0.3.0
27
+ */
28
+ badges(badges) {
29
+ this.badgeList = [...badges];
30
+ return this;
31
+ }
32
+ /**
33
+ * Añade un badge individual
34
+ *
35
+ * @param {string} badge - Badge a añadir
36
+ * @returns {ScopedLogger} Esta instancia para encadenamiento
37
+ *
38
+ * @example
39
+ * dbLogger.badge('SLOW').warn('Query tardó 3s');
40
+ * // [SLOW] [Database] Query tardó 3s
41
+ *
42
+ * @since 0.3.0
43
+ */
44
+ badge(badge) {
45
+ if (!this.badgeList.includes(badge)) {
46
+ this.badgeList.push(badge);
47
+ }
48
+ return this;
49
+ }
50
+ /**
51
+ * Elimina todos los badges
52
+ *
53
+ * @returns {ScopedLogger} Esta instancia para encadenamiento
54
+ *
55
+ * @example
56
+ * api.clearBadges().info('Sin badges');
57
+ * // [API] Sin badges
58
+ *
59
+ * @since 0.3.0
60
+ */
61
+ clearBadges() {
62
+ this.badgeList = [];
63
+ return this;
64
+ }
65
+ /**
66
+ * Establece un preset de estilo para este logger con scope
67
+ *
68
+ * @param {string} presetName - Nombre del preset a aplicar
69
+ * @returns {ScopedLogger} Esta instancia para encadenamiento
70
+ *
71
+ * @example
72
+ * const errorLogger = logger.scope('ErrorHandler')
73
+ * .style('cyberpunk');
74
+ *
75
+ * @since 0.3.0
76
+ */
77
+ style(presetName) {
78
+ this.setTheme(presetName);
79
+ return this;
80
+ }
81
+ /**
82
+ * Crea un contexto temporal que se limpia automáticamente
83
+ *
84
+ * @param {string} contextName - Nombre del contexto
85
+ * @returns {ContextLogger} Logger con contexto temporal
86
+ *
87
+ * @example
88
+ * const db = logger.scope('Database');
89
+ *
90
+ * // Contexto temporal para una operación
91
+ * db.context('Migration').run(() => {
92
+ * db.info('Iniciando migración');
93
+ * db.success('Tablas creadas');
94
+ * });
95
+ * // Contexto automáticamente limpiado
96
+ *
97
+ * @since 0.3.0
98
+ */
99
+ context(contextName) {
100
+ return new ContextLogger(this, contextName);
101
+ }
102
+ /**
103
+ * Sobrescribe el logging principal para incluir badges
104
+ * @protected
105
+ * @param {LogLevel} level - Nivel del log
106
+ * @param {...any} args - Argumentos del log
107
+ */
108
+ log(level, ...args) {
109
+ const badges = this.getBadgeString();
110
+ const scopePrefix = this.getScopePrefix();
111
+ let enhancedMessage = "";
112
+ if (badges) enhancedMessage += badges + " ";
113
+ if (scopePrefix) enhancedMessage += `[${scopePrefix}] `;
114
+ if (args.length > 0) {
115
+ enhancedMessage += String(args[0]);
116
+ args[0] = enhancedMessage;
117
+ }
118
+ super.log(level, ...args);
119
+ }
120
+ /**
121
+ * Obtiene la cadena de badges formateada
122
+ * @private
123
+ * @returns {string} Badges formateados como [BADGE1][BADGE2]
124
+ */
125
+ getBadgeString() {
126
+ if (this.badgeList.length === 0) return "";
127
+ return this.badgeList.map((badge) => `[${badge}]`).join("");
128
+ }
129
+ /**
130
+ * Obtiene el prefijo del scope (incluye stack de contexto)
131
+ * @private
132
+ * @returns {string} Prefijo completo con contextos
133
+ */
134
+ getScopePrefix() {
135
+ const parts = [this.scopeName, ...this.contextStack].filter(Boolean);
136
+ return parts.join(":");
137
+ }
138
+ /**
139
+ * Método interno para añadir contexto
140
+ * @internal
141
+ */
142
+ _pushContext(context) {
143
+ this.contextStack.push(context);
144
+ }
145
+ /**
146
+ * Método interno para eliminar contexto
147
+ * @internal
148
+ */
149
+ _popContext() {
150
+ this.contextStack.pop();
151
+ }
152
+ }
153
+ class APILogger extends ScopedLogger {
154
+ constructor(parentLogger, apiName, config) {
155
+ super(parentLogger, `API:${apiName}`, config);
156
+ this.badge("API");
157
+ }
158
+ /**
159
+ * Registra operaciones lentas
160
+ *
161
+ * @param {string} message - Mensaje sobre la operación lenta
162
+ * @param {number} duration - Duración en milisegundos (opcional)
163
+ *
164
+ * @example
165
+ * api.slow('Query compleja', 5000);
166
+ * api.slow('Procesamiento pesado');
167
+ *
168
+ * @since 0.3.0
169
+ */
170
+ slow(message, duration) {
171
+ this.badge("SLOW");
172
+ const msg = duration ? `${message} (${duration}ms)` : message;
173
+ this.warn(msg);
174
+ }
175
+ /**
176
+ * Registra límites de tasa alcanzados
177
+ *
178
+ * @param {string} message - Mensaje sobre el límite
179
+ *
180
+ * @example
181
+ * api.rateLimit('Límite excedido: 100 req/min');
182
+ *
183
+ * @since 0.3.0
184
+ */
185
+ rateLimit(message) {
186
+ this.badge("RATE_LIMIT");
187
+ this.warn(message);
188
+ }
189
+ /**
190
+ * Registra problemas de autenticación
191
+ *
192
+ * @param {string} message - Mensaje de autenticación
193
+ *
194
+ * @example
195
+ * api.auth('Token inválido o expirado');
196
+ * api.auth('Credenciales incorrectas');
197
+ *
198
+ * @since 0.3.0
199
+ */
200
+ auth(message) {
201
+ this.badge("AUTH");
202
+ this.error(message);
203
+ }
204
+ /**
205
+ * Registra advertencias de deprecación
206
+ *
207
+ * @param {string} message - Mensaje de deprecación
208
+ *
209
+ * @example
210
+ * api.deprecated('Este endpoint será eliminado en v2.0');
211
+ * api.deprecated('Usar /v2/users en lugar de /users');
212
+ *
213
+ * @since 0.3.0
214
+ */
215
+ deprecated(message) {
216
+ this.badge("DEPRECATED");
217
+ this.warn(message);
218
+ }
219
+ }
220
+ class ComponentLogger extends ScopedLogger {
221
+ constructor(parentLogger, componentName, config) {
222
+ super(parentLogger, componentName, config);
223
+ this.badge("COMPONENT");
224
+ }
225
+ /**
226
+ * Registra eventos del ciclo de vida del componente
227
+ *
228
+ * @param {string} event - Nombre del evento (mounted, unmounted, updated, etc)
229
+ * @param {string} message - Mensaje adicional (opcional)
230
+ *
231
+ * @example
232
+ * component.lifecycle('mounted', 'Componente listo');
233
+ * component.lifecycle('beforeDestroy');
234
+ *
235
+ * @since 0.3.0
236
+ */
237
+ lifecycle(event, message) {
238
+ this.badge("LIFECYCLE");
239
+ const msg = message ? `${event}: ${message}` : event;
240
+ this.info(msg);
241
+ }
242
+ /**
243
+ * Registra cambios de estado
244
+ *
245
+ * @param {string} from - Estado anterior
246
+ * @param {string} to - Estado nuevo
247
+ * @param {any} data - Datos adicionales (opcional)
248
+ *
249
+ * @example
250
+ * component.stateChange('idle', 'loading');
251
+ * component.stateChange('loading', 'error', { code: 404 });
252
+ *
253
+ * @since 0.3.0
254
+ */
255
+ stateChange(from, to, data) {
256
+ this.badge("STATE");
257
+ const msg = `${from} → ${to}`;
258
+ if (data) {
259
+ this.info(msg, data);
260
+ } else {
261
+ this.info(msg);
262
+ }
263
+ }
264
+ /**
265
+ * Registra cambios en las propiedades
266
+ *
267
+ * @param {Record<string, any>} changes - Objeto con los cambios
268
+ *
269
+ * @example
270
+ * component.propsChange({
271
+ * user: newUser,
272
+ * isActive: true
273
+ * });
274
+ *
275
+ * @since 0.3.0
276
+ */
277
+ propsChange(changes) {
278
+ this.badge("PROPS");
279
+ this.debug("Props changed:", changes);
280
+ }
281
+ }
282
+ class ContextLogger {
283
+ parentLogger;
284
+ contextName;
285
+ constructor(parentLogger, contextName) {
286
+ this.parentLogger = parentLogger;
287
+ this.contextName = contextName;
288
+ }
289
+ /**
290
+ * Ejecuta una función con este contexto activo
291
+ *
292
+ * @template T - Tipo de retorno de la función
293
+ * @param {Function} fn - Función a ejecutar
294
+ * @returns {T} Resultado de la función
295
+ *
296
+ * @example
297
+ * const result = logger.context('Process').run(() => {
298
+ * logger.info('Procesando...');
299
+ * return processData();
300
+ * });
301
+ *
302
+ * @since 0.3.0
303
+ */
304
+ run(fn) {
305
+ this.parentLogger._pushContext(this.contextName);
306
+ try {
307
+ return fn();
308
+ } finally {
309
+ this.parentLogger._popContext();
310
+ }
311
+ }
312
+ /**
313
+ * Run an async function with this context active
314
+ */
315
+ async runAsync(fn) {
316
+ this.parentLogger._pushContext(this.contextName);
317
+ try {
318
+ return await fn();
319
+ } finally {
320
+ this.parentLogger._popContext();
321
+ }
322
+ }
323
+ /**
324
+ * Start the context (manual mode)
325
+ */
326
+ start() {
327
+ this.parentLogger._pushContext(this.contextName);
328
+ }
329
+ /**
330
+ * End the context (manual mode)
331
+ */
332
+ end() {
333
+ this.parentLogger._popContext();
334
+ }
335
+ // Delegate logging methods to parent with context
336
+ debug(...args) {
337
+ this.parentLogger.debug(...args);
338
+ }
339
+ info(...args) {
340
+ this.parentLogger.info(...args);
341
+ }
342
+ warn(...args) {
343
+ this.parentLogger.warn(...args);
344
+ }
345
+ error(...args) {
346
+ this.parentLogger.error(...args);
347
+ }
348
+ success(...args) {
349
+ this.parentLogger.success(...args);
350
+ }
351
+ critical(...args) {
352
+ this.parentLogger.critical(...args);
353
+ }
354
+ }
355
+ export {
356
+ APILogger,
357
+ ComponentLogger,
358
+ ContextLogger,
359
+ ScopedLogger
360
+ };
361
+ //# sourceMappingURL=ScopedLogger-D-RbiFZn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScopedLogger-D-RbiFZn.js","sources":["../../src/ScopedLogger.ts"],"sourcesContent":["/**\n * @fileoverview ScopedLogger con badges y logging contextual\n * @version 0.3.0\n * @since 2024\n * \n * Proporciona loggers especializados con contexto, badges automáticos\n * y características avanzadas para componentes y APIs.\n */\n\nimport { Logger } from './Logger.js';\nimport type { LoggerConfig, LogLevel, Verbosity, BannerType, StyleOptions, ILogHandler } from './types/index.js';\n\n/**\n * Logger con scope mejorado con badges y API simplificada\n * \n * @class ScopedLogger\n * @extends Logger\n * @description Logger contextual que añade prefijos y badges automáticamente\n * \n * @example\n * const dbLogger = logger.scope('Database');\n * dbLogger.info('Conectando...'); // [Database] Conectando...\n * \n * // Con badges personalizados\n * dbLogger.badge('SLOW').warn('Query lenta detectada');\n * // [SLOW] [Database] Query lenta detectada\n * \n * @since 0.3.0\n */\nexport class ScopedLogger extends Logger {\n private parentLogger: Logger;\n private scopeName: string;\n private badgeList: string[] = [];\n private contextStack: string[] = [];\n\n constructor(parentLogger: Logger, scopeName: string, config?: Partial<LoggerConfig>) {\n // Initialize with parent's config plus any overrides\n super({ ...parentLogger.getConfig(), ...config });\n this.parentLogger = parentLogger;\n this.scopeName = scopeName;\n \n // Inherit parent's handlers\n const parentHandlers = parentLogger.getHandlers();\n parentHandlers.forEach(handler => this.addHandler(handler));\n }\n\n /**\n * Añade múltiples badges a este logger con scope\n * \n * @param {string[]} badges - Array de badges a añadir\n * @returns {ScopedLogger} Esta instancia para encadenamiento\n * \n * @example\n * const api = logger.scope('API');\n * api.badges(['v2', 'beta', 'cached'])\n * .info('Respuesta desde caché');\n * // [v2] [beta] [cached] [API] Respuesta desde caché\n * \n * @since 0.3.0\n */\n badges(badges: string[]): ScopedLogger {\n this.badgeList = [...badges];\n return this;\n }\n\n /**\n * Añade un badge individual\n * \n * @param {string} badge - Badge a añadir\n * @returns {ScopedLogger} Esta instancia para encadenamiento\n * \n * @example\n * dbLogger.badge('SLOW').warn('Query tardó 3s');\n * // [SLOW] [Database] Query tardó 3s\n * \n * @since 0.3.0\n */\n badge(badge: string): ScopedLogger {\n if (!this.badgeList.includes(badge)) {\n this.badgeList.push(badge);\n }\n return this;\n }\n\n /**\n * Elimina todos los badges\n * \n * @returns {ScopedLogger} Esta instancia para encadenamiento\n * \n * @example\n * api.clearBadges().info('Sin badges');\n * // [API] Sin badges\n * \n * @since 0.3.0\n */\n clearBadges(): ScopedLogger {\n this.badgeList = [];\n return this;\n }\n\n /**\n * Establece un preset de estilo para este logger con scope\n * \n * @param {string} presetName - Nombre del preset a aplicar\n * @returns {ScopedLogger} Esta instancia para encadenamiento\n * \n * @example\n * const errorLogger = logger.scope('ErrorHandler')\n * .style('cyberpunk');\n * \n * @since 0.3.0\n */\n style(presetName: string): ScopedLogger {\n this.setTheme(presetName as any); // Will be updated when we implement presets\n return this;\n }\n\n /**\n * Crea un contexto temporal que se limpia automáticamente\n * \n * @param {string} contextName - Nombre del contexto\n * @returns {ContextLogger} Logger con contexto temporal\n * \n * @example\n * const db = logger.scope('Database');\n * \n * // Contexto temporal para una operación\n * db.context('Migration').run(() => {\n * db.info('Iniciando migración');\n * db.success('Tablas creadas');\n * });\n * // Contexto automáticamente limpiado\n * \n * @since 0.3.0\n */\n context(contextName: string): ContextLogger {\n return new ContextLogger(this, contextName);\n }\n\n /**\n * Sobrescribe el logging principal para incluir badges\n * @protected\n * @param {LogLevel} level - Nivel del log\n * @param {...any} args - Argumentos del log\n */\n protected log(level: LogLevel, ...args: any[]): void {\n // Build the enhanced message with badges\n const badges = this.getBadgeString();\n const scopePrefix = this.getScopePrefix();\n \n let enhancedMessage = '';\n if (badges) enhancedMessage += badges + ' ';\n if (scopePrefix) enhancedMessage += `[${scopePrefix}] `;\n \n if (args.length > 0) {\n enhancedMessage += String(args[0]);\n // Replace the first argument with our enhanced message\n args[0] = enhancedMessage;\n }\n\n // Call parent's log method\n super.log(level, ...args);\n }\n\n /**\n * Obtiene la cadena de badges formateada\n * @private\n * @returns {string} Badges formateados como [BADGE1][BADGE2]\n */\n private getBadgeString(): string {\n if (this.badgeList.length === 0) return '';\n return this.badgeList.map(badge => `[${badge}]`).join('');\n }\n\n /**\n * Obtiene el prefijo del scope (incluye stack de contexto)\n * @private\n * @returns {string} Prefijo completo con contextos\n */\n private getScopePrefix(): string {\n const parts = [this.scopeName, ...this.contextStack].filter(Boolean);\n return parts.join(':');\n }\n\n /**\n * Método interno para añadir contexto\n * @internal\n */\n _pushContext(context: string): void {\n this.contextStack.push(context);\n }\n\n /**\n * Método interno para eliminar contexto\n * @internal\n */\n _popContext(): void {\n this.contextStack.pop();\n }\n}\n\n/**\n * Logger específico para APIs con badges comunes de API\n * \n * @class APILogger\n * @extends ScopedLogger\n * @description Logger especializado para endpoints y servicios API\n * \n * @example\n * const api = logger.api('REST');\n * api.info('GET /users');\n * // [API] [REST] GET /users\n * \n * api.slow('Query lenta', 3500);\n * // [API] [SLOW] [REST] Query lenta (3500ms)\n * \n * @since 0.3.0\n */\nexport class APILogger extends ScopedLogger {\n constructor(parentLogger: Logger, apiName: string, config?: Partial<LoggerConfig>) {\n super(parentLogger, `API:${apiName}`, config);\n this.badge('API');\n }\n\n /**\n * Registra operaciones lentas\n * \n * @param {string} message - Mensaje sobre la operación lenta\n * @param {number} duration - Duración en milisegundos (opcional)\n * \n * @example\n * api.slow('Query compleja', 5000);\n * api.slow('Procesamiento pesado');\n * \n * @since 0.3.0\n */\n slow(message: string, duration?: number): void {\n this.badge('SLOW');\n const msg = duration ? `${message} (${duration}ms)` : message;\n this.warn(msg);\n }\n\n /**\n * Registra límites de tasa alcanzados\n * \n * @param {string} message - Mensaje sobre el límite\n * \n * @example\n * api.rateLimit('Límite excedido: 100 req/min');\n * \n * @since 0.3.0\n */\n rateLimit(message: string): void {\n this.badge('RATE_LIMIT');\n this.warn(message);\n }\n\n /**\n * Registra problemas de autenticación\n * \n * @param {string} message - Mensaje de autenticación\n * \n * @example\n * api.auth('Token inválido o expirado');\n * api.auth('Credenciales incorrectas');\n * \n * @since 0.3.0\n */\n auth(message: string): void {\n this.badge('AUTH');\n this.error(message);\n }\n\n /**\n * Registra advertencias de deprecación\n * \n * @param {string} message - Mensaje de deprecación\n * \n * @example\n * api.deprecated('Este endpoint será eliminado en v2.0');\n * api.deprecated('Usar /v2/users en lugar de /users');\n * \n * @since 0.3.0\n */\n deprecated(message: string): void {\n this.badge('DEPRECATED');\n this.warn(message);\n }\n}\n\n/**\n * Logger específico para componentes de UI\n * \n * @class ComponentLogger\n * @extends ScopedLogger\n * @description Logger especializado para componentes con eventos de ciclo de vida\n * \n * @example\n * const authForm = logger.component('AuthForm');\n * authForm.lifecycle('mounted');\n * authForm.stateChange('idle', 'loading');\n * \n * @since 0.3.0\n */\nexport class ComponentLogger extends ScopedLogger {\n constructor(parentLogger: Logger, componentName: string, config?: Partial<LoggerConfig>) {\n super(parentLogger, componentName, config);\n this.badge('COMPONENT');\n }\n\n /**\n * Registra eventos del ciclo de vida del componente\n * \n * @param {string} event - Nombre del evento (mounted, unmounted, updated, etc)\n * @param {string} message - Mensaje adicional (opcional)\n * \n * @example\n * component.lifecycle('mounted', 'Componente listo');\n * component.lifecycle('beforeDestroy');\n * \n * @since 0.3.0\n */\n lifecycle(event: string, message?: string): void {\n this.badge('LIFECYCLE');\n const msg = message ? `${event}: ${message}` : event;\n this.info(msg);\n }\n\n /**\n * Registra cambios de estado\n * \n * @param {string} from - Estado anterior\n * @param {string} to - Estado nuevo\n * @param {any} data - Datos adicionales (opcional)\n * \n * @example\n * component.stateChange('idle', 'loading');\n * component.stateChange('loading', 'error', { code: 404 });\n * \n * @since 0.3.0\n */\n stateChange(from: string, to: string, data?: any): void {\n this.badge('STATE');\n const msg = `${from} → ${to}`;\n if (data) {\n this.info(msg, data);\n } else {\n this.info(msg);\n }\n }\n\n /**\n * Registra cambios en las propiedades\n * \n * @param {Record<string, any>} changes - Objeto con los cambios\n * \n * @example\n * component.propsChange({\n * user: newUser,\n * isActive: true\n * });\n * \n * @since 0.3.0\n */\n propsChange(changes: Record<string, any>): void {\n this.badge('PROPS');\n this.debug('Props changed:', changes);\n }\n}\n\n/**\n * Logger de contexto temporal que se limpia automáticamente\n * \n * @class ContextLogger\n * @description Proporciona un contexto temporal para operaciones agrupadas\n * \n * @example\n * const db = logger.scope('Database');\n * \n * // El contexto se limpia automáticamente al finalizar\n * db.context('Transaction').run(() => {\n * db.info('Iniciando transacción');\n * db.success('Transacción completada');\n * });\n * \n * @since 0.3.0\n */\nexport class ContextLogger {\n private parentLogger: ScopedLogger;\n private contextName: string;\n\n constructor(parentLogger: ScopedLogger, contextName: string) {\n this.parentLogger = parentLogger;\n this.contextName = contextName;\n }\n\n /**\n * Ejecuta una función con este contexto activo\n * \n * @template T - Tipo de retorno de la función\n * @param {Function} fn - Función a ejecutar\n * @returns {T} Resultado de la función\n * \n * @example\n * const result = logger.context('Process').run(() => {\n * logger.info('Procesando...');\n * return processData();\n * });\n * \n * @since 0.3.0\n */\n run<T>(fn: () => T): T {\n this.parentLogger._pushContext(this.contextName);\n try {\n return fn();\n } finally {\n this.parentLogger._popContext();\n }\n }\n\n /**\n * Run an async function with this context active\n */\n async runAsync<T>(fn: () => Promise<T>): Promise<T> {\n this.parentLogger._pushContext(this.contextName);\n try {\n return await fn();\n } finally {\n this.parentLogger._popContext();\n }\n }\n\n /**\n * Start the context (manual mode)\n */\n start(): void {\n this.parentLogger._pushContext(this.contextName);\n }\n\n /**\n * End the context (manual mode)\n */\n end(): void {\n this.parentLogger._popContext();\n }\n\n // Delegate logging methods to parent with context\n debug(...args: any[]): void { this.parentLogger.debug(...args); }\n info(...args: any[]): void { this.parentLogger.info(...args); }\n warn(...args: any[]): void { this.parentLogger.warn(...args); }\n error(...args: any[]): void { this.parentLogger.error(...args); }\n success(...args: any[]): void { this.parentLogger.success(...args); }\n critical(...args: any[]): void { this.parentLogger.critical(...args); }\n}"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ "use strict";function isMinifiedFile(e){return[/\.min\.js$/,/\.bundle\.js$/,/\.chunk\.js$/,/-[\w\d]{8,}\.js$/,/Logger-[A-Za-z0-9]+\.js$/,/node_modules/,/dist\//,/build\//,/\.mjs$/].some(t=>t.test(e))}function extractCleanFilename(e){return(e.split(/[/\\]/).pop()||e).replace(/\.min\.js$/,".js").replace(/\.bundle\.js$/,".js").replace(/\.chunk\.js$/,".js").replace(/-[\w\d]{8,}\.js$/,".js").replace(/Logger-[A-Za-z0-9]+\.js$/,"logger.ts")}const e={verbosity:"info",enableColors:!0,enableTimestamps:!0,enableStackTrace:!0,theme:"default",bannerType:"simple",bufferSize:1e3,autoDetectTheme:!0,outputFormat:"auto"},t={ms:1,s:1e3,m:6e4,h:36e5,d:864e5},r={timestamp:{light:"#666666",dark:"#a0a0a0"},messageText:{light:"#2d3748",dark:"#f7fafc"},prefix:{light:"#2d3748",dark:"#e2e8f0"},prefixBackground:{light:"#2d3748",dark:"#4a5568"},location:{light:"#718096",dark:"#a0aec0"}},s={nextjs:{verbosity:"info",enableColors:!0,enableTimestamps:!1,enableStackTrace:!1,autoDetectTheme:!1,outputFormat:"build"},webpack:{verbosity:"info",enableColors:!0,enableTimestamps:!0,enableStackTrace:!1,autoDetectTheme:!1,outputFormat:"build"},ci:{verbosity:"info",enableColors:!1,enableTimestamps:!0,enableStackTrace:!0,autoDetectTheme:!1,outputFormat:"ci"},terminal:{verbosity:"debug",enableColors:!0,enableTimestamps:!0,enableStackTrace:!0,autoDetectTheme:!1,outputFormat:"ansi"}},n={isNextJS:"undefined"!=typeof process&&(process.env.NEXT_RUNTIME||process.env.NEXT_PUBLIC_VERCEL_ENV||process.argv&&process.argv.some(e=>e.includes("next"))),isWebpack:"undefined"!=typeof process&&(process.env.WEBPACK_ENV||process.env.WEBPACK_BUILD||process.argv&&process.argv.some(e=>e.includes("webpack"))),isCI:"undefined"!=typeof process&&(process.env.CI||process.env.GITHUB_ACTIONS||process.env.JENKINS_URL||process.env.GITLAB_CI||process.env.TRAVIS||process.env.CIRCLECI),isBuild:"undefined"!=typeof process&&!0,isTerminal:"undefined"!=typeof process&&!0===process.stdout?.isTTY&&"dumb"!==process.env.TERM};function detectEnvironmentPreset(){return n.isCI?"ci":n.isNextJS?"nextjs":n.isWebpack?"webpack":"terminal"}function formatTimestamp(){try{/* @__PURE__ */
2
+ return(new Date).toISOString()}catch{/* @__PURE__ */
3
+ return(new Date).toISOString()}}class StyleBuilder{styles=[];constructor(e=""){e&&this.styles.push(e)}bg(e){return this.styles.push(`background: ${e}`),this}color(e){return this.styles.push(`color: ${e}`),this}border(e){return this.styles.push(`border: ${e}`),this}shadow(e){return this.styles.push(`box-shadow: ${e}`),this}padding(e){return this.styles.push(`padding: ${e}`),this}margin(e){return this.styles.push(`margin: ${e}`),this}rounded(e="4px"){return this.styles.push(`border-radius: ${e}`),this}bold(){return this.styles.push("font-weight: bold"),this}font(e){return this.styles.push(`font-family: ${e}`),this}mono(){return this.font('Monaco, Consolas, "Courier New", monospace')}system(){return this.font('system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif')}size(e){return this.styles.push(`font-size: ${e}`),this}lineHeight(e){return this.styles.push(`line-height: ${e}`),this}underline(){return this.styles.push("text-decoration: underline"),this}uppercase(){return this.styles.push("text-transform: uppercase"),this}opacity(e){return this.styles.push(`opacity: ${e}`),this}display(e){return this.styles.push(`display: ${e}`),this}position(e){return this.styles.push(`position: ${e}`),this}transform(e){return this.styles.push(`transform: ${e}`),this}animation(e){return this.styles.push(`animation: ${e}`),this}transition(e){return this.styles.push(`transition: ${e}`),this}cursor(e){return this.styles.push(`cursor: ${e}`),this}custom(e,t){return this.styles.push(`${e}: ${t}`),this}css(e,t){return this.custom(e,t)}build(){return this.styles.join("; ")}clear(){return this.styles=[],this}clone(){const e=new StyleBuilder;return e.styles=[...this.styles],e}merge(e){return this.styles.push(...e.styles),this}}!function(){const e=new StyleBuilder;new Proxy(e,{get(e,t){if(t in e){const r=e[t];return"function"==typeof r?r.bind(e):r}}})}();const o={success:()=>(new StyleBuilder).bg("linear-gradient(135deg, #00b894 0%, #00a085 100%)").color("#ffffff").padding("4px 8px").rounded("4px").bold(),error:()=>(new StyleBuilder).bg("linear-gradient(135deg, #e84393 0%, #d63031 100%)").color("#ffffff").padding("4px 8px").rounded("4px").bold(),warning:()=>(new StyleBuilder).bg("linear-gradient(135deg, #fdcb6e 0%, #e17055 100%)").color("#2d3436").padding("4px 8px").rounded("4px").bold(),info:()=>(new StyleBuilder).bg("linear-gradient(135deg, #74b9ff 0%, #0984e3 100%)").color("#ffffff").padding("4px 8px").rounded("4px").bold(),debug:()=>(new StyleBuilder).bg("linear-gradient(135deg, #667eea 0%, #764ba2 100%)").color("#ffffff").padding("4px 8px").rounded("4px").bold(),muted:()=>(new StyleBuilder).color("#6c757d").font("Monaco, Consolas, monospace").size("12px"),accent:()=>(new StyleBuilder).bg("#f8f9fa").color("#495057").padding("2px 6px").rounded("3px").border("1px solid #dee2e6"),neon:()=>(new StyleBuilder).bg("linear-gradient(135deg, #0f3460 0%, #e94560 100%)").color("#00ffff").padding("4px 8px").rounded("4px").bold().shadow("0 0 10px rgba(0, 255, 255, 0.5)")};function getEnvironment(){return"undefined"!=typeof globalThis&&globalThis.Deno?"deno":"undefined"==typeof window&&"undefined"!=typeof self&&"function"==typeof self.importScripts?"webworker":"undefined"!=typeof process&&process.versions&&process.versions.node?function(){if("undefined"==typeof process)return!1;const e=process.stdout&&process.stdout.isTTY,t=process.env&&(process.env.TERM||process.env.TERM_PROGRAM||process.env.SSH_TTY||process.env.TERM_SESSION_ID),r=t&&["vscode","hyper","iterm","terminal","alacritty","kitty","gnome-terminal","konsole","xterm","tmux","screen"].some(e=>process.env.TERM_PROGRAM?.toLowerCase().includes(e)||process.env.TERM?.toLowerCase().includes(e));return Boolean(e||t||r)}()?"terminal":"server":"undefined"!=typeof window&&"undefined"!=typeof document?"browser":"unknown"}function supportsANSI(){const e=getEnvironment();return"browser"!==e&&("terminal"===e||"server"===e&&function(){if("undefined"==typeof process)return!1;const e=process.env&&(process.env.COLORTERM||process.env.FORCE_COLOR||process.env.TERM&&"dumb"!==process.env.TERM||process.env.TERM_PROGRAM);return Boolean(e)}())}class TerminalRenderer{colorCapability;constructor(e="full"){this.colorCapability=e}getColorCode(e,t=!1){return`[${({black:{normal:"30",bright:"90"},red:{normal:"31",bright:"91"},green:{normal:"32",bright:"92"},yellow:{normal:"33",bright:"93"},blue:{normal:"34",bright:"94"},magenta:{normal:"35",bright:"95"},cyan:{normal:"36",bright:"96"},white:{normal:"37",bright:"97"},gray:{normal:"90",bright:"37"},grey:{normal:"90",bright:"37"}}[e.toLowerCase()]||{normal:"37"}).normal}m`}getStyleCode(e){const t={bold:"1",dim:"2",italic:"3",underline:"4",reset:"0"},r=e.map(e=>t[e]||"0").join(";");return r?`[${r}m`:""}renderTerminal(e,t,r,s,n,o){const i="",l={text:"",reset:i};o?(l.timestamp=this.styleTimestamp(r,o.timestamp),l.level=this.styleLevel(e,o.level),l.prefix=this.stylePrefix(s,o.prefix),l.message=this.styleMessage(t,o.message),l.location=this.styleLocation(n,o.location)):(l.timestamp=this.styleTimestamp(r),l.level=this.styleLevel(e),l.prefix=this.stylePrefix(s),l.message=this.styleMessage(t),l.location=this.styleLocation(n));const a=[];return l.timestamp&&a.push(l.timestamp),l.level&&a.push(l.level),l.prefix&&a.push(l.prefix),l.message&&a.push(l.message),l.location&&a.push(l.location),l.text=a.join(" ")+i,l}styleTimestamp(e,t){return e&&t?.show?"none"===this.colorCapability?e:`${this.getStyleCode(["dim"])}${e}`:""}styleLevel(e,t){if(!t?.show)return"";const r=this.getLevelText(e);if("none"===this.colorCapability)return`[${r}]`;const s={debug:"magenta",info:"blue",warn:"yellow",error:"red",critical:"red"}[e]||"white",n=this.getColorCode(s),o=this.getStyleCode(["bold"]);return"compact"===t?.style?`${n}[${r}]`:`${n}${o}[${r}]`}stylePrefix(e,t){return e&&t?.show?"none"===this.colorCapability?`[${e}]`:`${this.getColorCode("cyan")}[${e.toUpperCase()}]`:""}styleMessage(e,t){return e}styleLocation(e,t){if(!e||!t?.show)return"";if("none"===this.colorCapability)return`(${e})`;const r=this.getStyleCode(["dim"]);return"clickable"===t?.style?`${this.getStyleCode(["dim","underline"])}(${e})`:`${r}(${e})`}getLevelText(e){return{debug:"DEBUG",info:"INFO",warn:"WARN",error:"ERROR",critical:"CRITICAL"}[e]||String(e).toUpperCase()}renderCyberpunk(e,t,r,s,n){const o="",i=[];r&&i.push(`${r}${o}`);const l={debug:"",info:"",warn:"",error:"",critical:""}[e]||"";if(i.push(`${l} ${this.getLevelText(e)} ${o}`),s){const e="";i.push(`${e}[${s.toUpperCase()}]${o}`)}return i.push(t),n&&i.push(`(${n})${o}`),{text:i.join(" "),reset:o}}renderMinimal(e,t,r,s){const n="",o=[];r&&o.push(`${r}${n}`);const i={debug:"",info:"",warn:"",error:"",critical:""}[e]||"";return o.push(`${i}${this.getLevelText(e)}:${n}`),s&&o.push(`[${s.toUpperCase()}]${n}`),o.push(t),{text:o.join(" "),reset:n}}getChalkForLevel(e){const t={debug:"magenta",info:"blue",warn:"yellow",error:"red",critical:"red"};return{color:r=>{const s=t[e]||"white";return`${this.getColorCode(s)}${r}`},bold:e=>`${this.getStyleCode(["bold"])}${e}`,dim:e=>`${this.getStyleCode(["dim"])}${e}`,bgGray:e=>`${e}`,bgBlue:e=>`${e}`,reset:e=>e,cyan:{bold:e=>`${this.getColorCode("cyan")}${this.getStyleCode(["bold"])}${e}`,dim:e=>`${this.getColorCode("cyan")}${this.getStyleCode(["dim"])}${e}`,bg:e=>`${this.getColorCode("cyan")}[${e.toUpperCase()}]`}}}}const i=new class{renderer;constructor(){const e=function(){if("browser"===getEnvironment())return"full";if(!supportsANSI())return"none";if("undefined"!=typeof process&&process.env){const e="truecolor"===process.env.COLORTERM||"24bit"===process.env.COLORTERM,t=process.env.TERM&&process.env.TERM.includes("256");if(e||t)return"full"}return"basic"}();this.renderer=new TerminalRenderer(e)}adaptStyles(e,t,r,s,n,o,i){if(i)switch(i){case"cyberpunk":return this.renderer.renderCyberpunk(e,t,r,s,n);case"minimal":return this.renderer.renderMinimal(e,t,r,s);case"production":return this.adaptProductionStyles(e,t,r,s,n,o);case"debug":return this.adaptDebugStyles(e,t,r,s,n,o);case"glassmorphism":return this.adaptGlassmorphismStyles(e,t,r,s,n,o)}return this.renderer.renderTerminal(e,t,r,s,n,o)}adaptProductionStyles(e,t,r,s,n,o){const i="",l=this.renderer.getChalkForLevel(e),a=[];return r&&o?.timestamp?.show&&a.push(l.dim(r)),o?.level?.show&&a.push(l.color(`[${this.renderer.getLevelText(e)}]`)),s&&o?.prefix?.show&&a.push(l.dim(`[${s}]`)),t&&o?.message?.show&&a.push(l.reset(t)),n&&o?.location?.show&&a.push(l.dim(`(${n})`)),{text:a.join(" ")+i,reset:i}}adaptDebugStyles(e,t,r,s,n,o){const i="",l=this.renderer.getChalkForLevel(e),a=[];return r&&o?.timestamp?.show&&a.push(l.dim(r)),o?.level?.show&&("compact"===o?.level?.style?a.push(l.color(`[${this.renderer.getLevelText(e)}]`)):a.push(l.bold(`[${this.renderer.getLevelText(e)}]`))),s&&o?.prefix?.show&&("compact"===o?.prefix?.style?a.push(l.cyan.dim(`[${s}]`)):a.push(l.cyan.bold(`[${s}]`))),t&&o?.message?.show&&a.push(l.reset(t)),n&&o?.location?.show&&("clickable"===o?.location?.style?a.push(l.dim(`${n} (clickable)`)):a.push(l.dim(`(${n})`))),{text:a.join(" ")+i,reset:i}}adaptGlassmorphismStyles(e,t,r,s,n,o){const i="",l=this.renderer.getChalkForLevel(e),a=[];return r&&o?.timestamp?.show&&a.push(l.dim(r)),o?.level?.show&&a.push(l.bgGray(` ${this.renderer.getLevelText(e)} `)),s&&o?.prefix?.show&&a.push(l.bgBlue(`[${s}]`)),t&&o?.message?.show&&a.push(l.reset(t)),n&&o?.location?.show&&a.push(l.dim(`(${n})`)),{text:a.join(" ")+i,reset:i}}adaptColor(e){return e.startsWith("#")||e.startsWith("rgb(")?e:e.includes("gradient")?this.extractColorFromGradient(e):this.cssNameToANSI(e)}extractColorFromGradient(e){const t=e.match(/#[0-9a-fA-F]{6}|rgb\([^)]+\)/);return t?t[0]:"#ffffff"}cssNameToANSI(e){return{black:"black",white:"white",red:"red",green:"green",blue:"blue",yellow:"yellow",cyan:"cyan",magenta:"magenta",gray:"gray",grey:"gray",orange:"yellow",purple:"magenta",pink:"red",brown:"yellow",lightblue:"cyan",lightgreen:"green",lightgray:"gray",lightgrey:"gray"}[e.toLowerCase()]||"white"}shouldRenderStyle(e,t){if(!t)return!0;const r=t[e];return!1!==r?.show}getRenderer(){return this.renderer}};function detectDevToolsTheme(){try{return"undefined"!=typeof window&&window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}catch(e){return console.warn("Failed to detect DevTools theme:",e),"light"}}function getAdaptiveColor(e,t){return e[t??detectDevToolsTheme()]}const l="undefined"!=typeof process&&process.versions&&process.versions.node,a="undefined"!=typeof window&&"undefined"!=typeof document;exports.ADAPTIVE_COLORS=r,exports.BUFFER_LIMITS={MIN_SIZE:50,DEFAULT_SIZE:1e3,MAX_SIZE:1e4},exports.BUILD_PRESETS=s,exports.DEFAULT_CONFIG=e,exports.ENVIRONMENT_DETECTION=n,exports.EXPORT_FORMATS={json:{extension:".json",mimeType:"application/json"},csv:{extension:".csv",mimeType:"text/csv"},markdown:{extension:".md",mimeType:"text/markdown"},plain:{extension:".txt",mimeType:"text/plain"},html:{extension:".html",mimeType:"text/html"}},exports.LEVEL_STYLES={debug:{emoji:"🔍",label:"DEBUG",background:"linear-gradient(90deg, #6c757d, #495057)",color:"#ffffff",border:"1px solid #6c757d",shadow:"0 2px 4px rgba(108, 117, 125, 0.3)"},info:{emoji:"ℹ️",label:"INFO",background:"linear-gradient(90deg, #007bff, #0056b3)",color:"#ffffff",border:"1px solid #007bff",shadow:"0 2px 4px rgba(0, 123, 255, 0.3)"},warn:{emoji:"⚠️",label:"WARN",background:"linear-gradient(90deg, #ffc107, #e0a800)",color:"#000000",border:"1px solid #ffc107",shadow:"0 2px 4px rgba(255, 193, 7, 0.3)"},error:{emoji:"❌",label:"ERROR",background:"linear-gradient(90deg, #dc3545, #c82333)",color:"#ffffff",border:"1px solid #dc3545",shadow:"0 2px 4px rgba(220, 53, 69, 0.3)"},critical:{emoji:"🚨",label:"CRITICAL",background:"linear-gradient(90deg, #8B0000, #FF0000)",color:"#ffffff",border:"2px solid #FF0000",shadow:"0 4px 8px rgba(255, 0, 0, 0.4)"},success:{emoji:"✅",label:"SUCCESS",background:"linear-gradient(90deg, #28a745, #1e7e34)",color:"#ffffff",border:"1px solid #28a745",shadow:"0 2px 4px rgba(40, 167, 69, 0.3)"}},exports.StyleBuilder=StyleBuilder,exports.StylePresets=o,exports.createStyledOutput=function(e,t,s,n,o,l=!0,a,c){const d=t[e],u=formatTimestamp();if("browser"!==getEnvironment()&&supportsANSI())return function(e,t,r,s,n,o,l){const a=function(e,t,r,s,n,o,l){return i.adaptStyles(e,t,r,s,n,o,l)}(e,t,r,s,n?`${n.file}:${n.line}:${n.column}`:void 0,o,l);return[a.text]}(e,n,u,s,o,a,c);const p=l?detectDevToolsTheme():"light",m=(new StyleBuilder).color(getAdaptiveColor(r.timestamp,p)).size("11px").font("Monaco, Consolas, monospace").build(),h=(new StyleBuilder).bg(d.background).color(d.color).border(d.border).shadow(d.shadow).padding("2px 8px").rounded("4px").bold().font("Monaco, Consolas, monospace").size("12px").build(),f=(new StyleBuilder).bg(getAdaptiveColor(r.prefixBackground,p)).color(getAdaptiveColor(r.prefix,p)).padding("2px 6px").rounded("3px").bold().font("Monaco, Consolas, monospace").size("11px").build(),g=(new StyleBuilder).color(getAdaptiveColor(r.messageText,p)).font("system-ui, -apple-system, sans-serif").size("14px").build(),y=(new StyleBuilder).color(getAdaptiveColor(r.location,p)).size("11px").font("Monaco, Consolas, monospace").build();let b=`%c${u.slice(11,23)} %c${d.emoji} ${d.label}`;const x=[m,h];return s&&(b+=` %c${s}`,x.push(f)),b+=` %c${n}`,x.push(g),o&&(b+=` %c(${o.file}:${o.line}:${o.column})`,x.push(y)),[b,...x]},exports.detectEnvironmentPreset=detectEnvironmentPreset,exports.escapeHtml=function(e){const t=document.createElement("div");return t.textContent=e,t.innerHTML},exports.formatDisplayTime=function(e,t="short"){switch(t){case"time-only":return e.toTimeString().slice(0,8);case"full":return e.toISOString();default:return e.toISOString().slice(11,23)}},exports.formatTimestamp=formatTimestamp,exports.generateLogId=function(){return`${Date.now()}-${Math.random().toString(36).substr(2,9)}`},exports.getAdaptiveColor=getAdaptiveColor,exports.getEnvironment=getEnvironment,exports.getOptimalConfig=function(){const t=detectEnvironmentPreset();return{...e,...s[t]}},exports.isBrowser=a,exports.isNode=l,exports.parseStackTrace=function(){try{const e=(new Error).stack;if(!e)return null;const t=e.split("\n").filter(e=>e.trim());for(let r=1;r<t.length;r++){const e=t[r];if(!e)continue;if(e.includes("parseStackTrace")||e.includes("Logger.")||e.includes(".log(")||e.includes("createStyledOutput"))continue;let s;const n=e.match(/at\s+(?:(.+?)\s+\()?(.+?):(\d+):(\d+)\)?$/);if(n){const e=n[2];if(e&&isMinifiedFile(e))continue;s=n}else{const t=e.match(/(.+?)@(.+?):(\d+):(\d+)$/);if(t){const e=t[2];if(e&&isMinifiedFile(e))continue;s=t}else{const t=e.match(/(\S+)?@(.+?):(\d+):(\d+)$/);if(t){const e=t[2];if(e&&isMinifiedFile(e))continue;s=t}}}if(!s)continue;const[,o,i,l,a]=s;if(!i)continue;const c=extractCleanFilename(i).split("?")[0];if(!c)continue;const d=l?parseInt(l,10):0;return{file:c||"unknown",line:d,column:a?parseInt(a,10):0,function:o&&o.trim()?o.trim():void 0}}return null}catch{return null}},exports.parseTimeInput=function(e){if(e instanceof Date)return e;if("number"==typeof e)return new Date(Date.now()-e*t.h);if("string"==typeof e){const r=new Date(e);if(!isNaN(r.getTime()))return r;try{const r=function(e){const r=e.match(/^(\d+)(ms|s|m|h|d)$/);if(!r)throw new Error(`Invalid time format: ${e}. Use format like "2h", "30m", "1d"`);const[,s,n]=r,o=t[n];return parseInt(s||"0",10)*o}(e);return new Date(Date.now()-r)}catch{throw new Error(`Invalid time format: ${e}`)}}throw new Error("Unsupported time input type: "+typeof e)},exports.safeStringify=function(e,t=3){try{return JSON.stringify(e,(e,t)=>"function"==typeof t?"[Function]":t instanceof Error?`[Error: ${t.message}]`:t instanceof Date?t.toISOString():void 0===t?"[undefined]":t,2)}catch(r){return String(e)}},exports.setupThemeChangeListener=function(e){try{if("undefined"==typeof window||!window.matchMedia)return null;const t=window.matchMedia("(prefers-color-scheme: dark)"),handler=t=>{e(t.matches?"dark":"light")};return t.addEventListener?(t.addEventListener("change",handler),()=>t.removeEventListener("change",handler)):t.addListener?(t.addListener(handler),()=>t.removeListener?.(handler)):null}catch(t){return console.warn("Failed to set up theme change listener:",t),null}},exports.supportsANSIColors=function(){return!!l&&(!0===process.stdout?.isTTY||"1"===process.env.FORCE_COLOR||"true"===process.env.FORCE_COLOR)},exports.supportsCSSColors=function(){return a};
4
+ //# sourceMappingURL=environment-Ba5kShbx.js.map