@feizk/logger 1.6.0 → 2.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/README.md +140 -58
- package/dist/index.d.mts +182 -41
- package/dist/index.d.ts +182 -41
- package/dist/index.js +289 -133
- package/dist/index.mjs +286 -121
- package/package.json +14 -6
- package/dist/index.js.map +0 -1
- package/dist/index.mjs.map +0 -1
package/dist/index.mjs
CHANGED
|
@@ -1,162 +1,327 @@
|
|
|
1
|
-
// src/
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
// src/constants.ts
|
|
2
|
+
var LOG_LEVEL_PRIORITIES = {
|
|
3
|
+
trace: 0,
|
|
4
|
+
debug: 1,
|
|
5
|
+
info: 2,
|
|
6
|
+
warn: 3,
|
|
7
|
+
error: 4,
|
|
8
|
+
fatal: 5
|
|
9
|
+
};
|
|
10
|
+
var ANSI = {
|
|
11
|
+
reset: "\x1B[0m",
|
|
12
|
+
bold: "\x1B[1m",
|
|
13
|
+
dim: "\x1B[2m",
|
|
14
|
+
red: "\x1B[31m",
|
|
15
|
+
green: "\x1B[32m",
|
|
16
|
+
yellow: "\x1B[33m",
|
|
17
|
+
blue: "\x1B[34m",
|
|
18
|
+
magenta: "\x1B[35m",
|
|
19
|
+
cyan: "\x1B[36m",
|
|
20
|
+
gray: "\x1B[90m",
|
|
21
|
+
white: "\x1B[37m",
|
|
22
|
+
bgRed: "\x1B[41m"
|
|
23
|
+
};
|
|
24
|
+
var LEVEL_COLORS = {
|
|
25
|
+
trace: ANSI.gray,
|
|
26
|
+
debug: ANSI.cyan,
|
|
27
|
+
info: ANSI.blue,
|
|
28
|
+
warn: ANSI.yellow,
|
|
29
|
+
error: ANSI.red,
|
|
30
|
+
fatal: `${ANSI.bgRed}${ANSI.white}${ANSI.bold}`
|
|
31
|
+
};
|
|
32
|
+
var LEVEL_LABELS = {
|
|
33
|
+
trace: "[TRACE]",
|
|
34
|
+
debug: "[DEBUG]",
|
|
35
|
+
info: "[INFO]",
|
|
36
|
+
warn: "[WARN]",
|
|
37
|
+
error: "[ERROR]",
|
|
38
|
+
fatal: "[FATAL]"
|
|
7
39
|
};
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
40
|
+
var CONSOLE_METHODS = {
|
|
41
|
+
trace: "trace",
|
|
42
|
+
debug: "debug",
|
|
43
|
+
info: "log",
|
|
44
|
+
warn: "warn",
|
|
45
|
+
error: "error",
|
|
46
|
+
fatal: "error"
|
|
47
|
+
};
|
|
48
|
+
var TIMESTAMP_PRESETS = {
|
|
49
|
+
iso: (date) => date.toISOString(),
|
|
50
|
+
locale: (date) => date.toLocaleString()
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
// src/utils.ts
|
|
54
|
+
var coloredLabelCache = /* @__PURE__ */ new Map();
|
|
55
|
+
function getColoredLabel(level, enableColors) {
|
|
56
|
+
const cacheKey = `${level}:${enableColors}`;
|
|
57
|
+
const cached = coloredLabelCache.get(cacheKey);
|
|
58
|
+
if (cached !== void 0) return cached;
|
|
59
|
+
const label = LEVEL_LABELS[level];
|
|
60
|
+
if (!enableColors) {
|
|
61
|
+
coloredLabelCache.set(cacheKey, label);
|
|
62
|
+
return label;
|
|
63
|
+
}
|
|
64
|
+
const color = LEVEL_COLORS[level];
|
|
65
|
+
const result = `${color}${label}${ANSI.reset}`;
|
|
66
|
+
coloredLabelCache.set(cacheKey, result);
|
|
67
|
+
return result;
|
|
11
68
|
}
|
|
12
|
-
function
|
|
13
|
-
if (
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
"[DEBUG]": chalk.gray(level)
|
|
19
|
-
};
|
|
20
|
-
return colors[level] || level;
|
|
69
|
+
function formatTimestamp(option, date = /* @__PURE__ */ new Date()) {
|
|
70
|
+
if (typeof option === "function") {
|
|
71
|
+
return option(date);
|
|
72
|
+
}
|
|
73
|
+
const preset = TIMESTAMP_PRESETS[option];
|
|
74
|
+
return preset(date);
|
|
21
75
|
}
|
|
22
|
-
function
|
|
23
|
-
const
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
76
|
+
function formatJson(entry) {
|
|
77
|
+
const message = entry.args.map((arg) => {
|
|
78
|
+
if (typeof arg === "string") return arg;
|
|
79
|
+
try {
|
|
80
|
+
return JSON.stringify(arg);
|
|
81
|
+
} catch {
|
|
82
|
+
return String(arg);
|
|
83
|
+
}
|
|
84
|
+
}).join(" ");
|
|
85
|
+
const output = {
|
|
86
|
+
level: entry.level,
|
|
87
|
+
timestamp: entry.timestamp,
|
|
88
|
+
message
|
|
28
89
|
};
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
function formatLog(level, timestamp, args, options) {
|
|
35
|
-
const { formatLog: formatLog2, enableColors = true } = options;
|
|
36
|
-
const coloredLevel = getColor(level, enableColors);
|
|
37
|
-
if (formatLog2) {
|
|
38
|
-
return [formatLog2(coloredLevel, timestamp, args)];
|
|
90
|
+
if (entry.prefix) {
|
|
91
|
+
output.prefix = entry.prefix;
|
|
92
|
+
}
|
|
93
|
+
if (Object.keys(entry.context).length > 0) {
|
|
94
|
+
output.context = entry.context;
|
|
39
95
|
}
|
|
40
|
-
return
|
|
96
|
+
return JSON.stringify(output);
|
|
97
|
+
}
|
|
98
|
+
function buildMessage(args) {
|
|
99
|
+
return args.map((arg) => {
|
|
100
|
+
if (typeof arg === "string") return arg;
|
|
101
|
+
try {
|
|
102
|
+
return JSON.stringify(arg);
|
|
103
|
+
} catch {
|
|
104
|
+
return String(arg);
|
|
105
|
+
}
|
|
106
|
+
}).join(" ");
|
|
41
107
|
}
|
|
42
108
|
|
|
43
109
|
// src/logger.ts
|
|
44
|
-
var
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
error: 3
|
|
50
|
-
};
|
|
51
|
-
var Logger = class {
|
|
110
|
+
var Logger = class _Logger {
|
|
111
|
+
/**
|
|
112
|
+
* Create a new Logger instance.
|
|
113
|
+
* @param options - Configuration options
|
|
114
|
+
*/
|
|
52
115
|
constructor(options = {}) {
|
|
53
116
|
this.options = {
|
|
117
|
+
level: options.level ?? "debug",
|
|
118
|
+
silent: options.silent ?? false,
|
|
54
119
|
enableColors: options.enableColors ?? true,
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
120
|
+
timestamp: options.timestamp ?? "iso",
|
|
121
|
+
formatter: options.formatter,
|
|
122
|
+
json: options.json ?? false,
|
|
123
|
+
transports: [...options.transports ?? []],
|
|
124
|
+
prefix: options.prefix,
|
|
125
|
+
context: { ...options.context ?? {} }
|
|
58
126
|
};
|
|
59
|
-
this.
|
|
127
|
+
this.transports = this.options.transports;
|
|
128
|
+
this.prefix = this.options.prefix;
|
|
129
|
+
this.context = this.options.context;
|
|
60
130
|
}
|
|
131
|
+
// ============================================================================
|
|
132
|
+
// Public Log Methods
|
|
133
|
+
// ============================================================================
|
|
61
134
|
/**
|
|
62
|
-
*
|
|
63
|
-
* @param
|
|
135
|
+
* Log a trace message (most verbose).
|
|
136
|
+
* @param args - Arguments to log
|
|
137
|
+
*/
|
|
138
|
+
trace(...args) {
|
|
139
|
+
this.log("trace", args);
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Log a debug message.
|
|
143
|
+
* @param args - Arguments to log
|
|
144
|
+
*/
|
|
145
|
+
debug(...args) {
|
|
146
|
+
this.log("debug", args);
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Log an info message.
|
|
150
|
+
* @param args - Arguments to log
|
|
151
|
+
*/
|
|
152
|
+
info(...args) {
|
|
153
|
+
this.log("info", args);
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Log a warning message.
|
|
157
|
+
* @param args - Arguments to log
|
|
158
|
+
*/
|
|
159
|
+
warn(...args) {
|
|
160
|
+
this.log("warn", args);
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Log an error message.
|
|
164
|
+
* @param args - Arguments to log
|
|
165
|
+
*/
|
|
166
|
+
error(...args) {
|
|
167
|
+
this.log("error", args);
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Log a fatal message (most severe).
|
|
171
|
+
* @param args - Arguments to log
|
|
172
|
+
*/
|
|
173
|
+
fatal(...args) {
|
|
174
|
+
this.log("fatal", args);
|
|
175
|
+
}
|
|
176
|
+
// ============================================================================
|
|
177
|
+
// Level Management
|
|
178
|
+
// ============================================================================
|
|
179
|
+
/**
|
|
180
|
+
* Set the minimum log level.
|
|
181
|
+
* @param level - The log level to set
|
|
64
182
|
*/
|
|
65
183
|
setLevel(level) {
|
|
66
|
-
this.level = level;
|
|
184
|
+
this.options.level = level;
|
|
67
185
|
}
|
|
68
186
|
/**
|
|
69
|
-
*
|
|
70
|
-
* @
|
|
71
|
-
* @param timestamp - The formatted timestamp.
|
|
72
|
-
* @param args - The log arguments.
|
|
187
|
+
* Get the current log level.
|
|
188
|
+
* @returns The current log level
|
|
73
189
|
*/
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
190
|
+
getLevel() {
|
|
191
|
+
return this.options.level;
|
|
192
|
+
}
|
|
193
|
+
// ============================================================================
|
|
194
|
+
// Transport Management
|
|
195
|
+
// ============================================================================
|
|
196
|
+
/**
|
|
197
|
+
* Add a transport to the logger.
|
|
198
|
+
* @param transport - The transport to add
|
|
199
|
+
*/
|
|
200
|
+
addTransport(transport) {
|
|
201
|
+
this.transports.push(transport);
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Remove a transport from the logger.
|
|
205
|
+
* @param transport - The transport to remove
|
|
206
|
+
*/
|
|
207
|
+
removeTransport(transport) {
|
|
208
|
+
const index = this.transports.indexOf(transport);
|
|
209
|
+
if (index !== -1) {
|
|
210
|
+
this.transports.splice(index, 1);
|
|
81
211
|
}
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
212
|
+
}
|
|
213
|
+
// ============================================================================
|
|
214
|
+
// Child Logger
|
|
215
|
+
// ============================================================================
|
|
216
|
+
/**
|
|
217
|
+
* Create a child logger with additional prefix and context.
|
|
218
|
+
* @param options - Child logger options
|
|
219
|
+
* @returns A new Logger instance
|
|
220
|
+
*/
|
|
221
|
+
child(options = {}) {
|
|
222
|
+
const combinedPrefix = options.prefix ? this.prefix ? `${this.prefix}:${options.prefix}` : options.prefix : this.prefix;
|
|
223
|
+
const combinedContext = {
|
|
224
|
+
...this.context,
|
|
225
|
+
...options.context ?? {}
|
|
89
226
|
};
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
227
|
+
return new _Logger({
|
|
228
|
+
level: options.level ?? this.options.level,
|
|
229
|
+
silent: options.silent ?? this.options.silent,
|
|
230
|
+
enableColors: this.options.enableColors,
|
|
231
|
+
timestamp: this.options.timestamp,
|
|
232
|
+
formatter: this.options.formatter,
|
|
233
|
+
json: this.options.json,
|
|
234
|
+
transports: this.transports.slice(),
|
|
235
|
+
prefix: combinedPrefix,
|
|
236
|
+
context: combinedContext
|
|
95
237
|
});
|
|
96
238
|
}
|
|
239
|
+
// ============================================================================
|
|
240
|
+
// Cleanup
|
|
241
|
+
// ============================================================================
|
|
97
242
|
/**
|
|
98
|
-
*
|
|
99
|
-
*
|
|
100
|
-
* @returns True if the message should be logged.
|
|
243
|
+
* Destroy the logger and all its transports.
|
|
244
|
+
* Calls destroy() on all registered transports.
|
|
101
245
|
*/
|
|
102
|
-
|
|
103
|
-
|
|
246
|
+
async destroy() {
|
|
247
|
+
const destroyPromises = this.transports.map(async (transport) => {
|
|
248
|
+
if (typeof transport.destroy === "function") {
|
|
249
|
+
await transport.destroy();
|
|
250
|
+
}
|
|
251
|
+
});
|
|
252
|
+
await Promise.all(destroyPromises);
|
|
253
|
+
this.transports.length = 0;
|
|
104
254
|
}
|
|
255
|
+
// ============================================================================
|
|
256
|
+
// Private Methods
|
|
257
|
+
// ============================================================================
|
|
105
258
|
/**
|
|
106
|
-
*
|
|
107
|
-
* @param
|
|
259
|
+
* Core logging method - all public methods delegate here.
|
|
260
|
+
* @param level - The log level
|
|
261
|
+
* @param args - The arguments to log
|
|
108
262
|
*/
|
|
109
|
-
|
|
110
|
-
if (!this.shouldLog(
|
|
111
|
-
const
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
263
|
+
log(level, args) {
|
|
264
|
+
if (!this.shouldLog(level)) return;
|
|
265
|
+
const entry = {
|
|
266
|
+
level,
|
|
267
|
+
timestamp: formatTimestamp(this.options.timestamp),
|
|
268
|
+
args,
|
|
269
|
+
prefix: this.prefix,
|
|
270
|
+
context: this.context
|
|
271
|
+
};
|
|
272
|
+
if (!this.options.silent) {
|
|
273
|
+
this.writeToConsole(level, entry);
|
|
274
|
+
}
|
|
275
|
+
for (const transport of this.transports) {
|
|
276
|
+
this.dispatchToTransport(transport, entry);
|
|
277
|
+
}
|
|
117
278
|
}
|
|
118
279
|
/**
|
|
119
|
-
*
|
|
120
|
-
* @param
|
|
280
|
+
* Write a log entry to the console.
|
|
281
|
+
* @param level - The log level
|
|
282
|
+
* @param entry - The log entry
|
|
121
283
|
*/
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
this.options.
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
284
|
+
writeToConsole(level, entry) {
|
|
285
|
+
const method = CONSOLE_METHODS[level];
|
|
286
|
+
if (this.options.formatter) {
|
|
287
|
+
console[method](this.options.formatter(entry));
|
|
288
|
+
return;
|
|
289
|
+
}
|
|
290
|
+
if (this.options.json) {
|
|
291
|
+
console[method](formatJson(entry));
|
|
292
|
+
return;
|
|
293
|
+
}
|
|
294
|
+
const label = getColoredLabel(entry.level, this.options.enableColors);
|
|
295
|
+
const prefixStr = entry.prefix ? ` [${entry.prefix}]` : "";
|
|
296
|
+
const message = buildMessage(entry.args);
|
|
297
|
+
console[method](`${label} ${entry.timestamp}${prefixStr}`, message);
|
|
130
298
|
}
|
|
131
299
|
/**
|
|
132
|
-
*
|
|
133
|
-
* @param
|
|
300
|
+
* Dispatch a log entry to a transport.
|
|
301
|
+
* @param transport - The transport
|
|
302
|
+
* @param entry - The log entry
|
|
134
303
|
*/
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
304
|
+
dispatchToTransport(transport, entry) {
|
|
305
|
+
try {
|
|
306
|
+
const result = transport.log(entry);
|
|
307
|
+
if (result instanceof Promise) {
|
|
308
|
+
result.catch(() => {
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
} catch {
|
|
312
|
+
}
|
|
143
313
|
}
|
|
144
314
|
/**
|
|
145
|
-
*
|
|
146
|
-
* @param
|
|
315
|
+
* Check if a log level should be output.
|
|
316
|
+
* @param level - The log level to check
|
|
317
|
+
* @returns True if the message should be logged
|
|
147
318
|
*/
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
const timestamp = formatTimestamp(
|
|
151
|
-
this.options.formatTimestamp,
|
|
152
|
-
TIMESTAMP_TYPES
|
|
153
|
-
);
|
|
154
|
-
console.log(...formatLog("[DEBUG]", timestamp, args, this.options));
|
|
155
|
-
this.sendToDiscord("debug", timestamp, args);
|
|
319
|
+
shouldLog(level) {
|
|
320
|
+
return LOG_LEVEL_PRIORITIES[level] >= LOG_LEVEL_PRIORITIES[this.options.level];
|
|
156
321
|
}
|
|
157
322
|
};
|
|
158
323
|
export {
|
|
159
|
-
|
|
160
|
-
|
|
324
|
+
LEVEL_LABELS,
|
|
325
|
+
LOG_LEVEL_PRIORITIES,
|
|
326
|
+
Logger
|
|
161
327
|
};
|
|
162
|
-
//# sourceMappingURL=index.mjs.map
|
package/package.json
CHANGED
|
@@ -1,14 +1,20 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@feizk/logger",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "A
|
|
5
|
-
"main": "dist/index.
|
|
3
|
+
"version": "2.0.0",
|
|
4
|
+
"description": "A lightweight, pluggable logger with colored outputs, structured logging, and transport support",
|
|
5
|
+
"main": "dist/index.cjs",
|
|
6
|
+
"module": "dist/index.js",
|
|
6
7
|
"types": "dist/index.d.ts",
|
|
7
8
|
"publishConfig": {
|
|
8
9
|
"access": "public"
|
|
9
10
|
},
|
|
10
|
-
"
|
|
11
|
-
"
|
|
11
|
+
"exports": {
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
13
|
+
"import": "./dist/index.js",
|
|
14
|
+
"require": "./dist/index.cjs"
|
|
15
|
+
},
|
|
16
|
+
"engines": {
|
|
17
|
+
"node": ">=18"
|
|
12
18
|
},
|
|
13
19
|
"devDependencies": {
|
|
14
20
|
"@types/node": "^20.0.0",
|
|
@@ -22,7 +28,9 @@
|
|
|
22
28
|
"logger",
|
|
23
29
|
"console",
|
|
24
30
|
"colors",
|
|
25
|
-
"timestamps"
|
|
31
|
+
"timestamps",
|
|
32
|
+
"structured-logging",
|
|
33
|
+
"transports"
|
|
26
34
|
],
|
|
27
35
|
"author": "feizk",
|
|
28
36
|
"license": "MIT",
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/utils.ts","../src/logger.ts"],"sourcesContent":["export { Logger } from './logger';\nexport { TIMESTAMP_TYPES } from './utils';\nexport type {\n LoggerOptions,\n LogLevel,\n TimestampTypes,\n TimestampType,\n DiscordOptions,\n} from './types';\n","import chalk from 'chalk';\nimport type { LoggerOptions, TimestampTypes, LogLevel } from './types';\n\nexport const TIMESTAMP_TYPES: TimestampTypes = {\n ISO: 'iso',\n Locale: 'locale',\n Custom: 'custom',\n};\n\nexport function formatTimestamp(\n formatTimestampFn: NonNullable<LoggerOptions['formatTimestamp']>,\n types: TimestampTypes,\n date: Date = new Date(),\n): string {\n const [, timestamp] = formatTimestampFn(types, date);\n return timestamp;\n}\n\nexport function getColor(level: string, enableColors: boolean): string {\n if (!enableColors) return level;\n const colors: Record<string, string> = {\n '[INFO]': chalk.blue(level),\n '[WARN]': chalk.yellow(level),\n '[ERROR]': chalk.red(level),\n '[DEBUG]': chalk.gray(level),\n };\n return colors[level] || level;\n}\n\nexport function getDiscordColor(level: LogLevel): number {\n const colors: Record<LogLevel, number> = {\n debug: 0x95a5a6,\n info: 0x3498db,\n warn: 0xf39c12,\n error: 0xe74c3c,\n };\n return colors[level];\n}\n\nexport function generateId(): string {\n return Math.random().toString(36).substr(2, 8).toUpperCase();\n}\n\nexport function formatLog(\n level: string,\n timestamp: string,\n args: unknown[],\n options: LoggerOptions,\n): [string, ...unknown[]] {\n const { formatLog, enableColors = true } = options;\n const coloredLevel = getColor(level, enableColors);\n if (formatLog) {\n return [formatLog(coloredLevel, timestamp, args)];\n }\n return [`${coloredLevel} ${timestamp}`, ...args];\n}\n","import type { LoggerOptions, LogLevel, TimestampTypes } from './types';\nimport {\n formatTimestamp,\n formatLog,\n TIMESTAMP_TYPES,\n getDiscordColor,\n generateId,\n} from './utils';\n\nimport type { TimestampType } from './types';\n\nconst defaultFormatTimestamp = (\n types: TimestampTypes,\n date: Date = new Date(),\n): [TimestampType, string] => [types.ISO, date.toISOString()];\n\nconst LOG_LEVEL_PRIORITIES: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n};\n\n/**\n * A simple logger with colored outputs and timestamps.\n */\nexport class Logger {\n private options: LoggerOptions;\n private level: LogLevel;\n\n constructor(options: LoggerOptions = {}) {\n this.options = {\n enableColors: options.enableColors ?? true,\n formatTimestamp: options.formatTimestamp ?? defaultFormatTimestamp,\n formatLog: options.formatLog,\n discord: options.discord,\n };\n this.level = options.level ?? 'debug';\n }\n\n /**\n * Sets the minimum log level for filtering messages.\n * @param level - The log level to set.\n */\n setLevel(level: LogLevel): void {\n this.level = level;\n }\n\n /**\n * Sends a log message to Discord via webhook if configured.\n * @param level - The log level.\n * @param timestamp - The formatted timestamp.\n * @param args - The log arguments.\n */\n private async sendToDiscord(\n level: LogLevel,\n timestamp: string,\n args: unknown[],\n ): Promise<void> {\n const discord = this.options.discord;\n if (!discord?.enable) return;\n\n try {\n new URL(discord.webhookURL);\n } catch {\n return;\n }\n\n const message = args\n .map((arg) => (typeof arg === 'string' ? arg : JSON.stringify(arg)))\n .join(' ');\n\n const title = `${level.toUpperCase()}-${generateId()}`;\n\n const embed = discord.formatEmbed\n ? discord.formatEmbed(level, timestamp, message)\n : {\n title,\n description: message,\n timestamp: new Date().toISOString(),\n color: getDiscordColor(level),\n };\n\n await fetch(discord.webhookURL, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ embeds: [embed] }),\n }).catch(() => {});\n }\n\n /**\n * Checks if a log level should be output based on the current log level.\n * @param level - The log level to check.\n * @returns True if the message should be logged.\n */\n private shouldLog(level: LogLevel): boolean {\n return LOG_LEVEL_PRIORITIES[level] >= LOG_LEVEL_PRIORITIES[this.level];\n }\n\n /**\n * Logs an info message.\n * @param args - The arguments to log.\n */\n info(...args: unknown[]): void {\n if (!this.shouldLog('info')) return;\n const timestamp = formatTimestamp(\n this.options.formatTimestamp!,\n TIMESTAMP_TYPES,\n );\n console.log(...formatLog('[INFO]', timestamp, args, this.options));\n this.sendToDiscord('info', timestamp, args);\n }\n\n /**\n * Logs a warning message.\n * @param args - The arguments to log.\n */\n warn(...args: unknown[]): void {\n if (!this.shouldLog('warn')) return;\n const timestamp = formatTimestamp(\n this.options.formatTimestamp!,\n TIMESTAMP_TYPES,\n );\n console.log(...formatLog('[WARN]', timestamp, args, this.options));\n this.sendToDiscord('warn', timestamp, args);\n }\n\n /**\n * Logs an error message.\n * @param args - The arguments to log.\n */\n error(...args: unknown[]): void {\n if (!this.shouldLog('error')) return;\n const timestamp = formatTimestamp(\n this.options.formatTimestamp!,\n TIMESTAMP_TYPES,\n );\n console.log(...formatLog('[ERROR]', timestamp, args, this.options));\n this.sendToDiscord('error', timestamp, args);\n }\n\n /**\n * Logs a debug message.\n * @param args - The arguments to log.\n */\n debug(...args: unknown[]): void {\n if (!this.shouldLog('debug')) return;\n const timestamp = formatTimestamp(\n this.options.formatTimestamp!,\n TIMESTAMP_TYPES,\n );\n console.log(...formatLog('[DEBUG]', timestamp, args, this.options));\n this.sendToDiscord('debug', timestamp, args);\n }\n}\n"],"mappings":"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","names":["chalk","formatLog"]}
|
package/dist/index.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils.ts","../src/logger.ts"],"sourcesContent":["import chalk from 'chalk';\nimport type { LoggerOptions, TimestampTypes, LogLevel } from './types';\n\nexport const TIMESTAMP_TYPES: TimestampTypes = {\n ISO: 'iso',\n Locale: 'locale',\n Custom: 'custom',\n};\n\nexport function formatTimestamp(\n formatTimestampFn: NonNullable<LoggerOptions['formatTimestamp']>,\n types: TimestampTypes,\n date: Date = new Date(),\n): string {\n const [, timestamp] = formatTimestampFn(types, date);\n return timestamp;\n}\n\nexport function getColor(level: string, enableColors: boolean): string {\n if (!enableColors) return level;\n const colors: Record<string, string> = {\n '[INFO]': chalk.blue(level),\n '[WARN]': chalk.yellow(level),\n '[ERROR]': chalk.red(level),\n '[DEBUG]': chalk.gray(level),\n };\n return colors[level] || level;\n}\n\nexport function getDiscordColor(level: LogLevel): number {\n const colors: Record<LogLevel, number> = {\n debug: 0x95a5a6,\n info: 0x3498db,\n warn: 0xf39c12,\n error: 0xe74c3c,\n };\n return colors[level];\n}\n\nexport function generateId(): string {\n return Math.random().toString(36).substr(2, 8).toUpperCase();\n}\n\nexport function formatLog(\n level: string,\n timestamp: string,\n args: unknown[],\n options: LoggerOptions,\n): [string, ...unknown[]] {\n const { formatLog, enableColors = true } = options;\n const coloredLevel = getColor(level, enableColors);\n if (formatLog) {\n return [formatLog(coloredLevel, timestamp, args)];\n }\n return [`${coloredLevel} ${timestamp}`, ...args];\n}\n","import type { LoggerOptions, LogLevel, TimestampTypes } from './types';\nimport {\n formatTimestamp,\n formatLog,\n TIMESTAMP_TYPES,\n getDiscordColor,\n generateId,\n} from './utils';\n\nimport type { TimestampType } from './types';\n\nconst defaultFormatTimestamp = (\n types: TimestampTypes,\n date: Date = new Date(),\n): [TimestampType, string] => [types.ISO, date.toISOString()];\n\nconst LOG_LEVEL_PRIORITIES: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n};\n\n/**\n * A simple logger with colored outputs and timestamps.\n */\nexport class Logger {\n private options: LoggerOptions;\n private level: LogLevel;\n\n constructor(options: LoggerOptions = {}) {\n this.options = {\n enableColors: options.enableColors ?? true,\n formatTimestamp: options.formatTimestamp ?? defaultFormatTimestamp,\n formatLog: options.formatLog,\n discord: options.discord,\n };\n this.level = options.level ?? 'debug';\n }\n\n /**\n * Sets the minimum log level for filtering messages.\n * @param level - The log level to set.\n */\n setLevel(level: LogLevel): void {\n this.level = level;\n }\n\n /**\n * Sends a log message to Discord via webhook if configured.\n * @param level - The log level.\n * @param timestamp - The formatted timestamp.\n * @param args - The log arguments.\n */\n private async sendToDiscord(\n level: LogLevel,\n timestamp: string,\n args: unknown[],\n ): Promise<void> {\n const discord = this.options.discord;\n if (!discord?.enable) return;\n\n try {\n new URL(discord.webhookURL);\n } catch {\n return;\n }\n\n const message = args\n .map((arg) => (typeof arg === 'string' ? arg : JSON.stringify(arg)))\n .join(' ');\n\n const title = `${level.toUpperCase()}-${generateId()}`;\n\n const embed = discord.formatEmbed\n ? discord.formatEmbed(level, timestamp, message)\n : {\n title,\n description: message,\n timestamp: new Date().toISOString(),\n color: getDiscordColor(level),\n };\n\n await fetch(discord.webhookURL, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ embeds: [embed] }),\n }).catch(() => {});\n }\n\n /**\n * Checks if a log level should be output based on the current log level.\n * @param level - The log level to check.\n * @returns True if the message should be logged.\n */\n private shouldLog(level: LogLevel): boolean {\n return LOG_LEVEL_PRIORITIES[level] >= LOG_LEVEL_PRIORITIES[this.level];\n }\n\n /**\n * Logs an info message.\n * @param args - The arguments to log.\n */\n info(...args: unknown[]): void {\n if (!this.shouldLog('info')) return;\n const timestamp = formatTimestamp(\n this.options.formatTimestamp!,\n TIMESTAMP_TYPES,\n );\n console.log(...formatLog('[INFO]', timestamp, args, this.options));\n this.sendToDiscord('info', timestamp, args);\n }\n\n /**\n * Logs a warning message.\n * @param args - The arguments to log.\n */\n warn(...args: unknown[]): void {\n if (!this.shouldLog('warn')) return;\n const timestamp = formatTimestamp(\n this.options.formatTimestamp!,\n TIMESTAMP_TYPES,\n );\n console.log(...formatLog('[WARN]', timestamp, args, this.options));\n this.sendToDiscord('warn', timestamp, args);\n }\n\n /**\n * Logs an error message.\n * @param args - The arguments to log.\n */\n error(...args: unknown[]): void {\n if (!this.shouldLog('error')) return;\n const timestamp = formatTimestamp(\n this.options.formatTimestamp!,\n TIMESTAMP_TYPES,\n );\n console.log(...formatLog('[ERROR]', timestamp, args, this.options));\n this.sendToDiscord('error', timestamp, args);\n }\n\n /**\n * Logs a debug message.\n * @param args - The arguments to log.\n */\n debug(...args: unknown[]): void {\n if (!this.shouldLog('debug')) return;\n const timestamp = formatTimestamp(\n this.options.formatTimestamp!,\n TIMESTAMP_TYPES,\n );\n console.log(...formatLog('[DEBUG]', timestamp, args, this.options));\n this.sendToDiscord('debug', timestamp, args);\n }\n}\n"],"mappings":"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","names":["formatLog"]}
|