halua 0.0.5 → 1.1.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 +8 -78
- package/lib/index.cjs +716 -0
- package/lib/index.d.cts +148 -0
- package/lib/index.d.ts +142 -50
- package/lib/index.js +646 -138
- package/package.json +22 -14
- package/lib/index.d.mts +0 -56
- package/lib/index.mjs +0 -149
package/lib/index.cjs
ADDED
|
@@ -0,0 +1,716 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/index.ts
|
|
21
|
+
var index_exports = {};
|
|
22
|
+
__export(index_exports, {
|
|
23
|
+
Level: () => Level,
|
|
24
|
+
NewJSONHandler: () => NewJSONHandler,
|
|
25
|
+
NewTextHandler: () => NewTextHandler,
|
|
26
|
+
NewWebConsoleHandler: () => NewWebConsoleHandler,
|
|
27
|
+
halua: () => halua
|
|
28
|
+
});
|
|
29
|
+
module.exports = __toCommonJS(index_exports);
|
|
30
|
+
|
|
31
|
+
// src/handlers/types.ts
|
|
32
|
+
var Level = /* @__PURE__ */ ((Level2) => {
|
|
33
|
+
Level2["Trace"] = "TRACE";
|
|
34
|
+
Level2["Debug"] = "DEBUG";
|
|
35
|
+
Level2["Info"] = "INFO";
|
|
36
|
+
Level2["Notice"] = "NOTICE";
|
|
37
|
+
Level2["Warn"] = "WARN";
|
|
38
|
+
Level2["Error"] = "ERROR";
|
|
39
|
+
Level2["Fatal"] = "FATAL";
|
|
40
|
+
return Level2;
|
|
41
|
+
})(Level || {});
|
|
42
|
+
|
|
43
|
+
// src/util/level.ts
|
|
44
|
+
function toLevel(v) {
|
|
45
|
+
return {
|
|
46
|
+
trace: "TRACE" /* Trace */,
|
|
47
|
+
debug: "DEBUG" /* Debug */,
|
|
48
|
+
info: "INFO" /* Info */,
|
|
49
|
+
warn: "WARN" /* Warn */,
|
|
50
|
+
notice: "NOTICE" /* Notice */,
|
|
51
|
+
error: "ERROR" /* Error */,
|
|
52
|
+
fatal: "FATAL" /* Fatal */,
|
|
53
|
+
assert: "ERROR" /* Error */
|
|
54
|
+
}[v];
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// src/util/string.ts
|
|
58
|
+
var defaultIgnored = /* @__PURE__ */ new Set();
|
|
59
|
+
function stringMatchesVar(str, ignoredStrings = defaultIgnored) {
|
|
60
|
+
return !ignoredStrings.has(str) && str.trim().indexOf(" ") === -1;
|
|
61
|
+
}
|
|
62
|
+
var messageFormatExcludes = /* @__PURE__ */ new Set([" ", "%a", "%w", "%t", "%l"]);
|
|
63
|
+
function extractNonFormatChars(f) {
|
|
64
|
+
let total = /* @__PURE__ */ new Set();
|
|
65
|
+
for (let char of f) {
|
|
66
|
+
if (!messageFormatExcludes.has(char)) {
|
|
67
|
+
total.add(char);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return total;
|
|
71
|
+
}
|
|
72
|
+
function extractTaken(f) {
|
|
73
|
+
let total = [];
|
|
74
|
+
let seq = "";
|
|
75
|
+
for (let rune of f) {
|
|
76
|
+
if (seq && (rune === "%" || rune === " ")) {
|
|
77
|
+
total.push(seq);
|
|
78
|
+
seq = "";
|
|
79
|
+
if (rune === "%") {
|
|
80
|
+
seq += rune;
|
|
81
|
+
}
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
seq += rune;
|
|
85
|
+
}
|
|
86
|
+
if (seq) {
|
|
87
|
+
total.push(seq);
|
|
88
|
+
}
|
|
89
|
+
return total;
|
|
90
|
+
}
|
|
91
|
+
function removeTailingUndefinedValues(format, log) {
|
|
92
|
+
if (!argsInDisposition(format) || log.withArgs) {
|
|
93
|
+
return format;
|
|
94
|
+
}
|
|
95
|
+
let argsIndex = format.indexOf("%a");
|
|
96
|
+
let withArgsIndex = format.indexOf("%w");
|
|
97
|
+
if (withArgsIndex < argsIndex) {
|
|
98
|
+
return format;
|
|
99
|
+
}
|
|
100
|
+
return format.slice(0, argsIndex + 2);
|
|
101
|
+
}
|
|
102
|
+
function argsInDisposition(format) {
|
|
103
|
+
let indexOfArgs = format.indexOf("%a");
|
|
104
|
+
let indexOfWithArgs = format.indexOf("%w");
|
|
105
|
+
let indexOfTimestamp = format.indexOf("%t");
|
|
106
|
+
let indexOfLevel = format.indexOf("l");
|
|
107
|
+
return Math.max(indexOfTimestamp, indexOfLevel) < Math.min(indexOfArgs, indexOfWithArgs);
|
|
108
|
+
}
|
|
109
|
+
function getConvertStartingIndex(format) {
|
|
110
|
+
let sum = format.indexOf("%t") + format.indexOf("%l");
|
|
111
|
+
if (sum === -2) {
|
|
112
|
+
return 0;
|
|
113
|
+
}
|
|
114
|
+
if (sum === 0) {
|
|
115
|
+
return 1;
|
|
116
|
+
}
|
|
117
|
+
return 2;
|
|
118
|
+
}
|
|
119
|
+
function extractLevels(level) {
|
|
120
|
+
if (typeof level !== "string") {
|
|
121
|
+
return ["INFO" /* Info */, 0];
|
|
122
|
+
}
|
|
123
|
+
let data = level.split("+");
|
|
124
|
+
if (data.length !== 2) {
|
|
125
|
+
let levels = ["TRACE" /* Trace */, "DEBUG" /* Debug */, "INFO" /* Info */, "WARN" /* Warn */, "NOTICE" /* Notice */, "ERROR" /* Error */, "FATAL" /* Fatal */];
|
|
126
|
+
for (let l of levels) {
|
|
127
|
+
if (level.includes(l)) {
|
|
128
|
+
return [l, Math.trunc(level.split(l)[1])];
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return [data[0], Math.trunc(data[1]) || 0];
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// src/errors.ts
|
|
136
|
+
var FailedToCallHandlerLog = class extends Error {
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
// src/HandlersBalancer.ts
|
|
140
|
+
var MajorLevelMap = /* @__PURE__ */ new Map([
|
|
141
|
+
["FATAL" /* Fatal */, /* @__PURE__ */ new Set(["FATAL" /* Fatal */])],
|
|
142
|
+
["ERROR" /* Error */, /* @__PURE__ */ new Set(["FATAL" /* Fatal */, "ERROR" /* Error */])],
|
|
143
|
+
["WARN" /* Warn */, /* @__PURE__ */ new Set(["FATAL" /* Fatal */, "ERROR" /* Error */, "WARN" /* Warn */])],
|
|
144
|
+
["NOTICE" /* Notice */, /* @__PURE__ */ new Set(["FATAL" /* Fatal */, "ERROR" /* Error */, "WARN" /* Warn */, "NOTICE" /* Notice */])],
|
|
145
|
+
["INFO" /* Info */, /* @__PURE__ */ new Set(["FATAL" /* Fatal */, "ERROR" /* Error */, "WARN" /* Warn */, "NOTICE" /* Notice */, "INFO" /* Info */])],
|
|
146
|
+
["DEBUG" /* Debug */, /* @__PURE__ */ new Set(["FATAL" /* Fatal */, "ERROR" /* Error */, "WARN" /* Warn */, "NOTICE" /* Notice */, "INFO" /* Info */, "DEBUG" /* Debug */])],
|
|
147
|
+
["TRACE" /* Trace */, /* @__PURE__ */ new Set(["FATAL" /* Fatal */, "ERROR" /* Error */, "WARN" /* Warn */, "NOTICE" /* Notice */, "INFO" /* Info */, "DEBUG" /* Debug */, "TRACE" /* Trace */])]
|
|
148
|
+
]);
|
|
149
|
+
var HandlersBalancer = class {
|
|
150
|
+
constructor(level, handlers) {
|
|
151
|
+
this.level = level;
|
|
152
|
+
this.handlers = handlers;
|
|
153
|
+
}
|
|
154
|
+
map = /* @__PURE__ */ new Map();
|
|
155
|
+
sendLog(log) {
|
|
156
|
+
this.discover(log.level);
|
|
157
|
+
this.send(log);
|
|
158
|
+
}
|
|
159
|
+
reset() {
|
|
160
|
+
this.map.clear();
|
|
161
|
+
}
|
|
162
|
+
discover(level) {
|
|
163
|
+
if (this.map.get(level)) {
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
let discovered = [];
|
|
167
|
+
this.map.set(level, discovered);
|
|
168
|
+
for (let h of this.handlers) {
|
|
169
|
+
if (h.exact) {
|
|
170
|
+
if (h.exact.some((l) => l === level)) {
|
|
171
|
+
discovered.push(h);
|
|
172
|
+
}
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
if (this.canSend(extractLevels(level), h.level)) {
|
|
176
|
+
discovered.push(h);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
send(log) {
|
|
181
|
+
try {
|
|
182
|
+
for (let h of this.map.get(log.level) || []) {
|
|
183
|
+
h.skipDeepCopyWhenSendingLog ? h.log(log) : h.log(structuredClone(log));
|
|
184
|
+
}
|
|
185
|
+
} catch (e) {
|
|
186
|
+
throw new FailedToCallHandlerLog(`Unable to call .log method of a handler, ${e}`, { cause: e });
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
canSend(l, to = this.level || "TRACE" /* Trace */) {
|
|
190
|
+
let tol = extractLevels(to);
|
|
191
|
+
return this.majorLevelCheck(l[0], tol[0]) + this.minorLevelCheck(l[1], tol[1]) > 0;
|
|
192
|
+
}
|
|
193
|
+
majorLevelCheck(l, to) {
|
|
194
|
+
if (!MajorLevelMap.get(to).has(l)) {
|
|
195
|
+
return -1;
|
|
196
|
+
}
|
|
197
|
+
return l === to ? 0 : 1;
|
|
198
|
+
}
|
|
199
|
+
minorLevelCheck(l, to) {
|
|
200
|
+
return l >= to ? 1 : 0;
|
|
201
|
+
}
|
|
202
|
+
};
|
|
203
|
+
|
|
204
|
+
// src/main.ts
|
|
205
|
+
var Halua = class _Halua {
|
|
206
|
+
constructor(passed, options = {}) {
|
|
207
|
+
this.options = options;
|
|
208
|
+
this.passedHandlers = passed;
|
|
209
|
+
this.options.messageFormat ??= "%t %l %a | %w";
|
|
210
|
+
this.validateHandlers(this.buildHandlers(passed));
|
|
211
|
+
this.handlers = this.buildHandlers(passed);
|
|
212
|
+
this.balancer = new HandlersBalancer(this.options.level || "TRACE" /* Trace */, this.handlers);
|
|
213
|
+
}
|
|
214
|
+
handlers = [];
|
|
215
|
+
passedHandlers;
|
|
216
|
+
balancer;
|
|
217
|
+
New(arg1 = this.passedHandlers, arg2 = this.options) {
|
|
218
|
+
if (Array.isArray(arg1)) {
|
|
219
|
+
this.validateHandlers(this.buildHandlers(arg1));
|
|
220
|
+
return new _Halua(arg1, { ...arg2 });
|
|
221
|
+
}
|
|
222
|
+
if (this.supposeIsHandler(arg1)) {
|
|
223
|
+
return new _Halua(arg1, { ...arg2 });
|
|
224
|
+
}
|
|
225
|
+
if (Object.keys(arg1).length) {
|
|
226
|
+
return new _Halua(this.passedHandlers, { ...arg1 });
|
|
227
|
+
}
|
|
228
|
+
this.validateHandlers(this.buildHandlers(arg1));
|
|
229
|
+
return new _Halua(arg1, { ...arg2 });
|
|
230
|
+
}
|
|
231
|
+
With(...args) {
|
|
232
|
+
return new _Halua(this.passedHandlers, { ...this.options, withArgs: (this.options.withArgs || []).concat(args) });
|
|
233
|
+
}
|
|
234
|
+
withMessageFormat(f) {
|
|
235
|
+
this.unlinkInheritance();
|
|
236
|
+
this.options.messageFormat = f;
|
|
237
|
+
return this;
|
|
238
|
+
}
|
|
239
|
+
setHandler(handler) {
|
|
240
|
+
this.validateHandlers(this.buildHandlers(handler));
|
|
241
|
+
this.handlers = this.buildHandlers(handler);
|
|
242
|
+
this.updateBalancer();
|
|
243
|
+
}
|
|
244
|
+
appendHandler(handler) {
|
|
245
|
+
this.validateHandlers(this.buildHandlers(handler));
|
|
246
|
+
this.handlers.push(...this.buildHandlers(handler));
|
|
247
|
+
this.updateBalancer();
|
|
248
|
+
}
|
|
249
|
+
logTo(level, ...args) {
|
|
250
|
+
this.balancer.sendLog(this.composeLog(level, true, ...args));
|
|
251
|
+
}
|
|
252
|
+
trace(...args) {
|
|
253
|
+
this.sendToHandler("trace", true, ...args);
|
|
254
|
+
}
|
|
255
|
+
debug(...args) {
|
|
256
|
+
this.sendToHandler("debug", true, ...args);
|
|
257
|
+
}
|
|
258
|
+
info(...args) {
|
|
259
|
+
this.sendToHandler("info", true, ...args);
|
|
260
|
+
}
|
|
261
|
+
warn(...args) {
|
|
262
|
+
this.sendToHandler("warn", true, ...args);
|
|
263
|
+
}
|
|
264
|
+
notice(...args) {
|
|
265
|
+
this.sendToHandler("notice", true, ...args);
|
|
266
|
+
}
|
|
267
|
+
error(...args) {
|
|
268
|
+
this.sendToHandler("error", true, ...args);
|
|
269
|
+
}
|
|
270
|
+
fatal(...args) {
|
|
271
|
+
this.sendToHandler("fatal", true, ...args);
|
|
272
|
+
}
|
|
273
|
+
assert(assertion, ...args) {
|
|
274
|
+
if (assertion) {
|
|
275
|
+
return;
|
|
276
|
+
}
|
|
277
|
+
this.sendToHandler("assert", assertion, ...args);
|
|
278
|
+
}
|
|
279
|
+
updateBalancer() {
|
|
280
|
+
this.balancer = new HandlersBalancer(this.options.level || "TRACE" /* Trace */, this.handlers);
|
|
281
|
+
}
|
|
282
|
+
sendToHandler(field, assertion = true, ...args) {
|
|
283
|
+
this.balancer.sendLog(this.composeLog(toLevel(field), assertion, ...args));
|
|
284
|
+
}
|
|
285
|
+
composeLog(level, assertion, ...args) {
|
|
286
|
+
return {
|
|
287
|
+
timestamp: Date.now(),
|
|
288
|
+
args: args || [],
|
|
289
|
+
withArgs: this.options?.withArgs || null,
|
|
290
|
+
messageFormat: this.options.messageFormat,
|
|
291
|
+
assertion,
|
|
292
|
+
level,
|
|
293
|
+
leveling: extractLevels(level)
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
validateHandlers(v) {
|
|
297
|
+
let handlers = Array.isArray(v) ? v : [v];
|
|
298
|
+
if (this.options.errorPolicy === "throw") {
|
|
299
|
+
for (let h of handlers) {
|
|
300
|
+
if (!this.supposeIsHandler(h)) {
|
|
301
|
+
throw new Error("Passed handlers does not satisfy Handler interface");
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
supposeIsHandler(v) {
|
|
307
|
+
return Object.prototype.hasOwnProperty.call(v.__proto__, "log") || Object.prototype.hasOwnProperty.call(v, "log");
|
|
308
|
+
}
|
|
309
|
+
unlinkInheritance() {
|
|
310
|
+
this.options = structuredClone(this.options);
|
|
311
|
+
}
|
|
312
|
+
buildHandlers(passed) {
|
|
313
|
+
let entries = Array.isArray(passed) ? passed : [passed];
|
|
314
|
+
return entries.map((v) => v());
|
|
315
|
+
}
|
|
316
|
+
};
|
|
317
|
+
|
|
318
|
+
// src/handlers/WebConsoleHandler/webConsoleUtils.ts
|
|
319
|
+
function getColorKey(level) {
|
|
320
|
+
return {
|
|
321
|
+
["TRACE" /* Trace */]: "grey",
|
|
322
|
+
["DEBUG" /* Debug */]: "purple",
|
|
323
|
+
["INFO" /* Info */]: "blue",
|
|
324
|
+
["WARN" /* Warn */]: "orange",
|
|
325
|
+
["NOTICE" /* Notice */]: "orange",
|
|
326
|
+
["ERROR" /* Error */]: "red",
|
|
327
|
+
["FATAL" /* Fatal */]: "red"
|
|
328
|
+
}[level];
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
// src/util/array.ts
|
|
332
|
+
function arrayed(v) {
|
|
333
|
+
return Array.isArray(v) ? v : typeof v === "undefined" ? [] : [v];
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
// src/util/date.ts
|
|
337
|
+
function getPrettyDate(t) {
|
|
338
|
+
let d = new Date(t);
|
|
339
|
+
return `${d.toLocaleDateString()} ${d.toLocaleTimeString()}`;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
// src/handlers/WebConsoleHandler/WebConsoleHandler.ts
|
|
343
|
+
function NewWebConsoleHandler(c = console, options = {}) {
|
|
344
|
+
return () => new class WebConsoleLog {
|
|
345
|
+
constructor(options2) {
|
|
346
|
+
this.options = options2;
|
|
347
|
+
this.level = options2.level;
|
|
348
|
+
this.exact = options2.exact ? arrayed(options2.exact) : void 0;
|
|
349
|
+
this.options = options2 || {};
|
|
350
|
+
this.options.fetchBrowserThemeOnInstanceCreation ??= true;
|
|
351
|
+
this.messageFormatRaw = options2.messageFormat ?? this.messageFormatRaw;
|
|
352
|
+
this.messageFormat = Array.from(extractTaken(this.messageFormatRaw));
|
|
353
|
+
if (!this.options.pretty) {
|
|
354
|
+
return;
|
|
355
|
+
}
|
|
356
|
+
if (this.options.fetchBrowserThemeOnInstanceCreation) {
|
|
357
|
+
if (window?.matchMedia && window?.matchMedia("(prefers-color-scheme: dark)").matches) {
|
|
358
|
+
this.colors = new Map(this.darkColors);
|
|
359
|
+
} else {
|
|
360
|
+
this.colors = new Map(this.lightColors);
|
|
361
|
+
}
|
|
362
|
+
delete this.options.fetchBrowserThemeOnInstanceCreation;
|
|
363
|
+
} else {
|
|
364
|
+
this.colors = new Map(this.lightColors);
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
skipDeepCopyWhenSendingLog = false;
|
|
368
|
+
messageFormat = [];
|
|
369
|
+
level;
|
|
370
|
+
exact;
|
|
371
|
+
messageFormatRaw = "%t %l %a | %w";
|
|
372
|
+
colors = /* @__PURE__ */ new Map([]);
|
|
373
|
+
// bg chrome #fefbff
|
|
374
|
+
lightColors = /* @__PURE__ */ new Map([
|
|
375
|
+
["grey", "#565656"],
|
|
376
|
+
["green", "#224912"],
|
|
377
|
+
["blue", "#195367"],
|
|
378
|
+
["purple", "#8A228A"],
|
|
379
|
+
["orange", "#7F3E1E"],
|
|
380
|
+
["red", "#A51818"]
|
|
381
|
+
]);
|
|
382
|
+
// bg chrome #27242a
|
|
383
|
+
darkColors = /* @__PURE__ */ new Map([
|
|
384
|
+
["grey", "#C9C9C9"],
|
|
385
|
+
["green", "#73CE73"],
|
|
386
|
+
["blue", "#93B9E7"],
|
|
387
|
+
["purple", "#DCA4E9"],
|
|
388
|
+
["orange", "#EEC5A8"],
|
|
389
|
+
["red", "#FC9292"]
|
|
390
|
+
]);
|
|
391
|
+
get linkArguments() {
|
|
392
|
+
return this.options.linkArguments !== void 0 && !this.options.linkArguments;
|
|
393
|
+
}
|
|
394
|
+
log(log) {
|
|
395
|
+
this.sendLog(log);
|
|
396
|
+
}
|
|
397
|
+
setDateGetter(dateGetter) {
|
|
398
|
+
this.options.dateGetter = dateGetter;
|
|
399
|
+
}
|
|
400
|
+
sendLog(log) {
|
|
401
|
+
let args = this.insertInternalEntries(log);
|
|
402
|
+
if (log.level === "DEBUG" /* Debug */) {
|
|
403
|
+
c.debug(this.composeConsoleSubstitution(args), ...args);
|
|
404
|
+
return;
|
|
405
|
+
}
|
|
406
|
+
if (log.level === "WARN" /* Warn */ && this.options.useWarn) {
|
|
407
|
+
c.warn(this.composeConsoleSubstitution(args), ...args);
|
|
408
|
+
return;
|
|
409
|
+
}
|
|
410
|
+
if (log.level === "ERROR" /* Error */ && this.options.useError) {
|
|
411
|
+
c.error(this.composeConsoleSubstitution(args), ...args);
|
|
412
|
+
return;
|
|
413
|
+
}
|
|
414
|
+
c.info(this.composeConsoleSubstitution(args), ...args);
|
|
415
|
+
}
|
|
416
|
+
insertInternalEntries(log) {
|
|
417
|
+
if (this.options.pretty) {
|
|
418
|
+
return this.prepareMessagePretty(log);
|
|
419
|
+
}
|
|
420
|
+
return this.prepareMessage(log);
|
|
421
|
+
}
|
|
422
|
+
composeConsoleSubstitution(data, startingVarConvertIndex = 2) {
|
|
423
|
+
let str = "";
|
|
424
|
+
startingVarConvertIndex = getConvertStartingIndex(this.messageFormatRaw);
|
|
425
|
+
if (this.options.pretty) {
|
|
426
|
+
startingVarConvertIndex = 3;
|
|
427
|
+
}
|
|
428
|
+
for (let i = this.options.pretty ? startingVarConvertIndex : 0; i < data.length; i++) {
|
|
429
|
+
let last = i === data.length - 1;
|
|
430
|
+
let v = data[i];
|
|
431
|
+
let takenNames = extractTaken(this.messageFormatRaw);
|
|
432
|
+
let vWithEqualSign = typeof v === "string" && stringMatchesVar(v, /* @__PURE__ */ new Set([]));
|
|
433
|
+
let nextVWithEqualSign = !last && typeof data[i + 1] === "string" && stringMatchesVar(data[i + 1], /* @__PURE__ */ new Set([]));
|
|
434
|
+
if (nextVWithEqualSign) {
|
|
435
|
+
startingVarConvertIndex = Math.max(startingVarConvertIndex, i);
|
|
436
|
+
}
|
|
437
|
+
if (!this.linkArguments && !takenNames.includes(v) && !last && i > startingVarConvertIndex && vWithEqualSign) {
|
|
438
|
+
data[i] = `${v} =`;
|
|
439
|
+
}
|
|
440
|
+
if (typeof v === "string") {
|
|
441
|
+
str += `%s${last ? "" : " "}`;
|
|
442
|
+
continue;
|
|
443
|
+
}
|
|
444
|
+
if (typeof v === "number") {
|
|
445
|
+
str += `%d${last ? "" : " "}`;
|
|
446
|
+
continue;
|
|
447
|
+
}
|
|
448
|
+
str += `%o${last ? "" : " "}`;
|
|
449
|
+
}
|
|
450
|
+
return str;
|
|
451
|
+
}
|
|
452
|
+
prepareMessagePretty(log) {
|
|
453
|
+
let format = [...this.messageFormat];
|
|
454
|
+
if (!log.withArgs) {
|
|
455
|
+
format = format.slice(0, format.indexOf("%a") + 1);
|
|
456
|
+
}
|
|
457
|
+
let message = [];
|
|
458
|
+
let colors = "";
|
|
459
|
+
let colorKeys = [];
|
|
460
|
+
for (let i = 0; i <= format.length - 1; i++) {
|
|
461
|
+
if (format[i] === "%w") {
|
|
462
|
+
message.push(...log.withArgs || []);
|
|
463
|
+
continue;
|
|
464
|
+
}
|
|
465
|
+
if (format[i] === "%t") {
|
|
466
|
+
colors += `%c${this.prepareDate(log.timestamp)} `;
|
|
467
|
+
colorKeys.push(`color:${this.options.customColors?.get("grey") || this.colors.get("grey")}`);
|
|
468
|
+
continue;
|
|
469
|
+
}
|
|
470
|
+
if (format[i] === "%a") {
|
|
471
|
+
colors += "%c";
|
|
472
|
+
colorKeys.push(`color:${this.options.customColors?.get("green") || this.colors.get("green")}`);
|
|
473
|
+
message.push(...log.args);
|
|
474
|
+
continue;
|
|
475
|
+
}
|
|
476
|
+
if (format[i] === "%l") {
|
|
477
|
+
colors += `%c${log.level}`;
|
|
478
|
+
let colorKey = getColorKey(log.leveling[0]);
|
|
479
|
+
colorKeys.push(`color:${this.options.customColors?.get(colorKey) || this.colors.get(colorKey)}`);
|
|
480
|
+
continue;
|
|
481
|
+
}
|
|
482
|
+
message.push(format[i]);
|
|
483
|
+
}
|
|
484
|
+
return [colors, ...colorKeys, ...message];
|
|
485
|
+
}
|
|
486
|
+
prepareMessage(log) {
|
|
487
|
+
let format = [...this.messageFormat];
|
|
488
|
+
if (!log.withArgs) {
|
|
489
|
+
format = format.slice(0, format.indexOf("%a") + 1);
|
|
490
|
+
}
|
|
491
|
+
let message = [];
|
|
492
|
+
for (let i = 0; i <= format.length - 1; i++) {
|
|
493
|
+
if (format[i] === "%w") {
|
|
494
|
+
message.push(...log.withArgs || []);
|
|
495
|
+
continue;
|
|
496
|
+
}
|
|
497
|
+
if (format[i] === "%t") {
|
|
498
|
+
message.push(this.prepareDate(log.timestamp));
|
|
499
|
+
continue;
|
|
500
|
+
}
|
|
501
|
+
if (format[i] === "%a") {
|
|
502
|
+
message.push(...log.args);
|
|
503
|
+
continue;
|
|
504
|
+
}
|
|
505
|
+
if (format[i] === "%l") {
|
|
506
|
+
message.push(log.level);
|
|
507
|
+
continue;
|
|
508
|
+
}
|
|
509
|
+
message.push(format[i]);
|
|
510
|
+
}
|
|
511
|
+
return message;
|
|
512
|
+
}
|
|
513
|
+
prepareDate(t) {
|
|
514
|
+
if (this.options.dateGetter) {
|
|
515
|
+
return this.options.dateGetter(t);
|
|
516
|
+
}
|
|
517
|
+
return getPrettyDate(t);
|
|
518
|
+
}
|
|
519
|
+
}(options);
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
// src/util/dataReplacer.ts
|
|
523
|
+
function replaceDataBeforeStringify(value) {
|
|
524
|
+
if (typeof value === "symbol") {
|
|
525
|
+
return value.toString();
|
|
526
|
+
}
|
|
527
|
+
if (value instanceof Set) {
|
|
528
|
+
return Array.from(value);
|
|
529
|
+
}
|
|
530
|
+
if (value instanceof Map) {
|
|
531
|
+
let obj = {};
|
|
532
|
+
for (let key of value.keys()) {
|
|
533
|
+
obj[key] = value.get(key);
|
|
534
|
+
}
|
|
535
|
+
return obj;
|
|
536
|
+
}
|
|
537
|
+
if (value instanceof Error) {
|
|
538
|
+
return value.toString();
|
|
539
|
+
}
|
|
540
|
+
return value;
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
// src/handlers/JSONHandler/JSONHandler.ts
|
|
544
|
+
function NewJSONHandler(send, options = {}) {
|
|
545
|
+
return () => new class JSONLog {
|
|
546
|
+
constructor(options2) {
|
|
547
|
+
this.options = options2;
|
|
548
|
+
this.level = options2.level;
|
|
549
|
+
this.exact = options2.exact ? arrayed(options2.exact) : void 0;
|
|
550
|
+
this.options = options2 || {};
|
|
551
|
+
}
|
|
552
|
+
level;
|
|
553
|
+
exact;
|
|
554
|
+
takenNames = /* @__PURE__ */ new Set(["timestamp", "level", "args"]);
|
|
555
|
+
log(log) {
|
|
556
|
+
this.sendLog(log);
|
|
557
|
+
}
|
|
558
|
+
setDateGetter(getter) {
|
|
559
|
+
this.options.dateGetter = getter;
|
|
560
|
+
}
|
|
561
|
+
sendLog(log) {
|
|
562
|
+
try {
|
|
563
|
+
delete log.assertion;
|
|
564
|
+
delete log.messageFormat;
|
|
565
|
+
delete log.leveling;
|
|
566
|
+
log.timestamp = this.formatDate(log.timestamp);
|
|
567
|
+
send(JSON.stringify(this.flattenLinkedArguments(log), this.replacer.bind(this)));
|
|
568
|
+
} catch (err) {
|
|
569
|
+
if (log.level !== "ERROR" /* Error */) {
|
|
570
|
+
this.log({
|
|
571
|
+
args: [`err while trying to stringify JSON ${err}`],
|
|
572
|
+
timestamp: log.timestamp,
|
|
573
|
+
level: "ERROR" /* Error */,
|
|
574
|
+
leveling: ["ERROR" /* Error */, 0]
|
|
575
|
+
});
|
|
576
|
+
}
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
formatDate(timestamp) {
|
|
580
|
+
if (this.options?.dateGetter) {
|
|
581
|
+
return this.options.dateGetter(timestamp);
|
|
582
|
+
}
|
|
583
|
+
return new Date(timestamp).toISOString();
|
|
584
|
+
}
|
|
585
|
+
flattenLinkedArguments(log) {
|
|
586
|
+
if (this.options?.linkArguments !== void 0 && this.options?.linkArguments === false) {
|
|
587
|
+
return log;
|
|
588
|
+
}
|
|
589
|
+
if (log.withArgs) {
|
|
590
|
+
this.composeLogWithArgsFlattened(log);
|
|
591
|
+
}
|
|
592
|
+
delete log.withArgs;
|
|
593
|
+
return log;
|
|
594
|
+
}
|
|
595
|
+
composeLogWithArgsFlattened(log) {
|
|
596
|
+
let composedLog = log;
|
|
597
|
+
let name = "";
|
|
598
|
+
for (let arg of log.withArgs) {
|
|
599
|
+
if (typeof arg === "string" && stringMatchesVar(arg)) {
|
|
600
|
+
name = arg;
|
|
601
|
+
continue;
|
|
602
|
+
}
|
|
603
|
+
if (name && !this.takenNames.has(name)) {
|
|
604
|
+
composedLog[name] = arg;
|
|
605
|
+
name = "";
|
|
606
|
+
continue;
|
|
607
|
+
}
|
|
608
|
+
log.args?.push(arg);
|
|
609
|
+
}
|
|
610
|
+
return log;
|
|
611
|
+
}
|
|
612
|
+
replacer(_, value) {
|
|
613
|
+
if (this.options.replaceBeforeStringify) {
|
|
614
|
+
let v = this.options.replaceBeforeStringify(value);
|
|
615
|
+
if (v !== null) {
|
|
616
|
+
return v;
|
|
617
|
+
}
|
|
618
|
+
}
|
|
619
|
+
return replaceDataBeforeStringify(value);
|
|
620
|
+
}
|
|
621
|
+
}(options);
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
// src/util/stringify.ts
|
|
625
|
+
function stringifyValue(value, stringifier = JSON.stringify) {
|
|
626
|
+
if (typeof value === "symbol") {
|
|
627
|
+
return value.toString();
|
|
628
|
+
}
|
|
629
|
+
if (value instanceof Set) {
|
|
630
|
+
return `Set[${Array.from(value)}]`;
|
|
631
|
+
}
|
|
632
|
+
if (value instanceof Error) {
|
|
633
|
+
return value.toString();
|
|
634
|
+
}
|
|
635
|
+
if (Array.isArray(value)) {
|
|
636
|
+
return `[${value}]`;
|
|
637
|
+
}
|
|
638
|
+
if (typeof value === "string") {
|
|
639
|
+
return `${value}`;
|
|
640
|
+
}
|
|
641
|
+
return stringifier(value, (_, data) => replaceDataBeforeStringify(data));
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
// src/handlers/TextHandler/TextHandler.ts
|
|
645
|
+
function NewTextHandler(send, options = {}) {
|
|
646
|
+
return () => new class TextLog {
|
|
647
|
+
constructor(options2) {
|
|
648
|
+
this.options = options2;
|
|
649
|
+
this.level = options2.level;
|
|
650
|
+
this.exact = options2.exact ? arrayed(options2.exact) : void 0;
|
|
651
|
+
}
|
|
652
|
+
skipDeepCopyWhenSendingLog = true;
|
|
653
|
+
level;
|
|
654
|
+
exact;
|
|
655
|
+
get linkArguments() {
|
|
656
|
+
return this.options.linkArguments !== void 0 && !this.options.linkArguments;
|
|
657
|
+
}
|
|
658
|
+
log(log) {
|
|
659
|
+
this.sendLog(log);
|
|
660
|
+
}
|
|
661
|
+
sendLog(log) {
|
|
662
|
+
let args = "";
|
|
663
|
+
let withArgs = "";
|
|
664
|
+
let msg = this.options.messageFormat || log.messageFormat;
|
|
665
|
+
if (log.args) {
|
|
666
|
+
args = this.composeVariablesString(msg, log.args);
|
|
667
|
+
}
|
|
668
|
+
if (log.withArgs) {
|
|
669
|
+
withArgs = this.composeVariablesString(msg, log.withArgs);
|
|
670
|
+
}
|
|
671
|
+
msg = removeTailingUndefinedValues(msg, log);
|
|
672
|
+
send(
|
|
673
|
+
msg.replace("%w", withArgs).replace("%a", args).replace("%l", log.level).replace(
|
|
674
|
+
"%t",
|
|
675
|
+
this.options.dateGetter?.(log.timestamp) ?? getPrettyDate(log.timestamp)
|
|
676
|
+
)
|
|
677
|
+
);
|
|
678
|
+
}
|
|
679
|
+
composeVariablesString(format, data) {
|
|
680
|
+
let str = "";
|
|
681
|
+
let excluded = extractNonFormatChars(format);
|
|
682
|
+
for (let i = 0; i < data.length; i++) {
|
|
683
|
+
let last = i === data.length - 1;
|
|
684
|
+
let nextIsNotLinked = typeof data[i + 1] === "string" && stringMatchesVar(data[i + 1], excluded);
|
|
685
|
+
let v = data[i];
|
|
686
|
+
if (!this.linkArguments && !last && typeof v === "string" && stringMatchesVar(v, excluded) && !nextIsNotLinked) {
|
|
687
|
+
str += `${v}=${this.formatValue(data[i + 1])} `;
|
|
688
|
+
i += 1;
|
|
689
|
+
continue;
|
|
690
|
+
}
|
|
691
|
+
str += `${this.formatValue(v)}${last ? "" : " "}`;
|
|
692
|
+
}
|
|
693
|
+
return str.trim();
|
|
694
|
+
}
|
|
695
|
+
formatValue(v) {
|
|
696
|
+
if (this.options.replaceBeforeStringify) {
|
|
697
|
+
let val = this.options.replaceBeforeStringify(v);
|
|
698
|
+
if (val !== null) {
|
|
699
|
+
return val;
|
|
700
|
+
}
|
|
701
|
+
}
|
|
702
|
+
return stringifyValue(v, this.options.stringifier);
|
|
703
|
+
}
|
|
704
|
+
}(options);
|
|
705
|
+
}
|
|
706
|
+
|
|
707
|
+
// src/index.ts
|
|
708
|
+
var halua = new Halua(NewWebConsoleHandler());
|
|
709
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
710
|
+
0 && (module.exports = {
|
|
711
|
+
Level,
|
|
712
|
+
NewJSONHandler,
|
|
713
|
+
NewTextHandler,
|
|
714
|
+
NewWebConsoleHandler,
|
|
715
|
+
halua
|
|
716
|
+
});
|