@mks2508/better-logger 0.14.0-alpha.2 → 0.18.2-alpha.1
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 +289 -185
- package/dist/Logger.d.ts +576 -205
- package/dist/Logger.d.ts.map +1 -1
- package/dist/ScopedLogger.d.ts +48 -292
- package/dist/ScopedLogger.d.ts.map +1 -1
- package/dist/chunks/HookBridge-CiRfR67f.cjs +190 -0
- package/dist/chunks/HookBridge-CiRfR67f.cjs.map +1 -0
- package/dist/chunks/HookBridge-SgMmbXZB.js +173 -0
- package/dist/chunks/HookBridge-SgMmbXZB.js.map +1 -0
- package/dist/chunks/LogContext-Cwn-1Zzb.js +85 -0
- package/dist/chunks/LogContext-Cwn-1Zzb.js.map +1 -0
- package/dist/chunks/LogContext-L7HzynFw.cjs +90 -0
- package/dist/chunks/LogContext-L7HzynFw.cjs.map +1 -0
- package/dist/chunks/SerializerBridge-BaOQOb8q.cjs +166 -0
- package/dist/chunks/SerializerBridge-BaOQOb8q.cjs.map +1 -0
- package/dist/chunks/SerializerBridge-BkpQu5c9.js +149 -0
- package/dist/chunks/SerializerBridge-BkpQu5c9.js.map +1 -0
- package/dist/chunks/StyleManager-CIpd6wbO.cjs +92 -0
- package/dist/chunks/StyleManager-CIpd6wbO.cjs.map +1 -0
- package/dist/chunks/StyleManager-LCvVlVdx.js +87 -0
- package/dist/chunks/StyleManager-LCvVlVdx.js.map +1 -0
- package/dist/chunks/core-Dzz7agGa.cjs +39 -0
- package/dist/chunks/core-Dzz7agGa.cjs.map +1 -0
- package/dist/chunks/core-PoT7RrTK.js +34 -0
- package/dist/chunks/core-PoT7RrTK.js.map +1 -0
- package/dist/chunks/environment-detector-CI3TrWK_.js +110 -0
- package/dist/chunks/environment-detector-CI3TrWK_.js.map +1 -0
- package/dist/chunks/environment-detector-Cnn6wr6O.cjs +163 -0
- package/dist/chunks/environment-detector-Cnn6wr6O.cjs.map +1 -0
- package/dist/chunks/server-fallback-BUKjdLS7.cjs +42 -0
- package/dist/chunks/server-fallback-BUKjdLS7.cjs.map +1 -0
- package/dist/chunks/server-fallback-BsuWH1Dk.js +37 -0
- package/dist/chunks/server-fallback-BsuWH1Dk.js.map +1 -0
- package/dist/chunks/spinner-D3FsF78o.js +700 -0
- package/dist/chunks/spinner-D3FsF78o.js.map +1 -0
- package/dist/chunks/spinner-DNvxbM9a.cjs +747 -0
- package/dist/chunks/spinner-DNvxbM9a.cjs.map +1 -0
- package/dist/chunks/styling-84N8T97t.js +941 -0
- package/dist/chunks/styling-84N8T97t.js.map +1 -0
- package/dist/chunks/styling-Cg5saQ46.cjs +994 -0
- package/dist/chunks/styling-Cg5saQ46.cjs.map +1 -0
- package/dist/chunks/transports-BiDk345e.js +715 -0
- package/dist/chunks/transports-BiDk345e.js.map +1 -0
- package/dist/chunks/transports-COPWmlF1.cjs +756 -0
- package/dist/chunks/transports-COPWmlF1.cjs.map +1 -0
- package/dist/chunks/utils-BqlFYocD.cjs +698 -0
- package/dist/chunks/utils-BqlFYocD.cjs.map +1 -0
- package/dist/chunks/utils-VETbVpkR.js +579 -0
- package/dist/chunks/utils-VETbVpkR.js.map +1 -0
- package/dist/cli/commands/ExportCommand.d.ts +8 -26
- package/dist/cli/commands/ExportCommand.d.ts.map +1 -1
- package/dist/cli/index.d.ts +1 -2
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli-module.d.ts +13 -0
- package/dist/cli-module.d.ts.map +1 -0
- package/dist/cli.cjs +11 -0
- package/dist/cli.js +3 -0
- package/dist/constants.d.ts +16 -47
- package/dist/constants.d.ts.map +1 -1
- package/dist/context/LogContext.d.ts +146 -0
- package/dist/context/LogContext.d.ts.map +1 -0
- package/dist/context/index.d.ts +6 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/context-module.d.ts +6 -0
- package/dist/context-module.d.ts.map +1 -0
- package/dist/context.cjs +3 -0
- package/dist/context.js +2 -0
- package/dist/core.cjs +281 -2
- package/dist/core.cjs.map +1 -1
- package/dist/core.d.ts +6 -7
- package/dist/core.d.ts.map +1 -1
- package/dist/core.js +258 -314
- package/dist/core.js.map +1 -1
- package/dist/example.d.ts.map +1 -1
- package/dist/hooks/HookBridge.d.ts +26 -0
- package/dist/hooks/HookBridge.d.ts.map +1 -0
- package/dist/hooks/HookManager.d.ts +26 -0
- package/dist/hooks/HookManager.d.ts.map +1 -0
- package/dist/hooks/index.d.ts +7 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks-module.d.ts +7 -0
- package/dist/hooks-module.d.ts.map +1 -0
- package/dist/hooks.cjs +5 -0
- package/dist/hooks.js +2 -0
- package/dist/index.cjs +2522 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +42 -130
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2447 -158
- package/dist/index.js.map +1 -1
- package/dist/node-module.d.ts +10 -0
- package/dist/node-module.d.ts.map +1 -0
- package/dist/node.cjs +13 -0
- package/dist/node.cjs.map +1 -0
- package/dist/node.js +12 -0
- package/dist/node.js.map +1 -0
- package/dist/playground/TerminalBridge.d.ts +46 -0
- package/dist/playground/TerminalBridge.d.ts.map +1 -0
- package/dist/playground/box.d.ts +14 -0
- package/dist/playground/box.d.ts.map +1 -0
- package/dist/playground/cli-table.d.ts +14 -0
- package/dist/playground/cli-table.d.ts.map +1 -0
- package/dist/playground/divider.d.ts +10 -0
- package/dist/playground/divider.d.ts.map +1 -0
- package/dist/playground/header.d.ts +11 -0
- package/dist/playground/header.d.ts.map +1 -0
- package/dist/playground/index.d.ts +11 -0
- package/dist/playground/index.d.ts.map +1 -0
- package/dist/playground/server-fallback.d.ts +27 -0
- package/dist/playground/server-fallback.d.ts.map +1 -0
- package/dist/playground/spinner.d.ts +48 -0
- package/dist/playground/spinner.d.ts.map +1 -0
- package/dist/playground/step.d.ts +14 -0
- package/dist/playground/step.d.ts.map +1 -0
- package/dist/playground-module.d.ts +11 -0
- package/dist/playground-module.d.ts.map +1 -0
- package/dist/playground.cjs +9 -0
- package/dist/playground.js +2 -0
- package/dist/serializers/SerializerBridge.d.ts +21 -0
- package/dist/serializers/SerializerBridge.d.ts.map +1 -0
- package/dist/serializers/SerializerRegistry.d.ts +16 -0
- package/dist/serializers/SerializerRegistry.d.ts.map +1 -0
- package/dist/serializers/index.d.ts +7 -0
- package/dist/serializers/index.d.ts.map +1 -0
- package/dist/serializers-module.d.ts +7 -0
- package/dist/serializers-module.d.ts.map +1 -0
- package/dist/serializers.cjs +5 -0
- package/dist/serializers.js +2 -0
- package/dist/styles/StyleManager.d.ts +83 -0
- package/dist/styles/StyleManager.d.ts.map +1 -0
- package/dist/styles/index.d.ts +7 -0
- package/dist/styles/index.d.ts.map +1 -0
- package/dist/styles-module.d.ts +7 -0
- package/dist/styles-module.d.ts.map +1 -0
- package/dist/styles.cjs +7 -0
- package/dist/styles.js +3 -0
- package/dist/styling/banners.d.ts +6 -2
- package/dist/styling/banners.d.ts.map +1 -1
- package/dist/styling/index.d.ts +8 -3
- package/dist/styling/index.d.ts.map +1 -1
- package/dist/terminal/color-converter.d.ts +73 -0
- package/dist/terminal/color-converter.d.ts.map +1 -0
- package/dist/terminal/formatter.d.ts +23 -0
- package/dist/terminal/formatter.d.ts.map +1 -0
- package/dist/transports/ConsoleTransport.d.ts +9 -0
- package/dist/transports/ConsoleTransport.d.ts.map +1 -0
- package/dist/transports/FileTransport.d.ts +56 -0
- package/dist/transports/FileTransport.d.ts.map +1 -0
- package/dist/transports/HttpTransport.d.ts +67 -0
- package/dist/transports/HttpTransport.d.ts.map +1 -0
- package/dist/transports/OtlpTransport.d.ts +148 -0
- package/dist/transports/OtlpTransport.d.ts.map +1 -0
- package/dist/transports/TransportBridge.d.ts +37 -0
- package/dist/transports/TransportBridge.d.ts.map +1 -0
- package/dist/transports/TransportManager.d.ts +36 -0
- package/dist/transports/TransportManager.d.ts.map +1 -0
- package/dist/transports/index.d.ts +6 -0
- package/dist/transports/index.d.ts.map +1 -0
- package/dist/transports-module.d.ts +10 -0
- package/dist/transports-module.d.ts.map +1 -0
- package/dist/transports.cjs +7 -0
- package/dist/transports.js +2 -0
- package/dist/types/core.d.ts +188 -6
- package/dist/types/core.d.ts.map +1 -1
- package/dist/types/handlers.d.ts +0 -67
- package/dist/types/handlers.d.ts.map +1 -1
- package/dist/types/hooks.d.ts +60 -0
- package/dist/types/hooks.d.ts.map +1 -0
- package/dist/types/index.d.ts +7 -3
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/serializers.d.ts +25 -0
- package/dist/types/serializers.d.ts.map +1 -0
- package/dist/types/transports.d.ts +127 -0
- package/dist/types/transports.d.ts.map +1 -0
- package/dist/utils/ansi-colors.d.ts +115 -0
- package/dist/utils/ansi-colors.d.ts.map +1 -0
- package/dist/utils/environment-detector.d.ts +53 -0
- package/dist/utils/environment-detector.d.ts.map +1 -0
- package/dist/utils/formatting.d.ts +1 -0
- package/dist/utils/formatting.d.ts.map +1 -1
- package/dist/utils/index.d.ts +3 -2
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/output.d.ts +8 -11
- package/dist/utils/output.d.ts.map +1 -1
- package/dist/utils/stackTrace.d.ts.map +1 -1
- package/dist/utils/timestamps.d.ts +0 -12
- package/dist/utils/timestamps.d.ts.map +1 -1
- package/package.json +96 -21
- package/.claude/settings.local.json +0 -39
- package/.github/workflows/ci-quality.yml +0 -357
- package/.github/workflows/docs-demo.yml +0 -119
- package/.github/workflows/releases-core.yml +0 -512
- package/.github/workflows/releases-full.yml +0 -582
- package/.github/workflows-backup/ci.yml +0 -221
- package/.github/workflows-backup/nightly.yml +0 -196
- package/.github/workflows-backup/release-optimized.yml +0 -373
- package/.github/workflows-backup/release.yml +0 -269
- package/.release-notes-0.2.0.md +0 -129
- package/.yamllint +0 -28
- package/CHANGELOG.json +0 -865
- package/CLAUDE.md +0 -204
- package/bun.lock +0 -323
- package/demo.html +0 -847
- package/dist/.tsbuildinfo +0 -1
- package/dist/Logger.js +0 -1124
- package/dist/ScopedLogger.js +0 -426
- package/dist/chunks/Logger-Crw1woqR.js +0 -3464
- package/dist/chunks/Logger-Crw1woqR.js.map +0 -1
- package/dist/chunks/Logger-D_p3xnbq.js +0 -2
- package/dist/chunks/Logger-D_p3xnbq.js.map +0 -1
- package/dist/chunks/RemoteLogHandler-CjWpWZGl.js +0 -33
- package/dist/chunks/RemoteLogHandler-CjWpWZGl.js.map +0 -1
- package/dist/chunks/RemoteLogHandler-ymkQ97xl.js +0 -2
- package/dist/chunks/RemoteLogHandler-ymkQ97xl.js.map +0 -1
- package/dist/chunks/environment-Bxbnw4pd.js +0 -544
- package/dist/chunks/environment-Bxbnw4pd.js.map +0 -1
- package/dist/chunks/environment-Dm66zOML.js +0 -4
- package/dist/chunks/environment-Dm66zOML.js.map +0 -1
- package/dist/chunks/formatting-C0riPC5_.js +0 -95
- package/dist/chunks/formatting-C0riPC5_.js.map +0 -1
- package/dist/chunks/formatting-DNCAV66-.js +0 -2
- package/dist/chunks/formatting-DNCAV66-.js.map +0 -1
- package/dist/cli/CommandProcessor.js +0 -184
- package/dist/cli/commands/ConfigCommand.js +0 -88
- package/dist/cli/commands/ExportCommand.js +0 -243
- package/dist/cli/commands/HistoryCommand.d.ts +0 -50
- package/dist/cli/commands/HistoryCommand.d.ts.map +0 -1
- package/dist/cli/commands/HistoryCommand.js +0 -96
- package/dist/cli/commands/StatusCommand.d.ts +0 -33
- package/dist/cli/commands/StatusCommand.d.ts.map +0 -1
- package/dist/cli/commands/StatusCommand.js +0 -93
- package/dist/cli/commands/ThemeCommand.js +0 -79
- package/dist/cli/help.js +0 -118
- package/dist/cli/index.js +0 -46
- package/dist/constants.js +0 -159
- package/dist/example.js +0 -154
- package/dist/exports-module.d.ts +0 -203
- package/dist/exports-module.d.ts.map +0 -1
- package/dist/exports-module.js +0 -260
- package/dist/exports.cjs +0 -2
- package/dist/exports.cjs.map +0 -1
- package/dist/exports.js +0 -238
- package/dist/exports.js.map +0 -1
- package/dist/handlers/AnalyticsLogHandler.d.ts +0 -11
- package/dist/handlers/AnalyticsLogHandler.d.ts.map +0 -1
- package/dist/handlers/AnalyticsLogHandler.js +0 -19
- package/dist/handlers/ExportLogHandler.d.ts +0 -103
- package/dist/handlers/ExportLogHandler.d.ts.map +0 -1
- package/dist/handlers/ExportLogHandler.js +0 -516
- package/dist/handlers/FileLogHandler.d.ts +0 -36
- package/dist/handlers/FileLogHandler.d.ts.map +0 -1
- package/dist/handlers/FileLogHandler.js +0 -156
- package/dist/handlers/RemoteLogHandler.d.ts +0 -14
- package/dist/handlers/RemoteLogHandler.d.ts.map +0 -1
- package/dist/handlers/RemoteLogHandler.js +0 -37
- package/dist/handlers/index.d.ts +0 -8
- package/dist/handlers/index.d.ts.map +0 -1
- package/dist/handlers/index.js +0 -7
- package/dist/main.js +0 -139
- package/dist/styling/LogStyleBuilder.d.ts +0 -149
- package/dist/styling/LogStyleBuilder.d.ts.map +0 -1
- package/dist/styling/LogStyleBuilder.js +0 -289
- package/dist/styling/SemanticStyles.d.ts +0 -181
- package/dist/styling/SemanticStyles.d.ts.map +0 -1
- package/dist/styling/SemanticStyles.js +0 -339
- package/dist/styling/SmartPresets.js +0 -276
- package/dist/styling/StyleBuilder.js +0 -280
- package/dist/styling/banners.js +0 -155
- package/dist/styling/index.js +0 -9
- package/dist/styling/themes.js +0 -231
- package/dist/styling-module.d.ts +0 -185
- package/dist/styling-module.d.ts.map +0 -1
- package/dist/styling-module.js +0 -199
- package/dist/styling.cjs +0 -2
- package/dist/styling.cjs.map +0 -1
- package/dist/styling.js +0 -146
- package/dist/styling.js.map +0 -1
- package/dist/types/Logger.d.ts +0 -700
- package/dist/types/Logger.d.ts.map +0 -1
- package/dist/types/ScopedLogger.d.ts +0 -310
- package/dist/types/ScopedLogger.d.ts.map +0 -1
- package/dist/types/cli/CommandProcessor.d.ts +0 -100
- package/dist/types/cli/CommandProcessor.d.ts.map +0 -1
- package/dist/types/cli/commands/ConfigCommand.d.ts +0 -14
- package/dist/types/cli/commands/ConfigCommand.d.ts.map +0 -1
- package/dist/types/cli/commands/ExportCommand.d.ts +0 -48
- package/dist/types/cli/commands/ExportCommand.d.ts.map +0 -1
- package/dist/types/cli/commands/HistoryCommand.d.ts +0 -47
- package/dist/types/cli/commands/HistoryCommand.d.ts.map +0 -1
- package/dist/types/cli/commands/StatusCommand.d.ts +0 -30
- package/dist/types/cli/commands/StatusCommand.d.ts.map +0 -1
- package/dist/types/cli/commands/ThemeCommand.d.ts +0 -30
- package/dist/types/cli/commands/ThemeCommand.d.ts.map +0 -1
- package/dist/types/cli/help.d.ts +0 -12
- package/dist/types/cli/help.d.ts.map +0 -1
- package/dist/types/cli/index.d.ts +0 -15
- package/dist/types/cli/index.d.ts.map +0 -1
- package/dist/types/constants.d.ts +0 -119
- package/dist/types/constants.d.ts.map +0 -1
- package/dist/types/core.js +0 -28
- package/dist/types/example.d.ts +0 -18
- package/dist/types/example.d.ts.map +0 -1
- package/dist/types/exports-module.d.ts +0 -196
- package/dist/types/exports-module.d.ts.map +0 -1
- package/dist/types/handlers/AnalyticsLogHandler.d.ts +0 -8
- package/dist/types/handlers/AnalyticsLogHandler.d.ts.map +0 -1
- package/dist/types/handlers/ExportLogHandler.d.ts +0 -100
- package/dist/types/handlers/ExportLogHandler.d.ts.map +0 -1
- package/dist/types/handlers/FileLogHandler.d.ts +0 -33
- package/dist/types/handlers/FileLogHandler.d.ts.map +0 -1
- package/dist/types/handlers/RemoteLogHandler.d.ts +0 -11
- package/dist/types/handlers/RemoteLogHandler.d.ts.map +0 -1
- package/dist/types/handlers/index.d.ts +0 -8
- package/dist/types/handlers/index.d.ts.map +0 -1
- package/dist/types/handlers.js +0 -4
- package/dist/types/index.js +0 -4
- package/dist/types/main.d.ts +0 -2
- package/dist/types/main.d.ts.map +0 -1
- package/dist/types/styling/LogStyleBuilder.d.ts +0 -146
- package/dist/types/styling/LogStyleBuilder.d.ts.map +0 -1
- package/dist/types/styling/SemanticStyles.d.ts +0 -178
- package/dist/types/styling/SemanticStyles.d.ts.map +0 -1
- package/dist/types/styling/SmartPresets.d.ts +0 -22
- package/dist/types/styling/SmartPresets.d.ts.map +0 -1
- package/dist/types/styling/StyleBuilder.d.ts +0 -140
- package/dist/types/styling/StyleBuilder.d.ts.map +0 -1
- package/dist/types/styling/banners.d.ts +0 -42
- package/dist/types/styling/banners.d.ts.map +0 -1
- package/dist/types/styling/index.d.ts +0 -10
- package/dist/types/styling/index.d.ts.map +0 -1
- package/dist/types/styling/themes.d.ts +0 -7
- package/dist/types/styling/themes.d.ts.map +0 -1
- package/dist/types/styling-module.d.ts +0 -178
- package/dist/types/styling-module.d.ts.map +0 -1
- package/dist/types/types/core.d.ts +0 -221
- package/dist/types/types/core.d.ts.map +0 -1
- package/dist/types/types/handlers.d.ts +0 -85
- package/dist/types/types/handlers.d.ts.map +0 -1
- package/dist/types/types/index.d.ts +0 -7
- package/dist/types/types/index.d.ts.map +0 -1
- package/dist/types/utils/environment.d.ts +0 -47
- package/dist/types/utils/environment.d.ts.map +0 -1
- package/dist/types/utils/formatting.d.ts +0 -37
- package/dist/types/utils/formatting.d.ts.map +0 -1
- package/dist/types/utils/index.d.ts +0 -7
- package/dist/types/utils/index.d.ts.map +0 -1
- package/dist/types/utils/opentui-detection.d.ts +0 -34
- package/dist/types/utils/opentui-detection.d.ts.map +0 -1
- package/dist/types/utils/output.d.ts +0 -41
- package/dist/types/utils/output.d.ts.map +0 -1
- package/dist/types/utils/stackTrace.d.ts +0 -6
- package/dist/types/utils/stackTrace.d.ts.map +0 -1
- package/dist/types/utils/timestamps.d.ts +0 -20
- package/dist/types/utils/timestamps.d.ts.map +0 -1
- package/dist/utils/environment.d.ts +0 -47
- package/dist/utils/environment.d.ts.map +0 -1
- package/dist/utils/environment.js +0 -85
- package/dist/utils/formatting.js +0 -117
- package/dist/utils/index.js +0 -6
- package/dist/utils/opentui-detection.d.ts +0 -34
- package/dist/utils/opentui-detection.d.ts.map +0 -1
- package/dist/utils/opentui-detection.js +0 -116
- package/dist/utils/output.js +0 -150
- package/dist/utils/stackTrace.js +0 -81
- package/dist/utils/timestamps.js +0 -71
- package/dist/vite.svg +0 -1
- package/docs/API.md +0 -691
- package/docs/CORE.md +0 -264
- package/docs/DEVELOPMENT.md +0 -731
- package/docs/EXPORTS.md +0 -467
- package/docs/PACKAGES.md +0 -244
- package/docs/STYLING.md +0 -405
- package/docs/_config.yml +0 -36
- package/docs/index.md +0 -179
- package/examples/README.md +0 -208
- package/examples/basic-logging.js +0 -75
- package/examples/data-export.js +0 -234
- package/examples/package.json +0 -16
- package/examples/performance-timing.js +0 -170
- package/examples/simplified-api.js +0 -124
- package/examples/styling-themes.js +0 -207
- package/index.html +0 -358
- package/packages/core/package.json +0 -57
- package/packages/exports/package.json +0 -41
- package/packages/nodejs-opentui/README.md +0 -232
- package/packages/nodejs-opentui/package.json +0 -72
- package/packages/nodejs-opentui/src/LogRenderer.ts +0 -171
- package/packages/nodejs-opentui/src/OpenTUILogHandler.ts +0 -178
- package/packages/nodejs-opentui/src/components/LogBadge.tsx +0 -131
- package/packages/nodejs-opentui/src/index.ts +0 -133
- package/packages/nodejs-opentui/src/types.ts +0 -158
- package/packages/nodejs-opentui/tsconfig.json +0 -20
- package/packages/styling/package.json +0 -41
- package/project-utils/README.md +0 -172
- package/project-utils/auto-release-gemini.ts +0 -1193
- package/project-utils/auto-release-ui.ts +0 -1329
- package/project-utils/commit-generator.ts +0 -1385
- package/project-utils/commit-ui.ts +0 -264
- package/project-utils/git-utils.ts +0 -199
- package/project-utils/github-release-manager.ts +0 -466
- package/project-utils/project-config.ts +0 -260
- package/project-utils/prompt-templates.js +0 -345
- package/project-utils/prompt-templates.ts +0 -422
- package/project-utils/version-manager.ts +0 -1078
- package/public/vite.svg +0 -1
- package/src/Logger.ts +0 -1276
- package/src/ScopedLogger.ts +0 -454
- package/src/cli/CommandProcessor.ts +0 -248
- package/src/cli/commands/ConfigCommand.ts +0 -93
- package/src/cli/commands/ExportCommand.ts +0 -276
- package/src/cli/commands/HistoryCommand.ts +0 -117
- package/src/cli/commands/StatusCommand.ts +0 -112
- package/src/cli/commands/ThemeCommand.ts +0 -88
- package/src/cli/help.ts +0 -127
- package/src/cli/index.ts +0 -71
- package/src/constants.ts +0 -171
- package/src/core.ts +0 -393
- package/src/example.ts +0 -210
- package/src/exports-module.ts +0 -311
- package/src/handlers/AnalyticsLogHandler.ts +0 -22
- package/src/handlers/ExportLogHandler.ts +0 -609
- package/src/handlers/FileLogHandler.ts +0 -169
- package/src/handlers/RemoteLogHandler.ts +0 -42
- package/src/handlers/index.ts +0 -8
- package/src/index.ts +0 -209
- package/src/main.ts +0 -196
- package/src/style.css +0 -96
- package/src/styling/LogStyleBuilder.ts +0 -355
- package/src/styling/SemanticStyles.ts +0 -380
- package/src/styling/SmartPresets.ts +0 -288
- package/src/styling/StyleBuilder.ts +0 -319
- package/src/styling/banners.ts +0 -168
- package/src/styling/index.ts +0 -27
- package/src/styling/themes.ts +0 -235
- package/src/styling-module.ts +0 -244
- package/src/types/core.ts +0 -236
- package/src/types/handlers.ts +0 -95
- package/src/types/index.ts +0 -35
- package/src/typescript.svg +0 -1
- package/src/utils/environment.ts +0 -94
- package/src/utils/formatting.ts +0 -142
- package/src/utils/index.ts +0 -21
- package/src/utils/opentui-detection.ts +0 -138
- package/src/utils/output.ts +0 -185
- package/src/utils/stackTrace.ts +0 -95
- package/src/utils/timestamps.ts +0 -80
- package/src/vite-env.d.ts +0 -1
- package/test-core-browser.html +0 -237
- package/test-core-node.js +0 -63
- package/tests/test-conflict-resolution.ts +0 -391
- package/tests/validate-workflows.sh +0 -131
- package/tests/yaml-autofix.sh +0 -146
- package/tsconfig.json +0 -50
- package/vite.config.ts +0 -223
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/handlers/FileLogHandler.ts","../src/handlers/AnalyticsLogHandler.ts","../src/index.ts"],"sourcesContent":["/**\n * @fileoverview File-based log handler for Advanced Logger\n */\n\nimport type { ILogHandler, LogLevel, LogMetadata } from '../types/index.js';\nimport { isNode, isBrowser } from '../utils/environment.js';\nimport { safeSerialize } from '../utils/formatting.js';\n\n/**\n * Universal file-based log handler for persistent logging\n * Works in both Node.js (real files) and browser (localStorage)\n */\nexport class FileLogHandler implements ILogHandler {\n private filename: string;\n private maxSize?: number;\n private fs?: any; // Node.js fs module\n\n constructor(filename: string = 'app.log', maxSize?: number) {\n this.filename = filename;\n this.maxSize = maxSize;\n \n // Load Node.js fs module if in Node environment\n if (isNode) {\n try {\n this.fs = require('fs');\n } catch (error) {\n console.warn('FileLogHandler: Unable to load fs module:', error);\n }\n }\n }\n\n handle(level: LogLevel, message: string, args: any[], metadata: LogMetadata): void {\n const logEntry = {\n timestamp: metadata.timestamp,\n level: level.toUpperCase(),\n prefix: metadata.prefix,\n message,\n args: args.slice(1).map(arg => safeSerialize(arg)),\n location: metadata.stackInfo,\n };\n\n const logLine = this.formatLogLine(logEntry);\n\n if (isNode && this.fs) {\n this.writeToFileNode(logLine);\n } else if (isBrowser) {\n this.writeToFileLocal(logLine);\n } else {\n // Fallback - just console output\n console.log(`[FILE-LOG] ${logLine}`);\n }\n }\n\n /**\n * Format log entry as a single line for file storage\n */\n private formatLogLine(entry: any): string {\n const parts = [\n entry.timestamp,\n `[${entry.level}]`,\n entry.prefix ? `[${entry.prefix}]` : '',\n entry.message\n ].filter(Boolean);\n\n let line = parts.join(' ');\n \n if (entry.args && entry.args.length > 0) {\n line += ' ' + entry.args.map((arg: any) => \n typeof arg === 'object' ? JSON.stringify(arg) : String(arg)\n ).join(' ');\n }\n \n if (entry.location) {\n line += ` (${entry.location.file}:${entry.location.line}:${entry.location.column})`;\n }\n \n return line;\n }\n\n /**\n * Write to actual file in Node.js environment\n */\n private writeToFileNode(logLine: string): void {\n if (!this.fs) return;\n\n try {\n // Check file size if maxSize is set\n if (this.maxSize) {\n try {\n const stats = this.fs.statSync(this.filename);\n if (stats.size > this.maxSize) {\n // Simple rotation: backup current file and start fresh\n const backupName = `${this.filename}.bak`;\n this.fs.renameSync(this.filename, backupName);\n }\n } catch (error) {\n // File doesn't exist yet, that's fine\n }\n }\n\n // Append to file\n this.fs.appendFileSync(this.filename, logLine + '\\n', 'utf8');\n } catch (error) {\n console.error('FileLogHandler: Failed to write to file:', error);\n }\n }\n\n /**\n * Write to localStorage in browser environment\n */\n private writeToFileLocal(logLine: string): void {\n try {\n const storageKey = `logger_${this.filename}`;\n const existingLogs = localStorage.getItem(storageKey) || '';\n \n let newLogs = existingLogs;\n if (existingLogs.length > 0) {\n newLogs += '\\n';\n }\n newLogs += logLine;\n \n // Simple size management - keep last 1000 lines max\n if (this.maxSize || newLogs.split('\\n').length > 1000) {\n const lines = newLogs.split('\\n');\n const maxLines = this.maxSize ? Math.floor(this.maxSize / 100) : 1000;\n if (lines.length > maxLines) {\n newLogs = lines.slice(-maxLines).join('\\n');\n }\n }\n \n localStorage.setItem(storageKey, newLogs);\n } catch (error) {\n console.error('FileLogHandler: Failed to write to localStorage:', error);\n }\n }\n\n /**\n * Get stored logs (useful for debugging)\n */\n getLogs(): string | null {\n if (isNode && this.fs) {\n try {\n return this.fs.readFileSync(this.filename, 'utf8');\n } catch (error) {\n return null;\n }\n } else if (isBrowser) {\n const storageKey = `logger_${this.filename}`;\n return localStorage.getItem(storageKey);\n }\n return null;\n }\n\n /**\n * Clear stored logs\n */\n clearLogs(): void {\n if (isNode && this.fs) {\n try {\n this.fs.writeFileSync(this.filename, '', 'utf8');\n } catch (error) {\n console.error('FileLogHandler: Failed to clear file:', error);\n }\n } else if (isBrowser) {\n const storageKey = `logger_${this.filename}`;\n localStorage.removeItem(storageKey);\n }\n }\n}","/**\n * @fileoverview Analytics log handler for Advanced Logger\n */\n\nimport type { ILogHandler, LogLevel, LogMetadata } from '../types/index.js';\n\n/**\n * Example custom handler for analytics demonstration\n */\nexport class AnalyticsLogHandler implements ILogHandler {\n handle(level: LogLevel, message: string, _args: any[], metadata: LogMetadata): void {\n // In a real implementation, this could send analytics data\n if (level === 'error' || level === 'critical') {\n // Track errors for analytics\n console.debug('Analytics: Error tracked', { \n level, \n message, \n timestamp: metadata.timestamp \n });\n }\n }\n}","/**\n * @fileoverview Better Logger - Librería completa con todas las características\n * @version 0.3.0\n * @since 2024\n * \n * Punto de entrada principal que proporciona la experiencia completa de Better Logger\n * con características avanzadas incluyendo estilos CSS, soporte SVG, animaciones,\n * capacidades de exportación y logging remoto.\n * \n * @module @mks2508/better-logger\n */\n\n// Main Logger class with all features\nimport { Logger } from './Logger.js';\nimport type {\n LogLevel,\n Verbosity,\n ThemeVariant,\n BannerType,\n StyleOptions,\n ILogHandler\n} from './types/index.js';\n\n// Create singleton instance with all features enabled\nconst logger = new Logger();\n\n/**\n * Clase principal Logger con conjunto completo de características\n * \n * @example\n * // Importación y uso básico\n * import { Logger } from '@mks2508/better-logger';\n * \n * const logger = new Logger();\n * logger.preset('cyberpunk'); // Aplicar preset completo\n * logger.info('¡Hola mundo!');\n * \n * @example\n * // Logger con scope para componentes\n * const auth = logger.component('Auth');\n * auth.info('Usuario autenticando...');\n * auth.success('Login exitoso');\n * \n * @example\n * // Logger para APIs con badges\n * const api = logger.api('GraphQL');\n * api.badges(['v2', 'cached']).info('Query ejecutada');\n * \n * @since 0.3.0\n */\nexport { Logger };\n\n/**\n * Instancia singleton del logger lista para usar\n * @default\n * \n * @example\n * // Uso directo sin crear instancia\n * import logger from '@mks2508/better-logger';\n * \n * logger.info('Aplicación iniciada');\n * logger.success('Conexión establecida');\n * logger.warn('Memoria al 80%');\n * logger.error('Fallo en conexión');\n */\nexport default logger;\n\n/**\n * Métodos de logging individuales (enlazados al singleton)\n * \n * @example\n * // Importar solo los métodos necesarios\n * import { info, error, success } from '@mks2508/better-logger';\n * \n * info('Proceso iniciado');\n * success('✓ Completado exitosamente');\n * error('Error:', errorDetails);\n * \n * @since 0.3.0\n */\nexport const debug = (...args: any[]) => logger.debug(...args);\nexport const info = (...args: any[]) => logger.info(...args);\nexport const warn = (...args: any[]) => logger.warn(...args);\nexport const error = (...args: any[]) => logger.error(...args);\nexport const success = (...args: any[]) => logger.success(...args);\nexport const critical = (...args: any[]) => logger.critical(...args);\nexport const trace = (...args: any[]) => logger.trace(...args);\nexport const table = (data: any, columns?: string[]) => logger.table(data, columns);\nexport const group = (label: string, collapsed?: boolean) => logger.group(label, collapsed);\nexport const groupEnd = () => logger.groupEnd();\nexport const time = (label: string) => logger.time(label);\nexport const timeEnd = (label: string) => logger.timeEnd(label);\nexport const setGlobalPrefix = (prefix: string) => logger.setGlobalPrefix(prefix);\nexport const scope = (prefix: string) => logger.scope(prefix);\nexport const setVerbosity = (level: Verbosity) => logger.setVerbosity(level);\nexport const addHandler = (handler: ILogHandler) => logger.addHandler(handler);\nexport const setTheme = (theme: ThemeVariant) => logger.setTheme(theme);\nexport const setBannerType = (bannerType: BannerType) => logger.setBannerType(bannerType);\nexport const showBanner = (bannerType?: BannerType) => logger.showBanner(bannerType);\nexport const logWithSVG = (message: string, svgContent?: string, options?: StyleOptions) => \n logger.logWithSVG(message, svgContent, options);\nexport const logAnimated = (message: string, duration?: number) => \n logger.logAnimated(message, duration);\nexport const cli = (command: string) => logger.cli(command);\n\n// Type exports\nexport type {\n LogLevel,\n Verbosity,\n ThemeVariant,\n BannerType,\n StyleOptions,\n ILogHandler,\n LoggerConfig,\n LogMetadata,\n StackInfo,\n TimerEntry\n} from './types/index.js';\n\n// Styling utilities\nexport { \n StyleBuilder,\n StylePresets,\n THEME_PRESETS,\n THEME_BANNERS,\n BANNER_VARIANTS\n} from './styling/index.js';\n\n// Handler exports\nexport {\n FileLogHandler,\n RemoteLogHandler,\n AnalyticsLogHandler\n} from './handlers/index.js';\n\n// Constants\nexport { DEFAULT_CONFIG } from './constants.js';\n\n// Utility exports\nexport {\n parseStackTrace,\n formatTimestamp\n} from './utils/index.js';\n\n/**\n * Utilidades de estilo para crear estilos personalizados de consola\n * \n * @example\n * // Crear estilo personalizado\n * import { createStyle, stylePresets } from '@mks2508/better-logger';\n * \n * const miEstilo = createStyle()\n * .bg('linear-gradient(45deg, #ff6b6b, #feca57)')\n * .color('white')\n * .padding('10px')\n * .rounded('8px')\n * .bold()\n * .build();\n * \n * console.log('%cMensaje estilizado', miEstilo);\n * \n * @example\n * // Usar presets predefinidos\n * console.log('%cÉxito!', stylePresets.success);\n * console.log('%cError!', stylePresets.error);\n * \n * @since 0.3.0\n */\nimport { StyleBuilder, StylePresets } from './styling/index.js';\n\n/**\n * Crea una nueva instancia de StyleBuilder para estilos personalizados de consola\n * \n * @returns {StyleBuilder} Constructor de estilos encadenable\n * \n * @example\n * const estilo = createStyle()\n * .gradient('#667eea', '#764ba2')\n * .color('white')\n * .padding('8px 16px')\n * .rounded('4px')\n * .shadow('0 2px 4px rgba(0,0,0,0.2)')\n * .build();\n * \n * @since 0.3.0\n */\nexport const createStyle = () => new StyleBuilder();\n\n/**\n * Presets de estilo predefinidos para casos de uso comunes\n * \n * @constant {Object} stylePresets\n * \n * @example\n * console.log('%cOperación exitosa', stylePresets.success);\n * console.log('%cAdvertencia', stylePresets.warning);\n * console.log('%cError crítico', stylePresets.error);\n * console.log('%cInformación', stylePresets.info);\n * console.log('%cDestacado', stylePresets.accent);\n * \n * @since 0.3.0\n */\nexport const stylePresets = {\n success: StylePresets.success().build(),\n error: StylePresets.error().build(),\n warning: StylePresets.warning().build(),\n info: StylePresets.info().build(),\n accent: StylePresets.accent().build(),\n};"],"names":["error","StyleBuilder","StylePresets"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../src/ScopedLogger.ts","../src/cli/CommandProcessor.ts","../src/cli/commands/ConfigCommand.ts","../src/cli/commands/ThemeCommand.ts","../src/cli/commands/ExportCommand.ts","../src/cli/help.ts","../src/cli/index.ts","../src/transports/TransportBridge.ts","../src/playground/TerminalBridge.ts","../src/Logger.ts","../src/index.ts"],"sourcesContent":["import { Logger } from './Logger.js';\nimport type { TimerEntry, Bindings, ISpinnerHandle, IBoxOptions, ITableOptions, CLILogLevel } from './types/index.js';\n\nexport class ScopedLogger {\n private readonly parent: Logger;\n private readonly scopeName: string;\n private badgeList: string[] = [];\n private contextStack: string[] = [];\n private _timers?: Map<string, TimerEntry>;\n\n constructor(parent: Logger, scopeName: string) {\n this.parent = parent;\n this.scopeName = scopeName;\n }\n\n private get timers(): Map<string, TimerEntry> {\n if (!this._timers) this._timers = new Map();\n return this._timers;\n }\n\n private getBindings(): Bindings {\n return {\n scope: this.getScopePrefix(),\n badges: this.badgeList.length > 0 ? [...this.badgeList] : undefined,\n };\n }\n\n private getScopePrefix(): string {\n if (this.contextStack.length === 0) return this.scopeName;\n return [this.scopeName, ...this.contextStack].join(':');\n }\n\n badges(badges: string[]): this {\n this.badgeList = [...badges];\n return this;\n }\n\n badge(badge: string): this {\n if (!this.badgeList.includes(badge)) {\n this.badgeList.push(badge);\n }\n return this;\n }\n\n clearBadges(): this {\n this.badgeList = [];\n return this;\n }\n\n style(presetName: string): this {\n this.parent.setTheme(presetName as any);\n return this;\n }\n\n context(contextName: string): ContextLogger {\n return new ContextLogger(this, contextName);\n }\n\n time(label: string): void {\n this.timers.set(label, {\n label: `${this.scopeName}:${label}`,\n startTime: performance.now(),\n });\n }\n\n timeEnd(label: string): number | undefined {\n const timer = this.timers.get(label);\n if (!timer) {\n this.warn(`Timer '${label}' not found`);\n return undefined;\n }\n const elapsed = performance.now() - timer.startTime;\n this.timers.delete(label);\n this.success(`Timer: ${label} - ${elapsed.toFixed(2)}ms`);\n return elapsed;\n }\n\n debug(...args: unknown[]): void {\n this.parent.logWithBindings(this.getBindings(), 'debug', ...args);\n }\n\n info(...args: unknown[]): void {\n this.parent.logWithBindings(this.getBindings(), 'info', ...args);\n }\n\n warn(...args: unknown[]): void {\n this.parent.logWithBindings(this.getBindings(), 'warn', ...args);\n }\n\n error(...args: unknown[]): void {\n this.parent.logWithBindings(this.getBindings(), 'error', ...args);\n }\n\n success(...args: unknown[]): void {\n const bindings = this.getBindings();\n this.parent.logWithBindingsAndTag(bindings, 'info', 'success', ...args);\n }\n\n critical(...args: unknown[]): void {\n this.parent.logWithBindings(this.getBindings(), 'critical', ...args);\n }\n\n trace(...args: unknown[]): void {\n this.parent.logWithBindings(this.getBindings(), 'trace', ...args);\n }\n\n // ===== CLI PRIMITIVES (v5.0 delegation) =====\n\n /** @see Logger.step */\n step(current: number, total: number, message: string): void {\n this.parent.step(current, total, message);\n }\n\n /** @see Logger.header */\n header(title: string, subtitle?: string): void {\n this.parent.header(title, subtitle);\n }\n\n /** @see Logger.divider */\n divider(): void {\n this.parent.divider();\n }\n\n /** @see Logger.blank */\n blank(): void {\n this.parent.blank();\n }\n\n /** @see Logger.box */\n box(content: string, options?: IBoxOptions): void {\n this.parent.box(content, options);\n }\n\n /** @see Logger.cliTable */\n cliTable(rows: Record<string, unknown>[], options?: ITableOptions): void {\n this.parent.cliTable(rows, options);\n }\n\n /** @see Logger.spinner */\n spinner(message: string): ISpinnerHandle {\n return this.parent.spinner(message);\n }\n\n /** @see Logger.setCLILevel */\n setCLILevel(level: CLILogLevel): void {\n this.parent.setCLILevel(level);\n }\n\n _pushContext(context: string): void {\n this.contextStack.push(context);\n }\n\n _popContext(): void {\n this.contextStack.pop();\n }\n}\n\nexport class APILogger extends ScopedLogger {\n constructor(parent: Logger, apiName: string) {\n super(parent, `API:${apiName}`);\n this.badge('API');\n }\n\n slow(message: string, duration?: number): void {\n this.badge('SLOW');\n const msg = duration ? `${message} (${duration}ms)` : message;\n this.warn(msg);\n }\n\n rateLimit(message: string): void {\n this.badge('RATE_LIMIT');\n this.warn(message);\n }\n\n auth(message: string): void {\n this.badge('AUTH');\n this.error(message);\n }\n\n deprecated(message: string): void {\n this.badge('DEPRECATED');\n this.warn(message);\n }\n}\n\nexport class ComponentLogger extends ScopedLogger {\n constructor(parent: Logger, componentName: string) {\n super(parent, componentName);\n this.badge('COMPONENT');\n }\n\n lifecycle(event: string, message?: string): void {\n this.badge('LIFECYCLE');\n const msg = message ? `${event}: ${message}` : event;\n this.info(msg);\n }\n\n stateChange(from: string, to: string, data?: unknown): void {\n this.badge('STATE');\n const msg = `${from} → ${to}`;\n if (data) {\n this.info(msg, data);\n } else {\n this.info(msg);\n }\n }\n\n propsChange(changes: Record<string, unknown>): void {\n this.badge('PROPS');\n this.debug('Props changed:', changes);\n }\n}\n\nexport class ContextLogger {\n private parentLogger: ScopedLogger;\n private contextName: string;\n\n constructor(parentLogger: ScopedLogger, contextName: string) {\n this.parentLogger = parentLogger;\n this.contextName = contextName;\n }\n\n run<T>(fn: () => T): T {\n this.parentLogger._pushContext(this.contextName);\n try {\n return fn();\n } finally {\n this.parentLogger._popContext();\n }\n }\n\n async runAsync<T>(fn: () => Promise<T>): Promise<T> {\n this.parentLogger._pushContext(this.contextName);\n try {\n return await fn();\n } finally {\n this.parentLogger._popContext();\n }\n }\n\n start(): void {\n this.parentLogger._pushContext(this.contextName);\n }\n\n end(): void {\n this.parentLogger._popContext();\n }\n\n debug(...args: unknown[]): void { this.parentLogger.debug(...args); }\n info(...args: unknown[]): void { this.parentLogger.info(...args); }\n warn(...args: unknown[]): void { this.parentLogger.warn(...args); }\n error(...args: unknown[]): void { this.parentLogger.error(...args); }\n success(...args: unknown[]): void { this.parentLogger.success(...args); }\n critical(...args: unknown[]): void { this.parentLogger.critical(...args); }\n}\n","/**\n * @fileoverview CLI Command processor for Advanced Logger\n */\n\nimport type { Logger } from '../Logger.js';\n\n/**\n * Base interface for CLI commands\n */\nexport interface ICommand {\n name: string;\n description: string;\n usage: string;\n category?: string;\n aliases?: string[];\n execute(args: string, logger: Logger): void | Promise<void>;\n}\n\n/**\n * Plugin interface for extending CLI functionality\n */\nexport interface ICLIPlugin {\n name: string;\n version: string;\n description: string;\n commands: ICommand[];\n initialize?(processor: CommandProcessor, logger: Logger): void;\n cleanup?(): void;\n}\n\n/**\n * Command history entry\n */\ninterface HistoryEntry {\n command: string;\n timestamp: Date;\n success: boolean;\n}\n\n/**\n * CLI command processor\n */\nexport class CommandProcessor {\n private commands: Map<string, ICommand> = new Map();\n private aliases: Map<string, string> = new Map();\n private plugins: Map<string, ICLIPlugin> = new Map();\n private history: HistoryEntry[] = [];\n private maxHistorySize: number = 100;\n private isInteractiveMode: boolean = false;\n\n /**\n * Register a command\n */\n registerCommand(command: ICommand): void {\n this.commands.set(command.name, command);\n \n // Register aliases\n if (command.aliases) {\n for (const alias of command.aliases) {\n this.aliases.set(alias, command.name);\n }\n }\n }\n \n /**\n * Register a plugin\n */\n registerPlugin(plugin: ICLIPlugin, logger?: Logger): void {\n if (this.plugins.has(plugin.name)) {\n throw new Error(`Plugin ${plugin.name} is already registered`);\n }\n \n this.plugins.set(plugin.name, plugin);\n \n // Register plugin commands\n for (const command of plugin.commands) {\n this.registerCommand(command);\n }\n \n // Initialize plugin\n if (plugin.initialize && logger) {\n plugin.initialize(this, logger);\n }\n }\n \n /**\n * Unregister a plugin\n */\n unregisterPlugin(pluginName: string): void {\n const plugin = this.plugins.get(pluginName);\n if (!plugin) return;\n \n // Remove plugin commands\n for (const command of plugin.commands) {\n this.commands.delete(command.name);\n if (command.aliases) {\n for (const alias of command.aliases) {\n this.aliases.delete(alias);\n }\n }\n }\n \n // Cleanup plugin\n if (plugin.cleanup) {\n plugin.cleanup();\n }\n \n this.plugins.delete(pluginName);\n }\n\n /**\n * Get all registered commands\n */\n getCommands(): ICommand[] {\n return Array.from(this.commands.values());\n }\n\n /**\n * Get a specific command\n */\n getCommand(name: string): ICommand | undefined {\n // Check direct command name\n let command = this.commands.get(name);\n if (command) return command;\n \n // Check aliases\n const aliasTarget = this.aliases.get(name);\n if (aliasTarget) {\n return this.commands.get(aliasTarget);\n }\n \n return undefined;\n }\n \n /**\n * Get command history\n */\n getHistory(): HistoryEntry[] {\n return [...this.history];\n }\n \n /**\n * Clear command history\n */\n clearHistory(): void {\n this.history = [];\n }\n \n /**\n * Get registered plugins\n */\n getPlugins(): ICLIPlugin[] {\n return Array.from(this.plugins.values());\n }\n \n /**\n * Enter interactive mode\n */\n enterInteractiveMode(logger: Logger): void {\n this.isInteractiveMode = true;\n logger.info('🔧 Interactive CLI mode activated. Type /exit to quit, /help for commands.');\n \n // Set up browser console listener for interactive commands\n if (typeof window !== 'undefined') {\n this.setupBrowserInteractiveMode(logger);\n }\n }\n \n /**\n * Exit interactive mode\n */\n exitInteractiveMode(): void {\n this.isInteractiveMode = false;\n }\n \n /**\n * Setup browser interactive mode\n */\n private setupBrowserInteractiveMode(logger: Logger): void {\n // Add global CLI function for browser usage\n (window as any).cli = (commandString: string) => {\n return this.processCommand(`/${commandString}`, logger);\n };\n \n logger.info('💡 Use cli(\"command\") to execute CLI commands in browser console.');\n }\n\n /**\n * Process a CLI command\n */\n async processCommand(commandString: string, logger: Logger): Promise<void> {\n if (!commandString.startsWith('/')) {\n logger.error('Invalid command. Commands must start with /');\n this.addToHistory(commandString, false);\n return;\n }\n\n const parts = commandString.slice(1).split(' ');\n const commandName = parts[0] || '';\n const args = parts.slice(1).join(' ');\n\n const command = this.getCommand(commandName);\n if (!command) {\n logger.error(`Unknown command: ${commandName}. Type /help for available commands.`);\n \n // Suggest similar commands\n const suggestions = this.getSuggestions(commandName);\n if (suggestions.length > 0) {\n logger.info(`📋 Did you mean: ${suggestions.slice(0, 3).join(', ')}?`);\n }\n \n this.addToHistory(commandString, false);\n return;\n }\n\n try {\n await command.execute(args || '', logger);\n this.addToHistory(commandString, true);\n } catch (error) {\n logger.error(`Command '${commandName}' failed:`, error);\n this.addToHistory(commandString, false);\n }\n }\n \n /**\n * Add command to history\n */\n private addToHistory(command: string, success: boolean): void {\n this.history.unshift({\n command,\n timestamp: new Date(),\n success\n });\n \n // Limit history size\n if (this.history.length > this.maxHistorySize) {\n this.history = this.history.slice(0, this.maxHistorySize);\n }\n }\n\n /**\n * Get command suggestions for partial matches\n */\n getSuggestions(partial: string): string[] {\n const commandNames = Array.from(this.commands.keys());\n return commandNames.filter(name => name.startsWith(partial));\n }\n}","/**\n * @fileoverview Configuration commands for Advanced Logger CLI\n */\n\nimport type { ICommand } from '../CommandProcessor.js';\nimport type { Logger } from '../../Logger.js';\nimport type { ThemeVariant, BannerType, Verbosity } from '../../types/index.js';\n\n/**\n * Configuration command handler\n */\nexport class ConfigCommand implements ICommand {\n name = 'config';\n description = 'Show or update logger configuration';\n usage = '/config [json|key=value,...]';\n\n execute(args: string, logger: Logger): void {\n if (!args) {\n this.showStatus(logger);\n return;\n }\n\n try {\n // Try to parse as JSON first\n if (args.startsWith('{')) {\n const config = JSON.parse(args);\n this.applyConfig(config, logger);\n } else {\n // Parse key=value pairs\n const pairs = args.split(',').map(pair => pair.trim().split('='));\n const config: any = {};\n pairs.forEach(([key, value]) => {\n if (key && value) {\n config[key.trim()] = value.trim().replace(/[\"']/g, '');\n }\n });\n this.applyConfig(config, logger);\n }\n } catch (error) {\n logger.error('Invalid config format. Use JSON or key=value pairs:', error);\n logger.info('Examples: /config {\"theme\":\"dark\"} or /config theme=neon,verbosity=debug');\n }\n }\n\n private showStatus(logger: Logger): void {\n const statusData = {\n theme: logger.getConfig().theme || 'default',\n verbosity: logger.getConfig().verbosity,\n colors: logger.getConfig().enableColors,\n timestamps: logger.getConfig().enableTimestamps,\n stackTrace: logger.getConfig().enableStackTrace,\n globalPrefix: logger.getConfig().globalPrefix || 'none',\n bannerType: logger.getConfig().bannerType || 'simple',\n handlers: logger.getHandlers().length\n };\n\n logger.group('⚙️ Logger Configuration');\n logger.table(statusData);\n logger.groupEnd();\n }\n\n private applyConfig(config: any, logger: Logger): void {\n const validKeys = ['theme', 'verbosity', 'enableColors', 'enableTimestamps', 'enableStackTrace', 'globalPrefix', 'bannerType'];\n const applied: string[] = [];\n\n Object.entries(config).forEach(([key, value]) => {\n if (validKeys.includes(key)) {\n if (key === 'theme' && typeof value === 'string') {\n logger.setTheme(value as ThemeVariant);\n applied.push(`${key}=${value}`);\n } else if (key === 'bannerType' && typeof value === 'string') {\n logger.setBannerType(value as BannerType);\n applied.push(`${key}=${value}`);\n } else if (key === 'verbosity') {\n logger.setVerbosity(value as Verbosity);\n applied.push(`${key}=${value}`);\n } else if (key === 'globalPrefix') {\n logger.setGlobalPrefix(value as string);\n applied.push(`${key}=${value}`);\n } else {\n logger.updateConfig({ [key]: value });\n applied.push(`${key}=${value}`);\n }\n } else {\n logger.warn(`Invalid config key: ${key}`);\n }\n });\n\n if (applied.length > 0) {\n logger.success(`Configuration updated: ${applied.join(', ')}`);\n }\n }\n}","/**\n * @fileoverview Theme and banner commands for Advanced Logger CLI\n */\n\nimport type { ICommand } from '../CommandProcessor.js';\nimport type { Logger } from '../../Logger.js';\nimport type { BannerType } from '../../types/index.js';\nimport { THEME_PRESETS, BANNER_VARIANTS } from '../../styling/index.js';\nimport { StyleBuilder } from '../../styling/index.js';\n\n/**\n * Themes command - show available themes\n */\nexport class ThemesCommand implements ICommand {\n name = 'themes';\n description = 'Show available theme presets';\n usage = '/themes';\n\n execute(_args: string, logger: Logger): void {\n logger.group('🎨 Available Themes');\n Object.keys(THEME_PRESETS).forEach(themeName => {\n const preview = (THEME_PRESETS as any)[themeName];\n const previewStyle = new StyleBuilder()\n .bg(preview.info.background)\n .color(preview.info.color)\n .padding('4px 8px')\n .rounded('4px')\n .border(preview.info.border)\n .build();\n \n console.log(`%c${themeName}`, previewStyle, `- ${themeName} theme preview`);\n });\n logger.groupEnd();\n }\n}\n\n/**\n * Banners command - show available banner types\n */\nexport class BannersCommand implements ICommand {\n name = 'banners';\n description = 'Show available banner types';\n usage = '/banners';\n\n execute(_args: string, logger: Logger): void {\n logger.group('🖼️ Available Banner Types');\n Object.keys(BANNER_VARIANTS).forEach(bannerName => {\n const banner = (BANNER_VARIANTS as any)[bannerName];\n console.log(`%c${bannerName}`, 'font-weight: bold; color: #667eea;');\n console.log(`%cPreview:`, 'color: #666; font-size: 12px;');\n \n // Show a mini preview\n if (bannerName === 'simple') {\n console.log(`%c${banner.text}`, banner.style);\n } else if (bannerName === 'ascii') {\n console.log(`%c${banner.text.split('\\n').slice(1, 4).join('\\n')}...`, 'font-family: monospace; color: #667eea; font-size: 10px;');\n } else if (bannerName === 'unicode') {\n console.log(`%c${banner.text}`, banner.style);\n } else {\n console.log(`%c${bannerName} banner`, 'color: #666; font-style: italic;');\n }\n });\n logger.groupEnd();\n }\n}\n\n/**\n * Banner command - change/show banner type\n */\nexport class BannerCommand implements ICommand {\n name = 'banner';\n description = 'Change or show current banner type';\n usage = '/banner [type]';\n\n execute(args: string, logger: Logger): void {\n if (!args) {\n logger.showBanner();\n return;\n }\n\n if (args in BANNER_VARIANTS) {\n logger.setBannerType(args as BannerType);\n logger.showBanner();\n } else {\n logger.error(`Invalid banner type: ${args}. Available: ${Object.keys(BANNER_VARIANTS).join(', ')}`);\n }\n }\n}","/**\n * @fileoverview Status and demo commands for Advanced Logger CLI\n */\n\nimport type { ICommand } from '../CommandProcessor.js';\nimport type { Logger } from '../../Logger.js';\n\n/**\n * Status command - show logger configuration and statistics\n */\nexport class StatusCommand implements ICommand {\n name = 'status';\n description = 'Show current logger status and configuration';\n usage = '/status';\n\n execute(_args: string, logger: Logger): void {\n const config = logger.getConfig();\n const statusData = {\n theme: config.theme ? config.theme : 'default',\n verbosity: config.verbosity,\n colors: config.enableColors,\n timestamps: config.enableTimestamps,\n stackTrace: config.enableStackTrace,\n globalPrefix: config.globalPrefix ? config.globalPrefix : 'none',\n bannerType: config.bannerType ? config.bannerType : 'simple',\n handlers: logger.getHandlers().length,\n bufferSize: config.bufferSize ? config.bufferSize : 1000\n };\n\n logger.group('⚙️ Logger Configuration');\n logger.table(statusData);\n logger.groupEnd();\n }\n}\n\n/**\n * Reset command - reset logger to defaults\n */\nexport class ResetCommand implements ICommand {\n name = 'reset';\n description = 'Reset logger configuration to defaults';\n usage = '/reset';\n\n execute(_args: string, logger: Logger): void {\n logger.resetConfig();\n }\n}\n\n/**\n * Demo command - show logger feature demonstration\n */\nexport class DemoCommand implements ICommand {\n name = 'demo';\n description = 'Show comprehensive feature demonstration';\n usage = '/demo';\n\n execute(_args: string, logger: Logger): void {\n logger.group('🎪 Advanced Logger Demo');\n\n // Basic logging demo\n logger.debug('Debug message with detailed information');\n logger.info('Informational message about system state');\n logger.warn('Warning about deprecated feature');\n logger.error('Error processing user request');\n logger.success('Operation completed successfully');\n logger.critical('Critical system failure detected');\n\n // Advanced features demo\n logger.group('📊 Advanced Features Demo');\n\n // Table demo\n logger.table([\n { feature: 'Styled Console', status: '✅ Active', performance: 'Excellent' },\n { feature: 'Theme System', status: '✅ Active', performance: 'Great' },\n { feature: 'CLI Interface', status: '✅ Active', performance: 'Good' },\n { feature: 'Export System', status: '✅ Active', performance: 'Excellent' }\n ]);\n\n // Timer demo\n logger.time('demo-operation');\n setTimeout(() => {\n logger.timeEnd('demo-operation');\n }, 100);\n\n // SVG demo\n logger.logWithSVG('SVG Demo');\n\n // Animated demo\n logger.logAnimated('🌟 Animated Logger Demo 🌟', 2);\n\n logger.groupEnd();\n logger.groupEnd();\n\n logger.info('Demo completed! Check the console for styled output.');\n }\n}\n","/**\n * @fileoverview Help system for Advanced Logger CLI\n */\n\nimport type { ICommand } from './CommandProcessor.js';\nimport type { Logger } from '../Logger.js';\nimport { StyleBuilder } from '../styling/index.js';\n\n/**\n * Help command - show comprehensive CLI help\n */\nexport class HelpCommand implements ICommand {\n name = 'help';\n description = 'Show CLI help and available commands';\n usage = '/help [command]';\n\n execute(_args: string, logger: Logger): void {\n const helpStyle = new StyleBuilder()\n .bg('linear-gradient(135deg, #f8f9fa 0%, #e9ecef 100%)')\n .color('#495057')\n .padding('15px 20px')\n .rounded('8px')\n .border('1px solid #dee2e6')\n .font('Monaco, Consolas, monospace')\n .size('13px')\n .build();\n\n const helpText = `\n╭─────────────── ADVANCED LOGGER CLI COMMANDS ─────────────────╮\n│ │\n│ CONFIGURATION │\n│ /config Show current configuration │\n│ /config {json} Apply JSON configuration │\n│ /config key=val Apply key-value configuration │\n│ /themes Show available themes │\n│ /banners Show available banner types │\n│ /banner [type] Change/show banner type │\n│ /status Show logger status & buffer stats │\n│ /demo Show feature demonstration │\n│ /reset Reset to default configuration │\n│ │\n│ EXPORT & CLIPBOARD │\n│ /export <format> Export logs (json|csv|md|plain|html) │\n│ /copy <format> Copy logs to clipboard │\n│ /buffer-size N Set log buffer size │\n│ /buffer-info Show buffer statistics │\n│ /clear-buffer Clear stored logs │\n│ │\n│ EXPORT FILTERS (for export/copy commands) │\n│ --level error,warn Filter by log levels │\n│ --since 2h Logs from last 2 hours │\n│ --until 1h Logs until 1 hour ago │\n│ --prefix API,DB Filter by prefixes │\n│ --exclude-prefix INT Exclude prefixes │\n│ --last 50 Last 50 logs only │\n│ --first 25 First 25 logs only │\n│ --search \"error\" Search in log messages │\n│ --with-stack Only logs with stack traces │\n│ --errors-only Only error + critical logs │\n│ --group-by level Group by level/prefix/hour │\n│ │\n│ EXPORT OPTIONS │\n│ --minimal Minimal output format │\n│ --compact Remove extra whitespace │\n│ --styled Include styling (HTML format) │\n│ │\n├──────────────────── CONFIGURATION OPTIONS ─────────────────┤\n│ │\n│ theme: default | dark | light | neon | minimal | cyberpunk│\n│ bannerType: simple | ascii | unicode | svg | animated │\n│ verbosity: debug | info | warn | error | critical | silent│\n│ enableColors: true | false │\n│ enableTimestamps: true | false │\n│ enableStackTrace: true | false │\n│ globalPrefix: \"string\" │\n│ bufferSize: number (50-10000) │\n│ │\n├──────────────────────── EXAMPLES ──────────────────────────┤\n│ │\n│ Basic Configuration: │\n│ /config {\"theme\":\"dark\",\"verbosity\":\"debug\"} │\n│ /config theme=neon,bufferSize=2000 │\n│ /banner animated Change to animated banner │\n│ │\n│ Export Examples: │\n│ /export json --level=error,warn --last=25 │\n│ /export csv --since=2h --prefix=API │\n│ /export markdown --group-by=level --errors-only │\n│ /export html --styled --since=1h │\n│ │\n│ Clipboard Examples: │\n│ /copy plain --minimal --last=10 │\n│ /copy json --search=\"authentication\" --compact │\n│ /copy csv --since=30m --exclude-prefix=DEBUG │\n│ │\n│ Buffer Management: │\n│ /buffer-size 5000 Increase buffer to 5000 logs │\n│ /buffer-info Show detailed buffer statistics │\n│ /clear-buffer Clear all stored logs │\n│ │\n│ Time Formats: │\n│ --since=2h 2 hours ago │\n│ --since=30m 30 minutes ago │\n│ --since=1d 1 day ago │\n│ --since=\"2024-01-01T10:00:00Z\" Specific ISO date │\n│ │\n╰─────────────────────────────────────────────────────────────╯`;\n\n console.log(`%c${helpText}`, helpStyle);\n\n // Show quick tips\n logger.group('💡 Quick Tips');\n const tips = [\n 'Use /demo to see all logger features in action',\n 'Logs are automatically stored in a circular buffer for export',\n 'Export formats: JSON (structured), CSV (Excel), Markdown (readable), Plain (simple), HTML (styled)',\n 'Time filters support relative (2h, 30m) and absolute (ISO) formats',\n 'Combine multiple filters: /export json --level=error --since=1h --search=\"auth\"',\n 'Use /copy for quick clipboard access instead of /export'\n ];\n \n tips.forEach(tip => {\n logger.info(`• ${tip}`);\n });\n logger.groupEnd();\n }\n}","/**\n * @fileoverview CLI system exports for Advanced Logger\n */\n\n// Core CLI system\nexport { CommandProcessor, type ICommand } from './CommandProcessor.js';\nimport { CommandProcessor } from './CommandProcessor.js';\n\n// Commands\nexport { ConfigCommand } from './commands/ConfigCommand.js';\nexport { ThemesCommand, BannersCommand, BannerCommand } from './commands/ThemeCommand.js';\nexport { StatusCommand, ResetCommand, DemoCommand } from './commands/ExportCommand.js';\n\n// Help system\nexport { HelpCommand } from './help.js';\n\n// Import all commands\nimport { HelpCommand } from './help.js';\nimport { ConfigCommand } from './commands/ConfigCommand.js';\nimport { ThemesCommand, BannersCommand, BannerCommand } from './commands/ThemeCommand.js';\nimport { StatusCommand, ResetCommand, DemoCommand } from './commands/ExportCommand.js';\n\n/**\n * Create and configure default CLI processor\n */\nexport function createDefaultCLI(): CommandProcessor {\n const processor = new CommandProcessor();\n\n // Register all default commands\n processor.registerCommand(new HelpCommand());\n processor.registerCommand(new ConfigCommand());\n processor.registerCommand(new ThemesCommand());\n processor.registerCommand(new BannersCommand());\n processor.registerCommand(new BannerCommand());\n processor.registerCommand(new StatusCommand());\n processor.registerCommand(new ResetCommand());\n processor.registerCommand(new DemoCommand());\n\n return processor;\n}","/**\n * @fileoverview TransportBridge — TransportManager facade.\n * Encapsulates transport lifecycle: add, remove, flush, close.\n */\n\nimport type { TransportTarget } from '../types/index.js';\nimport { TransportManager } from '../transports/index.js';\n\n/**\n * Result of adding a transport.\n */\nexport interface AddTransportResult {\n /** Unique transport ID. */\n id: string;\n /** The TransportManager instance (created on first add). */\n manager: TransportManager;\n}\n\n/**\n * Bridge for transport lifecycle management.\n */\nexport interface TransportBridge {\n /** Adds a transport and returns its ID. */\n addTransport(target: TransportTarget): string;\n /** Removes a transport by ID. Returns true if removed. */\n removeTransport(id: string): boolean;\n /** Forces flush of all transport buffers. */\n flushTransports(): Promise<void>;\n /** Closes all transports gracefully. */\n closeTransports(): Promise<void>;\n /** Returns the underlying manager (or undefined if never used). */\n getTransportManager(): TransportManager | undefined;\n /** Writes a transport record (fire-and-forget). No-op if manager not initialized. */\n writeRecord(record: Parameters<TransportManager['write']>[0]): void;\n}\n\n/**\n * Creates a TransportBridge instance.\n */\nexport function createTransportBridge(): TransportBridge {\n let transportManager: TransportManager | undefined;\n\n return {\n addTransport(target: TransportTarget): string {\n if (!transportManager) {\n transportManager = new TransportManager();\n }\n return transportManager.add(target);\n },\n\n removeTransport(id: string): boolean {\n return transportManager?.remove(id) ?? false;\n },\n\n async flushTransports(): Promise<void> {\n await transportManager?.flush();\n },\n\n async closeTransports(): Promise<void> {\n await transportManager?.close();\n },\n\n getTransportManager(): TransportManager | undefined {\n return transportManager;\n },\n\n writeRecord(record): void {\n if (!transportManager) return;\n // Fire-and-forget — never break the sync log path.\n transportManager.write(record).catch(() => {});\n }\n };\n}\n","/**\n * @fileoverview TerminalBridge — CLI terminal integration.\n * Encapsulates TTY detection, CLI primitive rendering, and server-mode\n * fallback for non-TTY environments.\n */\n\nimport type { CLILogLevel, ISpinnerHandle, IBoxOptions, ITableOptions } from '../types/index.js';\nimport { renderStep } from '../playground/step.js';\nimport { renderHeader } from '../playground/header.js';\nimport { renderDivider } from '../playground/divider.js';\nimport { renderBox } from '../playground/box.js';\nimport { renderTable } from '../playground/cli-table.js';\nimport { SpinnerManager, NoopSpinner } from '../playground/spinner.js';\nimport { ServerFallback } from '../playground/server-fallback.js';\nimport { getColorCapability, isRunningInTerminal } from '../utils/environment-detector.js';\nimport type { LoggerConfig } from '../types/index.js';\nimport type { Logger } from '../Logger.js';\n\n/**\n * Bridge for CLI terminal operations.\n */\nexport interface TerminalBridge {\n /** Displays a step progress indicator. */\n step(current: number, total: number, message: string): void;\n /** Displays a styled header. */\n header(title: string, subtitle?: string): void;\n /** Displays a horizontal divider. */\n divider(): void;\n /** Outputs a blank line. */\n blank(): void;\n /** Renders content inside a bordered box. */\n box(content: string, options?: IBoxOptions): void;\n /** Renders an array of objects as an ASCII table. */\n cliTable(rows: Record<string, unknown>[], options?: ITableOptions): void;\n /** Creates a spinner handle. */\n spinner(message: string): ISpinnerHandle;\n /** Whether CLI primitives should be shown. */\n getShowPrimitives(): boolean;\n /** Sets whether CLI primitives should be shown. */\n setShowPrimitives(show: boolean): void;\n /** Returns the server fallback instance (lazy). */\n getServerFallback(): ServerFallback;\n /** Returns true if running in a TTY. */\n isInTerminal(): boolean;\n}\n\ninterface ITerminalBridgeCtorOptions {\n config: LoggerConfig;\n getLogger: () => Logger;\n}\n\n/**\n * Creates a TerminalBridge using a getter to avoid circular reference at construction.\n */\nexport function createTerminalBridge(options: ITerminalBridgeCtorOptions): TerminalBridge {\n let _showPrimitives = true;\n let _serverFallback: ServerFallback | undefined;\n\n return {\n step(current: number, total: number, message: string): void {\n if (!_showPrimitives) return;\n if (!isRunningInTerminal()) {\n this.getServerFallback().step(current, total, message);\n return;\n }\n const colorCap = getColorCapability();\n const output = renderStep(current, total, message, colorCap);\n process.stderr.write(output + '\\n');\n },\n\n header(title: string, subtitle?: string): void {\n if (!_showPrimitives) return;\n if (!isRunningInTerminal()) {\n this.getServerFallback().header(title, subtitle);\n return;\n }\n const output = renderHeader(title, subtitle);\n process.stderr.write(output + '\\n');\n },\n\n divider(): void {\n if (!_showPrimitives) return;\n if (!isRunningInTerminal()) {\n this.getServerFallback().divider();\n return;\n }\n const output = renderDivider();\n process.stderr.write(output + '\\n');\n },\n\n blank(): void {\n if (!_showPrimitives) return;\n if (!isRunningInTerminal()) {\n this.getServerFallback().blank();\n return;\n }\n process.stderr.write('\\n');\n },\n\n box(content: string, opts?: IBoxOptions): void {\n if (!_showPrimitives) return;\n if (!isRunningInTerminal()) {\n this.getServerFallback().box(content, opts);\n return;\n }\n const colorCap = getColorCapability();\n const output = renderBox(content, opts, colorCap);\n process.stderr.write(output + '\\n');\n },\n\n cliTable(rows: Record<string, unknown>[], opts?: ITableOptions): void {\n if (!_showPrimitives) return;\n if (!isRunningInTerminal()) {\n this.getServerFallback().cliTable(rows, opts);\n return;\n }\n const colorCap = getColorCapability();\n const output = renderTable(rows, opts, colorCap);\n process.stderr.write(output + '\\n');\n },\n\n spinner(message: string): ISpinnerHandle {\n const logger = options.getLogger();\n if (!isRunningInTerminal() || options.config.outputMode === 'silent') {\n return new NoopSpinner(message, logger);\n }\n return new SpinnerManager(message, options.config, logger);\n },\n\n getShowPrimitives(): boolean {\n return _showPrimitives;\n },\n\n setShowPrimitives(show: boolean): void {\n _showPrimitives = show;\n },\n\n getServerFallback(): ServerFallback {\n if (!_serverFallback) {\n _serverFallback = new ServerFallback(options.getLogger());\n }\n return _serverFallback;\n },\n\n isInTerminal(): boolean {\n return isRunningInTerminal();\n }\n };\n}\n","/**\n * @fileoverview Logger avanzado con arquitectura modular y API simplificada\n * \n * Sistema de logging profesional con estilos CSS avanzados, temas adaptativos,\n * badges automáticos, contextos temporales y exportación de datos.\n */\n\n// Type imports\nimport type {\n LogLevel,\n LogTag,\n Verbosity,\n ThemeVariant,\n BannerType,\n LoggerConfig,\n TimerEntry,\n ILogHandler,\n LogMetadata,\n StyleOptions,\n Bindings,\n SerializerFn,\n HookEvent,\n HookCallback,\n MiddlewareFn,\n TransportTarget,\n TransportRecord,\n ILogResourceRef,\n StackInfo,\n LogStyles,\n ILogAttributes,\n LogAttributeValue\n} from './types/index.js';\n\nimport { LOG_LEVELS } from './types/index.js';\nimport {\n LOG_LEVEL_TO_SEVERITY_NUMBER,\n LOG_LEVEL_TO_SEVERITY_TEXT,\n type ILogResource as ITransportLogResource\n} from './types/index.js';\n\n// Enterprise features\nimport { SerializerRegistry } from './serializers/index.js';\nimport { HookManager } from './hooks/index.js';\nimport { TransportManager } from './transports/index.js';\n\n// Utility imports\nimport { parseStackTrace } from './utils/stackTrace.js';\nimport { formatTimestamp } from './utils/timestamps.js';\nimport { createStyledOutput, setupThemeChangeListener } from './utils/output.js';\nimport { getEnvironment, getColorCapability, isRunningInTerminal } from './utils/environment-detector.js';\nimport { formatBadge } from './terminal/formatter.js';\n\n// Styling imports\nimport {\n THEME_PRESETS,\n THEME_BANNERS,\n displayInitBanner,\n StylePresets,\n StyleBuilder\n} from './styling/index.js';\n\n// Smart presets and dynamic scoped loggers\nimport { getSmartPreset, getAvailablePresets, hasPreset } from './styling/SmartPresets.js';\n\n// Scoped loggers (static import for performance)\nimport { ScopedLogger, APILogger, ComponentLogger } from './ScopedLogger.js';\n\n// CLI imports\nimport { createDefaultCLI, type CommandProcessor } from './cli/index.js';\n\n// Constants\nimport { DEFAULT_CONFIG, CLI_LEVEL_MAP } from './constants.js';\n\n// CLI Primitives\nimport type { CLILogLevel, ISpinnerHandle, IBoxOptions, ITableOptions } from './types/index.js';\n\n// Bridge imports\nimport { createLogContext, type LogContext } from './context/LogContext.js';\nimport { createTransportBridge, type TransportBridge } from './transports/TransportBridge.js';\nimport { createHookBridge, type HookBridge } from './hooks/HookBridge.js';\nimport { createSerializerBridge, type SerializerBridge } from './serializers/SerializerBridge.js';\nimport { createTerminalBridge, type TerminalBridge } from './playground/TerminalBridge.js';\nimport { createStyleManager, type StyleManager } from './styles/StyleManager.js';\n\n/**\n * Estilos del tema activo actual\n * @private\n */\nlet LEVEL_STYLES = THEME_PRESETS.default;\n\n/**\n * Clase principal Logger con capacidades avanzadas de logging\n * \n * @class Logger\n * @description Sistema completo de logging con temas, badges, contextos y exportación.\n * Detecta automáticamente el tema claro/oscuro del navegador.\n * \n * @example\n * // Uso básico sin configuración\n * import logger from '@mks2508/better-logger';\n * logger.info('Aplicación iniciada');\n * logger.success('Conexión establecida');\n * \n * @example\n * // Aplicar un preset temático\n * logger.preset('cyberpunk');\n * logger.warn('Advertencia con estilo neón');\n * \n * @example\n * // Logger con scope para componentes\n * const auth = logger.component('Autenticación');\n * auth.info('Usuario intentando login');\n * auth.success('Login exitoso');\n * \n */\nexport class Logger {\n private config: LoggerConfig;\n private scopedPrefix?: string;\n private handlers: ILogHandler[] = [];\n private timers: Map<string, TimerEntry> = new Map();\n private groupDepth: number = 0;\n private cliProcessor?: CommandProcessor;\n private themeChangeListener?: (() => void) | null;\n private badgeList: string[] = [];\n private displaySettings = {\n showTimestamp: true,\n showLocation: true,\n showBadges: true\n };\n\n private serializerBridge: SerializerBridge;\n private hookBridge: HookBridge;\n private logContext: LogContext;\n private transportBridge: TransportBridge;\n /** Set during success() so log() skips its own dispatch (N2 fix). */\n private _successTagDispatched = false;\n private styleManager: StyleManager;\n\n /** Whether CLI primitives (step, box, header, etc.) should be shown*/\n private _showPrimitives = true;\n private terminalBridge: TerminalBridge;\n\n /**\n * Active smart-preset reference (set by `preset()`). Typed as `unknown`\n * to keep the public surface clean; consumed by `createStyledOutput`.\n */\n private _activePreset?: unknown;\n /**\n * Name of the active smart-preset. Stored separately so theme-change\n * detection can re-render without re-running the preset body.\n */\n private _activePresetName?: string;\n /**\n * Last-applied `customize()` overrides. Stored for later read by\n * `createStyledOutput`.\n */\n private _customization?: unknown;\n\n /**\n * This logger's own context bindings (from child() calls).\n * Single source of truth for this logger's contribution to the context chain.\n * @private\n */\n private _bindings: Record<string, unknown> = {};\n\n /**\n * Reference to the parent's merged context record at the time this logger\n * was created. Together with _bindings, forms the context chain.\n * Undefined for the root logger.\n * @private\n */\n private _parentContextRecord: Record<string, unknown> | undefined;\n\n /**\n * Crea una nueva instancia del Logger\n * \n * @param {Partial<LoggerConfig>} config - Configuración opcional del logger\n * \n * @example\n * // Logger con configuración personalizada\n * const logger = new Logger({\n * theme: 'neon',\n * globalPrefix: 'MiApp',\n * verbosity: 'debug',\n * bufferSize: 1000\n * });\n */\n constructor(config: Partial<LoggerConfig> = {}) {\n this.config = {\n ...DEFAULT_CONFIG,\n ...config,\n };\n\n // Initialize enterprise features\n this.serializerBridge = createSerializerBridge();\n this.hookBridge = createHookBridge();\n\n // Initialize LogContext bridge\n this.logContext = createLogContext({\n initialResource: this.config.resource,\n childLoggerFactory: (childConfig: Partial<LoggerConfig>): Logger => {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n return new Logger({ ...this.config, ...childConfig });\n },\n // F4.5.5 fix: capture the parent's full merged context at child-creation\n // time so child loggers can build the chain correctly.\n getParentContextRecord: () => this._captureMergedContext()\n });\n\n // Initialize TransportBridge\n this.transportBridge = createTransportBridge();\n\n // Initialize StyleManager bridge\n this.styleManager = createStyleManager();\n\n // Initialize TerminalBridge (lazy — uses getter to avoid circular ref)\n this.terminalBridge = createTerminalBridge({\n config: this.config,\n getLogger: () => this\n });\n\n // Initialize CLI processor lazily.\n // Consumers who use `logger.cli(...)` pay for setup at call time.\n this.cliProcessor = createDefaultCLI();\n\n // Set up theme change listener if auto-detection is enabled\n if (this.config.autoDetectTheme) {\n this.setupAutoThemeDetection();\n }\n }\n\n // ===== PRIVATE HELPER METHODS =====\n \n /**\n * Configura la detección automática de tema con listener de cambios\n * @private\n * @description Detecta automáticamente si el navegador está en modo claro u oscuro\n */\n private setupAutoThemeDetection(): void {\n // Clean up existing listener if any\n if (this.themeChangeListener) {\n this.themeChangeListener();\n this.themeChangeListener = null;\n }\n\n // Set up new listener\n this.themeChangeListener = setupThemeChangeListener((theme) => {\n // Theme changed - logs will automatically use new colors on next call\n // No need to update anything as colors are resolved dynamically\n this.debug(`DevTools theme changed to: ${theme}`);\n });\n }\n\n // ===== CONFIGURATION METHODS =====\n\n /**\n * Obtiene la configuración actual del logger\n * \n * @returns {LoggerConfig} Configuración completa actual\n * \n * @example\n * const config = logger.getConfig();\n * console.log('Verbosidad actual:', config.verbosity);\n * console.log('Tema actual:', config.theme);\n * \n */\n getConfig(): LoggerConfig {\n return { ...this.config };\n }\n\n /**\n * Actualiza la configuración del logger\n * \n * @param {Partial<LoggerConfig>} updates - Propiedades a actualizar\n * \n * @example\n * logger.updateConfig({\n * verbosity: 'debug',\n * enableTimestamps: false,\n * theme: 'cyberpunk'\n * });\n * \n */\n updateConfig(updates: Partial<LoggerConfig>): void {\n const previousAutoDetect = this.config.autoDetectTheme;\n this.config = { ...this.config, ...updates };\n \n // Handle auto-detection changes\n if (updates.autoDetectTheme !== undefined && updates.autoDetectTheme !== previousAutoDetect) {\n if (updates.autoDetectTheme) {\n this.setupAutoThemeDetection();\n } else if (this.themeChangeListener) {\n this.themeChangeListener();\n this.themeChangeListener = null;\n }\n }\n }\n\n /**\n * Establece el prefijo global para todos los mensajes de log\n * \n * @param {string} prefix - Prefijo a usar\n * \n * @example\n * logger.setGlobalPrefix('MiApp');\n * logger.info('Iniciado'); // [MiApp] Iniciado\n * \n */\n setGlobalPrefix(prefix: string): void {\n this.config.globalPrefix = prefix;\n }\n\n /**\n * Establece el nivel de verbosidad para filtrar la salida de logs\n * \n * @param {Verbosity} level - Nivel mínimo a mostrar ('debug' | 'info' | 'warn' | 'error' | 'critical' | 'silent')\n * \n * @example\n * logger.setVerbosity('warn'); // Solo muestra warn, error y critical\n * logger.setVerbosity('debug'); // Muestra todos los niveles\n * logger.setVerbosity('silent'); // No muestra nada\n * \n */\n setVerbosity(level: Verbosity): void {\n this.config.verbosity = level;\n }\n\n /**\n * Establece el tema del logger\n * \n * @param {ThemeVariant} theme - Tema a aplicar ('default' | 'dark' | 'light' | 'neon' | 'minimal' | 'cyberpunk')\n * \n * @example\n * logger.setTheme('neon'); // Tema con colores neón\n * logger.setTheme('minimal'); // Tema minimalista\n * logger.setTheme('cyberpunk'); // Tema cyberpunk con efectos\n * \n */\n setTheme(theme: ThemeVariant): void {\n // First check if it's a smart preset\n if (hasPreset(theme)) {\n this.preset(theme);\n return;\n }\n\n // Fallback to old theme system — delegate to StyleManager to keep\n // the module-level LEVEL_STYLES in sync with the bridge.\n const applied = this.styleManager.setTheme(theme);\n if (applied) {\n this.config.theme = theme;\n\n // Show theme-specific banner through the centralised writer\n // so silent/custom output modes are respected.\n const bannersRecord = THEME_BANNERS as Record<string, { simple: string; style: string }>;\n if (theme in bannersRecord) {\n const themeBanner = bannersRecord[theme];\n if (themeBanner) {\n this.writeOutput(`%c${themeBanner.simple}`, 'info', [themeBanner.style], []);\n }\n }\n\n this.success(`Theme changed to: ${theme}`);\n } else {\n this.error(`Invalid theme: ${theme}. Available:`, [...getAvailablePresets(), ...Object.keys(THEME_PRESETS)]);\n }\n }\n\n /**\n * Establece el tipo de banner para mostrar en la inicialización\n * \n * @param {BannerType} bannerType - Tipo de banner ('simple' | 'ascii' | 'unicode' | 'svg' | 'animated')\n * \n * @example\n * logger.setBannerType('ascii'); // Banner con arte ASCII\n * logger.setBannerType('unicode'); // Banner con caracteres Unicode\n * logger.setBannerType('animated'); // Banner con animación\n * \n */\n setBannerType(bannerType: BannerType): void {\n this.config.bannerType = bannerType;\n this.success(`Banner type changed to: ${bannerType}`);\n }\n\n /**\n * Runs `fn` within an AsyncLocalStorage scope where `bindings` are\n * merged into the context for all log calls inside `fn`.\n *\n * Without `fn` (the old setter shape): no-op for backwards compatibility.\n * Prefer `child()` for persistent bindings or `withContextAsync()` for\n * async callbacks.\n *\n * @param bindings - Key-value pairs to attach for the duration of `fn`\n * @param fn - Optional synchronous function to run with scoped bindings\n * @returns The return value of `fn`, or undefined if no fn provided\n *\n * @example\n * // Scoped synchronous callback\n * logger.withContext({ requestId: 'r-42' }, () => {\n * doWork(); // logs inside see requestId in attributes\n * });\n *\n * @example\n * // Persistent binding: use child()\n * const reqLog = logger.child({ requestId: 'r-42' });\n * reqLog.info('handling request'); // attributes include requestId\n *\n * @see {@link child} for an immutable copy with the merged context\n * @see {@link withContextAsync} for async callback variant\n */\n withContext<R>(bindings: Record<string, unknown>, fn?: () => R): R | undefined {\n return this.logContext.withContext(bindings, fn);\n }\n\n /**\n * Async variant of `withContext`. Runs `fn` within an AsyncLocalStorage\n * scope so bindings are available to all async log calls inside `fn`.\n *\n * @param bindings - Key-value pairs to attach for the duration of `fn`\n * @param fn - Async function to run with the scoped bindings\n * @returns The return value of `fn`\n *\n * @example\n * await logger.withContextAsync({ requestId: 'r-42' }, async () => {\n * await fetchData(); // logs inside see requestId in attributes\n * });\n *\n * @see {@link child} for a persistent child logger\n * @see {@link withContext} for synchronous callback variant\n */\n withContextAsync<R>(bindings: Record<string, unknown>, fn: () => Promise<R>): Promise<R> {\n return this.logContext.withContextAsync(bindings, fn);\n }\n\n /**\n * Returns an immutable copy of this logger with the extra context bound.\n * Future calls on the child emit with the merged context, without\n * mutating the parent — the canonical MDC pattern.\n *\n * @param extra - Key-value pairs to attach (requestId, userId, ...)\n * @returns A new Logger with merged context\n *\n * @example\n * const reqLog = logger.child({ requestId: req.id });\n * reqLog.info('start'); // emits attributes: { requestId }\n * logger.info('unrelated'); // NOT affected — parent's context untouched\n *\n */\n child(extra: Record<string, unknown>): Logger {\n // LogContext.child() creates the child Logger via factory and captures\n // the parent's _getContextRecord() snapshot (parent context + ALS) in\n // __parentSnapshot on the child. We pick that up here and assign it to\n // _parentContextRecord, then set the child's _bindings.\n const childLogger = this.logContext.child(extra) as unknown as Logger;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const snapshot = (childLogger as any)['__parentSnapshot'] as Record<string, unknown> | undefined;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (childLogger as any)._parentContextRecord = snapshot ?? {};\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (childLogger as any)._bindings = extra;\n return childLogger;\n }\n\n /**\n * Drops every key from the bound context. After this call, emitted\n * records no longer carry `attributes` until {@link withContext} or\n * {@link child} re-establish one.\n *\n * @returns The same logger instance, now context-free\n */\n clearContext(): this {\n this.logContext.clearContext();\n return this;\n }\n\n /**\n * Snapshot of the bound context. Returned object is a shallow copy:\n * mutating it does NOT affect what subsequent log calls emit.\n *\n * @returns A read-only snapshot of the current context\n */\n getContext(): Readonly<Record<string, unknown>> {\n // Return the context chain (parent snapshot + own bindings), NOT including\n // ALS scope (which is transient). This mirrors what dispatchToTransports\n // uses for attributes, but without ALS overlay.\n let merged: Record<string, unknown> = this._parentContextRecord ?? {};\n if (this._bindings && Object.keys(this._bindings).length > 0) {\n merged = { ...merged, ...this._bindings };\n }\n return merged;\n }\n\n /**\n * Updates the default OTel resource (service.name, version, env).\n * Persisted into every emitted record's `resource` field unless the\n * record itself overrides it.\n *\n * @param resource - Partial OTel resource to merge into the current one\n * @returns The same logger instance, for chaining\n *\n * @example\n * logger.setResource({ 'service.name': 'api', 'service.version': '1.2.3' });\n *\n */\n setResource(resource: Partial<ILogResourceRef>): this {\n this.logContext.setResource(resource);\n return this;\n return this;\n }\n\n /**\n * Reinicia el logger a la configuración por defecto\n * \n * @example\n * logger.resetConfig();\n * // Todo vuelve a la configuración inicial\n * \n */\n resetConfig(): void {\n // Clean up theme listener\n if (this.themeChangeListener) {\n this.themeChangeListener();\n this.themeChangeListener = null;\n }\n \n this.config = { ...DEFAULT_CONFIG };\n this.styleManager.resetStyles();\n \n // Re-setup auto theme detection if enabled in default config\n if (this.config.autoDetectTheme) {\n this.setupAutoThemeDetection();\n }\n \n this.success('Logger configuration reset to defaults');\n }\n\n /**\n * Método de limpieza para eliminar listeners y liberar recursos\n * \n * @example\n * // Antes de cerrar la aplicación\n * logger.cleanup();\n * \n */\n /**\n * Tears down every resource held by this Logger. Safe to call multiple\n * times. Fixed in 5.1.0 to fully drain transports + clear timers +\n * drop the legacy handler list + reset group depth + clear context.\n *\n * @example\n * await logger.cleanup(); // before process exit / hot reload\n *\n */\n async cleanup(): Promise<void> {\n if (this.themeChangeListener) {\n try {\n this.themeChangeListener();\n } catch {\n // Listener cleanup is best-effort\n }\n this.themeChangeListener = null;\n }\n\n // Drain transport queue (fixed: was fire-and-forget in 5.0.x — BUG-N14)\n await this.transportBridge.closeTransports();\n\n // Drop legacy handler refs so GC can collect them (BUG-N17)\n this.handlers.length = 0;\n // Reset mutable runtime state\n this.timers.clear();\n this.badgeList = [];\n this.logContext.clearContext();\n this.groupDepth = 0;\n }\n\n\n // ===== SIMPLIFIED API =====\n\n /**\n * Aplica un preset inteligente - funciona perfectamente sin configuración\n * \n * @param {string} name - Nombre del preset a aplicar\n * \n * @example\n * // Presets disponibles\n * logger.preset('default'); // Limpio y adaptativo\n * logger.preset('cyberpunk'); // Colores neón, efectos brillantes\n * logger.preset('glassmorphism'); // Efectos de blur modernos\n * logger.preset('minimal'); // Minimalista y elegante\n * logger.preset('debug'); // Modo desarrollo detallado\n * logger.preset('production'); // Optimizado para producción\n * \n */\n preset(name: string): void {\n if (!hasPreset(name)) {\n this.error(`Unknown preset: ${name}. Available presets:`, getAvailablePresets());\n return;\n }\n\n const presetConfig = getSmartPreset(name);\n if (presetConfig) {\n // Apply the smart preset configuration\n this.displaySettings.showTimestamp = presetConfig.timestamp?.show ?? true;\n this.displaySettings.showLocation = presetConfig.location?.show ?? true;\n\n // Store the preset config for use in createStyledOutput\n this._activePreset = presetConfig;\n this._activePresetName = name;\n\n // Only show success message in browser to avoid verbose terminal logs\n if (getEnvironment() === 'browser') {\n this.success(`Applied preset: ${name}`);\n }\n }\n }\n\n /**\n * Lista todos los presets disponibles\n * \n * @returns {string[]} Array con nombres de presets disponibles\n * \n * @example\n * const disponibles = logger.presets();\n * console.log(disponibles); // ['default', 'cyberpunk', 'glassmorphism', ...]\n * \n */\n presets(): string[] {\n return getAvailablePresets();\n }\n\n // ===== TOGGLE METHODS =====\n\n /**\n * Oculta el timestamp en los logs\n * \n * @example\n * logger.hideTimestamp();\n * logger.info('Sin marca de tiempo'); // Sin timestamp visible\n * \n */\n hideTimestamp(): this {\n this.displaySettings.showTimestamp = false;\n return this;\n }\n\n /**\n * Muestra el timestamp en los logs\n * \n * @example\n * logger.showTimestamp();\n * logger.info('Con marca de tiempo'); // [2024-01-15 10:30:45] Con marca de tiempo\n * \n */\n showTimestamp(): this {\n this.displaySettings.showTimestamp = true;\n return this;\n }\n\n /**\n * Oculta la información de ubicación (archivo:línea) en los logs\n * \n * @example\n * logger.hideLocation();\n * logger.debug('Sin ubicación'); // Sin mostrar archivo:línea\n * \n */\n hideLocation(): this {\n this.displaySettings.showLocation = false;\n return this;\n }\n\n /**\n * Muestra la información de ubicación (archivo:línea) en los logs\n * \n * @example\n * logger.showLocation();\n * logger.debug('Con ubicación'); // app.js:42 Con ubicación\n * \n */\n showLocation(): this {\n this.displaySettings.showLocation = true;\n return this;\n }\n\n /**\n * Oculta los badges en los logs\n * \n * @example\n * logger.hideBadges();\n * const api = logger.api('REST');\n * api.info('Sin badges'); // Sin mostrar [API] [REST]\n * \n */\n hideBadges(): this {\n this.displaySettings.showBadges = false;\n return this;\n }\n\n /**\n * Muestra los badges en los logs\n *\n * @example\n * logger.showBadges();\n * const api = logger.api('GraphQL');\n * api.info('Con badges'); // [API] [GraphQL] Con badges\n *\n */\n showBadges(): this {\n this.displaySettings.showBadges = true;\n return this;\n }\n\n /**\n * Establece múltiples badges para los logs\n *\n * @param {string[]} badges - Array de badges a mostrar\n * @returns {this} Logger instance para encadenamiento\n *\n * @example\n * logger.badges(['v3', 'stable']).info('Release publicado');\n * logger.badges(['API', 'v2']).warn('Endpoint deprecado');\n *\n */\n badges(badges: string[]): this {\n this.badgeList = [...badges];\n return this;\n }\n\n /**\n * Añade un badge individual a la lista\n *\n * @param {string} badge - Badge a añadir\n * @returns {this} Logger instance para encadenamiento\n *\n * @example\n * logger.badge('DEBUG').badge('AUTH').info('Token validado');\n *\n */\n badge(badge: string): this {\n if (!this.badgeList.includes(badge)) {\n this.badgeList.push(badge);\n }\n return this;\n }\n\n /**\n * Limpia todos los badges activos\n *\n * @returns {this} Logger instance para encadenamiento\n *\n * @example\n * logger.clearBadges().info('Sin badges');\n *\n */\n clearBadges(): this {\n this.badgeList = [];\n return this;\n }\n\n // ===== SCOPED LOGGERS =====\n\n component(name: string): ComponentLogger {\n return new ComponentLogger(this, name);\n }\n\n api(name: string): APILogger {\n return new APILogger(this, name);\n }\n\n scope(name: string): ScopedLogger {\n return new ScopedLogger(this, name);\n }\n\n // ===== SIMPLE CUSTOMIZATION =====\n\n /**\n * Personalización simple con configuración mínima\n * \n * @param {Object} overrides - Opciones de personalización\n * @param {Object} overrides.message - Configuración del mensaje\n * @param {Object} overrides.timestamp - Configuración del timestamp\n * @param {Object} overrides.location - Configuración de ubicación\n * @param {Object} overrides.level - Configuración del nivel\n * @param {Object} overrides.prefix - Configuración del prefijo\n * @param {string} overrides.spacing - Espaciado: 'compact' | 'normal' | 'spacious'\n * \n * @example\n * logger.customize({\n * message: { color: '#00ff00', size: '16px' },\n * timestamp: { show: false },\n * spacing: 'compact'\n * });\n * \n */\n customize(overrides: {\n message?: { color?: string; font?: string; size?: string };\n timestamp?: { show?: boolean; color?: string };\n location?: { show?: boolean; color?: string };\n level?: { uppercase?: boolean; style?: string };\n prefix?: { show?: boolean; style?: string };\n spacing?: 'compact' | 'normal' | 'spacious';\n }): void {\n // Apply simple overrides\n if (overrides.timestamp?.show !== undefined) {\n this.displaySettings.showTimestamp = overrides.timestamp.show;\n }\n if (overrides.location?.show !== undefined) {\n this.displaySettings.showLocation = overrides.location.show;\n }\n if (overrides.prefix?.show !== undefined) {\n // Will be handled when we integrate with preset system\n }\n\n // Store customization for use in createStyledOutput\n this._customization = overrides;\n this.success('Customization applied');\n }\n\n // ===== HANDLER MANAGEMENT =====\n\n /**\n * Añade un handler personalizado para extender funcionalidad\n * \n * @param {ILogHandler} handler - Handler que implementa ILogHandler\n *\n * @example\n * // Handler personalizado para enviar logs a servidor\n * logger.addHandler({\n * handle(level, message, args, metadata) {\n * fetch('/logs', { method: 'POST', body: JSON.stringify({ level, message }) });\n * }\n * });\n *\n * @example\n * // Para escribir a archivo, usa `addTransport` con un `FileTransport`\n * logger.addTransport({ target: new FileTransport({ destination: 'app.log' }) });\n *\n */\n addHandler(handler: ILogHandler): void {\n this.handlers.push(handler);\n }\n\n /**\n * Obtiene todos los handlers registrados\n * \n * @returns {ILogHandler[]} Array de handlers activos\n */\n getHandlers(): ILogHandler[] {\n return [...this.handlers];\n }\n\n // ===== SERIALIZERS =====\n\n /**\n * Añade un serializador personalizado para un tipo específico\n *\n * @param type - Constructor del tipo a serializar\n * @param serializer - Función de serialización\n * @param priority - Prioridad (mayor = primero)\n *\n * @example\n * logger.addSerializer(Error, (err) => ({\n * name: err.name,\n * message: err.message,\n * stack: err.stack?.split('\\n').slice(0, 5)\n * }));\n *\n */\n addSerializer<T>(\n type: new (...args: unknown[]) => T,\n serializer: SerializerFn<T>,\n priority?: number\n ): void {\n this.serializerBridge.addSerializer(type, serializer, priority);\n }\n\n /**\n * Elimina un serializador registrado\n *\n * @param type - Constructor del tipo a remover\n * @returns true si se eliminó\n *\n */\n removeSerializer<T>(type: new (...args: unknown[]) => T): boolean {\n return this.serializerBridge.removeSerializer(type);\n }\n\n /**\n * Obtiene el registry de serializadores\n *\n * @returns SerializerRegistry\n */\n getSerializerRegistry(): SerializerRegistry {\n return this.serializerBridge.getSerializerRegistry();\n }\n\n // ===== HOOKS & MIDDLEWARE =====\n\n /**\n * Registra un hook para un evento\n *\n * @param event - Evento: 'beforeLog' | 'afterLog' | 'onError'\n * @param callback - Función a ejecutar\n * @param priority - Prioridad (mayor = primero)\n * @returns Función para desregistrar\n *\n * @example\n * const unsubscribe = logger.on('beforeLog', (entry) => {\n * entry.correlationId = getCorrelationId();\n * return entry;\n * });\n *\n */\n on(event: HookEvent, callback: HookCallback, priority?: number): () => void {\n return this.hookBridge.on(event, callback, priority);\n }\n\n /**\n * Registra un hook que se ejecuta solo una vez\n *\n * @param event - Evento: 'beforeLog' | 'afterLog' | 'onError'\n * @param callback - Función a ejecutar\n * @param priority - Prioridad (mayor = primero)\n * @returns Función para desregistrar\n *\n */\n once(event: HookEvent, callback: HookCallback, priority?: number): () => void {\n return this.hookBridge.once(event, callback, priority);\n }\n\n /**\n * Elimina un hook registrado\n *\n * @param event - Evento del hook\n * @param callback - Callback a remover\n * @returns true si se eliminó\n *\n */\n off(event: HookEvent, callback: HookCallback): boolean {\n return this.hookBridge.off(event, callback);\n }\n\n /**\n * Añade un middleware al pipeline\n *\n * @param middleware - Función middleware\n * @param priority - Prioridad (mayor = primero)\n * @returns Función para desregistrar\n *\n * @example\n * logger.use((entry, next) => {\n * entry.requestId = asyncLocalStorage.getStore()?.requestId;\n * next();\n * });\n *\n */\n use(middleware: MiddlewareFn, priority?: number): () => void {\n return this.hookBridge.use(middleware, priority);\n }\n\n /**\n * Obtiene el HookManager\n *\n * @returns HookManager\n */\n getHookManager(): HookManager {\n return this.hookBridge.getHookManager();\n }\n\n // ===== TRANSPORTS =====\n\n /**\n * Añade un transport para envío de logs\n *\n * @param target - Configuración del transport\n * @returns ID único del transport\n *\n * @example\n * // File transport\n * logger.addTransport({\n * target: 'file',\n * options: { destination: '/var/log/app.log' }\n * });\n *\n * @example\n * // HTTP transport con batching\n * logger.addTransport({\n * target: 'http',\n * options: {\n * url: 'https://logs.example.com',\n * batchSize: 100,\n * flushInterval: 5000\n * },\n * level: 'warn'\n * });\n *\n */\n addTransport(target: TransportTarget): string {\n return this.transportBridge.addTransport(target);\n }\n\n /**\n * Elimina un transport\n *\n * @param id - ID del transport a remover\n * @returns true si se eliminó\n *\n */\n removeTransport(id: string): boolean {\n return this.transportBridge.removeTransport(id);\n }\n\n /**\n * Fuerza el flush de todos los transports\n *\n * @returns Promise que resuelve cuando todos los buffers están vaciados\n *\n */\n async flushTransports(): Promise<void> {\n await this.transportBridge.flushTransports();\n }\n\n /**\n * Cierra todos los transports\n *\n * @returns Promise que resuelve cuando todos están cerrados\n *\n */\n async closeTransports(): Promise<void> {\n await this.transportBridge.closeTransports();\n }\n\n /**\n * Obtiene el TransportManager\n *\n * @returns TransportManager o undefined si no hay transports\n */\n getTransportManager(): TransportManager | undefined {\n return this.transportBridge.getTransportManager();\n }\n\n // ===== CORE LOGGING METHODS =====\n\n /**\n * Verifica si un nivel de log debe mostrarse según la verbosidad actual.\n * @private\n * @param {LogLevel} level - Nivel de log a verificar\n * @returns {boolean} True si debe mostrarse, false si no\n */\n private shouldLog(level: LogLevel): boolean {\n if (this.config.verbosity === 'silent') return false;\n return LOG_LEVELS[level] >= LOG_LEVELS[this.config.verbosity as LogLevel];\n }\n\n /**\n * Builds and dispatches a `TransportRecord` to the {@link TransportManager}\n * (no-op if no transports are registered). Shared by every log path —\n * `log()`, `success()`, and visual methods like `table()` / `group()` /\n * `time()` — so all emissions hit the same transport pipeline.\n *\n * @param level - The canonical log level (trace/debug/info/warn/error/critical)\n * @param message - Final, post-hook message text\n * @param prefix - Effective prefix (global + scope)\n * @param stackInfo - Optional caller location\n * @param extra - Optional fields to merge into the record (e.g. `{ tag: 'success' }`)\n */\n protected _dispatchTag: string | undefined;\n\n /**\n * Computes the fully-merged context for this logger.\n *\n * The context chain is built at child-creation time: each child stores\n * its parent's fully-merged context (at that moment) as _parentContextRecord.\n * This means _parentContextRecord already contains all ancestors' bindings\n * in the correct precedence order (root first, nearest child last).\n *\n * Merge order (later wins):\n * 1. _parentContextRecord — parent's merged context snapshot at creation time\n * 2. _bindings — this logger's own bindings (child() calls)\n * 3. ALS store — withContext/withContextAsync scope (highest priority)\n *\n * @internal\n * @returns The merged context record\n */\n private _getMergedContext(): Record<string, unknown> {\n // Start with parent's snapshot (already contains all ancestors)\n let merged: Record<string, unknown> = this._parentContextRecord ?? {};\n\n // Layer in this logger's own bindings (nearest wins)\n if (this._bindings && Object.keys(this._bindings).length > 0) {\n merged = { ...merged, ...this._bindings };\n }\n\n // Layer in ALS scope (highest priority)\n const alsContext = this.logContext._getAlsStore?.() ?? {};\n if (alsContext && Object.keys(alsContext).length > 0) {\n merged = { ...merged, ...alsContext };\n }\n\n return merged;\n }\n\n /** @internal Exposes base merged context (no ALS) to LogContext child factory closure. */\n _captureMergedContext(): Record<string, unknown> {\n // Return base context without ALS — ALS is transient and should not be\n // baked into _parentContextRecord at child-creation time.\n let merged: Record<string, unknown> = this._parentContextRecord ?? {};\n if (this._bindings && Object.keys(this._bindings).length > 0) {\n merged = { ...merged, ...this._bindings };\n }\n return merged;\n }\n\n protected dispatchToTransports(\n level: LogLevel,\n message: string,\n prefix: string | undefined,\n stackInfo: StackInfo | null,\n extra?: Partial<TransportRecord>\n ): void {\n const record: TransportRecord = {\n level,\n levelValue: LOG_LEVELS[level],\n severityNumber: LOG_LEVEL_TO_SEVERITY_NUMBER[level],\n severityText: LOG_LEVEL_TO_SEVERITY_TEXT[level],\n time: Date.now(),\n msg: message,\n prefix,\n location: stackInfo\n ? {\n file: stackInfo.file,\n line: stackInfo.line,\n column: stackInfo.column,\n function: stackInfo.function\n }\n : undefined,\n attributes: Object.keys(this.logContext._getContextRecord()).length > 0\n ? toLogAttributes(this.logContext._getContextRecord())\n : undefined,\n resource: this.logContext._getResource()\n ? { ...this.logContext._getResource() } as Partial<ITransportLogResource>\n : undefined,\n ...extra\n };\n\n // Fire-and-forget via bridge — never breaks the sync log path.\n this.transportBridge.writeRecord(record);\n }\n\n /**\n * Obtiene el prefijo efectivo (global + scope)\n * @private\n * @returns {string | undefined} Prefijo combinado o undefined\n */\n private getEffectivePrefix(): string | undefined {\n const parts = [this.config.globalPrefix, this.scopedPrefix].filter(Boolean);\n return parts.length > 0 ? parts.join(':') : undefined;\n }\n\n /**\n * Método central de logging. Awaits the `beforeLog` hook pipeline\n * synchronously (so redactions / enrichments are reflected in the\n * emitted message before console + transport dispatch).\n *\n * Fire-and-forget callers (e.g. `logger.info(...)` without `await`)\n * still work — the resulting `Promise<void>` is dropped on the floor.\n * Awaiting is recommended when `beforeLog` hooks mutate `message`\n * (e.g. PII redaction, correlation IDs).\n *\n * @protected\n * @param level - Nivel del log\n * @param args - Argumentos a loggear\n * @returns Promise that resolves once the record has been dispatched\n *\n */\n /**\n * Protected logging method. Awaits the `beforeLog` hook pipeline\n * synchronously (so redactions / enrichments are reflected in the\n * emitted message before console + transport dispatch).\n *\n * Fire-and-forget callers (e.g. `logger.info(...)` without `await`)\n * still work — the resulting `Promise<void>` is dropped on the floor.\n * Awaiting is recommended when `beforeLog` hooks mutate `message`\n * (e.g. PII redaction, correlation IDs).\n *\n * @protected\n * @param level - Nivel del log\n * @param args - Argumentos a loggear\n * @param tag - Optional tag forwarded to `dispatchToTransports` as\n * `TransportRecord.tag` (e.g. `'success'` for success records).\n * @returns Promise that resolves once the record has been dispatched\n *\n */\n protected async log(level: LogLevel, ...args: unknown[]): Promise<void> {\n if (!this.shouldLog(level)) return;\n\n // N2 fix: check _dispatchTag BEFORE processing args so the tag does\n // NOT end up in additionalArgs. success() sets this instead of\n // passing 'success' as an arg.\n const dispatchTag = this._dispatchTag;\n this._dispatchTag = undefined;\n\n const stackInfo = this.config.enableStackTrace ? parseStackTrace() : null;\n const prefix = this.getEffectivePrefix();\n const timestamp = formatTimestamp();\n\n const serializedArgs = args.map(arg => this.serializerBridge.getSerializerRegistry().serialize(arg));\n\n let message = serializedArgs.length > 0 ? String(serializedArgs[0]) : '';\n if (this.badgeList.length > 0 && this.displaySettings.showBadges) {\n const badgePrefix = this.badgeList.map(b => `[${b}]`).join('');\n message = badgePrefix + ' ' + message;\n }\n const additionalArgs = serializedArgs.slice(1);\n\n const hookEntry = {\n level,\n message,\n args: serializedArgs,\n timestamp,\n prefix,\n stackInfo: stackInfo ?? undefined\n };\n\n // Await beforeLog hooks so redactions / enrichments are reflected\n // in the emitted message. Fixed in 5.1.0 (BUG-N / F002).\n let processed;\n try {\n processed = await this.hookBridge.getHookManager().emit('beforeLog', hookEntry);\n } catch (error) {\n // Hook manager already fires onError on its own; fall back to\n // the pre-hook values to keep the log call from breaking.\n // eslint-disable-next-line no-console\n console.error('HookManager beforeLog failed:', error);\n processed = hookEntry;\n }\n message = processed.message;\n\n const [format, ...styles] = createStyledOutput(\n level,\n this.styleManager.getStyles(),\n prefix,\n message,\n this.displaySettings.showLocation ? stackInfo : null,\n this.config.autoDetectTheme,\n this._activePreset as LogStyles | undefined,\n this._activePresetName\n );\n\n const groupIndent = ' '.repeat(this.groupDepth);\n const finalFormat = groupIndent + format;\n\n this.writeOutput(finalFormat, level, styles, additionalArgs);\n\n const metadata: LogMetadata = {\n timestamp,\n level,\n prefix,\n stackInfo: stackInfo ?? undefined\n };\n\n this.handlers.forEach(handler => {\n try {\n handler.handle(level, message, serializedArgs, metadata);\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error('Log handler failed:', error);\n }\n });\n\n // N2 fix: if dispatchTag was set (by success()), dispatch with it.\n if (dispatchTag !== undefined) {\n this.dispatchToTransports(level, message, prefix, stackInfo, { tag: dispatchTag as LogTag });\n } else {\n this.dispatchToTransports(level, message, prefix, stackInfo);\n }\n\n // Fire-and-forget afterLog — after-side mutations don't change the\n // message that's already on screen, so we don't block on it.\n this.hookBridge.getHookManager().emit('afterLog', processed).catch(() => {});\n }\n\n logWithBindings(bindings: Bindings, level: LogLevel, ...args: unknown[]): Promise<void> {\n if (!this.shouldLog(level)) return Promise.resolve();\n\n let prefix = '';\n const colorCapability = getColorCapability();\n\n if (bindings.badges?.length) {\n prefix += bindings.badges.map(b => formatBadge(b, 'pill', colorCapability, '#00ff88')).join(' ') + ' ';\n }\n if (bindings.scope) {\n prefix += formatBadge(bindings.scope, 'pill', colorCapability, '#00ffff') + ' ';\n }\n\n if (prefix && args.length > 0) {\n args[0] = prefix + String(args[0]);\n }\n\n return this.log(level, ...args);\n }\n\n /**\n * Like `logWithBindings()` but sets _dispatchTag first so that\n * `log()` dispatches with the tag. Used by ScopedLogger.success()\n * to propagate tag:'success' through the normal log() pipeline.\n */\n logWithBindingsAndTag(bindings: Bindings, level: LogLevel, tag: LogTag, ...args: unknown[]): Promise<void> {\n this._dispatchTag = tag;\n return this.logWithBindings(bindings, level, ...args);\n }\n\n debug(...args: unknown[]): Promise<void> {\n return this.log('debug', ...args);\n }\n\n /**\n * Registra mensajes informativos. Devuelve `Promise<void>` desde 5.1.0.\n *\n * @param args - Mensajes y datos informativos\n *\n * @example\n * logger.info('Servidor iniciado en puerto 3000');\n * await logger.info('Procesando', totalItems, 'elementos'); // espera hooks\n *\n */\n info(...args: unknown[]): Promise<void> {\n return this.log('info', ...args);\n }\n\n /**\n * Registra mensajes de advertencia. Devuelve `Promise<void>` desde 5.1.0.\n *\n * @param args - Mensajes de advertencia\n *\n */\n warn(...args: unknown[]): Promise<void> {\n return this.log('warn', ...args);\n }\n\n /**\n * Registra mensajes de error. Devuelve `Promise<void>` desde 5.1.0.\n *\n * @param args - Mensaje de error y stack traces\n *\n */\n error(...args: unknown[]): Promise<void> {\n return this.log('error', ...args);\n }\n\n /**\n * Registra mensajes de éxito. Mapeado internamente a nivel `info` con\n * styling de success y `record.tag = 'success'` para que los transports\n * puedan distinguirlo (sin perder info semantics para filtering).\n *\n * @param args - Mensaje + datos adicionales\n *\n * @example\n * logger.success('Base de datos conectada');\n * logger.success('Usuario creado con ID:', userId);\n * logger.success('✓ Tests pasados: 42/42');\n *\n */\n async success(...args: unknown[]): Promise<void> {\n if (!this.shouldLog('info')) return;\n\n const stackInfo = this.config.enableStackTrace ? parseStackTrace() : null;\n const prefix = this.getEffectivePrefix();\n const timestamp = formatTimestamp();\n const serializedArgs = args.map(arg => this.serializerBridge.getSerializerRegistry().serialize(arg));\n let message = serializedArgs.length > 0 ? String(serializedArgs[0]) : '';\n if (this.badgeList.length > 0 && this.displaySettings.showBadges) {\n const badgePrefix = this.badgeList.map(b => `[${b}]`).join('');\n message = badgePrefix + ' ' + message;\n }\n const additionalArgs = serializedArgs.slice(1);\n\n const hookEntry = {\n level: 'info' as LogLevel,\n message,\n args: serializedArgs,\n timestamp,\n prefix,\n stackInfo: stackInfo ?? undefined\n };\n\n // Await beforeLog so redactions propagate (matches log())\n try {\n const processed = await this.hookBridge.getHookManager().emit('beforeLog', hookEntry);\n message = processed.message;\n } catch {\n // Hook manager has already fired onError\n }\n\n const [format, ...styles] = createStyledOutput(\n 'info',\n this.styleManager.getStyles(),\n prefix,\n message,\n this.displaySettings.showLocation ? stackInfo : null,\n this.config.autoDetectTheme,\n this._activePreset as LogStyles | undefined,\n this._activePresetName\n );\n\n const successStyle = this.styleManager.getStyles().success;\n const emoji = successStyle?.emoji ?? '✅';\n const label = successStyle?.label ?? 'SUCCESS';\n const successFormat = format.replace(/ℹ️ INFO/, `${emoji} ${label}`);\n\n const groupIndent = ' '.repeat(this.groupDepth);\n const finalFormat = groupIndent + successFormat;\n\n this.writeOutput(finalFormat, 'info', styles, additionalArgs);\n\n const metadata: LogMetadata = {\n timestamp,\n level: 'info',\n prefix,\n stackInfo: stackInfo ?? undefined\n };\n this.handlers.forEach(handler => {\n try {\n handler.handle('info', message, args, metadata);\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error('Log handler failed:', error);\n }\n });\n\n // N2 fix: set _dispatchTag so log() dispatches with the tag.\n // 'success' is NOT passed as an arg (avoids it appearing in additionalArgs).\n this._dispatchTag = 'success';\n await this.log('info', ...args);\n\n this.hookBridge.getHookManager().emit('afterLog', hookEntry).catch(() => {});\n }\n\n /**\n * Registra información de trace (nivel más bajo, debajo de debug).\n * Alineado con OpenTelemetry `TRACE` severity (1-4).\n *\n * @param args - Datos muy verbosos (entrada/salida de funciones, valores intermedios)\n *\n * @example\n * logger.trace('Entrando en función processData');\n * logger.trace('Variables intermedias:', { a, b, c });\n *\n */\n trace(...args: unknown[]): void {\n this.log('trace', ...args);\n }\n\n /**\n * Registra errores críticos (prioridad más alta). Devuelve `Promise<void>` desde 5.1.0.\n *\n * @param args - Errores críticos del sistema\n *\n * @example\n * await logger.critical('Sistema caído - reinicio inmediato requerido');\n *\n */\n critical(...args: unknown[]): Promise<void> {\n return this.log('critical', ...args);\n }\n\n // ===== ADVANCED LOGGING FEATURES =====\n\n /**\n * Muestra datos en formato de tabla. Pasa por la pipeline completa\n * (outputMode-respecting writeOutput + transports + hooks).\n *\n * @param data - Array de objetos o matriz\n * @param columns - Columnas específicas a mostrar (opcional)\n *\n * @example\n * logger.table([{ id: 1, nombre: 'Juan' }, { id: 2, nombre: 'María' }]);\n *\n */\n table(data: unknown, columns?: string[]): void {\n if (!this.shouldLog('info')) return;\n const prefix = this.getEffectivePrefix();\n const tableStyle = StylePresets.accent().build();\n\n const headerLabel = `📊 TABLE${prefix ? ` [${prefix}]` : ''}`;\n const format = `%c${headerLabel}`;\n const styles = [tableStyle];\n\n // Emit header via centralised writer\n this.writeOutput(format, 'info', styles, []);\n\n // console.table doesn't honour outputMode — but we still want the\n // data to flow through to transports. Solution: serialise the data\n // as the second argument so transports observe a structured payload.\n const additionalArgs = [data, ...(columns ? [columns] : [])];\n if (this.config.outputMode !== 'silent') {\n if (columns) {\n console.table(data, columns);\n } else {\n console.table(data);\n }\n }\n\n const message = `table:${Array.isArray(data) ? `${data.length} rows` : 'data'}`;\n const stackInfo = this.config.enableStackTrace ? parseStackTrace() : null;\n this.dispatchToTransports('info', message, prefix, stackInfo, {\n attributes: {\n ...this.logContext._getContextRecord(),\n 'logger.visual': 'table',\n 'logger.data': JSON.stringify(data).slice(0, 4096),\n ...(columns ? { 'logger.columns': columns.join(',') } : {})\n }\n });\n }\n\n /**\n * Inicia un grupo colapsable en la consola. Emite un marker a\n * transports con `attributes.logger.visual = 'groupStart'` para que\n * backends puedan reconstruir la jerarquía.\n *\n * @param label - Etiqueta del grupo\n * @param collapsed - Si el grupo inicia colapsado (default: false)\n *\n * @example\n * logger.group('Procesando usuarios');\n * logger.info('Usuario 1 procesado');\n * logger.groupEnd();\n *\n */\n group(label: string, collapsed: boolean = false): void {\n const groupStyle = new StyleBuilder()\n .bg('linear-gradient(135deg, #e3f2fd 0%, #bbdefb 100%)')\n .color('#1565c0')\n .border('1px solid #90caf9')\n .padding('4px 12px')\n .rounded('6px')\n .bold()\n .build();\n\n const format = `%c📁 ${label}`;\n\n if (this.config.outputMode !== 'silent') {\n if (collapsed) {\n console.groupCollapsed(format, groupStyle);\n } else {\n console.group(format, groupStyle);\n }\n }\n\n this.groupDepth++;\n\n // Emit a synthetic info record marking the group boundary\n const prefix = this.getEffectivePrefix();\n const stackInfo = this.config.enableStackTrace ? parseStackTrace() : null;\n this.dispatchToTransports('info', `group:start:${label}`, prefix, stackInfo, {\n attributes: {\n ...this.logContext._getContextRecord(),\n 'logger.visual': 'groupStart',\n 'logger.group.label': label,\n 'logger.group.collapsed': collapsed,\n 'logger.group.depth': this.groupDepth\n }\n });\n }\n\n /**\n * Finaliza el grupo actual de la consola. Emite un marker a transports\n * simétrico al `group()` start, para que backends puedan cerrar la\n * jerarquía correctamente.\n *\n * @example\n * logger.group('Operaciones');\n * logger.info('Operación 1');\n * logger.groupEnd();\n *\n */\n groupEnd(): void {\n if (this.groupDepth > 0) {\n this.groupDepth--;\n if (this.config.outputMode !== 'silent') {\n console.groupEnd();\n }\n const prefix = this.getEffectivePrefix();\n const stackInfo = this.config.enableStackTrace ? parseStackTrace() : null;\n this.dispatchToTransports('info', 'group:end', prefix, stackInfo, {\n attributes: {\n ...this.logContext._getContextRecord(),\n 'logger.visual': 'groupEnd',\n 'logger.group.depth': this.groupDepth\n }\n });\n }\n }\n\n // ===== PERFORMANCE TIMING =====\n\n /**\n * Inicia un temporizador con la etiqueta dada\n * \n * @param {string} label - Etiqueta identificadora del temporizador\n * \n * @example\n * logger.time('proceso-datos');\n * // ... operación costosa ...\n * logger.timeEnd('proceso-datos'); // ⏱️ Timer ended: proceso-datos - 1523.45ms\n * \n */\n time(label: string): void {\n const timer: TimerEntry = {\n label,\n startTime: (typeof performance !== 'undefined' ? performance : Date).now()\n };\n this.timers.set(label, timer);\n\n const timerStyle = StylePresets.warning().build();\n const format = `%c⏱️ Timer started: ${label}`;\n this.writeOutput(format, 'debug', [timerStyle], []);\n }\n\n /**\n * Finaliza un temporizador y muestra el tiempo transcurrido\n *\n * @param {string} label - Etiqueta del temporizador a finalizar\n * @returns {number} Elapsed milliseconds, or -1 if timer not found\n *\n * @example\n * logger.time('consulta-db');\n * await consultarBaseDatos();\n * const elapsed = logger.timeEnd('consulta-db'); // ⏱️ Timer ended: consulta-db - 234.56ms\n *\n */\n timeEnd(label: string): number {\n const timer = this.timers.get(label);\n if (!timer) {\n this.warn(`Timer '${label}' does not exist`);\n return -1;\n }\n\n const now = (typeof performance !== 'undefined' ? performance : Date).now();\n const elapsed = now - timer.startTime;\n this.timers.delete(label);\n\n const timerStyle = StylePresets.success().build();\n const format = `%c⏱️ Timer ended: ${label} - ${elapsed.toFixed(2)}ms`;\n this.writeOutput(format, 'info', [timerStyle], []);\n\n const prefix = this.getEffectivePrefix();\n const stackInfo = this.config.enableStackTrace ? parseStackTrace() : null;\n this.dispatchToTransports('info', `timer:${label}`, prefix, stackInfo, {\n tag: 'success',\n attributes: {\n ...this.logContext._getContextRecord(),\n 'logger.visual': 'timer',\n 'logger.timer.label': label,\n 'logger.timer.elapsedMs': elapsed\n }\n });\n\n return elapsed;\n }\n\n // ===== ADVANCED VISUAL FEATURES =====\n\n /**\n * Muestra un banner con el tipo especificado o configurado\n * \n * @param {BannerType} bannerType - Tipo de banner (opcional)\n * \n * @example\n * logger.showBanner('ascii'); // Banner ASCII art\n * logger.showBanner('unicode'); // Banner con caracteres Unicode\n * logger.showBanner('svg'); // Banner con gráfico SVG\n * logger.showBanner(); // Usa el tipo configurado\n * \n */\n showBanner(bannerType?: BannerType): void {\n const effectiveBannerType = bannerType ? bannerType : this.config.bannerType;\n displayInitBanner(effectiveBannerType);\n }\n\n /**\n * Registra mensaje con imagen SVG de fondo\n * \n * @param {string} message - Mensaje a mostrar\n * @param {string} svgContent - Contenido SVG personalizado (opcional)\n * @param {StyleOptions} options - Opciones de estilo (ancho, alto, padding)\n * \n * @example\n * // SVG automático con gradiente\n * logger.logWithSVG('🎆 Bienvenido a Better Logger');\n * \n * @example\n * // SVG personalizado\n * const customSVG = '<svg>...</svg>';\n * logger.logWithSVG('Logo', customSVG, { width: 400, height: 100 });\n * \n */\n logWithSVG(message: string, svgContent?: string, options: StyleOptions = {}): void {\n if (!this.shouldLog('info')) return;\n const { width = 300, height = 60, padding = '30px 150px' } = options;\n\n let svgDataUri = '';\n if (svgContent) {\n const encodedSVG = encodeURIComponent(svgContent);\n svgDataUri = `data:image/svg+xml,${encodedSVG}`;\n } else {\n const defaultSVG = `<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 ${width} ${height}'><defs><linearGradient id='grad' x1='0%' y1='0%' x2='100%' y2='0%'><stop offset='0%' style='stop-color:%23667eea'/><stop offset='100%' style='stop-color:%23764ba2'/></linearGradient></defs><rect width='100%' height='100%' fill='url(%23grad)' rx='4'/><text x='${width/2}' y='${height/2 + 5}' text-anchor='middle' fill='white' font-family='monospace' font-size='14' font-weight='bold'>${message}</text></svg>`;\n svgDataUri = `data:image/svg+xml,${encodeURIComponent(defaultSVG)}`;\n }\n\n const svgStyle = new StyleBuilder()\n .bg(`url(\"${svgDataUri}\") no-repeat center center`)\n .padding(padding)\n .color('transparent')\n .rounded('4px')\n .build();\n\n this.writeOutput(`%c${message}`, 'info', [svgStyle], []);\n\n const prefix = this.getEffectivePrefix();\n const stackInfo = this.config.enableStackTrace ? parseStackTrace() : null;\n this.dispatchToTransports('info', `svg:${message}`, prefix, stackInfo, {\n attributes: {\n ...this.logContext._getContextRecord(),\n 'logger.visual': 'svg',\n 'logger.svg.width': width,\n 'logger.svg.height': height\n }\n });\n }\n\n /**\n * Registra mensaje con gradiente animado de fondo\n * \n * @param {string} message - Mensaje a animar\n * @param {number} duration - Duración de la animación en segundos (default: 3)\n * \n * @example\n * logger.logAnimated('🌈 Animación en progreso');\n * logger.logAnimated('Cargando...', 5); // Animación de 5 segundos\n * \n */\n logAnimated(message: string, duration: number = 3): void {\n if (!this.shouldLog('info')) return;\n\n // DOM-guard: animations only make sense in a real browser environment.\n if (typeof document !== 'undefined') {\n if (!document.getElementById('logger-animations')) {\n const style = document.createElement('style');\n style.id = 'logger-animations';\n style.textContent = `\n @keyframes loggerGradient {\n 0% { background-position: 0% 50%; }\n 50% { background-position: 100% 50%; }\n 100% { background-position: 0% 50%; }\n }\n `;\n document.head.appendChild(style);\n }\n }\n\n const animatedStyle = new StyleBuilder()\n .bg('linear-gradient(-45deg, #667eea, #764ba2, #667eea, #764ba2)')\n .css('background-size', '400% 400%')\n .color('#ffffff')\n .padding('12px 20px')\n .rounded('8px')\n .bold()\n .font('Monaco, Consolas, monospace')\n .animation(`loggerGradient ${duration}s ease infinite`)\n .display('inline-block')\n .build();\n\n this.writeOutput(`%c${message}`, 'info', [animatedStyle], []);\n\n const prefix = this.getEffectivePrefix();\n const stackInfo = this.config.enableStackTrace ? parseStackTrace() : null;\n this.dispatchToTransports('info', `animated:${message}`, prefix, stackInfo, {\n attributes: {\n ...this.logContext._getContextRecord(),\n 'logger.visual': 'animated',\n 'logger.animation.durationSec': duration\n }\n });\n }\n\n // ===== CLI PRIMITIVES (v5.0) =====\n\n /**\n * Displays a step progress indicator in the terminal\n *\n * @param {number} current - Current step number\n * @param {number} total - Total number of steps\n * @param {string} message - Step description\n *\n * @example\n * logger.step(1, 5, 'Analyzing repository...');\n * logger.step(2, 5, 'Generating commit message...');\n *\n */\n step(current: number, total: number, message: string): void {\n this.terminalBridge.step(current, total, message);\n }\n\n /**\n * Displays a styled header with optional subtitle\n *\n * @param {string} title - Main title text\n * @param {string} subtitle - Optional subtitle (rendered dimmed)\n *\n * @example\n * logger.header('Commit Wizard', 'v2.0.0');\n *\n */\n header(title: string, subtitle?: string): void {\n this.terminalBridge.header(title, subtitle);\n }\n\n /**\n * Displays a horizontal divider line\n *\n * @example\n * logger.divider();\n *\n */\n divider(): void {\n this.terminalBridge.divider();\n }\n\n /**\n * Outputs a blank line\n *\n * @example\n * logger.blank();\n *\n */\n blank(): void {\n this.terminalBridge.blank();\n }\n\n /**\n * Renders content inside a bordered box\n *\n * @param {string} content - Content string (may contain newlines)\n * @param {IBoxOptions} options - Box rendering options\n *\n * @example\n * logger.box('3 commits generated\\nProvider: Groq', { title: 'Done', borderColor: '#00ff00' });\n *\n */\n box(content: string, options?: IBoxOptions): void {\n this.terminalBridge.box(content, options);\n }\n\n /**\n * Renders an array of objects as a formatted ASCII table.\n * Note: This is distinct from the existing table() method which uses console.table.\n *\n * @param {Record<string, unknown>[]} rows - Array of row objects\n * @param {ITableOptions} options - Table rendering options\n *\n * @example\n * logger.cliTable([\n * { provider: 'Groq', status: 'Available', model: 'llama-3.3-70b' },\n * { provider: 'Gemini', status: 'Configured', model: 'gemini-2.5-flash' },\n * ]);\n *\n */\n cliTable(rows: Record<string, unknown>[], options?: ITableOptions): void {\n this.terminalBridge.cliTable(rows, options);\n }\n\n /**\n * Creates a spinner handle for showing progress during async operations.\n * Returns a NoopSpinner in non-TTY environments.\n *\n * @param {string} message - Initial spinner text\n * @returns {ISpinnerHandle} Spinner controller\n *\n * @example\n * const s = logger.spinner('Analyzing repository...');\n * s.start();\n * await analyzeRepo();\n * s.succeed('Analysis complete (1.2s)');\n *\n */\n spinner(message: string): ISpinnerHandle {\n return this.terminalBridge.spinner(message);\n }\n\n /**\n * Sets the CLI verbosity level, controlling both log verbosity and primitive visibility\n *\n * @param {CLILogLevel} level - CLI log level\n *\n * @example\n * logger.setCLILevel('quiet'); // Only errors, no CLI primitives\n * logger.setCLILevel('verbose'); // Debug logs + all CLI primitives\n *\n */\n setCLILevel(level: CLILogLevel): void {\n const mapping = CLI_LEVEL_MAP[level];\n this.setVerbosity(mapping.verbosity);\n this.terminalBridge.setShowPrimitives(mapping.showPrimitives);\n this.config.cliLevel = level;\n }\n\n /**\n * Returns the current CLI log level\n * @returns {CLILogLevel} Current CLI log level\n */\n get cliLevel(): CLILogLevel {\n return this.config.cliLevel ?? 'normal';\n }\n\n // ===== OUTPUT WRITER SYSTEM =====\n\n /**\n * Writes formatted output to the configured destination.\n * Respects outputMode configuration for console, silent, or custom output.\n *\n * @private\n * @param {string} message - Formatted log message\n * @param {LogLevel} level - Log level\n * @param {string[]} styles - CSS styles for browser console\n * @param {unknown[]} additionalArgs - Additional arguments to log\n */\n private writeOutput(\n message: string,\n level: LogLevel,\n styles: string[],\n additionalArgs: unknown[]\n ): void {\n const mode = this.config.outputMode ?? 'console';\n\n // Silent mode: no output\n if (mode === 'silent') {\n return;\n }\n\n // Custom mode: use configured writer\n if (mode === 'custom' && this.config.outputWriter) {\n const fullMessage = additionalArgs.length > 0\n ? `${message} ${additionalArgs.map(a => String(a)).join(' ')}`\n : message;\n this.config.outputWriter.write(fullMessage, level, styles);\n return;\n }\n\n // Default: console output\n if (additionalArgs.length > 0) {\n console.log(message, ...styles, ...additionalArgs);\n } else {\n console.log(message, ...styles);\n }\n }\n\n // ===== CLI SYSTEM =====\n\n /**\n * Procesador de comandos CLI para configuración y exportación del logger\n * \n * @param {string} command - Comando CLI a ejecutar\n * @returns {Promise<void>}\n * \n * @example\n * // Comandos disponibles\n * await logger.cli('export json'); // Exporta logs en JSON\n * await logger.cli('export csv'); // Exporta logs en CSV\n * await logger.cli('theme list'); // Lista temas disponibles\n * await logger.cli('theme set neon'); // Cambia al tema neon\n * await logger.cli('config show'); // Muestra configuración actual\n * await logger.cli('history clear'); // Limpia historial de logs\n * await logger.cli('status'); // Muestra estado del logger\n * await logger.cli('help'); // Muestra ayuda de comandos\n * \n */\n async cli(command: string): Promise<void> {\n if (!this.cliProcessor) {\n this.error('CLI processor not initialized');\n return;\n }\n\n await this.cliProcessor.processCommand(command, this);\n }\n}\n\n/**\n /**\n * Lazy singleton instance — initialised on first call to {@link getDefaultLogger},\n * not on module import. Fixes BUG-N11 (eager side-effect at import time).\n *\n * @private\n */\nlet _defaultLogger: Logger | null = null;\n\n/**\n * Lazily creates the default Logger singleton.\n *\n * The singleton is only built on first call, so importing the module\n * never executes `new Logger(...)` or `displayInitBanner()`. This keeps\n * module imports side-effect free.\n *\n * @returns The shared Logger instance\n */\nfunction getDefaultLogger(): Logger {\n if (!_defaultLogger) {\n _defaultLogger = new Logger({\n verbosity: 'info',\n enableColors: true,\n enableTimestamps: true,\n enableStackTrace: true,\n cliLevel: 'normal'\n });\n\n // Display the init banner only on first actual use, not on import.\n try {\n if (typeof window !== 'undefined' || typeof document !== 'undefined') {\n displayInitBanner();\n }\n } catch {\n // Silent fail if banner cannot be displayed (SSR, workers, etc.)\n }\n }\n return _defaultLogger;\n}\n\n/**\n * Resets the default singleton. Clears the cached instance so the next call\n * to `getDefaultLogger()` rebuilds it from defaults. Useful for tests and\n * hot reload scenarios.\n *\n */\nexport function resetDefaultLogger(): void {\n if (_defaultLogger) {\n // Best-effort cleanup; the user may already have a reference and\n // intentionally want to drain pending logs.\n void _defaultLogger.cleanup().catch(() => {});\n }\n _defaultLogger = null;\n}\n\n/**\n * Lazy default export — every property access defers to `getDefaultLogger()`.\n * Side-effect-free at module import (BUG-N11).\n *\n * @example\n * import logger from 'better-logger';\n * logger.info('hello'); // first call here triggers singleton init\n */\nconst loggerProxy: Logger = new Proxy({} as Logger, {\n get(_target, prop, receiver) {\n const instance = getDefaultLogger();\n const value = Reflect.get(instance, prop, receiver);\n return typeof value === 'function' ? value.bind(instance) : value;\n }\n});\n\nexport default loggerProxy;\n\n// ===== Internal converters =====\n\n/**\n * Narrow a free-form `Record<string, unknown>` context into a typed\n * `ILogAttributes` bag. Unknown shapes fall back to JSON-encoded strings,\n * which keeps the OTLP transport happy (every value lands in a typed slot).\n *\n * @param input - The user-supplied context (typically `Logger.context`).\n * @returns A new attribute bag matching `ILogAttributes`.\n */\nfunction toLogAttributes(input: Record<string, unknown>): ILogAttributes {\n const out: Record<string, LogAttributeValue> = {};\n for (const [key, value] of Object.entries(input)) {\n const mapped = toAttributeValue(value);\n if (mapped !== undefined) {\n out[key] = mapped;\n }\n }\n return out;\n}\n\nfunction toAttributeValue(value: unknown): LogAttributeValue | undefined {\n if (value === null || value === undefined) return undefined;\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n return value;\n }\n if (Array.isArray(value)) {\n const values: LogAttributeValue[] = [];\n for (const item of value) {\n const mapped = toAttributeValue(item);\n if (mapped !== undefined) values.push(mapped);\n }\n return values;\n }\n // Plain objects → JSON string fallback (OTLP transport handles this)\n try {\n return JSON.stringify(value);\n } catch {\n return undefined;\n }\n}\n\n/**\n * Métodos individuales exportados para conveniencia\n * @description Todos los métodos están correctamente enlazados al singleton lazy\n */\nexport const debug = (...args: unknown[]) => getDefaultLogger().debug(...args);\nexport const info = (...args: unknown[]) => getDefaultLogger().info(...args);\nexport const warn = (...args: unknown[]) => getDefaultLogger().warn(...args);\nexport const error = (...args: unknown[]) => getDefaultLogger().error(...args);\nexport const success = (...args: unknown[]) => getDefaultLogger().success(...args);\nexport const trace = (...args: unknown[]) => getDefaultLogger().trace(...args);\nexport const critical = (...args: unknown[]) => getDefaultLogger().critical(...args);\nexport const table = (data: unknown, columns?: string[]) => getDefaultLogger().table(data, columns);\nexport const group = (label: string, collapsed?: boolean) => getDefaultLogger().group(label, collapsed);\nexport const groupEnd = () => getDefaultLogger().groupEnd();\nexport const time = (label: string) => getDefaultLogger().time(label);\nexport const timeEnd = (label: string) => getDefaultLogger().timeEnd(label);\nexport const setGlobalPrefix = (prefix: string) => getDefaultLogger().setGlobalPrefix(prefix);\nexport const setVerbosity = (level: Verbosity) => getDefaultLogger().setVerbosity(level);\nexport const addHandler = (handler: ILogHandler) => getDefaultLogger().addHandler(handler);\nexport const setTheme = (theme: ThemeVariant) => getDefaultLogger().setTheme(theme);\nexport const setBannerType = (bannerType: BannerType) => getDefaultLogger().setBannerType(bannerType);\nexport const showBanner = (bannerType?: BannerType) => getDefaultLogger().showBanner(bannerType);\nexport const logWithSVG = (message: string, svgContent?: string, options?: StyleOptions) =>\n getDefaultLogger().logWithSVG(message, svgContent, options);\nexport const logAnimated = (message: string, duration?: number) =>\n getDefaultLogger().logAnimated(message, duration);\nexport const cli = (command: string) => getDefaultLogger().cli(command);\nexport const cleanup = () => getDefaultLogger().cleanup();\n\n// Simplified API exports\nexport const preset = (name: string) => getDefaultLogger().preset(name);\nexport const presets = () => getDefaultLogger().presets();\nexport const hideTimestamp = () => getDefaultLogger().hideTimestamp();\nexport const showTimestamp = () => getDefaultLogger().showTimestamp();\nexport const hideLocation = () => getDefaultLogger().hideLocation();\nexport const showLocation = () => getDefaultLogger().showLocation();\nexport const hideBadges = () => getDefaultLogger().hideBadges();\nexport const showBadges = () => getDefaultLogger().showBadges();\nexport const badges = (badgeList: string[]) => getDefaultLogger().badges(badgeList);\nexport const badge = (badgeName: string) => getDefaultLogger().badge(badgeName);\nexport const clearBadges = () => getDefaultLogger().clearBadges();\nexport const component = (name: string) => getDefaultLogger().component(name);\nexport const api = (name: string) => getDefaultLogger().api(name);\nexport const scope = (name: string) => getDefaultLogger().scope(name);\nexport const customize = (overrides: Parameters<Logger['customize']>[0]) => getDefaultLogger().customize(overrides);\n\n// Enterprise features exports\nexport const addSerializer = <T>(\n type: new (...args: unknown[]) => T,\n serializer: SerializerFn<T>,\n priority?: number\n) => getDefaultLogger().addSerializer(type, serializer, priority);\nexport const removeSerializer = <T>(type: new (...args: unknown[]) => T) =>\n getDefaultLogger().removeSerializer(type);\nexport const on = (event: HookEvent, callback: HookCallback, priority?: number) =>\n getDefaultLogger().on(event, callback, priority);\nexport const once = (event: HookEvent, callback: HookCallback, priority?: number) =>\n getDefaultLogger().once(event, callback, priority);\nexport const off = (event: HookEvent, callback: HookCallback) =>\n getDefaultLogger().off(event, callback);\nexport const use = (middleware: MiddlewareFn, priority?: number) =>\n getDefaultLogger().use(middleware, priority);\nexport const addTransport = (target: TransportTarget) =>\n getDefaultLogger().addTransport(target);\nexport const removeTransport = (id: string) =>\n getDefaultLogger().removeTransport(id);\nexport const flushTransports = () =>\n getDefaultLogger().flushTransports();\nexport const closeTransports = () =>\n getDefaultLogger().closeTransports();\n\n// Re-export utilities\nexport { StyleBuilder, StylePresets as Styles } from './styling/index.js';\n\n// Re-export enterprise features\nexport { SerializerRegistry } from './serializers/index.js';\nexport { HookManager } from './hooks/index.js';\nexport { TransportManager, ConsoleTransport, FileTransport, HttpTransport } from './transports/index.js';\n","/**\n * @fileoverview Better Logger — default entry point.\n *\n * Re-exports `Logger`, the scoped loggers, subpath-style bridges, and\n * cross-runtime styling/utility helpers. Side-effect free at import.\n */\n\n// Main Logger class with all features\nimport { Logger } from './Logger.js';\nimport type {\n LogLevel,\n Verbosity,\n ThemeVariant,\n BannerType,\n StyleOptions,\n ILogHandler,\n CLILogLevel,\n IBoxOptions,\n ITableOptions,\n} from './types/index.js';\n\n// Lazy singleton - se inicializa solo cuando se necesita\nlet _logger: Logger | null = null;\n\nfunction getLogger(): Logger {\n if (!_logger) {\n _logger = new Logger();\n }\n return _logger;\n}\n\n/**\n * Main `Logger` class — orchestrator for styling, transports, hooks,\n * serializers, MDC, and CLI primitives. Construct directly or use the\n * default singleton below.\n */\nexport { Logger };\n\n/**\n * Default Logger singleton (lazy). Use this for the common case.\n */\nexport default getLogger();\n\n/**\n * Top-level log methods bound to the default singleton.\n */\nexport const debug = (...args: unknown[]) => getLogger().debug(...args);\nexport const info = (...args: unknown[]) => getLogger().info(...args);\nexport const warn = (...args: unknown[]) => getLogger().warn(...args);\nexport const error = (...args: unknown[]) => getLogger().error(...args);\nexport const success = (...args: unknown[]) => getLogger().success(...args);\nexport const critical = (...args: unknown[]) => getLogger().critical(...args);\nexport const trace = (...args: unknown[]) => getLogger().trace(...args);\nexport const table = (data: unknown, columns?: string[]) => getLogger().table(data, columns);\nexport const group = (label: string, collapsed?: boolean) => getLogger().group(label, collapsed);\nexport const groupEnd = () => getLogger().groupEnd();\nexport const time = (label: string) => getLogger().time(label);\nexport const timeEnd = (label: string) => getLogger().timeEnd(label);\nexport const setGlobalPrefix = (prefix: string) => getLogger().setGlobalPrefix(prefix);\nexport const scope = (name: string) => getLogger().scope(name);\nexport const component = (name: string) => getLogger().component(name);\nexport const api = (name: string) => getLogger().api(name);\nexport const badges = (badgeList: string[]) => getLogger().badges(badgeList);\nexport const badge = (badgeName: string) => getLogger().badge(badgeName);\nexport const clearBadges = () => getLogger().clearBadges();\nexport const setVerbosity = (level: Verbosity) => getLogger().setVerbosity(level);\nexport const addHandler = (handler: ILogHandler) => getLogger().addHandler(handler);\nexport const setTheme = (theme: ThemeVariant) => getLogger().setTheme(theme);\nexport const setBannerType = (bannerType: BannerType) => getLogger().setBannerType(bannerType);\nexport const showBanner = (bannerType?: BannerType) => getLogger().showBanner(bannerType);\nexport const logWithSVG = (message: string, svgContent?: string, options?: StyleOptions) =>\n getLogger().logWithSVG(message, svgContent, options);\nexport const logAnimated = (message: string, duration?: number) =>\n getLogger().logAnimated(message, duration);\nexport const cli = (command: string) => getLogger().cli(command);\n\n// Type exports\nexport type {\n LogLevel,\n Verbosity,\n ThemeVariant,\n BannerType,\n StyleOptions,\n ILogHandler,\n LoggerConfig,\n LogMetadata,\n StackInfo,\n TimerEntry,\n TimerResult,\n OutputFormat,\n IScopedLogger,\n IAPILogger,\n IComponentLogger,\n Bindings,\n SerializerFn,\n SerializerContext,\n SerializerConfig,\n ISerializerRegistry,\n HookLogEntry,\n HookEvent,\n HookCallback,\n MiddlewareFn,\n IHookManager,\n TransportRecord,\n TransportOptions,\n TransportTarget,\n ITransport,\n TimestampFormat,\n ColumnAlign,\n ColumnConfig,\n LogOptions,\n CLILogLevel,\n ISpinnerHandle,\n IBoxOptions,\n ITableOptions,\n} from './types/index.js';\n\n// Styling utilities\nexport {\n StyleBuilder,\n StylePresets,\n THEME_PRESETS,\n THEME_BANNERS,\n BANNER_VARIANTS\n} from './styling/index.js';\n\n// Enterprise features — convenience wrappers bound to the singleton.\nimport type { SerializerFn, HookEvent, HookCallback, MiddlewareFn, TransportTarget } from './types/index.js';\nexport const addSerializer = <T>(\n type: new (...args: unknown[]) => T,\n serializer: SerializerFn<T>,\n priority?: number\n) => getLogger().addSerializer(type, serializer, priority);\nexport const removeSerializer = <T>(type: new (...args: unknown[]) => T) =>\n getLogger().removeSerializer(type);\nexport const on = (event: HookEvent, callback: HookCallback, priority?: number) =>\n getLogger().on(event, callback, priority);\nexport const once = (event: HookEvent, callback: HookCallback, priority?: number) =>\n getLogger().once(event, callback, priority);\nexport const off = (event: HookEvent, callback: HookCallback) =>\n getLogger().off(event, callback);\nexport const use = (middleware: MiddlewareFn, priority?: number) =>\n getLogger().use(middleware, priority);\nexport const addTransport = (target: TransportTarget) =>\n getLogger().addTransport(target);\nexport const removeTransport = (id: string) =>\n getLogger().removeTransport(id);\nexport const flushTransports = () =>\n getLogger().flushTransports();\nexport const closeTransports = () =>\n getLogger().closeTransports();\n\n// Scoped loggers\nexport {\n ScopedLogger,\n APILogger,\n ComponentLogger,\n ContextLogger\n} from './ScopedLogger.js';\n\n// Constants\nexport { DEFAULT_CONFIG } from './constants.js';\n\n// Utility exports\nexport {\n parseStackTrace,\n formatTimestamp,\n getConsoleMethod,\n createLogEntry,\n formatTablePlain,\n safeSerialize\n} from './utils/index.js';\n\n// ANSI color utilities\nexport {\n ansiStyle,\n ansiColor,\n ansiBackground,\n ansiBold,\n ansiDim,\n ansiUnderline,\n formatLogLevelANSI,\n formatSuccessANSI\n} from './utils/ansi-colors.js';\n\n// Environment detection\nexport {\n getEnvironment,\n isRunningInTerminal,\n supportsANSI,\n getColorCapability,\n getTerminalWidth,\n getTerminalHeight,\n getEnvironmentInfo,\n} from './utils/environment-detector.js';\n\nexport type { Environment } from './utils/environment-detector.js';\n"],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
/**
|
|
3
|
+
* @fileoverview Entry point for ./node subpath.
|
|
4
|
+
*
|
|
5
|
+
* Reserved namespace for Node-only utilities. Use the main entry (`@mks2508/better-logger`)
|
|
6
|
+
* for cross-runtime APIs. This subpath exists so future Node-only features
|
|
7
|
+
* (file-based log capture, fs-backed rotation, etc.) can land here without
|
|
8
|
+
* polluting the default bundle.
|
|
9
|
+
*/
|
|
10
|
+
//# sourceMappingURL=node-module.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-module.d.ts","sourceRoot":"","sources":["../src/node-module.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG"}
|
package/dist/node.cjs
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
//#region src/node-module.ts
|
|
3
|
+
/**
|
|
4
|
+
* @fileoverview Entry point for ./node subpath.
|
|
5
|
+
*
|
|
6
|
+
* Reserved namespace for Node-only utilities. Use the main entry (`@mks2508/better-logger`)
|
|
7
|
+
* for cross-runtime APIs. This subpath exists so future Node-only features
|
|
8
|
+
* (file-based log capture, fs-backed rotation, etc.) can land here without
|
|
9
|
+
* polluting the default bundle.
|
|
10
|
+
*/
|
|
11
|
+
//#endregion
|
|
12
|
+
|
|
13
|
+
//# sourceMappingURL=node.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node.cjs","names":[],"sources":["../src/node-module.ts"],"sourcesContent":["/**\n * @fileoverview Entry point for ./node subpath.\n *\n * Reserved namespace for Node-only utilities. Use the main entry (`@mks2508/better-logger`)\n * for cross-runtime APIs. This subpath exists so future Node-only features\n * (file-based log capture, fs-backed rotation, etc.) can land here without\n * polluting the default bundle.\n */\n"],"mappings":""}
|
package/dist/node.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
//#region src/node-module.ts
|
|
2
|
+
/**
|
|
3
|
+
* @fileoverview Entry point for ./node subpath.
|
|
4
|
+
*
|
|
5
|
+
* Reserved namespace for Node-only utilities. Use the main entry (`@mks2508/better-logger`)
|
|
6
|
+
* for cross-runtime APIs. This subpath exists so future Node-only features
|
|
7
|
+
* (file-based log capture, fs-backed rotation, etc.) can land here without
|
|
8
|
+
* polluting the default bundle.
|
|
9
|
+
*/
|
|
10
|
+
//#endregion
|
|
11
|
+
|
|
12
|
+
//# sourceMappingURL=node.js.map
|
package/dist/node.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node.js","names":[],"sources":["../src/node-module.ts"],"sourcesContent":["/**\n * @fileoverview Entry point for ./node subpath.\n *\n * Reserved namespace for Node-only utilities. Use the main entry (`@mks2508/better-logger`)\n * for cross-runtime APIs. This subpath exists so future Node-only features\n * (file-based log capture, fs-backed rotation, etc.) can land here without\n * polluting the default bundle.\n */\n"],"mappings":""}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview TerminalBridge — CLI terminal integration.
|
|
3
|
+
* Encapsulates TTY detection, CLI primitive rendering, and server-mode
|
|
4
|
+
* fallback for non-TTY environments.
|
|
5
|
+
*/
|
|
6
|
+
import type { ISpinnerHandle, IBoxOptions, ITableOptions } from '../types/index.js';
|
|
7
|
+
import { ServerFallback } from '../playground/server-fallback.js';
|
|
8
|
+
import type { LoggerConfig } from '../types/index.js';
|
|
9
|
+
import type { Logger } from '../Logger.js';
|
|
10
|
+
/**
|
|
11
|
+
* Bridge for CLI terminal operations.
|
|
12
|
+
*/
|
|
13
|
+
export interface TerminalBridge {
|
|
14
|
+
/** Displays a step progress indicator. */
|
|
15
|
+
step(current: number, total: number, message: string): void;
|
|
16
|
+
/** Displays a styled header. */
|
|
17
|
+
header(title: string, subtitle?: string): void;
|
|
18
|
+
/** Displays a horizontal divider. */
|
|
19
|
+
divider(): void;
|
|
20
|
+
/** Outputs a blank line. */
|
|
21
|
+
blank(): void;
|
|
22
|
+
/** Renders content inside a bordered box. */
|
|
23
|
+
box(content: string, options?: IBoxOptions): void;
|
|
24
|
+
/** Renders an array of objects as an ASCII table. */
|
|
25
|
+
cliTable(rows: Record<string, unknown>[], options?: ITableOptions): void;
|
|
26
|
+
/** Creates a spinner handle. */
|
|
27
|
+
spinner(message: string): ISpinnerHandle;
|
|
28
|
+
/** Whether CLI primitives should be shown. */
|
|
29
|
+
getShowPrimitives(): boolean;
|
|
30
|
+
/** Sets whether CLI primitives should be shown. */
|
|
31
|
+
setShowPrimitives(show: boolean): void;
|
|
32
|
+
/** Returns the server fallback instance (lazy). */
|
|
33
|
+
getServerFallback(): ServerFallback;
|
|
34
|
+
/** Returns true if running in a TTY. */
|
|
35
|
+
isInTerminal(): boolean;
|
|
36
|
+
}
|
|
37
|
+
interface ITerminalBridgeCtorOptions {
|
|
38
|
+
config: LoggerConfig;
|
|
39
|
+
getLogger: () => Logger;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Creates a TerminalBridge using a getter to avoid circular reference at construction.
|
|
43
|
+
*/
|
|
44
|
+
export declare function createTerminalBridge(options: ITerminalBridgeCtorOptions): TerminalBridge;
|
|
45
|
+
export {};
|
|
46
|
+
//# sourceMappingURL=TerminalBridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TerminalBridge.d.ts","sourceRoot":"","sources":["../../src/playground/TerminalBridge.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAe,cAAc,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAOjG,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAElE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C;;GAEG;AACH,MAAM,WAAW,cAAc;IAC3B,0CAA0C;IAC1C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5D,gCAAgC;IAChC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/C,qCAAqC;IACrC,OAAO,IAAI,IAAI,CAAC;IAChB,4BAA4B;IAC5B,KAAK,IAAI,IAAI,CAAC;IACd,6CAA6C;IAC7C,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IAClD,qDAAqD;IACrD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;IACzE,gCAAgC;IAChC,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,CAAC;IACzC,8CAA8C;IAC9C,iBAAiB,IAAI,OAAO,CAAC;IAC7B,mDAAmD;IACnD,iBAAiB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IACvC,mDAAmD;IACnD,iBAAiB,IAAI,cAAc,CAAC;IACpC,wCAAwC;IACxC,YAAY,IAAI,OAAO,CAAC;CAC3B;AAED,UAAU,0BAA0B;IAChC,MAAM,EAAE,YAAY,CAAC;IACrB,SAAS,EAAE,MAAM,MAAM,CAAC;CAC3B;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,0BAA0B,GAAG,cAAc,CA8FxF"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Box renderer for CLI primitives
|
|
3
|
+
*/
|
|
4
|
+
import type { IBoxOptions } from '../types/core.js';
|
|
5
|
+
import type { ColorCapability } from '../terminal/color-converter.js';
|
|
6
|
+
/**
|
|
7
|
+
* Renders content inside a bordered box
|
|
8
|
+
* @param content - Content string (may contain newlines)
|
|
9
|
+
* @param options - Box rendering options
|
|
10
|
+
* @param colorCap - Terminal color capability
|
|
11
|
+
* @returns Formatted box string with border
|
|
12
|
+
*/
|
|
13
|
+
export declare function renderBox(content: string, options?: IBoxOptions, colorCap?: ColorCapability): string;
|
|
14
|
+
//# sourceMappingURL=box.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"box.d.ts","sourceRoot":"","sources":["../../src/playground/box.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAetE;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,EAAE,QAAQ,GAAE,eAAwB,GAAG,MAAM,CAyDhH"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview CLI table renderer for CLI primitives
|
|
3
|
+
*/
|
|
4
|
+
import type { ITableOptions } from '../types/core.js';
|
|
5
|
+
import type { ColorCapability } from '../terminal/color-converter.js';
|
|
6
|
+
/**
|
|
7
|
+
* Renders an array of objects as a formatted ASCII table
|
|
8
|
+
* @param rows - Array of row objects
|
|
9
|
+
* @param options - Table rendering options
|
|
10
|
+
* @param colorCap - Terminal color capability
|
|
11
|
+
* @returns Formatted table string
|
|
12
|
+
*/
|
|
13
|
+
export declare function renderTable(rows: Record<string, unknown>[], options?: ITableOptions, colorCap?: ColorCapability): string;
|
|
14
|
+
//# sourceMappingURL=cli-table.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-table.d.ts","sourceRoot":"","sources":["../../src/playground/cli-table.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAItE;;;;;;GAMG;AACH,wBAAgB,WAAW,CACvB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAC/B,OAAO,GAAE,aAAkB,EAC3B,QAAQ,GAAE,eAAwB,GACnC,MAAM,CAwCR"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Divider renderer for CLI primitives
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Renders a horizontal divider line
|
|
6
|
+
* @param width - Optional explicit width (defaults to terminal width capped at 60)
|
|
7
|
+
* @returns Formatted divider string
|
|
8
|
+
*/
|
|
9
|
+
export declare function renderDivider(width?: number): string;
|
|
10
|
+
//# sourceMappingURL=divider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"divider.d.ts","sourceRoot":"","sources":["../../src/playground/divider.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAGpD"}
|