@mks2508/better-logger 0.14.0-alpha.2 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/dist/chunks/{Logger-Crw1woqR.js → Logger-CTAaDeZi.js} +49 -16
  2. package/dist/chunks/{Logger-Crw1woqR.js.map → Logger-CTAaDeZi.js.map} +1 -1
  3. package/dist/chunks/{Logger-D_p3xnbq.js → Logger-D8pK7XXt.js} +2 -2
  4. package/dist/chunks/{Logger-D_p3xnbq.js.map → Logger-D8pK7XXt.js.map} +1 -1
  5. package/dist/chunks/ScopedLogger-D-7q8uVP.js +2 -0
  6. package/dist/chunks/ScopedLogger-D-7q8uVP.js.map +1 -0
  7. package/dist/chunks/ScopedLogger-hS0qSkZD.js +361 -0
  8. package/dist/chunks/ScopedLogger-hS0qSkZD.js.map +1 -0
  9. package/dist/core.js +280 -307
  10. package/dist/exports.cjs +1 -1
  11. package/dist/exports.js +1 -1
  12. package/dist/index.cjs +1 -1
  13. package/dist/index.cjs.map +1 -1
  14. package/dist/index.js +226 -159
  15. package/dist/index.js.map +1 -1
  16. package/dist/styling.cjs +1 -1
  17. package/dist/styling.js +2 -2
  18. package/dist/types/Logger.d.ts +11 -7
  19. package/dist/types/Logger.d.ts.map +1 -1
  20. package/dist/types/core.d.ts +122 -216
  21. package/dist/types/core.d.ts.map +1 -1
  22. package/dist/types/index.d.ts +119 -4
  23. package/dist/types/index.d.ts.map +1 -1
  24. package/package.json +2 -1
  25. package/src/Logger.ts +99 -58
  26. package/src/index.ts +32 -25
  27. package/dist/.tsbuildinfo +0 -1
  28. package/dist/Logger.d.ts +0 -708
  29. package/dist/Logger.d.ts.map +0 -1
  30. package/dist/Logger.js +0 -1124
  31. package/dist/ScopedLogger.d.ts +0 -318
  32. package/dist/ScopedLogger.d.ts.map +0 -1
  33. package/dist/ScopedLogger.js +0 -426
  34. package/dist/cli/CommandProcessor.d.ts +0 -103
  35. package/dist/cli/CommandProcessor.d.ts.map +0 -1
  36. package/dist/cli/CommandProcessor.js +0 -184
  37. package/dist/cli/commands/ConfigCommand.d.ts +0 -17
  38. package/dist/cli/commands/ConfigCommand.d.ts.map +0 -1
  39. package/dist/cli/commands/ConfigCommand.js +0 -88
  40. package/dist/cli/commands/ExportCommand.d.ts +0 -51
  41. package/dist/cli/commands/ExportCommand.d.ts.map +0 -1
  42. package/dist/cli/commands/ExportCommand.js +0 -243
  43. package/dist/cli/commands/HistoryCommand.d.ts +0 -50
  44. package/dist/cli/commands/HistoryCommand.d.ts.map +0 -1
  45. package/dist/cli/commands/HistoryCommand.js +0 -96
  46. package/dist/cli/commands/StatusCommand.d.ts +0 -33
  47. package/dist/cli/commands/StatusCommand.d.ts.map +0 -1
  48. package/dist/cli/commands/StatusCommand.js +0 -93
  49. package/dist/cli/commands/ThemeCommand.d.ts +0 -33
  50. package/dist/cli/commands/ThemeCommand.d.ts.map +0 -1
  51. package/dist/cli/commands/ThemeCommand.js +0 -79
  52. package/dist/cli/help.d.ts +0 -15
  53. package/dist/cli/help.d.ts.map +0 -1
  54. package/dist/cli/help.js +0 -118
  55. package/dist/cli/index.d.ts +0 -15
  56. package/dist/cli/index.d.ts.map +0 -1
  57. package/dist/cli/index.js +0 -46
  58. package/dist/constants.d.ts +0 -122
  59. package/dist/constants.d.ts.map +0 -1
  60. package/dist/constants.js +0 -159
  61. package/dist/core.d.ts +0 -134
  62. package/dist/core.d.ts.map +0 -1
  63. package/dist/example.d.ts +0 -18
  64. package/dist/example.d.ts.map +0 -1
  65. package/dist/example.js +0 -154
  66. package/dist/exports-module.d.ts +0 -203
  67. package/dist/exports-module.d.ts.map +0 -1
  68. package/dist/exports-module.js +0 -260
  69. package/dist/handlers/AnalyticsLogHandler.d.ts +0 -11
  70. package/dist/handlers/AnalyticsLogHandler.d.ts.map +0 -1
  71. package/dist/handlers/AnalyticsLogHandler.js +0 -19
  72. package/dist/handlers/ExportLogHandler.d.ts +0 -103
  73. package/dist/handlers/ExportLogHandler.d.ts.map +0 -1
  74. package/dist/handlers/ExportLogHandler.js +0 -516
  75. package/dist/handlers/FileLogHandler.d.ts +0 -36
  76. package/dist/handlers/FileLogHandler.d.ts.map +0 -1
  77. package/dist/handlers/FileLogHandler.js +0 -156
  78. package/dist/handlers/RemoteLogHandler.d.ts +0 -14
  79. package/dist/handlers/RemoteLogHandler.d.ts.map +0 -1
  80. package/dist/handlers/RemoteLogHandler.js +0 -37
  81. package/dist/handlers/index.d.ts +0 -8
  82. package/dist/handlers/index.d.ts.map +0 -1
  83. package/dist/handlers/index.js +0 -7
  84. package/dist/index.d.ts +0 -157
  85. package/dist/index.d.ts.map +0 -1
  86. package/dist/main.d.ts +0 -2
  87. package/dist/main.d.ts.map +0 -1
  88. package/dist/main.js +0 -139
  89. package/dist/styling/LogStyleBuilder.d.ts +0 -149
  90. package/dist/styling/LogStyleBuilder.d.ts.map +0 -1
  91. package/dist/styling/LogStyleBuilder.js +0 -289
  92. package/dist/styling/SemanticStyles.d.ts +0 -181
  93. package/dist/styling/SemanticStyles.d.ts.map +0 -1
  94. package/dist/styling/SemanticStyles.js +0 -339
  95. package/dist/styling/SmartPresets.d.ts +0 -25
  96. package/dist/styling/SmartPresets.d.ts.map +0 -1
  97. package/dist/styling/SmartPresets.js +0 -276
  98. package/dist/styling/StyleBuilder.d.ts +0 -140
  99. package/dist/styling/StyleBuilder.d.ts.map +0 -1
  100. package/dist/styling/StyleBuilder.js +0 -280
  101. package/dist/styling/banners.d.ts +0 -45
  102. package/dist/styling/banners.d.ts.map +0 -1
  103. package/dist/styling/banners.js +0 -155
  104. package/dist/styling/index.d.ts +0 -10
  105. package/dist/styling/index.d.ts.map +0 -1
  106. package/dist/styling/index.js +0 -9
  107. package/dist/styling/themes.d.ts +0 -10
  108. package/dist/styling/themes.d.ts.map +0 -1
  109. package/dist/styling/themes.js +0 -231
  110. package/dist/styling-module.d.ts +0 -185
  111. package/dist/styling-module.d.ts.map +0 -1
  112. package/dist/styling-module.js +0 -199
  113. package/dist/types/core.js +0 -28
  114. package/dist/types/handlers.d.ts +0 -88
  115. package/dist/types/handlers.d.ts.map +0 -1
  116. package/dist/types/handlers.js +0 -4
  117. package/dist/types/index.js +0 -4
  118. package/dist/utils/environment.d.ts +0 -47
  119. package/dist/utils/environment.d.ts.map +0 -1
  120. package/dist/utils/environment.js +0 -85
  121. package/dist/utils/formatting.d.ts +0 -40
  122. package/dist/utils/formatting.d.ts.map +0 -1
  123. package/dist/utils/formatting.js +0 -117
  124. package/dist/utils/index.d.ts +0 -7
  125. package/dist/utils/index.d.ts.map +0 -1
  126. package/dist/utils/index.js +0 -6
  127. package/dist/utils/opentui-detection.d.ts +0 -34
  128. package/dist/utils/opentui-detection.d.ts.map +0 -1
  129. package/dist/utils/opentui-detection.js +0 -116
  130. package/dist/utils/output.d.ts +0 -44
  131. package/dist/utils/output.d.ts.map +0 -1
  132. package/dist/utils/output.js +0 -150
  133. package/dist/utils/stackTrace.d.ts +0 -9
  134. package/dist/utils/stackTrace.d.ts.map +0 -1
  135. package/dist/utils/stackTrace.js +0 -81
  136. package/dist/utils/timestamps.d.ts +0 -20
  137. package/dist/utils/timestamps.d.ts.map +0 -1
  138. package/dist/utils/timestamps.js +0 -71
package/dist/core.js CHANGED
@@ -1,317 +1,290 @@
1
- /**
2
- * @fileoverview Core Logger Module - Minimal logging without advanced features
3
- * @version 0.0.1
4
- *
5
- * This module provides the essential logging functionality without visual enhancements,
6
- * SVG support, or advanced styling. Perfect for lightweight applications or server-side usage.
7
- */
8
- // Core utilities
9
- import { parseStackTrace } from './utils/index.js';
10
- // Universal formatting and environment detection
11
- import { createPlainOutput, getConsoleMethod, createLogEntry, formatTablePlain } from './utils/formatting.js';
12
- import { isBrowser, isNode, supportsCSSColors } from './utils/environment.js';
13
- import { createStyledOutput } from './utils/output.js';
14
- // Constants
15
- import { DEFAULT_CONFIG, LEVEL_STYLES } from './constants.js';
16
- /**
17
- * Minimal Logger class with core functionality only
18
- *
19
- * @example
20
- * ```typescript
21
- * import { CoreLogger } from '@mks2508/better-logger/core';
22
- *
23
- * const logger = new CoreLogger();
24
- * logger.info('Hello world');
25
- * logger.error('Something went wrong', error);
26
- * ```
27
- */
28
- export class CoreLogger {
29
- config;
30
- scopedPrefix;
31
- handlers = [];
32
- timers = new Map();
33
- groupDepth = 0;
34
- /**
35
- * Creates a new CoreLogger instance
36
- * @param config - Optional configuration
37
- */
38
- constructor(config = {}) {
39
- this.config = {
40
- ...DEFAULT_CONFIG,
41
- ...config,
42
- // Auto-configure based on environment
43
- enableColors: config.enableColors ?? (isBrowser ? true : false),
44
- enableTimestamps: config.enableTimestamps ?? true,
45
- enableStackTrace: config.enableStackTrace ?? false,
46
- autoDetectTheme: config.autoDetectTheme ?? true
47
- };
1
+ import { D as DEFAULT_CONFIG, a as isBrowser, p as parseStackTrace, s as supportsCSSColors, c as createStyledOutput, L as LEVEL_STYLES, i as isNode } from "./chunks/environment-Bxbnw4pd.js";
2
+ import { g as getConsoleMethod, c as createPlainOutput, a as createLogEntry, f as formatTablePlain } from "./chunks/formatting-C0riPC5_.js";
3
+ class CoreLogger {
4
+ config;
5
+ scopedPrefix;
6
+ handlers = [];
7
+ timers = /* @__PURE__ */ new Map();
8
+ groupDepth = 0;
9
+ /**
10
+ * Creates a new CoreLogger instance
11
+ * @param config - Optional configuration
12
+ */
13
+ constructor(config = {}) {
14
+ this.config = {
15
+ ...DEFAULT_CONFIG,
16
+ ...config,
17
+ // Auto-configure based on environment
18
+ enableColors: config.enableColors ?? (isBrowser ? true : false),
19
+ enableTimestamps: config.enableTimestamps ?? true,
20
+ enableStackTrace: config.enableStackTrace ?? false,
21
+ autoDetectTheme: config.autoDetectTheme ?? true
22
+ };
23
+ }
24
+ // ===== CONFIGURATION METHODS =====
25
+ /**
26
+ * Get current configuration
27
+ */
28
+ getConfig() {
29
+ return { ...this.config };
30
+ }
31
+ /**
32
+ * Sets the global prefix for all log messages
33
+ */
34
+ setGlobalPrefix(prefix) {
35
+ this.config.globalPrefix = prefix;
36
+ }
37
+ /**
38
+ * Sets the verbosity level for filtering log output
39
+ */
40
+ setVerbosity(level) {
41
+ this.config.verbosity = level;
42
+ }
43
+ /**
44
+ * Creates a scoped logger with a specific prefix
45
+ */
46
+ scope(prefix) {
47
+ const scopedLogger = new CoreLogger(this.config);
48
+ scopedLogger.scopedPrefix = prefix;
49
+ scopedLogger.handlers = [...this.handlers];
50
+ return scopedLogger;
51
+ }
52
+ /**
53
+ * Adds a custom log handler for extensibility
54
+ */
55
+ addHandler(handler) {
56
+ this.handlers.push(handler);
57
+ }
58
+ // ===== CORE LOGGING METHODS =====
59
+ /**
60
+ * Checks if a log level should be output based on current verbosity
61
+ */
62
+ shouldLog(level) {
63
+ if (this.config.verbosity === "silent") return false;
64
+ const levels = { debug: 0, info: 1, warn: 2, error: 3, critical: 4 };
65
+ return levels[level] >= levels[this.config.verbosity];
66
+ }
67
+ /**
68
+ * Gets the effective prefix (global + scoped)
69
+ */
70
+ getEffectivePrefix() {
71
+ const parts = [this.config.globalPrefix, this.scopedPrefix].filter(Boolean);
72
+ return parts.length > 0 ? parts.join(":") : void 0;
73
+ }
74
+ /**
75
+ * Core logging method with universal formatting
76
+ */
77
+ log(level, ...args) {
78
+ if (!this.shouldLog(level)) return;
79
+ const prefix = this.getEffectivePrefix();
80
+ const message = String(args[0] || "");
81
+ const stackInfo = this.config.enableStackTrace ? parseStackTrace() : null;
82
+ const consoleMethod = getConsoleMethod(level);
83
+ if (isBrowser && this.config.enableColors && supportsCSSColors()) {
84
+ try {
85
+ const [format, ...styles] = createStyledOutput(
86
+ level,
87
+ LEVEL_STYLES,
88
+ prefix,
89
+ message,
90
+ stackInfo,
91
+ this.config.autoDetectTheme
92
+ );
93
+ console[consoleMethod](format, ...styles, ...args.slice(1));
94
+ } catch (error2) {
95
+ const output = createPlainOutput(level, message, prefix, stackInfo);
96
+ console[consoleMethod](output, ...args.slice(1));
97
+ }
98
+ } else {
99
+ const groupIndent = " ".repeat(this.groupDepth);
100
+ const output = groupIndent + createPlainOutput(level, message, prefix, stackInfo);
101
+ console[consoleMethod](output, ...args.slice(1));
48
102
  }
49
- // ===== CONFIGURATION METHODS =====
50
- /**
51
- * Get current configuration
52
- */
53
- getConfig() {
54
- return { ...this.config };
103
+ const logEntry = createLogEntry(level, message, args, prefix, stackInfo);
104
+ const metadata = {
105
+ timestamp: logEntry.timestamp,
106
+ level,
107
+ prefix,
108
+ stackInfo: logEntry.location
109
+ };
110
+ this.handlers.forEach((handler) => {
111
+ try {
112
+ handler.handle(level, message, args, metadata);
113
+ } catch (error2) {
114
+ console.error("Log handler failed:", error2);
115
+ }
116
+ });
117
+ }
118
+ /**
119
+ * Logs debug information (lowest priority)
120
+ */
121
+ debug(...args) {
122
+ this.log("debug", ...args);
123
+ }
124
+ /**
125
+ * Logs informational messages
126
+ */
127
+ info(...args) {
128
+ this.log("info", ...args);
129
+ }
130
+ /**
131
+ * Logs warning messages
132
+ */
133
+ warn(...args) {
134
+ this.log("warn", ...args);
135
+ }
136
+ /**
137
+ * Logs error messages
138
+ */
139
+ error(...args) {
140
+ this.log("error", ...args);
141
+ }
142
+ /**
143
+ * Logs critical errors (highest priority)
144
+ */
145
+ critical(...args) {
146
+ this.log("critical", ...args);
147
+ }
148
+ /**
149
+ * Logs trace information (detailed debugging)
150
+ */
151
+ trace(...args) {
152
+ this.log("debug", ...args);
153
+ if (this.shouldLog("debug")) {
154
+ console.trace(...args);
55
155
  }
56
- /**
57
- * Sets the global prefix for all log messages
58
- */
59
- setGlobalPrefix(prefix) {
60
- this.config.globalPrefix = prefix;
156
+ }
157
+ // ===== BASIC ADVANCED FEATURES =====
158
+ /**
159
+ * Displays data in a table format
160
+ */
161
+ table(data, columns) {
162
+ if (!this.shouldLog("info")) return;
163
+ const prefix = this.getEffectivePrefix();
164
+ const tableHeader = `[TABLE]${prefix ? ` [${prefix}]` : ""}:`;
165
+ if (isBrowser && typeof console.table === "function") {
166
+ console.log(tableHeader);
167
+ if (columns) {
168
+ console.table(data, columns);
169
+ } else {
170
+ console.table(data);
171
+ }
172
+ } else {
173
+ console.log(tableHeader);
174
+ const tableText = formatTablePlain(data, columns);
175
+ console.log(tableText);
61
176
  }
62
- /**
63
- * Sets the verbosity level for filtering log output
64
- */
65
- setVerbosity(level) {
66
- this.config.verbosity = level;
177
+ }
178
+ /**
179
+ * Starts a collapsible group in the console
180
+ */
181
+ group(label, collapsed = false) {
182
+ const prefix = this.getEffectivePrefix();
183
+ const fullLabel = `${prefix ? `[${prefix}] ` : ""}${label}`;
184
+ if (isBrowser && console.group && console.groupCollapsed) {
185
+ if (collapsed) {
186
+ console.groupCollapsed(fullLabel);
187
+ } else {
188
+ console.group(fullLabel);
189
+ }
190
+ } else {
191
+ const groupStart = "┌─ " + fullLabel;
192
+ console.log(groupStart);
67
193
  }
68
- /**
69
- * Creates a scoped logger with a specific prefix
70
- */
71
- scope(prefix) {
72
- const scopedLogger = new CoreLogger(this.config);
73
- scopedLogger.scopedPrefix = prefix;
74
- scopedLogger.handlers = [...this.handlers];
75
- return scopedLogger;
194
+ this.groupDepth++;
195
+ }
196
+ /**
197
+ * Ends the current console group
198
+ */
199
+ groupEnd() {
200
+ if (this.groupDepth > 0) {
201
+ if (isBrowser && console.groupEnd) {
202
+ console.groupEnd();
203
+ } else {
204
+ const groupEnd2 = "└─ (end group)";
205
+ console.log(groupEnd2);
206
+ }
207
+ this.groupDepth--;
76
208
  }
77
- /**
78
- * Adds a custom log handler for extensibility
79
- */
80
- addHandler(handler) {
81
- this.handlers.push(handler);
209
+ }
210
+ /**
211
+ * Starts a timer with the given label
212
+ */
213
+ time(label) {
214
+ const startTime = this.getPerformanceNow();
215
+ const timer = {
216
+ label,
217
+ startTime
218
+ };
219
+ this.timers.set(label, timer);
220
+ const prefix = this.getEffectivePrefix();
221
+ const message = `Timer started: ${label}`;
222
+ const output = createPlainOutput("info", message, prefix);
223
+ console.log(output);
224
+ }
225
+ /**
226
+ * Ends a timer and logs the elapsed time
227
+ */
228
+ timeEnd(label) {
229
+ const timer = this.timers.get(label);
230
+ if (!timer) {
231
+ this.warn(`Timer '${label}' does not exist`);
232
+ return;
82
233
  }
83
- // ===== CORE LOGGING METHODS =====
84
- /**
85
- * Checks if a log level should be output based on current verbosity
86
- */
87
- shouldLog(level) {
88
- if (this.config.verbosity === 'silent')
89
- return false;
90
- const levels = { debug: 0, info: 1, warn: 2, error: 3, critical: 4 };
91
- return levels[level] >= levels[this.config.verbosity];
234
+ const elapsed = this.getPerformanceNow() - timer.startTime;
235
+ this.timers.delete(label);
236
+ const prefix = this.getEffectivePrefix();
237
+ const message = `Timer ended: ${label} - ${elapsed.toFixed(2)}ms`;
238
+ const output = createPlainOutput("info", message, prefix);
239
+ console.log(output);
240
+ }
241
+ /**
242
+ * Gets performance.now() or fallback for older environments
243
+ */
244
+ getPerformanceNow() {
245
+ if (typeof performance !== "undefined" && performance.now) {
246
+ return performance.now();
92
247
  }
93
- /**
94
- * Gets the effective prefix (global + scoped)
95
- */
96
- getEffectivePrefix() {
97
- const parts = [this.config.globalPrefix, this.scopedPrefix].filter(Boolean);
98
- return parts.length > 0 ? parts.join(':') : undefined;
99
- }
100
- /**
101
- * Core logging method with universal formatting
102
- */
103
- log(level, ...args) {
104
- if (!this.shouldLog(level))
105
- return;
106
- const prefix = this.getEffectivePrefix();
107
- const message = String(args[0] || '');
108
- const stackInfo = this.config.enableStackTrace ? parseStackTrace() : null;
109
- const consoleMethod = getConsoleMethod(level);
110
- // Choose formatting based on environment and configuration
111
- if (isBrowser && this.config.enableColors && supportsCSSColors()) {
112
- // Browser with CSS styling
113
- try {
114
- const [format, ...styles] = createStyledOutput(level, LEVEL_STYLES, prefix, message, stackInfo, this.config.autoDetectTheme);
115
- console[consoleMethod](format, ...styles, ...args.slice(1));
116
- }
117
- catch (error) {
118
- // Fallback to plain text if CSS fails
119
- const output = createPlainOutput(level, message, prefix, stackInfo);
120
- console[consoleMethod](output, ...args.slice(1));
121
- }
122
- }
123
- else {
124
- // Node.js or browser without colors - use plain text
125
- const groupIndent = ' '.repeat(this.groupDepth);
126
- const output = groupIndent + createPlainOutput(level, message, prefix, stackInfo);
127
- console[consoleMethod](output, ...args.slice(1));
128
- }
129
- // Call custom handlers with structured metadata
130
- const logEntry = createLogEntry(level, message, args, prefix, stackInfo);
131
- const metadata = {
132
- timestamp: logEntry.timestamp,
133
- level,
134
- prefix,
135
- stackInfo: logEntry.location,
136
- };
137
- this.handlers.forEach(handler => {
138
- try {
139
- handler.handle(level, message, args, metadata);
140
- }
141
- catch (error) {
142
- console.error('Log handler failed:', error);
143
- }
144
- });
145
- }
146
- /**
147
- * Logs debug information (lowest priority)
148
- */
149
- debug(...args) {
150
- this.log('debug', ...args);
151
- }
152
- /**
153
- * Logs informational messages
154
- */
155
- info(...args) {
156
- this.log('info', ...args);
157
- }
158
- /**
159
- * Logs warning messages
160
- */
161
- warn(...args) {
162
- this.log('warn', ...args);
163
- }
164
- /**
165
- * Logs error messages
166
- */
167
- error(...args) {
168
- this.log('error', ...args);
169
- }
170
- /**
171
- * Logs critical errors (highest priority)
172
- */
173
- critical(...args) {
174
- this.log('critical', ...args);
175
- }
176
- /**
177
- * Logs trace information (detailed debugging)
178
- */
179
- trace(...args) {
180
- this.log('debug', ...args);
181
- if (this.shouldLog('debug')) {
182
- console.trace(...args);
183
- }
184
- }
185
- // ===== BASIC ADVANCED FEATURES =====
186
- /**
187
- * Displays data in a table format
188
- */
189
- table(data, columns) {
190
- if (!this.shouldLog('info'))
191
- return;
192
- const prefix = this.getEffectivePrefix();
193
- const tableHeader = `[TABLE]${prefix ? ` [${prefix}]` : ''}:`;
194
- if (isBrowser && typeof console.table === 'function') {
195
- // Browser has native table support
196
- console.log(tableHeader);
197
- if (columns) {
198
- console.table(data, columns);
199
- }
200
- else {
201
- console.table(data);
202
- }
203
- }
204
- else {
205
- // Node.js or fallback - use plain text formatting
206
- console.log(tableHeader);
207
- const tableText = formatTablePlain(data, columns);
208
- console.log(tableText);
209
- }
210
- }
211
- /**
212
- * Starts a collapsible group in the console
213
- */
214
- group(label, collapsed = false) {
215
- const prefix = this.getEffectivePrefix();
216
- const fullLabel = `${prefix ? `[${prefix}] ` : ''}${label}`;
217
- if (isBrowser && console.group && console.groupCollapsed) {
218
- // Browser supports native grouping
219
- if (collapsed) {
220
- console.groupCollapsed(fullLabel);
221
- }
222
- else {
223
- console.group(fullLabel);
224
- }
225
- }
226
- else {
227
- // Node.js fallback - just log the group label
228
- const groupStart = '┌─ ' + fullLabel;
229
- console.log(groupStart);
230
- }
231
- this.groupDepth++;
232
- }
233
- /**
234
- * Ends the current console group
235
- */
236
- groupEnd() {
237
- if (this.groupDepth > 0) {
238
- if (isBrowser && console.groupEnd) {
239
- console.groupEnd();
240
- }
241
- else {
242
- // Node.js fallback - log group end
243
- const groupEnd = '└─ (end group)';
244
- console.log(groupEnd);
245
- }
246
- this.groupDepth--;
247
- }
248
- }
249
- /**
250
- * Starts a timer with the given label
251
- */
252
- time(label) {
253
- const startTime = this.getPerformanceNow();
254
- const timer = {
255
- label,
256
- startTime,
257
- };
258
- this.timers.set(label, timer);
259
- const prefix = this.getEffectivePrefix();
260
- const message = `Timer started: ${label}`;
261
- const output = createPlainOutput('info', message, prefix);
262
- console.log(output);
263
- }
264
- /**
265
- * Ends a timer and logs the elapsed time
266
- */
267
- timeEnd(label) {
268
- const timer = this.timers.get(label);
269
- if (!timer) {
270
- this.warn(`Timer '${label}' does not exist`);
271
- return;
272
- }
273
- const elapsed = this.getPerformanceNow() - timer.startTime;
274
- this.timers.delete(label);
275
- const prefix = this.getEffectivePrefix();
276
- const message = `Timer ended: ${label} - ${elapsed.toFixed(2)}ms`;
277
- const output = createPlainOutput('info', message, prefix);
278
- console.log(output);
279
- }
280
- /**
281
- * Gets performance.now() or fallback for older environments
282
- */
283
- getPerformanceNow() {
284
- if (typeof performance !== 'undefined' && performance.now) {
285
- return performance.now();
286
- }
287
- if (isNode && process.hrtime) {
288
- // Node.js high-resolution time
289
- const [seconds, nanoseconds] = process.hrtime();
290
- return seconds * 1000 + nanoseconds / 1000000;
291
- }
292
- // Fallback to Date.now()
293
- return Date.now();
248
+ if (isNode && process.hrtime) {
249
+ const [seconds, nanoseconds] = process.hrtime();
250
+ return seconds * 1e3 + nanoseconds / 1e6;
294
251
  }
252
+ return Date.now();
253
+ }
295
254
  }
296
- // Create and export singleton instance for convenience
297
255
  const coreLogger = new CoreLogger();
298
- /**
299
- * Export individual methods for convenience (with proper binding)
300
- */
301
- export const debug = (...args) => coreLogger.debug(...args);
302
- export const info = (...args) => coreLogger.info(...args);
303
- export const warn = (...args) => coreLogger.warn(...args);
304
- export const error = (...args) => coreLogger.error(...args);
305
- export const critical = (...args) => coreLogger.critical(...args);
306
- export const trace = (...args) => coreLogger.trace(...args);
307
- export const table = (data, columns) => coreLogger.table(data, columns);
308
- export const group = (label, collapsed) => coreLogger.group(label, collapsed);
309
- export const groupEnd = () => coreLogger.groupEnd();
310
- export const time = (label) => coreLogger.time(label);
311
- export const timeEnd = (label) => coreLogger.timeEnd(label);
312
- export const setGlobalPrefix = (prefix) => coreLogger.setGlobalPrefix(prefix);
313
- export const scope = (prefix) => coreLogger.scope(prefix);
314
- export const setVerbosity = (level) => coreLogger.setVerbosity(level);
315
- export const addHandler = (handler) => coreLogger.addHandler(handler);
316
- // Export the singleton as default
317
- export default coreLogger;
256
+ const debug = (...args) => coreLogger.debug(...args);
257
+ const info = (...args) => coreLogger.info(...args);
258
+ const warn = (...args) => coreLogger.warn(...args);
259
+ const error = (...args) => coreLogger.error(...args);
260
+ const critical = (...args) => coreLogger.critical(...args);
261
+ const trace = (...args) => coreLogger.trace(...args);
262
+ const table = (data, columns) => coreLogger.table(data, columns);
263
+ const group = (label, collapsed) => coreLogger.group(label, collapsed);
264
+ const groupEnd = () => coreLogger.groupEnd();
265
+ const time = (label) => coreLogger.time(label);
266
+ const timeEnd = (label) => coreLogger.timeEnd(label);
267
+ const setGlobalPrefix = (prefix) => coreLogger.setGlobalPrefix(prefix);
268
+ const scope = (prefix) => coreLogger.scope(prefix);
269
+ const setVerbosity = (level) => coreLogger.setVerbosity(level);
270
+ const addHandler = (handler) => coreLogger.addHandler(handler);
271
+ export {
272
+ CoreLogger,
273
+ addHandler,
274
+ critical,
275
+ debug,
276
+ coreLogger as default,
277
+ error,
278
+ group,
279
+ groupEnd,
280
+ info,
281
+ scope,
282
+ setGlobalPrefix,
283
+ setVerbosity,
284
+ table,
285
+ time,
286
+ timeEnd,
287
+ trace,
288
+ warn
289
+ };
290
+ //# sourceMappingURL=core.js.map
package/dist/exports.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("./chunks/Logger-D_p3xnbq.js");require("./chunks/environment-Dm66zOML.js");const r=require("./chunks/RemoteLogHandler-ymkQ97xl.js");class ExportLogger extends e.Logger{exportLogHandler;remoteHandlers=[];constructor(r={}){super(r),r.bufferSize&&(this.exportLogHandler=new e.ExportLogHandler(r.bufferSize),this.addHandler(this.exportLogHandler))}async exportLogs(e,r){if(!this.exportLogHandler)throw new Error("Export handler not initialized. Set bufferSize in constructor.");return JSON.stringify([])}getLogs(){return this.exportLogHandler,[]}clearLogs(){this.exportLogHandler}getLogStats(){return this.exportLogHandler,{}}addRemoteHandler(e,t){const o=new r.RemoteLogHandler(e,t);this.remoteHandlers.push(o),this.addHandler(o)}clearRemoteHandlers(){const e=this.getHandlers();this.remoteHandlers.forEach(r=>{const t=e.indexOf(r);t>-1&&e.splice(t,1)}),this.remoteHandlers=[]}async flushRemoteHandlers(){const e=this.remoteHandlers.map(e=>Promise.resolve());await Promise.all(e)}}const t=new ExportLogger({bufferSize:1e3}),o={exportCSV:async e=>await t.exportLogs("csv",e),exportJSON:async e=>await t.exportLogs("json",e),exportXML:async e=>await t.exportLogs("xml",e),getStats:()=>t.getLogStats(),clear(){t.clearLogs()}},s={addEndpoint(e,r){t.addRemoteHandler(e,r)},clearEndpoints(){t.clearRemoteHandlers()},async flush(){await t.flushRemoteHandlers()}};exports.ExportLogHandler=e.ExportLogHandler,exports.RemoteLogHandler=r.RemoteLogHandler,exports.ExportLogger=ExportLogger,exports.addHandler=e=>t.addHandler(e),exports.addRemoteHandler=(e,r)=>t.addRemoteHandler(e,r),exports.clearLogs=()=>t.clearLogs(),exports.clearRemoteHandlers=()=>t.clearRemoteHandlers(),exports.critical=(...e)=>t.critical(...e),exports.debug=(...e)=>t.debug(...e),exports.default=t,exports.error=(...e)=>t.error(...e),exports.exportLogs=async(e,r)=>await t.exportLogs(e,r),exports.exportUtils=o,exports.flushRemoteHandlers=async()=>await t.flushRemoteHandlers(),exports.getLogStats=()=>t.getLogStats(),exports.getLogs=()=>t.getLogs(),exports.group=(e,r)=>t.group(e,r),exports.groupEnd=()=>t.groupEnd(),exports.info=(...e)=>t.info(...e),exports.remoteUtils=s,exports.scope=e=>t.scope(e),exports.setGlobalPrefix=e=>t.setGlobalPrefix(e),exports.setVerbosity=e=>t.setVerbosity(e),exports.success=(...e)=>t.success(...e),exports.table=(e,r)=>t.table(e,r),exports.time=e=>t.time(e),exports.timeEnd=e=>t.timeEnd(e),exports.trace=(...e)=>t.trace(...e),exports.warn=(...e)=>t.warn(...e);
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("./chunks/Logger-D8pK7XXt.js");require("./chunks/environment-Dm66zOML.js");const r=require("./chunks/RemoteLogHandler-ymkQ97xl.js");class ExportLogger extends e.Logger{exportLogHandler;remoteHandlers=[];constructor(r={}){super(r),r.bufferSize&&(this.exportLogHandler=new e.ExportLogHandler(r.bufferSize),this.addHandler(this.exportLogHandler))}async exportLogs(e,r){if(!this.exportLogHandler)throw new Error("Export handler not initialized. Set bufferSize in constructor.");return JSON.stringify([])}getLogs(){return this.exportLogHandler,[]}clearLogs(){this.exportLogHandler}getLogStats(){return this.exportLogHandler,{}}addRemoteHandler(e,t){const o=new r.RemoteLogHandler(e,t);this.remoteHandlers.push(o),this.addHandler(o)}clearRemoteHandlers(){const e=this.getHandlers();this.remoteHandlers.forEach(r=>{const t=e.indexOf(r);t>-1&&e.splice(t,1)}),this.remoteHandlers=[]}async flushRemoteHandlers(){const e=this.remoteHandlers.map(e=>Promise.resolve());await Promise.all(e)}}const t=new ExportLogger({bufferSize:1e3}),o={exportCSV:async e=>await t.exportLogs("csv",e),exportJSON:async e=>await t.exportLogs("json",e),exportXML:async e=>await t.exportLogs("xml",e),getStats:()=>t.getLogStats(),clear(){t.clearLogs()}},s={addEndpoint(e,r){t.addRemoteHandler(e,r)},clearEndpoints(){t.clearRemoteHandlers()},async flush(){await t.flushRemoteHandlers()}};exports.ExportLogHandler=e.ExportLogHandler,exports.RemoteLogHandler=r.RemoteLogHandler,exports.ExportLogger=ExportLogger,exports.addHandler=e=>t.addHandler(e),exports.addRemoteHandler=(e,r)=>t.addRemoteHandler(e,r),exports.clearLogs=()=>t.clearLogs(),exports.clearRemoteHandlers=()=>t.clearRemoteHandlers(),exports.critical=(...e)=>t.critical(...e),exports.debug=(...e)=>t.debug(...e),exports.default=t,exports.error=(...e)=>t.error(...e),exports.exportLogs=async(e,r)=>await t.exportLogs(e,r),exports.exportUtils=o,exports.flushRemoteHandlers=async()=>await t.flushRemoteHandlers(),exports.getLogStats=()=>t.getLogStats(),exports.getLogs=()=>t.getLogs(),exports.group=(e,r)=>t.group(e,r),exports.groupEnd=()=>t.groupEnd(),exports.info=(...e)=>t.info(...e),exports.remoteUtils=s,exports.scope=e=>t.scope(e),exports.setGlobalPrefix=e=>t.setGlobalPrefix(e),exports.setVerbosity=e=>t.setVerbosity(e),exports.success=(...e)=>t.success(...e),exports.table=(e,r)=>t.table(e,r),exports.time=e=>t.time(e),exports.timeEnd=e=>t.timeEnd(e),exports.trace=(...e)=>t.trace(...e),exports.warn=(...e)=>t.warn(...e);
2
2
  //# sourceMappingURL=exports.cjs.map
package/dist/exports.js CHANGED
@@ -1,4 +1,4 @@
1
- import { L as Logger, E as ExportLogHandler } from "./chunks/Logger-Crw1woqR.js";
1
+ import { L as Logger, E as ExportLogHandler } from "./chunks/Logger-CTAaDeZi.js";
2
2
  import "./chunks/environment-Bxbnw4pd.js";
3
3
  import { R as RemoteLogHandler } from "./chunks/RemoteLogHandler-CjWpWZGl.js";
4
4
  class ExportLogger extends Logger {
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("./chunks/Logger-D_p3xnbq.js"),t=require("./chunks/environment-Dm66zOML.js"),s=require("./chunks/formatting-DNCAV66-.js"),r=require("./chunks/RemoteLogHandler-ymkQ97xl.js"),o=new e.Logger,i={success:t.StylePresets.success().build(),error:t.StylePresets.error().build(),warning:t.StylePresets.warning().build(),info:t.StylePresets.info().build(),accent:t.StylePresets.accent().build()};exports.BANNER_VARIANTS=e.BANNER_VARIANTS,exports.Logger=e.Logger,exports.THEME_BANNERS=e.THEME_BANNERS,exports.THEME_PRESETS=e.THEME_PRESETS,exports.DEFAULT_CONFIG=t.DEFAULT_CONFIG,exports.StyleBuilder=t.StyleBuilder,exports.StylePresets=t.StylePresets,exports.formatTimestamp=t.formatTimestamp,exports.parseStackTrace=t.parseStackTrace,exports.RemoteLogHandler=r.RemoteLogHandler,exports.AnalyticsLogHandler=class{handle(e,t,s,r){"error"!==e&&"critical"!==e||r.timestamp}},exports.FileLogHandler=class{filename;maxSize;fs;constructor(e="app.log",s){if(this.filename=e,this.maxSize=s,t.isNode)try{this.fs=require("fs")}catch(r){console.warn("FileLogHandler: Unable to load fs module:",r)}}handle(e,r,o,i){const l={timestamp:i.timestamp,level:e.toUpperCase(),prefix:i.prefix,message:r,args:o.slice(1).map(e=>s.safeSerialize(e)),location:i.stackInfo},a=this.formatLogLine(l);t.isNode&&this.fs?this.writeToFileNode(a):t.isBrowser?this.writeToFileLocal(a):console.log(`[FILE-LOG] ${a}`)}formatLogLine(e){let t=[e.timestamp,`[${e.level}]`,e.prefix?`[${e.prefix}]`:"",e.message].filter(Boolean).join(" ");return e.args&&e.args.length>0&&(t+=" "+e.args.map(e=>"object"==typeof e?JSON.stringify(e):String(e)).join(" ")),e.location&&(t+=` (${e.location.file}:${e.location.line}:${e.location.column})`),t}writeToFileNode(e){if(this.fs)try{if(this.maxSize)try{if(this.fs.statSync(this.filename).size>this.maxSize){const e=`${this.filename}.bak`;this.fs.renameSync(this.filename,e)}}catch(t){}this.fs.appendFileSync(this.filename,e+"\n","utf8")}catch(t){console.error("FileLogHandler: Failed to write to file:",t)}}writeToFileLocal(e){try{const t=`logger_${this.filename}`,s=localStorage.getItem(t)||"";let r=s;if(s.length>0&&(r+="\n"),r+=e,this.maxSize||r.split("\n").length>1e3){const e=r.split("\n"),t=this.maxSize?Math.floor(this.maxSize/100):1e3;e.length>t&&(r=e.slice(-t).join("\n"))}localStorage.setItem(t,r)}catch(t){console.error("FileLogHandler: Failed to write to localStorage:",t)}}getLogs(){if(t.isNode&&this.fs)try{return this.fs.readFileSync(this.filename,"utf8")}catch(e){return null}else if(t.isBrowser){const e=`logger_${this.filename}`;return localStorage.getItem(e)}return null}clearLogs(){if(t.isNode&&this.fs)try{this.fs.writeFileSync(this.filename,"","utf8")}catch(e){console.error("FileLogHandler: Failed to clear file:",e)}else if(t.isBrowser){const e=`logger_${this.filename}`;localStorage.removeItem(e)}}},exports.addHandler=e=>o.addHandler(e),exports.cli=e=>o.cli(e),exports.createStyle=()=>new t.StyleBuilder,exports.critical=(...e)=>o.critical(...e),exports.debug=(...e)=>o.debug(...e),exports.default=o,exports.error=(...e)=>o.error(...e),exports.group=(e,t)=>o.group(e,t),exports.groupEnd=()=>o.groupEnd(),exports.info=(...e)=>o.info(...e),exports.logAnimated=(e,t)=>o.logAnimated(e,t),exports.logWithSVG=(e,t,s)=>o.logWithSVG(e,t,s),exports.scope=e=>o.scope(e),exports.setBannerType=e=>o.setBannerType(e),exports.setGlobalPrefix=e=>o.setGlobalPrefix(e),exports.setTheme=e=>o.setTheme(e),exports.setVerbosity=e=>o.setVerbosity(e),exports.showBanner=e=>o.showBanner(e),exports.stylePresets=i,exports.success=(...e)=>o.success(...e),exports.table=(e,t)=>o.table(e,t),exports.time=e=>o.time(e),exports.timeEnd=e=>o.timeEnd(e),exports.trace=(...e)=>o.trace(...e),exports.warn=(...e)=>o.warn(...e);
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("./chunks/Logger-D8pK7XXt.js"),t=require("./chunks/environment-Dm66zOML.js"),r=require("./chunks/formatting-DNCAV66-.js"),o=require("./chunks/RemoteLogHandler-ymkQ97xl.js");let s=null;function getLogger(){return s||(s=new e.Logger),s}const i=getLogger(),l={success:t.StylePresets.success().build(),error:t.StylePresets.error().build(),warning:t.StylePresets.warning().build(),info:t.StylePresets.info().build(),accent:t.StylePresets.accent().build()};exports.BANNER_VARIANTS=e.BANNER_VARIANTS,exports.Logger=e.Logger,exports.THEME_BANNERS=e.THEME_BANNERS,exports.THEME_PRESETS=e.THEME_PRESETS,exports.DEFAULT_CONFIG=t.DEFAULT_CONFIG,exports.StyleBuilder=t.StyleBuilder,exports.StylePresets=t.StylePresets,exports.formatTimestamp=t.formatTimestamp,exports.parseStackTrace=t.parseStackTrace,exports.RemoteLogHandler=o.RemoteLogHandler,exports.AnalyticsLogHandler=class{handle(e,t,r,o){"error"!==e&&"critical"!==e||o.timestamp}},exports.FileLogHandler=class{filename;maxSize;fs;constructor(e="app.log",r){if(this.filename=e,this.maxSize=r,t.isNode)try{this.fs=require("fs")}catch(o){console.warn("FileLogHandler: Unable to load fs module:",o)}}handle(e,o,s,i){const l={timestamp:i.timestamp,level:e.toUpperCase(),prefix:i.prefix,message:o,args:s.slice(1).map(e=>r.safeSerialize(e)),location:i.stackInfo},g=this.formatLogLine(l);t.isNode&&this.fs?this.writeToFileNode(g):t.isBrowser?this.writeToFileLocal(g):console.log(`[FILE-LOG] ${g}`)}formatLogLine(e){let t=[e.timestamp,`[${e.level}]`,e.prefix?`[${e.prefix}]`:"",e.message].filter(Boolean).join(" ");return e.args&&e.args.length>0&&(t+=" "+e.args.map(e=>"object"==typeof e?JSON.stringify(e):String(e)).join(" ")),e.location&&(t+=` (${e.location.file}:${e.location.line}:${e.location.column})`),t}writeToFileNode(e){if(this.fs)try{if(this.maxSize)try{if(this.fs.statSync(this.filename).size>this.maxSize){const e=`${this.filename}.bak`;this.fs.renameSync(this.filename,e)}}catch(t){}this.fs.appendFileSync(this.filename,e+"\n","utf8")}catch(t){console.error("FileLogHandler: Failed to write to file:",t)}}writeToFileLocal(e){try{const t=`logger_${this.filename}`,r=localStorage.getItem(t)||"";let o=r;if(r.length>0&&(o+="\n"),o+=e,this.maxSize||o.split("\n").length>1e3){const e=o.split("\n"),t=this.maxSize?Math.floor(this.maxSize/100):1e3;e.length>t&&(o=e.slice(-t).join("\n"))}localStorage.setItem(t,o)}catch(t){console.error("FileLogHandler: Failed to write to localStorage:",t)}}getLogs(){if(t.isNode&&this.fs)try{return this.fs.readFileSync(this.filename,"utf8")}catch(e){return null}else if(t.isBrowser){const e=`logger_${this.filename}`;return localStorage.getItem(e)}return null}clearLogs(){if(t.isNode&&this.fs)try{this.fs.writeFileSync(this.filename,"","utf8")}catch(e){console.error("FileLogHandler: Failed to clear file:",e)}else if(t.isBrowser){const e=`logger_${this.filename}`;localStorage.removeItem(e)}}},exports.addHandler=e=>getLogger().addHandler(e),exports.cli=e=>getLogger().cli(e),exports.createStyle=()=>new t.StyleBuilder,exports.critical=(...e)=>getLogger().critical(...e),exports.debug=(...e)=>getLogger().debug(...e),exports.default=i,exports.error=(...e)=>getLogger().error(...e),exports.group=(e,t)=>getLogger().group(e,t),exports.groupEnd=()=>getLogger().groupEnd(),exports.info=(...e)=>getLogger().info(...e),exports.logAnimated=(e,t)=>getLogger().logAnimated(e,t),exports.logWithSVG=(e,t,r)=>getLogger().logWithSVG(e,t,r),exports.scope=e=>getLogger().scope(e),exports.setBannerType=e=>getLogger().setBannerType(e),exports.setGlobalPrefix=e=>getLogger().setGlobalPrefix(e),exports.setTheme=e=>getLogger().setTheme(e),exports.setVerbosity=e=>getLogger().setVerbosity(e),exports.showBanner=e=>getLogger().showBanner(e),exports.stylePresets=l,exports.success=(...e)=>getLogger().success(...e),exports.table=(e,t)=>getLogger().table(e,t),exports.time=e=>getLogger().time(e),exports.timeEnd=e=>getLogger().timeEnd(e),exports.trace=(...e)=>getLogger().trace(...e),exports.warn=(...e)=>getLogger().warn(...e);
2
2
  //# sourceMappingURL=index.cjs.map