@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/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
+ }