@coherent.js/devtools 1.0.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +66 -0
- package/dist/index.js +2117 -0
- package/dist/index.js.map +7 -0
- package/dist/inspector.js +397 -0
- package/dist/inspector.js.map +7 -0
- package/dist/logger.js +469 -0
- package/dist/logger.js.map +7 -0
- package/dist/profiler.js +508 -0
- package/dist/profiler.js.map +7 -0
- package/package.json +43 -0
- package/types/index.d.ts +214 -0
package/dist/logger.js
ADDED
|
@@ -0,0 +1,469 @@
|
|
|
1
|
+
// src/logger.js
|
|
2
|
+
var LogLevel = {
|
|
3
|
+
TRACE: 0,
|
|
4
|
+
DEBUG: 1,
|
|
5
|
+
INFO: 2,
|
|
6
|
+
WARN: 3,
|
|
7
|
+
ERROR: 4,
|
|
8
|
+
FATAL: 5
|
|
9
|
+
};
|
|
10
|
+
var DevLogger = class _DevLogger {
|
|
11
|
+
constructor(options = {}) {
|
|
12
|
+
this.options = {
|
|
13
|
+
level: options.level !== void 0 ? options.level : LogLevel.INFO,
|
|
14
|
+
prefix: "[Coherent]",
|
|
15
|
+
timestamp: true,
|
|
16
|
+
colors: true,
|
|
17
|
+
maxLogs: 1e3,
|
|
18
|
+
maxBufferSize: options.maxBufferSize || 1e3,
|
|
19
|
+
grouping: true,
|
|
20
|
+
buffer: options.buffer || false,
|
|
21
|
+
sampleRate: options.sampleRate !== void 0 ? options.sampleRate : 1,
|
|
22
|
+
silent: options.silent || false,
|
|
23
|
+
output: options.output || null,
|
|
24
|
+
categories: options.categories || null,
|
|
25
|
+
filter: options.filter || null,
|
|
26
|
+
...options
|
|
27
|
+
};
|
|
28
|
+
this.logs = [];
|
|
29
|
+
this.groups = [];
|
|
30
|
+
this.filters = [];
|
|
31
|
+
this.handlers = [];
|
|
32
|
+
this.context = {};
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Generic log method (supports category logging)
|
|
36
|
+
*/
|
|
37
|
+
log(categoryOrLevel, messageOrData, data) {
|
|
38
|
+
if (typeof categoryOrLevel === "string" && typeof messageOrData === "string") {
|
|
39
|
+
return this.logWithLevel(LogLevel.INFO, messageOrData, { category: categoryOrLevel, ...data });
|
|
40
|
+
}
|
|
41
|
+
return this.logWithLevel(categoryOrLevel, messageOrData, data);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Log a trace message
|
|
45
|
+
*/
|
|
46
|
+
trace(message, data = {}) {
|
|
47
|
+
return this.logWithLevel(LogLevel.TRACE, message, data);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Log a debug message
|
|
51
|
+
*/
|
|
52
|
+
debug(message, data = {}) {
|
|
53
|
+
return this.log(LogLevel.DEBUG, message, data);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Log an info message
|
|
57
|
+
*/
|
|
58
|
+
info(message, data = {}) {
|
|
59
|
+
return this.log(LogLevel.INFO, message, data);
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Log a warning
|
|
63
|
+
*/
|
|
64
|
+
warn(message, data = {}) {
|
|
65
|
+
return this.log(LogLevel.WARN, message, data);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Log an error
|
|
69
|
+
*/
|
|
70
|
+
error(message, data = {}) {
|
|
71
|
+
if (data instanceof Error) {
|
|
72
|
+
data = {
|
|
73
|
+
message: data.message,
|
|
74
|
+
stack: data.stack,
|
|
75
|
+
name: data.name,
|
|
76
|
+
...data
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
return this.logWithLevel(LogLevel.ERROR, message, data);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Log a fatal error
|
|
83
|
+
*/
|
|
84
|
+
fatal(message, data = {}) {
|
|
85
|
+
return this.log(LogLevel.FATAL, message, data);
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Core logging function
|
|
89
|
+
*/
|
|
90
|
+
logWithLevel(level, message, data = {}) {
|
|
91
|
+
if (this.options.sampleRate < 1 && Math.random() > this.options.sampleRate) {
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
if (level < this.options.level) {
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
if (!this.shouldLog(level, message, data)) {
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
const mergedData = { ...this.context, ...data };
|
|
101
|
+
const logEntry = {
|
|
102
|
+
id: this.generateId(),
|
|
103
|
+
level,
|
|
104
|
+
levelName: this.getLevelName(level),
|
|
105
|
+
message,
|
|
106
|
+
data: mergedData,
|
|
107
|
+
timestamp: Date.now(),
|
|
108
|
+
group: this.groups.length > 0 ? this.groups[this.groups.length - 1] : null,
|
|
109
|
+
stack: level >= LogLevel.ERROR ? new Error().stack : null
|
|
110
|
+
};
|
|
111
|
+
this.logs.push(logEntry);
|
|
112
|
+
const maxSize = this.options.buffer ? this.options.maxBufferSize : this.options.maxLogs;
|
|
113
|
+
if (this.logs.length > maxSize) {
|
|
114
|
+
this.logs.shift();
|
|
115
|
+
}
|
|
116
|
+
this.handlers.forEach((handler) => {
|
|
117
|
+
try {
|
|
118
|
+
handler(logEntry);
|
|
119
|
+
} catch (error) {
|
|
120
|
+
console.error("Error in log handler:", error);
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
this.output(logEntry);
|
|
124
|
+
return logEntry;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Output log to console
|
|
128
|
+
*/
|
|
129
|
+
output(logEntry) {
|
|
130
|
+
const parts = [];
|
|
131
|
+
if (this.options.timestamp) {
|
|
132
|
+
const date = new Date(logEntry.timestamp);
|
|
133
|
+
parts.push(`[${date.toISOString()}]`);
|
|
134
|
+
}
|
|
135
|
+
if (this.options.prefix) {
|
|
136
|
+
parts.push(this.options.prefix);
|
|
137
|
+
}
|
|
138
|
+
parts.push(`[${logEntry.levelName}]`);
|
|
139
|
+
if (logEntry.group) {
|
|
140
|
+
parts.push(`[${logEntry.group}]`);
|
|
141
|
+
}
|
|
142
|
+
parts.push(logEntry.message);
|
|
143
|
+
const contextKeys = Object.keys(logEntry.data);
|
|
144
|
+
if (contextKeys.length > 0) {
|
|
145
|
+
const contextStr = contextKeys.map((key) => `${key}=${logEntry.data[key]}`).join(" ");
|
|
146
|
+
parts.push(`{${contextStr}}`);
|
|
147
|
+
}
|
|
148
|
+
const output = parts.join(" ");
|
|
149
|
+
if (this.options.silent) {
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
if (this.options.output) {
|
|
153
|
+
this.options.output(logEntry);
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
if (typeof console !== "undefined") {
|
|
157
|
+
switch (logEntry.level) {
|
|
158
|
+
case LogLevel.TRACE:
|
|
159
|
+
case LogLevel.DEBUG:
|
|
160
|
+
case LogLevel.INFO:
|
|
161
|
+
console.log(output, logEntry.data);
|
|
162
|
+
break;
|
|
163
|
+
case LogLevel.WARN:
|
|
164
|
+
console.warn(output, logEntry.data);
|
|
165
|
+
break;
|
|
166
|
+
case LogLevel.ERROR:
|
|
167
|
+
case LogLevel.FATAL:
|
|
168
|
+
console.error(output, logEntry.data);
|
|
169
|
+
if (logEntry.stack) {
|
|
170
|
+
console.error(logEntry.stack);
|
|
171
|
+
}
|
|
172
|
+
break;
|
|
173
|
+
}
|
|
174
|
+
} else {
|
|
175
|
+
console.log(output, logEntry.data);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Get color style for log level
|
|
180
|
+
*/
|
|
181
|
+
getColorStyle(level) {
|
|
182
|
+
const styles = {
|
|
183
|
+
[LogLevel.TRACE]: "color: gray",
|
|
184
|
+
[LogLevel.DEBUG]: "color: blue",
|
|
185
|
+
[LogLevel.INFO]: "color: green",
|
|
186
|
+
[LogLevel.WARN]: "color: orange",
|
|
187
|
+
[LogLevel.ERROR]: "color: red",
|
|
188
|
+
[LogLevel.FATAL]: "color: red; font-weight: bold"
|
|
189
|
+
};
|
|
190
|
+
return styles[level] || "";
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Get level name
|
|
194
|
+
*/
|
|
195
|
+
getLevelName(level) {
|
|
196
|
+
const names = {
|
|
197
|
+
[LogLevel.TRACE]: "TRACE",
|
|
198
|
+
[LogLevel.DEBUG]: "DEBUG",
|
|
199
|
+
[LogLevel.INFO]: "INFO",
|
|
200
|
+
[LogLevel.WARN]: "WARN",
|
|
201
|
+
[LogLevel.ERROR]: "ERROR",
|
|
202
|
+
[LogLevel.FATAL]: "FATAL"
|
|
203
|
+
};
|
|
204
|
+
return names[level] || "UNKNOWN";
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Check if log should be output
|
|
208
|
+
*/
|
|
209
|
+
shouldLog(level, message, data) {
|
|
210
|
+
if (this.options.filter && !this.options.filter(message, data)) {
|
|
211
|
+
return false;
|
|
212
|
+
}
|
|
213
|
+
if (this.options.categories && data.category) {
|
|
214
|
+
if (!this.options.categories.includes(data.category)) {
|
|
215
|
+
return false;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
if (this.filters.length > 0) {
|
|
219
|
+
return this.filters.every((filter) => filter(level, message, data));
|
|
220
|
+
}
|
|
221
|
+
return true;
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Add a filter
|
|
225
|
+
*/
|
|
226
|
+
addFilter(filter) {
|
|
227
|
+
this.filters.push(filter);
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Remove a filter
|
|
231
|
+
*/
|
|
232
|
+
removeFilter(filter) {
|
|
233
|
+
const index = this.filters.indexOf(filter);
|
|
234
|
+
if (index > -1) {
|
|
235
|
+
this.filters.splice(index, 1);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Add a log handler
|
|
240
|
+
*/
|
|
241
|
+
addHandler(handler) {
|
|
242
|
+
this.handlers.push(handler);
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Remove a log handler
|
|
246
|
+
*/
|
|
247
|
+
removeHandler(handler) {
|
|
248
|
+
const index = this.handlers.indexOf(handler);
|
|
249
|
+
if (index > -1) {
|
|
250
|
+
this.handlers.splice(index, 1);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Start a log group
|
|
255
|
+
*/
|
|
256
|
+
group(name) {
|
|
257
|
+
this.groups.push(name);
|
|
258
|
+
if (typeof console !== "undefined" && console.group) {
|
|
259
|
+
console.group(name);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* End a log group
|
|
264
|
+
*/
|
|
265
|
+
groupEnd() {
|
|
266
|
+
this.groups.pop();
|
|
267
|
+
if (typeof console !== "undefined" && console.groupEnd) {
|
|
268
|
+
console.groupEnd();
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Get all logs
|
|
273
|
+
*/
|
|
274
|
+
getLogs(filter = {}) {
|
|
275
|
+
let results = [...this.logs];
|
|
276
|
+
if (filter.level !== void 0) {
|
|
277
|
+
results = results.filter((log) => log.level >= filter.level);
|
|
278
|
+
}
|
|
279
|
+
if (filter.group) {
|
|
280
|
+
results = results.filter((log) => log.group === filter.group);
|
|
281
|
+
}
|
|
282
|
+
if (filter.search) {
|
|
283
|
+
const search = filter.search.toLowerCase();
|
|
284
|
+
results = results.filter(
|
|
285
|
+
(log) => log.message.toLowerCase().includes(search) || JSON.stringify(log.data).toLowerCase().includes(search)
|
|
286
|
+
);
|
|
287
|
+
}
|
|
288
|
+
if (filter.limit) {
|
|
289
|
+
results = results.slice(-filter.limit);
|
|
290
|
+
}
|
|
291
|
+
return results;
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Get log statistics
|
|
295
|
+
*/
|
|
296
|
+
getStats() {
|
|
297
|
+
const byLevel = {};
|
|
298
|
+
Object.values(LogLevel).forEach((level) => {
|
|
299
|
+
byLevel[this.getLevelName(level)] = 0;
|
|
300
|
+
});
|
|
301
|
+
this.logs.forEach((log) => {
|
|
302
|
+
byLevel[log.levelName]++;
|
|
303
|
+
});
|
|
304
|
+
return {
|
|
305
|
+
total: this.logs.length,
|
|
306
|
+
byLevel,
|
|
307
|
+
groups: [...new Set(this.logs.map((l) => l.group).filter(Boolean))],
|
|
308
|
+
timeRange: this.logs.length > 0 ? {
|
|
309
|
+
start: this.logs[0].timestamp,
|
|
310
|
+
end: this.logs[this.logs.length - 1].timestamp,
|
|
311
|
+
duration: this.logs[this.logs.length - 1].timestamp - this.logs[0].timestamp
|
|
312
|
+
} : null
|
|
313
|
+
};
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Clear all logs
|
|
317
|
+
*/
|
|
318
|
+
clear() {
|
|
319
|
+
this.logs = [];
|
|
320
|
+
this.groups = [];
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Set log level
|
|
324
|
+
*/
|
|
325
|
+
setLevel(level) {
|
|
326
|
+
this.options.level = level;
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Export logs
|
|
330
|
+
*/
|
|
331
|
+
export(format = "array") {
|
|
332
|
+
if (format === "array" || !format) {
|
|
333
|
+
return this.logs.map((log) => ({
|
|
334
|
+
level: log.levelName,
|
|
335
|
+
message: log.message,
|
|
336
|
+
timestamp: log.timestamp,
|
|
337
|
+
data: log.data
|
|
338
|
+
}));
|
|
339
|
+
}
|
|
340
|
+
switch (format) {
|
|
341
|
+
case "json":
|
|
342
|
+
return JSON.stringify(this.logs, null, 2);
|
|
343
|
+
case "csv":
|
|
344
|
+
const headers = ["timestamp", "level", "group", "message", "data"];
|
|
345
|
+
const rows = this.logs.map((log) => [
|
|
346
|
+
new Date(log.timestamp).toISOString(),
|
|
347
|
+
log.levelName,
|
|
348
|
+
log.group || "",
|
|
349
|
+
log.message,
|
|
350
|
+
JSON.stringify(log.data)
|
|
351
|
+
]);
|
|
352
|
+
return [headers, ...rows].map((row) => row.join(",")).join("\n");
|
|
353
|
+
case "text":
|
|
354
|
+
return this.logs.map((log) => {
|
|
355
|
+
const date = new Date(log.timestamp).toISOString();
|
|
356
|
+
const group = log.group ? `[${log.group}]` : "";
|
|
357
|
+
return `${date} [${log.levelName}] ${group} ${log.message} ${JSON.stringify(log.data)}`;
|
|
358
|
+
}).join("\n");
|
|
359
|
+
default:
|
|
360
|
+
throw new Error(`Unknown export format: ${format}`);
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
/**
|
|
364
|
+
* Create a logger with additional context
|
|
365
|
+
*/
|
|
366
|
+
withContext(context) {
|
|
367
|
+
const contextLogger = new _DevLogger(this.options);
|
|
368
|
+
contextLogger.context = { ...this.context, ...context };
|
|
369
|
+
contextLogger.logs = this.logs;
|
|
370
|
+
contextLogger.groups = this.groups;
|
|
371
|
+
contextLogger.filters = this.filters;
|
|
372
|
+
contextLogger.handlers = this.handlers;
|
|
373
|
+
return contextLogger;
|
|
374
|
+
}
|
|
375
|
+
/**
|
|
376
|
+
* Log a table
|
|
377
|
+
*/
|
|
378
|
+
table(data) {
|
|
379
|
+
if (typeof console !== "undefined" && console.table) {
|
|
380
|
+
console.table(data);
|
|
381
|
+
} else {
|
|
382
|
+
console.log(JSON.stringify(data, null, 2));
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
/**
|
|
386
|
+
* Start a timer
|
|
387
|
+
*/
|
|
388
|
+
time(label) {
|
|
389
|
+
if (typeof console !== "undefined" && console.time) {
|
|
390
|
+
console.time(label);
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
/**
|
|
394
|
+
* End a timer
|
|
395
|
+
*/
|
|
396
|
+
timeEnd(label) {
|
|
397
|
+
if (typeof console !== "undefined" && console.timeEnd) {
|
|
398
|
+
console.timeEnd(label);
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
/**
|
|
402
|
+
* Get log buffer
|
|
403
|
+
*/
|
|
404
|
+
getBuffer() {
|
|
405
|
+
return this.logs;
|
|
406
|
+
}
|
|
407
|
+
/**
|
|
408
|
+
* Flush buffered logs
|
|
409
|
+
*/
|
|
410
|
+
flush() {
|
|
411
|
+
this.logs.forEach((log) => {
|
|
412
|
+
this.output(log);
|
|
413
|
+
});
|
|
414
|
+
}
|
|
415
|
+
/**
|
|
416
|
+
* Clear buffer
|
|
417
|
+
*/
|
|
418
|
+
clearBuffer() {
|
|
419
|
+
this.logs = [];
|
|
420
|
+
}
|
|
421
|
+
/**
|
|
422
|
+
* Generate unique ID
|
|
423
|
+
*/
|
|
424
|
+
generateId() {
|
|
425
|
+
return `log-${Date.now()}-${Math.random().toString(36).substring(7)}`;
|
|
426
|
+
}
|
|
427
|
+
};
|
|
428
|
+
function createLogger(options = {}) {
|
|
429
|
+
return new DevLogger(options);
|
|
430
|
+
}
|
|
431
|
+
function createComponentLogger(componentName, options = {}) {
|
|
432
|
+
const logger = new DevLogger({
|
|
433
|
+
prefix: `[${componentName}]`,
|
|
434
|
+
...options
|
|
435
|
+
});
|
|
436
|
+
logger.perf = (operation, duration) => {
|
|
437
|
+
logger.info(`${operation} completed in ${duration}ms`);
|
|
438
|
+
};
|
|
439
|
+
logger.lifecycle = (event) => {
|
|
440
|
+
logger.info(`Lifecycle: ${event}`);
|
|
441
|
+
};
|
|
442
|
+
return logger;
|
|
443
|
+
}
|
|
444
|
+
function createConsoleLogger(prefix = "") {
|
|
445
|
+
return {
|
|
446
|
+
trace: (...args) => console.debug(prefix, ...args),
|
|
447
|
+
debug: (...args) => console.debug(prefix, ...args),
|
|
448
|
+
info: (...args) => console.info(prefix, ...args),
|
|
449
|
+
warn: (...args) => console.warn(prefix, ...args),
|
|
450
|
+
error: (...args) => console.error(prefix, ...args),
|
|
451
|
+
fatal: (...args) => console.error(prefix, "FATAL:", ...args)
|
|
452
|
+
};
|
|
453
|
+
}
|
|
454
|
+
var logger_default = {
|
|
455
|
+
DevLogger,
|
|
456
|
+
LogLevel,
|
|
457
|
+
createLogger,
|
|
458
|
+
createComponentLogger,
|
|
459
|
+
createConsoleLogger
|
|
460
|
+
};
|
|
461
|
+
export {
|
|
462
|
+
DevLogger,
|
|
463
|
+
LogLevel,
|
|
464
|
+
createComponentLogger,
|
|
465
|
+
createConsoleLogger,
|
|
466
|
+
createLogger,
|
|
467
|
+
logger_default as default
|
|
468
|
+
};
|
|
469
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/logger.js"],
|
|
4
|
+
"sourcesContent": ["/**\n * Coherent.js Development Logger\n * \n * Advanced logging system for development and debugging\n * \n * @module devtools/logger\n */\n\n/**\n * Log levels\n */\nexport const LogLevel = {\n TRACE: 0,\n DEBUG: 1,\n INFO: 2,\n WARN: 3,\n ERROR: 4,\n FATAL: 5\n};\n\n/**\n * Development Logger\n * Provides structured logging with filtering and formatting\n */\nexport class DevLogger {\n constructor(options = {}) {\n this.options = {\n level: options.level !== undefined ? options.level : LogLevel.INFO,\n prefix: '[Coherent]',\n timestamp: true,\n colors: true,\n maxLogs: 1000,\n maxBufferSize: options.maxBufferSize || 1000,\n grouping: true,\n buffer: options.buffer || false,\n sampleRate: options.sampleRate !== undefined ? options.sampleRate : 1.0,\n silent: options.silent || false,\n output: options.output || null,\n categories: options.categories || null,\n filter: options.filter || null,\n ...options\n };\n \n this.logs = [];\n this.groups = [];\n this.filters = [];\n this.handlers = [];\n this.context = {};\n }\n\n /**\n * Generic log method (supports category logging)\n */\n log(categoryOrLevel, messageOrData, data) {\n // Support log(category, message) signature\n if (typeof categoryOrLevel === 'string' && typeof messageOrData === 'string') {\n return this.logWithLevel(LogLevel.INFO, messageOrData, { category: categoryOrLevel, ...data });\n }\n // Support log(level, message, data) signature\n return this.logWithLevel(categoryOrLevel, messageOrData, data);\n }\n\n /**\n * Log a trace message\n */\n trace(message, data = {}) {\n return this.logWithLevel(LogLevel.TRACE, message, data);\n }\n\n /**\n * Log a debug message\n */\n debug(message, data = {}) {\n return this.log(LogLevel.DEBUG, message, data);\n }\n\n /**\n * Log an info message\n */\n info(message, data = {}) {\n return this.log(LogLevel.INFO, message, data);\n }\n\n /**\n * Log a warning\n */\n warn(message, data = {}) {\n return this.log(LogLevel.WARN, message, data);\n }\n\n /**\n * Log an error\n */\n error(message, data = {}) {\n if (data instanceof Error) {\n data = {\n message: data.message,\n stack: data.stack,\n name: data.name,\n ...data\n };\n }\n return this.logWithLevel(LogLevel.ERROR, message, data);\n }\n\n /**\n * Log a fatal error\n */\n fatal(message, data = {}) {\n return this.log(LogLevel.FATAL, message, data);\n }\n\n /**\n * Core logging function\n */\n logWithLevel(level, message, data = {}) {\n // Apply sampling\n if (this.options.sampleRate < 1.0 && Math.random() > this.options.sampleRate) {\n return;\n }\n\n // Check if level is enabled\n if (level < this.options.level) {\n return;\n }\n\n // Apply filters\n if (!this.shouldLog(level, message, data)) {\n return;\n }\n\n // Merge context with data\n const mergedData = { ...this.context, ...data };\n\n const logEntry = {\n id: this.generateId(),\n level,\n levelName: this.getLevelName(level),\n message,\n data: mergedData,\n timestamp: Date.now(),\n group: this.groups.length > 0 ? this.groups[this.groups.length - 1] : null,\n stack: level >= LogLevel.ERROR ? new Error().stack : null\n };\n\n // Store log (always store for history/export)\n this.logs.push(logEntry);\n \n // Limit log size (rotation)\n const maxSize = this.options.buffer ? this.options.maxBufferSize : this.options.maxLogs;\n if (this.logs.length > maxSize) {\n this.logs.shift();\n }\n\n // Call handlers\n this.handlers.forEach(handler => {\n try {\n handler(logEntry);\n } catch (error) {\n console.error('Error in log handler:', error);\n }\n });\n\n // Output to console\n this.output(logEntry);\n\n return logEntry;\n }\n\n /**\n * Output log to console\n */\n output(logEntry) {\n const parts = [];\n\n // Timestamp\n if (this.options.timestamp) {\n const date = new Date(logEntry.timestamp);\n parts.push(`[${date.toISOString()}]`);\n }\n\n // Prefix\n if (this.options.prefix) {\n parts.push(this.options.prefix);\n }\n\n // Level\n parts.push(`[${logEntry.levelName}]`);\n\n // Group\n if (logEntry.group) {\n parts.push(`[${logEntry.group}]`);\n }\n\n // Message\n parts.push(logEntry.message);\n\n // Add context data to output if present\n const contextKeys = Object.keys(logEntry.data);\n if (contextKeys.length > 0) {\n const contextStr = contextKeys.map(key => `${key}=${logEntry.data[key]}`).join(' ');\n parts.push(`{${contextStr}}`);\n }\n\n const output = parts.join(' ');\n\n // Skip output if silent mode\n if (this.options.silent) {\n return;\n }\n\n // Use custom output handler if provided\n if (this.options.output) {\n this.options.output(logEntry);\n return;\n }\n\n // Console output\n if (typeof console !== 'undefined') {\n switch (logEntry.level) {\n case LogLevel.TRACE:\n case LogLevel.DEBUG:\n case LogLevel.INFO:\n console.log(output, logEntry.data);\n break;\n case LogLevel.WARN:\n console.warn(output, logEntry.data);\n break;\n case LogLevel.ERROR:\n case LogLevel.FATAL:\n console.error(output, logEntry.data);\n if (logEntry.stack) {\n console.error(logEntry.stack);\n }\n break;\n }\n } else {\n console.log(output, logEntry.data);\n }\n }\n\n /**\n * Get color style for log level\n */\n getColorStyle(level) {\n const styles = {\n [LogLevel.TRACE]: 'color: gray',\n [LogLevel.DEBUG]: 'color: blue',\n [LogLevel.INFO]: 'color: green',\n [LogLevel.WARN]: 'color: orange',\n [LogLevel.ERROR]: 'color: red',\n [LogLevel.FATAL]: 'color: red; font-weight: bold'\n };\n return styles[level] || '';\n }\n\n /**\n * Get level name\n */\n getLevelName(level) {\n const names = {\n [LogLevel.TRACE]: 'TRACE',\n [LogLevel.DEBUG]: 'DEBUG',\n [LogLevel.INFO]: 'INFO',\n [LogLevel.WARN]: 'WARN',\n [LogLevel.ERROR]: 'ERROR',\n [LogLevel.FATAL]: 'FATAL'\n };\n return names[level] || 'UNKNOWN';\n }\n\n /**\n * Check if log should be output\n */\n shouldLog(level, message, data) {\n // Check custom filter option\n if (this.options.filter && !this.options.filter(message, data)) {\n return false;\n }\n\n // Check category filter\n if (this.options.categories && data.category) {\n if (!this.options.categories.includes(data.category)) {\n return false;\n }\n }\n\n // Check registered filters\n if (this.filters.length > 0) {\n return this.filters.every(filter => filter(level, message, data));\n }\n\n return true;\n }\n\n /**\n * Add a filter\n */\n addFilter(filter) {\n this.filters.push(filter);\n }\n\n /**\n * Remove a filter\n */\n removeFilter(filter) {\n const index = this.filters.indexOf(filter);\n if (index > -1) {\n this.filters.splice(index, 1);\n }\n }\n\n /**\n * Add a log handler\n */\n addHandler(handler) {\n this.handlers.push(handler);\n }\n\n /**\n * Remove a log handler\n */\n removeHandler(handler) {\n const index = this.handlers.indexOf(handler);\n if (index > -1) {\n this.handlers.splice(index, 1);\n }\n }\n\n /**\n * Start a log group\n */\n group(name) {\n this.groups.push(name);\n \n if (typeof console !== 'undefined' && console.group) {\n console.group(name);\n }\n }\n\n /**\n * End a log group\n */\n groupEnd() {\n this.groups.pop();\n \n if (typeof console !== 'undefined' && console.groupEnd) {\n console.groupEnd();\n }\n }\n\n /**\n * Get all logs\n */\n getLogs(filter = {}) {\n let results = [...this.logs];\n\n if (filter.level !== undefined) {\n results = results.filter(log => log.level >= filter.level);\n }\n\n if (filter.group) {\n results = results.filter(log => log.group === filter.group);\n }\n\n if (filter.search) {\n const search = filter.search.toLowerCase();\n results = results.filter(log => \n log.message.toLowerCase().includes(search) ||\n JSON.stringify(log.data).toLowerCase().includes(search)\n );\n }\n\n if (filter.limit) {\n results = results.slice(-filter.limit);\n }\n\n return results;\n }\n\n /**\n * Get log statistics\n */\n getStats() {\n const byLevel = {};\n \n Object.values(LogLevel).forEach(level => {\n byLevel[this.getLevelName(level)] = 0;\n });\n\n this.logs.forEach(log => {\n byLevel[log.levelName]++;\n });\n\n return {\n total: this.logs.length,\n byLevel,\n groups: [...new Set(this.logs.map(l => l.group).filter(Boolean))],\n timeRange: this.logs.length > 0 ? {\n start: this.logs[0].timestamp,\n end: this.logs[this.logs.length - 1].timestamp,\n duration: this.logs[this.logs.length - 1].timestamp - this.logs[0].timestamp\n } : null\n };\n }\n\n /**\n * Clear all logs\n */\n clear() {\n this.logs = [];\n this.groups = [];\n }\n\n /**\n * Set log level\n */\n setLevel(level) {\n this.options.level = level;\n }\n\n /**\n * Export logs\n */\n export(format = 'array') {\n if (format === 'array' || !format) {\n // Return array of log objects for tests\n return this.logs.map(log => ({\n level: log.levelName,\n message: log.message,\n timestamp: log.timestamp,\n data: log.data\n }));\n }\n \n switch (format) {\n case 'json':\n return JSON.stringify(this.logs, null, 2);\n \n case 'csv':\n const headers = ['timestamp', 'level', 'group', 'message', 'data'];\n const rows = this.logs.map(log => [\n new Date(log.timestamp).toISOString(),\n log.levelName,\n log.group || '',\n log.message,\n JSON.stringify(log.data)\n ]);\n return [headers, ...rows].map(row => row.join(',')).join('\\n');\n \n case 'text':\n return this.logs.map(log => {\n const date = new Date(log.timestamp).toISOString();\n const group = log.group ? `[${log.group}]` : '';\n return `${date} [${log.levelName}] ${group} ${log.message} ${JSON.stringify(log.data)}`;\n }).join('\\n');\n \n default:\n throw new Error(`Unknown export format: ${format}`);\n }\n }\n\n /**\n * Create a logger with additional context\n */\n withContext(context) {\n const contextLogger = new DevLogger(this.options);\n contextLogger.context = { ...this.context, ...context };\n contextLogger.logs = this.logs; // Share log buffer\n contextLogger.groups = this.groups;\n contextLogger.filters = this.filters;\n contextLogger.handlers = this.handlers;\n return contextLogger;\n }\n\n /**\n * Log a table\n */\n table(data) {\n if (typeof console !== 'undefined' && console.table) {\n console.table(data);\n } else {\n console.log(JSON.stringify(data, null, 2));\n }\n }\n\n /**\n * Start a timer\n */\n time(label) {\n if (typeof console !== 'undefined' && console.time) {\n console.time(label);\n }\n }\n\n /**\n * End a timer\n */\n timeEnd(label) {\n if (typeof console !== 'undefined' && console.timeEnd) {\n console.timeEnd(label);\n }\n }\n\n /**\n * Get log buffer\n */\n getBuffer() {\n return this.logs;\n }\n\n /**\n * Flush buffered logs\n */\n flush() {\n // Output all buffered logs\n this.logs.forEach(log => {\n this.output(log);\n });\n }\n\n /**\n * Clear buffer\n */\n clearBuffer() {\n this.logs = [];\n }\n\n /**\n * Generate unique ID\n */\n generateId() {\n return `log-${Date.now()}-${Math.random().toString(36).substring(7)}`;\n }\n}\n\n/**\n * Create a logger\n */\nexport function createLogger(options = {}) {\n return new DevLogger(options);\n}\n\n/**\n * Create a component logger\n */\nexport function createComponentLogger(componentName, options = {}) {\n const logger = new DevLogger({\n prefix: `[${componentName}]`,\n ...options\n });\n\n // Add perf method for component performance logging\n logger.perf = (operation, duration) => {\n logger.info(`${operation} completed in ${duration}ms`);\n };\n\n // Add lifecycle method for component lifecycle logging\n logger.lifecycle = (event) => {\n logger.info(`Lifecycle: ${event}`);\n };\n\n return logger;\n}\n\n/**\n * Create a console logger (simple wrapper)\n */\nexport function createConsoleLogger(prefix = '') {\n return {\n trace: (...args) => console.debug(prefix, ...args),\n debug: (...args) => console.debug(prefix, ...args),\n info: (...args) => console.info(prefix, ...args),\n warn: (...args) => console.warn(prefix, ...args),\n error: (...args) => console.error(prefix, ...args),\n fatal: (...args) => console.error(prefix, 'FATAL:', ...args)\n };\n}\n\nexport default {\n DevLogger,\n LogLevel,\n createLogger,\n createComponentLogger,\n createConsoleLogger\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|