@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.
- package/bun.lock +333 -0
- package/dist/Logger.d.ts +704 -0
- package/dist/Logger.d.ts.map +1 -0
- package/dist/ScopedLogger.d.ts +310 -0
- package/dist/ScopedLogger.d.ts.map +1 -0
- package/dist/chunks/Logger-B7L-ujY4.js +3503 -0
- package/dist/chunks/Logger-B7L-ujY4.js.map +1 -0
- package/dist/chunks/Logger-DzU_c5sX.js +2 -0
- package/dist/chunks/Logger-DzU_c5sX.js.map +1 -0
- package/dist/chunks/RemoteLogHandler-CjWpWZGl.js +33 -0
- package/dist/chunks/RemoteLogHandler-CjWpWZGl.js.map +1 -0
- package/dist/chunks/RemoteLogHandler-ymkQ97xl.js +2 -0
- package/dist/chunks/RemoteLogHandler-ymkQ97xl.js.map +1 -0
- package/dist/chunks/ScopedLogger-BY3-E8Ov.js +2 -0
- package/dist/chunks/ScopedLogger-BY3-E8Ov.js.map +1 -0
- package/dist/chunks/ScopedLogger-D-RbiFZn.js +361 -0
- package/dist/chunks/ScopedLogger-D-RbiFZn.js.map +1 -0
- package/dist/chunks/environment-Ba5kShbx.js +4 -0
- package/dist/chunks/environment-Ba5kShbx.js.map +1 -0
- package/dist/chunks/environment-TI2ByCPT.js +1209 -0
- package/dist/chunks/environment-TI2ByCPT.js.map +1 -0
- package/dist/chunks/formatting-Blwy-f0W.js +2 -0
- package/dist/chunks/formatting-Blwy-f0W.js.map +1 -0
- package/dist/chunks/formatting-CuNUqGks.js +380 -0
- package/dist/chunks/formatting-CuNUqGks.js.map +1 -0
- package/dist/cli/CommandProcessor.d.ts +100 -0
- package/dist/cli/CommandProcessor.d.ts.map +1 -0
- package/dist/cli/commands/ConfigCommand.d.ts +14 -0
- package/dist/cli/commands/ConfigCommand.d.ts.map +1 -0
- package/dist/cli/commands/ExportCommand.d.ts +48 -0
- package/dist/cli/commands/ExportCommand.d.ts.map +1 -0
- package/dist/cli/commands/HistoryCommand.d.ts +47 -0
- package/dist/cli/commands/HistoryCommand.d.ts.map +1 -0
- package/dist/cli/commands/StatusCommand.d.ts +30 -0
- package/dist/cli/commands/StatusCommand.d.ts.map +1 -0
- package/dist/cli/commands/ThemeCommand.d.ts +30 -0
- package/dist/cli/commands/ThemeCommand.d.ts.map +1 -0
- package/dist/cli/help.d.ts +12 -0
- package/dist/cli/help.d.ts.map +1 -0
- package/dist/cli/index.d.ts +15 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/constants.d.ts +227 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/core.cjs +2 -0
- package/dist/core.cjs.map +1 -0
- package/dist/core.d.ts +127 -0
- package/dist/core.d.ts.map +1 -0
- package/dist/core.js +291 -0
- package/dist/core.js.map +1 -0
- package/dist/example.d.ts +18 -0
- package/dist/example.d.ts.map +1 -0
- package/dist/exports-module.d.ts +196 -0
- package/dist/exports-module.d.ts.map +1 -0
- package/dist/exports.cjs +2 -0
- package/dist/exports.cjs.map +1 -0
- package/dist/exports.js +238 -0
- package/dist/exports.js.map +1 -0
- package/dist/handlers/AnalyticsLogHandler.d.ts +8 -0
- package/dist/handlers/AnalyticsLogHandler.d.ts.map +1 -0
- package/dist/handlers/ExportLogHandler.d.ts +100 -0
- package/dist/handlers/ExportLogHandler.d.ts.map +1 -0
- package/dist/handlers/FileLogHandler.d.ts +33 -0
- package/dist/handlers/FileLogHandler.d.ts.map +1 -0
- package/dist/handlers/RemoteLogHandler.d.ts +11 -0
- package/dist/handlers/RemoteLogHandler.d.ts.map +1 -0
- package/dist/handlers/index.d.ts +8 -0
- package/dist/handlers/index.d.ts.map +1 -0
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +124 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +247 -0
- package/dist/index.js.map +1 -0
- package/dist/main.d.ts +2 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/styling/LogStyleBuilder.d.ts +146 -0
- package/dist/styling/LogStyleBuilder.d.ts.map +1 -0
- package/dist/styling/SemanticStyles.d.ts +178 -0
- package/dist/styling/SemanticStyles.d.ts.map +1 -0
- package/dist/styling/SmartPresets.d.ts +22 -0
- package/dist/styling/SmartPresets.d.ts.map +1 -0
- package/dist/styling/StyleBuilder.d.ts +140 -0
- package/dist/styling/StyleBuilder.d.ts.map +1 -0
- package/dist/styling/banners.d.ts +42 -0
- package/dist/styling/banners.d.ts.map +1 -0
- package/dist/styling/index.d.ts +10 -0
- package/dist/styling/index.d.ts.map +1 -0
- package/dist/styling/themes.d.ts +7 -0
- package/dist/styling/themes.d.ts.map +1 -0
- package/dist/styling-module.d.ts +178 -0
- package/dist/styling-module.d.ts.map +1 -0
- package/dist/styling.cjs +2 -0
- package/dist/styling.cjs.map +1 -0
- package/dist/styling.js +146 -0
- package/dist/styling.js.map +1 -0
- package/dist/terminal/terminal-renderer.d.ts +63 -0
- package/dist/terminal/terminal-renderer.d.ts.map +1 -0
- package/dist/types/core.d.ts +234 -0
- package/dist/types/core.d.ts.map +1 -0
- package/dist/types/handlers.d.ts +85 -0
- package/dist/types/handlers.d.ts.map +1 -0
- package/dist/types/index.d.ts +7 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/utils/adapter.d.ts +48 -0
- package/dist/utils/adapter.d.ts.map +1 -0
- package/dist/utils/ansi-colors.d.ts +156 -0
- package/dist/utils/ansi-colors.d.ts.map +1 -0
- package/dist/utils/environment-detector.d.ts +35 -0
- package/dist/utils/environment-detector.d.ts.map +1 -0
- package/dist/utils/environment.d.ts +47 -0
- package/dist/utils/environment.d.ts.map +1 -0
- package/dist/utils/formatting.d.ts +58 -0
- package/dist/utils/formatting.d.ts.map +1 -0
- package/dist/utils/index.d.ts +8 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/opentui-detection.d.ts +34 -0
- package/dist/utils/opentui-detection.d.ts.map +1 -0
- package/dist/utils/output.d.ts +46 -0
- package/dist/utils/output.d.ts.map +1 -0
- package/dist/utils/stackTrace.d.ts +6 -0
- package/dist/utils/stackTrace.d.ts.map +1 -0
- package/dist/utils/timestamps.d.ts +20 -0
- package/dist/utils/timestamps.d.ts.map +1 -0
- package/dist/vite.svg +1 -0
- 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="[0m",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}[0m`:""}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}][0m`:`${n}${o}[${r}][0m`}stylePrefix(e,t){return e&&t?.show?"none"===this.colorCapability?`[${e}]`:`[40m${this.getColorCode("cyan")}[${e.toUpperCase()}][0m`:""}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})[0m`:`${r}(${e})[0m`}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="[0m",i=[];r&&i.push(`[90m${r}${o}`);const l={debug:"[95m",info:"[94m",warn:"[93m",error:"[91m",critical:"[91m[1m"}[e]||"[97m";if(i.push(`[40m${l} ${this.getLevelText(e)} ${o}`),s){const e="[40m";i.push(`${e}[96m[${s.toUpperCase()}]${o}`)}return i.push(t),n&&i.push(`[90m(${n})${o}`),{text:i.join(" "),reset:o}}renderMinimal(e,t,r,s){const n="[0m",o=[];r&&o.push(`[90m${r}${n}`);const i={debug:"[95m",info:"[94m",warn:"[93m",error:"[91m",critical:"[91m[1m"}[e]||"[97m";return o.push(`${i}${this.getLevelText(e)}:${n}`),s&&o.push(`[96m[${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}[0m`},bold:e=>`${this.getStyleCode(["bold"])}${e}[0m`,dim:e=>`${this.getStyleCode(["dim"])}${e}[0m`,bgGray:e=>`[100m${e}[0m`,bgBlue:e=>`[104m${e}[0m`,reset:e=>e,cyan:{bold:e=>`${this.getColorCode("cyan")}${this.getStyleCode(["bold"])}${e}[0m`,dim:e=>`${this.getColorCode("cyan")}${this.getStyleCode(["dim"])}${e}[0m`,bg:e=>`[40m${this.getColorCode("cyan")}[${e.toUpperCase()}][0m`}}}}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="[0m",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="[0m",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="[0m",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
|