@mks2508/better-logger 0.18.2-alpha.1 → 0.18.2-alpha.2
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/README.md +38 -336
- package/dist/Logger.d.ts +243 -154
- package/dist/Logger.d.ts.map +1 -1
- package/dist/ScopedLogger.d.ts +511 -8
- package/dist/ScopedLogger.d.ts.map +1 -1
- package/dist/chunks/HookBridge-C-AvXmPD.cjs +504 -0
- package/dist/chunks/HookBridge-C-AvXmPD.cjs.map +1 -0
- package/dist/chunks/HookBridge-CI2PH79S.js +487 -0
- package/dist/chunks/HookBridge-CI2PH79S.js.map +1 -0
- package/dist/chunks/{LogContext-L7HzynFw.cjs → LogContext-BaMXleWj.cjs} +19 -4
- package/dist/chunks/LogContext-BaMXleWj.cjs.map +1 -0
- package/dist/chunks/{LogContext-Cwn-1Zzb.js → LogContext-DjlITOzZ.js} +19 -4
- package/dist/chunks/LogContext-DjlITOzZ.js.map +1 -0
- package/dist/chunks/SerializerBridge-Ba43Mk7j.js +393 -0
- package/dist/chunks/SerializerBridge-Ba43Mk7j.js.map +1 -0
- package/dist/chunks/SerializerBridge-C4a9Z37F.cjs +410 -0
- package/dist/chunks/SerializerBridge-C4a9Z37F.cjs.map +1 -0
- package/dist/chunks/{StyleManager-CIpd6wbO.cjs → StyleManager-DQ6UNRB-.cjs} +37 -11
- package/dist/chunks/StyleManager-DQ6UNRB-.cjs.map +1 -0
- package/dist/chunks/StyleManager-DjwAYbxE.js +113 -0
- package/dist/chunks/StyleManager-DjwAYbxE.js.map +1 -0
- package/dist/chunks/{core-PoT7RrTK.js → core-Blfi2klP.js} +1 -4
- package/dist/chunks/core-Blfi2klP.js.map +1 -0
- package/dist/chunks/{core-Dzz7agGa.cjs → core-CqS_UBzJ.cjs} +1 -4
- package/dist/chunks/core-CqS_UBzJ.cjs.map +1 -0
- package/dist/chunks/{environment-detector-CI3TrWK_.js → environment-detector-7NvnYUfr.js} +11 -11
- package/dist/chunks/environment-detector-7NvnYUfr.js.map +1 -0
- package/dist/chunks/{environment-detector-Cnn6wr6O.cjs → environment-detector-D-tHkKWA.cjs} +11 -11
- package/dist/chunks/environment-detector-D-tHkKWA.cjs.map +1 -0
- package/dist/chunks/server-fallback-CaCPjWby.cjs +119 -0
- package/dist/chunks/server-fallback-CaCPjWby.cjs.map +1 -0
- package/dist/chunks/server-fallback-jj0T6XaK.js +114 -0
- package/dist/chunks/server-fallback-jj0T6XaK.js.map +1 -0
- package/dist/chunks/{spinner-DNvxbM9a.cjs → spinner-BHyYEXsM.cjs} +319 -37
- package/dist/chunks/spinner-BHyYEXsM.cjs.map +1 -0
- package/dist/chunks/{spinner-D3FsF78o.js → spinner-BtkwpzYv.js} +319 -37
- package/dist/chunks/spinner-BtkwpzYv.js.map +1 -0
- package/dist/chunks/styling-CRw3KQW4.js +1592 -0
- package/dist/chunks/styling-CRw3KQW4.js.map +1 -0
- package/dist/chunks/styling-Cel2wPRy.cjs +1645 -0
- package/dist/chunks/styling-Cel2wPRy.cjs.map +1 -0
- package/dist/chunks/transports-BGfwwakw.js +1237 -0
- package/dist/chunks/transports-BGfwwakw.js.map +1 -0
- package/dist/chunks/transports-yK6CL0Ml.cjs +1278 -0
- package/dist/chunks/transports-yK6CL0Ml.cjs.map +1 -0
- package/dist/chunks/{utils-BqlFYocD.cjs → utils-W_cxqriN.cjs} +44 -37
- package/dist/chunks/utils-W_cxqriN.cjs.map +1 -0
- package/dist/chunks/{utils-VETbVpkR.js → utils-tKfBAWUM.js} +44 -37
- package/dist/chunks/utils-tKfBAWUM.js.map +1 -0
- package/dist/cli/CommandProcessor.d.ts +166 -19
- package/dist/cli/CommandProcessor.d.ts.map +1 -1
- package/dist/cli/commands/ConfigCommand.d.ts +36 -1
- package/dist/cli/commands/ConfigCommand.d.ts.map +1 -1
- package/dist/cli/commands/ExportCommand.d.ts +49 -3
- package/dist/cli/commands/ExportCommand.d.ts.map +1 -1
- package/dist/cli/commands/ThemeCommand.d.ts +62 -3
- package/dist/cli/commands/ThemeCommand.d.ts.map +1 -1
- package/dist/cli/help.d.ts +30 -2
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/index.d.ts +29 -2
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli.cjs +2 -2
- package/dist/cli.js +2 -2
- package/dist/context/LogContext.d.ts +165 -66
- package/dist/context/LogContext.d.ts.map +1 -1
- package/dist/context.cjs +1 -1
- package/dist/context.js +1 -1
- package/dist/core.cjs +52 -29
- package/dist/core.cjs.map +1 -1
- package/dist/core.d.ts +50 -27
- package/dist/core.d.ts.map +1 -1
- package/dist/core.js +52 -29
- package/dist/core.js.map +1 -1
- package/dist/hooks/HookBridge.d.ts +15 -9
- package/dist/hooks/HookBridge.d.ts.map +1 -1
- package/dist/hooks/HookManager.d.ts +295 -2
- package/dist/hooks/HookManager.d.ts.map +1 -1
- package/dist/hooks.cjs +1 -1
- package/dist/hooks.js +1 -1
- package/dist/index.cjs +1092 -212
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1092 -212
- package/dist/index.js.map +1 -1
- package/dist/playground/TerminalBridge.d.ts +23 -16
- package/dist/playground/TerminalBridge.d.ts.map +1 -1
- package/dist/playground/box.d.ts +36 -5
- package/dist/playground/box.d.ts.map +1 -1
- package/dist/playground/cli-table.d.ts +41 -5
- package/dist/playground/cli-table.d.ts.map +1 -1
- package/dist/playground/divider.d.ts +22 -3
- package/dist/playground/divider.d.ts.map +1 -1
- package/dist/playground/header.d.ts +21 -4
- package/dist/playground/header.d.ts.map +1 -1
- package/dist/playground/server-fallback.d.ts +96 -9
- package/dist/playground/server-fallback.d.ts.map +1 -1
- package/dist/playground/spinner.d.ts +159 -10
- package/dist/playground/spinner.d.ts.map +1 -1
- package/dist/playground/step.d.ts +25 -6
- package/dist/playground/step.d.ts.map +1 -1
- package/dist/playground.cjs +1 -1
- package/dist/playground.js +1 -1
- package/dist/serializers/SerializerBridge.d.ts +13 -6
- package/dist/serializers/SerializerBridge.d.ts.map +1 -1
- package/dist/serializers/SerializerRegistry.d.ts +236 -0
- package/dist/serializers/SerializerRegistry.d.ts.map +1 -1
- package/dist/serializers.cjs +1 -1
- package/dist/serializers.js +1 -1
- package/dist/styles/StyleManager.d.ts +138 -31
- package/dist/styles/StyleManager.d.ts.map +1 -1
- package/dist/styles.cjs +2 -2
- package/dist/styles.js +2 -2
- package/dist/styling/SmartPresets.d.ts +100 -6
- package/dist/styling/SmartPresets.d.ts.map +1 -1
- package/dist/styling/StyleBuilder.d.ts +453 -32
- package/dist/styling/StyleBuilder.d.ts.map +1 -1
- package/dist/styling/banners.d.ts +83 -7
- package/dist/styling/banners.d.ts.map +1 -1
- package/dist/styling/themes.d.ts +41 -2
- package/dist/styling/themes.d.ts.map +1 -1
- package/dist/transports/ConsoleTransport.d.ts +95 -0
- package/dist/transports/ConsoleTransport.d.ts.map +1 -1
- package/dist/transports/FileTransport.d.ts +99 -18
- package/dist/transports/FileTransport.d.ts.map +1 -1
- package/dist/transports/HttpTransport.d.ts +135 -22
- package/dist/transports/HttpTransport.d.ts.map +1 -1
- package/dist/transports/OtlpTransport.d.ts +53 -36
- package/dist/transports/OtlpTransport.d.ts.map +1 -1
- package/dist/transports/TransportBridge.d.ts +19 -13
- package/dist/transports/TransportBridge.d.ts.map +1 -1
- package/dist/transports/TransportManager.d.ts +223 -8
- package/dist/transports/TransportManager.d.ts.map +1 -1
- package/dist/transports.cjs +1 -1
- package/dist/transports.js +1 -1
- package/dist/types/core.d.ts +155 -59
- package/dist/types/core.d.ts.map +1 -1
- package/dist/types/hooks.d.ts +92 -14
- package/dist/types/hooks.d.ts.map +1 -1
- package/dist/types/serializers.d.ts +72 -0
- package/dist/types/serializers.d.ts.map +1 -1
- package/dist/types/transports.d.ts +42 -37
- package/dist/types/transports.d.ts.map +1 -1
- package/dist/utils/ansi-colors.d.ts +15 -15
- package/dist/utils/environment-detector.d.ts +11 -11
- package/dist/utils/formatting.d.ts +8 -8
- package/dist/utils/output.d.ts +9 -9
- package/dist/utils/output.d.ts.map +1 -1
- package/dist/utils/stackTrace.d.ts +2 -2
- package/package.json +24 -25
- package/dist/chunks/HookBridge-CiRfR67f.cjs +0 -190
- package/dist/chunks/HookBridge-CiRfR67f.cjs.map +0 -1
- package/dist/chunks/HookBridge-SgMmbXZB.js +0 -173
- package/dist/chunks/HookBridge-SgMmbXZB.js.map +0 -1
- package/dist/chunks/LogContext-Cwn-1Zzb.js.map +0 -1
- package/dist/chunks/LogContext-L7HzynFw.cjs.map +0 -1
- package/dist/chunks/SerializerBridge-BaOQOb8q.cjs +0 -166
- package/dist/chunks/SerializerBridge-BaOQOb8q.cjs.map +0 -1
- package/dist/chunks/SerializerBridge-BkpQu5c9.js +0 -149
- package/dist/chunks/SerializerBridge-BkpQu5c9.js.map +0 -1
- package/dist/chunks/StyleManager-CIpd6wbO.cjs.map +0 -1
- package/dist/chunks/StyleManager-LCvVlVdx.js +0 -87
- package/dist/chunks/StyleManager-LCvVlVdx.js.map +0 -1
- package/dist/chunks/core-Dzz7agGa.cjs.map +0 -1
- package/dist/chunks/core-PoT7RrTK.js.map +0 -1
- package/dist/chunks/environment-detector-CI3TrWK_.js.map +0 -1
- package/dist/chunks/environment-detector-Cnn6wr6O.cjs.map +0 -1
- package/dist/chunks/server-fallback-BUKjdLS7.cjs +0 -42
- package/dist/chunks/server-fallback-BUKjdLS7.cjs.map +0 -1
- package/dist/chunks/server-fallback-BsuWH1Dk.js +0 -37
- package/dist/chunks/server-fallback-BsuWH1Dk.js.map +0 -1
- package/dist/chunks/spinner-D3FsF78o.js.map +0 -1
- package/dist/chunks/spinner-DNvxbM9a.cjs.map +0 -1
- package/dist/chunks/styling-84N8T97t.js +0 -941
- package/dist/chunks/styling-84N8T97t.js.map +0 -1
- package/dist/chunks/styling-Cg5saQ46.cjs +0 -994
- package/dist/chunks/styling-Cg5saQ46.cjs.map +0 -1
- package/dist/chunks/transports-BiDk345e.js +0 -715
- package/dist/chunks/transports-BiDk345e.js.map +0 -1
- package/dist/chunks/transports-COPWmlF1.cjs +0 -756
- package/dist/chunks/transports-COPWmlF1.cjs.map +0 -1
- package/dist/chunks/utils-BqlFYocD.cjs.map +0 -1
- package/dist/chunks/utils-VETbVpkR.js.map +0 -1
- package/dist/example.d.ts +0 -18
- package/dist/example.d.ts.map +0 -1
- package/dist/main.d.ts +0 -2
- package/dist/main.d.ts.map +0 -1
package/dist/Logger.d.ts
CHANGED
|
@@ -49,37 +49,38 @@ export declare class Logger {
|
|
|
49
49
|
private hookBridge;
|
|
50
50
|
private logContext;
|
|
51
51
|
private transportBridge;
|
|
52
|
-
/**
|
|
52
|
+
/** Fijado por `success()` para que `log()` salte su propio dispatch. */
|
|
53
53
|
private _successTagDispatched;
|
|
54
54
|
private styleManager;
|
|
55
|
-
/**
|
|
55
|
+
/** Controla si las CLI primitives (step, box, header, ...) deben renderizarse. */
|
|
56
56
|
private _showPrimitives;
|
|
57
57
|
private terminalBridge;
|
|
58
58
|
/**
|
|
59
|
-
*
|
|
60
|
-
*
|
|
59
|
+
* Referencia activa al smart-preset (fijada por `preset()`). Tipada como
|
|
60
|
+
* `unknown` para mantener limpia la surface pública; la consume
|
|
61
|
+
* `createStyledOutput`.
|
|
61
62
|
*/
|
|
62
63
|
private _activePreset?;
|
|
63
64
|
/**
|
|
64
|
-
*
|
|
65
|
-
*
|
|
65
|
+
* Nombre del smart-preset activo. Se guarda aparte para que la detección
|
|
66
|
+
* de cambio de tema pueda re-renderizar sin re-ejecutar el body del preset.
|
|
66
67
|
*/
|
|
67
68
|
private _activePresetName?;
|
|
68
69
|
/**
|
|
69
|
-
*
|
|
70
|
-
* `createStyledOutput
|
|
70
|
+
* Overrides aplicados por el último `customize()`. Se conservan para que
|
|
71
|
+
* `createStyledOutput` los lea después.
|
|
71
72
|
*/
|
|
72
73
|
private _customization?;
|
|
73
74
|
/**
|
|
74
|
-
*
|
|
75
|
-
*
|
|
75
|
+
* Bindings propios de este logger (provenientes de llamadas a `child()`).
|
|
76
|
+
* Source of truth única de la contribución de este logger a la cadena de contexto.
|
|
76
77
|
* @private
|
|
77
78
|
*/
|
|
78
79
|
private _bindings;
|
|
79
80
|
/**
|
|
80
|
-
*
|
|
81
|
-
*
|
|
82
|
-
*
|
|
81
|
+
* Referencia al record de contexto mergueado del parent en el momento en
|
|
82
|
+
* que se creó este logger. Junto con `_bindings`, forma la cadena de
|
|
83
|
+
* contexto. `undefined` para el logger raíz.
|
|
83
84
|
* @private
|
|
84
85
|
*/
|
|
85
86
|
private _parentContextRecord;
|
|
@@ -178,86 +179,87 @@ export declare class Logger {
|
|
|
178
179
|
*/
|
|
179
180
|
setBannerType(bannerType: BannerType): void;
|
|
180
181
|
/**
|
|
181
|
-
*
|
|
182
|
-
*
|
|
182
|
+
* Ejecuta `fn` dentro de un scope AsyncLocalStorage donde `bindings` se
|
|
183
|
+
* merguean al contexto para todas las llamadas de log dentro de `fn`.
|
|
183
184
|
*
|
|
184
|
-
*
|
|
185
|
-
*
|
|
186
|
-
*
|
|
185
|
+
* Sin `fn` (el shape legacy de setter): no-op por backwards compatibility.
|
|
186
|
+
* Preferir `child()` para bindings persistentes o `withContextAsync()`
|
|
187
|
+
* para callbacks async.
|
|
187
188
|
*
|
|
188
|
-
* @param bindings -
|
|
189
|
-
* @param fn -
|
|
190
|
-
* @returns
|
|
189
|
+
* @param bindings - Pares key-value a adjuntar durante la ejecución de `fn`
|
|
190
|
+
* @param fn - Función sincrónica opcional a ejecutar con los bindings en scope
|
|
191
|
+
* @returns El valor de retorno de `fn`, o `undefined` si no se pasa `fn`
|
|
191
192
|
*
|
|
192
193
|
* @example
|
|
193
|
-
* //
|
|
194
|
+
* // Callback sincrónico scoped
|
|
194
195
|
* logger.withContext({ requestId: 'r-42' }, () => {
|
|
195
|
-
* doWork(); // logs
|
|
196
|
+
* doWork(); // los logs de aquí ven requestId en attributes
|
|
196
197
|
* });
|
|
197
198
|
*
|
|
198
199
|
* @example
|
|
199
|
-
* //
|
|
200
|
+
* // Binding persistente: usar child()
|
|
200
201
|
* const reqLog = logger.child({ requestId: 'r-42' });
|
|
201
|
-
* reqLog.info('handling request'); // attributes
|
|
202
|
+
* reqLog.info('handling request'); // attributes incluye requestId
|
|
202
203
|
*
|
|
203
|
-
* @see {@link child}
|
|
204
|
-
* @see {@link withContextAsync}
|
|
204
|
+
* @see {@link child} para una copia inmutable con el contexto mergueado
|
|
205
|
+
* @see {@link withContextAsync} para la variante con callback async
|
|
205
206
|
*/
|
|
206
207
|
withContext<R>(bindings: Record<string, unknown>, fn?: () => R): R | undefined;
|
|
207
208
|
/**
|
|
208
|
-
*
|
|
209
|
-
*
|
|
209
|
+
* Variante async de `withContext`. Ejecuta `fn` dentro de un scope
|
|
210
|
+
* AsyncLocalStorage para que los bindings estén disponibles a todas las
|
|
211
|
+
* llamadas de log async dentro de `fn`.
|
|
210
212
|
*
|
|
211
|
-
* @param bindings -
|
|
212
|
-
* @param fn -
|
|
213
|
-
* @returns
|
|
213
|
+
* @param bindings - Pares key-value a adjuntar durante la ejecución de `fn`
|
|
214
|
+
* @param fn - Función async a ejecutar con los bindings en scope
|
|
215
|
+
* @returns El valor de retorno de `fn`
|
|
214
216
|
*
|
|
215
217
|
* @example
|
|
216
218
|
* await logger.withContextAsync({ requestId: 'r-42' }, async () => {
|
|
217
|
-
* await fetchData(); // logs
|
|
219
|
+
* await fetchData(); // los logs de aquí ven requestId en attributes
|
|
218
220
|
* });
|
|
219
221
|
*
|
|
220
|
-
* @see {@link child}
|
|
221
|
-
* @see {@link withContext}
|
|
222
|
+
* @see {@link child} para un child logger persistente
|
|
223
|
+
* @see {@link withContext} para la variante con callback sincrónico
|
|
222
224
|
*/
|
|
223
225
|
withContextAsync<R>(bindings: Record<string, unknown>, fn: () => Promise<R>): Promise<R>;
|
|
224
226
|
/**
|
|
225
|
-
*
|
|
226
|
-
*
|
|
227
|
-
*
|
|
227
|
+
* Devuelve una copia inmutable de este logger con el contexto extra bound.
|
|
228
|
+
* Las llamadas futuras sobre el child emiten con el contexto mergueado,
|
|
229
|
+
* sin mutar al parent — el patrón canónico de MDC.
|
|
228
230
|
*
|
|
229
|
-
* @param extra -
|
|
230
|
-
* @returns
|
|
231
|
+
* @param extra - Pares key-value a adjuntar (requestId, userId, ...)
|
|
232
|
+
* @returns Un nuevo Logger con el contexto mergueado
|
|
231
233
|
*
|
|
232
234
|
* @example
|
|
233
235
|
* const reqLog = logger.child({ requestId: req.id });
|
|
234
|
-
* reqLog.info('start'); //
|
|
235
|
-
* logger.info('unrelated'); //
|
|
236
|
+
* reqLog.info('start'); // emite attributes: { requestId }
|
|
237
|
+
* logger.info('unrelated'); // NO afectado — el contexto del parent queda intacto
|
|
236
238
|
*
|
|
237
239
|
*/
|
|
238
240
|
child(extra: Record<string, unknown>): Logger;
|
|
239
241
|
/**
|
|
240
|
-
*
|
|
241
|
-
* records
|
|
242
|
-
* {@link child}
|
|
242
|
+
* Descarta todas las keys del contexto bound. Tras esta llamada, los
|
|
243
|
+
* records emitidos dejan de llevar `attributes` hasta que
|
|
244
|
+
* {@link withContext} o {@link child} restablezcan uno.
|
|
243
245
|
*
|
|
244
|
-
* @returns
|
|
246
|
+
* @returns La misma instancia del logger, ahora sin contexto
|
|
245
247
|
*/
|
|
246
248
|
clearContext(): this;
|
|
247
249
|
/**
|
|
248
|
-
* Snapshot
|
|
249
|
-
*
|
|
250
|
+
* Snapshot del contexto bound. El objeto devuelto es una shallow copy:
|
|
251
|
+
* mutarlo NO afecta lo que emiten las llamadas de log posteriores.
|
|
250
252
|
*
|
|
251
|
-
* @returns
|
|
253
|
+
* @returns Un snapshot read-only del contexto actual
|
|
252
254
|
*/
|
|
253
255
|
getContext(): Readonly<Record<string, unknown>>;
|
|
254
256
|
/**
|
|
255
|
-
*
|
|
256
|
-
*
|
|
257
|
-
* record
|
|
257
|
+
* Actualiza el resource OTel por defecto (service.name, version, env).
|
|
258
|
+
* Se persiste en el campo `resource` de cada record emitido, salvo que
|
|
259
|
+
* el propio record lo override.
|
|
258
260
|
*
|
|
259
|
-
* @param resource -
|
|
260
|
-
* @returns
|
|
261
|
+
* @param resource - Resource OTel parcial a merguear con el actual
|
|
262
|
+
* @returns La misma instancia del logger, para chaining
|
|
261
263
|
*
|
|
262
264
|
* @example
|
|
263
265
|
* logger.setResource({ 'service.name': 'api', 'service.version': '1.2.3' });
|
|
@@ -274,20 +276,15 @@ export declare class Logger {
|
|
|
274
276
|
*/
|
|
275
277
|
resetConfig(): void;
|
|
276
278
|
/**
|
|
277
|
-
* Método de limpieza para eliminar listeners y liberar recursos
|
|
278
|
-
*
|
|
279
|
-
* @example
|
|
280
|
-
* // Antes de cerrar la aplicación
|
|
281
|
-
* logger.cleanup();
|
|
279
|
+
* Método de limpieza para eliminar listeners y liberar recursos.
|
|
282
280
|
*
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
*
|
|
286
|
-
* times. Fixed in 5.1.0 to fully drain transports + clear timers +
|
|
287
|
-
* drop the legacy handler list + reset group depth + clear context.
|
|
281
|
+
* Vacía los transports (drain), limpia timers, suelta la lista de
|
|
282
|
+
* handlers legacy, resetea el group depth y limpia el context.
|
|
283
|
+
* Seguro de invocar múltiples veces.
|
|
288
284
|
*
|
|
289
285
|
* @example
|
|
290
|
-
*
|
|
286
|
+
* // Antes de cerrar la aplicación
|
|
287
|
+
* await logger.cleanup();
|
|
291
288
|
*
|
|
292
289
|
*/
|
|
293
290
|
cleanup(): Promise<void>;
|
|
@@ -303,7 +300,7 @@ export declare class Logger {
|
|
|
303
300
|
* logger.preset('glassmorphism'); // Efectos de blur modernos
|
|
304
301
|
* logger.preset('minimal'); // Minimalista y elegante
|
|
305
302
|
* logger.preset('debug'); // Modo desarrollo detallado
|
|
306
|
-
* logger.preset('production'); //
|
|
303
|
+
* logger.preset('production'); // Enfocado en producción
|
|
307
304
|
*
|
|
308
305
|
*/
|
|
309
306
|
preset(name: string): void;
|
|
@@ -407,8 +404,59 @@ export declare class Logger {
|
|
|
407
404
|
*
|
|
408
405
|
*/
|
|
409
406
|
clearBadges(): this;
|
|
407
|
+
/**
|
|
408
|
+
* Crea un logger scoped para un componente o módulo del dominio.
|
|
409
|
+
*
|
|
410
|
+
* El `ComponentLogger` resultante prepends un badge `[name]` a cada
|
|
411
|
+
* mensaje y comparte configuración, transports y hooks con el logger
|
|
412
|
+
* padre. Útil para trazar el origen de los logs en apps con muchos
|
|
413
|
+
* módulos (Auth, DB, Cache, ...).
|
|
414
|
+
*
|
|
415
|
+
* @param {string} name - Nombre del componente que aparecerá como badge
|
|
416
|
+
* @returns {ComponentLogger} Logger scoped para el componente
|
|
417
|
+
*
|
|
418
|
+
* @example
|
|
419
|
+
* const auth = logger.component('Auth');
|
|
420
|
+
* auth.info('Validando token'); // [Auth] Validando token
|
|
421
|
+
* auth.success('Token válido');
|
|
422
|
+
*
|
|
423
|
+
* @see {@link api} para loggers de endpoints REST/GraphQL
|
|
424
|
+
* @see {@link scope} para un scope genérico sin badge de componente
|
|
425
|
+
*/
|
|
410
426
|
component(name: string): ComponentLogger;
|
|
427
|
+
/**
|
|
428
|
+
* Crea un logger scoped para un endpoint o surface de API.
|
|
429
|
+
*
|
|
430
|
+
* Como `component()` pero con styling orientado a APIs (badge `[API]`
|
|
431
|
+
* por defecto más el nombre del sub-scope). Útil para distinguir
|
|
432
|
+
* tráfico REST vs GraphQL vs WebSocket en los logs.
|
|
433
|
+
*
|
|
434
|
+
* @param {string} name - Nombre de la API o surface (p.ej. `'REST'`, `'GraphQL'`)
|
|
435
|
+
* @returns {APILogger} Logger scoped para la API
|
|
436
|
+
*
|
|
437
|
+
* @example
|
|
438
|
+
* const rest = logger.api('REST');
|
|
439
|
+
* rest.info('GET /users/42'); // [API] [REST] GET /users/42
|
|
440
|
+
*
|
|
441
|
+
* @see {@link component} para loggers de componentes de dominio
|
|
442
|
+
*/
|
|
411
443
|
api(name: string): APILogger;
|
|
444
|
+
/**
|
|
445
|
+
* Crea un logger scoped genérico con un prefijo.
|
|
446
|
+
*
|
|
447
|
+
* Variante minimal de `component()` / `api()`: solo aplica un prefijo
|
|
448
|
+
* de scope sin badges ni styling especial. Útil para sub-módulos que
|
|
449
|
+
* no encajan en las categorías de `component`/`api`.
|
|
450
|
+
*
|
|
451
|
+
* @param {string} name - Texto del prefijo de scope
|
|
452
|
+
* @returns {ScopedLogger} Logger con el scope aplicado
|
|
453
|
+
*
|
|
454
|
+
* @example
|
|
455
|
+
* const db = logger.scope('db');
|
|
456
|
+
* db.info('Pool conectado'); // [db] Pool conectado
|
|
457
|
+
*
|
|
458
|
+
* @see {@link component} y {@link api} para variantes con badges
|
|
459
|
+
*/
|
|
412
460
|
scope(name: string): ScopedLogger;
|
|
413
461
|
/**
|
|
414
462
|
* Personalización simple con configuración mínima
|
|
@@ -627,37 +675,48 @@ export declare class Logger {
|
|
|
627
675
|
*/
|
|
628
676
|
private shouldLog;
|
|
629
677
|
/**
|
|
630
|
-
*
|
|
631
|
-
* (
|
|
632
|
-
* `log()
|
|
633
|
-
* `time()` — so all emissions hit the same transport pipeline.
|
|
678
|
+
* Tag pendiente de inyectar en el siguiente `TransportRecord` emitido
|
|
679
|
+
* por `log()`. Lo fijan `success()` y `logWithBindingsAndTag()` antes
|
|
680
|
+
* de delegar; `log()` lo consume y lo resetea a `undefined`.
|
|
634
681
|
*
|
|
635
|
-
* @
|
|
636
|
-
* @param message - Final, post-hook message text
|
|
637
|
-
* @param prefix - Effective prefix (global + scope)
|
|
638
|
-
* @param stackInfo - Optional caller location
|
|
639
|
-
* @param extra - Optional fields to merge into the record (e.g. `{ tag: 'success' }`)
|
|
682
|
+
* @internal
|
|
640
683
|
*/
|
|
641
684
|
protected _dispatchTag: string | undefined;
|
|
642
685
|
/**
|
|
643
|
-
*
|
|
686
|
+
* Computa el contexto completamente mergueado para este logger.
|
|
644
687
|
*
|
|
645
|
-
*
|
|
646
|
-
*
|
|
647
|
-
*
|
|
648
|
-
*
|
|
688
|
+
* La cadena de contexto se construye en el momento de crear el child:
|
|
689
|
+
* cada child almacena el contexto fully-merged de su parent (en ese
|
|
690
|
+
* instante) como `_parentContextRecord`. Esto implica que
|
|
691
|
+
* `_parentContextRecord` ya contiene los bindings de todos los ancestros
|
|
692
|
+
* en el orden de precedencia correcto (root primero, child más cercano al final).
|
|
649
693
|
*
|
|
650
|
-
*
|
|
651
|
-
* 1. _parentContextRecord —
|
|
652
|
-
* 2. _bindings —
|
|
653
|
-
* 3. ALS store — withContext
|
|
694
|
+
* Orden de merge (gana el último):
|
|
695
|
+
* 1. _parentContextRecord — snapshot del contexto mergueado del parent en la creación
|
|
696
|
+
* 2. _bindings — bindings propios de este logger (llamadas a `child()`)
|
|
697
|
+
* 3. ALS store — scope de `withContext`/`withContextAsync` (prioridad máxima)
|
|
654
698
|
*
|
|
655
699
|
* @internal
|
|
656
|
-
* @returns
|
|
700
|
+
* @returns El record de contexto mergueado
|
|
657
701
|
*/
|
|
658
702
|
private _getMergedContext;
|
|
659
|
-
/** @internal
|
|
703
|
+
/** @internal Expone el contexto base mergueado (sin ALS) a la closure de la child factory de LogContext. */
|
|
660
704
|
_captureMergedContext(): Record<string, unknown>;
|
|
705
|
+
/**
|
|
706
|
+
* Construye y despacha un `TransportRecord` al {@link TransportManager}
|
|
707
|
+
* (no-op si no hay transports registrados). Lo comparten todos los
|
|
708
|
+
* caminos de log — `log()`, `success()` y los métodos visuales como
|
|
709
|
+
* `table()` / `group()` / `time()` — para que toda emisión atraviese
|
|
710
|
+
* el mismo pipeline de transports.
|
|
711
|
+
*
|
|
712
|
+
* @protected
|
|
713
|
+
* @param {LogLevel} level - Nivel canónico (trace/debug/info/warn/error/critical)
|
|
714
|
+
* @param {string} message - Mensaje final, post-hook
|
|
715
|
+
* @param {string | undefined} prefix - Prefijo efectivo (global + scope)
|
|
716
|
+
* @param {StackInfo | null} stackInfo - Ubicación del caller, opcional
|
|
717
|
+
* @param {Partial<TransportRecord>} [extra] - Campos extra a mergear en el record
|
|
718
|
+
* (p.ej. `{ tag: 'success' }` o `attributes` adicionales)
|
|
719
|
+
*/
|
|
661
720
|
protected dispatchToTransports(level: LogLevel, message: string, prefix: string | undefined, stackInfo: StackInfo | null, extra?: Partial<TransportRecord>): void;
|
|
662
721
|
/**
|
|
663
722
|
* Obtiene el prefijo efectivo (global + scope)
|
|
@@ -666,50 +725,78 @@ export declare class Logger {
|
|
|
666
725
|
*/
|
|
667
726
|
private getEffectivePrefix;
|
|
668
727
|
/**
|
|
669
|
-
* Método central de logging.
|
|
670
|
-
*
|
|
671
|
-
*
|
|
728
|
+
* Método central de logging. Espera el hook pipeline `beforeLog`
|
|
729
|
+
* antes de despachar a consola y transports, para que redacciones
|
|
730
|
+
* o enriquecimientos (PII, correlation IDs) se reflejen en el
|
|
731
|
+
* mensaje emitido.
|
|
732
|
+
*
|
|
733
|
+
* Los callers fire-and-forget (p.ej. `logger.info(...)` sin `await`)
|
|
734
|
+
* siguen funcionando: el `Promise<void>` resultante se descarta.
|
|
735
|
+
* Se recomienda `await` cuando los hooks `beforeLog` mutan `message`.
|
|
672
736
|
*
|
|
673
|
-
*
|
|
674
|
-
*
|
|
675
|
-
*
|
|
676
|
-
* (e.g. PII redaction, correlation IDs).
|
|
737
|
+
* El tag opcional (`TransportRecord.tag`) NO se pasa como argumento:
|
|
738
|
+
* se establece vía `_dispatchTag` (ver `success()` y
|
|
739
|
+
* {@link logWithBindingsAndTag}) antes de invocar este método.
|
|
677
740
|
*
|
|
678
741
|
* @protected
|
|
679
|
-
* @param level - Nivel del log
|
|
680
|
-
* @param args - Argumentos a loggear
|
|
681
|
-
* @returns Promise
|
|
742
|
+
* @param {LogLevel} level - Nivel del log
|
|
743
|
+
* @param {unknown[]} args - Argumentos a loggear (mensaje + datos)
|
|
744
|
+
* @returns {Promise<void>} Promesa que resuelve al completar el dispatch
|
|
682
745
|
*
|
|
683
746
|
*/
|
|
747
|
+
protected log(level: LogLevel, ...args: unknown[]): Promise<void>;
|
|
684
748
|
/**
|
|
685
|
-
*
|
|
686
|
-
*
|
|
687
|
-
* emitted message before console + transport dispatch).
|
|
749
|
+
* Emite un log aplicando bindings (badges, scope) al prefijo del
|
|
750
|
+
* mensaje antes de delegar en {@link Logger.log}.
|
|
688
751
|
*
|
|
689
|
-
*
|
|
690
|
-
*
|
|
691
|
-
*
|
|
692
|
-
* (e.g. PII redaction, correlation IDs).
|
|
752
|
+
* No es API pública de consumo: existe para que `ScopedLogger`
|
|
753
|
+
* (`component()` / `api()` / `scope()`) pueda reutilizar el pipeline
|
|
754
|
+
* central de `log()` sin duplicar la lógica de styling/badges.
|
|
693
755
|
*
|
|
694
|
-
* @
|
|
695
|
-
* @param
|
|
696
|
-
* @param
|
|
697
|
-
* @param
|
|
698
|
-
*
|
|
699
|
-
* @returns Promise that resolves once the record has been dispatched
|
|
756
|
+
* @internal
|
|
757
|
+
* @param {Bindings} bindings - Bindings de scope (badges, scope name, ...)
|
|
758
|
+
* @param {LogLevel} level - Nivel de log
|
|
759
|
+
* @param {unknown[]} args - Argumentos a loggear
|
|
760
|
+
* @returns {Promise<void>} Promesa del dispatch
|
|
700
761
|
*
|
|
762
|
+
* @see {@link logWithBindingsAndTag} para la variante con `tag`
|
|
701
763
|
*/
|
|
702
|
-
protected log(level: LogLevel, ...args: unknown[]): Promise<void>;
|
|
703
764
|
logWithBindings(bindings: Bindings, level: LogLevel, ...args: unknown[]): Promise<void>;
|
|
704
765
|
/**
|
|
705
|
-
*
|
|
706
|
-
* `log()`
|
|
707
|
-
*
|
|
766
|
+
* Como {@link logWithBindings} pero fija `_dispatchTag` antes de
|
|
767
|
+
* delegar, para que `log()` despache el `TransportRecord` con el
|
|
768
|
+
* tag indicado. Lo usa `ScopedLogger.success()` para propagar
|
|
769
|
+
* `tag: 'success'` a través del pipeline normal de `log()`.
|
|
770
|
+
*
|
|
771
|
+
* @internal
|
|
772
|
+
* @param {Bindings} bindings - Bindings de scope (badges, scope name, ...)
|
|
773
|
+
* @param {LogLevel} level - Nivel de log
|
|
774
|
+
* @param {LogTag} tag - Tag a inyectar en el `TransportRecord`
|
|
775
|
+
* @param {unknown[]} args - Argumentos a loggear
|
|
776
|
+
* @returns {Promise<void>} Promesa del dispatch
|
|
708
777
|
*/
|
|
709
778
|
logWithBindingsAndTag(bindings: Bindings, level: LogLevel, tag: LogTag, ...args: unknown[]): Promise<void>;
|
|
779
|
+
/**
|
|
780
|
+
* Registra mensajes de debug (nivel más verboso junto a `trace`).
|
|
781
|
+
* Pensado para diagnóstico de desarrollo: valores intermedios, flags
|
|
782
|
+
* de control flow, estado interno. Devuelve `Promise<void>`.
|
|
783
|
+
*
|
|
784
|
+
* Filtrado por defecto cuando `verbosity > 'debug'` (ver `setVerbosity`).
|
|
785
|
+
*
|
|
786
|
+
* @param {unknown[]} args - Mensaje + datos a inspeccionar
|
|
787
|
+
* @returns {Promise<void>} Promesa del dispatch
|
|
788
|
+
*
|
|
789
|
+
* @example
|
|
790
|
+
* logger.debug('Estado interno:', { conn, queueSize });
|
|
791
|
+
* logger.debug('Entrando en branch X');
|
|
792
|
+
*
|
|
793
|
+
* @see {@link trace} para diagnósticos aún más granulares
|
|
794
|
+
* @see {@link setVerbosity} para controlar el nivel mínimo visible
|
|
795
|
+
*/
|
|
710
796
|
debug(...args: unknown[]): Promise<void>;
|
|
711
797
|
/**
|
|
712
|
-
* Registra mensajes informativos.
|
|
798
|
+
* Registra mensajes informativos. El `await` retorna cuando el hook
|
|
799
|
+
* `beforeLog` y el dispatch a transports han terminado.
|
|
713
800
|
*
|
|
714
801
|
* @param args - Mensajes y datos informativos
|
|
715
802
|
*
|
|
@@ -720,14 +807,14 @@ export declare class Logger {
|
|
|
720
807
|
*/
|
|
721
808
|
info(...args: unknown[]): Promise<void>;
|
|
722
809
|
/**
|
|
723
|
-
* Registra mensajes de advertencia.
|
|
810
|
+
* Registra mensajes de advertencia.
|
|
724
811
|
*
|
|
725
812
|
* @param args - Mensajes de advertencia
|
|
726
813
|
*
|
|
727
814
|
*/
|
|
728
815
|
warn(...args: unknown[]): Promise<void>;
|
|
729
816
|
/**
|
|
730
|
-
* Registra mensajes de error.
|
|
817
|
+
* Registra mensajes de error.
|
|
731
818
|
*
|
|
732
819
|
* @param args - Mensaje de error y stack traces
|
|
733
820
|
*
|
|
@@ -760,7 +847,7 @@ export declare class Logger {
|
|
|
760
847
|
*/
|
|
761
848
|
trace(...args: unknown[]): void;
|
|
762
849
|
/**
|
|
763
|
-
* Registra errores críticos (prioridad más alta).
|
|
850
|
+
* Registra errores críticos (prioridad más alta).
|
|
764
851
|
*
|
|
765
852
|
* @param args - Errores críticos del sistema
|
|
766
853
|
*
|
|
@@ -824,7 +911,7 @@ export declare class Logger {
|
|
|
824
911
|
* Finaliza un temporizador y muestra el tiempo transcurrido
|
|
825
912
|
*
|
|
826
913
|
* @param {string} label - Etiqueta del temporizador a finalizar
|
|
827
|
-
* @returns {number}
|
|
914
|
+
* @returns {number} Milisegundos transcurridos, o `-1` si no se encuentra el timer
|
|
828
915
|
*
|
|
829
916
|
* @example
|
|
830
917
|
* logger.time('consulta-db');
|
|
@@ -877,11 +964,11 @@ export declare class Logger {
|
|
|
877
964
|
*/
|
|
878
965
|
logAnimated(message: string, duration?: number): void;
|
|
879
966
|
/**
|
|
880
|
-
*
|
|
967
|
+
* Muestra un indicador de progreso de pasos en la terminal
|
|
881
968
|
*
|
|
882
|
-
* @param {number} current -
|
|
883
|
-
* @param {number} total -
|
|
884
|
-
* @param {string} message -
|
|
969
|
+
* @param {number} current - Número de paso actual
|
|
970
|
+
* @param {number} total - Número total de pasos
|
|
971
|
+
* @param {string} message - Descripción del paso
|
|
885
972
|
*
|
|
886
973
|
* @example
|
|
887
974
|
* logger.step(1, 5, 'Analyzing repository...');
|
|
@@ -890,10 +977,10 @@ export declare class Logger {
|
|
|
890
977
|
*/
|
|
891
978
|
step(current: number, total: number, message: string): void;
|
|
892
979
|
/**
|
|
893
|
-
*
|
|
980
|
+
* Muestra un header con estilo y subtítulo opcional
|
|
894
981
|
*
|
|
895
|
-
* @param {string} title -
|
|
896
|
-
* @param {string} subtitle -
|
|
982
|
+
* @param {string} title - Texto del título principal
|
|
983
|
+
* @param {string} subtitle - Subtítulo opcional (se renderiza atenuado)
|
|
897
984
|
*
|
|
898
985
|
* @example
|
|
899
986
|
* logger.header('Commit Wizard', 'v2.0.0');
|
|
@@ -901,7 +988,7 @@ export declare class Logger {
|
|
|
901
988
|
*/
|
|
902
989
|
header(title: string, subtitle?: string): void;
|
|
903
990
|
/**
|
|
904
|
-
*
|
|
991
|
+
* Muestra una línea divisoria horizontal
|
|
905
992
|
*
|
|
906
993
|
* @example
|
|
907
994
|
* logger.divider();
|
|
@@ -909,7 +996,7 @@ export declare class Logger {
|
|
|
909
996
|
*/
|
|
910
997
|
divider(): void;
|
|
911
998
|
/**
|
|
912
|
-
*
|
|
999
|
+
* Emite una línea en blanco
|
|
913
1000
|
*
|
|
914
1001
|
* @example
|
|
915
1002
|
* logger.blank();
|
|
@@ -917,10 +1004,10 @@ export declare class Logger {
|
|
|
917
1004
|
*/
|
|
918
1005
|
blank(): void;
|
|
919
1006
|
/**
|
|
920
|
-
*
|
|
1007
|
+
* Renderiza contenido dentro de un box con borde
|
|
921
1008
|
*
|
|
922
|
-
* @param {string} content -
|
|
923
|
-
* @param {IBoxOptions} options -
|
|
1009
|
+
* @param {string} content - String de contenido (puede contener newlines)
|
|
1010
|
+
* @param {IBoxOptions} options - Opciones de renderizado del box
|
|
924
1011
|
*
|
|
925
1012
|
* @example
|
|
926
1013
|
* logger.box('3 commits generated\nProvider: Groq', { title: 'Done', borderColor: '#00ff00' });
|
|
@@ -928,11 +1015,11 @@ export declare class Logger {
|
|
|
928
1015
|
*/
|
|
929
1016
|
box(content: string, options?: IBoxOptions): void;
|
|
930
1017
|
/**
|
|
931
|
-
*
|
|
932
|
-
*
|
|
1018
|
+
* Renderiza un array de objetos como una tabla ASCII formateada.
|
|
1019
|
+
* Distinto del método `table()` existente, que usa `console.table`.
|
|
933
1020
|
*
|
|
934
|
-
* @param {Record<string, unknown>[]} rows - Array
|
|
935
|
-
* @param {ITableOptions} options -
|
|
1021
|
+
* @param {Record<string, unknown>[]} rows - Array de objetos fila
|
|
1022
|
+
* @param {ITableOptions} options - Opciones de renderizado de la tabla
|
|
936
1023
|
*
|
|
937
1024
|
* @example
|
|
938
1025
|
* logger.cliTable([
|
|
@@ -943,11 +1030,11 @@ export declare class Logger {
|
|
|
943
1030
|
*/
|
|
944
1031
|
cliTable(rows: Record<string, unknown>[], options?: ITableOptions): void;
|
|
945
1032
|
/**
|
|
946
|
-
*
|
|
947
|
-
*
|
|
1033
|
+
* Crea un handle de spinner para mostrar progreso durante operaciones async.
|
|
1034
|
+
* Devuelve un `NoopSpinner` en entornos non-TTY.
|
|
948
1035
|
*
|
|
949
|
-
* @param {string} message -
|
|
950
|
-
* @returns {ISpinnerHandle}
|
|
1036
|
+
* @param {string} message - Texto inicial del spinner
|
|
1037
|
+
* @returns {ISpinnerHandle} Controller del spinner
|
|
951
1038
|
*
|
|
952
1039
|
* @example
|
|
953
1040
|
* const s = logger.spinner('Analyzing repository...');
|
|
@@ -958,30 +1045,31 @@ export declare class Logger {
|
|
|
958
1045
|
*/
|
|
959
1046
|
spinner(message: string): ISpinnerHandle;
|
|
960
1047
|
/**
|
|
961
|
-
*
|
|
1048
|
+
* Fija el nivel de verbosidad del CLI, controlando a la vez la verbosidad
|
|
1049
|
+
* de logs y la visibilidad de las primitives
|
|
962
1050
|
*
|
|
963
|
-
* @param {CLILogLevel} level -
|
|
1051
|
+
* @param {CLILogLevel} level - Nivel de log del CLI
|
|
964
1052
|
*
|
|
965
1053
|
* @example
|
|
966
|
-
* logger.setCLILevel('quiet'); //
|
|
967
|
-
* logger.setCLILevel('verbose'); // Debug logs +
|
|
1054
|
+
* logger.setCLILevel('quiet'); // Solo errors, sin CLI primitives
|
|
1055
|
+
* logger.setCLILevel('verbose'); // Debug logs + todas las CLI primitives
|
|
968
1056
|
*
|
|
969
1057
|
*/
|
|
970
1058
|
setCLILevel(level: CLILogLevel): void;
|
|
971
1059
|
/**
|
|
972
|
-
*
|
|
973
|
-
* @returns {CLILogLevel}
|
|
1060
|
+
* Devuelve el nivel de log del CLI actual
|
|
1061
|
+
* @returns {CLILogLevel} Nivel de log del CLI actual
|
|
974
1062
|
*/
|
|
975
1063
|
get cliLevel(): CLILogLevel;
|
|
976
1064
|
/**
|
|
977
|
-
*
|
|
978
|
-
*
|
|
1065
|
+
* Escribe output formateado al destino configurado.
|
|
1066
|
+
* Respeta la configuración `outputMode` para output a consola, silencioso o custom.
|
|
979
1067
|
*
|
|
980
1068
|
* @private
|
|
981
|
-
* @param {string} message -
|
|
982
|
-
* @param {LogLevel} level -
|
|
983
|
-
* @param {string[]} styles - CSS
|
|
984
|
-
* @param {unknown[]} additionalArgs -
|
|
1069
|
+
* @param {string} message - Mensaje de log formateado
|
|
1070
|
+
* @param {LogLevel} level - Nivel de log
|
|
1071
|
+
* @param {string[]} styles - Estilos CSS para la consola del navegador
|
|
1072
|
+
* @param {unknown[]} additionalArgs - Argumentos adicionales a loggear
|
|
985
1073
|
*/
|
|
986
1074
|
private writeOutput;
|
|
987
1075
|
/**
|
|
@@ -1005,15 +1093,16 @@ export declare class Logger {
|
|
|
1005
1093
|
cli(command: string): Promise<void>;
|
|
1006
1094
|
}
|
|
1007
1095
|
/**
|
|
1008
|
-
*
|
|
1009
|
-
*
|
|
1010
|
-
* hot reload
|
|
1096
|
+
* Resetea el singleton por defecto. Limpia la instancia cacheada para que la
|
|
1097
|
+
* próxima llamada a `getDefaultLogger()` la reconstruya desde defaults. Útil
|
|
1098
|
+
* para tests y escenarios de hot reload.
|
|
1011
1099
|
*
|
|
1012
1100
|
*/
|
|
1013
1101
|
export declare function resetDefaultLogger(): void;
|
|
1014
1102
|
/**
|
|
1015
1103
|
* Lazy default export — every property access defers to `getDefaultLogger()`.
|
|
1016
|
-
*
|
|
1104
|
+
* Sin side-effects al importar el módulo (la primera llamada al singleton
|
|
1105
|
+
* se produce en el primer acceso a una propiedad, no en el `import`).
|
|
1017
1106
|
*
|
|
1018
1107
|
* @example
|
|
1019
1108
|
* import logger from 'better-logger';
|