@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.
- package/dist/chunks/{Logger-Crw1woqR.js → Logger-CTAaDeZi.js} +49 -16
- package/dist/chunks/{Logger-Crw1woqR.js.map → Logger-CTAaDeZi.js.map} +1 -1
- package/dist/chunks/{Logger-D_p3xnbq.js → Logger-D8pK7XXt.js} +2 -2
- package/dist/chunks/{Logger-D_p3xnbq.js.map → Logger-D8pK7XXt.js.map} +1 -1
- package/dist/chunks/ScopedLogger-D-7q8uVP.js +2 -0
- package/dist/chunks/ScopedLogger-D-7q8uVP.js.map +1 -0
- package/dist/chunks/ScopedLogger-hS0qSkZD.js +361 -0
- package/dist/chunks/ScopedLogger-hS0qSkZD.js.map +1 -0
- package/dist/core.js +280 -307
- package/dist/exports.cjs +1 -1
- package/dist/exports.js +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +226 -159
- package/dist/index.js.map +1 -1
- package/dist/styling.cjs +1 -1
- package/dist/styling.js +2 -2
- package/dist/types/Logger.d.ts +11 -7
- package/dist/types/Logger.d.ts.map +1 -1
- package/dist/types/core.d.ts +122 -216
- package/dist/types/core.d.ts.map +1 -1
- package/dist/types/index.d.ts +119 -4
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +2 -1
- package/src/Logger.ts +99 -58
- package/src/index.ts +32 -25
- package/dist/.tsbuildinfo +0 -1
- package/dist/Logger.d.ts +0 -708
- package/dist/Logger.d.ts.map +0 -1
- package/dist/Logger.js +0 -1124
- package/dist/ScopedLogger.d.ts +0 -318
- package/dist/ScopedLogger.d.ts.map +0 -1
- package/dist/ScopedLogger.js +0 -426
- package/dist/cli/CommandProcessor.d.ts +0 -103
- package/dist/cli/CommandProcessor.d.ts.map +0 -1
- package/dist/cli/CommandProcessor.js +0 -184
- package/dist/cli/commands/ConfigCommand.d.ts +0 -17
- package/dist/cli/commands/ConfigCommand.d.ts.map +0 -1
- package/dist/cli/commands/ConfigCommand.js +0 -88
- package/dist/cli/commands/ExportCommand.d.ts +0 -51
- package/dist/cli/commands/ExportCommand.d.ts.map +0 -1
- package/dist/cli/commands/ExportCommand.js +0 -243
- package/dist/cli/commands/HistoryCommand.d.ts +0 -50
- package/dist/cli/commands/HistoryCommand.d.ts.map +0 -1
- package/dist/cli/commands/HistoryCommand.js +0 -96
- package/dist/cli/commands/StatusCommand.d.ts +0 -33
- package/dist/cli/commands/StatusCommand.d.ts.map +0 -1
- package/dist/cli/commands/StatusCommand.js +0 -93
- package/dist/cli/commands/ThemeCommand.d.ts +0 -33
- package/dist/cli/commands/ThemeCommand.d.ts.map +0 -1
- package/dist/cli/commands/ThemeCommand.js +0 -79
- package/dist/cli/help.d.ts +0 -15
- package/dist/cli/help.d.ts.map +0 -1
- package/dist/cli/help.js +0 -118
- package/dist/cli/index.d.ts +0 -15
- package/dist/cli/index.d.ts.map +0 -1
- package/dist/cli/index.js +0 -46
- package/dist/constants.d.ts +0 -122
- package/dist/constants.d.ts.map +0 -1
- package/dist/constants.js +0 -159
- package/dist/core.d.ts +0 -134
- package/dist/core.d.ts.map +0 -1
- package/dist/example.d.ts +0 -18
- package/dist/example.d.ts.map +0 -1
- package/dist/example.js +0 -154
- package/dist/exports-module.d.ts +0 -203
- package/dist/exports-module.d.ts.map +0 -1
- package/dist/exports-module.js +0 -260
- package/dist/handlers/AnalyticsLogHandler.d.ts +0 -11
- package/dist/handlers/AnalyticsLogHandler.d.ts.map +0 -1
- package/dist/handlers/AnalyticsLogHandler.js +0 -19
- package/dist/handlers/ExportLogHandler.d.ts +0 -103
- package/dist/handlers/ExportLogHandler.d.ts.map +0 -1
- package/dist/handlers/ExportLogHandler.js +0 -516
- package/dist/handlers/FileLogHandler.d.ts +0 -36
- package/dist/handlers/FileLogHandler.d.ts.map +0 -1
- package/dist/handlers/FileLogHandler.js +0 -156
- package/dist/handlers/RemoteLogHandler.d.ts +0 -14
- package/dist/handlers/RemoteLogHandler.d.ts.map +0 -1
- package/dist/handlers/RemoteLogHandler.js +0 -37
- package/dist/handlers/index.d.ts +0 -8
- package/dist/handlers/index.d.ts.map +0 -1
- package/dist/handlers/index.js +0 -7
- package/dist/index.d.ts +0 -157
- package/dist/index.d.ts.map +0 -1
- package/dist/main.d.ts +0 -2
- package/dist/main.d.ts.map +0 -1
- package/dist/main.js +0 -139
- package/dist/styling/LogStyleBuilder.d.ts +0 -149
- package/dist/styling/LogStyleBuilder.d.ts.map +0 -1
- package/dist/styling/LogStyleBuilder.js +0 -289
- package/dist/styling/SemanticStyles.d.ts +0 -181
- package/dist/styling/SemanticStyles.d.ts.map +0 -1
- package/dist/styling/SemanticStyles.js +0 -339
- package/dist/styling/SmartPresets.d.ts +0 -25
- package/dist/styling/SmartPresets.d.ts.map +0 -1
- package/dist/styling/SmartPresets.js +0 -276
- package/dist/styling/StyleBuilder.d.ts +0 -140
- package/dist/styling/StyleBuilder.d.ts.map +0 -1
- package/dist/styling/StyleBuilder.js +0 -280
- package/dist/styling/banners.d.ts +0 -45
- package/dist/styling/banners.d.ts.map +0 -1
- package/dist/styling/banners.js +0 -155
- package/dist/styling/index.d.ts +0 -10
- package/dist/styling/index.d.ts.map +0 -1
- package/dist/styling/index.js +0 -9
- package/dist/styling/themes.d.ts +0 -10
- package/dist/styling/themes.d.ts.map +0 -1
- package/dist/styling/themes.js +0 -231
- package/dist/styling-module.d.ts +0 -185
- package/dist/styling-module.d.ts.map +0 -1
- package/dist/styling-module.js +0 -199
- package/dist/types/core.js +0 -28
- package/dist/types/handlers.d.ts +0 -88
- package/dist/types/handlers.d.ts.map +0 -1
- package/dist/types/handlers.js +0 -4
- package/dist/types/index.js +0 -4
- package/dist/utils/environment.d.ts +0 -47
- package/dist/utils/environment.d.ts.map +0 -1
- package/dist/utils/environment.js +0 -85
- package/dist/utils/formatting.d.ts +0 -40
- package/dist/utils/formatting.d.ts.map +0 -1
- package/dist/utils/formatting.js +0 -117
- package/dist/utils/index.d.ts +0 -7
- package/dist/utils/index.d.ts.map +0 -1
- package/dist/utils/index.js +0 -6
- package/dist/utils/opentui-detection.d.ts +0 -34
- package/dist/utils/opentui-detection.d.ts.map +0 -1
- package/dist/utils/opentui-detection.js +0 -116
- package/dist/utils/output.d.ts +0 -44
- package/dist/utils/output.d.ts.map +0 -1
- package/dist/utils/output.js +0 -150
- package/dist/utils/stackTrace.d.ts +0 -9
- package/dist/utils/stackTrace.d.ts.map +0 -1
- package/dist/utils/stackTrace.js +0 -81
- package/dist/utils/timestamps.d.ts +0 -20
- package/dist/utils/timestamps.d.ts.map +0 -1
- package/dist/utils/timestamps.js +0 -71
package/dist/core.js
CHANGED
|
@@ -1,317 +1,290 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
config;
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
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
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
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
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
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
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
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
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
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
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
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
|
-
|
|
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
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
export
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
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-
|
|
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-
|
|
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-
|
|
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
|