@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
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { c as StyleBuilder } from "./styling-
|
|
2
|
-
import { l as supportsANSI, n as getEnvironment } from "./environment-detector-
|
|
1
|
+
import { c as StyleBuilder } from "./styling-CRw3KQW4.js";
|
|
2
|
+
import { l as supportsANSI, n as getEnvironment } from "./environment-detector-7NvnYUfr.js";
|
|
3
3
|
//#region src/utils/stackTrace.ts
|
|
4
4
|
/**
|
|
5
|
-
*
|
|
5
|
+
* Comprueba si un nombre de archivo corresponde a un archivo minificado/bundle
|
|
6
6
|
*/
|
|
7
7
|
function isMinifiedFile(filename) {
|
|
8
8
|
return [
|
|
@@ -18,13 +18,13 @@ function isMinifiedFile(filename) {
|
|
|
18
18
|
].some((pattern) => pattern.test(filename));
|
|
19
19
|
}
|
|
20
20
|
/**
|
|
21
|
-
*
|
|
21
|
+
* Extrae un nombre de archivo limpio a partir de la ruta completa
|
|
22
22
|
*/
|
|
23
23
|
function extractCleanFilename(fullPath) {
|
|
24
24
|
return (fullPath.split(/[/\\]/).pop() || fullPath).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");
|
|
25
25
|
}
|
|
26
26
|
/**
|
|
27
|
-
*
|
|
27
|
+
* Parsea el stack trace actual para extraer la información del caller
|
|
28
28
|
*/
|
|
29
29
|
function parseStackTrace() {
|
|
30
30
|
try {
|
|
@@ -221,7 +221,7 @@ const CLI_LEVEL_MAP = {
|
|
|
221
221
|
//#endregion
|
|
222
222
|
//#region src/utils/ansi-colors.ts
|
|
223
223
|
/**
|
|
224
|
-
*
|
|
224
|
+
* Códigos de color ANSI para estilos en terminal
|
|
225
225
|
*/
|
|
226
226
|
const ANSI_CODES = {
|
|
227
227
|
black: 30,
|
|
@@ -275,7 +275,7 @@ const ANSI_CODES = {
|
|
|
275
275
|
resetStrikethrough: 29
|
|
276
276
|
};
|
|
277
277
|
/**
|
|
278
|
-
* ANSI
|
|
278
|
+
* Presets de colores ANSI para los distintos niveles de log
|
|
279
279
|
*/
|
|
280
280
|
const ANSI_LEVEL_STYLES = {
|
|
281
281
|
trace: {
|
|
@@ -319,60 +319,60 @@ const ANSI_LEVEL_STYLES = {
|
|
|
319
319
|
}
|
|
320
320
|
};
|
|
321
321
|
/**
|
|
322
|
-
*
|
|
322
|
+
* Crea una secuencia de escape ANSI
|
|
323
323
|
*/
|
|
324
324
|
function ansi(code) {
|
|
325
325
|
return `\x1b[${(Array.isArray(code) ? code : [code]).join(";")}m`;
|
|
326
326
|
}
|
|
327
327
|
/**
|
|
328
|
-
*
|
|
328
|
+
* Aplica estilos ANSI al texto
|
|
329
329
|
*/
|
|
330
330
|
function ansiStyle(text, codes) {
|
|
331
331
|
if (!supportsANSI()) return text;
|
|
332
332
|
return `${ansi(codes)}${text}${ansi(ANSI_CODES.reset)}`;
|
|
333
333
|
}
|
|
334
334
|
/**
|
|
335
|
-
*
|
|
335
|
+
* Aplica color al texto
|
|
336
336
|
*/
|
|
337
337
|
function ansiColor(text, color) {
|
|
338
338
|
return ansiStyle(text, [color]);
|
|
339
339
|
}
|
|
340
340
|
/**
|
|
341
|
-
*
|
|
341
|
+
* Aplica color de fondo al texto
|
|
342
342
|
*/
|
|
343
343
|
function ansiBackground(text, bg, color) {
|
|
344
344
|
if (color) return ansiStyle(text, [color, bg]);
|
|
345
345
|
return ansiStyle(text, [bg]);
|
|
346
346
|
}
|
|
347
347
|
/**
|
|
348
|
-
*
|
|
348
|
+
* Pone el texto en bold
|
|
349
349
|
*/
|
|
350
350
|
function ansiBold(text) {
|
|
351
351
|
return ansiStyle(text, [ANSI_CODES.bold]);
|
|
352
352
|
}
|
|
353
353
|
/**
|
|
354
|
-
*
|
|
354
|
+
* Aplica dim al texto
|
|
355
355
|
*/
|
|
356
356
|
function ansiDim(text) {
|
|
357
357
|
return ansiStyle(text, [ANSI_CODES.dim]);
|
|
358
358
|
}
|
|
359
359
|
/**
|
|
360
|
-
*
|
|
360
|
+
* Subraya el texto
|
|
361
361
|
*/
|
|
362
362
|
function ansiUnderline(text) {
|
|
363
363
|
return ansiStyle(text, [ANSI_CODES.underline]);
|
|
364
364
|
}
|
|
365
365
|
/**
|
|
366
|
-
*
|
|
366
|
+
* Formatters especializados para distintos contextos
|
|
367
367
|
*/
|
|
368
368
|
/**
|
|
369
|
-
*
|
|
369
|
+
* Formatea el timestamp para terminal
|
|
370
370
|
*/
|
|
371
371
|
function formatTimestampANSI(timestamp) {
|
|
372
372
|
return ansiColor(timestamp, ANSI_CODES.brightBlack);
|
|
373
373
|
}
|
|
374
374
|
/**
|
|
375
|
-
*
|
|
375
|
+
* Formatea el nivel de log para terminal
|
|
376
376
|
*/
|
|
377
377
|
function formatLogLevelANSI(level, useEmojis = true) {
|
|
378
378
|
const style = ANSI_LEVEL_STYLES[level];
|
|
@@ -384,7 +384,7 @@ function formatLogLevelANSI(level, useEmojis = true) {
|
|
|
384
384
|
return ansiStyle(`${emoji} ${label}`, codes);
|
|
385
385
|
}
|
|
386
386
|
/**
|
|
387
|
-
*
|
|
387
|
+
* Formatea el mensaje de success para terminal
|
|
388
388
|
*/
|
|
389
389
|
function formatSuccessANSI(message, useEmojis = true) {
|
|
390
390
|
const style = ANSI_LEVEL_STYLES.success;
|
|
@@ -393,14 +393,14 @@ function formatSuccessANSI(message, useEmojis = true) {
|
|
|
393
393
|
return `${ansiStyle(`${emoji} SUCCESS:`, [style.color, ...style.styles])} ${message}`;
|
|
394
394
|
}
|
|
395
395
|
/**
|
|
396
|
-
*
|
|
396
|
+
* Formatea el prefix para terminal
|
|
397
397
|
*/
|
|
398
398
|
function formatPrefixANSI(prefix) {
|
|
399
399
|
if (!supportsANSI()) return `[${prefix}]`;
|
|
400
400
|
return ansiStyle(`[${prefix}]`, [ANSI_CODES.cyan, ANSI_CODES.bold]);
|
|
401
401
|
}
|
|
402
402
|
/**
|
|
403
|
-
*
|
|
403
|
+
* Formatea la ubicación del archivo para terminal
|
|
404
404
|
*/
|
|
405
405
|
function formatLocationANSI(location) {
|
|
406
406
|
if (!supportsANSI()) return `(${location})`;
|
|
@@ -409,7 +409,7 @@ function formatLocationANSI(location) {
|
|
|
409
409
|
//#endregion
|
|
410
410
|
//#region src/utils/output.ts
|
|
411
411
|
/**
|
|
412
|
-
*
|
|
412
|
+
* Detecta la preferencia de theme actual de DevTools
|
|
413
413
|
*/
|
|
414
414
|
function detectDevToolsTheme() {
|
|
415
415
|
try {
|
|
@@ -421,13 +421,13 @@ function detectDevToolsTheme() {
|
|
|
421
421
|
}
|
|
422
422
|
}
|
|
423
423
|
/**
|
|
424
|
-
*
|
|
424
|
+
* Obtiene el color adaptativo según el theme actual de DevTools
|
|
425
425
|
*/
|
|
426
426
|
function getAdaptiveColor(colors, theme) {
|
|
427
427
|
return colors[theme ?? detectDevToolsTheme()];
|
|
428
428
|
}
|
|
429
429
|
/**
|
|
430
|
-
*
|
|
430
|
+
* Registra un listener de cambios de theme para actualizaciones dinámicas
|
|
431
431
|
*/
|
|
432
432
|
function setupThemeChangeListener(callback) {
|
|
433
433
|
try {
|
|
@@ -450,11 +450,18 @@ function setupThemeChangeListener(callback) {
|
|
|
450
450
|
}
|
|
451
451
|
}
|
|
452
452
|
/**
|
|
453
|
-
*
|
|
454
|
-
*
|
|
453
|
+
* Crea output estilizado para consola con múltiples formatters `%c`
|
|
454
|
+
* Se adapta automáticamente al entorno (browser o terminal)
|
|
455
455
|
*/
|
|
456
456
|
function createStyledOutput(level, levelStyles, prefix, message, stackInfo, autoDetectTheme = true, presetStyles, presetName) {
|
|
457
|
-
const levelConfig = levelStyles[level]
|
|
457
|
+
const levelConfig = levelStyles[level] ?? {
|
|
458
|
+
emoji: "📝",
|
|
459
|
+
label: level.toUpperCase(),
|
|
460
|
+
background: "#6c757d",
|
|
461
|
+
color: "#ffffff",
|
|
462
|
+
border: "1px solid #6c757d",
|
|
463
|
+
shadow: "none"
|
|
464
|
+
};
|
|
458
465
|
const timestamp = formatTimestamp();
|
|
459
466
|
if (getEnvironment() !== "browser" && supportsANSI()) return createTerminalOutput(level, message, timestamp, prefix, stackInfo);
|
|
460
467
|
const currentTheme = autoDetectTheme ? detectDevToolsTheme() : "light";
|
|
@@ -478,8 +485,8 @@ function createStyledOutput(level, levelStyles, prefix, message, stackInfo, auto
|
|
|
478
485
|
return [format, ...styles];
|
|
479
486
|
}
|
|
480
487
|
/**
|
|
481
|
-
*
|
|
482
|
-
* runtime
|
|
488
|
+
* Construye una línea apta para terminal usando los helpers ANSI. Se usa
|
|
489
|
+
* cuando el runtime no es browser pero soporta códigos ANSI (TTY, terminal moderna).
|
|
483
490
|
*
|
|
484
491
|
* Layout: `[HH:MM:SS.mmm] [LEVEL] [prefix] message (file:line)`
|
|
485
492
|
*/
|
|
@@ -497,8 +504,8 @@ function createTerminalOutput(level, message, timestamp, prefix, stackInfo) {
|
|
|
497
504
|
//#endregion
|
|
498
505
|
//#region src/utils/formatting.ts
|
|
499
506
|
/**
|
|
500
|
-
*
|
|
501
|
-
*
|
|
507
|
+
* Crea output en texto plano para cualquier entorno
|
|
508
|
+
* Sin colores ni estilos — máxima compatibilidad
|
|
502
509
|
*/
|
|
503
510
|
function createPlainOutput(level, message, prefix, stackInfo) {
|
|
504
511
|
let output = `[${formatTimestamp().slice(11, 23)}] [${level.toUpperCase()}]`;
|
|
@@ -508,8 +515,8 @@ function createPlainOutput(level, message, prefix, stackInfo) {
|
|
|
508
515
|
return output;
|
|
509
516
|
}
|
|
510
517
|
/**
|
|
511
|
-
*
|
|
512
|
-
*
|
|
518
|
+
* Obtiene el método de console adecuado para el nivel
|
|
519
|
+
* Usa distintos métodos de console para mejor semántica
|
|
513
520
|
*/
|
|
514
521
|
function getConsoleMethod(level) {
|
|
515
522
|
switch (level) {
|
|
@@ -522,7 +529,7 @@ function getConsoleMethod(level) {
|
|
|
522
529
|
}
|
|
523
530
|
}
|
|
524
531
|
/**
|
|
525
|
-
*
|
|
532
|
+
* Crea un objeto simple de log entry para los handlers
|
|
526
533
|
*/
|
|
527
534
|
function createLogEntry(level, message, args, prefix, stackInfo) {
|
|
528
535
|
return {
|
|
@@ -541,7 +548,7 @@ function createLogEntry(level, message, args, prefix, stackInfo) {
|
|
|
541
548
|
};
|
|
542
549
|
}
|
|
543
550
|
/**
|
|
544
|
-
*
|
|
551
|
+
* Formatea datos para visualización en tabla como texto plano
|
|
545
552
|
*/
|
|
546
553
|
function formatTablePlain(data, columns) {
|
|
547
554
|
try {
|
|
@@ -554,11 +561,11 @@ function formatTablePlain(data, columns) {
|
|
|
554
561
|
if (typeof data === "object" && data !== null) return Object.entries(data).map(([key, value]) => `${key}: ${value}`).join("\n");
|
|
555
562
|
return String(data);
|
|
556
563
|
} catch (error) {
|
|
557
|
-
return `[Error
|
|
564
|
+
return `[Error al formatear la tabla: ${error}]`;
|
|
558
565
|
}
|
|
559
566
|
}
|
|
560
567
|
/**
|
|
561
|
-
*
|
|
568
|
+
* Serialización segura de objetos para logging
|
|
562
569
|
*/
|
|
563
570
|
function safeSerialize(obj, maxDepth = 3, currentDepth = 0) {
|
|
564
571
|
if (currentDepth >= maxDepth) return "[Max Depth Reached]";
|
|
@@ -576,4 +583,4 @@ function safeSerialize(obj, maxDepth = 3, currentDepth = 0) {
|
|
|
576
583
|
//#endregion
|
|
577
584
|
export { DEFAULT_CONFIG as _, safeSerialize as a, parseStackTrace as b, ansiBackground as c, ansiDim as d, ansiStyle as f, CLI_LEVEL_MAP as g, formatSuccessANSI as h, getConsoleMethod as i, ansiBold as l, formatLogLevelANSI as m, createPlainOutput as n, createStyledOutput as o, ansiUnderline as p, formatTablePlain as r, setupThemeChangeListener as s, createLogEntry as t, ansiColor as u, LEVEL_STYLES as v, formatTimestamp as y };
|
|
578
585
|
|
|
579
|
-
//# sourceMappingURL=utils-
|
|
586
|
+
//# sourceMappingURL=utils-tKfBAWUM.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils-tKfBAWUM.js","names":[],"sources":["../../src/utils/stackTrace.ts","../../src/utils/timestamps.ts","../../src/constants.ts","../../src/utils/ansi-colors.ts","../../src/utils/output.ts","../../src/utils/formatting.ts"],"sourcesContent":["/**\n * @fileoverview Utilidades de parseo de stack traces para Advanced Logger\n */\n\nimport type { StackInfo } from '../types/index.js';\n\n/**\n * Comprueba si un nombre de archivo corresponde a un archivo minificado/bundle\n */\nfunction isMinifiedFile(filename: string): boolean {\n // Salta si el nombre contiene patrones de minificado\n const minifiedPatterns = [\n /\\.min\\.js$/,\n /\\.bundle\\.js$/,\n /\\.chunk\\.js$/,\n /-[\\w\\d]{8,}\\.js$/, // Nombres basados en hash\n /Logger-[A-Za-z0-9]+\\.js$/, // Bundles de Logger\n /node_modules/,\n /dist\\//,\n /build\\//,\n /\\.mjs$/\n ];\n\n return minifiedPatterns.some(pattern => pattern.test(filename));\n}\n\n/**\n * Extrae un nombre de archivo limpio a partir de la ruta completa\n */\nfunction extractCleanFilename(fullPath: string): string {\n // Extrae solo el nombre de archivo de la ruta completa\n const filename = fullPath.split(/[/\\\\]/).pop() || fullPath;\n\n // Elimina sufijos comunes de build/minificado\n return filename\n .replace(/\\.min\\.js$/, '.js')\n .replace(/\\.bundle\\.js$/, '.js')\n .replace(/\\.chunk\\.js$/, '.js')\n .replace(/-[\\w\\d]{8,}\\.js$/, '.js')\n .replace(/Logger-[A-Za-z0-9]+\\.js$/, 'logger.ts');\n}\n\n/**\n * Parsea el stack trace actual para extraer la información del caller\n */\nexport function parseStackTrace(): StackInfo | null {\n try {\n const stack = new Error().stack;\n if (!stack) {\n return null;\n }\n\n const lines = stack.split('\\n').filter(line => line.trim());\n\n // Busca el primer caller que no provenga de métodos de Logger\n for (let i = 1; i < lines.length; i++) {\n const line = lines[i];\n\n if (!line) {\n continue;\n }\n\n // Salta si la línea contiene métodos de Logger o parseStackTrace\n if (line.includes('parseStackTrace') ||\n line.includes('Logger.') ||\n line.includes('.log(') ||\n line.includes('createStyledOutput')) {\n continue;\n }\n\n // Parsea distintos formatos de stack trace\n let match;\n\n // Formato Chrome: \"at functionName (file:line:column)\" o \"at file:line:column\"\n const chromeMatch = line.match(/at\\s+(?:(.+?)\\s+\\()?(.+?):(\\d+):(\\d+)\\)?$/);\n if (chromeMatch) {\n const filename = chromeMatch[2];\n // Salta archivos minificados/bundle\n if (filename && isMinifiedFile(filename)) {\n continue;\n }\n match = chromeMatch;\n } else {\n // Formato Firefox: \"functionName@file:line:column\"\n const firefoxMatch = line.match(/(.+?)@(.+?):(\\d+):(\\d+)$/);\n if (firefoxMatch) {\n const filename = firefoxMatch[2];\n // Salta archivos minificados/bundle\n if (filename && isMinifiedFile(filename)) {\n continue;\n }\n match = firefoxMatch;\n } else {\n // Formato Safari/otros\n const safariMatch = line.match(/(\\S+)?@(.+?):(\\d+):(\\d+)$/);\n if (safariMatch) {\n const filename = safariMatch[2];\n // Salta archivos minificados/bundle\n if (filename && isMinifiedFile(filename)) {\n continue;\n }\n match = safariMatch;\n }\n }\n }\n\n if (!match) {\n continue;\n }\n\n const [, functionName, file, lineStr, columnStr] = match;\n\n if (!file) {\n continue;\n }\n\n // Usa la extracción limpia para evitar archivos minificados\n const cleanFileName = extractCleanFilename(file).split('?')[0];\n if (!cleanFileName) {\n continue;\n }\n\n // Parsea los números de línea y columna\n const lineNum = lineStr ? parseInt(lineStr, 10) : 0;\n const columnNum = columnStr ? parseInt(columnStr, 10) : 0;\n\n // Limpia el nombre de la función\n const cleanFunction = functionName && functionName.trim()\n ? functionName.trim()\n : undefined;\n \n return {\n file: cleanFileName ? cleanFileName : 'unknown',\n line: lineNum,\n column: columnNum,\n function: cleanFunction\n };\n }\n \n return null;\n } catch {\n return null;\n }\n}","/**\n * @fileoverview Timestamp utilities for Advanced Logger\n */\n\n/**\n * Formats the timestamp using modern Date API\n */\nexport function formatTimestamp(): string {\n try {\n // Use modern Temporal API if available, fallback to Date\n const now = new Date();\n return now.toISOString();\n } catch {\n return new Date().toISOString();\n }\n}","/**\n * @fileoverview Global constants for Advanced Logger\n */\n\nimport type { LogLevel, AdaptiveColors, CLILogLevel, Verbosity } from './types/index.js';\nimport type { LevelStyleConfig } from './utils/index.js';\n\n/**\n * Default configuration values\n */\nexport const DEFAULT_CONFIG = {\n verbosity: 'info' as const,\n enableColors: true,\n enableTimestamps: true,\n enableStackTrace: true,\n theme: 'default' as const,\n bannerType: 'simple' as const,\n bufferSize: 1000,\n autoDetectTheme: true,\n outputFormat: 'auto' as const,\n} as const;\n\n/**\n * Basic level styles for core module (minimal CSS styling)\n */\nexport const LEVEL_STYLES: Record<LogLevel | 'success', LevelStyleConfig> = {\n trace: {\n emoji: '🔬',\n label: 'TRACE',\n background: 'linear-gradient(90deg, #495057, #343a40)',\n color: '#dee2e6',\n border: '1px solid #495057',\n shadow: '0 1px 2px rgba(73, 80, 87, 0.3)'\n },\n debug: {\n emoji: '🔍',\n label: 'DEBUG',\n background: 'linear-gradient(90deg, #6c757d, #495057)',\n color: '#ffffff',\n border: '1px solid #6c757d',\n shadow: '0 2px 4px rgba(108, 117, 125, 0.3)'\n },\n info: {\n emoji: 'ℹ️',\n label: 'INFO',\n background: 'linear-gradient(90deg, #007bff, #0056b3)',\n color: '#ffffff',\n border: '1px solid #007bff',\n shadow: '0 2px 4px rgba(0, 123, 255, 0.3)'\n },\n warn: {\n emoji: '⚠️',\n label: 'WARN',\n background: 'linear-gradient(90deg, #ffc107, #e0a800)',\n color: '#000000',\n border: '1px solid #ffc107',\n shadow: '0 2px 4px rgba(255, 193, 7, 0.3)'\n },\n error: {\n emoji: '❌',\n label: 'ERROR',\n background: 'linear-gradient(90deg, #dc3545, #c82333)',\n color: '#ffffff',\n border: '1px solid #dc3545',\n shadow: '0 2px 4px rgba(220, 53, 69, 0.3)'\n },\n critical: {\n emoji: '🚨',\n label: 'CRITICAL',\n background: 'linear-gradient(90deg, #8B0000, #FF0000)',\n color: '#ffffff',\n border: '2px solid #FF0000',\n shadow: '0 4px 8px rgba(255, 0, 0, 0.4)'\n },\n success: {\n emoji: '✅',\n label: 'SUCCESS',\n background: 'linear-gradient(90deg, #28a745, #1e7e34)',\n color: '#ffffff',\n border: '1px solid #28a745',\n shadow: '0 2px 4px rgba(40, 167, 69, 0.3)'\n }\n} as const;\n\n/**\n * Time parsing constants for relative time filters\n */\nexport const TIME_UNITS = {\n ms: 1,\n s: 1000,\n m: 60 * 1000,\n h: 60 * 60 * 1000,\n d: 24 * 60 * 60 * 1000,\n} as const;\n\n/**\n * Export format definitions with extensions\n */\nexport const EXPORT_FORMATS = {\n json: { extension: '.json', mimeType: 'application/json' },\n csv: { extension: '.csv', mimeType: 'text/csv' },\n markdown: { extension: '.md', mimeType: 'text/markdown' },\n plain: { extension: '.txt', mimeType: 'text/plain' },\n html: { extension: '.html', mimeType: 'text/html' },\n} as const;\n\n/**\n * Adaptive color configurations for DevTools theme compatibility\n */\nexport const ADAPTIVE_COLORS = {\n timestamp: {\n light: '#666666',\n dark: '#a0a0a0',\n },\n messageText: {\n light: '#2d3748',\n dark: '#f7fafc',\n },\n prefix: {\n light: '#2d3748',\n dark: '#e2e8f0',\n },\n prefixBackground: {\n light: '#2d3748',\n dark: '#4a5568',\n },\n location: {\n light: '#718096',\n dark: '#a0aec0',\n },\n} as const satisfies Record<string, AdaptiveColors>;\n\n/**\n * CLI log level to internal verbosity mapping\n */\nexport const CLI_LEVEL_MAP: Record<CLILogLevel, { verbosity: Verbosity; showPrimitives: boolean }> = {\n silent: { verbosity: 'silent', showPrimitives: false },\n quiet: { verbosity: 'error', showPrimitives: false },\n normal: { verbosity: 'info', showPrimitives: true },\n verbose: { verbosity: 'debug', showPrimitives: true },\n debug: { verbosity: 'debug', showPrimitives: true },\n} as const;","/**\n * @fileoverview Utilidades de colores ANSI para entornos de terminal\n */\n\nimport type { LogLevel } from '../types/index.js';\nimport { supportsANSI } from './environment-detector.js';\n\n/**\n * Códigos de color ANSI para estilos en terminal\n */\nexport const ANSI_CODES = {\n // Colors\n black: 30,\n red: 31,\n green: 32,\n yellow: 33,\n blue: 34,\n magenta: 35,\n cyan: 36,\n white: 37,\n\n // Bright colors\n brightBlack: 90,\n brightRed: 91,\n brightGreen: 92,\n brightYellow: 93,\n brightBlue: 94,\n brightMagenta: 95,\n brightCyan: 96,\n brightWhite: 97,\n\n // Background colors\n bgBlack: 40,\n bgRed: 41,\n bgGreen: 42,\n bgYellow: 43,\n bgBlue: 44,\n bgMagenta: 45,\n bgCyan: 46,\n bgWhite: 47,\n\n // Background bright colors\n bgBrightBlack: 100,\n bgBrightRed: 101,\n bgBrightGreen: 102,\n bgBrightYellow: 103,\n bgBrightBlue: 104,\n bgBrightMagenta: 105,\n bgBrightCyan: 106,\n bgBrightWhite: 107,\n\n // Styles\n reset: 0,\n bold: 1,\n dim: 2,\n italic: 3,\n underline: 4,\n blink: 5,\n inverse: 7,\n hidden: 8,\n strikethrough: 9,\n\n // Reset specific\n resetBold: 22,\n resetDim: 22,\n resetItalic: 23,\n resetUnderline: 24,\n resetBlink: 25,\n resetInverse: 27,\n resetHidden: 28,\n resetStrikethrough: 29\n} as const;\n\n/**\n * Presets de colores ANSI para los distintos niveles de log\n */\nexport const ANSI_LEVEL_STYLES: Record<LogLevel | 'success', {\n color: number;\n background?: number;\n styles: number[];\n emoji: string;\n}> = {\n trace: {\n color: ANSI_CODES.brightBlack,\n styles: [ANSI_CODES.dim],\n emoji: '🔬'\n },\n debug: {\n color: ANSI_CODES.brightBlack,\n styles: [ANSI_CODES.dim],\n emoji: '🔍'\n },\n info: {\n color: ANSI_CODES.blue,\n styles: [ANSI_CODES.bold],\n emoji: 'ℹ️'\n },\n warn: {\n color: ANSI_CODES.yellow,\n background: ANSI_CODES.bgYellow,\n styles: [ANSI_CODES.bold, ANSI_CODES.black],\n emoji: '⚠️'\n },\n error: {\n color: ANSI_CODES.red,\n background: ANSI_CODES.bgRed,\n styles: [ANSI_CODES.bold],\n emoji: '❌'\n },\n critical: {\n color: ANSI_CODES.white,\n background: ANSI_CODES.bgRed,\n styles: [ANSI_CODES.bold, ANSI_CODES.blink],\n emoji: '🚨'\n },\n success: {\n color: ANSI_CODES.green,\n background: ANSI_CODES.bgGreen,\n styles: [ANSI_CODES.bold],\n emoji: '✅'\n }\n};\n\n/**\n * Crea una secuencia de escape ANSI\n */\nfunction ansi(code: number | number[]): string {\n const codes = Array.isArray(code) ? code : [code];\n return `\\x1b[${codes.join(';')}m`;\n}\n\n/**\n * Aplica estilos ANSI al texto\n */\nexport function ansiStyle(text: string, codes: number[]): string {\n if (!supportsANSI()) return text;\n return `${ansi(codes)}${text}${ansi(ANSI_CODES.reset)}`;\n}\n\n/**\n * Aplica color al texto\n */\nexport function ansiColor(text: string, color: number): string {\n return ansiStyle(text, [color]);\n}\n\n/**\n * Aplica color de fondo al texto\n */\nexport function ansiBackground(text: string, bg: number, color?: number): string {\n if (color) {\n return ansiStyle(text, [color, bg]);\n }\n return ansiStyle(text, [bg]);\n}\n\n/**\n * Pone el texto en bold\n */\nexport function ansiBold(text: string): string {\n return ansiStyle(text, [ANSI_CODES.bold]);\n}\n\n/**\n * Aplica dim al texto\n */\nexport function ansiDim(text: string): string {\n return ansiStyle(text, [ANSI_CODES.dim]);\n}\n\n/**\n * Subraya el texto\n */\nexport function ansiUnderline(text: string): string {\n return ansiStyle(text, [ANSI_CODES.underline]);\n}\n\n/**\n * Formatters especializados para distintos contextos\n */\n\n/**\n * Formatea el timestamp para terminal\n */\nexport function formatTimestampANSI(timestamp: string): string {\n return ansiColor(timestamp, ANSI_CODES.brightBlack);\n}\n\n/**\n * Formatea el nivel de log para terminal\n */\nexport function formatLogLevelANSI(level: LogLevel, useEmojis: boolean = true): string {\n const style = ANSI_LEVEL_STYLES[level];\n const emoji = useEmojis ? style.emoji : '';\n const label = level.toUpperCase().padEnd(8);\n\n if (!supportsANSI()) {\n return `${emoji} ${label}`;\n }\n\n let codes = [style.color, ...style.styles];\n if (style.background) {\n codes.push(style.background);\n }\n\n return ansiStyle(`${emoji} ${label}`, codes);\n}\n\n/**\n * Formatea el mensaje de success para terminal\n */\nexport function formatSuccessANSI(message: string, useEmojis: boolean = true): string {\n const style = ANSI_LEVEL_STYLES.success;\n const emoji = useEmojis ? style.emoji : '';\n\n if (!supportsANSI()) {\n return `${emoji} SUCCESS: ${message}`;\n }\n\n const prefix = ansiStyle(`${emoji} SUCCESS:`, [style.color, ...style.styles]);\n return `${prefix} ${message}`;\n}\n\n/**\n * Formatea el prefix para terminal\n */\nexport function formatPrefixANSI(prefix: string): string {\n if (!supportsANSI()) {\n return `[${prefix}]`;\n }\n\n return ansiStyle(`[${prefix}]`, [ANSI_CODES.cyan, ANSI_CODES.bold]);\n}\n\n/**\n * Formatea la ubicación del archivo para terminal\n */\nexport function formatLocationANSI(location: string): string {\n if (!supportsANSI()) {\n return `(${location})`;\n }\n\n return ansiColor(`(${location})`, ANSI_CODES.brightBlack);\n}","/**\n * @fileoverview Utilidades para crear output estilizado para Advanced Logger\n */\n\nimport type { LogLevel, StackInfo, DevToolsTheme, AdaptiveColors } from '../types/index.js';\nimport { formatTimestamp } from './timestamps.js';\nimport { StyleBuilder } from '../styling/index.js';\nimport { ADAPTIVE_COLORS } from '../constants.js';\nimport { getEnvironment, supportsANSI } from './environment-detector.js';\nimport { formatLogLevelANSI, formatTimestampANSI, formatPrefixANSI, formatLocationANSI } from './ansi-colors.js';\nimport type { LogStyles } from '../types/index.js';\n\n/**\n * Configuración de estilo para cada nivel de log\n */\nexport interface LevelStyleConfig {\n emoji: string;\n label: string;\n background: string;\n color: string;\n border: string;\n shadow: string;\n}\n\n/**\n * Detecta la preferencia de theme actual de DevTools\n */\nexport function detectDevToolsTheme(): DevToolsTheme {\n try {\n if (typeof window === 'undefined' || !window.matchMedia) {\n return 'light'; // Fallback seguro para SSR o browsers antiguos\n }\n\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n return mediaQuery.matches ? 'dark' : 'light';\n } catch (error) {\n console.warn('Failed to detect DevTools theme:', error);\n return 'light'; // Fallback al theme light\n }\n}\n\n/**\n * Obtiene el color adaptativo según el theme actual de DevTools\n */\nexport function getAdaptiveColor(colors: AdaptiveColors, theme?: DevToolsTheme): string {\n const currentTheme = theme ?? detectDevToolsTheme();\n return colors[currentTheme];\n}\n\n/**\n * Registra un listener de cambios de theme para actualizaciones dinámicas\n */\nexport function setupThemeChangeListener(callback: (theme: DevToolsTheme) => void): (() => void) | null {\n try {\n if (typeof window === 'undefined' || !window.matchMedia) {\n return null;\n }\n\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n const handler = (e: MediaQueryListEvent) => {\n callback(e.matches ? 'dark' : 'light');\n };\n\n // Usa addEventListener si está disponible, fallback a addListener\n if (mediaQuery.addEventListener) {\n mediaQuery.addEventListener('change', handler);\n return () => mediaQuery.removeEventListener('change', handler);\n } else if (mediaQuery.addListener) {\n mediaQuery.addListener(handler);\n return () => mediaQuery.removeListener?.(handler);\n }\n\n return null;\n } catch (error) {\n console.warn('Failed to set up theme change listener:', error);\n return null;\n }\n}\n\n\n/**\n * Crea output estilizado para consola con múltiples formatters `%c`\n * Se adapta automáticamente al entorno (browser o terminal)\n */\nexport function createStyledOutput(\n level: LogLevel,\n levelStyles: Record<LogLevel | 'success', LevelStyleConfig>,\n prefix: string | undefined,\n message: string,\n stackInfo: StackInfo | null,\n autoDetectTheme: boolean = true,\n presetStyles?: LogStyles,\n presetName?: string\n): [string, ...string[]] {\n const levelConfig = levelStyles[level] ?? {\n emoji: '📝',\n label: level.toUpperCase(),\n background: '#6c757d',\n color: '#ffffff',\n border: '1px solid #6c757d',\n shadow: 'none'\n };\n const timestamp = formatTimestamp();\n const environment = getEnvironment();\n\n // Comprueba si se debe usar rendering en terminal\n if (environment !== 'browser' && supportsANSI()) {\n return createTerminalOutput(level, message, timestamp, prefix, stackInfo);\n }\n\n // Rendering en browser (lógica existente)\n const currentTheme = autoDetectTheme ? detectDevToolsTheme() : 'light';\n\n // Estilos base con colores adaptativos\n const timestampStyle = new StyleBuilder()\n .color(getAdaptiveColor(ADAPTIVE_COLORS.timestamp, currentTheme))\n .size('11px')\n .font('Monaco, Consolas, monospace')\n .build();\n\n const levelStyle = new StyleBuilder()\n .bg(levelConfig.background)\n .color(levelConfig.color)\n .border(levelConfig.border)\n .shadow(levelConfig.shadow)\n .padding('2px 8px')\n .rounded('4px')\n .bold()\n .font('Monaco, Consolas, monospace')\n .size('12px')\n .build();\n\n const prefixStyle = new StyleBuilder()\n .bg(getAdaptiveColor(ADAPTIVE_COLORS.prefixBackground, currentTheme))\n .color(getAdaptiveColor(ADAPTIVE_COLORS.prefix, currentTheme))\n .padding('2px 6px')\n .rounded('3px')\n .bold()\n .font('Monaco, Consolas, monospace')\n .size('11px')\n .build();\n\n const messageStyle = new StyleBuilder()\n .color(getAdaptiveColor(ADAPTIVE_COLORS.messageText, currentTheme))\n .font('system-ui, -apple-system, sans-serif')\n .size('14px')\n .build();\n\n const locationStyle = new StyleBuilder()\n .color(getAdaptiveColor(ADAPTIVE_COLORS.location, currentTheme))\n .size('11px')\n .font('Monaco, Consolas, monospace')\n .build();\n\n // Construye el format string y los estilos\n let format = `%c${timestamp.slice(11, 23)} %c${levelConfig.emoji} ${levelConfig.label}`;\n const styles = [timestampStyle, levelStyle];\n\n if (prefix) {\n format += ` %c${prefix}`;\n styles.push(prefixStyle);\n }\n\n format += ` %c${message}`;\n styles.push(messageStyle);\n\n if (stackInfo) {\n format += ` %c(${stackInfo.file}:${stackInfo.line}:${stackInfo.column})`;\n styles.push(locationStyle);\n }\n\n return [format, ...styles];\n}\n\n/**\n * Construye una línea apta para terminal usando los helpers ANSI. Se usa\n * cuando el runtime no es browser pero soporta códigos ANSI (TTY, terminal moderna).\n *\n * Layout: `[HH:MM:SS.mmm] [LEVEL] [prefix] message (file:line)`\n */\nexport function createTerminalOutput(\n level: LogLevel,\n message: string,\n timestamp?: string,\n prefix?: string,\n stackInfo?: StackInfo | null\n): [string, ...string[]] {\n const ts = timestamp?.slice(11, 23) ?? '';\n const location = stackInfo ? `${stackInfo.file}:${stackInfo.line}:${stackInfo.column}` : undefined;\n\n const parts: string[] = [];\n parts.push(formatTimestampANSI(`[${ts}]`));\n parts.push(formatLogLevelANSI(level));\n if (prefix) parts.push(formatPrefixANSI(prefix));\n parts.push(message);\n if (location) parts.push(formatLocationANSI(`(${location})`));\n\n return [parts.join(' ') + '\\n'];\n}","/**\n * @fileoverview Utilidades de formatting para Universal Logger\n */\n\nimport type { LogLevel, StackInfo } from '../types/index.js';\nimport { formatTimestamp } from './timestamps.js';\n\n// Re-export del tipo por conveniencia\nexport type { OutputFormat } from '../types/index.js';\n\n/**\n * Crea output en texto plano para cualquier entorno\n * Sin colores ni estilos — máxima compatibilidad\n */\nexport function createPlainOutput(\n level: LogLevel,\n message: string,\n prefix?: string,\n stackInfo?: StackInfo | null\n): string {\n const timestamp = formatTimestamp();\n const timeStr = timestamp.slice(11, 23); // HH:MM:SS.mmm\n\n let output = `[${timeStr}] [${level.toUpperCase()}]`;\n\n if (prefix) {\n output += ` [${prefix}]`;\n }\n\n output += ` ${message}`;\n\n if (stackInfo) {\n output += ` (${stackInfo.file}:${stackInfo.line}:${stackInfo.column})`;\n }\n\n return output;\n}\n\n/**\n * Obtiene el método de console adecuado para el nivel\n * Usa distintos métodos de console para mejor semántica\n */\nexport function getConsoleMethod(level: LogLevel): 'log' | 'info' | 'warn' | 'error' {\n switch (level) {\n case 'debug':\n return 'log';\n case 'info':\n return 'info';\n case 'warn':\n return 'warn';\n case 'error':\n case 'critical':\n return 'error';\n default:\n return 'log';\n }\n}\n\n/**\n * Crea un objeto simple de log entry para los handlers\n */\nexport function createLogEntry(\n level: LogLevel,\n message: string,\n args: any[],\n prefix?: string,\n stackInfo?: StackInfo | null\n) {\n return {\n timestamp: formatTimestamp(),\n level: level.toUpperCase(),\n prefix,\n message,\n args: args.slice(1), // Excluye el primer argumento (el mensaje)\n location: stackInfo ? {\n file: stackInfo.file,\n line: stackInfo.line,\n column: stackInfo.column,\n function: stackInfo.function\n } : undefined,\n raw: args\n };\n}\n\n/**\n * Formatea datos para visualización en tabla como texto plano\n */\nexport function formatTablePlain(data: any, columns?: string[]): string {\n try {\n if (Array.isArray(data)) {\n if (data.length === 0) return '[Empty Array]';\n\n // Formateo simple de array\n if (typeof data[0] !== 'object') {\n return data.map((item, i) => `${i}: ${item}`).join('\\n');\n }\n\n // Formateo de array de objetos\n const keys = columns || Object.keys(data[0] || {});\n const header = keys.join('\\t');\n const rows = data.map(item =>\n keys.map(key => String(item[key] || '')).join('\\t')\n );\n\n return [header, ...rows].join('\\n');\n }\n\n if (typeof data === 'object' && data !== null) {\n // Formateo simple de objeto\n return Object.entries(data)\n .map(([key, value]) => `${key}: ${value}`)\n .join('\\n');\n }\n\n return String(data);\n } catch (error) {\n return `[Error al formatear la tabla: ${error}]`;\n }\n}\n\n/**\n * Serialización segura de objetos para logging\n */\nexport function safeSerialize(obj: any, maxDepth: number = 3, currentDepth: number = 0): any {\n if (currentDepth >= maxDepth) {\n return '[Max Depth Reached]';\n }\n\n if (obj === null) return null;\n if (obj === undefined) return '[undefined]';\n if (typeof obj === 'function') return '[Function]';\n if (obj instanceof Error) return `[Error: ${obj.message}]`;\n if (obj instanceof Date) return obj.toISOString();\n if (typeof obj !== 'object') return obj;\n\n if (Array.isArray(obj)) {\n return obj.map(item => safeSerialize(item, maxDepth, currentDepth + 1));\n }\n\n const result: any = {};\n for (const [key, value] of Object.entries(obj)) {\n result[key] = safeSerialize(value, maxDepth, currentDepth + 1);\n }\n return result;\n}"],"mappings":"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"}
|
|
@@ -1,31 +1,82 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @fileoverview CLI
|
|
2
|
+
* @fileoverview Procesador central del CLI del logger. Resuelve comandos,
|
|
3
|
+
* despacha ejecución, mantiene historial y soporta plugins. No es un binario
|
|
4
|
+
* standalone: se invoca vía `logger.cli()` o `window.cli()` en browser.
|
|
3
5
|
*/
|
|
4
6
|
import type { Logger } from '../Logger.js';
|
|
5
7
|
/**
|
|
6
|
-
*
|
|
8
|
+
* Comando del CLI del logger. Cada implementación se registra en un
|
|
9
|
+
* {@link CommandProcessor} para ser invocable vía `/name` desde la consola
|
|
10
|
+
* del navegador o cualquier host interactivo.
|
|
11
|
+
*
|
|
12
|
+
* @see {@link CommandProcessor.registerCommand}
|
|
13
|
+
* @see {@link HelpCommand}
|
|
7
14
|
*/
|
|
8
15
|
export interface ICommand {
|
|
16
|
+
/** Nombre canónico del comando, sin la barra inicial `/`. Debe ser único. */
|
|
9
17
|
name: string;
|
|
18
|
+
/** Descripción corta humana; la usa el sistema de help. */
|
|
10
19
|
description: string;
|
|
20
|
+
/** Sintaxis de uso mostrada en `/help`, p.ej. `/export <format>`. */
|
|
11
21
|
usage: string;
|
|
22
|
+
/** Agrupación opcional para el help (`Configuration`, `Export`, ...). */
|
|
12
23
|
category?: string;
|
|
24
|
+
/** Nombres alternativos sin la `/`; se resuelven al comando real. */
|
|
13
25
|
aliases?: string[];
|
|
26
|
+
/**
|
|
27
|
+
* Ejecuta el comando. Recibe los argumentos como string plano (todo lo
|
|
28
|
+
* posterior al primer token, re-joined con espacios) y el {@link Logger}
|
|
29
|
+
* activo para emitir output.
|
|
30
|
+
*
|
|
31
|
+
* @param args - Argumentos del comando (string), puede ser `''`.
|
|
32
|
+
* @param logger - Logger activo.
|
|
33
|
+
*/
|
|
14
34
|
execute(args: string, logger: Logger): void | Promise<void>;
|
|
15
35
|
}
|
|
16
36
|
/**
|
|
17
|
-
* Plugin
|
|
37
|
+
* Plugin de CLI: agrupa uno o más {@link ICommand} con lifecycle
|
|
38
|
+
* `initialize`/`cleanup`. Permite a terceros empaquetar funcionalidad
|
|
39
|
+
* extendida (ej: integración con un dashboard, transport custom) y
|
|
40
|
+
* registrarla de golpe vía {@link CommandProcessor.registerPlugin}.
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```ts
|
|
44
|
+
* const telemetryPlugin: ICLIPlugin = {
|
|
45
|
+
* name: 'telemetry',
|
|
46
|
+
* version: '1.0.0',
|
|
47
|
+
* description: 'Comandos de telemetría',
|
|
48
|
+
* commands: [new TelemetryDumpCommand()],
|
|
49
|
+
* initialize(processor, logger) {
|
|
50
|
+
* logger.info('telemetry plugin cargado');
|
|
51
|
+
* },
|
|
52
|
+
* cleanup() {
|
|
53
|
+
* // liberar suscripciones/recursos
|
|
54
|
+
* }
|
|
55
|
+
* };
|
|
56
|
+
* processor.registerPlugin(telemetryPlugin, logger);
|
|
57
|
+
* ```
|
|
58
|
+
*
|
|
59
|
+
* @see {@link CommandProcessor.registerPlugin}
|
|
18
60
|
*/
|
|
19
61
|
export interface ICLIPlugin {
|
|
62
|
+
/** Identificador único del plugin. */
|
|
20
63
|
name: string;
|
|
64
|
+
/** Versión semántica del plugin. */
|
|
21
65
|
version: string;
|
|
66
|
+
/** Descripción humana corta. */
|
|
22
67
|
description: string;
|
|
68
|
+
/** Comandos que el plugin aporta al registry al registrarse. */
|
|
23
69
|
commands: ICommand[];
|
|
70
|
+
/** Hook opcional llamado tras el registro — útil para suscribirse a eventos del processor. */
|
|
24
71
|
initialize?(processor: CommandProcessor, logger: Logger): void;
|
|
72
|
+
/** Hook opcional llamado al desregistrar el plugin — liberar recursos. */
|
|
25
73
|
cleanup?(): void;
|
|
26
74
|
}
|
|
27
75
|
/**
|
|
28
|
-
*
|
|
76
|
+
* Entrada del historial de comandos ejecutados. No se exporta; solo circula
|
|
77
|
+
* internamente entre {@link CommandProcessor.getHistory} y el storage privado.
|
|
78
|
+
*
|
|
79
|
+
* @internal
|
|
29
80
|
*/
|
|
30
81
|
interface HistoryEntry {
|
|
31
82
|
command: string;
|
|
@@ -33,7 +84,34 @@ interface HistoryEntry {
|
|
|
33
84
|
success: boolean;
|
|
34
85
|
}
|
|
35
86
|
/**
|
|
36
|
-
* CLI
|
|
87
|
+
* Procesador central del CLI del logger. Resuelve nombres de comando (con
|
|
88
|
+
* aliases), despacha ejecución, mantiene historial acotado (max 100 entradas)
|
|
89
|
+
* y soporta un sistema de plugins para extensión de terceros.
|
|
90
|
+
*
|
|
91
|
+
* No es un binario standalone: se invoca desde la consola del navegador vía
|
|
92
|
+
* `window.cli("<command>")` (modo interactivo habilitado por
|
|
93
|
+
* {@link enterInteractiveMode}) o desde código vía `logger.cli()`. El
|
|
94
|
+
* constructor no registra ningún comando por defecto — usar
|
|
95
|
+
* {@link createDefaultCLI} para obtener una instancia con los 8 comandos
|
|
96
|
+
* estándar ya cargados.
|
|
97
|
+
*
|
|
98
|
+
* @example
|
|
99
|
+
* ```ts
|
|
100
|
+
* const cli = createDefaultCLI();
|
|
101
|
+
* await cli.processCommand('/themes', logger);
|
|
102
|
+
* await cli.processCommand('/config theme=neon', logger);
|
|
103
|
+
* ```
|
|
104
|
+
*
|
|
105
|
+
* @example
|
|
106
|
+
* ```ts
|
|
107
|
+
* // Modo interactivo: expone `window.cli` en el navegador
|
|
108
|
+
* cli.enterInteractiveMode(logger);
|
|
109
|
+
* // Desde la devtools: cli('help') → procesa '/help'
|
|
110
|
+
* ```
|
|
111
|
+
*
|
|
112
|
+
* @see {@link createDefaultCLI}
|
|
113
|
+
* @see {@link ICommand}
|
|
114
|
+
* @see {@link ICLIPlugin}
|
|
37
115
|
*/
|
|
38
116
|
export declare class CommandProcessor {
|
|
39
117
|
private commands;
|
|
@@ -43,59 +121,128 @@ export declare class CommandProcessor {
|
|
|
43
121
|
private maxHistorySize;
|
|
44
122
|
private isInteractiveMode;
|
|
45
123
|
/**
|
|
46
|
-
*
|
|
124
|
+
* Registra un comando. Si el comando declara `aliases`, también se indexan
|
|
125
|
+
* para resolución. Un comando con el mismo `name` sobreescribe al previo.
|
|
126
|
+
*
|
|
127
|
+
* @param {ICommand} command - Comando a registrar.
|
|
128
|
+
* @see {@link ICommand}
|
|
47
129
|
*/
|
|
48
130
|
registerCommand(command: ICommand): void;
|
|
49
131
|
/**
|
|
50
|
-
*
|
|
132
|
+
* Registra un plugin: indexa todos sus commands y, si el plugin define
|
|
133
|
+
* `initialize`, lo invoca con el processor y el logger. Los comandos del
|
|
134
|
+
* plugin se registran vía {@link registerCommand} y sus aliases quedan
|
|
135
|
+
* resolvibles igual que los directos.
|
|
136
|
+
*
|
|
137
|
+
* @param {ICLIPlugin} plugin - Plugin a registrar.
|
|
138
|
+
* @param {Logger} [logger] - Logger activo; requerido solo si el plugin define `initialize`.
|
|
139
|
+
* @throws {Error} Si ya existe un plugin registrado con el mismo `name`.
|
|
140
|
+
* @see {@link unregisterPlugin}
|
|
51
141
|
*/
|
|
52
142
|
registerPlugin(plugin: ICLIPlugin, logger?: Logger): void;
|
|
53
143
|
/**
|
|
54
|
-
*
|
|
144
|
+
* Desregistra un plugin por nombre: elimina todos sus commands (y los
|
|
145
|
+
* aliases que aportasen), invoca su hook `cleanup` si existe y lo quita
|
|
146
|
+
* del registry. No-op si el nombre no existe.
|
|
147
|
+
*
|
|
148
|
+
* @param {string} pluginName - Nombre del plugin a desregistrar.
|
|
149
|
+
* @see {@link registerPlugin}
|
|
55
150
|
*/
|
|
56
151
|
unregisterPlugin(pluginName: string): void;
|
|
57
152
|
/**
|
|
58
|
-
*
|
|
153
|
+
* Lista todos los commands registrados (directamente o vía plugins).
|
|
154
|
+
* No incluye aliases.
|
|
155
|
+
*
|
|
156
|
+
* @returns {ICommand[]} Snapshot array de los commands registrados.
|
|
59
157
|
*/
|
|
60
158
|
getCommands(): ICommand[];
|
|
61
159
|
/**
|
|
62
|
-
*
|
|
160
|
+
* Resuelve un comando por nombre canónico o alias. Devuelve `undefined`
|
|
161
|
+
* si no existe ninguno que matchee.
|
|
162
|
+
*
|
|
163
|
+
* @param {string} name - Nombre canónico o alias del comando.
|
|
164
|
+
* @returns {ICommand | undefined} El comando resuelto, o `undefined`.
|
|
63
165
|
*/
|
|
64
166
|
getCommand(name: string): ICommand | undefined;
|
|
65
167
|
/**
|
|
66
|
-
*
|
|
168
|
+
* Devuelve una copia del historial de comandos ejecutados (más recientes
|
|
169
|
+
* primero). Acotado a 100 entradas por {@link maxHistorySize}; las más
|
|
170
|
+
* viejas se descartan al insertar nuevas.
|
|
171
|
+
*
|
|
172
|
+
* @returns {HistoryEntry[]} Snapshot del historial; mutar el array devuelto
|
|
173
|
+
* no afecta al estado interno del processor.
|
|
67
174
|
*/
|
|
68
175
|
getHistory(): HistoryEntry[];
|
|
69
176
|
/**
|
|
70
|
-
*
|
|
177
|
+
* Vacía el historial de comandos en memoria.
|
|
71
178
|
*/
|
|
72
179
|
clearHistory(): void;
|
|
73
180
|
/**
|
|
74
|
-
*
|
|
181
|
+
* Lista los plugins actualmente registrados.
|
|
182
|
+
*
|
|
183
|
+
* @returns {ICLIPlugin[]} Snapshot array de plugins activos.
|
|
75
184
|
*/
|
|
76
185
|
getPlugins(): ICLIPlugin[];
|
|
77
186
|
/**
|
|
78
|
-
*
|
|
187
|
+
* Activa el modo interactivo. Marca el flag interno y, si se ejecuta en
|
|
188
|
+
* navegador, expone `window.cli(command)` para invocar comandos desde la
|
|
189
|
+
* devtools sin prefijo `/` (se añade automáticamente al input).
|
|
190
|
+
*
|
|
191
|
+
* @param {Logger} logger - Logger activo (emite el mensaje de bienvenida
|
|
192
|
+
* con hint sobre `cli(...)` en browser).
|
|
193
|
+
* @see {@link exitInteractiveMode}
|
|
79
194
|
*/
|
|
80
195
|
enterInteractiveMode(logger: Logger): void;
|
|
81
196
|
/**
|
|
82
|
-
*
|
|
197
|
+
* Desactiva el flag de modo interactivo. Nota: no elimina el `window.cli`
|
|
198
|
+
* que {@link enterInteractiveMode} haya expuesto en el navegador — el
|
|
199
|
+
* handler global sigue vivo hasta reload.
|
|
200
|
+
*
|
|
201
|
+
* @see {@link enterInteractiveMode}
|
|
83
202
|
*/
|
|
84
203
|
exitInteractiveMode(): void;
|
|
85
204
|
/**
|
|
86
|
-
*
|
|
205
|
+
* Instala `window.cli(command)` como wrapper delgado alrededor de
|
|
206
|
+
* {@link processCommand}, prefijando `/` automáticamente. Solo se invoca
|
|
207
|
+
* desde {@link enterInteractiveMode} cuando `window` está disponible.
|
|
208
|
+
*
|
|
209
|
+
* @internal
|
|
210
|
+
* @param logger - Logger activo, reenviado a cada invocación.
|
|
87
211
|
*/
|
|
88
212
|
private setupBrowserInteractiveMode;
|
|
89
213
|
/**
|
|
90
|
-
*
|
|
214
|
+
* Parsea y ejecuta un comando. El formato esperado es `/name args...`:
|
|
215
|
+
* split por espacios, primer token = nombre del comando, resto = args
|
|
216
|
+
* (re-joined con espacios). Si el comando no existe, loguea el error y
|
|
217
|
+
* sugiere similares vía {@link getSuggestions} ("Did you mean: ...?").
|
|
218
|
+
*
|
|
219
|
+
* Toda invocación (válida o no) se registra en el historial con flag de
|
|
220
|
+
* éxito/fallo según si `execute` resolvió o throweó.
|
|
221
|
+
*
|
|
222
|
+
* @param {string} commandString - Comando completo, debe empezar con `/`.
|
|
223
|
+
* @param {Logger} logger - Logger activo para output y errores.
|
|
224
|
+
* @returns {Promise<void>} Resuelve cuando el comando termina (sync o async).
|
|
225
|
+
* Nunca rechaza: los errores de `execute` se capturan y se loguean.
|
|
226
|
+
* @see {@link ICommand.execute}
|
|
227
|
+
* @see {@link getSuggestions}
|
|
91
228
|
*/
|
|
92
229
|
processCommand(commandString: string, logger: Logger): Promise<void>;
|
|
93
230
|
/**
|
|
94
|
-
*
|
|
231
|
+
* Inserta una entrada al frente del historial y trunca a
|
|
232
|
+
* {@link maxHistorySize} (100) si hace falta.
|
|
233
|
+
*
|
|
234
|
+
* @internal
|
|
235
|
+
* @param command - String crudo del comando ejecutado.
|
|
236
|
+
* @param success - Si la ejecución tuvo éxito.
|
|
95
237
|
*/
|
|
96
238
|
private addToHistory;
|
|
97
239
|
/**
|
|
98
|
-
*
|
|
240
|
+
* Devuelve nombres de comando que empiezan con el prefijo dado. Alimente
|
|
241
|
+
* el hint "Did you mean" de {@link processCommand} cuando un comando no
|
|
242
|
+
* se encuentra. Match por `startsWith` (no fuzzy).
|
|
243
|
+
*
|
|
244
|
+
* @param {string} partial - Prefijo parcial tipeado por el usuario.
|
|
245
|
+
* @returns {string[]} Nombres canónicos que matchean; aliases excluidos.
|
|
99
246
|
*/
|
|
100
247
|
getSuggestions(partial: string): string[];
|
|
101
248
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CommandProcessor.d.ts","sourceRoot":"","sources":["../../src/cli/CommandProcessor.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"CommandProcessor.d.ts","sourceRoot":"","sources":["../../src/cli/CommandProcessor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C;;;;;;;GAOG;AACH,MAAM,WAAW,QAAQ;IACrB,6EAA6E;IAC7E,IAAI,EAAE,MAAM,CAAC;IACb,2DAA2D;IAC3D,WAAW,EAAE,MAAM,CAAC;IACpB,qEAAqE;IACrE,KAAK,EAAE,MAAM,CAAC;IACd,yEAAyE;IACzE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB;;;;;;;OAOG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/D;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,WAAW,UAAU;IACvB,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,oCAAoC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,gCAAgC;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,gEAAgE;IAChE,QAAQ,EAAE,QAAQ,EAAE,CAAC;IACrB,8FAA8F;IAC9F,UAAU,CAAC,CAAC,SAAS,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/D,0EAA0E;IAC1E,OAAO,CAAC,IAAI,IAAI,CAAC;CACpB;AAED;;;;;GAKG;AACH,UAAU,YAAY;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,qBAAa,gBAAgB;IACzB,OAAO,CAAC,QAAQ,CAAoC;IACpD,OAAO,CAAC,OAAO,CAAkC;IACjD,OAAO,CAAC,OAAO,CAAsC;IACrD,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,cAAc,CAAe;IACrC,OAAO,CAAC,iBAAiB,CAAkB;IAE3C;;;;;;OAMG;IACH,eAAe,CAAC,OAAO,EAAE,QAAQ,GAAG,IAAI;IAWxC;;;;;;;;;;OAUG;IACH,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAkBzD;;;;;;;OAOG;IACH,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAsB1C;;;;;OAKG;IACH,WAAW,IAAI,QAAQ,EAAE;IAIzB;;;;;;OAMG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS;IAc9C;;;;;;;OAOG;IACH,UAAU,IAAI,YAAY,EAAE;IAI5B;;OAEG;IACH,YAAY,IAAI,IAAI;IAIpB;;;;OAIG;IACH,UAAU,IAAI,UAAU,EAAE;IAI1B;;;;;;;;OAQG;IACH,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAU1C;;;;;;OAMG;IACH,mBAAmB,IAAI,IAAI;IAI3B;;;;;;;OAOG;IACH,OAAO,CAAC,2BAA2B;IASnC;;;;;;;;;;;;;;;OAeG;IACG,cAAc,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkC1E;;;;;;;OAOG;IACH,OAAO,CAAC,YAAY;IAapB;;;;;;;OAOG;IACH,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE;CAI5C"}
|