@mks2508/better-logger 0.14.0-alpha.2 → 1.0.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 (138) hide show
  1. package/dist/chunks/{Logger-Crw1woqR.js → Logger-CTAaDeZi.js} +49 -16
  2. package/dist/chunks/{Logger-Crw1woqR.js.map → Logger-CTAaDeZi.js.map} +1 -1
  3. package/dist/chunks/{Logger-D_p3xnbq.js → Logger-D8pK7XXt.js} +2 -2
  4. package/dist/chunks/{Logger-D_p3xnbq.js.map → Logger-D8pK7XXt.js.map} +1 -1
  5. package/dist/chunks/ScopedLogger-D-7q8uVP.js +2 -0
  6. package/dist/chunks/ScopedLogger-D-7q8uVP.js.map +1 -0
  7. package/dist/chunks/ScopedLogger-hS0qSkZD.js +361 -0
  8. package/dist/chunks/ScopedLogger-hS0qSkZD.js.map +1 -0
  9. package/dist/core.js +280 -307
  10. package/dist/exports.cjs +1 -1
  11. package/dist/exports.js +1 -1
  12. package/dist/index.cjs +1 -1
  13. package/dist/index.cjs.map +1 -1
  14. package/dist/index.js +226 -159
  15. package/dist/index.js.map +1 -1
  16. package/dist/styling.cjs +1 -1
  17. package/dist/styling.js +2 -2
  18. package/dist/types/Logger.d.ts +11 -7
  19. package/dist/types/Logger.d.ts.map +1 -1
  20. package/dist/types/core.d.ts +122 -216
  21. package/dist/types/core.d.ts.map +1 -1
  22. package/dist/types/index.d.ts +119 -4
  23. package/dist/types/index.d.ts.map +1 -1
  24. package/package.json +2 -1
  25. package/src/Logger.ts +99 -58
  26. package/src/index.ts +32 -25
  27. package/dist/.tsbuildinfo +0 -1
  28. package/dist/Logger.d.ts +0 -708
  29. package/dist/Logger.d.ts.map +0 -1
  30. package/dist/Logger.js +0 -1124
  31. package/dist/ScopedLogger.d.ts +0 -318
  32. package/dist/ScopedLogger.d.ts.map +0 -1
  33. package/dist/ScopedLogger.js +0 -426
  34. package/dist/cli/CommandProcessor.d.ts +0 -103
  35. package/dist/cli/CommandProcessor.d.ts.map +0 -1
  36. package/dist/cli/CommandProcessor.js +0 -184
  37. package/dist/cli/commands/ConfigCommand.d.ts +0 -17
  38. package/dist/cli/commands/ConfigCommand.d.ts.map +0 -1
  39. package/dist/cli/commands/ConfigCommand.js +0 -88
  40. package/dist/cli/commands/ExportCommand.d.ts +0 -51
  41. package/dist/cli/commands/ExportCommand.d.ts.map +0 -1
  42. package/dist/cli/commands/ExportCommand.js +0 -243
  43. package/dist/cli/commands/HistoryCommand.d.ts +0 -50
  44. package/dist/cli/commands/HistoryCommand.d.ts.map +0 -1
  45. package/dist/cli/commands/HistoryCommand.js +0 -96
  46. package/dist/cli/commands/StatusCommand.d.ts +0 -33
  47. package/dist/cli/commands/StatusCommand.d.ts.map +0 -1
  48. package/dist/cli/commands/StatusCommand.js +0 -93
  49. package/dist/cli/commands/ThemeCommand.d.ts +0 -33
  50. package/dist/cli/commands/ThemeCommand.d.ts.map +0 -1
  51. package/dist/cli/commands/ThemeCommand.js +0 -79
  52. package/dist/cli/help.d.ts +0 -15
  53. package/dist/cli/help.d.ts.map +0 -1
  54. package/dist/cli/help.js +0 -118
  55. package/dist/cli/index.d.ts +0 -15
  56. package/dist/cli/index.d.ts.map +0 -1
  57. package/dist/cli/index.js +0 -46
  58. package/dist/constants.d.ts +0 -122
  59. package/dist/constants.d.ts.map +0 -1
  60. package/dist/constants.js +0 -159
  61. package/dist/core.d.ts +0 -134
  62. package/dist/core.d.ts.map +0 -1
  63. package/dist/example.d.ts +0 -18
  64. package/dist/example.d.ts.map +0 -1
  65. package/dist/example.js +0 -154
  66. package/dist/exports-module.d.ts +0 -203
  67. package/dist/exports-module.d.ts.map +0 -1
  68. package/dist/exports-module.js +0 -260
  69. package/dist/handlers/AnalyticsLogHandler.d.ts +0 -11
  70. package/dist/handlers/AnalyticsLogHandler.d.ts.map +0 -1
  71. package/dist/handlers/AnalyticsLogHandler.js +0 -19
  72. package/dist/handlers/ExportLogHandler.d.ts +0 -103
  73. package/dist/handlers/ExportLogHandler.d.ts.map +0 -1
  74. package/dist/handlers/ExportLogHandler.js +0 -516
  75. package/dist/handlers/FileLogHandler.d.ts +0 -36
  76. package/dist/handlers/FileLogHandler.d.ts.map +0 -1
  77. package/dist/handlers/FileLogHandler.js +0 -156
  78. package/dist/handlers/RemoteLogHandler.d.ts +0 -14
  79. package/dist/handlers/RemoteLogHandler.d.ts.map +0 -1
  80. package/dist/handlers/RemoteLogHandler.js +0 -37
  81. package/dist/handlers/index.d.ts +0 -8
  82. package/dist/handlers/index.d.ts.map +0 -1
  83. package/dist/handlers/index.js +0 -7
  84. package/dist/index.d.ts +0 -157
  85. package/dist/index.d.ts.map +0 -1
  86. package/dist/main.d.ts +0 -2
  87. package/dist/main.d.ts.map +0 -1
  88. package/dist/main.js +0 -139
  89. package/dist/styling/LogStyleBuilder.d.ts +0 -149
  90. package/dist/styling/LogStyleBuilder.d.ts.map +0 -1
  91. package/dist/styling/LogStyleBuilder.js +0 -289
  92. package/dist/styling/SemanticStyles.d.ts +0 -181
  93. package/dist/styling/SemanticStyles.d.ts.map +0 -1
  94. package/dist/styling/SemanticStyles.js +0 -339
  95. package/dist/styling/SmartPresets.d.ts +0 -25
  96. package/dist/styling/SmartPresets.d.ts.map +0 -1
  97. package/dist/styling/SmartPresets.js +0 -276
  98. package/dist/styling/StyleBuilder.d.ts +0 -140
  99. package/dist/styling/StyleBuilder.d.ts.map +0 -1
  100. package/dist/styling/StyleBuilder.js +0 -280
  101. package/dist/styling/banners.d.ts +0 -45
  102. package/dist/styling/banners.d.ts.map +0 -1
  103. package/dist/styling/banners.js +0 -155
  104. package/dist/styling/index.d.ts +0 -10
  105. package/dist/styling/index.d.ts.map +0 -1
  106. package/dist/styling/index.js +0 -9
  107. package/dist/styling/themes.d.ts +0 -10
  108. package/dist/styling/themes.d.ts.map +0 -1
  109. package/dist/styling/themes.js +0 -231
  110. package/dist/styling-module.d.ts +0 -185
  111. package/dist/styling-module.d.ts.map +0 -1
  112. package/dist/styling-module.js +0 -199
  113. package/dist/types/core.js +0 -28
  114. package/dist/types/handlers.d.ts +0 -88
  115. package/dist/types/handlers.d.ts.map +0 -1
  116. package/dist/types/handlers.js +0 -4
  117. package/dist/types/index.js +0 -4
  118. package/dist/utils/environment.d.ts +0 -47
  119. package/dist/utils/environment.d.ts.map +0 -1
  120. package/dist/utils/environment.js +0 -85
  121. package/dist/utils/formatting.d.ts +0 -40
  122. package/dist/utils/formatting.d.ts.map +0 -1
  123. package/dist/utils/formatting.js +0 -117
  124. package/dist/utils/index.d.ts +0 -7
  125. package/dist/utils/index.d.ts.map +0 -1
  126. package/dist/utils/index.js +0 -6
  127. package/dist/utils/opentui-detection.d.ts +0 -34
  128. package/dist/utils/opentui-detection.d.ts.map +0 -1
  129. package/dist/utils/opentui-detection.js +0 -116
  130. package/dist/utils/output.d.ts +0 -44
  131. package/dist/utils/output.d.ts.map +0 -1
  132. package/dist/utils/output.js +0 -150
  133. package/dist/utils/stackTrace.d.ts +0 -9
  134. package/dist/utils/stackTrace.d.ts.map +0 -1
  135. package/dist/utils/stackTrace.js +0 -81
  136. package/dist/utils/timestamps.d.ts +0 -20
  137. package/dist/utils/timestamps.d.ts.map +0 -1
  138. package/dist/utils/timestamps.js +0 -71
@@ -1,318 +0,0 @@
1
- /**
2
- * @fileoverview ScopedLogger con badges y logging contextual
3
- * @version 0.3.0
4
- * @since 2024
5
- *
6
- * Proporciona loggers especializados con contexto, badges automáticos
7
- * y características avanzadas para componentes y APIs.
8
- */
9
- import { Logger } from './Logger.js';
10
- import type { LoggerConfig, LogLevel } from './types/index.js';
11
- /**
12
- * Logger con scope mejorado con badges y API simplificada
13
- *
14
- * @class ScopedLogger
15
- * @extends Logger
16
- * @description Logger contextual que añade prefijos y badges automáticamente
17
- *
18
- * @example
19
- * const dbLogger = logger.scope('Database');
20
- * dbLogger.info('Conectando...'); // [Database] Conectando...
21
- *
22
- * // Con badges personalizados
23
- * dbLogger.badge('SLOW').warn('Query lenta detectada');
24
- * // [SLOW] [Database] Query lenta detectada
25
- *
26
- * @since 0.3.0
27
- */
28
- export declare class ScopedLogger extends Logger {
29
- private parentLogger;
30
- private scopeName;
31
- private badgeList;
32
- private contextStack;
33
- constructor(parentLogger: Logger, scopeName: string, config?: Partial<LoggerConfig>);
34
- /**
35
- * Añade múltiples badges a este logger con scope
36
- *
37
- * @param {string[]} badges - Array de badges a añadir
38
- * @returns {ScopedLogger} Esta instancia para encadenamiento
39
- *
40
- * @example
41
- * const api = logger.scope('API');
42
- * api.badges(['v2', 'beta', 'cached'])
43
- * .info('Respuesta desde caché');
44
- * // [v2] [beta] [cached] [API] Respuesta desde caché
45
- *
46
- * @since 0.3.0
47
- */
48
- badges(badges: string[]): ScopedLogger;
49
- /**
50
- * Añade un badge individual
51
- *
52
- * @param {string} badge - Badge a añadir
53
- * @returns {ScopedLogger} Esta instancia para encadenamiento
54
- *
55
- * @example
56
- * dbLogger.badge('SLOW').warn('Query tardó 3s');
57
- * // [SLOW] [Database] Query tardó 3s
58
- *
59
- * @since 0.3.0
60
- */
61
- badge(badge: string): ScopedLogger;
62
- /**
63
- * Elimina todos los badges
64
- *
65
- * @returns {ScopedLogger} Esta instancia para encadenamiento
66
- *
67
- * @example
68
- * api.clearBadges().info('Sin badges');
69
- * // [API] Sin badges
70
- *
71
- * @since 0.3.0
72
- */
73
- clearBadges(): ScopedLogger;
74
- /**
75
- * Establece un preset de estilo para este logger con scope
76
- *
77
- * @param {string} presetName - Nombre del preset a aplicar
78
- * @returns {ScopedLogger} Esta instancia para encadenamiento
79
- *
80
- * @example
81
- * const errorLogger = logger.scope('ErrorHandler')
82
- * .style('cyberpunk');
83
- *
84
- * @since 0.3.0
85
- */
86
- style(presetName: string): ScopedLogger;
87
- /**
88
- * Crea un contexto temporal que se limpia automáticamente
89
- *
90
- * @param {string} contextName - Nombre del contexto
91
- * @returns {ContextLogger} Logger con contexto temporal
92
- *
93
- * @example
94
- * const db = logger.scope('Database');
95
- *
96
- * // Contexto temporal para una operación
97
- * db.context('Migration').run(() => {
98
- * db.info('Iniciando migración');
99
- * db.success('Tablas creadas');
100
- * });
101
- * // Contexto automáticamente limpiado
102
- *
103
- * @since 0.3.0
104
- */
105
- context(contextName: string): ContextLogger;
106
- /**
107
- * Sobrescribe el logging principal para incluir badges
108
- * @protected
109
- * @param {LogLevel} level - Nivel del log
110
- * @param {...any} args - Argumentos del log
111
- */
112
- protected log(level: LogLevel, ...args: any[]): void;
113
- /**
114
- * Obtiene la cadena de badges formateada
115
- * @private
116
- * @returns {string} Badges formateados como [BADGE1][BADGE2]
117
- */
118
- private getBadgeString;
119
- /**
120
- * Obtiene el prefijo del scope (incluye stack de contexto)
121
- * @private
122
- * @returns {string} Prefijo completo con contextos
123
- */
124
- private getScopePrefix;
125
- /**
126
- * Método interno para añadir contexto
127
- * @internal
128
- */
129
- _pushContext(context: string): void;
130
- /**
131
- * Método interno para eliminar contexto
132
- * @internal
133
- */
134
- _popContext(): void;
135
- }
136
- /**
137
- * Logger específico para APIs con badges comunes de API
138
- *
139
- * @class APILogger
140
- * @extends ScopedLogger
141
- * @description Logger especializado para endpoints y servicios API
142
- *
143
- * @example
144
- * const api = logger.api('REST');
145
- * api.info('GET /users');
146
- * // [API] [REST] GET /users
147
- *
148
- * api.slow('Query lenta', 3500);
149
- * // [API] [SLOW] [REST] Query lenta (3500ms)
150
- *
151
- * @since 0.3.0
152
- */
153
- export declare class APILogger extends ScopedLogger {
154
- constructor(parentLogger: Logger, apiName: string, config?: Partial<LoggerConfig>);
155
- /**
156
- * Registra operaciones lentas
157
- *
158
- * @param {string} message - Mensaje sobre la operación lenta
159
- * @param {number} duration - Duración en milisegundos (opcional)
160
- *
161
- * @example
162
- * api.slow('Query compleja', 5000);
163
- * api.slow('Procesamiento pesado');
164
- *
165
- * @since 0.3.0
166
- */
167
- slow(message: string, duration?: number): void;
168
- /**
169
- * Registra límites de tasa alcanzados
170
- *
171
- * @param {string} message - Mensaje sobre el límite
172
- *
173
- * @example
174
- * api.rateLimit('Límite excedido: 100 req/min');
175
- *
176
- * @since 0.3.0
177
- */
178
- rateLimit(message: string): void;
179
- /**
180
- * Registra problemas de autenticación
181
- *
182
- * @param {string} message - Mensaje de autenticación
183
- *
184
- * @example
185
- * api.auth('Token inválido o expirado');
186
- * api.auth('Credenciales incorrectas');
187
- *
188
- * @since 0.3.0
189
- */
190
- auth(message: string): void;
191
- /**
192
- * Registra advertencias de deprecación
193
- *
194
- * @param {string} message - Mensaje de deprecación
195
- *
196
- * @example
197
- * api.deprecated('Este endpoint será eliminado en v2.0');
198
- * api.deprecated('Usar /v2/users en lugar de /users');
199
- *
200
- * @since 0.3.0
201
- */
202
- deprecated(message: string): void;
203
- }
204
- /**
205
- * Logger específico para componentes de UI
206
- *
207
- * @class ComponentLogger
208
- * @extends ScopedLogger
209
- * @description Logger especializado para componentes con eventos de ciclo de vida
210
- *
211
- * @example
212
- * const authForm = logger.component('AuthForm');
213
- * authForm.lifecycle('mounted');
214
- * authForm.stateChange('idle', 'loading');
215
- *
216
- * @since 0.3.0
217
- */
218
- export declare class ComponentLogger extends ScopedLogger {
219
- constructor(parentLogger: Logger, componentName: string, config?: Partial<LoggerConfig>);
220
- /**
221
- * Registra eventos del ciclo de vida del componente
222
- *
223
- * @param {string} event - Nombre del evento (mounted, unmounted, updated, etc)
224
- * @param {string} message - Mensaje adicional (opcional)
225
- *
226
- * @example
227
- * component.lifecycle('mounted', 'Componente listo');
228
- * component.lifecycle('beforeDestroy');
229
- *
230
- * @since 0.3.0
231
- */
232
- lifecycle(event: string, message?: string): void;
233
- /**
234
- * Registra cambios de estado
235
- *
236
- * @param {string} from - Estado anterior
237
- * @param {string} to - Estado nuevo
238
- * @param {any} data - Datos adicionales (opcional)
239
- *
240
- * @example
241
- * component.stateChange('idle', 'loading');
242
- * component.stateChange('loading', 'error', { code: 404 });
243
- *
244
- * @since 0.3.0
245
- */
246
- stateChange(from: string, to: string, data?: any): void;
247
- /**
248
- * Registra cambios en las propiedades
249
- *
250
- * @param {Record<string, any>} changes - Objeto con los cambios
251
- *
252
- * @example
253
- * component.propsChange({
254
- * user: newUser,
255
- * isActive: true
256
- * });
257
- *
258
- * @since 0.3.0
259
- */
260
- propsChange(changes: Record<string, any>): void;
261
- }
262
- /**
263
- * Logger de contexto temporal que se limpia automáticamente
264
- *
265
- * @class ContextLogger
266
- * @description Proporciona un contexto temporal para operaciones agrupadas
267
- *
268
- * @example
269
- * const db = logger.scope('Database');
270
- *
271
- * // El contexto se limpia automáticamente al finalizar
272
- * db.context('Transaction').run(() => {
273
- * db.info('Iniciando transacción');
274
- * db.success('Transacción completada');
275
- * });
276
- *
277
- * @since 0.3.0
278
- */
279
- export declare class ContextLogger {
280
- private parentLogger;
281
- private contextName;
282
- constructor(parentLogger: ScopedLogger, contextName: string);
283
- /**
284
- * Ejecuta una función con este contexto activo
285
- *
286
- * @template T - Tipo de retorno de la función
287
- * @param {Function} fn - Función a ejecutar
288
- * @returns {T} Resultado de la función
289
- *
290
- * @example
291
- * const result = logger.context('Process').run(() => {
292
- * logger.info('Procesando...');
293
- * return processData();
294
- * });
295
- *
296
- * @since 0.3.0
297
- */
298
- run<T>(fn: () => T): T;
299
- /**
300
- * Run an async function with this context active
301
- */
302
- runAsync<T>(fn: () => Promise<T>): Promise<T>;
303
- /**
304
- * Start the context (manual mode)
305
- */
306
- start(): void;
307
- /**
308
- * End the context (manual mode)
309
- */
310
- end(): void;
311
- debug(...args: any[]): void;
312
- info(...args: any[]): void;
313
- warn(...args: any[]): void;
314
- error(...args: any[]): void;
315
- success(...args: any[]): void;
316
- critical(...args: any[]): void;
317
- }
318
- //# sourceMappingURL=ScopedLogger.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ScopedLogger.d.ts","sourceRoot":"","sources":["../src/ScopedLogger.ts"],"names":[],"mappings":"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"}