@mks2508/better-logger 2.0.1 → 3.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/.claude/settings.local.json +6 -1
- package/CHANGELOG.json +93 -1
- package/CHANGELOG.md +127 -0
- package/CLAUDE.md +14 -1
- package/README.md +111 -20
- package/bun.lock +333 -0
- package/dist/Logger.d.ts +851 -0
- package/dist/Logger.d.ts.map +1 -0
- package/dist/ScopedLogger.d.ts +57 -0
- package/dist/ScopedLogger.d.ts.map +1 -0
- package/dist/chunks/Logger-BCfx_yCK.js +2 -0
- package/dist/chunks/Logger-BCfx_yCK.js.map +1 -0
- package/dist/chunks/Logger-C126NTrD.js +4269 -0
- package/dist/chunks/Logger-C126NTrD.js.map +1 -0
- package/dist/chunks/RemoteLogHandler-CjWpWZGl.js +33 -0
- package/dist/chunks/RemoteLogHandler-CjWpWZGl.js.map +1 -0
- package/dist/chunks/RemoteLogHandler-ymkQ97xl.js +2 -0
- package/dist/chunks/RemoteLogHandler-ymkQ97xl.js.map +1 -0
- package/dist/chunks/environment-Ba5kShbx.js +4 -0
- package/dist/chunks/environment-Ba5kShbx.js.map +1 -0
- package/dist/chunks/environment-TI2ByCPT.js +1209 -0
- package/dist/chunks/environment-TI2ByCPT.js.map +1 -0
- package/dist/chunks/formatting-Blwy-f0W.js +2 -0
- package/dist/chunks/formatting-Blwy-f0W.js.map +1 -0
- package/dist/chunks/formatting-CuNUqGks.js +380 -0
- package/dist/chunks/formatting-CuNUqGks.js.map +1 -0
- package/dist/cli/CommandProcessor.d.ts +100 -0
- package/dist/cli/CommandProcessor.d.ts.map +1 -0
- package/dist/cli/commands/ConfigCommand.d.ts +14 -0
- package/dist/cli/commands/ConfigCommand.d.ts.map +1 -0
- package/dist/cli/commands/ExportCommand.d.ts +48 -0
- package/dist/cli/commands/ExportCommand.d.ts.map +1 -0
- package/dist/cli/commands/HistoryCommand.d.ts +47 -0
- package/dist/cli/commands/HistoryCommand.d.ts.map +1 -0
- package/dist/cli/commands/StatusCommand.d.ts +30 -0
- package/dist/cli/commands/StatusCommand.d.ts.map +1 -0
- package/dist/cli/commands/ThemeCommand.d.ts +30 -0
- package/dist/cli/commands/ThemeCommand.d.ts.map +1 -0
- package/dist/cli/help.d.ts +12 -0
- package/dist/cli/help.d.ts.map +1 -0
- package/dist/cli/index.d.ts +15 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/constants.d.ts +227 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/core.cjs +2 -0
- package/dist/core.cjs.map +1 -0
- package/dist/core.d.ts +127 -0
- package/dist/core.d.ts.map +1 -0
- package/dist/core.js +291 -0
- package/dist/core.js.map +1 -0
- package/dist/example.d.ts +18 -0
- package/dist/example.d.ts.map +1 -0
- package/dist/exports-module.d.ts +196 -0
- package/dist/exports-module.d.ts.map +1 -0
- package/dist/exports.cjs +2 -0
- package/dist/exports.cjs.map +1 -0
- package/dist/exports.js +238 -0
- package/dist/exports.js.map +1 -0
- package/dist/handlers/AnalyticsLogHandler.d.ts +8 -0
- package/dist/handlers/AnalyticsLogHandler.d.ts.map +1 -0
- package/dist/handlers/ExportLogHandler.d.ts +100 -0
- package/dist/handlers/ExportLogHandler.d.ts.map +1 -0
- package/dist/handlers/FileLogHandler.d.ts +33 -0
- package/dist/handlers/FileLogHandler.d.ts.map +1 -0
- package/dist/handlers/RemoteLogHandler.d.ts +11 -0
- package/dist/handlers/RemoteLogHandler.d.ts.map +1 -0
- package/dist/handlers/index.d.ts +8 -0
- package/dist/handlers/index.d.ts.map +1 -0
- package/dist/hooks/HookManager.d.ts +21 -0
- package/dist/hooks/HookManager.d.ts.map +1 -0
- package/dist/hooks/index.d.ts +2 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +144 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +478 -0
- package/dist/index.js.map +1 -0
- package/dist/main.d.ts +2 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/serializers/SerializerRegistry.d.ts +16 -0
- package/dist/serializers/SerializerRegistry.d.ts.map +1 -0
- package/dist/serializers/index.d.ts +2 -0
- package/dist/serializers/index.d.ts.map +1 -0
- package/dist/styling/LogStyleBuilder.d.ts +146 -0
- package/dist/styling/LogStyleBuilder.d.ts.map +1 -0
- package/dist/styling/SemanticStyles.d.ts +178 -0
- package/dist/styling/SemanticStyles.d.ts.map +1 -0
- package/dist/styling/SmartPresets.d.ts +22 -0
- package/dist/styling/SmartPresets.d.ts.map +1 -0
- package/dist/styling/StyleBuilder.d.ts +140 -0
- package/dist/styling/StyleBuilder.d.ts.map +1 -0
- package/dist/styling/StyleCache.d.ts +42 -0
- package/dist/styling/StyleCache.d.ts.map +1 -0
- package/dist/styling/banners.d.ts +42 -0
- package/dist/styling/banners.d.ts.map +1 -0
- package/dist/styling/index.d.ts +10 -0
- package/dist/styling/index.d.ts.map +1 -0
- package/dist/styling/themes.d.ts +7 -0
- package/dist/styling/themes.d.ts.map +1 -0
- package/dist/styling-module.d.ts +178 -0
- package/dist/styling-module.d.ts.map +1 -0
- package/dist/styling.cjs +2 -0
- package/dist/styling.cjs.map +1 -0
- package/dist/styling.js +146 -0
- package/dist/styling.js.map +1 -0
- package/dist/terminal/terminal-renderer.d.ts +63 -0
- package/dist/terminal/terminal-renderer.d.ts.map +1 -0
- package/dist/transports/ConsoleTransport.d.ts +9 -0
- package/dist/transports/ConsoleTransport.d.ts.map +1 -0
- package/dist/transports/FileTransport.d.ts +15 -0
- package/dist/transports/FileTransport.d.ts.map +1 -0
- package/dist/transports/HttpTransport.d.ts +16 -0
- package/dist/transports/HttpTransport.d.ts.map +1 -0
- package/dist/transports/TransportManager.d.ts +14 -0
- package/dist/transports/TransportManager.d.ts.map +1 -0
- package/dist/transports/index.d.ts +5 -0
- package/dist/transports/index.d.ts.map +1 -0
- package/dist/types/core.d.ts +272 -0
- package/dist/types/core.d.ts.map +1 -0
- package/dist/types/handlers.d.ts +85 -0
- package/dist/types/handlers.d.ts.map +1 -0
- package/dist/types/hooks.d.ts +36 -0
- package/dist/types/hooks.d.ts.map +1 -0
- package/dist/types/index.d.ts +11 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/serializers.d.ts +25 -0
- package/dist/types/serializers.d.ts.map +1 -0
- package/dist/types/transports.d.ts +47 -0
- package/dist/types/transports.d.ts.map +1 -0
- package/dist/utils/adapter.d.ts +48 -0
- package/dist/utils/adapter.d.ts.map +1 -0
- package/dist/utils/ansi-colors.d.ts +156 -0
- package/dist/utils/ansi-colors.d.ts.map +1 -0
- package/dist/utils/environment-detector.d.ts +35 -0
- package/dist/utils/environment-detector.d.ts.map +1 -0
- package/dist/utils/environment.d.ts +47 -0
- package/dist/utils/environment.d.ts.map +1 -0
- package/dist/utils/formatting.d.ts +58 -0
- package/dist/utils/formatting.d.ts.map +1 -0
- package/dist/utils/index.d.ts +8 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/opentui-detection.d.ts +34 -0
- package/dist/utils/opentui-detection.d.ts.map +1 -0
- package/dist/utils/output.d.ts +46 -0
- package/dist/utils/output.d.ts.map +1 -0
- package/dist/utils/stackTrace.d.ts +6 -0
- package/dist/utils/stackTrace.d.ts.map +1 -0
- package/dist/utils/timestamps.d.ts +20 -0
- package/dist/utils/timestamps.d.ts.map +1 -0
- package/dist/vite.svg +1 -0
- package/docs/API.md +227 -0
- package/package.json +1 -1
- package/packages/core/package.json +1 -1
- package/src/Logger.ts +391 -102
- package/src/ScopedLogger.ts +78 -318
- package/src/hooks/HookManager.ts +177 -0
- package/src/hooks/index.ts +1 -0
- package/src/index.ts +77 -2
- package/src/serializers/SerializerRegistry.ts +173 -0
- package/src/serializers/index.ts +1 -0
- package/src/styling/StyleCache.ts +131 -0
- package/src/transports/ConsoleTransport.ts +28 -0
- package/src/transports/FileTransport.ts +53 -0
- package/src/transports/HttpTransport.ts +56 -0
- package/src/transports/TransportManager.ts +130 -0
- package/src/transports/index.ts +4 -0
- package/src/types/core.ts +46 -0
- package/src/types/hooks.ts +45 -0
- package/src/types/index.ts +39 -1
- package/src/types/serializers.ts +30 -0
- package/src/types/transports.ts +52 -0
package/dist/exports.js
ADDED
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
import { L as Logger, E as ExportLogHandler } from "./chunks/Logger-C126NTrD.js";
|
|
2
|
+
import "./chunks/environment-TI2ByCPT.js";
|
|
3
|
+
import { R as RemoteLogHandler } from "./chunks/RemoteLogHandler-CjWpWZGl.js";
|
|
4
|
+
class ExportLogger extends Logger {
|
|
5
|
+
exportLogHandler;
|
|
6
|
+
remoteHandlers = [];
|
|
7
|
+
constructor(config = {}) {
|
|
8
|
+
super(config);
|
|
9
|
+
if (config.bufferSize) {
|
|
10
|
+
this.exportLogHandler = new ExportLogHandler(config.bufferSize);
|
|
11
|
+
this.addHandler(this.exportLogHandler);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Export logs in specified format
|
|
16
|
+
*
|
|
17
|
+
* @param format - Export format (csv, json, xml)
|
|
18
|
+
* @param options - Export options
|
|
19
|
+
* @returns Promise resolving to exported data
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```typescript
|
|
23
|
+
* const csvData = await logger.exportLogs('csv');
|
|
24
|
+
* const jsonData = await logger.exportLogs('json', {
|
|
25
|
+
* filter: { level: 'error' },
|
|
26
|
+
* limit: 100
|
|
27
|
+
* });
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
async exportLogs(format, options) {
|
|
31
|
+
if (!this.exportLogHandler) {
|
|
32
|
+
throw new Error("Export handler not initialized. Set bufferSize in constructor.");
|
|
33
|
+
}
|
|
34
|
+
return JSON.stringify([]);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Get current log buffer
|
|
38
|
+
*
|
|
39
|
+
* @returns Array of log entries
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* ```typescript
|
|
43
|
+
* const logs = logger.getLogs();
|
|
44
|
+
* console.log(`Buffered ${logs.length} log entries`);
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
getLogs() {
|
|
48
|
+
if (!this.exportLogHandler) {
|
|
49
|
+
return [];
|
|
50
|
+
}
|
|
51
|
+
return [];
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Clear the log buffer
|
|
55
|
+
*
|
|
56
|
+
* @example
|
|
57
|
+
* ```typescript
|
|
58
|
+
* logger.clearLogs();
|
|
59
|
+
* ```
|
|
60
|
+
*/
|
|
61
|
+
clearLogs() {
|
|
62
|
+
if (this.exportLogHandler) ;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Get log statistics
|
|
66
|
+
*
|
|
67
|
+
* @returns Statistics object with counts by level
|
|
68
|
+
*
|
|
69
|
+
* @example
|
|
70
|
+
* ```typescript
|
|
71
|
+
* const stats = logger.getLogStats();
|
|
72
|
+
* console.log(`Errors: ${stats.error}, Warnings: ${stats.warn}`);
|
|
73
|
+
* ```
|
|
74
|
+
*/
|
|
75
|
+
getLogStats() {
|
|
76
|
+
if (!this.exportLogHandler) {
|
|
77
|
+
return {};
|
|
78
|
+
}
|
|
79
|
+
return {};
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Add remote logging handler
|
|
83
|
+
*
|
|
84
|
+
* @param endpoint - Remote endpoint URL
|
|
85
|
+
* @param apiKey - Optional API key for authentication
|
|
86
|
+
*
|
|
87
|
+
* @example
|
|
88
|
+
* ```typescript
|
|
89
|
+
* logger.addRemoteHandler('https://logs.myservice.com/api', 'secret-key');
|
|
90
|
+
* ```
|
|
91
|
+
*/
|
|
92
|
+
addRemoteHandler(endpoint, apiKey) {
|
|
93
|
+
const remoteHandler = new RemoteLogHandler(endpoint, apiKey);
|
|
94
|
+
this.remoteHandlers.push(remoteHandler);
|
|
95
|
+
this.addHandler(remoteHandler);
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Remove all remote handlers
|
|
99
|
+
*
|
|
100
|
+
* @example
|
|
101
|
+
* ```typescript
|
|
102
|
+
* logger.clearRemoteHandlers();
|
|
103
|
+
* ```
|
|
104
|
+
*/
|
|
105
|
+
clearRemoteHandlers() {
|
|
106
|
+
const allHandlers = this.getHandlers();
|
|
107
|
+
this.remoteHandlers.forEach((remoteHandler) => {
|
|
108
|
+
const index = allHandlers.indexOf(remoteHandler);
|
|
109
|
+
if (index > -1) {
|
|
110
|
+
allHandlers.splice(index, 1);
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
this.remoteHandlers = [];
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Flush all remote handlers (force send pending logs)
|
|
117
|
+
*
|
|
118
|
+
* @example
|
|
119
|
+
* ```typescript
|
|
120
|
+
* await logger.flushRemoteHandlers();
|
|
121
|
+
* ```
|
|
122
|
+
*/
|
|
123
|
+
async flushRemoteHandlers() {
|
|
124
|
+
const flushPromises = this.remoteHandlers.map(
|
|
125
|
+
(handler) => Promise.resolve()
|
|
126
|
+
// RemoteLogHandler needs flush method
|
|
127
|
+
);
|
|
128
|
+
await Promise.all(flushPromises);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
const exportLogger = new ExportLogger({ bufferSize: 1e3 });
|
|
132
|
+
const exportUtils = {
|
|
133
|
+
/**
|
|
134
|
+
* Export current logs as CSV
|
|
135
|
+
*/
|
|
136
|
+
async exportCSV(options) {
|
|
137
|
+
return await exportLogger.exportLogs("csv", options);
|
|
138
|
+
},
|
|
139
|
+
/**
|
|
140
|
+
* Export current logs as JSON
|
|
141
|
+
*/
|
|
142
|
+
async exportJSON(options) {
|
|
143
|
+
return await exportLogger.exportLogs("json", options);
|
|
144
|
+
},
|
|
145
|
+
/**
|
|
146
|
+
* Export current logs as XML
|
|
147
|
+
*/
|
|
148
|
+
async exportXML(options) {
|
|
149
|
+
return await exportLogger.exportLogs("xml", options);
|
|
150
|
+
},
|
|
151
|
+
/**
|
|
152
|
+
* Get log statistics
|
|
153
|
+
*/
|
|
154
|
+
getStats() {
|
|
155
|
+
return exportLogger.getLogStats();
|
|
156
|
+
},
|
|
157
|
+
/**
|
|
158
|
+
* Clear all logs
|
|
159
|
+
*/
|
|
160
|
+
clear() {
|
|
161
|
+
exportLogger.clearLogs();
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
const remoteUtils = {
|
|
165
|
+
/**
|
|
166
|
+
* Add remote logging endpoint
|
|
167
|
+
*/
|
|
168
|
+
addEndpoint(url, apiKey) {
|
|
169
|
+
exportLogger.addRemoteHandler(url, apiKey);
|
|
170
|
+
},
|
|
171
|
+
/**
|
|
172
|
+
* Clear all remote endpoints
|
|
173
|
+
*/
|
|
174
|
+
clearEndpoints() {
|
|
175
|
+
exportLogger.clearRemoteHandlers();
|
|
176
|
+
},
|
|
177
|
+
/**
|
|
178
|
+
* Flush all remote logs
|
|
179
|
+
*/
|
|
180
|
+
async flush() {
|
|
181
|
+
await exportLogger.flushRemoteHandlers();
|
|
182
|
+
}
|
|
183
|
+
};
|
|
184
|
+
const debug = (...args) => exportLogger.debug(...args);
|
|
185
|
+
const info = (...args) => exportLogger.info(...args);
|
|
186
|
+
const warn = (...args) => exportLogger.warn(...args);
|
|
187
|
+
const error = (...args) => exportLogger.error(...args);
|
|
188
|
+
const success = (...args) => exportLogger.success(...args);
|
|
189
|
+
const critical = (...args) => exportLogger.critical(...args);
|
|
190
|
+
const trace = (...args) => exportLogger.trace(...args);
|
|
191
|
+
const table = (data, columns) => exportLogger.table(data, columns);
|
|
192
|
+
const group = (label, collapsed) => exportLogger.group(label, collapsed);
|
|
193
|
+
const groupEnd = () => exportLogger.groupEnd();
|
|
194
|
+
const time = (label) => exportLogger.time(label);
|
|
195
|
+
const timeEnd = (label) => exportLogger.timeEnd(label);
|
|
196
|
+
const setGlobalPrefix = (prefix) => exportLogger.setGlobalPrefix(prefix);
|
|
197
|
+
const scope = (prefix) => exportLogger.scope(prefix);
|
|
198
|
+
const setVerbosity = (level) => exportLogger.setVerbosity(level);
|
|
199
|
+
const addHandler = (handler) => exportLogger.addHandler(handler);
|
|
200
|
+
const exportLogs = async (format, options) => await exportLogger.exportLogs(format, options);
|
|
201
|
+
const getLogs = () => exportLogger.getLogs();
|
|
202
|
+
const clearLogs = () => exportLogger.clearLogs();
|
|
203
|
+
const getLogStats = () => exportLogger.getLogStats();
|
|
204
|
+
const addRemoteHandler = (endpoint, apiKey) => exportLogger.addRemoteHandler(endpoint, apiKey);
|
|
205
|
+
const clearRemoteHandlers = () => exportLogger.clearRemoteHandlers();
|
|
206
|
+
const flushRemoteHandlers = async () => await exportLogger.flushRemoteHandlers();
|
|
207
|
+
export {
|
|
208
|
+
ExportLogHandler,
|
|
209
|
+
ExportLogger,
|
|
210
|
+
RemoteLogHandler,
|
|
211
|
+
addHandler,
|
|
212
|
+
addRemoteHandler,
|
|
213
|
+
clearLogs,
|
|
214
|
+
clearRemoteHandlers,
|
|
215
|
+
critical,
|
|
216
|
+
debug,
|
|
217
|
+
exportLogger as default,
|
|
218
|
+
error,
|
|
219
|
+
exportLogs,
|
|
220
|
+
exportUtils,
|
|
221
|
+
flushRemoteHandlers,
|
|
222
|
+
getLogStats,
|
|
223
|
+
getLogs,
|
|
224
|
+
group,
|
|
225
|
+
groupEnd,
|
|
226
|
+
info,
|
|
227
|
+
remoteUtils,
|
|
228
|
+
scope,
|
|
229
|
+
setGlobalPrefix,
|
|
230
|
+
setVerbosity,
|
|
231
|
+
success,
|
|
232
|
+
table,
|
|
233
|
+
time,
|
|
234
|
+
timeEnd,
|
|
235
|
+
trace,
|
|
236
|
+
warn
|
|
237
|
+
};
|
|
238
|
+
//# sourceMappingURL=exports.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exports.js","sources":["../src/exports-module.ts"],"sourcesContent":["/**\n * @fileoverview Exports Module - Export and remote logging capabilities\n * @version 0.0.1\n * \n * This module provides export functionality for logs including CSV, JSON, XML formats\n * and remote logging capabilities for sending logs to external services.\n */\n\n// Core logger and types\nimport { Logger } from './Logger.js';\nimport type {\n LogLevel,\n Verbosity,\n ILogHandler\n} from './types/index.js';\n\n// Export handlers\nimport {\n ExportLogHandler,\n RemoteLogHandler\n} from './handlers/index.js';\n\n/**\n * Logger with export and remote capabilities\n * \n * @example\n * ```typescript\n * import { ExportLogger } from '@mks2508/better-logger/exports';\n * \n * const logger = new ExportLogger({ bufferSize: 1000 });\n * \n * // Log some data\n * logger.info('User logged in', { userId: 123 });\n * logger.error('Failed to process', { error: 'timeout' });\n * \n * // Export logs\n * const csvData = await logger.exportLogs('csv');\n * const jsonData = await logger.exportLogs('json');\n * \n * // Setup remote logging\n * logger.addRemoteHandler('https://api.myapp.com/logs', 'api-key');\n * ```\n */\nexport class ExportLogger extends Logger {\n private exportLogHandler?: ExportLogHandler;\n private remoteHandlers: RemoteLogHandler[] = [];\n\n constructor(config: { bufferSize?: number } & any = {}) {\n super(config);\n \n // Initialize export handler if buffer size specified\n if (config.bufferSize) {\n this.exportLogHandler = new ExportLogHandler(config.bufferSize);\n this.addHandler(this.exportLogHandler);\n }\n }\n\n /**\n * Export logs in specified format\n * \n * @param format - Export format (csv, json, xml)\n * @param options - Export options\n * @returns Promise resolving to exported data\n * \n * @example\n * ```typescript\n * const csvData = await logger.exportLogs('csv');\n * const jsonData = await logger.exportLogs('json', { \n * filter: { level: 'error' },\n * limit: 100 \n * });\n * ```\n */\n async exportLogs(\n format: 'csv' | 'json' | 'xml', \n options?: {\n filter?: { level?: LogLevel; from?: Date; to?: Date };\n limit?: number;\n }\n ): Promise<string> {\n if (!this.exportLogHandler) {\n throw new Error('Export handler not initialized. Set bufferSize in constructor.');\n }\n\n // Temporary implementation - ExportLogHandler needs these methods\n return JSON.stringify([]);\n }\n\n /**\n * Get current log buffer\n * \n * @returns Array of log entries\n * \n * @example\n * ```typescript\n * const logs = logger.getLogs();\n * console.log(`Buffered ${logs.length} log entries`);\n * ```\n */\n getLogs(): any[] {\n if (!this.exportLogHandler) {\n return [];\n }\n \n // Temporary implementation - ExportLogHandler needs these methods\n return [];\n }\n\n /**\n * Clear the log buffer\n * \n * @example\n * ```typescript\n * logger.clearLogs();\n * ```\n */\n clearLogs(): void {\n if (this.exportLogHandler) {\n // Temporary implementation - ExportLogHandler needs these methods\n }\n }\n\n /**\n * Get log statistics\n * \n * @returns Statistics object with counts by level\n * \n * @example\n * ```typescript\n * const stats = logger.getLogStats();\n * console.log(`Errors: ${stats.error}, Warnings: ${stats.warn}`);\n * ```\n */\n getLogStats(): Record<string, number> {\n if (!this.exportLogHandler) {\n return {};\n }\n\n // Temporary implementation - ExportLogHandler needs these methods\n return {};\n }\n\n /**\n * Add remote logging handler\n * \n * @param endpoint - Remote endpoint URL\n * @param apiKey - Optional API key for authentication\n * \n * @example\n * ```typescript\n * logger.addRemoteHandler('https://logs.myservice.com/api', 'secret-key');\n * ```\n */\n addRemoteHandler(endpoint: string, apiKey?: string): void {\n const remoteHandler = new RemoteLogHandler(endpoint, apiKey);\n this.remoteHandlers.push(remoteHandler);\n this.addHandler(remoteHandler);\n }\n\n /**\n * Remove all remote handlers\n * \n * @example\n * ```typescript\n * logger.clearRemoteHandlers();\n * ```\n */\n clearRemoteHandlers(): void {\n // Remove from handlers array\n const allHandlers = this.getHandlers();\n this.remoteHandlers.forEach(remoteHandler => {\n const index = allHandlers.indexOf(remoteHandler);\n if (index > -1) {\n allHandlers.splice(index, 1);\n }\n });\n \n this.remoteHandlers = [];\n }\n\n /**\n * Flush all remote handlers (force send pending logs)\n * \n * @example\n * ```typescript\n * await logger.flushRemoteHandlers();\n * ```\n */\n async flushRemoteHandlers(): Promise<void> {\n const flushPromises = this.remoteHandlers.map(handler => \n Promise.resolve() // RemoteLogHandler needs flush method\n );\n \n await Promise.all(flushPromises);\n }\n}\n\n// Create singleton instance with export capabilities\nconst exportLogger = new ExportLogger({ bufferSize: 1000 });\n\n/**\n * Export management utilities\n */\nexport const exportUtils = {\n /**\n * Export current logs as CSV\n */\n async exportCSV(options?: any): Promise<string> {\n return await exportLogger.exportLogs('csv', options);\n },\n\n /**\n * Export current logs as JSON\n */\n async exportJSON(options?: any): Promise<string> {\n return await exportLogger.exportLogs('json', options);\n },\n\n /**\n * Export current logs as XML\n */\n async exportXML(options?: any): Promise<string> {\n return await exportLogger.exportLogs('xml', options);\n },\n\n /**\n * Get log statistics\n */\n getStats(): Record<string, number> {\n return exportLogger.getLogStats();\n },\n\n /**\n * Clear all logs\n */\n clear(): void {\n exportLogger.clearLogs();\n }\n};\n\n/**\n * Remote logging utilities\n */\nexport const remoteUtils = {\n /**\n * Add remote logging endpoint\n */\n addEndpoint(url: string, apiKey?: string): void {\n exportLogger.addRemoteHandler(url, apiKey);\n },\n\n /**\n * Clear all remote endpoints\n */\n clearEndpoints(): void {\n exportLogger.clearRemoteHandlers();\n },\n\n /**\n * Flush all remote logs\n */\n async flush(): Promise<void> {\n await exportLogger.flushRemoteHandlers();\n }\n};\n\n/**\n * Export individual logging methods with export capabilities\n */\nexport const debug = (...args: any[]) => exportLogger.debug(...args);\nexport const info = (...args: any[]) => exportLogger.info(...args);\nexport const warn = (...args: any[]) => exportLogger.warn(...args);\nexport const error = (...args: any[]) => exportLogger.error(...args);\nexport const success = (...args: any[]) => exportLogger.success(...args);\nexport const critical = (...args: any[]) => exportLogger.critical(...args);\nexport const trace = (...args: any[]) => exportLogger.trace(...args);\nexport const table = (data: any, columns?: string[]) => exportLogger.table(data, columns);\nexport const group = (label: string, collapsed?: boolean) => exportLogger.group(label, collapsed);\nexport const groupEnd = () => exportLogger.groupEnd();\nexport const time = (label: string) => exportLogger.time(label);\nexport const timeEnd = (label: string) => exportLogger.timeEnd(label);\nexport const setGlobalPrefix = (prefix: string) => exportLogger.setGlobalPrefix(prefix);\nexport const scope = (prefix: string) => exportLogger.scope(prefix);\nexport const setVerbosity = (level: Verbosity) => exportLogger.setVerbosity(level);\nexport const addHandler = (handler: ILogHandler) => exportLogger.addHandler(handler);\n\n/**\n * Export functionality\n */\nexport const exportLogs = async (format: 'csv' | 'json' | 'xml', options?: any) => \n await exportLogger.exportLogs(format, options);\nexport const getLogs = () => exportLogger.getLogs();\nexport const clearLogs = () => exportLogger.clearLogs();\nexport const getLogStats = () => exportLogger.getLogStats();\n\n/**\n * Remote logging functionality\n */\nexport const addRemoteHandler = (endpoint: string, apiKey?: string) => \n exportLogger.addRemoteHandler(endpoint, apiKey);\nexport const clearRemoteHandlers = () => exportLogger.clearRemoteHandlers();\nexport const flushRemoteHandlers = async () => await exportLogger.flushRemoteHandlers();\n\n// Export the singleton as default\nexport default exportLogger;\n\n// Re-export handlers\nexport { ExportLogHandler, RemoteLogHandler } from './handlers/index.js';\n\n// Re-export types\nexport type { ILogHandler } from './types/index.js';"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { ILogHandler, LogLevel, LogMetadata } from '../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Example custom handler for analytics demonstration
|
|
4
|
+
*/
|
|
5
|
+
export declare class AnalyticsLogHandler implements ILogHandler {
|
|
6
|
+
handle(level: LogLevel, message: string, _args: any[], metadata: LogMetadata): void;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=AnalyticsLogHandler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AnalyticsLogHandler.d.ts","sourceRoot":"","sources":["../../src/handlers/AnalyticsLogHandler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAE5E;;GAEG;AACH,qBAAa,mBAAoB,YAAW,WAAW;IACnD,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,WAAW,GAAG,IAAI;CAWtF"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { ILogHandler, LogLevel, LogMetadata, LogEntry, ExportFilters, ExportOptions, ExportResult, BufferStats, ExportFormat } from '../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Export log handler with circular buffer and multiple export formats
|
|
4
|
+
*/
|
|
5
|
+
export declare class ExportLogHandler implements ILogHandler {
|
|
6
|
+
private buffer;
|
|
7
|
+
private maxSize;
|
|
8
|
+
private groupDepth;
|
|
9
|
+
private currentGroup?;
|
|
10
|
+
constructor(maxSize?: number);
|
|
11
|
+
/**
|
|
12
|
+
* Handle incoming log and store in buffer
|
|
13
|
+
*/
|
|
14
|
+
handle(level: LogLevel, message: string, args: any[], metadata: LogMetadata): void;
|
|
15
|
+
/**
|
|
16
|
+
* Set group tracking for nested logs
|
|
17
|
+
*/
|
|
18
|
+
setGroupInfo(depth: number, groupName?: string): void;
|
|
19
|
+
/**
|
|
20
|
+
* Get buffer statistics
|
|
21
|
+
*/
|
|
22
|
+
getBufferStats(): BufferStats;
|
|
23
|
+
/**
|
|
24
|
+
* Clear the buffer
|
|
25
|
+
*/
|
|
26
|
+
clearBuffer(): void;
|
|
27
|
+
/**
|
|
28
|
+
* Set buffer size (with limits)
|
|
29
|
+
*/
|
|
30
|
+
setBufferSize(size: number): void;
|
|
31
|
+
/**
|
|
32
|
+
* Filter logs based on criteria
|
|
33
|
+
*/
|
|
34
|
+
private filterLogs;
|
|
35
|
+
/**
|
|
36
|
+
* Export logs in JSON format
|
|
37
|
+
*/
|
|
38
|
+
private exportJSON;
|
|
39
|
+
/**
|
|
40
|
+
* Export logs in CSV format
|
|
41
|
+
*/
|
|
42
|
+
private exportCSV;
|
|
43
|
+
/**
|
|
44
|
+
* Export logs in Markdown format
|
|
45
|
+
*/
|
|
46
|
+
private exportMarkdown;
|
|
47
|
+
/**
|
|
48
|
+
* Export logs in plain text format
|
|
49
|
+
*/
|
|
50
|
+
private exportPlain;
|
|
51
|
+
/**
|
|
52
|
+
* Export logs in HTML format
|
|
53
|
+
*/
|
|
54
|
+
private exportHTML;
|
|
55
|
+
/**
|
|
56
|
+
* Get emoji for log level
|
|
57
|
+
*/
|
|
58
|
+
private getLevelEmoji;
|
|
59
|
+
/**
|
|
60
|
+
* Main export function
|
|
61
|
+
*/
|
|
62
|
+
export(format: ExportFormat, filters?: ExportFilters, options?: ExportOptions): ExportResult;
|
|
63
|
+
/**
|
|
64
|
+
* Copy to clipboard with fallback
|
|
65
|
+
*/
|
|
66
|
+
copyToClipboard(format: ExportFormat, filters?: ExportFilters, options?: ExportOptions): Promise<boolean>;
|
|
67
|
+
/**
|
|
68
|
+
* Get all logs (for debugging)
|
|
69
|
+
*/
|
|
70
|
+
getAllLogs(): LogEntry[];
|
|
71
|
+
/**
|
|
72
|
+
* Save export to file with download prompt
|
|
73
|
+
*/
|
|
74
|
+
saveToFile(format: ExportFormat, filters?: ExportFilters, options?: ExportOptions): Promise<boolean>;
|
|
75
|
+
/**
|
|
76
|
+
* Get MIME type for format
|
|
77
|
+
*/
|
|
78
|
+
private getMimeType;
|
|
79
|
+
/**
|
|
80
|
+
* Generate filename with timestamp
|
|
81
|
+
*/
|
|
82
|
+
private generateFilename;
|
|
83
|
+
/**
|
|
84
|
+
* Stream logs to external endpoint
|
|
85
|
+
*/
|
|
86
|
+
streamToEndpoint(endpoint: string, filters?: ExportFilters, options?: {
|
|
87
|
+
apiKey?: string;
|
|
88
|
+
batchSize?: number;
|
|
89
|
+
format?: ExportFormat;
|
|
90
|
+
}): Promise<boolean>;
|
|
91
|
+
/**
|
|
92
|
+
* Create export with metadata enrichment
|
|
93
|
+
*/
|
|
94
|
+
exportWithMetadata(format: ExportFormat, filters?: ExportFilters, options?: ExportOptions): ExportResult;
|
|
95
|
+
/**
|
|
96
|
+
* Estimate memory usage of buffer
|
|
97
|
+
*/
|
|
98
|
+
private estimateMemoryUsage;
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=ExportLogHandler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExportLogHandler.d.ts","sourceRoot":"","sources":["../../src/handlers/ExportLogHandler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACR,WAAW,EACX,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,aAAa,EACb,aAAa,EACb,YAAY,EACZ,WAAW,EACX,YAAY,EACf,MAAM,mBAAmB,CAAC;AAK3B;;GAEG;AACH,qBAAa,gBAAiB,YAAW,WAAW;IAChD,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,YAAY,CAAC,CAAS;gBAElB,OAAO,GAAE,MAAmC;IAIxD;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,WAAW,GAAG,IAAI;IAsBlF;;OAEG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI;IAKrD;;OAEG;IACH,cAAc,IAAI,WAAW;IAuC7B;;OAEG;IACH,WAAW,IAAI,IAAI;IAInB;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IASjC;;OAEG;IACH,OAAO,CAAC,UAAU;IAkElB;;OAEG;IACH,OAAO,CAAC,UAAU;IAkBlB;;OAEG;IACH,OAAO,CAAC,SAAS;IA2BjB;;OAEG;IACH,OAAO,CAAC,cAAc;IAsDtB;;OAEG;IACH,OAAO,CAAC,WAAW;IAWnB;;OAEG;IACH,OAAO,CAAC,UAAU;IA2DlB;;OAEG;IACH,OAAO,CAAC,aAAa;IAWrB;;OAEG;IACH,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,GAAE,aAAkB,EAAE,OAAO,GAAE,aAAkB,GAAG,YAAY;IAqCpG;;OAEG;IACG,eAAe,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,GAAE,aAAkB,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,OAAO,CAAC;IA0BvH;;OAEG;IACH,UAAU,IAAI,QAAQ,EAAE;IAIxB;;OAEG;IACG,UAAU,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,GAAE,aAAkB,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,OAAO,CAAC;IA0BlH;;OAEG;IACH,OAAO,CAAC,WAAW;IAWnB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAOxB;;OAEG;IACG,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,EAAE,OAAO,GAAE;QAC3E,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,MAAM,CAAC,EAAE,YAAY,CAAA;KACnB,GAAG,OAAO,CAAC,OAAO,CAAC;IA4CzB;;OAEG;IACH,kBAAkB,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,GAAE,aAAkB,EAAE,OAAO,GAAE,aAAkB,GAAG,YAAY;IAsBhH;;OAEG;IACH,OAAO,CAAC,mBAAmB;CAQ9B"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { ILogHandler, LogLevel, LogMetadata } from '../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Universal file-based log handler for persistent logging
|
|
4
|
+
* Works in both Node.js (real files) and browser (localStorage)
|
|
5
|
+
*/
|
|
6
|
+
export declare class FileLogHandler implements ILogHandler {
|
|
7
|
+
private filename;
|
|
8
|
+
private maxSize?;
|
|
9
|
+
private fs?;
|
|
10
|
+
constructor(filename?: string, maxSize?: number);
|
|
11
|
+
handle(level: LogLevel, message: string, args: any[], metadata: LogMetadata): void;
|
|
12
|
+
/**
|
|
13
|
+
* Format log entry as a single line for file storage
|
|
14
|
+
*/
|
|
15
|
+
private formatLogLine;
|
|
16
|
+
/**
|
|
17
|
+
* Write to actual file in Node.js environment
|
|
18
|
+
*/
|
|
19
|
+
private writeToFileNode;
|
|
20
|
+
/**
|
|
21
|
+
* Write to localStorage in browser environment
|
|
22
|
+
*/
|
|
23
|
+
private writeToFileLocal;
|
|
24
|
+
/**
|
|
25
|
+
* Get stored logs (useful for debugging)
|
|
26
|
+
*/
|
|
27
|
+
getLogs(): string | null;
|
|
28
|
+
/**
|
|
29
|
+
* Clear stored logs
|
|
30
|
+
*/
|
|
31
|
+
clearLogs(): void;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=FileLogHandler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FileLogHandler.d.ts","sourceRoot":"","sources":["../../src/handlers/FileLogHandler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAI5E;;;GAGG;AACH,qBAAa,cAAe,YAAW,WAAW;IAC9C,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,OAAO,CAAC,CAAS;IACzB,OAAO,CAAC,EAAE,CAAC,CAAM;gBAEL,QAAQ,GAAE,MAAkB,EAAE,OAAO,CAAC,EAAE,MAAM;IAc1D,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,WAAW,GAAG,IAAI;IAsBlF;;OAEG;IACH,OAAO,CAAC,aAAa;IAuBrB;;OAEG;IACH,OAAO,CAAC,eAAe;IAyBvB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA0BxB;;OAEG;IACH,OAAO,IAAI,MAAM,GAAG,IAAI;IAcxB;;OAEG;IACH,SAAS,IAAI,IAAI;CAYpB"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ILogHandler, LogLevel, LogMetadata } from '../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Remote log handler for sending logs to external services
|
|
4
|
+
*/
|
|
5
|
+
export declare class RemoteLogHandler implements ILogHandler {
|
|
6
|
+
private endpoint;
|
|
7
|
+
private apiKey?;
|
|
8
|
+
constructor(endpoint: string, apiKey?: string);
|
|
9
|
+
handle(level: LogLevel, message: string, args: any[], metadata: LogMetadata): Promise<void>;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=RemoteLogHandler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RemoteLogHandler.d.ts","sourceRoot":"","sources":["../../src/handlers/RemoteLogHandler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAE5E;;GAEG;AACH,qBAAa,gBAAiB,YAAW,WAAW;IAChD,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,MAAM,CAAC,CAAS;gBAEZ,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;IAKvC,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;CAuBpG"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Log handlers exports for Advanced Logger
|
|
3
|
+
*/
|
|
4
|
+
export { FileLogHandler } from './FileLogHandler.js';
|
|
5
|
+
export { RemoteLogHandler } from './RemoteLogHandler.js';
|
|
6
|
+
export { AnalyticsLogHandler } from './AnalyticsLogHandler.js';
|
|
7
|
+
export { ExportLogHandler } from './ExportLogHandler.js';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/handlers/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { HookLogEntry, HookEvent, HookCallback, MiddlewareFn, IHookManager } from '../types/index.js';
|
|
2
|
+
export declare class HookManager implements IHookManager {
|
|
3
|
+
private hooks;
|
|
4
|
+
private middlewares;
|
|
5
|
+
constructor();
|
|
6
|
+
on(event: HookEvent, callback: HookCallback, priority?: number): () => void;
|
|
7
|
+
once(event: HookEvent, callback: HookCallback, priority?: number): () => void;
|
|
8
|
+
off(event: HookEvent, callback: HookCallback): boolean;
|
|
9
|
+
private removeHook;
|
|
10
|
+
use(middleware: MiddlewareFn, priority?: number): () => void;
|
|
11
|
+
emit(event: HookEvent, entry: HookLogEntry): Promise<HookLogEntry>;
|
|
12
|
+
process(entry: HookLogEntry): Promise<HookLogEntry>;
|
|
13
|
+
afterProcess(entry: HookLogEntry): Promise<void>;
|
|
14
|
+
clear(): void;
|
|
15
|
+
getStats(): {
|
|
16
|
+
hooks: Record<HookEvent, number>;
|
|
17
|
+
middlewares: number;
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export declare function getDefaultHookManager(): HookManager;
|
|
21
|
+
//# sourceMappingURL=HookManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HookManager.d.ts","sourceRoot":"","sources":["../../src/hooks/HookManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,YAAY,EACZ,SAAS,EACT,YAAY,EACZ,YAAY,EAGZ,YAAY,EACf,MAAM,mBAAmB,CAAC;AAM3B,qBAAa,WAAY,YAAW,YAAY;IAC5C,OAAO,CAAC,KAAK,CAAiD;IAC9D,OAAO,CAAC,WAAW,CAAgC;;IAQnD,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,GAAE,MAAW,GAAG,MAAM,IAAI;IAgB/E,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,GAAE,MAAW,GAAG,MAAM,IAAI;IAgBjF,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,GAAG,OAAO;IAYtD,OAAO,CAAC,UAAU;IAUlB,GAAG,CAAC,UAAU,EAAE,YAAY,EAAE,QAAQ,GAAE,MAAW,GAAG,MAAM,IAAI;IAkB1D,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IA6BlE,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IAuBnD,YAAY,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAItD,KAAK,IAAI,IAAI;IAKb,QAAQ,IAAI;QAAE,KAAK,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE;CAUxE;AAID,wBAAgB,qBAAqB,IAAI,WAAW,CAKnD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC"}
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("./chunks/Logger-BCfx_yCK.js"),t=require("./chunks/environment-Ba5kShbx.js"),s=require("./chunks/formatting-Blwy-f0W.js"),r=require("./chunks/RemoteLogHandler-ymkQ97xl.js"),o={maxEntries:100,ttl:3e5,enabled:!0};class StyleCache{cache=/* @__PURE__ */new Map;config;hitCount=0;missCount=0;constructor(e={}){this.config={...o,...e}}generateKey(e){return`${e.level}:${e.theme}:${e.presetName||"default"}:${e.hasPrefix}:${e.hasLocation}`}get(e){if(!this.config.enabled)return null;const t=this.generateKey(e),s=this.cache.get(t);return s?Date.now()-s.createdAt>this.config.ttl?(this.cache.delete(t),this.missCount++,null):(s.hits++,this.cache.delete(t),this.cache.set(t,s),this.hitCount++,s):(this.missCount++,null)}set(e,t,s){if(!this.config.enabled)return;const r=this.generateKey(e);if(this.cache.size>=this.config.maxEntries){const e=this.cache.keys().next().value;e&&this.cache.delete(e)}this.cache.set(r,{format:t,styles:[...s],createdAt:Date.now(),hits:0})}clear(){this.cache.clear(),this.hitCount=0,this.missCount=0}getStats(){const e=this.hitCount+this.missCount;return{size:this.cache.size,maxSize:this.config.maxEntries,hitRate:e>0?this.hitCount/e:0,hits:this.hitCount,misses:this.missCount}}setEnabled(e){this.config.enabled=e,e||this.clear()}isEnabled(){return this.config.enabled}}let i=null,n=null;function getLogger(){return n||(n=new e.Logger),n}const a=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.APILogger=e.APILogger,exports.BANNER_VARIANTS=e.BANNER_VARIANTS,exports.ComponentLogger=e.ComponentLogger,exports.ContextLogger=e.ContextLogger,exports.HookManager=e.HookManager,exports.Logger=e.Logger,exports.ScopedLogger=e.ScopedLogger,exports.SerializerRegistry=e.SerializerRegistry,exports.THEME_BANNERS=e.THEME_BANNERS,exports.THEME_PRESETS=e.THEME_PRESETS,exports.TransportManager=e.TransportManager,exports.BUILD_PRESETS=t.BUILD_PRESETS,exports.DEFAULT_CONFIG=t.DEFAULT_CONFIG,exports.ENVIRONMENT_DETECTION=t.ENVIRONMENT_DETECTION,exports.StyleBuilder=t.StyleBuilder,exports.StylePresets=t.StylePresets,exports.detectEnvironmentPreset=t.detectEnvironmentPreset,exports.formatTimestamp=t.formatTimestamp,exports.getOptimalConfig=t.getOptimalConfig,exports.parseStackTrace=t.parseStackTrace,exports.BUILD_FORMATTERS=s.BUILD_FORMATTERS,exports.ansiBackground=s.ansiBackground,exports.ansiBold=s.ansiBold,exports.ansiColor=s.ansiColor,exports.ansiDim=s.ansiDim,exports.ansiStyle=s.ansiStyle,exports.ansiUnderline=s.ansiUnderline,exports.createANSIOutput=s.createANSIOutput,exports.createBuildOutput=s.createBuildOutput,exports.createCIOutput=s.createCIOutput,exports.createOutput=s.createOutput,exports.detectOptimalFormat=s.detectOptimalFormat,exports.formatLogLevelANSI=s.formatLogLevelANSI,exports.formatSuccessANSI=s.formatSuccessANSI,exports.sanitizeEmojis=s.sanitizeEmojis,exports.RemoteLogHandler=r.RemoteLogHandler,exports.AnalyticsLogHandler=class{handle(e,t,s,r){"error"!==e&&"critical"!==e||r.timestamp}},exports.ConsoleTransport=class{constructor(e){this.options=e}name="console";write(e){const t=this.getConsoleMethod(e.level),s=e.prefix?`[${e.prefix}] `:"",r=e.location?` (${e.location.file}:${e.location.line})`:"";console[t](`[${e.level.toUpperCase()}]${s} ${e.msg}${r}`)}getConsoleMethod(e){switch(e){case"debug":default:return"log";case"info":return"info";case"warn":return"warn";case"error":case"critical":return"error"}}},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 n={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(n);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.FileTransport=class{name="file";buffer=[];flushTimer;options;constructor(e){this.options=e||{},this.options.flushInterval&&(this.flushTimer=setInterval(()=>this.flush(),this.options.flushInterval))}write(e){const t=JSON.stringify(e)+"\n";this.buffer.push(t),this.buffer.length>=(this.options.batchSize||100)&&this.flush()}async flush(){if(0===this.buffer.length)return;const e=this.buffer.join("");if(this.buffer=[],void 0!==globalThis.process&&"function"==typeof require)try{const t=require("fs"),s=this.options.destination||"app.log";t.appendFileSync(s,e)}catch{}}close(){this.flushTimer&&clearInterval(this.flushTimer),this.flush()}},exports.HttpTransport=class{name="http";buffer=[];flushTimer;options;constructor(e){this.options=e||{},this.options.flushInterval&&(this.flushTimer=setInterval(()=>this.flush(),this.options.flushInterval))}write(e){this.buffer.push(e),this.buffer.length>=(this.options.batchSize||50)&&this.flush()}async flush(){if(0===this.buffer.length||!this.options.url)return;const e=[...this.buffer];this.buffer=[];try{await fetch(this.options.url,{method:"POST",headers:{"Content-Type":"application/json",...this.options.headers},body:JSON.stringify({logs:e})})}catch{this.buffer.unshift(...e)}}close(){this.flushTimer&&clearInterval(this.flushTimer),this.flush()}},exports.StyleCache=StyleCache,exports.addHandler=e=>getLogger().addHandler(e),exports.addSerializer=(e,t,s)=>getLogger().addSerializer(e,t,s),exports.addTransport=e=>getLogger().addTransport(e),exports.api=e=>getLogger().api(e),exports.badge=e=>getLogger().badge(e),exports.badges=e=>getLogger().badges(e),exports.clearBadges=()=>getLogger().clearBadges(),exports.cli=e=>getLogger().cli(e),exports.closeTransports=()=>getLogger().closeTransports(),exports.component=e=>getLogger().component(e),exports.createStyle=()=>new t.StyleBuilder,exports.critical=(...e)=>getLogger().critical(...e),exports.debug=(...e)=>getLogger().debug(...e),exports.default=a,exports.error=(...e)=>getLogger().error(...e),exports.flushTransports=()=>getLogger().flushTransports(),exports.getStyleCache=function(){return i||(i=new StyleCache),i},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,s)=>getLogger().logWithSVG(e,t,s),exports.off=(e,t)=>getLogger().off(e,t),exports.on=(e,t,s)=>getLogger().on(e,t,s),exports.once=(e,t,s)=>getLogger().once(e,t,s),exports.removeSerializer=e=>getLogger().removeSerializer(e),exports.removeTransport=e=>getLogger().removeTransport(e),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.use=(e,t)=>getLogger().use(e,t),exports.warn=(...e)=>getLogger().warn(...e);
|
|
2
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/styling/StyleCache.ts","../src/index.ts","../src/handlers/AnalyticsLogHandler.ts","../src/transports/ConsoleTransport.ts","../src/handlers/FileLogHandler.ts","../src/transports/FileTransport.ts","../src/transports/HttpTransport.ts"],"sourcesContent":["import type { LogLevel, DevToolsTheme } from '../types/core.js';\n\ninterface CacheKey {\n level: LogLevel | 'success';\n theme: DevToolsTheme;\n presetName?: string;\n hasPrefix: boolean;\n hasLocation: boolean;\n}\n\ninterface CacheEntry {\n styles: string[];\n format: string;\n createdAt: number;\n hits: number;\n}\n\nexport interface StyleCacheConfig {\n maxEntries?: number;\n ttl?: number;\n enabled?: boolean;\n}\n\nconst DEFAULT_CONFIG: Required<StyleCacheConfig> = {\n maxEntries: 100,\n ttl: 5 * 60 * 1000,\n enabled: true\n};\n\nexport class StyleCache {\n private cache: Map<string, CacheEntry> = new Map();\n private config: Required<StyleCacheConfig>;\n private hitCount = 0;\n private missCount = 0;\n\n constructor(config: StyleCacheConfig = {}) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n\n private generateKey(key: CacheKey): string {\n return `${key.level}:${key.theme}:${key.presetName || 'default'}:${key.hasPrefix}:${key.hasLocation}`;\n }\n\n get(key: CacheKey): CacheEntry | null {\n if (!this.config.enabled) return null;\n\n const cacheKey = this.generateKey(key);\n const entry = this.cache.get(cacheKey);\n\n if (!entry) {\n this.missCount++;\n return null;\n }\n\n if (Date.now() - entry.createdAt > this.config.ttl) {\n this.cache.delete(cacheKey);\n this.missCount++;\n return null;\n }\n\n entry.hits++;\n this.cache.delete(cacheKey);\n this.cache.set(cacheKey, entry);\n this.hitCount++;\n\n return entry;\n }\n\n set(key: CacheKey, format: string, styles: string[]): void {\n if (!this.config.enabled) return;\n\n const cacheKey = this.generateKey(key);\n\n if (this.cache.size >= this.config.maxEntries) {\n const firstKey = this.cache.keys().next().value;\n if (firstKey) {\n this.cache.delete(firstKey);\n }\n }\n\n this.cache.set(cacheKey, {\n format,\n styles: [...styles],\n createdAt: Date.now(),\n hits: 0\n });\n }\n\n clear(): void {\n this.cache.clear();\n this.hitCount = 0;\n this.missCount = 0;\n }\n\n getStats(): {\n size: number;\n maxSize: number;\n hitRate: number;\n hits: number;\n misses: number;\n } {\n const total = this.hitCount + this.missCount;\n return {\n size: this.cache.size,\n maxSize: this.config.maxEntries,\n hitRate: total > 0 ? this.hitCount / total : 0,\n hits: this.hitCount,\n misses: this.missCount\n };\n }\n\n setEnabled(enabled: boolean): void {\n this.config.enabled = enabled;\n if (!enabled) {\n this.clear();\n }\n }\n\n isEnabled(): boolean {\n return this.config.enabled;\n }\n}\n\nlet _styleCache: StyleCache | null = null;\n\nexport function getStyleCache(): StyleCache {\n if (!_styleCache) {\n _styleCache = new StyleCache();\n }\n return _styleCache;\n}\n","/**\n * @fileoverview Better Logger - Librería completa con todas las características\n * @version 0.3.0\n * @since 2024\n * \n * Punto de entrada principal que proporciona la experiencia completa de Better Logger\n * con características avanzadas incluyendo estilos CSS, soporte SVG, animaciones,\n * capacidades de exportación y logging remoto.\n * \n * @module @mks2508/better-logger\n */\n\n// Main Logger class with all features\nimport { Logger } from './Logger.js';\nimport type {\n LogLevel,\n Verbosity,\n ThemeVariant,\n BannerType,\n StyleOptions,\n ILogHandler\n} from './types/index.js';\n\n// Lazy singleton - se inicializa solo cuando se necesita\nlet _logger: Logger | null = null;\n\nfunction getLogger(): Logger {\n if (!_logger) {\n _logger = new Logger();\n }\n return _logger;\n}\n\n/**\n * Clase principal Logger con conjunto completo de características\n * \n * @example\n * // Importación y uso básico\n * import { Logger } from '@mks2508/better-logger';\n * \n * const logger = new Logger();\n * logger.preset('cyberpunk'); // Aplicar preset completo\n * logger.info('¡Hola mundo!');\n * \n * @example\n * // Logger con scope para componentes\n * const auth = logger.component('Auth');\n * auth.info('Usuario autenticando...');\n * auth.success('Login exitoso');\n * \n * @example\n * // Logger para APIs con badges\n * const api = logger.api('GraphQL');\n * api.badges(['v2', 'cached']).info('Query ejecutada');\n * \n * @since 0.3.0\n */\nexport { Logger };\n\n/**\n * Instancia singleton del logger lista para usar\n * @default\n * \n * @example\n * // Uso directo sin crear instancia\n * import logger from '@mks2508/better-logger';\n * \n * logger.info('Aplicación iniciada');\n * logger.success('Conexión establecida');\n * logger.warn('Memoria al 80%');\n * logger.error('Fallo en conexión');\n */\nexport default getLogger();\n\n/**\n * Métodos de logging individuales (enlazados al singleton)\n * \n * @example\n * // Importar solo los métodos necesarios\n * import { info, error, success } from '@mks2508/better-logger';\n * \n * info('Proceso iniciado');\n * success('✓ Completado exitosamente');\n * error('Error:', errorDetails);\n * \n * @since 0.3.0\n */\nexport const debug = (...args: any[]) => getLogger().debug(...args);\nexport const info = (...args: any[]) => getLogger().info(...args);\nexport const warn = (...args: any[]) => getLogger().warn(...args);\nexport const error = (...args: any[]) => getLogger().error(...args);\nexport const success = (...args: any[]) => getLogger().success(...args);\nexport const critical = (...args: any[]) => getLogger().critical(...args);\nexport const trace = (...args: any[]) => getLogger().trace(...args);\nexport const table = (data: any, columns?: string[]) => getLogger().table(data, columns);\nexport const group = (label: string, collapsed?: boolean) => getLogger().group(label, collapsed);\nexport const groupEnd = () => getLogger().groupEnd();\nexport const time = (label: string) => getLogger().time(label);\nexport const timeEnd = (label: string) => getLogger().timeEnd(label);\nexport const setGlobalPrefix = (prefix: string) => getLogger().setGlobalPrefix(prefix);\nexport const scope = (name: string) => getLogger().scope(name);\nexport const component = (name: string) => getLogger().component(name);\nexport const api = (name: string) => getLogger().api(name);\nexport const badges = (badgeList: string[]) => getLogger().badges(badgeList);\nexport const badge = (badgeName: string) => getLogger().badge(badgeName);\nexport const clearBadges = () => getLogger().clearBadges();\nexport const setVerbosity = (level: Verbosity) => getLogger().setVerbosity(level);\nexport const addHandler = (handler: ILogHandler) => getLogger().addHandler(handler);\nexport const setTheme = (theme: ThemeVariant) => getLogger().setTheme(theme);\nexport const setBannerType = (bannerType: BannerType) => getLogger().setBannerType(bannerType);\nexport const showBanner = (bannerType?: BannerType) => getLogger().showBanner(bannerType);\nexport const logWithSVG = (message: string, svgContent?: string, options?: StyleOptions) => \n getLogger().logWithSVG(message, svgContent, options);\nexport const logAnimated = (message: string, duration?: number) => \n getLogger().logAnimated(message, duration);\nexport const cli = (command: string) => getLogger().cli(command);\n\n// Type exports\nexport type {\n LogLevel,\n Verbosity,\n ThemeVariant,\n BannerType,\n StyleOptions,\n ILogHandler,\n LoggerConfig,\n LogMetadata,\n StackInfo,\n TimerEntry,\n TimerResult,\n OutputFormat,\n IScopedLogger,\n IAPILogger,\n IComponentLogger,\n Bindings,\n SerializerFn,\n SerializerContext,\n SerializerConfig,\n ISerializerRegistry,\n HookLogEntry,\n HookEvent,\n HookCallback,\n MiddlewareFn,\n IHookManager,\n TransportRecord,\n TransportOptions,\n TransportTarget,\n ITransport,\n StyleCacheConfig\n} from './types/index.js';\n\n// Styling utilities\nexport { \n StyleBuilder,\n StylePresets,\n THEME_PRESETS,\n THEME_BANNERS,\n BANNER_VARIANTS\n} from './styling/index.js';\n\n// Handler exports\nexport {\n FileLogHandler,\n RemoteLogHandler,\n AnalyticsLogHandler\n} from './handlers/index.js';\n\n// Serializers\nexport { SerializerRegistry } from './serializers/index.js';\n\n// Hooks & Middleware\nexport { HookManager } from './hooks/index.js';\n\n// Transports\nexport {\n TransportManager,\n ConsoleTransport,\n FileTransport,\n HttpTransport\n} from './transports/index.js';\n\n// Style Cache\nexport { StyleCache, getStyleCache } from './styling/StyleCache.js';\n\n// Enterprise feature function exports\nimport type { SerializerFn, HookEvent, HookCallback, MiddlewareFn, TransportTarget } from './types/index.js';\nexport const addSerializer = <T>(\n type: new (...args: any[]) => T,\n serializer: SerializerFn<T>,\n priority?: number\n) => getLogger().addSerializer(type, serializer, priority);\nexport const removeSerializer = <T>(type: new (...args: any[]) => T) =>\n getLogger().removeSerializer(type);\nexport const on = (event: HookEvent, callback: HookCallback, priority?: number) =>\n getLogger().on(event, callback, priority);\nexport const once = (event: HookEvent, callback: HookCallback, priority?: number) =>\n getLogger().once(event, callback, priority);\nexport const off = (event: HookEvent, callback: HookCallback) =>\n getLogger().off(event, callback);\nexport const use = (middleware: MiddlewareFn, priority?: number) =>\n getLogger().use(middleware, priority);\nexport const addTransport = (target: TransportTarget) =>\n getLogger().addTransport(target);\nexport const removeTransport = (id: string) =>\n getLogger().removeTransport(id);\nexport const flushTransports = () =>\n getLogger().flushTransports();\nexport const closeTransports = () =>\n getLogger().closeTransports();\n\n// Scoped loggers\nexport {\n ScopedLogger,\n APILogger,\n ComponentLogger,\n ContextLogger\n} from './ScopedLogger.js';\n\n// Constants\nexport { DEFAULT_CONFIG } from './constants.js';\n\n// Utility exports\nexport {\n parseStackTrace,\n formatTimestamp,\n detectOptimalFormat,\n createOutput,\n createANSIOutput,\n createBuildOutput,\n createCIOutput\n} from './utils/index.js';\n\n// ANSI color utilities\nexport {\n ansiStyle,\n ansiColor,\n ansiBackground,\n ansiBold,\n ansiDim,\n ansiUnderline,\n formatLogLevelANSI,\n formatSuccessANSI,\n BUILD_FORMATTERS,\n sanitizeEmojis\n} from './utils/ansi-colors.js';\n\n// Environment detection and presets\nexport {\n BUILD_PRESETS,\n ENVIRONMENT_DETECTION,\n detectEnvironmentPreset,\n getOptimalConfig\n} from './constants.js';\n\n/**\n * Utilidades de estilo para crear estilos personalizados de consola\n * \n * @example\n * // Crear estilo personalizado\n * import { createStyle, stylePresets } from '@mks2508/better-logger';\n * \n * const miEstilo = createStyle()\n * .bg('linear-gradient(45deg, #ff6b6b, #feca57)')\n * .color('white')\n * .padding('10px')\n * .rounded('8px')\n * .bold()\n * .build();\n * \n * console.log('%cMensaje estilizado', miEstilo);\n * \n * @example\n * // Usar presets predefinidos\n * console.log('%cÉxito!', stylePresets.success);\n * console.log('%cError!', stylePresets.error);\n * \n * @since 0.3.0\n */\nimport { StyleBuilder, StylePresets } from './styling/index.js';\n\n/**\n * Crea una nueva instancia de StyleBuilder para estilos personalizados de consola\n * \n * @returns {StyleBuilder} Constructor de estilos encadenable\n * \n * @example\n * const estilo = createStyle()\n * .gradient('#667eea', '#764ba2')\n * .color('white')\n * .padding('8px 16px')\n * .rounded('4px')\n * .shadow('0 2px 4px rgba(0,0,0,0.2)')\n * .build();\n * \n * @since 0.3.0\n */\nexport const createStyle = () => new StyleBuilder();\n\n/**\n * Presets de estilo predefinidos para casos de uso comunes\n * \n * @constant {Object} stylePresets\n * \n * @example\n * console.log('%cOperación exitosa', stylePresets.success);\n * console.log('%cAdvertencia', stylePresets.warning);\n * console.log('%cError crítico', stylePresets.error);\n * console.log('%cInformación', stylePresets.info);\n * console.log('%cDestacado', stylePresets.accent);\n * \n * @since 0.3.0\n */\nexport const stylePresets = {\n success: StylePresets.success().build(),\n error: StylePresets.error().build(),\n warning: StylePresets.warning().build(),\n info: StylePresets.info().build(),\n accent: StylePresets.accent().build(),\n};","/**\n * @fileoverview Analytics log handler for Advanced Logger\n */\n\nimport type { ILogHandler, LogLevel, LogMetadata } from '../types/index.js';\n\n/**\n * Example custom handler for analytics demonstration\n */\nexport class AnalyticsLogHandler implements ILogHandler {\n handle(level: LogLevel, message: string, _args: any[], metadata: LogMetadata): void {\n // In a real implementation, this could send analytics data\n if (level === 'error' || level === 'critical') {\n // Track errors for analytics\n console.debug('Analytics: Error tracked', { \n level, \n message, \n timestamp: metadata.timestamp \n });\n }\n }\n}","import type { TransportRecord, TransportOptions, ITransport, LogLevel } from '../types/index.js';\n\nexport class ConsoleTransport implements ITransport {\n readonly name = 'console';\n\n constructor(private options?: TransportOptions) {}\n\n write(record: TransportRecord): void {\n const method = this.getConsoleMethod(record.level);\n const prefix = record.prefix ? `[${record.prefix}] ` : '';\n const location = record.location\n ? ` (${record.location.file}:${record.location.line})`\n : '';\n\n console[method](`[${record.level.toUpperCase()}]${prefix} ${record.msg}${location}`);\n }\n\n private getConsoleMethod(level: LogLevel): 'log' | 'info' | 'warn' | 'error' {\n switch (level) {\n case 'debug': return 'log';\n case 'info': return 'info';\n case 'warn': return 'warn';\n case 'error':\n case 'critical': return 'error';\n default: return 'log';\n }\n }\n}\n","/**\n * @fileoverview File-based log handler for Advanced Logger\n */\n\nimport type { ILogHandler, LogLevel, LogMetadata } from '../types/index.js';\nimport { isNode, isBrowser } from '../utils/environment.js';\nimport { safeSerialize } from '../utils/formatting.js';\n\n/**\n * Universal file-based log handler for persistent logging\n * Works in both Node.js (real files) and browser (localStorage)\n */\nexport class FileLogHandler implements ILogHandler {\n private filename: string;\n private maxSize?: number;\n private fs?: any; // Node.js fs module\n\n constructor(filename: string = 'app.log', maxSize?: number) {\n this.filename = filename;\n this.maxSize = maxSize;\n \n // Load Node.js fs module if in Node environment\n if (isNode) {\n try {\n this.fs = require('fs');\n } catch (error) {\n console.warn('FileLogHandler: Unable to load fs module:', error);\n }\n }\n }\n\n handle(level: LogLevel, message: string, args: any[], metadata: LogMetadata): void {\n const logEntry = {\n timestamp: metadata.timestamp,\n level: level.toUpperCase(),\n prefix: metadata.prefix,\n message,\n args: args.slice(1).map(arg => safeSerialize(arg)),\n location: metadata.stackInfo,\n };\n\n const logLine = this.formatLogLine(logEntry);\n\n if (isNode && this.fs) {\n this.writeToFileNode(logLine);\n } else if (isBrowser) {\n this.writeToFileLocal(logLine);\n } else {\n // Fallback - just console output\n console.log(`[FILE-LOG] ${logLine}`);\n }\n }\n\n /**\n * Format log entry as a single line for file storage\n */\n private formatLogLine(entry: any): string {\n const parts = [\n entry.timestamp,\n `[${entry.level}]`,\n entry.prefix ? `[${entry.prefix}]` : '',\n entry.message\n ].filter(Boolean);\n\n let line = parts.join(' ');\n \n if (entry.args && entry.args.length > 0) {\n line += ' ' + entry.args.map((arg: any) => \n typeof arg === 'object' ? JSON.stringify(arg) : String(arg)\n ).join(' ');\n }\n \n if (entry.location) {\n line += ` (${entry.location.file}:${entry.location.line}:${entry.location.column})`;\n }\n \n return line;\n }\n\n /**\n * Write to actual file in Node.js environment\n */\n private writeToFileNode(logLine: string): void {\n if (!this.fs) return;\n\n try {\n // Check file size if maxSize is set\n if (this.maxSize) {\n try {\n const stats = this.fs.statSync(this.filename);\n if (stats.size > this.maxSize) {\n // Simple rotation: backup current file and start fresh\n const backupName = `${this.filename}.bak`;\n this.fs.renameSync(this.filename, backupName);\n }\n } catch (error) {\n // File doesn't exist yet, that's fine\n }\n }\n\n // Append to file\n this.fs.appendFileSync(this.filename, logLine + '\\n', 'utf8');\n } catch (error) {\n console.error('FileLogHandler: Failed to write to file:', error);\n }\n }\n\n /**\n * Write to localStorage in browser environment\n */\n private writeToFileLocal(logLine: string): void {\n try {\n const storageKey = `logger_${this.filename}`;\n const existingLogs = localStorage.getItem(storageKey) || '';\n \n let newLogs = existingLogs;\n if (existingLogs.length > 0) {\n newLogs += '\\n';\n }\n newLogs += logLine;\n \n // Simple size management - keep last 1000 lines max\n if (this.maxSize || newLogs.split('\\n').length > 1000) {\n const lines = newLogs.split('\\n');\n const maxLines = this.maxSize ? Math.floor(this.maxSize / 100) : 1000;\n if (lines.length > maxLines) {\n newLogs = lines.slice(-maxLines).join('\\n');\n }\n }\n \n localStorage.setItem(storageKey, newLogs);\n } catch (error) {\n console.error('FileLogHandler: Failed to write to localStorage:', error);\n }\n }\n\n /**\n * Get stored logs (useful for debugging)\n */\n getLogs(): string | null {\n if (isNode && this.fs) {\n try {\n return this.fs.readFileSync(this.filename, 'utf8');\n } catch (error) {\n return null;\n }\n } else if (isBrowser) {\n const storageKey = `logger_${this.filename}`;\n return localStorage.getItem(storageKey);\n }\n return null;\n }\n\n /**\n * Clear stored logs\n */\n clearLogs(): void {\n if (isNode && this.fs) {\n try {\n this.fs.writeFileSync(this.filename, '', 'utf8');\n } catch (error) {\n console.error('FileLogHandler: Failed to clear file:', error);\n }\n } else if (isBrowser) {\n const storageKey = `logger_${this.filename}`;\n localStorage.removeItem(storageKey);\n }\n }\n}","import type { TransportRecord, TransportOptions, ITransport } from '../types/index.js';\n\nexport interface FileTransportOptions extends TransportOptions {\n destination?: string;\n}\n\nexport class FileTransport implements ITransport {\n readonly name = 'file';\n private buffer: string[] = [];\n private flushTimer?: ReturnType<typeof setInterval>;\n private options: FileTransportOptions;\n\n constructor(options?: FileTransportOptions) {\n this.options = options || {};\n\n if (this.options.flushInterval) {\n this.flushTimer = setInterval(() => this.flush(), this.options.flushInterval);\n }\n }\n\n write(record: TransportRecord): void {\n const line = JSON.stringify(record) + '\\n';\n this.buffer.push(line);\n\n if (this.buffer.length >= (this.options.batchSize || 100)) {\n this.flush();\n }\n }\n\n async flush(): Promise<void> {\n if (this.buffer.length === 0) return;\n\n const lines = this.buffer.join('');\n this.buffer = [];\n\n if (typeof globalThis.process !== 'undefined' && typeof require === 'function') {\n try {\n const fs = require('fs');\n const dest = this.options.destination || 'app.log';\n fs.appendFileSync(dest, lines);\n } catch {\n // Silent fail in browser or if fs not available\n }\n }\n }\n\n close(): void {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n }\n this.flush();\n }\n}\n","import type { TransportRecord, TransportOptions, ITransport } from '../types/index.js';\n\nexport interface HttpTransportOptions extends TransportOptions {\n url?: string;\n headers?: Record<string, string>;\n}\n\nexport class HttpTransport implements ITransport {\n readonly name = 'http';\n private buffer: TransportRecord[] = [];\n private flushTimer?: ReturnType<typeof setInterval>;\n private options: HttpTransportOptions;\n\n constructor(options?: HttpTransportOptions) {\n this.options = options || {};\n\n if (this.options.flushInterval) {\n this.flushTimer = setInterval(() => this.flush(), this.options.flushInterval);\n }\n }\n\n write(record: TransportRecord): void {\n this.buffer.push(record);\n\n if (this.buffer.length >= (this.options.batchSize || 50)) {\n this.flush();\n }\n }\n\n async flush(): Promise<void> {\n if (this.buffer.length === 0 || !this.options.url) return;\n\n const records = [...this.buffer];\n this.buffer = [];\n\n try {\n await fetch(this.options.url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...this.options.headers\n },\n body: JSON.stringify({ logs: records })\n });\n } catch {\n this.buffer.unshift(...records);\n }\n }\n\n close(): void {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n }\n this.flush();\n }\n}\n"],"names":["DEFAULT_CONFIG","maxEntries","ttl","enabled","StyleCache","cache","Map","config","hitCount","missCount","constructor","this","generateKey","key","level","theme","presetName","hasPrefix","hasLocation","get","cacheKey","entry","Date","now","createdAt","delete","hits","set","format","styles","size","firstKey","keys","next","value","clear","getStats","total","maxSize","hitRate","misses","setEnabled","isEnabled","_styleCache","_logger","getLogger","Logger","index","stylePresets","success","StylePresets","build","error","warning","info","accent","handle","message","_args","metadata","timestamp","options","name","write","record","method","getConsoleMethod","prefix","location","file","line","console","toUpperCase","msg","filename","fs","isNode","require","warn","args","logEntry","slice","map","arg","safeSerialize","stackInfo","logLine","formatLogLine","writeToFileNode","isBrowser","writeToFileLocal","log","filter","Boolean","join","length","JSON","stringify","String","column","statSync","backupName","renameSync","appendFileSync","storageKey","existingLogs","localStorage","getItem","newLogs","split","lines","maxLines","Math","floor","setItem","getLogs","readFileSync","clearLogs","writeFileSync","removeItem","buffer","flushTimer","flushInterval","setInterval","flush","push","batchSize","globalThis","process","dest","destination","close","clearInterval","url","records","fetch","headers","body","logs","unshift","handler","addHandler","type","serializer","priority","addSerializer","target","addTransport","api","badgeName","badge","badgeList","badges","clearBadges","command","cli","closeTransports","component","StyleBuilder","critical","debug","flushTransports","label","collapsed","group","groupEnd","duration","logAnimated","svgContent","logWithSVG","event","callback","off","on","once","removeSerializer","id","removeTransport","scope","bannerType","setBannerType","setGlobalPrefix","setTheme","setVerbosity","showBanner","data","columns","table","time","timeEnd","trace","middleware","use"],"mappings":"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"}
|