@mks2508/better-logger 0.0.2-alpha.2 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/settings.local.json +18 -2
- package/.github/workflows/ci-quality.yml +357 -0
- package/.github/workflows/docs-demo.yml +119 -0
- package/.github/workflows/releases-core.yml +512 -0
- package/.github/workflows/releases-full.yml +582 -0
- package/.github/{workflows → workflows-backup}/ci.yml +12 -110
- package/.github/workflows-backup/nightly.yml +196 -0
- package/.github/workflows-backup/release-optimized.yml +373 -0
- package/.release-notes-0.2.0.md +129 -0
- package/.yamllint +28 -0
- package/CHANGELOG.json +783 -0
- package/CLAUDE.md +92 -1
- package/README.md +198 -490
- package/bun.lock +323 -0
- package/demo.html +9 -2
- package/dist/.tsbuildinfo +1 -0
- package/dist/Logger.d.ts +272 -0
- package/dist/Logger.d.ts.map +1 -0
- package/dist/Logger.js +680 -0
- package/dist/ScopedLogger.d.ts +126 -0
- package/dist/ScopedLogger.d.ts.map +1 -0
- package/dist/ScopedLogger.js +234 -0
- package/dist/chunks/Logger-BpeuYIxR.js +2 -0
- package/dist/chunks/Logger-BpeuYIxR.js.map +1 -0
- package/dist/chunks/Logger-Didxtr23.js +3275 -0
- package/dist/chunks/Logger-Didxtr23.js.map +1 -0
- package/dist/chunks/RemoteLogHandler-CjWpWZGl.js +33 -0
- package/dist/chunks/RemoteLogHandler-CjWpWZGl.js.map +1 -0
- package/dist/chunks/RemoteLogHandler-ymkQ97xl.js +2 -0
- package/dist/chunks/RemoteLogHandler-ymkQ97xl.js.map +1 -0
- package/dist/chunks/environment-Bxbnw4pd.js +544 -0
- package/dist/chunks/environment-Bxbnw4pd.js.map +1 -0
- package/dist/chunks/environment-Dm66zOML.js +4 -0
- package/dist/chunks/environment-Dm66zOML.js.map +1 -0
- package/dist/chunks/formatting-C0riPC5_.js +95 -0
- package/dist/chunks/formatting-C0riPC5_.js.map +1 -0
- package/dist/chunks/formatting-DNCAV66-.js +2 -0
- package/dist/chunks/formatting-DNCAV66-.js.map +1 -0
- package/dist/cli/CommandProcessor.d.ts +103 -0
- package/dist/cli/CommandProcessor.d.ts.map +1 -0
- package/dist/cli/CommandProcessor.js +184 -0
- package/dist/cli/commands/ConfigCommand.d.ts +17 -0
- package/dist/cli/commands/ConfigCommand.d.ts.map +1 -0
- package/dist/cli/commands/ConfigCommand.js +88 -0
- package/dist/cli/commands/ExportCommand.d.ts +51 -0
- package/dist/cli/commands/ExportCommand.d.ts.map +1 -0
- package/dist/cli/commands/ExportCommand.js +243 -0
- package/dist/cli/commands/HistoryCommand.d.ts +50 -0
- package/dist/cli/commands/HistoryCommand.d.ts.map +1 -0
- package/dist/cli/commands/HistoryCommand.js +96 -0
- package/dist/cli/commands/StatusCommand.d.ts +33 -0
- package/dist/cli/commands/StatusCommand.d.ts.map +1 -0
- package/dist/cli/commands/StatusCommand.js +93 -0
- package/dist/cli/commands/ThemeCommand.d.ts +33 -0
- package/dist/cli/commands/ThemeCommand.d.ts.map +1 -0
- package/dist/cli/commands/ThemeCommand.js +79 -0
- package/dist/cli/help.d.ts +15 -0
- package/dist/cli/help.d.ts.map +1 -0
- package/dist/cli/help.js +118 -0
- package/dist/cli/index.d.ts +15 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +46 -0
- package/dist/constants.d.ts +122 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +159 -0
- package/dist/core.cjs +1 -1
- package/dist/core.cjs.map +1 -1
- package/dist/core.d.ts +134 -0
- package/dist/core.d.ts.map +1 -0
- package/dist/core.js +315 -242
- package/dist/core.js.map +1 -1
- package/dist/example.d.ts +18 -0
- package/dist/example.d.ts.map +1 -0
- package/dist/example.js +154 -0
- package/dist/exports-module.d.ts +203 -0
- package/dist/exports-module.d.ts.map +1 -0
- package/dist/exports-module.js +260 -0
- package/dist/exports.cjs +1 -1
- package/dist/exports.cjs.map +1 -1
- package/dist/exports.js +5 -4
- package/dist/exports.js.map +1 -1
- package/dist/handlers/AnalyticsLogHandler.d.ts +11 -0
- package/dist/handlers/AnalyticsLogHandler.d.ts.map +1 -0
- package/dist/handlers/AnalyticsLogHandler.js +19 -0
- package/dist/handlers/ExportLogHandler.d.ts +103 -0
- package/dist/handlers/ExportLogHandler.d.ts.map +1 -0
- package/dist/handlers/ExportLogHandler.js +516 -0
- package/dist/handlers/FileLogHandler.d.ts +36 -0
- package/dist/handlers/FileLogHandler.d.ts.map +1 -0
- package/dist/handlers/FileLogHandler.js +156 -0
- package/dist/handlers/RemoteLogHandler.d.ts +14 -0
- package/dist/handlers/RemoteLogHandler.d.ts.map +1 -0
- package/dist/handlers/RemoteLogHandler.js +37 -0
- package/dist/handlers/index.d.ts +8 -0
- package/dist/handlers/index.d.ts.map +1 -0
- package/dist/handlers/index.js +7 -0
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +86 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +89 -103
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts +2 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +139 -0
- package/dist/styling/LogStyleBuilder.d.ts +149 -0
- package/dist/styling/LogStyleBuilder.d.ts.map +1 -0
- package/dist/styling/LogStyleBuilder.js +289 -0
- package/dist/styling/SemanticStyles.d.ts +181 -0
- package/dist/styling/SemanticStyles.d.ts.map +1 -0
- package/dist/styling/SemanticStyles.js +339 -0
- package/dist/styling/SmartPresets.d.ts +25 -0
- package/dist/styling/SmartPresets.d.ts.map +1 -0
- package/dist/styling/SmartPresets.js +276 -0
- package/dist/styling/StyleBuilder.d.ts +140 -0
- package/dist/styling/StyleBuilder.d.ts.map +1 -0
- package/dist/styling/StyleBuilder.js +280 -0
- package/dist/styling/banners.d.ts +45 -0
- package/dist/styling/banners.d.ts.map +1 -0
- package/dist/styling/banners.js +155 -0
- package/dist/styling/index.d.ts +10 -0
- package/dist/styling/index.d.ts.map +1 -0
- package/dist/styling/index.js +9 -0
- package/dist/styling/themes.d.ts +10 -0
- package/dist/styling/themes.d.ts.map +1 -0
- package/dist/styling/themes.js +231 -0
- package/dist/styling-module.d.ts +185 -0
- package/dist/styling-module.d.ts.map +1 -0
- package/dist/styling-module.js +199 -0
- package/dist/styling.cjs +1 -1
- package/dist/styling.cjs.map +1 -1
- package/dist/styling.js +6 -6
- package/dist/styling.js.map +1 -1
- package/dist/types/Logger.d.ts +268 -0
- package/dist/types/Logger.d.ts.map +1 -0
- package/dist/types/ScopedLogger.d.ts +123 -0
- package/dist/types/ScopedLogger.d.ts.map +1 -0
- package/dist/types/cli/CommandProcessor.d.ts +100 -0
- package/dist/types/cli/CommandProcessor.d.ts.map +1 -0
- package/dist/types/cli/commands/ConfigCommand.d.ts +14 -0
- package/dist/types/cli/commands/ConfigCommand.d.ts.map +1 -0
- package/dist/types/cli/commands/ExportCommand.d.ts +48 -0
- package/dist/types/cli/commands/ExportCommand.d.ts.map +1 -0
- package/dist/types/cli/commands/HistoryCommand.d.ts +47 -0
- package/dist/types/cli/commands/HistoryCommand.d.ts.map +1 -0
- package/dist/types/cli/commands/StatusCommand.d.ts +30 -0
- package/dist/types/cli/commands/StatusCommand.d.ts.map +1 -0
- package/dist/types/cli/commands/ThemeCommand.d.ts +30 -0
- package/dist/types/cli/commands/ThemeCommand.d.ts.map +1 -0
- package/dist/types/cli/help.d.ts +12 -0
- package/dist/types/cli/help.d.ts.map +1 -0
- package/dist/types/cli/index.d.ts +15 -0
- package/dist/types/cli/index.d.ts.map +1 -0
- package/dist/types/constants.d.ts +119 -0
- package/dist/types/constants.d.ts.map +1 -0
- package/dist/types/core.d.ts +125 -211
- package/dist/types/core.d.ts.map +1 -0
- package/dist/types/core.js +13 -0
- package/dist/types/example.d.ts +18 -0
- package/dist/types/example.d.ts.map +1 -0
- package/dist/types/exports-module.d.ts +196 -0
- package/dist/types/exports-module.d.ts.map +1 -0
- package/dist/types/handlers/AnalyticsLogHandler.d.ts +8 -0
- package/dist/types/handlers/AnalyticsLogHandler.d.ts.map +1 -0
- package/dist/types/handlers/ExportLogHandler.d.ts +100 -0
- package/dist/types/handlers/ExportLogHandler.d.ts.map +1 -0
- package/dist/types/handlers/FileLogHandler.d.ts +33 -0
- package/dist/types/handlers/FileLogHandler.d.ts.map +1 -0
- package/dist/types/handlers/RemoteLogHandler.d.ts +11 -0
- package/dist/types/handlers/RemoteLogHandler.d.ts.map +1 -0
- package/dist/types/handlers/index.d.ts +8 -0
- package/dist/types/handlers/index.d.ts.map +1 -0
- package/dist/types/handlers.d.ts +88 -0
- package/dist/types/handlers.d.ts.map +1 -0
- package/dist/types/handlers.js +4 -0
- package/dist/types/index.d.ts +7 -675
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +4 -0
- package/dist/types/main.d.ts +2 -0
- package/dist/types/main.d.ts.map +1 -0
- package/dist/types/styling/LogStyleBuilder.d.ts +146 -0
- package/dist/types/styling/LogStyleBuilder.d.ts.map +1 -0
- package/dist/types/styling/SemanticStyles.d.ts +178 -0
- package/dist/types/styling/SemanticStyles.d.ts.map +1 -0
- package/dist/types/styling/SmartPresets.d.ts +22 -0
- package/dist/types/styling/SmartPresets.d.ts.map +1 -0
- package/dist/types/styling/StyleBuilder.d.ts +140 -0
- package/dist/types/styling/StyleBuilder.d.ts.map +1 -0
- package/dist/types/styling/banners.d.ts +42 -0
- package/dist/types/styling/banners.d.ts.map +1 -0
- package/dist/types/styling/index.d.ts +10 -0
- package/dist/types/styling/index.d.ts.map +1 -0
- package/dist/types/styling/themes.d.ts +7 -0
- package/dist/types/styling/themes.d.ts.map +1 -0
- package/dist/types/styling-module.d.ts +178 -0
- package/dist/types/styling-module.d.ts.map +1 -0
- package/dist/types/types/core.d.ts +125 -0
- package/dist/types/types/core.d.ts.map +1 -0
- package/dist/types/types/handlers.d.ts +85 -0
- package/dist/types/types/handlers.d.ts.map +1 -0
- package/dist/types/types/index.d.ts +7 -0
- package/dist/types/types/index.d.ts.map +1 -0
- package/dist/types/utils/environment.d.ts +47 -0
- package/dist/types/utils/environment.d.ts.map +1 -0
- package/dist/types/utils/formatting.d.ts +37 -0
- package/dist/types/utils/formatting.d.ts.map +1 -0
- package/dist/types/utils/index.d.ts +7 -0
- package/dist/types/utils/index.d.ts.map +1 -0
- package/dist/types/utils/opentui-detection.d.ts +34 -0
- package/dist/types/utils/opentui-detection.d.ts.map +1 -0
- package/dist/types/utils/output.d.ts +41 -0
- package/dist/types/utils/output.d.ts.map +1 -0
- package/dist/types/utils/stackTrace.d.ts +6 -0
- package/dist/types/utils/stackTrace.d.ts.map +1 -0
- package/dist/types/utils/timestamps.d.ts +20 -0
- package/dist/types/utils/timestamps.d.ts.map +1 -0
- package/dist/utils/environment.d.ts +47 -0
- package/dist/utils/environment.d.ts.map +1 -0
- package/dist/utils/environment.js +85 -0
- package/dist/utils/formatting.d.ts +40 -0
- package/dist/utils/formatting.d.ts.map +1 -0
- package/dist/utils/formatting.js +117 -0
- package/dist/utils/index.d.ts +7 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +6 -0
- package/dist/utils/opentui-detection.d.ts +34 -0
- package/dist/utils/opentui-detection.d.ts.map +1 -0
- package/dist/utils/opentui-detection.js +116 -0
- package/dist/utils/output.d.ts +44 -0
- package/dist/utils/output.d.ts.map +1 -0
- package/dist/utils/output.js +150 -0
- package/dist/utils/stackTrace.d.ts +9 -0
- package/dist/utils/stackTrace.d.ts.map +1 -0
- package/dist/utils/stackTrace.js +81 -0
- package/dist/utils/timestamps.d.ts +20 -0
- package/dist/utils/timestamps.d.ts.map +1 -0
- package/dist/utils/timestamps.js +71 -0
- package/docs/API.md +691 -0
- package/docs/CORE.md +10 -10
- package/docs/DEVELOPMENT.md +731 -0
- package/docs/PACKAGES.md +244 -0
- package/docs/_config.yml +36 -0
- package/docs/index.md +179 -0
- package/examples/README.md +208 -0
- package/examples/basic-logging.js +75 -0
- package/examples/data-export.js +234 -0
- package/examples/package.json +16 -0
- package/examples/performance-timing.js +170 -0
- package/examples/simplified-api.js +124 -0
- package/examples/styling-themes.js +207 -0
- package/package.json +37 -21
- package/packages/core/package.json +57 -0
- package/packages/exports/package.json +41 -0
- package/packages/nodejs-opentui/README.md +232 -0
- package/packages/nodejs-opentui/package.json +72 -0
- package/packages/nodejs-opentui/src/LogRenderer.ts +171 -0
- package/packages/nodejs-opentui/src/OpenTUILogHandler.ts +178 -0
- package/packages/nodejs-opentui/src/components/LogBadge.tsx +131 -0
- package/packages/nodejs-opentui/src/index.ts +133 -0
- package/packages/nodejs-opentui/src/types.ts +158 -0
- package/packages/nodejs-opentui/tsconfig.json +20 -0
- package/packages/styling/package.json +41 -0
- package/project-utils/README.md +172 -0
- package/project-utils/auto-release-gemini.ts +1193 -0
- package/project-utils/auto-release-ui.ts +1329 -0
- package/project-utils/commit-generator.ts +1385 -0
- package/project-utils/commit-ui.ts +264 -0
- package/project-utils/git-utils.ts +199 -0
- package/project-utils/github-release-manager.ts +466 -0
- package/project-utils/project-config.ts +260 -0
- package/project-utils/prompt-templates.js +345 -0
- package/project-utils/prompt-templates.ts +422 -0
- package/project-utils/version-manager.ts +1078 -0
- package/src/Logger.ts +251 -16
- package/src/ScopedLogger.ts +262 -0
- package/src/cli/CommandProcessor.ts +173 -2
- package/src/cli/commands/HistoryCommand.ts +117 -0
- package/src/cli/index.ts +12 -0
- package/src/constants.ts +84 -2
- package/src/core.ts +119 -46
- package/src/example.ts +4 -4
- package/src/exports-module.ts +1 -1
- package/src/handlers/ExportLogHandler.ts +141 -0
- package/src/handlers/FileLogHandler.ts +144 -5
- package/src/index.ts +1 -1
- package/src/main.ts +3 -3
- package/src/styling/LogStyleBuilder.ts +355 -0
- package/src/styling/SemanticStyles.ts +380 -0
- package/src/styling/SmartPresets.ts +288 -0
- package/src/styling/StyleBuilder.ts +14 -0
- package/src/styling/index.ts +16 -1
- package/src/styling-module.ts +1 -1
- package/src/types/core.ts +60 -0
- package/src/types/index.ts +6 -0
- package/src/utils/environment.ts +94 -0
- package/src/utils/formatting.ts +142 -0
- package/src/utils/index.ts +3 -0
- package/src/utils/opentui-detection.ts +138 -0
- package/src/utils/output.ts +66 -8
- package/test-core-browser.html +237 -0
- package/test-core-node.js +63 -0
- package/tests/test-conflict-resolution.ts +391 -0
- package/tests/validate-workflows.sh +131 -0
- package/tests/yaml-autofix.sh +146 -0
- package/vite.config.ts +189 -50
- package/.npmrc.bak +0 -1
- package/dist/chunks/Logger-BQhMKy_T.js +0 -2
- package/dist/chunks/Logger-BQhMKy_T.js.map +0 -1
- package/dist/chunks/Logger-BrFKFZcD.js +0 -978
- package/dist/chunks/Logger-BrFKFZcD.js.map +0 -1
- package/dist/chunks/core-2opW4Pi3.js +0 -194
- package/dist/chunks/core-2opW4Pi3.js.map +0 -1
- package/dist/chunks/core-DyugwSYZ.js +0 -4
- package/dist/chunks/core-DyugwSYZ.js.map +0 -1
- package/dist/chunks/exports-BNP3R7dp.js +0 -421
- package/dist/chunks/exports-BNP3R7dp.js.map +0 -1
- package/dist/chunks/exports-U1xLBXrY.js +0 -2
- package/dist/chunks/exports-U1xLBXrY.js.map +0 -1
- package/dist/chunks/styling-DhUDzwlE.js +0 -654
- package/dist/chunks/styling-DhUDzwlE.js.map +0 -1
- package/dist/chunks/styling-tmRDI28D.js +0 -2
- package/dist/chunks/styling-tmRDI28D.js.map +0 -1
- package/dist/types/exports.d.ts +0 -600
- package/dist/types/styling.d.ts +0 -751
- package/src/Logger.ts.backup +0 -1684
- /package/.github/{workflows → workflows-backup}/release.yml +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"environment-Dm66zOML.js","sources":["../../src/constants.ts","../../src/utils/timestamps.ts","../../src/styling/StyleBuilder.ts","../../src/utils/output.ts","../../src/utils/environment.ts","../../src/utils/stackTrace.ts"],"sourcesContent":["/**\n * @fileoverview Global constants for Advanced Logger\n */\n\nimport type { LogLevel, AdaptiveColors } from './types/index.js';\nimport type { LevelStyleConfig } from './utils/index.js';\n\n/**\n * Default configuration values\n */\nexport const DEFAULT_CONFIG = {\n verbosity: 'info' as const,\n enableColors: true,\n enableTimestamps: true,\n enableStackTrace: true,\n theme: 'default' as const,\n bannerType: 'simple' as const,\n bufferSize: 1000,\n autoDetectTheme: true,\n} as const;\n\n/**\n * Basic level styles for core module (minimal CSS styling)\n */\nexport const LEVEL_STYLES: Record<LogLevel | 'success', LevelStyleConfig> = {\n debug: {\n emoji: '🔍',\n label: 'DEBUG',\n background: 'linear-gradient(90deg, #6c757d, #495057)',\n color: '#ffffff',\n border: '1px solid #6c757d',\n shadow: '0 2px 4px rgba(108, 117, 125, 0.3)'\n },\n info: {\n emoji: 'ℹ️',\n label: 'INFO',\n background: 'linear-gradient(90deg, #007bff, #0056b3)',\n color: '#ffffff',\n border: '1px solid #007bff',\n shadow: '0 2px 4px rgba(0, 123, 255, 0.3)'\n },\n warn: {\n emoji: '⚠️',\n label: 'WARN',\n background: 'linear-gradient(90deg, #ffc107, #e0a800)',\n color: '#000000',\n border: '1px solid #ffc107',\n shadow: '0 2px 4px rgba(255, 193, 7, 0.3)'\n },\n error: {\n emoji: '❌',\n label: 'ERROR',\n background: 'linear-gradient(90deg, #dc3545, #c82333)',\n color: '#ffffff',\n border: '1px solid #dc3545',\n shadow: '0 2px 4px rgba(220, 53, 69, 0.3)'\n },\n critical: {\n emoji: '🚨',\n label: 'CRITICAL',\n background: 'linear-gradient(90deg, #8B0000, #FF0000)',\n color: '#ffffff',\n border: '2px solid #FF0000',\n shadow: '0 4px 8px rgba(255, 0, 0, 0.4)'\n },\n success: {\n emoji: '✅',\n label: 'SUCCESS',\n background: 'linear-gradient(90deg, #28a745, #1e7e34)',\n color: '#ffffff',\n border: '1px solid #28a745',\n shadow: '0 2px 4px rgba(40, 167, 69, 0.3)'\n }\n} as const;\n\n/**\n * Maximum allowed buffer sizes for performance\n */\nexport const BUFFER_LIMITS = {\n MIN_SIZE: 50,\n DEFAULT_SIZE: 1000,\n MAX_SIZE: 10000,\n} as const;\n\n/**\n * Export format definitions with extensions\n */\nexport const EXPORT_FORMATS = {\n json: { extension: '.json', mimeType: 'application/json' },\n csv: { extension: '.csv', mimeType: 'text/csv' },\n markdown: { extension: '.md', mimeType: 'text/markdown' },\n plain: { extension: '.txt', mimeType: 'text/plain' },\n html: { extension: '.html', mimeType: 'text/html' },\n} as const;\n\n/**\n * CLI command definitions\n */\nexport const CLI_COMMANDS = {\n config: 'config',\n help: 'help',\n themes: 'themes',\n banners: 'banners',\n banner: 'banner',\n status: 'status',\n reset: 'reset',\n demo: 'demo',\n export: 'export',\n copy: 'copy',\n 'buffer-size': 'buffer-size',\n 'clear-buffer': 'clear-buffer',\n 'buffer-info': 'buffer-info',\n} as const;\n\n/**\n * Time parsing constants for relative time filters\n */\nexport const TIME_UNITS = {\n ms: 1,\n s: 1000,\n m: 60 * 1000,\n h: 60 * 60 * 1000,\n d: 24 * 60 * 60 * 1000,\n} as const;\n\n/**\n * Default styling values\n */\nexport const STYLE_DEFAULTS = {\n FONT_FAMILY: 'Monaco, Consolas, monospace',\n FONT_SIZE: '12px',\n BORDER_RADIUS: '4px',\n PADDING: '4px 8px',\n} as const;\n\n/**\n * Level priority mapping for filtering\n */\nexport const LEVEL_PRIORITIES: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n critical: 4,\n} as const;\n\n/**\n * Adaptive color configurations for DevTools theme compatibility\n */\nexport const ADAPTIVE_COLORS = {\n timestamp: {\n light: '#666666',\n dark: '#a0a0a0',\n },\n messageText: {\n light: '#2d3748',\n dark: '#f7fafc',\n },\n prefix: {\n light: '#2d3748',\n dark: '#e2e8f0',\n },\n prefixBackground: {\n light: '#2d3748',\n dark: '#4a5568',\n },\n location: {\n light: '#718096',\n dark: '#a0aec0',\n },\n} as const satisfies Record<string, AdaptiveColors>;","/**\n * @fileoverview Timestamp utilities for Advanced Logger\n */\n\nimport { TIME_UNITS } from '../constants.js';\n\n/**\n * Formats the timestamp using modern Date API\n */\nexport function formatTimestamp(): string {\n try {\n // Use modern Temporal API if available, fallback to Date\n const now = new Date();\n return now.toISOString();\n } catch {\n return new Date().toISOString();\n }\n}\n\n/**\n * Parse relative time strings like \"2h\", \"30m\", \"1d\" into milliseconds\n */\nexport function parseRelativeTime(timeStr: string): number {\n const match = timeStr.match(/^(\\d+)(ms|s|m|h|d)$/);\n if (!match) {\n throw new Error(`Invalid time format: ${timeStr}. Use format like \"2h\", \"30m\", \"1d\"`);\n }\n\n const [, amount, unit] = match;\n const multiplier = TIME_UNITS[unit as keyof typeof TIME_UNITS];\n \n return parseInt(amount || '0', 10) * multiplier;\n}\n\n/**\n * Parse time input which can be Date, ISO string, or relative time\n */\nexport function parseTimeInput(input: Date | string | number): Date {\n if (input instanceof Date) {\n return input;\n }\n\n if (typeof input === 'number') {\n // Assume hours ago\n return new Date(Date.now() - input * TIME_UNITS.h);\n }\n\n if (typeof input === 'string') {\n // Try parsing as ISO date first\n const isoDate = new Date(input);\n if (!isNaN(isoDate.getTime())) {\n return isoDate;\n }\n\n // Try parsing as relative time\n try {\n const ms = parseRelativeTime(input);\n return new Date(Date.now() - ms);\n } catch {\n throw new Error(`Invalid time format: ${input}`);\n }\n }\n\n throw new Error(`Unsupported time input type: ${typeof input}`);\n}\n\n/**\n * Format timestamp for display in different contexts\n */\nexport function formatDisplayTime(date: Date, format: 'short' | 'full' | 'time-only' = 'short'): string {\n switch (format) {\n case 'time-only':\n return date.toTimeString().slice(0, 8); // HH:MM:SS\n case 'full':\n return date.toISOString();\n case 'short':\n default:\n return date.toISOString().slice(11, 23); // HH:MM:SS.mmm\n }\n}","/**\n * @fileoverview StyleBuilder class for Advanced Logger\n */\n\n/**\n * Utility class for creating dynamic console styles with method chaining\n */\nexport class StyleBuilder {\n private styles: string[] = [];\n\n constructor(baseStyle = '') {\n if (baseStyle) this.styles.push(baseStyle);\n }\n\n /**\n * Add background color or gradient\n */\n bg(background: string): StyleBuilder {\n this.styles.push(`background: ${background}`);\n return this;\n }\n\n /**\n * Add text color\n */\n color(color: string): StyleBuilder {\n this.styles.push(`color: ${color}`);\n return this;\n }\n\n /**\n * Add border styling\n */\n border(border: string): StyleBuilder {\n this.styles.push(`border: ${border}`);\n return this;\n }\n\n /**\n * Add box shadow\n */\n shadow(shadow: string): StyleBuilder {\n this.styles.push(`box-shadow: ${shadow}`);\n return this;\n }\n\n /**\n * Add padding\n */\n padding(padding: string): StyleBuilder {\n this.styles.push(`padding: ${padding}`);\n return this;\n }\n\n /**\n * Add margin\n */\n margin(margin: string): StyleBuilder {\n this.styles.push(`margin: ${margin}`);\n return this;\n }\n\n /**\n * Add border radius\n */\n rounded(radius: string = '4px'): StyleBuilder {\n this.styles.push(`border-radius: ${radius}`);\n return this;\n }\n\n /**\n * Add font weight\n */\n bold(): StyleBuilder {\n this.styles.push('font-weight: bold');\n return this;\n }\n\n /**\n * Add font styling\n */\n font(font: string): StyleBuilder {\n this.styles.push(`font-family: ${font}`);\n return this;\n }\n\n /**\n * Set monospace font family (alias for common monospace fonts)\n */\n mono(): StyleBuilder {\n return this.font('Monaco, Consolas, \"Courier New\", monospace');\n }\n\n /**\n * Set system font family (alias for system fonts)\n */\n system(): StyleBuilder {\n return this.font('system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif');\n }\n\n /**\n * Add font size\n */\n size(size: string): StyleBuilder {\n this.styles.push(`font-size: ${size}`);\n return this;\n }\n\n /**\n * Add line height\n */\n lineHeight(height: string): StyleBuilder {\n this.styles.push(`line-height: ${height}`);\n return this;\n }\n\n /**\n * Add text decoration\n */\n underline(): StyleBuilder {\n this.styles.push('text-decoration: underline');\n return this;\n }\n\n /**\n * Add text transform\n */\n uppercase(): StyleBuilder {\n this.styles.push('text-transform: uppercase');\n return this;\n }\n\n /**\n * Add opacity\n */\n opacity(value: number): StyleBuilder {\n this.styles.push(`opacity: ${value}`);\n return this;\n }\n\n /**\n * Add display property\n */\n display(value: string): StyleBuilder {\n this.styles.push(`display: ${value}`);\n return this;\n }\n\n /**\n * Add position property\n */\n position(value: string): StyleBuilder {\n this.styles.push(`position: ${value}`);\n return this;\n }\n\n /**\n * Add transform property\n */\n transform(value: string): StyleBuilder {\n this.styles.push(`transform: ${value}`);\n return this;\n }\n\n /**\n * Add animation property\n */\n animation(value: string): StyleBuilder {\n this.styles.push(`animation: ${value}`);\n return this;\n }\n\n /**\n * Add transition property\n */\n transition(value: string): StyleBuilder {\n this.styles.push(`transition: ${value}`);\n return this;\n }\n\n /**\n * Add cursor property\n */\n cursor(value: string): StyleBuilder {\n this.styles.push(`cursor: ${value}`);\n return this;\n }\n\n /**\n * Add any custom CSS property\n */\n custom(property: string, value: string): StyleBuilder {\n this.styles.push(`${property}: ${value}`);\n return this;\n }\n\n /**\n * Add any CSS property (alias for custom)\n */\n css(property: string, value: string): StyleBuilder {\n return this.custom(property, value);\n }\n\n /**\n * Build the final CSS string\n */\n build(): string {\n return this.styles.join('; ');\n }\n\n /**\n * Clear all styles and start fresh\n */\n clear(): StyleBuilder {\n this.styles = [];\n return this;\n }\n\n /**\n * Clone this StyleBuilder with the same styles\n */\n clone(): StyleBuilder {\n const cloned = new StyleBuilder();\n cloned.styles = [...this.styles];\n return cloned;\n }\n\n /**\n * Merge another StyleBuilder's styles into this one\n */\n merge(other: StyleBuilder): StyleBuilder {\n this.styles.push(...other.styles);\n return this;\n }\n}\n\n/**\n * Proxy-based dynamic styler for chainable console styling\n */\nfunction createStyler(): any {\n const builder = new StyleBuilder();\n return new Proxy(builder, {\n get(target: StyleBuilder, prop: string) {\n if (prop in target) {\n const method = (target as any)[prop];\n if (typeof method === 'function') {\n return method.bind(target);\n }\n return method;\n }\n return undefined;\n }\n });\n}\n\n/**\n * Dynamic styler instance for external use\n */\nexport const $ = createStyler();\n\n/**\n * Pre-defined style presets for common use cases\n */\nexport const StylePresets = {\n success: () => new StyleBuilder()\n .bg('linear-gradient(135deg, #00b894 0%, #00a085 100%)')\n .color('#ffffff')\n .padding('4px 8px')\n .rounded('4px')\n .bold(),\n\n error: () => new StyleBuilder()\n .bg('linear-gradient(135deg, #e84393 0%, #d63031 100%)')\n .color('#ffffff')\n .padding('4px 8px')\n .rounded('4px')\n .bold(),\n\n warning: () => new StyleBuilder()\n .bg('linear-gradient(135deg, #fdcb6e 0%, #e17055 100%)')\n .color('#2d3436')\n .padding('4px 8px')\n .rounded('4px')\n .bold(),\n\n info: () => new StyleBuilder()\n .bg('linear-gradient(135deg, #74b9ff 0%, #0984e3 100%)')\n .color('#ffffff')\n .padding('4px 8px')\n .rounded('4px')\n .bold(),\n\n debug: () => new StyleBuilder()\n .bg('linear-gradient(135deg, #667eea 0%, #764ba2 100%)')\n .color('#ffffff')\n .padding('4px 8px')\n .rounded('4px')\n .bold(),\n\n muted: () => new StyleBuilder()\n .color('#6c757d')\n .font('Monaco, Consolas, monospace')\n .size('12px'),\n\n accent: () => new StyleBuilder()\n .bg('#f8f9fa')\n .color('#495057')\n .padding('2px 6px')\n .rounded('3px')\n .border('1px solid #dee2e6'),\n\n neon: () => new StyleBuilder()\n .bg('linear-gradient(135deg, #0f3460 0%, #e94560 100%)')\n .color('#00ffff')\n .padding('4px 8px')\n .rounded('4px')\n .bold()\n .shadow('0 0 10px rgba(0, 255, 255, 0.5)'),\n};","/**\n * @fileoverview Styled output creation utilities for Advanced Logger\n */\n\nimport type { LogLevel, StackInfo, DevToolsTheme, AdaptiveColors } from '../types/index.js';\nimport { formatTimestamp } from './timestamps.js';\nimport { StyleBuilder } from '../styling/index.js';\nimport { ADAPTIVE_COLORS } from '../constants.js';\n\n/**\n * Style configuration for each log level\n */\nexport interface LevelStyleConfig {\n emoji: string;\n label: string;\n background: string;\n color: string;\n border: string;\n shadow: string;\n}\n\n/**\n * Detects the current DevTools theme preference\n */\nexport function detectDevToolsTheme(): DevToolsTheme {\n try {\n if (typeof window === 'undefined' || !window.matchMedia) {\n return 'light'; // Safe fallback for SSR or older browsers\n }\n \n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n return mediaQuery.matches ? 'dark' : 'light';\n } catch (error) {\n console.warn('Failed to detect DevTools theme:', error);\n return 'light'; // Fallback to light theme\n }\n}\n\n/**\n * Gets adaptive color based on current DevTools theme\n */\nexport function getAdaptiveColor(colors: AdaptiveColors, theme?: DevToolsTheme): string {\n const currentTheme = theme ?? detectDevToolsTheme();\n return colors[currentTheme];\n}\n\n/**\n * Sets up theme change listener for dynamic updates\n */\nexport function setupThemeChangeListener(callback: (theme: DevToolsTheme) => void): (() => void) | null {\n try {\n if (typeof window === 'undefined' || !window.matchMedia) {\n return null;\n }\n\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n const handler = (e: MediaQueryListEvent) => {\n callback(e.matches ? 'dark' : 'light');\n };\n\n // Use newer addEventListener if available, fallback to addListener\n if (mediaQuery.addEventListener) {\n mediaQuery.addEventListener('change', handler);\n return () => mediaQuery.removeEventListener('change', handler);\n } else if (mediaQuery.addListener) {\n mediaQuery.addListener(handler);\n return () => mediaQuery.removeListener?.(handler);\n }\n\n return null;\n } catch (error) {\n console.warn('Failed to set up theme change listener:', error);\n return null;\n }\n}\n\n\n/**\n * Creates styled console output with multiple %c formatters\n */\nexport function createStyledOutput(\n level: LogLevel,\n levelStyles: Record<LogLevel | 'success', LevelStyleConfig>,\n prefix: string | undefined,\n message: string,\n stackInfo: StackInfo | null,\n autoDetectTheme: boolean = true\n): [string, ...string[]] {\n const levelConfig = levelStyles[level];\n const timestamp = formatTimestamp();\n const currentTheme = autoDetectTheme ? detectDevToolsTheme() : 'light';\n\n // Base styles with adaptive colors\n const timestampStyle = new StyleBuilder()\n .color(getAdaptiveColor(ADAPTIVE_COLORS.timestamp, currentTheme))\n .size('11px')\n .font('Monaco, Consolas, monospace')\n .build();\n\n const levelStyle = new StyleBuilder()\n .bg(levelConfig.background)\n .color(levelConfig.color)\n .border(levelConfig.border)\n .shadow(levelConfig.shadow)\n .padding('2px 8px')\n .rounded('4px')\n .bold()\n .font('Monaco, Consolas, monospace')\n .size('12px')\n .build();\n\n const prefixStyle = new StyleBuilder()\n .bg(getAdaptiveColor(ADAPTIVE_COLORS.prefixBackground, currentTheme))\n .color(getAdaptiveColor(ADAPTIVE_COLORS.prefix, currentTheme))\n .padding('2px 6px')\n .rounded('3px')\n .bold()\n .font('Monaco, Consolas, monospace')\n .size('11px')\n .build();\n\n const messageStyle = new StyleBuilder()\n .color(getAdaptiveColor(ADAPTIVE_COLORS.messageText, currentTheme))\n .font('system-ui, -apple-system, sans-serif')\n .size('14px')\n .build();\n\n const locationStyle = new StyleBuilder()\n .color(getAdaptiveColor(ADAPTIVE_COLORS.location, currentTheme))\n .size('11px')\n .font('Monaco, Consolas, monospace')\n .build();\n\n // Build format string and styles\n let format = `%c${timestamp.slice(11, 23)} %c${levelConfig.emoji} ${levelConfig.label}`;\n const styles = [timestampStyle, levelStyle];\n\n if (prefix) {\n format += ` %c${prefix}`;\n styles.push(prefixStyle);\n }\n\n format += ` %c${message}`;\n styles.push(messageStyle);\n\n if (stackInfo) {\n format += ` %c(${stackInfo.file}:${stackInfo.line}:${stackInfo.column})`;\n styles.push(locationStyle);\n }\n\n return [format, ...styles];\n}\n\n/**\n * Create a unique ID for log entries\n */\nexport function generateLogId(): string {\n return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n}\n\n/**\n * Escape HTML entities for safe HTML output\n */\nexport function escapeHtml(text: string): string {\n const div = document.createElement('div');\n div.textContent = text;\n return div.innerHTML;\n}\n\n/**\n * Convert objects to safe string representation for logging\n */\nexport function safeStringify(obj: any, _maxDepth = 3): string {\n try {\n return JSON.stringify(obj, (_key, value) => {\n if (typeof value === 'function') return '[Function]';\n if (value instanceof Error) return `[Error: ${value.message}]`;\n if (value instanceof Date) return value.toISOString();\n if (typeof value === 'undefined') return '[undefined]';\n return value;\n }, 2);\n } catch (error) {\n return String(obj);\n }\n}","/**\n * @fileoverview Environment detection utilities for Universal Logger\n */\n\n/**\n * Checks if running in Node.js environment\n */\nexport const isNode = typeof process !== 'undefined' && \n process.versions && \n process.versions.node;\n\n/**\n * Checks if running in browser environment\n */\nexport const isBrowser = typeof window !== 'undefined' && \n typeof document !== 'undefined';\n\n/**\n * Checks if running in web worker environment\n */\nexport const isWebWorker = typeof self !== 'undefined' && \n typeof (self as any).importScripts === 'function';\n\n/**\n * Checks if running in Deno environment\n */\nexport const isDeno = typeof globalThis !== 'undefined' && \n 'Deno' in globalThis;\n\n/**\n * Gets the current runtime environment\n */\nexport function getRuntimeEnvironment(): 'node' | 'browser' | 'webworker' | 'deno' | 'unknown' {\n if (isNode) return 'node';\n if (isBrowser) return 'browser';\n if (isWebWorker) return 'webworker';\n if (isDeno) return 'deno';\n return 'unknown';\n}\n\n/**\n * Checks if colors/styling should be supported in current environment\n */\nexport function supportsColors(): boolean {\n if (isBrowser) {\n // Browser always supports CSS colors\n return true;\n }\n \n if (isNode) {\n // Check if Node.js supports colors\n return process.stdout?.isTTY === true || \n process.env.FORCE_COLOR === '1' ||\n process.env.FORCE_COLOR === 'true';\n }\n \n return false;\n}\n\n/**\n * Checks if CSS styling is supported (browser-only feature)\n */\nexport function supportsCSSColors(): boolean {\n return isBrowser;\n}\n\n/**\n * Checks if ANSI colors are supported (terminal environments)\n */\nexport function supportsANSIColors(): boolean {\n if (isNode) {\n return process.stdout?.isTTY === true || \n process.env.FORCE_COLOR === '1' ||\n process.env.FORCE_COLOR === 'true';\n }\n \n return false;\n}\n\n/**\n * Gets environment-specific information\n */\nexport function getEnvironmentInfo() {\n const env = getRuntimeEnvironment();\n \n return {\n runtime: env,\n supportsColors: supportsColors(),\n supportsCSSColors: supportsCSSColors(),\n supportsANSIColors: supportsANSIColors(),\n isProduction: isNode ? process.env.NODE_ENV === 'production' : false,\n version: isNode ? process.versions.node : (isBrowser ? navigator.userAgent : 'unknown')\n };\n}","/**\n * @fileoverview Stack trace parsing utilities for Advanced Logger\n */\n\nimport type { StackInfo } from '../types/index.js';\n\n/**\n * Parses the current stack trace to extract caller information\n */\nexport function parseStackTrace(): StackInfo | null {\n try {\n const stack = new Error().stack;\n if (!stack) {\n return null;\n }\n\n const lines = stack.split('\\n').filter(line => line.trim());\n \n // Find the first caller that's not from Logger methods\n for (let i = 1; i < lines.length; i++) {\n const line = lines[i];\n \n if (!line) {\n continue;\n }\n \n // Skip if line contains Logger methods or parseStackTrace\n if (line.includes('parseStackTrace') || \n line.includes('Logger.') || \n line.includes('.log(') ||\n line.includes('createStyledOutput')) {\n continue;\n }\n\n // Parse different stack trace formats\n let match;\n \n // Chrome format: \"at functionName (file:line:column)\" or \"at file:line:column\"\n const chromeMatch = line.match(/at\\s+(?:(.+?)\\s+\\()?(.+?):(\\d+):(\\d+)\\)?$/);\n if (chromeMatch) {\n match = chromeMatch;\n } else {\n // Firefox format: \"functionName@file:line:column\"\n const firefoxMatch = line.match(/(.+?)@(.+?):(\\d+):(\\d+)$/);\n if (firefoxMatch) {\n match = firefoxMatch;\n } else {\n // Safari/other formats\n const safariMatch = line.match(/(\\S+)?@(.+?):(\\d+):(\\d+)$/);\n if (safariMatch) {\n match = safariMatch;\n }\n }\n }\n\n if (!match) {\n continue;\n }\n\n const [, functionName, file, lineStr, columnStr] = match;\n \n if (!file) {\n continue;\n }\n \n // Process file path - remove query params and get filename\n const fileParts = file.split('/');\n const fileName = fileParts[fileParts.length - 1];\n if (!fileName) {\n continue;\n }\n const cleanFileName = fileName.split('?')[0];\n \n // Parse line and column numbers\n const lineNum = lineStr ? parseInt(lineStr, 10) : 0;\n const columnNum = columnStr ? parseInt(columnStr, 10) : 0;\n \n // Clean function name\n const cleanFunction = functionName && functionName.trim() \n ? functionName.trim() \n : undefined;\n \n return {\n file: cleanFileName ? cleanFileName : 'unknown',\n line: lineNum,\n column: columnNum,\n function: cleanFunction\n };\n }\n \n return null;\n } catch {\n return null;\n }\n}"],"names":["TIME_UNITS","ms","s","m","h","d","ADAPTIVE_COLORS","timestamp","light","dark","messageText","prefix","prefixBackground","location","formatTimestamp","Date","toISOString","StyleBuilder","styles","constructor","baseStyle","this","push","bg","background","color","border","shadow","padding","margin","rounded","radius","bold","font","mono","system","size","lineHeight","height","underline","uppercase","opacity","value","display","position","transform","animation","transition","cursor","custom","property","css","build","join","clear","clone","cloned","merge","other","builder","Proxy","get","target","prop","method","bind","createStyler","StylePresets","success","error","warning","info","debug","muted","accent","neon","detectDevToolsTheme","window","matchMedia","matches","console","warn","getAdaptiveColor","colors","theme","isNode","process","versions","node","isBrowser","document","MIN_SIZE","DEFAULT_SIZE","MAX_SIZE","verbosity","enableColors","enableTimestamps","enableStackTrace","bannerType","bufferSize","autoDetectTheme","json","extension","mimeType","csv","markdown","plain","html","emoji","label","critical","level","levelStyles","message","stackInfo","levelConfig","currentTheme","timestampStyle","levelStyle","prefixStyle","messageStyle","locationStyle","format","slice","file","line","column","text","div","createElement","textContent","innerHTML","date","toTimeString","now","Math","random","toString","substr","stack","Error","lines","split","filter","trim","i","length","includes","match","chromeMatch","firefoxMatch","safariMatch","functionName","lineStr","columnStr","fileParts","fileName","cleanFileName","lineNum","parseInt","function","input","isoDate","isNaN","getTime","timeStr","amount","unit","multiplier","parseRelativeTime","obj","_maxDepth","JSON","stringify","_key","String","callback","mediaQuery","handler","e","addEventListener","removeEventListener","addListener","removeListener"],"mappings":"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"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { f as formatTimestamp } from "./environment-Bxbnw4pd.js";
|
|
2
|
+
function createPlainOutput(level, message, prefix, stackInfo) {
|
|
3
|
+
const timestamp = formatTimestamp();
|
|
4
|
+
const timeStr = timestamp.slice(11, 23);
|
|
5
|
+
let output = `[${timeStr}] [${level.toUpperCase()}]`;
|
|
6
|
+
if (prefix) {
|
|
7
|
+
output += ` [${prefix}]`;
|
|
8
|
+
}
|
|
9
|
+
output += ` ${message}`;
|
|
10
|
+
if (stackInfo) {
|
|
11
|
+
output += ` (${stackInfo.file}:${stackInfo.line}:${stackInfo.column})`;
|
|
12
|
+
}
|
|
13
|
+
return output;
|
|
14
|
+
}
|
|
15
|
+
function getConsoleMethod(level) {
|
|
16
|
+
switch (level) {
|
|
17
|
+
case "debug":
|
|
18
|
+
return "log";
|
|
19
|
+
case "info":
|
|
20
|
+
return "info";
|
|
21
|
+
case "warn":
|
|
22
|
+
return "warn";
|
|
23
|
+
case "error":
|
|
24
|
+
case "critical":
|
|
25
|
+
return "error";
|
|
26
|
+
default:
|
|
27
|
+
return "log";
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function createLogEntry(level, message, args, prefix, stackInfo) {
|
|
31
|
+
return {
|
|
32
|
+
timestamp: formatTimestamp(),
|
|
33
|
+
level: level.toUpperCase(),
|
|
34
|
+
prefix,
|
|
35
|
+
message,
|
|
36
|
+
args: args.slice(1),
|
|
37
|
+
// Exclude the first message argument
|
|
38
|
+
location: stackInfo ? {
|
|
39
|
+
file: stackInfo.file,
|
|
40
|
+
line: stackInfo.line,
|
|
41
|
+
column: stackInfo.column,
|
|
42
|
+
function: stackInfo.function
|
|
43
|
+
} : void 0,
|
|
44
|
+
raw: args
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
function formatTablePlain(data, columns) {
|
|
48
|
+
try {
|
|
49
|
+
if (Array.isArray(data)) {
|
|
50
|
+
if (data.length === 0) return "[Empty Array]";
|
|
51
|
+
if (typeof data[0] !== "object") {
|
|
52
|
+
return data.map((item, i) => `${i}: ${item}`).join("\n");
|
|
53
|
+
}
|
|
54
|
+
const keys = columns || Object.keys(data[0] || {});
|
|
55
|
+
const header = keys.join(" ");
|
|
56
|
+
const rows = data.map(
|
|
57
|
+
(item) => keys.map((key) => String(item[key] || "")).join(" ")
|
|
58
|
+
);
|
|
59
|
+
return [header, ...rows].join("\n");
|
|
60
|
+
}
|
|
61
|
+
if (typeof data === "object" && data !== null) {
|
|
62
|
+
return Object.entries(data).map(([key, value]) => `${key}: ${value}`).join("\n");
|
|
63
|
+
}
|
|
64
|
+
return String(data);
|
|
65
|
+
} catch (error) {
|
|
66
|
+
return `[Error formatting table: ${error}]`;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
function safeSerialize(obj, maxDepth = 3, currentDepth = 0) {
|
|
70
|
+
if (currentDepth >= maxDepth) {
|
|
71
|
+
return "[Max Depth Reached]";
|
|
72
|
+
}
|
|
73
|
+
if (obj === null) return null;
|
|
74
|
+
if (obj === void 0) return "[undefined]";
|
|
75
|
+
if (typeof obj === "function") return "[Function]";
|
|
76
|
+
if (obj instanceof Error) return `[Error: ${obj.message}]`;
|
|
77
|
+
if (obj instanceof Date) return obj.toISOString();
|
|
78
|
+
if (typeof obj !== "object") return obj;
|
|
79
|
+
if (Array.isArray(obj)) {
|
|
80
|
+
return obj.map((item) => safeSerialize(item, maxDepth, currentDepth + 1));
|
|
81
|
+
}
|
|
82
|
+
const result = {};
|
|
83
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
84
|
+
result[key] = safeSerialize(value, maxDepth, currentDepth + 1);
|
|
85
|
+
}
|
|
86
|
+
return result;
|
|
87
|
+
}
|
|
88
|
+
export {
|
|
89
|
+
createLogEntry as a,
|
|
90
|
+
createPlainOutput as c,
|
|
91
|
+
formatTablePlain as f,
|
|
92
|
+
getConsoleMethod as g,
|
|
93
|
+
safeSerialize as s
|
|
94
|
+
};
|
|
95
|
+
//# sourceMappingURL=formatting-C0riPC5_.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatting-C0riPC5_.js","sources":["../../src/utils/formatting.ts"],"sourcesContent":["/**\n * @fileoverview Formatting utilities for Universal Logger\n */\n\nimport type { LogLevel, StackInfo } from '../types/index.js';\nimport { formatTimestamp } from './timestamps.js';\n\n/**\n * Creates plain text output for any environment\n * No colors, no styling - maximum compatibility\n */\nexport function createPlainOutput(\n level: LogLevel,\n message: string,\n prefix?: string,\n stackInfo?: StackInfo | null\n): string {\n const timestamp = formatTimestamp();\n const timeStr = timestamp.slice(11, 23); // HH:MM:SS.mmm\n \n let output = `[${timeStr}] [${level.toUpperCase()}]`;\n \n if (prefix) {\n output += ` [${prefix}]`;\n }\n \n output += ` ${message}`;\n \n if (stackInfo) {\n output += ` (${stackInfo.file}:${stackInfo.line}:${stackInfo.column})`;\n }\n \n return output;\n}\n\n/**\n * Gets the appropriate log method for the level\n * Uses different console methods for better semantics\n */\nexport function getConsoleMethod(level: LogLevel): 'log' | 'info' | 'warn' | 'error' {\n switch (level) {\n case 'debug':\n return 'log';\n case 'info':\n return 'info';\n case 'warn':\n return 'warn';\n case 'error':\n case 'critical':\n return 'error';\n default:\n return 'log';\n }\n}\n\n/**\n * Create a simple log entry object for handlers\n */\nexport function createLogEntry(\n level: LogLevel,\n message: string,\n args: any[],\n prefix?: string,\n stackInfo?: StackInfo | null\n) {\n return {\n timestamp: formatTimestamp(),\n level: level.toUpperCase(),\n prefix,\n message,\n args: args.slice(1), // Exclude the first message argument\n location: stackInfo ? {\n file: stackInfo.file,\n line: stackInfo.line,\n column: stackInfo.column,\n function: stackInfo.function\n } : undefined,\n raw: args\n };\n}\n\n/**\n * Format data for table display in plain text\n */\nexport function formatTablePlain(data: any, columns?: string[]): string {\n try {\n if (Array.isArray(data)) {\n if (data.length === 0) return '[Empty Array]';\n \n // Simple array formatting\n if (typeof data[0] !== 'object') {\n return data.map((item, i) => `${i}: ${item}`).join('\\n');\n }\n \n // Object array formatting\n const keys = columns || Object.keys(data[0] || {});\n const header = keys.join('\\t');\n const rows = data.map(item => \n keys.map(key => String(item[key] || '')).join('\\t')\n );\n \n return [header, ...rows].join('\\n');\n }\n \n if (typeof data === 'object' && data !== null) {\n // Simple object formatting\n return Object.entries(data)\n .map(([key, value]) => `${key}: ${value}`)\n .join('\\n');\n }\n \n return String(data);\n } catch (error) {\n return `[Error formatting table: ${error}]`;\n }\n}\n\n/**\n * Safe object serialization for logging\n */\nexport function safeSerialize(obj: any, maxDepth: number = 3, currentDepth: number = 0): any {\n if (currentDepth >= maxDepth) {\n return '[Max Depth Reached]';\n }\n \n if (obj === null) return null;\n if (obj === undefined) return '[undefined]';\n if (typeof obj === 'function') return '[Function]';\n if (obj instanceof Error) return `[Error: ${obj.message}]`;\n if (obj instanceof Date) return obj.toISOString();\n if (typeof obj !== 'object') return obj;\n \n if (Array.isArray(obj)) {\n return obj.map(item => safeSerialize(item, maxDepth, currentDepth + 1));\n }\n \n const result: any = {};\n for (const [key, value] of Object.entries(obj)) {\n result[key] = safeSerialize(value, maxDepth, currentDepth + 1);\n }\n return result;\n}"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";const e=require("./environment-Dm66zOML.js");exports.createLogEntry=function(r,t,n,i,o){return{timestamp:e.formatTimestamp(),level:r.toUpperCase(),prefix:i,message:t,args:n.slice(1),location:o?{file:o.file,line:o.line,column:o.column,function:o.function}:void 0,raw:n}},exports.createPlainOutput=function(r,t,n,i){let o=`[${e.formatTimestamp().slice(11,23)}] [${r.toUpperCase()}]`;return n&&(o+=` [${n}]`),o+=` ${t}`,i&&(o+=` (${i.file}:${i.line}:${i.column})`),o},exports.formatTablePlain=function(e,r){try{if(Array.isArray(e)){if(0===e.length)return"[Empty Array]";if("object"!=typeof e[0])return e.map((e,r)=>`${r}: ${e}`).join("\n");const t=r||Object.keys(e[0]||{});return[t.join("\t"),...e.map(e=>t.map(r=>String(e[r]||"")).join("\t"))].join("\n")}return"object"==typeof e&&null!==e?Object.entries(e).map(([e,r])=>`${e}: ${r}`).join("\n"):String(e)}catch(t){return`[Error formatting table: ${t}]`}},exports.getConsoleMethod=function(e){switch(e){case"debug":default:return"log";case"info":return"info";case"warn":return"warn";case"error":case"critical":return"error"}},exports.safeSerialize=function safeSerialize(e,r=3,t=0){if(t>=r)return"[Max Depth Reached]";if(null===e)return null;if(void 0===e)return"[undefined]";if("function"==typeof e)return"[Function]";if(e instanceof Error)return`[Error: ${e.message}]`;if(e instanceof Date)return e.toISOString();if("object"!=typeof e)return e;if(Array.isArray(e))return e.map(e=>safeSerialize(e,r,t+1));const n={};for(const[i,o]of Object.entries(e))n[i]=safeSerialize(o,r,t+1);return n};
|
|
2
|
+
//# sourceMappingURL=formatting-DNCAV66-.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatting-DNCAV66-.js","sources":["../../src/utils/formatting.ts"],"sourcesContent":["/**\n * @fileoverview Formatting utilities for Universal Logger\n */\n\nimport type { LogLevel, StackInfo } from '../types/index.js';\nimport { formatTimestamp } from './timestamps.js';\n\n/**\n * Creates plain text output for any environment\n * No colors, no styling - maximum compatibility\n */\nexport function createPlainOutput(\n level: LogLevel,\n message: string,\n prefix?: string,\n stackInfo?: StackInfo | null\n): string {\n const timestamp = formatTimestamp();\n const timeStr = timestamp.slice(11, 23); // HH:MM:SS.mmm\n \n let output = `[${timeStr}] [${level.toUpperCase()}]`;\n \n if (prefix) {\n output += ` [${prefix}]`;\n }\n \n output += ` ${message}`;\n \n if (stackInfo) {\n output += ` (${stackInfo.file}:${stackInfo.line}:${stackInfo.column})`;\n }\n \n return output;\n}\n\n/**\n * Gets the appropriate log method for the level\n * Uses different console methods for better semantics\n */\nexport function getConsoleMethod(level: LogLevel): 'log' | 'info' | 'warn' | 'error' {\n switch (level) {\n case 'debug':\n return 'log';\n case 'info':\n return 'info';\n case 'warn':\n return 'warn';\n case 'error':\n case 'critical':\n return 'error';\n default:\n return 'log';\n }\n}\n\n/**\n * Create a simple log entry object for handlers\n */\nexport function createLogEntry(\n level: LogLevel,\n message: string,\n args: any[],\n prefix?: string,\n stackInfo?: StackInfo | null\n) {\n return {\n timestamp: formatTimestamp(),\n level: level.toUpperCase(),\n prefix,\n message,\n args: args.slice(1), // Exclude the first message argument\n location: stackInfo ? {\n file: stackInfo.file,\n line: stackInfo.line,\n column: stackInfo.column,\n function: stackInfo.function\n } : undefined,\n raw: args\n };\n}\n\n/**\n * Format data for table display in plain text\n */\nexport function formatTablePlain(data: any, columns?: string[]): string {\n try {\n if (Array.isArray(data)) {\n if (data.length === 0) return '[Empty Array]';\n \n // Simple array formatting\n if (typeof data[0] !== 'object') {\n return data.map((item, i) => `${i}: ${item}`).join('\\n');\n }\n \n // Object array formatting\n const keys = columns || Object.keys(data[0] || {});\n const header = keys.join('\\t');\n const rows = data.map(item => \n keys.map(key => String(item[key] || '')).join('\\t')\n );\n \n return [header, ...rows].join('\\n');\n }\n \n if (typeof data === 'object' && data !== null) {\n // Simple object formatting\n return Object.entries(data)\n .map(([key, value]) => `${key}: ${value}`)\n .join('\\n');\n }\n \n return String(data);\n } catch (error) {\n return `[Error formatting table: ${error}]`;\n }\n}\n\n/**\n * Safe object serialization for logging\n */\nexport function safeSerialize(obj: any, maxDepth: number = 3, currentDepth: number = 0): any {\n if (currentDepth >= maxDepth) {\n return '[Max Depth Reached]';\n }\n \n if (obj === null) return null;\n if (obj === undefined) return '[undefined]';\n if (typeof obj === 'function') return '[Function]';\n if (obj instanceof Error) return `[Error: ${obj.message}]`;\n if (obj instanceof Date) return obj.toISOString();\n if (typeof obj !== 'object') return obj;\n \n if (Array.isArray(obj)) {\n return obj.map(item => safeSerialize(item, maxDepth, currentDepth + 1));\n }\n \n const result: any = {};\n for (const [key, value] of Object.entries(obj)) {\n result[key] = safeSerialize(value, maxDepth, currentDepth + 1);\n }\n return result;\n}"],"names":["level","message","args","prefix","stackInfo","timestamp","formatTimestamp","toUpperCase","slice","location","file","line","column","function","raw","output","data","columns","Array","isArray","length","map","item","i","join","keys","Object","key","String","entries","value","error","safeSerialize","obj","maxDepth","currentDepth","Error","Date","toISOString","result"],"mappings":"iFA0DO,SACHA,EACAC,EACAC,EACAC,EACAC,GAEA,MAAO,CACHC,UAAWC,EAAAA,kBACXN,MAAOA,EAAMO,cACbJ,SACAF,UACAC,KAAMA,EAAKM,MAAM,GACjBC,SAAUL,EAAY,CAClBM,KAAMN,EAAUM,KAChBC,KAAMP,EAAUO,KAChBC,OAAQR,EAAUQ,OAClBC,SAAUT,EAAUS,eACpB,EACJC,IAAKZ,EAEb,4BApEO,SACHF,EACAC,EACAE,EACAC,GAKA,IAAIW,EAAS,IAHKT,EAAAA,kBACQE,MAAM,GAAI,SAENR,EAAMO,iBAYpC,OAVIJ,IACAY,GAAU,KAAKZ,MAGnBY,GAAU,IAAId,IAEVG,IACAW,GAAU,KAAKX,EAAUM,QAAQN,EAAUO,QAAQP,EAAUQ,WAG1DG,CACX,2BAmDO,SAA0BC,EAAWC,GACxC,IACI,GAAIC,MAAMC,QAAQH,GAAO,CACrB,GAAoB,IAAhBA,EAAKI,OAAc,MAAO,gBAG9B,GAAuB,iBAAZJ,EAAK,GACZ,OAAOA,EAAKK,IAAI,CAACC,EAAMC,IAAM,GAAGA,MAAMD,KAAQE,KAAK,MAIvD,MAAMC,EAAOR,GAAWS,OAAOD,KAAKT,EAAK,IAAM,IAM/C,MAAO,CALQS,EAAKD,KAAK,SACZR,EAAKK,IAAIC,GAClBG,EAAKJ,IAAIM,GAAOC,OAAON,EAAKK,IAAQ,KAAKH,KAAK,QAGzBA,KAAK,KAClC,CAEA,MAAoB,iBAATR,GAA8B,OAATA,EAErBU,OAAOG,QAAQb,GACjBK,IAAI,EAAEM,EAAKG,KAAW,GAAGH,MAAQG,KACjCN,KAAK,MAGPI,OAAOZ,EAClB,OAASe,GACL,MAAO,4BAA4BA,IACvC,CACJ,2BA5EO,SAA0B/B,GAC7B,OAAQA,GACJ,IAAK,QASL,QACI,MAAO,MARX,IAAK,OACD,MAAO,OACX,IAAK,OACD,MAAO,OACX,IAAK,QACL,IAAK,WACD,MAAO,QAInB,wBAmEO,SAASgC,cAAcC,EAAUC,EAAmB,EAAGC,EAAuB,GACjF,GAAIA,GAAgBD,EAChB,MAAO,sBAGX,GAAY,OAARD,EAAc,OAAO,KACzB,QAAY,IAARA,EAAmB,MAAO,cAC9B,GAAmB,mBAARA,EAAoB,MAAO,aACtC,GAAIA,aAAeG,MAAO,MAAO,WAAWH,EAAIhC,WAChD,GAAIgC,aAAeI,KAAM,OAAOJ,EAAIK,cACpC,GAAmB,iBAARL,EAAkB,OAAOA,EAEpC,GAAIf,MAAMC,QAAQc,GACd,OAAOA,EAAIZ,IAAIC,GAAQU,cAAcV,EAAMY,EAAUC,EAAe,IAGxE,MAAMI,EAAc,CAAA,EACpB,IAAA,MAAYZ,EAAKG,KAAUJ,OAAOG,QAAQI,GACtCM,EAAOZ,GAAOK,cAAcF,EAAOI,EAAUC,EAAe,GAEhE,OAAOI,CACX"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview CLI Command processor for Advanced Logger
|
|
3
|
+
*/
|
|
4
|
+
import type { Logger } from '../Logger.js';
|
|
5
|
+
/**
|
|
6
|
+
* Base interface for CLI commands
|
|
7
|
+
*/
|
|
8
|
+
export interface ICommand {
|
|
9
|
+
name: string;
|
|
10
|
+
description: string;
|
|
11
|
+
usage: string;
|
|
12
|
+
category?: string;
|
|
13
|
+
aliases?: string[];
|
|
14
|
+
execute(args: string, logger: Logger): void | Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Plugin interface for extending CLI functionality
|
|
18
|
+
*/
|
|
19
|
+
export interface ICLIPlugin {
|
|
20
|
+
name: string;
|
|
21
|
+
version: string;
|
|
22
|
+
description: string;
|
|
23
|
+
commands: ICommand[];
|
|
24
|
+
initialize?(processor: CommandProcessor, logger: Logger): void;
|
|
25
|
+
cleanup?(): void;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Command history entry
|
|
29
|
+
*/
|
|
30
|
+
interface HistoryEntry {
|
|
31
|
+
command: string;
|
|
32
|
+
timestamp: Date;
|
|
33
|
+
success: boolean;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* CLI command processor
|
|
37
|
+
*/
|
|
38
|
+
export declare class CommandProcessor {
|
|
39
|
+
private commands;
|
|
40
|
+
private aliases;
|
|
41
|
+
private plugins;
|
|
42
|
+
private history;
|
|
43
|
+
private maxHistorySize;
|
|
44
|
+
private isInteractiveMode;
|
|
45
|
+
/**
|
|
46
|
+
* Register a command
|
|
47
|
+
*/
|
|
48
|
+
registerCommand(command: ICommand): void;
|
|
49
|
+
/**
|
|
50
|
+
* Register a plugin
|
|
51
|
+
*/
|
|
52
|
+
registerPlugin(plugin: ICLIPlugin, logger?: Logger): void;
|
|
53
|
+
/**
|
|
54
|
+
* Unregister a plugin
|
|
55
|
+
*/
|
|
56
|
+
unregisterPlugin(pluginName: string): void;
|
|
57
|
+
/**
|
|
58
|
+
* Get all registered commands
|
|
59
|
+
*/
|
|
60
|
+
getCommands(): ICommand[];
|
|
61
|
+
/**
|
|
62
|
+
* Get a specific command
|
|
63
|
+
*/
|
|
64
|
+
getCommand(name: string): ICommand | undefined;
|
|
65
|
+
/**
|
|
66
|
+
* Get command history
|
|
67
|
+
*/
|
|
68
|
+
getHistory(): HistoryEntry[];
|
|
69
|
+
/**
|
|
70
|
+
* Clear command history
|
|
71
|
+
*/
|
|
72
|
+
clearHistory(): void;
|
|
73
|
+
/**
|
|
74
|
+
* Get registered plugins
|
|
75
|
+
*/
|
|
76
|
+
getPlugins(): ICLIPlugin[];
|
|
77
|
+
/**
|
|
78
|
+
* Enter interactive mode
|
|
79
|
+
*/
|
|
80
|
+
enterInteractiveMode(logger: Logger): void;
|
|
81
|
+
/**
|
|
82
|
+
* Exit interactive mode
|
|
83
|
+
*/
|
|
84
|
+
exitInteractiveMode(): void;
|
|
85
|
+
/**
|
|
86
|
+
* Setup browser interactive mode
|
|
87
|
+
*/
|
|
88
|
+
private setupBrowserInteractiveMode;
|
|
89
|
+
/**
|
|
90
|
+
* Process a CLI command
|
|
91
|
+
*/
|
|
92
|
+
processCommand(commandString: string, logger: Logger): Promise<void>;
|
|
93
|
+
/**
|
|
94
|
+
* Add command to history
|
|
95
|
+
*/
|
|
96
|
+
private addToHistory;
|
|
97
|
+
/**
|
|
98
|
+
* Get command suggestions for partial matches
|
|
99
|
+
*/
|
|
100
|
+
getSuggestions(partial: string): string[];
|
|
101
|
+
}
|
|
102
|
+
export {};
|
|
103
|
+
//# sourceMappingURL=CommandProcessor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CommandProcessor.d.ts","sourceRoot":"","sources":["../../src/cli/CommandProcessor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C;;GAEG;AACH,MAAM,WAAW,QAAQ;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/D;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,QAAQ,EAAE,CAAC;IACrB,UAAU,CAAC,CAAC,SAAS,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/D,OAAO,CAAC,IAAI,IAAI,CAAC;CACpB;AAED;;GAEG;AACH,UAAU,YAAY;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,qBAAa,gBAAgB;IACzB,OAAO,CAAC,QAAQ,CAAoC;IACpD,OAAO,CAAC,OAAO,CAAkC;IACjD,OAAO,CAAC,OAAO,CAAsC;IACrD,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,cAAc,CAAe;IACrC,OAAO,CAAC,iBAAiB,CAAkB;IAE3C;;OAEG;IACH,eAAe,CAAC,OAAO,EAAE,QAAQ,GAAG,IAAI;IAWxC;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAkBzD;;OAEG;IACH,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAsB1C;;OAEG;IACH,WAAW,IAAI,QAAQ,EAAE;IAIzB;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS;IAc9C;;OAEG;IACH,UAAU,IAAI,YAAY,EAAE;IAI5B;;OAEG;IACH,YAAY,IAAI,IAAI;IAIpB;;OAEG;IACH,UAAU,IAAI,UAAU,EAAE;IAI1B;;OAEG;IACH,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAU1C;;OAEG;IACH,mBAAmB,IAAI,IAAI;IAI3B;;OAEG;IACH,OAAO,CAAC,2BAA2B;IASnC;;OAEG;IACG,cAAc,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkC1E;;OAEG;IACH,OAAO,CAAC,YAAY;IAapB;;OAEG;IACH,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE;CAI5C"}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview CLI Command processor for Advanced Logger
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* CLI command processor
|
|
6
|
+
*/
|
|
7
|
+
export class CommandProcessor {
|
|
8
|
+
commands = new Map();
|
|
9
|
+
aliases = new Map();
|
|
10
|
+
plugins = new Map();
|
|
11
|
+
history = [];
|
|
12
|
+
maxHistorySize = 100;
|
|
13
|
+
isInteractiveMode = false;
|
|
14
|
+
/**
|
|
15
|
+
* Register a command
|
|
16
|
+
*/
|
|
17
|
+
registerCommand(command) {
|
|
18
|
+
this.commands.set(command.name, command);
|
|
19
|
+
// Register aliases
|
|
20
|
+
if (command.aliases) {
|
|
21
|
+
for (const alias of command.aliases) {
|
|
22
|
+
this.aliases.set(alias, command.name);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Register a plugin
|
|
28
|
+
*/
|
|
29
|
+
registerPlugin(plugin, logger) {
|
|
30
|
+
if (this.plugins.has(plugin.name)) {
|
|
31
|
+
throw new Error(`Plugin ${plugin.name} is already registered`);
|
|
32
|
+
}
|
|
33
|
+
this.plugins.set(plugin.name, plugin);
|
|
34
|
+
// Register plugin commands
|
|
35
|
+
for (const command of plugin.commands) {
|
|
36
|
+
this.registerCommand(command);
|
|
37
|
+
}
|
|
38
|
+
// Initialize plugin
|
|
39
|
+
if (plugin.initialize && logger) {
|
|
40
|
+
plugin.initialize(this, logger);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Unregister a plugin
|
|
45
|
+
*/
|
|
46
|
+
unregisterPlugin(pluginName) {
|
|
47
|
+
const plugin = this.plugins.get(pluginName);
|
|
48
|
+
if (!plugin)
|
|
49
|
+
return;
|
|
50
|
+
// Remove plugin commands
|
|
51
|
+
for (const command of plugin.commands) {
|
|
52
|
+
this.commands.delete(command.name);
|
|
53
|
+
if (command.aliases) {
|
|
54
|
+
for (const alias of command.aliases) {
|
|
55
|
+
this.aliases.delete(alias);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// Cleanup plugin
|
|
60
|
+
if (plugin.cleanup) {
|
|
61
|
+
plugin.cleanup();
|
|
62
|
+
}
|
|
63
|
+
this.plugins.delete(pluginName);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Get all registered commands
|
|
67
|
+
*/
|
|
68
|
+
getCommands() {
|
|
69
|
+
return Array.from(this.commands.values());
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Get a specific command
|
|
73
|
+
*/
|
|
74
|
+
getCommand(name) {
|
|
75
|
+
// Check direct command name
|
|
76
|
+
let command = this.commands.get(name);
|
|
77
|
+
if (command)
|
|
78
|
+
return command;
|
|
79
|
+
// Check aliases
|
|
80
|
+
const aliasTarget = this.aliases.get(name);
|
|
81
|
+
if (aliasTarget) {
|
|
82
|
+
return this.commands.get(aliasTarget);
|
|
83
|
+
}
|
|
84
|
+
return undefined;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Get command history
|
|
88
|
+
*/
|
|
89
|
+
getHistory() {
|
|
90
|
+
return [...this.history];
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Clear command history
|
|
94
|
+
*/
|
|
95
|
+
clearHistory() {
|
|
96
|
+
this.history = [];
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Get registered plugins
|
|
100
|
+
*/
|
|
101
|
+
getPlugins() {
|
|
102
|
+
return Array.from(this.plugins.values());
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Enter interactive mode
|
|
106
|
+
*/
|
|
107
|
+
enterInteractiveMode(logger) {
|
|
108
|
+
this.isInteractiveMode = true;
|
|
109
|
+
logger.info('🔧 Interactive CLI mode activated. Type /exit to quit, /help for commands.');
|
|
110
|
+
// Set up browser console listener for interactive commands
|
|
111
|
+
if (typeof window !== 'undefined') {
|
|
112
|
+
this.setupBrowserInteractiveMode(logger);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Exit interactive mode
|
|
117
|
+
*/
|
|
118
|
+
exitInteractiveMode() {
|
|
119
|
+
this.isInteractiveMode = false;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Setup browser interactive mode
|
|
123
|
+
*/
|
|
124
|
+
setupBrowserInteractiveMode(logger) {
|
|
125
|
+
// Add global CLI function for browser usage
|
|
126
|
+
window.cli = (commandString) => {
|
|
127
|
+
return this.processCommand(`/${commandString}`, logger);
|
|
128
|
+
};
|
|
129
|
+
logger.info('💡 Use cli("command") to execute CLI commands in browser console.');
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Process a CLI command
|
|
133
|
+
*/
|
|
134
|
+
async processCommand(commandString, logger) {
|
|
135
|
+
if (!commandString.startsWith('/')) {
|
|
136
|
+
logger.error('Invalid command. Commands must start with /');
|
|
137
|
+
this.addToHistory(commandString, false);
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
const parts = commandString.slice(1).split(' ');
|
|
141
|
+
const commandName = parts[0] || '';
|
|
142
|
+
const args = parts.slice(1).join(' ');
|
|
143
|
+
const command = this.getCommand(commandName);
|
|
144
|
+
if (!command) {
|
|
145
|
+
logger.error(`Unknown command: ${commandName}. Type /help for available commands.`);
|
|
146
|
+
// Suggest similar commands
|
|
147
|
+
const suggestions = this.getSuggestions(commandName);
|
|
148
|
+
if (suggestions.length > 0) {
|
|
149
|
+
logger.info(`📋 Did you mean: ${suggestions.slice(0, 3).join(', ')}?`);
|
|
150
|
+
}
|
|
151
|
+
this.addToHistory(commandString, false);
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
try {
|
|
155
|
+
await command.execute(args || '', logger);
|
|
156
|
+
this.addToHistory(commandString, true);
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
logger.error(`Command '${commandName}' failed:`, error);
|
|
160
|
+
this.addToHistory(commandString, false);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Add command to history
|
|
165
|
+
*/
|
|
166
|
+
addToHistory(command, success) {
|
|
167
|
+
this.history.unshift({
|
|
168
|
+
command,
|
|
169
|
+
timestamp: new Date(),
|
|
170
|
+
success
|
|
171
|
+
});
|
|
172
|
+
// Limit history size
|
|
173
|
+
if (this.history.length > this.maxHistorySize) {
|
|
174
|
+
this.history = this.history.slice(0, this.maxHistorySize);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Get command suggestions for partial matches
|
|
179
|
+
*/
|
|
180
|
+
getSuggestions(partial) {
|
|
181
|
+
const commandNames = Array.from(this.commands.keys());
|
|
182
|
+
return commandNames.filter(name => name.startsWith(partial));
|
|
183
|
+
}
|
|
184
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Configuration commands for Advanced Logger CLI
|
|
3
|
+
*/
|
|
4
|
+
import type { ICommand } from '../CommandProcessor.js';
|
|
5
|
+
import type { Logger } from '../../Logger.js';
|
|
6
|
+
/**
|
|
7
|
+
* Configuration command handler
|
|
8
|
+
*/
|
|
9
|
+
export declare class ConfigCommand implements ICommand {
|
|
10
|
+
name: string;
|
|
11
|
+
description: string;
|
|
12
|
+
usage: string;
|
|
13
|
+
execute(args: string, logger: Logger): void;
|
|
14
|
+
private showStatus;
|
|
15
|
+
private applyConfig;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=ConfigCommand.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConfigCommand.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/ConfigCommand.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAG9C;;GAEG;AACH,qBAAa,aAAc,YAAW,QAAQ;IAC1C,IAAI,SAAY;IAChB,WAAW,SAAyC;IACpD,KAAK,SAAkC;IAEvC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IA4B3C,OAAO,CAAC,UAAU;IAiBlB,OAAO,CAAC,WAAW;CA+BtB"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Configuration commands for Advanced Logger CLI
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Configuration command handler
|
|
6
|
+
*/
|
|
7
|
+
export class ConfigCommand {
|
|
8
|
+
name = 'config';
|
|
9
|
+
description = 'Show or update logger configuration';
|
|
10
|
+
usage = '/config [json|key=value,...]';
|
|
11
|
+
execute(args, logger) {
|
|
12
|
+
if (!args) {
|
|
13
|
+
this.showStatus(logger);
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
try {
|
|
17
|
+
// Try to parse as JSON first
|
|
18
|
+
if (args.startsWith('{')) {
|
|
19
|
+
const config = JSON.parse(args);
|
|
20
|
+
this.applyConfig(config, logger);
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
// Parse key=value pairs
|
|
24
|
+
const pairs = args.split(',').map(pair => pair.trim().split('='));
|
|
25
|
+
const config = {};
|
|
26
|
+
pairs.forEach(([key, value]) => {
|
|
27
|
+
if (key && value) {
|
|
28
|
+
config[key.trim()] = value.trim().replace(/["']/g, '');
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
this.applyConfig(config, logger);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
logger.error('Invalid config format. Use JSON or key=value pairs:', error);
|
|
36
|
+
logger.info('Examples: /config {"theme":"dark"} or /config theme=neon,verbosity=debug');
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
showStatus(logger) {
|
|
40
|
+
const statusData = {
|
|
41
|
+
theme: logger.getConfig().theme || 'default',
|
|
42
|
+
verbosity: logger.getConfig().verbosity,
|
|
43
|
+
colors: logger.getConfig().enableColors,
|
|
44
|
+
timestamps: logger.getConfig().enableTimestamps,
|
|
45
|
+
stackTrace: logger.getConfig().enableStackTrace,
|
|
46
|
+
globalPrefix: logger.getConfig().globalPrefix || 'none',
|
|
47
|
+
bannerType: logger.getConfig().bannerType || 'simple',
|
|
48
|
+
handlers: logger.getHandlers().length
|
|
49
|
+
};
|
|
50
|
+
logger.group('⚙️ Logger Configuration');
|
|
51
|
+
logger.table(statusData);
|
|
52
|
+
logger.groupEnd();
|
|
53
|
+
}
|
|
54
|
+
applyConfig(config, logger) {
|
|
55
|
+
const validKeys = ['theme', 'verbosity', 'enableColors', 'enableTimestamps', 'enableStackTrace', 'globalPrefix', 'bannerType'];
|
|
56
|
+
const applied = [];
|
|
57
|
+
Object.entries(config).forEach(([key, value]) => {
|
|
58
|
+
if (validKeys.includes(key)) {
|
|
59
|
+
if (key === 'theme' && typeof value === 'string') {
|
|
60
|
+
logger.setTheme(value);
|
|
61
|
+
applied.push(`${key}=${value}`);
|
|
62
|
+
}
|
|
63
|
+
else if (key === 'bannerType' && typeof value === 'string') {
|
|
64
|
+
logger.setBannerType(value);
|
|
65
|
+
applied.push(`${key}=${value}`);
|
|
66
|
+
}
|
|
67
|
+
else if (key === 'verbosity') {
|
|
68
|
+
logger.setVerbosity(value);
|
|
69
|
+
applied.push(`${key}=${value}`);
|
|
70
|
+
}
|
|
71
|
+
else if (key === 'globalPrefix') {
|
|
72
|
+
logger.setGlobalPrefix(value);
|
|
73
|
+
applied.push(`${key}=${value}`);
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
logger.updateConfig({ [key]: value });
|
|
77
|
+
applied.push(`${key}=${value}`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
logger.warn(`Invalid config key: ${key}`);
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
if (applied.length > 0) {
|
|
85
|
+
logger.success(`Configuration updated: ${applied.join(', ')}`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|