@decohere/scribe 0.0.1-dev.29 → 0.0.1-dev.3
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/package.json +1 -1
- package/src/console.adapter.js +64 -0
- package/src/logger.adapter.js +24 -0
- package/tests/console.adapter.custom-levels.spec.js +69 -0
- package/tests/console.adapter.spec.js +74 -0
- package/tests/env.spec.js +187 -0
- package/tests/logger.factory.default.spec.js +36 -0
- package/commonjs/src/console.adapter.js +0 -74
- package/commonjs/src/env.js +0 -94
- package/commonjs/src/errors.js +0 -14
- package/commonjs/src/index.js +0 -26
- package/commonjs/src/logger.adapter.js +0 -45
- package/commonjs/src/logger.factory.js +0 -78
- package/commonjs/src/logger.type.js +0 -6
- package/commonjs/src/testing/index.js +0 -6
- package/commonjs/src/types.js +0 -46
- package/es6/src/console.adapter.js +0 -64
- package/es6/src/logger.adapter.js +0 -27
- package/types/src/console.adapter.d.ts +0 -13
- package/types/src/env.d.ts +0 -27
- package/types/src/errors.d.ts +0 -2
- package/types/src/index.d.ts +0 -7
- package/types/src/logger.adapter.d.ts +0 -15
- package/types/src/logger.factory.d.ts +0 -25
- package/types/src/logger.type.d.ts +0 -13
- package/types/src/testing/index.d.ts +0 -1
- package/types/src/types.d.ts +0 -26
- /package/{es6/src → src}/env.js +0 -0
- /package/{es6/src → src}/errors.js +0 -0
- /package/{es6/src → src}/index.js +0 -0
- /package/{es6/src → src}/logger.factory.js +0 -0
- /package/{es6/src → src}/logger.type.js +0 -0
- /package/{es6/src → src}/testing/index.js +0 -0
- /package/{es6/src → src}/types.js +0 -0
package/package.json
CHANGED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { LogAdapter } from "./logger.adapter.js";
|
|
2
|
+
import { DefaultLogLevel, LogLevels } from "./types.js";
|
|
3
|
+
export class ConsoleAdapter extends LogAdapter {
|
|
4
|
+
configuredLevels;
|
|
5
|
+
configuredLogLevel = DefaultLogLevel;
|
|
6
|
+
configuredLogLevelValue = LogLevels.info;
|
|
7
|
+
constructor(_options = {}){
|
|
8
|
+
super();
|
|
9
|
+
}
|
|
10
|
+
configure(scribeOptions) {
|
|
11
|
+
// Get merged log levels (default + custom) using parent class method
|
|
12
|
+
this.configuredLevels = this.getLogLevels(scribeOptions);
|
|
13
|
+
const logLevelStr = scribeOptions.logLevel ?? DefaultLogLevel;
|
|
14
|
+
this.configuredLogLevel = logLevelStr;
|
|
15
|
+
this.configuredLogLevelValue = this.configuredLevels[logLevelStr] ?? LogLevels.info;
|
|
16
|
+
}
|
|
17
|
+
getLogger(name) {
|
|
18
|
+
const loggerName = name || "default";
|
|
19
|
+
return this.createConsoleLogger(loggerName);
|
|
20
|
+
}
|
|
21
|
+
createConsoleLogger(name) {
|
|
22
|
+
// Use the levels configured during the configure() call
|
|
23
|
+
const allLevels = this.configuredLevels;
|
|
24
|
+
const currentLevel = this.configuredLogLevel;
|
|
25
|
+
const threshold = this.configuredLogLevelValue;
|
|
26
|
+
const baseLogger = {
|
|
27
|
+
get currentLevel () {
|
|
28
|
+
return currentLevel;
|
|
29
|
+
},
|
|
30
|
+
get logLevels () {
|
|
31
|
+
return allLevels;
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
const logFunction = (level)=>(msg, ...args)=>{
|
|
35
|
+
const timestamp = new Date().toISOString();
|
|
36
|
+
let message;
|
|
37
|
+
if (typeof msg === "object") {
|
|
38
|
+
message = JSON.stringify(msg);
|
|
39
|
+
} else {
|
|
40
|
+
message = String(msg);
|
|
41
|
+
}
|
|
42
|
+
const logLine = `[${timestamp}] ${level.toUpperCase()} [${name}]: ${message}`;
|
|
43
|
+
if (args.length > 0) {
|
|
44
|
+
console.log(logLine, ...args);
|
|
45
|
+
} else {
|
|
46
|
+
console.log(logLine);
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
const noop = ()=>{};
|
|
50
|
+
// Start with base logger and isLevelEnabled method
|
|
51
|
+
const logger = Object.assign(baseLogger, {
|
|
52
|
+
isLevelEnabled: (level)=>(allLevels[level] ?? 0) >= threshold
|
|
53
|
+
});
|
|
54
|
+
// Dynamically add all log level methods (default + custom)
|
|
55
|
+
// Levels below the configured threshold are patched to noop
|
|
56
|
+
for (const [levelName, levelValue] of Object.entries(allLevels)){
|
|
57
|
+
// biome-ignore lint/suspicious/noExplicitAny: Dynamic logger level creation requires any
|
|
58
|
+
logger[levelName] = levelValue >= threshold ? logFunction(levelName) : noop;
|
|
59
|
+
}
|
|
60
|
+
return logger;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL3NjcmliZS9zY3JpYmUvc3JjL2NvbnNvbGUuYWRhcHRlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBMb2dBZGFwdGVyIH0gZnJvbSBcIi4vbG9nZ2VyLmFkYXB0ZXIuanNcIjtcbmltcG9ydCB0eXBlIHsgQmFzZUxvZ2dlciwgTG9nZ2VyIH0gZnJvbSBcIi4vbG9nZ2VyLnR5cGUuanNcIjtcbmltcG9ydCB7XG5cdERlZmF1bHRMb2dMZXZlbCxcblx0dHlwZSBMb2dBZGFwdGVyT3B0aW9ucyxcblx0TG9nTGV2ZWxzLFxuXHR0eXBlIFNjcmliZU9wdGlvbnMsXG59IGZyb20gXCIuL3R5cGVzLmpzXCI7XG5cbmV4cG9ydCB0eXBlIENvbnNvbGVBZGFwdGVyT3B0aW9ucyA9IHt9ICYgTG9nQWRhcHRlck9wdGlvbnM7XG5cbmV4cG9ydCBjbGFzcyBDb25zb2xlQWRhcHRlciBleHRlbmRzIExvZ0FkYXB0ZXIge1xuXHRwcml2YXRlIGNvbmZpZ3VyZWRMZXZlbHM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj47XG5cdHByaXZhdGUgY29uZmlndXJlZExvZ0xldmVsOiBzdHJpbmcgPSBEZWZhdWx0TG9nTGV2ZWw7XG5cdHByaXZhdGUgY29uZmlndXJlZExvZ0xldmVsVmFsdWU6IG51bWJlciA9IExvZ0xldmVscy5pbmZvO1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3Rvcihfb3B0aW9uczogQ29uc29sZUFkYXB0ZXJPcHRpb25zID0ge30pIHtcblx0XHRzdXBlcigpO1xuXHR9XG5cblx0cHVibGljIGNvbmZpZ3VyZTxUIGV4dGVuZHMgc3RyaW5nID0gbmV2ZXIsIEN1c3RvbU9ubHkgZXh0ZW5kcyB0cnVlIHwgZmFsc2UgPSBmYWxzZT4oXG5cdFx0c2NyaWJlT3B0aW9uczogU2NyaWJlT3B0aW9uczxULCBDdXN0b21Pbmx5Pixcblx0KSB7XG5cdFx0Ly8gR2V0IG1lcmdlZCBsb2cgbGV2ZWxzIChkZWZhdWx0ICsgY3VzdG9tKSB1c2luZyBwYXJlbnQgY2xhc3MgbWV0aG9kXG5cdFx0dGhpcy5jb25maWd1cmVkTGV2ZWxzID0gdGhpcy5nZXRMb2dMZXZlbHMoc2NyaWJlT3B0aW9ucyk7XG5cdFx0Y29uc3QgbG9nTGV2ZWxTdHIgPSBzY3JpYmVPcHRpb25zLmxvZ0xldmVsID8/IERlZmF1bHRMb2dMZXZlbDtcblx0XHR0aGlzLmNvbmZpZ3VyZWRMb2dMZXZlbCA9IGxvZ0xldmVsU3RyO1xuXHRcdHRoaXMuY29uZmlndXJlZExvZ0xldmVsVmFsdWUgPSB0aGlzLmNvbmZpZ3VyZWRMZXZlbHNbbG9nTGV2ZWxTdHJdID8/IExvZ0xldmVscy5pbmZvO1xuXHR9XG5cblx0cHVibGljIGdldExvZ2dlcjxUIGV4dGVuZHMgc3RyaW5nID0gbmV2ZXIsIEN1c3RvbU9ubHkgZXh0ZW5kcyB0cnVlIHwgZmFsc2UgPSBmYWxzZT4oXG5cdFx0bmFtZT86IHN0cmluZyxcblx0KTogTG9nZ2VyPFQsIEN1c3RvbU9ubHk+IHtcblx0XHRjb25zdCBsb2dnZXJOYW1lID0gbmFtZSB8fCBcImRlZmF1bHRcIjtcblx0XHRyZXR1cm4gdGhpcy5jcmVhdGVDb25zb2xlTG9nZ2VyPFQsIEN1c3RvbU9ubHk+KGxvZ2dlck5hbWUpO1xuXHR9XG5cblx0cHJpdmF0ZSBjcmVhdGVDb25zb2xlTG9nZ2VyPFxuXHRcdFQgZXh0ZW5kcyBzdHJpbmcgPSBuZXZlcixcblx0XHRDdXN0b21Pbmx5IGV4dGVuZHMgdHJ1ZSB8IGZhbHNlID0gZmFsc2UsXG5cdD4obmFtZTogc3RyaW5nKTogTG9nZ2VyPFQsIEN1c3RvbU9ubHk+IHtcblx0XHQvLyBVc2UgdGhlIGxldmVscyBjb25maWd1cmVkIGR1cmluZyB0aGUgY29uZmlndXJlKCkgY2FsbFxuXHRcdGNvbnN0IGFsbExldmVscyA9IHRoaXMuY29uZmlndXJlZExldmVscztcblx0XHRjb25zdCBjdXJyZW50TGV2ZWwgPSB0aGlzLmNvbmZpZ3VyZWRMb2dMZXZlbDtcblx0XHRjb25zdCB0aHJlc2hvbGQgPSB0aGlzLmNvbmZpZ3VyZWRMb2dMZXZlbFZhbHVlO1xuXG5cdFx0Y29uc3QgYmFzZUxvZ2dlcjogQmFzZUxvZ2dlciA9IHtcblx0XHRcdGdldCBjdXJyZW50TGV2ZWwoKSB7XG5cdFx0XHRcdHJldHVybiBjdXJyZW50TGV2ZWw7XG5cdFx0XHR9LFxuXHRcdFx0Z2V0IGxvZ0xldmVscygpIHtcblx0XHRcdFx0cmV0dXJuIGFsbExldmVscztcblx0XHRcdH0sXG5cdFx0fTtcblxuXHRcdGNvbnN0IGxvZ0Z1bmN0aW9uID1cblx0XHRcdChsZXZlbDogc3RyaW5nKSA9PlxuXHRcdFx0KG1zZzogc3RyaW5nIHwgbnVtYmVyIHwgb2JqZWN0LCAuLi5hcmdzOiB1bmtub3duW10pID0+IHtcblx0XHRcdFx0Y29uc3QgdGltZXN0YW1wID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuXHRcdFx0XHRsZXQgbWVzc2FnZTogc3RyaW5nO1xuXG5cdFx0XHRcdGlmICh0eXBlb2YgbXNnID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRcdFx0bWVzc2FnZSA9IEpTT04uc3RyaW5naWZ5KG1zZyk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bWVzc2FnZSA9IFN0cmluZyhtc2cpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29uc3QgbG9nTGluZSA9IGBbJHt0aW1lc3RhbXB9XSAke2xldmVsLnRvVXBwZXJDYXNlKCl9IFske25hbWV9XTogJHttZXNzYWdlfWA7XG5cblx0XHRcdFx0aWYgKGFyZ3MubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdGNvbnNvbGUubG9nKGxvZ0xpbmUsIC4uLmFyZ3MpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNvbnNvbGUubG9nKGxvZ0xpbmUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXG5cdFx0Y29uc3Qgbm9vcCA9ICgpID0+IHt9O1xuXG5cdFx0Ly8gU3RhcnQgd2l0aCBiYXNlIGxvZ2dlciBhbmQgaXNMZXZlbEVuYWJsZWQgbWV0aG9kXG5cdFx0Y29uc3QgbG9nZ2VyID0gT2JqZWN0LmFzc2lnbihiYXNlTG9nZ2VyLCB7XG5cdFx0XHRpc0xldmVsRW5hYmxlZDogKGxldmVsOiBzdHJpbmcpID0+IChhbGxMZXZlbHNbbGV2ZWxdID8/IDApID49IHRocmVzaG9sZCxcblx0XHR9KTtcblxuXHRcdC8vIER5bmFtaWNhbGx5IGFkZCBhbGwgbG9nIGxldmVsIG1ldGhvZHMgKGRlZmF1bHQgKyBjdXN0b20pXG5cdFx0Ly8gTGV2ZWxzIGJlbG93IHRoZSBjb25maWd1cmVkIHRocmVzaG9sZCBhcmUgcGF0Y2hlZCB0byBub29wXG5cdFx0Zm9yIChjb25zdCBbbGV2ZWxOYW1lLCBsZXZlbFZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhhbGxMZXZlbHMpKSB7XG5cdFx0XHQvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IER5bmFtaWMgbG9nZ2VyIGxldmVsIGNyZWF0aW9uIHJlcXVpcmVzIGFueVxuXHRcdFx0KGxvZ2dlciBhcyBhbnkpW2xldmVsTmFtZV0gPSBsZXZlbFZhbHVlID49IHRocmVzaG9sZCA/IGxvZ0Z1bmN0aW9uKGxldmVsTmFtZSkgOiBub29wO1xuXHRcdH1cblxuXHRcdHJldHVybiBsb2dnZXIgYXMgTG9nZ2VyPFQsIEN1c3RvbU9ubHk+O1xuXHR9XG59XG4iXSwibmFtZXMiOlsiTG9nQWRhcHRlciIsIkRlZmF1bHRMb2dMZXZlbCIsIkxvZ0xldmVscyIsIkNvbnNvbGVBZGFwdGVyIiwiY29uZmlndXJlZExldmVscyIsImNvbmZpZ3VyZWRMb2dMZXZlbCIsImNvbmZpZ3VyZWRMb2dMZXZlbFZhbHVlIiwiaW5mbyIsIl9vcHRpb25zIiwiY29uZmlndXJlIiwic2NyaWJlT3B0aW9ucyIsImdldExvZ0xldmVscyIsImxvZ0xldmVsU3RyIiwibG9nTGV2ZWwiLCJnZXRMb2dnZXIiLCJuYW1lIiwibG9nZ2VyTmFtZSIsImNyZWF0ZUNvbnNvbGVMb2dnZXIiLCJhbGxMZXZlbHMiLCJjdXJyZW50TGV2ZWwiLCJ0aHJlc2hvbGQiLCJiYXNlTG9nZ2VyIiwibG9nTGV2ZWxzIiwibG9nRnVuY3Rpb24iLCJsZXZlbCIsIm1zZyIsImFyZ3MiLCJ0aW1lc3RhbXAiLCJEYXRlIiwidG9JU09TdHJpbmciLCJtZXNzYWdlIiwiSlNPTiIsInN0cmluZ2lmeSIsIlN0cmluZyIsImxvZ0xpbmUiLCJ0b1VwcGVyQ2FzZSIsImxlbmd0aCIsImNvbnNvbGUiLCJsb2ciLCJub29wIiwibG9nZ2VyIiwiT2JqZWN0IiwiYXNzaWduIiwiaXNMZXZlbEVuYWJsZWQiLCJsZXZlbE5hbWUiLCJsZXZlbFZhbHVlIiwiZW50cmllcyJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsVUFBVSxRQUFRLHNCQUFzQjtBQUVqRCxTQUNDQyxlQUFlLEVBRWZDLFNBQVMsUUFFSCxhQUFhO0FBSXBCLE9BQU8sTUFBTUMsdUJBQXVCSDtJQUMzQkksaUJBQXlDO0lBQ3pDQyxxQkFBNkJKLGdCQUFnQjtJQUM3Q0ssMEJBQWtDSixVQUFVSyxJQUFJLENBQUM7SUFFekQsWUFBbUJDLFdBQWtDLENBQUMsQ0FBQyxDQUFFO1FBQ3hELEtBQUs7SUFDTjtJQUVPQyxVQUNOQyxhQUEyQyxFQUMxQztRQUNELHFFQUFxRTtRQUNyRSxJQUFJLENBQUNOLGdCQUFnQixHQUFHLElBQUksQ0FBQ08sWUFBWSxDQUFDRDtRQUMxQyxNQUFNRSxjQUFjRixjQUFjRyxRQUFRLElBQUlaO1FBQzlDLElBQUksQ0FBQ0ksa0JBQWtCLEdBQUdPO1FBQzFCLElBQUksQ0FBQ04sdUJBQXVCLEdBQUcsSUFBSSxDQUFDRixnQkFBZ0IsQ0FBQ1EsWUFBWSxJQUFJVixVQUFVSyxJQUFJO0lBQ3BGO0lBRU9PLFVBQ05DLElBQWEsRUFDVztRQUN4QixNQUFNQyxhQUFhRCxRQUFRO1FBQzNCLE9BQU8sSUFBSSxDQUFDRSxtQkFBbUIsQ0FBZ0JEO0lBQ2hEO0lBRVFDLG9CQUdORixJQUFZLEVBQXlCO1FBQ3RDLHdEQUF3RDtRQUN4RCxNQUFNRyxZQUFZLElBQUksQ0FBQ2QsZ0JBQWdCO1FBQ3ZDLE1BQU1lLGVBQWUsSUFBSSxDQUFDZCxrQkFBa0I7UUFDNUMsTUFBTWUsWUFBWSxJQUFJLENBQUNkLHVCQUF1QjtRQUU5QyxNQUFNZSxhQUF5QjtZQUM5QixJQUFJRixnQkFBZTtnQkFDbEIsT0FBT0E7WUFDUjtZQUNBLElBQUlHLGFBQVk7Z0JBQ2YsT0FBT0o7WUFDUjtRQUNEO1FBRUEsTUFBTUssY0FDTCxDQUFDQyxRQUNELENBQUNDLEtBQStCLEdBQUdDO2dCQUNsQyxNQUFNQyxZQUFZLElBQUlDLE9BQU9DLFdBQVc7Z0JBQ3hDLElBQUlDO2dCQUVKLElBQUksT0FBT0wsUUFBUSxVQUFVO29CQUM1QkssVUFBVUMsS0FBS0MsU0FBUyxDQUFDUDtnQkFDMUIsT0FBTztvQkFDTkssVUFBVUcsT0FBT1I7Z0JBQ2xCO2dCQUVBLE1BQU1TLFVBQVUsQ0FBQyxDQUFDLEVBQUVQLFVBQVUsRUFBRSxFQUFFSCxNQUFNVyxXQUFXLEdBQUcsRUFBRSxFQUFFcEIsS0FBSyxHQUFHLEVBQUVlLFNBQVM7Z0JBRTdFLElBQUlKLEtBQUtVLE1BQU0sR0FBRyxHQUFHO29CQUNwQkMsUUFBUUMsR0FBRyxDQUFDSixZQUFZUjtnQkFDekIsT0FBTztvQkFDTlcsUUFBUUMsR0FBRyxDQUFDSjtnQkFDYjtZQUNEO1FBRUQsTUFBTUssT0FBTyxLQUFPO1FBRXBCLG1EQUFtRDtRQUNuRCxNQUFNQyxTQUFTQyxPQUFPQyxNQUFNLENBQUNyQixZQUFZO1lBQ3hDc0IsZ0JBQWdCLENBQUNuQixRQUFrQixBQUFDTixDQUFBQSxTQUFTLENBQUNNLE1BQU0sSUFBSSxDQUFBLEtBQU1KO1FBQy9EO1FBRUEsMkRBQTJEO1FBQzNELDREQUE0RDtRQUM1RCxLQUFLLE1BQU0sQ0FBQ3dCLFdBQVdDLFdBQVcsSUFBSUosT0FBT0ssT0FBTyxDQUFDNUIsV0FBWTtZQUNoRSx5RkFBeUY7WUFDeEZzQixNQUFjLENBQUNJLFVBQVUsR0FBR0MsY0FBY3pCLFlBQVlHLFlBQVlxQixhQUFhTDtRQUNqRjtRQUVBLE9BQU9DO0lBQ1I7QUFDRCJ9
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { LogLevels } from "./types.js";
|
|
2
|
+
export class LogAdapter {
|
|
3
|
+
flush(cb) {
|
|
4
|
+
cb?.();
|
|
5
|
+
}
|
|
6
|
+
// biome-ignore lint/suspicious/noExplicitAny: Generic utility method needs flexible typing
|
|
7
|
+
getLogLevels(options) {
|
|
8
|
+
const { customOnly, customLevels } = options;
|
|
9
|
+
if (customOnly) {
|
|
10
|
+
return customLevels;
|
|
11
|
+
}
|
|
12
|
+
const levels = this.getUniqueLevels(LogLevels, customLevels);
|
|
13
|
+
return Object.fromEntries(levels);
|
|
14
|
+
}
|
|
15
|
+
getUniqueLevels(defaultLevels, customLevels) {
|
|
16
|
+
const defaultEntries = Object.entries(defaultLevels ?? {});
|
|
17
|
+
const customEntries = Object.entries(customLevels ?? {});
|
|
18
|
+
const defaultNotInCustom = defaultEntries.filter(([dk])=>customEntries.findIndex(([ck])=>ck === dk) === -1);
|
|
19
|
+
const unique = defaultNotInCustom.concat(customEntries);
|
|
20
|
+
return unique;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL3NjcmliZS9zY3JpYmUvc3JjL2xvZ2dlci5hZGFwdGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgTG9nZ2VyIH0gZnJvbSBcIi4vbG9nZ2VyLnR5cGUuanNcIjtcbmltcG9ydCB7IExvZ0xldmVscywgdHlwZSBTY3JpYmVPcHRpb25zIH0gZnJvbSBcIi4vdHlwZXMuanNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBMb2dnZXJBZGFwdGVyIHtcblx0Y29uZmlndXJlPFQgZXh0ZW5kcyBzdHJpbmcgPSBuZXZlciwgQ3VzdG9tT25seSBleHRlbmRzIHRydWUgfCBmYWxzZSA9IGZhbHNlPihcblx0XHRvcHRpb25zOiBTY3JpYmVPcHRpb25zPFQsIEN1c3RvbU9ubHk+LFxuXHQpO1xuXHRnZXRMb2dnZXI8VCBleHRlbmRzIHN0cmluZyA9IG5ldmVyLCBDdXN0b21Pbmx5IGV4dGVuZHMgdHJ1ZSB8IGZhbHNlID0gZmFsc2U+KFxuXHRcdG5hbWU6IHN0cmluZyxcblx0KTogTG9nZ2VyPFQsIEN1c3RvbU9ubHk+O1xuXHRmbHVzaChjYj86ICgpID0+IHZvaWQpOiB2b2lkO1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTG9nQWRhcHRlciBpbXBsZW1lbnRzIExvZ2dlckFkYXB0ZXIge1xuXHRwdWJsaWMgYWJzdHJhY3QgY29uZmlndXJlPFQgZXh0ZW5kcyBzdHJpbmcgPSBuZXZlciwgQ3VzdG9tT25seSBleHRlbmRzIHRydWUgfCBmYWxzZSA9IGZhbHNlPihcblx0XHRvcHRpb25zOiBTY3JpYmVPcHRpb25zPFQsIEN1c3RvbU9ubHk+LFxuXHQpO1xuXG5cdHB1YmxpYyBhYnN0cmFjdCBnZXRMb2dnZXI8VCBleHRlbmRzIHN0cmluZyA9IG5ldmVyLCBDdXN0b21Pbmx5IGV4dGVuZHMgdHJ1ZSB8IGZhbHNlID0gZmFsc2U+KFxuXHRcdG5hbWU6IHN0cmluZyxcblx0KTogTG9nZ2VyPFQsIEN1c3RvbU9ubHk+O1xuXG5cdHB1YmxpYyBmbHVzaChjYj86ICgpID0+IHZvaWQpOiB2b2lkIHtcblx0XHRjYj8uKCk7XG5cdH1cblxuXHQvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IEdlbmVyaWMgdXRpbGl0eSBtZXRob2QgbmVlZHMgZmxleGlibGUgdHlwaW5nXG5cdHByb3RlY3RlZCBnZXRMb2dMZXZlbHMob3B0aW9uczogU2NyaWJlT3B0aW9uczxhbnksIGFueT4pOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+IHtcblx0XHRjb25zdCB7IGN1c3RvbU9ubHksIGN1c3RvbUxldmVscyB9ID0gb3B0aW9ucztcblx0XHRpZiAoY3VzdG9tT25seSkge1xuXHRcdFx0cmV0dXJuIGN1c3RvbUxldmVscztcblx0XHR9XG5cdFx0Y29uc3QgbGV2ZWxzID0gdGhpcy5nZXRVbmlxdWVMZXZlbHMoTG9nTGV2ZWxzLCBjdXN0b21MZXZlbHMpO1xuXHRcdHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMobGV2ZWxzKTtcblx0fVxuXG5cdHByb3RlY3RlZCBnZXRVbmlxdWVMZXZlbHMoXG5cdFx0ZGVmYXVsdExldmVsczogUmVjb3JkPHN0cmluZywgbnVtYmVyPixcblx0XHRjdXN0b21MZXZlbHM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4sXG5cdCkge1xuXHRcdGNvbnN0IGRlZmF1bHRFbnRyaWVzID0gT2JqZWN0LmVudHJpZXMoZGVmYXVsdExldmVscyA/PyB7fSk7XG5cdFx0Y29uc3QgY3VzdG9tRW50cmllcyA9IE9iamVjdC5lbnRyaWVzKGN1c3RvbUxldmVscyA/PyB7fSk7XG5cdFx0Y29uc3QgZGVmYXVsdE5vdEluQ3VzdG9tID0gZGVmYXVsdEVudHJpZXMuZmlsdGVyKFxuXHRcdFx0KFtka10pID0+IGN1c3RvbUVudHJpZXMuZmluZEluZGV4KChbY2tdKSA9PiBjayA9PT0gZGspID09PSAtMSxcblx0XHQpO1xuXG5cdFx0Y29uc3QgdW5pcXVlID0gZGVmYXVsdE5vdEluQ3VzdG9tLmNvbmNhdChjdXN0b21FbnRyaWVzKTtcblx0XHRyZXR1cm4gdW5pcXVlO1xuXHR9XG59XG4iXSwibmFtZXMiOlsiTG9nTGV2ZWxzIiwiTG9nQWRhcHRlciIsImZsdXNoIiwiY2IiLCJnZXRMb2dMZXZlbHMiLCJvcHRpb25zIiwiY3VzdG9tT25seSIsImN1c3RvbUxldmVscyIsImxldmVscyIsImdldFVuaXF1ZUxldmVscyIsIk9iamVjdCIsImZyb21FbnRyaWVzIiwiZGVmYXVsdExldmVscyIsImRlZmF1bHRFbnRyaWVzIiwiZW50cmllcyIsImN1c3RvbUVudHJpZXMiLCJkZWZhdWx0Tm90SW5DdXN0b20iLCJmaWx0ZXIiLCJkayIsImZpbmRJbmRleCIsImNrIiwidW5pcXVlIiwiY29uY2F0Il0sIm1hcHBpbmdzIjoiQUFDQSxTQUFTQSxTQUFTLFFBQTRCLGFBQWE7QUFZM0QsT0FBTyxNQUFlQztJQVNkQyxNQUFNQyxFQUFlLEVBQVE7UUFDbkNBO0lBQ0Q7SUFFQSwyRkFBMkY7SUFDakZDLGFBQWFDLE9BQWdDLEVBQTBCO1FBQ2hGLE1BQU0sRUFBRUMsVUFBVSxFQUFFQyxZQUFZLEVBQUUsR0FBR0Y7UUFDckMsSUFBSUMsWUFBWTtZQUNmLE9BQU9DO1FBQ1I7UUFDQSxNQUFNQyxTQUFTLElBQUksQ0FBQ0MsZUFBZSxDQUFDVCxXQUFXTztRQUMvQyxPQUFPRyxPQUFPQyxXQUFXLENBQUNIO0lBQzNCO0lBRVVDLGdCQUNURyxhQUFxQyxFQUNyQ0wsWUFBb0MsRUFDbkM7UUFDRCxNQUFNTSxpQkFBaUJILE9BQU9JLE9BQU8sQ0FBQ0YsaUJBQWlCLENBQUM7UUFDeEQsTUFBTUcsZ0JBQWdCTCxPQUFPSSxPQUFPLENBQUNQLGdCQUFnQixDQUFDO1FBQ3RELE1BQU1TLHFCQUFxQkgsZUFBZUksTUFBTSxDQUMvQyxDQUFDLENBQUNDLEdBQUcsR0FBS0gsY0FBY0ksU0FBUyxDQUFDLENBQUMsQ0FBQ0MsR0FBRyxHQUFLQSxPQUFPRixRQUFRLENBQUM7UUFHN0QsTUFBTUcsU0FBU0wsbUJBQW1CTSxNQUFNLENBQUNQO1FBQ3pDLE9BQU9NO0lBQ1I7QUFDRCJ9
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { ConsoleAdapter } from "../src/console.adapter.js";
|
|
3
|
+
import { scribe } from "../src/logger.factory.js";
|
|
4
|
+
describe("Console Adapter Custom Levels", ()=>{
|
|
5
|
+
it("should support custom log levels", ()=>{
|
|
6
|
+
const spy = vi.spyOn(console, "log").mockImplementation(()=>{});
|
|
7
|
+
const customLevels = {
|
|
8
|
+
custom: 100,
|
|
9
|
+
debug2: 25
|
|
10
|
+
};
|
|
11
|
+
// Use trace level so all custom levels (including debug2: 25) are enabled
|
|
12
|
+
const loggerFactory = scribe.configure({
|
|
13
|
+
adapter: new ConsoleAdapter(),
|
|
14
|
+
options: {
|
|
15
|
+
logLevel: "trace",
|
|
16
|
+
customLevels
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
const logger = loggerFactory("test");
|
|
20
|
+
// Test custom level methods exist and work
|
|
21
|
+
expect(typeof logger.custom).toBe("function");
|
|
22
|
+
expect(typeof logger.debug2).toBe("function");
|
|
23
|
+
logger.custom("Custom level message");
|
|
24
|
+
logger.debug2("Debug2 level message");
|
|
25
|
+
expect(spy).toHaveBeenCalledWith(expect.stringContaining("CUSTOM [test]: Custom level message"));
|
|
26
|
+
expect(spy).toHaveBeenCalledWith(expect.stringContaining("DEBUG2 [test]: Debug2 level message"));
|
|
27
|
+
spy.mockRestore();
|
|
28
|
+
});
|
|
29
|
+
it("should include custom levels in logLevels property", ()=>{
|
|
30
|
+
const customLevels = {
|
|
31
|
+
custom: 100,
|
|
32
|
+
special: 15
|
|
33
|
+
};
|
|
34
|
+
const logger = scribe.logger("test", customLevels);
|
|
35
|
+
const logLevels = logger.logLevels;
|
|
36
|
+
// Should include default levels
|
|
37
|
+
expect(logLevels.fatal).toBe(60);
|
|
38
|
+
expect(logLevels.error).toBe(50);
|
|
39
|
+
expect(logLevels.info).toBe(30);
|
|
40
|
+
// Should include custom levels
|
|
41
|
+
expect(logLevels.custom).toBe(100);
|
|
42
|
+
expect(logLevels.special).toBe(15);
|
|
43
|
+
});
|
|
44
|
+
it("should work without custom levels (backwards compatibility)", ()=>{
|
|
45
|
+
const spy = vi.spyOn(console, "log").mockImplementation(()=>{});
|
|
46
|
+
const logger = scribe.logger("test");
|
|
47
|
+
logger.info("Regular message");
|
|
48
|
+
logger.error("Error message");
|
|
49
|
+
expect(spy).toHaveBeenCalledWith(expect.stringContaining("INFO [test]: Regular message"));
|
|
50
|
+
expect(spy).toHaveBeenCalledWith(expect.stringContaining("ERROR [test]: Error message"));
|
|
51
|
+
spy.mockRestore();
|
|
52
|
+
});
|
|
53
|
+
it("should override default levels with custom levels", ()=>{
|
|
54
|
+
const customLevels = {
|
|
55
|
+
info: 999,
|
|
56
|
+
newLevel: 50
|
|
57
|
+
};
|
|
58
|
+
const logger = scribe.logger("test", customLevels);
|
|
59
|
+
const logLevels = logger.logLevels;
|
|
60
|
+
// Custom level should override default
|
|
61
|
+
expect(logLevels.info).toBe(999);
|
|
62
|
+
expect(logLevels.newLevel).toBe(50);
|
|
63
|
+
// Other defaults should remain
|
|
64
|
+
expect(logLevels.fatal).toBe(60);
|
|
65
|
+
expect(logLevels.error).toBe(50);
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL3NjcmliZS9zY3JpYmUvdGVzdHMvY29uc29sZS5hZGFwdGVyLmN1c3RvbS1sZXZlbHMuc3BlYy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBkZXNjcmliZSwgZXhwZWN0LCBpdCwgdmkgfSBmcm9tIFwidml0ZXN0XCI7XG5pbXBvcnQgeyBDb25zb2xlQWRhcHRlciB9IGZyb20gXCIuLi9zcmMvY29uc29sZS5hZGFwdGVyLmpzXCI7XG5pbXBvcnQgeyBzY3JpYmUgfSBmcm9tIFwiLi4vc3JjL2xvZ2dlci5mYWN0b3J5LmpzXCI7XG5cbmRlc2NyaWJlKFwiQ29uc29sZSBBZGFwdGVyIEN1c3RvbSBMZXZlbHNcIiwgKCkgPT4ge1xuXHRpdChcInNob3VsZCBzdXBwb3J0IGN1c3RvbSBsb2cgbGV2ZWxzXCIsICgpID0+IHtcblx0XHRjb25zdCBzcHkgPSB2aS5zcHlPbihjb25zb2xlLCBcImxvZ1wiKS5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4ge30pO1xuXG5cdFx0Y29uc3QgY3VzdG9tTGV2ZWxzID0ge1xuXHRcdFx0Y3VzdG9tOiAxMDAsXG5cdFx0XHRkZWJ1ZzI6IDI1LFxuXHRcdH07XG5cblx0XHQvLyBVc2UgdHJhY2UgbGV2ZWwgc28gYWxsIGN1c3RvbSBsZXZlbHMgKGluY2x1ZGluZyBkZWJ1ZzI6IDI1KSBhcmUgZW5hYmxlZFxuXHRcdGNvbnN0IGxvZ2dlckZhY3RvcnkgPSBzY3JpYmUuY29uZmlndXJlKHtcblx0XHRcdGFkYXB0ZXI6IG5ldyBDb25zb2xlQWRhcHRlcigpLFxuXHRcdFx0b3B0aW9uczogeyBsb2dMZXZlbDogXCJ0cmFjZVwiLCBjdXN0b21MZXZlbHMgfSxcblx0XHR9KTtcblx0XHRjb25zdCBsb2dnZXIgPSBsb2dnZXJGYWN0b3J5KFwidGVzdFwiKTtcblxuXHRcdC8vIFRlc3QgY3VzdG9tIGxldmVsIG1ldGhvZHMgZXhpc3QgYW5kIHdvcmtcblx0XHRleHBlY3QodHlwZW9mIGxvZ2dlci5jdXN0b20pLnRvQmUoXCJmdW5jdGlvblwiKTtcblx0XHRleHBlY3QodHlwZW9mIGxvZ2dlci5kZWJ1ZzIpLnRvQmUoXCJmdW5jdGlvblwiKTtcblxuXHRcdGxvZ2dlci5jdXN0b20oXCJDdXN0b20gbGV2ZWwgbWVzc2FnZVwiKTtcblx0XHRsb2dnZXIuZGVidWcyKFwiRGVidWcyIGxldmVsIG1lc3NhZ2VcIik7XG5cblx0XHRleHBlY3Qoc3B5KS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcblx0XHRcdGV4cGVjdC5zdHJpbmdDb250YWluaW5nKFwiQ1VTVE9NIFt0ZXN0XTogQ3VzdG9tIGxldmVsIG1lc3NhZ2VcIiksXG5cdFx0KTtcblx0XHRleHBlY3Qoc3B5KS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcblx0XHRcdGV4cGVjdC5zdHJpbmdDb250YWluaW5nKFwiREVCVUcyIFt0ZXN0XTogRGVidWcyIGxldmVsIG1lc3NhZ2VcIiksXG5cdFx0KTtcblxuXHRcdHNweS5tb2NrUmVzdG9yZSgpO1xuXHR9KTtcblxuXHRpdChcInNob3VsZCBpbmNsdWRlIGN1c3RvbSBsZXZlbHMgaW4gbG9nTGV2ZWxzIHByb3BlcnR5XCIsICgpID0+IHtcblx0XHRjb25zdCBjdXN0b21MZXZlbHMgPSB7XG5cdFx0XHRjdXN0b206IDEwMCxcblx0XHRcdHNwZWNpYWw6IDE1LFxuXHRcdH07XG5cblx0XHRjb25zdCBsb2dnZXIgPSBzY3JpYmUubG9nZ2VyKFwidGVzdFwiLCBjdXN0b21MZXZlbHMpO1xuXG5cdFx0Y29uc3QgbG9nTGV2ZWxzID0gbG9nZ2VyLmxvZ0xldmVscztcblxuXHRcdC8vIFNob3VsZCBpbmNsdWRlIGRlZmF1bHQgbGV2ZWxzXG5cdFx0ZXhwZWN0KGxvZ0xldmVscy5mYXRhbCkudG9CZSg2MCk7XG5cdFx0ZXhwZWN0KGxvZ0xldmVscy5lcnJvcikudG9CZSg1MCk7XG5cdFx0ZXhwZWN0KGxvZ0xldmVscy5pbmZvKS50b0JlKDMwKTtcblxuXHRcdC8vIFNob3VsZCBpbmNsdWRlIGN1c3RvbSBsZXZlbHNcblx0XHRleHBlY3QobG9nTGV2ZWxzLmN1c3RvbSkudG9CZSgxMDApO1xuXHRcdGV4cGVjdChsb2dMZXZlbHMuc3BlY2lhbCkudG9CZSgxNSk7XG5cdH0pO1xuXG5cdGl0KFwic2hvdWxkIHdvcmsgd2l0aG91dCBjdXN0b20gbGV2ZWxzIChiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSlcIiwgKCkgPT4ge1xuXHRcdGNvbnN0IHNweSA9IHZpLnNweU9uKGNvbnNvbGUsIFwibG9nXCIpLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB7fSk7XG5cblx0XHRjb25zdCBsb2dnZXIgPSBzY3JpYmUubG9nZ2VyKFwidGVzdFwiKTtcblxuXHRcdGxvZ2dlci5pbmZvKFwiUmVndWxhciBtZXNzYWdlXCIpO1xuXHRcdGxvZ2dlci5lcnJvcihcIkVycm9yIG1lc3NhZ2VcIik7XG5cblx0XHRleHBlY3Qoc3B5KS50b0hhdmVCZWVuQ2FsbGVkV2l0aChleHBlY3Quc3RyaW5nQ29udGFpbmluZyhcIklORk8gW3Rlc3RdOiBSZWd1bGFyIG1lc3NhZ2VcIikpO1xuXHRcdGV4cGVjdChzcHkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGV4cGVjdC5zdHJpbmdDb250YWluaW5nKFwiRVJST1IgW3Rlc3RdOiBFcnJvciBtZXNzYWdlXCIpKTtcblxuXHRcdHNweS5tb2NrUmVzdG9yZSgpO1xuXHR9KTtcblxuXHRpdChcInNob3VsZCBvdmVycmlkZSBkZWZhdWx0IGxldmVscyB3aXRoIGN1c3RvbSBsZXZlbHNcIiwgKCkgPT4ge1xuXHRcdGNvbnN0IGN1c3RvbUxldmVscyA9IHtcblx0XHRcdGluZm86IDk5OSwgLy8gT3ZlcnJpZGUgZGVmYXVsdCBpbmZvIGxldmVsXG5cdFx0XHRuZXdMZXZlbDogNTAsXG5cdFx0fTtcblxuXHRcdGNvbnN0IGxvZ2dlciA9IHNjcmliZS5sb2dnZXIoXCJ0ZXN0XCIsIGN1c3RvbUxldmVscyk7XG5cblx0XHRjb25zdCBsb2dMZXZlbHMgPSBsb2dnZXIubG9nTGV2ZWxzO1xuXG5cdFx0Ly8gQ3VzdG9tIGxldmVsIHNob3VsZCBvdmVycmlkZSBkZWZhdWx0XG5cdFx0ZXhwZWN0KGxvZ0xldmVscy5pbmZvKS50b0JlKDk5OSk7XG5cdFx0ZXhwZWN0KGxvZ0xldmVscy5uZXdMZXZlbCkudG9CZSg1MCk7XG5cblx0XHQvLyBPdGhlciBkZWZhdWx0cyBzaG91bGQgcmVtYWluXG5cdFx0ZXhwZWN0KGxvZ0xldmVscy5mYXRhbCkudG9CZSg2MCk7XG5cdFx0ZXhwZWN0KGxvZ0xldmVscy5lcnJvcikudG9CZSg1MCk7XG5cdH0pO1xufSk7XG4iXSwibmFtZXMiOlsiZGVzY3JpYmUiLCJleHBlY3QiLCJpdCIsInZpIiwiQ29uc29sZUFkYXB0ZXIiLCJzY3JpYmUiLCJzcHkiLCJzcHlPbiIsImNvbnNvbGUiLCJtb2NrSW1wbGVtZW50YXRpb24iLCJjdXN0b21MZXZlbHMiLCJjdXN0b20iLCJkZWJ1ZzIiLCJsb2dnZXJGYWN0b3J5IiwiY29uZmlndXJlIiwiYWRhcHRlciIsIm9wdGlvbnMiLCJsb2dMZXZlbCIsImxvZ2dlciIsInRvQmUiLCJ0b0hhdmVCZWVuQ2FsbGVkV2l0aCIsInN0cmluZ0NvbnRhaW5pbmciLCJtb2NrUmVzdG9yZSIsInNwZWNpYWwiLCJsb2dMZXZlbHMiLCJmYXRhbCIsImVycm9yIiwiaW5mbyIsIm5ld0xldmVsIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxRQUFRLEVBQUVDLE1BQU0sRUFBRUMsRUFBRSxFQUFFQyxFQUFFLFFBQVEsU0FBUztBQUNsRCxTQUFTQyxjQUFjLFFBQVEsNEJBQTRCO0FBQzNELFNBQVNDLE1BQU0sUUFBUSwyQkFBMkI7QUFFbERMLFNBQVMsaUNBQWlDO0lBQ3pDRSxHQUFHLG9DQUFvQztRQUN0QyxNQUFNSSxNQUFNSCxHQUFHSSxLQUFLLENBQUNDLFNBQVMsT0FBT0Msa0JBQWtCLENBQUMsS0FBTztRQUUvRCxNQUFNQyxlQUFlO1lBQ3BCQyxRQUFRO1lBQ1JDLFFBQVE7UUFDVDtRQUVBLDBFQUEwRTtRQUMxRSxNQUFNQyxnQkFBZ0JSLE9BQU9TLFNBQVMsQ0FBQztZQUN0Q0MsU0FBUyxJQUFJWDtZQUNiWSxTQUFTO2dCQUFFQyxVQUFVO2dCQUFTUDtZQUFhO1FBQzVDO1FBQ0EsTUFBTVEsU0FBU0wsY0FBYztRQUU3QiwyQ0FBMkM7UUFDM0NaLE9BQU8sT0FBT2lCLE9BQU9QLE1BQU0sRUFBRVEsSUFBSSxDQUFDO1FBQ2xDbEIsT0FBTyxPQUFPaUIsT0FBT04sTUFBTSxFQUFFTyxJQUFJLENBQUM7UUFFbENELE9BQU9QLE1BQU0sQ0FBQztRQUNkTyxPQUFPTixNQUFNLENBQUM7UUFFZFgsT0FBT0ssS0FBS2Msb0JBQW9CLENBQy9CbkIsT0FBT29CLGdCQUFnQixDQUFDO1FBRXpCcEIsT0FBT0ssS0FBS2Msb0JBQW9CLENBQy9CbkIsT0FBT29CLGdCQUFnQixDQUFDO1FBR3pCZixJQUFJZ0IsV0FBVztJQUNoQjtJQUVBcEIsR0FBRyxzREFBc0Q7UUFDeEQsTUFBTVEsZUFBZTtZQUNwQkMsUUFBUTtZQUNSWSxTQUFTO1FBQ1Y7UUFFQSxNQUFNTCxTQUFTYixPQUFPYSxNQUFNLENBQUMsUUFBUVI7UUFFckMsTUFBTWMsWUFBWU4sT0FBT00sU0FBUztRQUVsQyxnQ0FBZ0M7UUFDaEN2QixPQUFPdUIsVUFBVUMsS0FBSyxFQUFFTixJQUFJLENBQUM7UUFDN0JsQixPQUFPdUIsVUFBVUUsS0FBSyxFQUFFUCxJQUFJLENBQUM7UUFDN0JsQixPQUFPdUIsVUFBVUcsSUFBSSxFQUFFUixJQUFJLENBQUM7UUFFNUIsK0JBQStCO1FBQy9CbEIsT0FBT3VCLFVBQVViLE1BQU0sRUFBRVEsSUFBSSxDQUFDO1FBQzlCbEIsT0FBT3VCLFVBQVVELE9BQU8sRUFBRUosSUFBSSxDQUFDO0lBQ2hDO0lBRUFqQixHQUFHLCtEQUErRDtRQUNqRSxNQUFNSSxNQUFNSCxHQUFHSSxLQUFLLENBQUNDLFNBQVMsT0FBT0Msa0JBQWtCLENBQUMsS0FBTztRQUUvRCxNQUFNUyxTQUFTYixPQUFPYSxNQUFNLENBQUM7UUFFN0JBLE9BQU9TLElBQUksQ0FBQztRQUNaVCxPQUFPUSxLQUFLLENBQUM7UUFFYnpCLE9BQU9LLEtBQUtjLG9CQUFvQixDQUFDbkIsT0FBT29CLGdCQUFnQixDQUFDO1FBQ3pEcEIsT0FBT0ssS0FBS2Msb0JBQW9CLENBQUNuQixPQUFPb0IsZ0JBQWdCLENBQUM7UUFFekRmLElBQUlnQixXQUFXO0lBQ2hCO0lBRUFwQixHQUFHLHFEQUFxRDtRQUN2RCxNQUFNUSxlQUFlO1lBQ3BCaUIsTUFBTTtZQUNOQyxVQUFVO1FBQ1g7UUFFQSxNQUFNVixTQUFTYixPQUFPYSxNQUFNLENBQUMsUUFBUVI7UUFFckMsTUFBTWMsWUFBWU4sT0FBT00sU0FBUztRQUVsQyx1Q0FBdUM7UUFDdkN2QixPQUFPdUIsVUFBVUcsSUFBSSxFQUFFUixJQUFJLENBQUM7UUFDNUJsQixPQUFPdUIsVUFBVUksUUFBUSxFQUFFVCxJQUFJLENBQUM7UUFFaEMsK0JBQStCO1FBQy9CbEIsT0FBT3VCLFVBQVVDLEtBQUssRUFBRU4sSUFBSSxDQUFDO1FBQzdCbEIsT0FBT3VCLFVBQVVFLEtBQUssRUFBRVAsSUFBSSxDQUFDO0lBQzlCO0FBQ0QifQ==
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { ConsoleAdapter } from "../src/console.adapter.js";
|
|
3
|
+
import { scribe } from "../src/logger.factory.js";
|
|
4
|
+
describe("Console Adapter", ()=>{
|
|
5
|
+
it("should work without configuration", ()=>{
|
|
6
|
+
const spy = vi.spyOn(console, "log").mockImplementation(()=>{});
|
|
7
|
+
const logger = scribe.logger("test");
|
|
8
|
+
logger.info("Hello world");
|
|
9
|
+
expect(spy).toHaveBeenCalledWith(expect.stringMatching(/\[\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z\] INFO \[test\]: Hello world/));
|
|
10
|
+
spy.mockRestore();
|
|
11
|
+
});
|
|
12
|
+
it("should support all log levels when configured at trace", ()=>{
|
|
13
|
+
const spy = vi.spyOn(console, "log").mockImplementation(()=>{});
|
|
14
|
+
const loggerFactory = scribe.configure({
|
|
15
|
+
adapter: new ConsoleAdapter(),
|
|
16
|
+
options: {
|
|
17
|
+
logLevel: "trace"
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
const logger = loggerFactory("test");
|
|
21
|
+
logger.fatal("Fatal message");
|
|
22
|
+
logger.error("Error message");
|
|
23
|
+
logger.warn("Warning message");
|
|
24
|
+
logger.info("Info message");
|
|
25
|
+
logger.debug("Debug message");
|
|
26
|
+
logger.trace("Trace message");
|
|
27
|
+
expect(spy).toHaveBeenCalledTimes(6);
|
|
28
|
+
expect(spy).toHaveBeenCalledWith(expect.stringContaining("FATAL"));
|
|
29
|
+
expect(spy).toHaveBeenCalledWith(expect.stringContaining("ERROR"));
|
|
30
|
+
expect(spy).toHaveBeenCalledWith(expect.stringContaining("WARN"));
|
|
31
|
+
expect(spy).toHaveBeenCalledWith(expect.stringContaining("INFO"));
|
|
32
|
+
expect(spy).toHaveBeenCalledWith(expect.stringContaining("DEBUG"));
|
|
33
|
+
expect(spy).toHaveBeenCalledWith(expect.stringContaining("TRACE"));
|
|
34
|
+
spy.mockRestore();
|
|
35
|
+
});
|
|
36
|
+
it("should filter logs below the configured level", ()=>{
|
|
37
|
+
const spy = vi.spyOn(console, "log").mockImplementation(()=>{});
|
|
38
|
+
const loggerFactory = scribe.configure({
|
|
39
|
+
adapter: new ConsoleAdapter(),
|
|
40
|
+
options: {
|
|
41
|
+
logLevel: "warn"
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
const logger = loggerFactory("test");
|
|
45
|
+
logger.fatal("Fatal message");
|
|
46
|
+
logger.error("Error message");
|
|
47
|
+
logger.warn("Warning message");
|
|
48
|
+
logger.info("Info message");
|
|
49
|
+
logger.debug("Debug message");
|
|
50
|
+
logger.trace("Trace message");
|
|
51
|
+
// Only fatal (60), error (50), warn (40) are >= warn threshold (40)
|
|
52
|
+
expect(spy).toHaveBeenCalledTimes(3);
|
|
53
|
+
expect(spy).toHaveBeenCalledWith(expect.stringContaining("FATAL"));
|
|
54
|
+
expect(spy).toHaveBeenCalledWith(expect.stringContaining("ERROR"));
|
|
55
|
+
expect(spy).toHaveBeenCalledWith(expect.stringContaining("WARN"));
|
|
56
|
+
spy.mockRestore();
|
|
57
|
+
});
|
|
58
|
+
it("should have logger properties", ()=>{
|
|
59
|
+
const loggerFactory = scribe.configure({
|
|
60
|
+
adapter: new ConsoleAdapter(),
|
|
61
|
+
options: {
|
|
62
|
+
logLevel: "info"
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
const logger = loggerFactory("test");
|
|
66
|
+
expect(logger.currentLevel).toBe("info");
|
|
67
|
+
expect(logger.logLevels).toBeDefined();
|
|
68
|
+
expect(logger.isLevelEnabled("info")).toBe(true);
|
|
69
|
+
expect(logger.isLevelEnabled("debug")).toBe(false);
|
|
70
|
+
expect(logger.isLevelEnabled("warn")).toBe(true);
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL3NjcmliZS9zY3JpYmUvdGVzdHMvY29uc29sZS5hZGFwdGVyLnNwZWMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZGVzY3JpYmUsIGV4cGVjdCwgaXQsIHZpIH0gZnJvbSBcInZpdGVzdFwiO1xuaW1wb3J0IHsgQ29uc29sZUFkYXB0ZXIgfSBmcm9tIFwiLi4vc3JjL2NvbnNvbGUuYWRhcHRlci5qc1wiO1xuaW1wb3J0IHsgc2NyaWJlIH0gZnJvbSBcIi4uL3NyYy9sb2dnZXIuZmFjdG9yeS5qc1wiO1xuXG5kZXNjcmliZShcIkNvbnNvbGUgQWRhcHRlclwiLCAoKSA9PiB7XG5cdGl0KFwic2hvdWxkIHdvcmsgd2l0aG91dCBjb25maWd1cmF0aW9uXCIsICgpID0+IHtcblx0XHRjb25zdCBzcHkgPSB2aS5zcHlPbihjb25zb2xlLCBcImxvZ1wiKS5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4ge30pO1xuXG5cdFx0Y29uc3QgbG9nZ2VyID0gc2NyaWJlLmxvZ2dlcihcInRlc3RcIik7XG5cdFx0bG9nZ2VyLmluZm8oXCJIZWxsbyB3b3JsZFwiKTtcblxuXHRcdGV4cGVjdChzcHkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuXHRcdFx0ZXhwZWN0LnN0cmluZ01hdGNoaW5nKFxuXHRcdFx0XHQvXFxbXFxkezR9LVxcZHsyfS1cXGR7Mn1UXFxkezJ9OlxcZHsyfTpcXGR7Mn1cXC5cXGR7M31aXFxdIElORk8gXFxbdGVzdFxcXTogSGVsbG8gd29ybGQvLFxuXHRcdFx0KSxcblx0XHQpO1xuXG5cdFx0c3B5Lm1vY2tSZXN0b3JlKCk7XG5cdH0pO1xuXG5cdGl0KFwic2hvdWxkIHN1cHBvcnQgYWxsIGxvZyBsZXZlbHMgd2hlbiBjb25maWd1cmVkIGF0IHRyYWNlXCIsICgpID0+IHtcblx0XHRjb25zdCBzcHkgPSB2aS5zcHlPbihjb25zb2xlLCBcImxvZ1wiKS5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4ge30pO1xuXG5cdFx0Y29uc3QgbG9nZ2VyRmFjdG9yeSA9IHNjcmliZS5jb25maWd1cmUoe1xuXHRcdFx0YWRhcHRlcjogbmV3IENvbnNvbGVBZGFwdGVyKCksXG5cdFx0XHRvcHRpb25zOiB7IGxvZ0xldmVsOiBcInRyYWNlXCIgfSxcblx0XHR9KTtcblx0XHRjb25zdCBsb2dnZXIgPSBsb2dnZXJGYWN0b3J5KFwidGVzdFwiKTtcblxuXHRcdGxvZ2dlci5mYXRhbChcIkZhdGFsIG1lc3NhZ2VcIik7XG5cdFx0bG9nZ2VyLmVycm9yKFwiRXJyb3IgbWVzc2FnZVwiKTtcblx0XHRsb2dnZXIud2FybihcIldhcm5pbmcgbWVzc2FnZVwiKTtcblx0XHRsb2dnZXIuaW5mbyhcIkluZm8gbWVzc2FnZVwiKTtcblx0XHRsb2dnZXIuZGVidWcoXCJEZWJ1ZyBtZXNzYWdlXCIpO1xuXHRcdGxvZ2dlci50cmFjZShcIlRyYWNlIG1lc3NhZ2VcIik7XG5cblx0XHRleHBlY3Qoc3B5KS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoNik7XG5cdFx0ZXhwZWN0KHNweSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoZXhwZWN0LnN0cmluZ0NvbnRhaW5pbmcoXCJGQVRBTFwiKSk7XG5cdFx0ZXhwZWN0KHNweSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoZXhwZWN0LnN0cmluZ0NvbnRhaW5pbmcoXCJFUlJPUlwiKSk7XG5cdFx0ZXhwZWN0KHNweSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoZXhwZWN0LnN0cmluZ0NvbnRhaW5pbmcoXCJXQVJOXCIpKTtcblx0XHRleHBlY3Qoc3B5KS50b0hhdmVCZWVuQ2FsbGVkV2l0aChleHBlY3Quc3RyaW5nQ29udGFpbmluZyhcIklORk9cIikpO1xuXHRcdGV4cGVjdChzcHkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGV4cGVjdC5zdHJpbmdDb250YWluaW5nKFwiREVCVUdcIikpO1xuXHRcdGV4cGVjdChzcHkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGV4cGVjdC5zdHJpbmdDb250YWluaW5nKFwiVFJBQ0VcIikpO1xuXG5cdFx0c3B5Lm1vY2tSZXN0b3JlKCk7XG5cdH0pO1xuXG5cdGl0KFwic2hvdWxkIGZpbHRlciBsb2dzIGJlbG93IHRoZSBjb25maWd1cmVkIGxldmVsXCIsICgpID0+IHtcblx0XHRjb25zdCBzcHkgPSB2aS5zcHlPbihjb25zb2xlLCBcImxvZ1wiKS5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4ge30pO1xuXG5cdFx0Y29uc3QgbG9nZ2VyRmFjdG9yeSA9IHNjcmliZS5jb25maWd1cmUoe1xuXHRcdFx0YWRhcHRlcjogbmV3IENvbnNvbGVBZGFwdGVyKCksXG5cdFx0XHRvcHRpb25zOiB7IGxvZ0xldmVsOiBcIndhcm5cIiB9LFxuXHRcdH0pO1xuXHRcdGNvbnN0IGxvZ2dlciA9IGxvZ2dlckZhY3RvcnkoXCJ0ZXN0XCIpO1xuXG5cdFx0bG9nZ2VyLmZhdGFsKFwiRmF0YWwgbWVzc2FnZVwiKTtcblx0XHRsb2dnZXIuZXJyb3IoXCJFcnJvciBtZXNzYWdlXCIpO1xuXHRcdGxvZ2dlci53YXJuKFwiV2FybmluZyBtZXNzYWdlXCIpO1xuXHRcdGxvZ2dlci5pbmZvKFwiSW5mbyBtZXNzYWdlXCIpO1xuXHRcdGxvZ2dlci5kZWJ1ZyhcIkRlYnVnIG1lc3NhZ2VcIik7XG5cdFx0bG9nZ2VyLnRyYWNlKFwiVHJhY2UgbWVzc2FnZVwiKTtcblxuXHRcdC8vIE9ubHkgZmF0YWwgKDYwKSwgZXJyb3IgKDUwKSwgd2FybiAoNDApIGFyZSA+PSB3YXJuIHRocmVzaG9sZCAoNDApXG5cdFx0ZXhwZWN0KHNweSkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDMpO1xuXHRcdGV4cGVjdChzcHkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGV4cGVjdC5zdHJpbmdDb250YWluaW5nKFwiRkFUQUxcIikpO1xuXHRcdGV4cGVjdChzcHkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGV4cGVjdC5zdHJpbmdDb250YWluaW5nKFwiRVJST1JcIikpO1xuXHRcdGV4cGVjdChzcHkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGV4cGVjdC5zdHJpbmdDb250YWluaW5nKFwiV0FSTlwiKSk7XG5cblx0XHRzcHkubW9ja1Jlc3RvcmUoKTtcblx0fSk7XG5cblx0aXQoXCJzaG91bGQgaGF2ZSBsb2dnZXIgcHJvcGVydGllc1wiLCAoKSA9PiB7XG5cdFx0Y29uc3QgbG9nZ2VyRmFjdG9yeSA9IHNjcmliZS5jb25maWd1cmUoe1xuXHRcdFx0YWRhcHRlcjogbmV3IENvbnNvbGVBZGFwdGVyKCksXG5cdFx0XHRvcHRpb25zOiB7IGxvZ0xldmVsOiBcImluZm9cIiB9LFxuXHRcdH0pO1xuXHRcdGNvbnN0IGxvZ2dlciA9IGxvZ2dlckZhY3RvcnkoXCJ0ZXN0XCIpO1xuXG5cdFx0ZXhwZWN0KGxvZ2dlci5jdXJyZW50TGV2ZWwpLnRvQmUoXCJpbmZvXCIpO1xuXHRcdGV4cGVjdChsb2dnZXIubG9nTGV2ZWxzKS50b0JlRGVmaW5lZCgpO1xuXHRcdGV4cGVjdChsb2dnZXIuaXNMZXZlbEVuYWJsZWQoXCJpbmZvXCIpKS50b0JlKHRydWUpO1xuXHRcdGV4cGVjdChsb2dnZXIuaXNMZXZlbEVuYWJsZWQoXCJkZWJ1Z1wiKSkudG9CZShmYWxzZSk7XG5cdFx0ZXhwZWN0KGxvZ2dlci5pc0xldmVsRW5hYmxlZChcIndhcm5cIikpLnRvQmUodHJ1ZSk7XG5cdH0pO1xufSk7XG4iXSwibmFtZXMiOlsiZGVzY3JpYmUiLCJleHBlY3QiLCJpdCIsInZpIiwiQ29uc29sZUFkYXB0ZXIiLCJzY3JpYmUiLCJzcHkiLCJzcHlPbiIsImNvbnNvbGUiLCJtb2NrSW1wbGVtZW50YXRpb24iLCJsb2dnZXIiLCJpbmZvIiwidG9IYXZlQmVlbkNhbGxlZFdpdGgiLCJzdHJpbmdNYXRjaGluZyIsIm1vY2tSZXN0b3JlIiwibG9nZ2VyRmFjdG9yeSIsImNvbmZpZ3VyZSIsImFkYXB0ZXIiLCJvcHRpb25zIiwibG9nTGV2ZWwiLCJmYXRhbCIsImVycm9yIiwid2FybiIsImRlYnVnIiwidHJhY2UiLCJ0b0hhdmVCZWVuQ2FsbGVkVGltZXMiLCJzdHJpbmdDb250YWluaW5nIiwiY3VycmVudExldmVsIiwidG9CZSIsImxvZ0xldmVscyIsInRvQmVEZWZpbmVkIiwiaXNMZXZlbEVuYWJsZWQiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLFFBQVEsRUFBRUMsTUFBTSxFQUFFQyxFQUFFLEVBQUVDLEVBQUUsUUFBUSxTQUFTO0FBQ2xELFNBQVNDLGNBQWMsUUFBUSw0QkFBNEI7QUFDM0QsU0FBU0MsTUFBTSxRQUFRLDJCQUEyQjtBQUVsREwsU0FBUyxtQkFBbUI7SUFDM0JFLEdBQUcscUNBQXFDO1FBQ3ZDLE1BQU1JLE1BQU1ILEdBQUdJLEtBQUssQ0FBQ0MsU0FBUyxPQUFPQyxrQkFBa0IsQ0FBQyxLQUFPO1FBRS9ELE1BQU1DLFNBQVNMLE9BQU9LLE1BQU0sQ0FBQztRQUM3QkEsT0FBT0MsSUFBSSxDQUFDO1FBRVpWLE9BQU9LLEtBQUtNLG9CQUFvQixDQUMvQlgsT0FBT1ksY0FBYyxDQUNwQjtRQUlGUCxJQUFJUSxXQUFXO0lBQ2hCO0lBRUFaLEdBQUcsMERBQTBEO1FBQzVELE1BQU1JLE1BQU1ILEdBQUdJLEtBQUssQ0FBQ0MsU0FBUyxPQUFPQyxrQkFBa0IsQ0FBQyxLQUFPO1FBRS9ELE1BQU1NLGdCQUFnQlYsT0FBT1csU0FBUyxDQUFDO1lBQ3RDQyxTQUFTLElBQUliO1lBQ2JjLFNBQVM7Z0JBQUVDLFVBQVU7WUFBUTtRQUM5QjtRQUNBLE1BQU1ULFNBQVNLLGNBQWM7UUFFN0JMLE9BQU9VLEtBQUssQ0FBQztRQUNiVixPQUFPVyxLQUFLLENBQUM7UUFDYlgsT0FBT1ksSUFBSSxDQUFDO1FBQ1paLE9BQU9DLElBQUksQ0FBQztRQUNaRCxPQUFPYSxLQUFLLENBQUM7UUFDYmIsT0FBT2MsS0FBSyxDQUFDO1FBRWJ2QixPQUFPSyxLQUFLbUIscUJBQXFCLENBQUM7UUFDbEN4QixPQUFPSyxLQUFLTSxvQkFBb0IsQ0FBQ1gsT0FBT3lCLGdCQUFnQixDQUFDO1FBQ3pEekIsT0FBT0ssS0FBS00sb0JBQW9CLENBQUNYLE9BQU95QixnQkFBZ0IsQ0FBQztRQUN6RHpCLE9BQU9LLEtBQUtNLG9CQUFvQixDQUFDWCxPQUFPeUIsZ0JBQWdCLENBQUM7UUFDekR6QixPQUFPSyxLQUFLTSxvQkFBb0IsQ0FBQ1gsT0FBT3lCLGdCQUFnQixDQUFDO1FBQ3pEekIsT0FBT0ssS0FBS00sb0JBQW9CLENBQUNYLE9BQU95QixnQkFBZ0IsQ0FBQztRQUN6RHpCLE9BQU9LLEtBQUtNLG9CQUFvQixDQUFDWCxPQUFPeUIsZ0JBQWdCLENBQUM7UUFFekRwQixJQUFJUSxXQUFXO0lBQ2hCO0lBRUFaLEdBQUcsaURBQWlEO1FBQ25ELE1BQU1JLE1BQU1ILEdBQUdJLEtBQUssQ0FBQ0MsU0FBUyxPQUFPQyxrQkFBa0IsQ0FBQyxLQUFPO1FBRS9ELE1BQU1NLGdCQUFnQlYsT0FBT1csU0FBUyxDQUFDO1lBQ3RDQyxTQUFTLElBQUliO1lBQ2JjLFNBQVM7Z0JBQUVDLFVBQVU7WUFBTztRQUM3QjtRQUNBLE1BQU1ULFNBQVNLLGNBQWM7UUFFN0JMLE9BQU9VLEtBQUssQ0FBQztRQUNiVixPQUFPVyxLQUFLLENBQUM7UUFDYlgsT0FBT1ksSUFBSSxDQUFDO1FBQ1paLE9BQU9DLElBQUksQ0FBQztRQUNaRCxPQUFPYSxLQUFLLENBQUM7UUFDYmIsT0FBT2MsS0FBSyxDQUFDO1FBRWIsb0VBQW9FO1FBQ3BFdkIsT0FBT0ssS0FBS21CLHFCQUFxQixDQUFDO1FBQ2xDeEIsT0FBT0ssS0FBS00sb0JBQW9CLENBQUNYLE9BQU95QixnQkFBZ0IsQ0FBQztRQUN6RHpCLE9BQU9LLEtBQUtNLG9CQUFvQixDQUFDWCxPQUFPeUIsZ0JBQWdCLENBQUM7UUFDekR6QixPQUFPSyxLQUFLTSxvQkFBb0IsQ0FBQ1gsT0FBT3lCLGdCQUFnQixDQUFDO1FBRXpEcEIsSUFBSVEsV0FBVztJQUNoQjtJQUVBWixHQUFHLGlDQUFpQztRQUNuQyxNQUFNYSxnQkFBZ0JWLE9BQU9XLFNBQVMsQ0FBQztZQUN0Q0MsU0FBUyxJQUFJYjtZQUNiYyxTQUFTO2dCQUFFQyxVQUFVO1lBQU87UUFDN0I7UUFDQSxNQUFNVCxTQUFTSyxjQUFjO1FBRTdCZCxPQUFPUyxPQUFPaUIsWUFBWSxFQUFFQyxJQUFJLENBQUM7UUFDakMzQixPQUFPUyxPQUFPbUIsU0FBUyxFQUFFQyxXQUFXO1FBQ3BDN0IsT0FBT1MsT0FBT3FCLGNBQWMsQ0FBQyxTQUFTSCxJQUFJLENBQUM7UUFDM0MzQixPQUFPUyxPQUFPcUIsY0FBYyxDQUFDLFVBQVVILElBQUksQ0FBQztRQUM1QzNCLE9BQU9TLE9BQU9xQixjQUFjLENBQUMsU0FBU0gsSUFBSSxDQUFDO0lBQzVDO0FBQ0QifQ==
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { ConsoleAdapter } from "../src/console.adapter.js";
|
|
3
|
+
import { getLogLevelFromArgv, getLogLevelFromEnv, isValidLogLevel, resolveLogLevel } from "../src/env.js";
|
|
4
|
+
import { scribe } from "../src/logger.factory.js";
|
|
5
|
+
describe("getLogLevelFromArgv", ()=>{
|
|
6
|
+
it("reads long-form flag with separate value", ()=>{
|
|
7
|
+
expect(getLogLevelFromArgv([
|
|
8
|
+
"node",
|
|
9
|
+
"cli.js",
|
|
10
|
+
"--log-level",
|
|
11
|
+
"trace"
|
|
12
|
+
])).toBe("trace");
|
|
13
|
+
});
|
|
14
|
+
it("reads short-form flag with separate value", ()=>{
|
|
15
|
+
expect(getLogLevelFromArgv([
|
|
16
|
+
"node",
|
|
17
|
+
"cli.js",
|
|
18
|
+
"-l",
|
|
19
|
+
"debug"
|
|
20
|
+
])).toBe("debug");
|
|
21
|
+
});
|
|
22
|
+
it("reads equals-form flag", ()=>{
|
|
23
|
+
expect(getLogLevelFromArgv([
|
|
24
|
+
"node",
|
|
25
|
+
"cli.js",
|
|
26
|
+
"--log-level=warn"
|
|
27
|
+
])).toBe("warn");
|
|
28
|
+
});
|
|
29
|
+
it("returns undefined when flag is absent", ()=>{
|
|
30
|
+
expect(getLogLevelFromArgv([
|
|
31
|
+
"node",
|
|
32
|
+
"cli.js",
|
|
33
|
+
"build"
|
|
34
|
+
])).toBeUndefined();
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
describe("getLogLevelFromEnv", ()=>{
|
|
38
|
+
beforeEach(()=>{
|
|
39
|
+
vi.stubEnv("LOG_LEVEL", undefined);
|
|
40
|
+
vi.stubEnv("SCRIBE_LOG_LEVEL", undefined);
|
|
41
|
+
vi.stubEnv("LOGGING_LEVEL", undefined);
|
|
42
|
+
});
|
|
43
|
+
afterEach(()=>{
|
|
44
|
+
vi.unstubAllEnvs();
|
|
45
|
+
});
|
|
46
|
+
it("returns null when no env vars are set", ()=>{
|
|
47
|
+
expect(getLogLevelFromEnv()).toBeNull();
|
|
48
|
+
});
|
|
49
|
+
it("reads LOG_LEVEL", ()=>{
|
|
50
|
+
vi.stubEnv("LOG_LEVEL", "debug");
|
|
51
|
+
expect(getLogLevelFromEnv()).toBe("debug");
|
|
52
|
+
});
|
|
53
|
+
it("reads SCRIBE_LOG_LEVEL", ()=>{
|
|
54
|
+
vi.stubEnv("SCRIBE_LOG_LEVEL", "warn");
|
|
55
|
+
expect(getLogLevelFromEnv()).toBe("warn");
|
|
56
|
+
});
|
|
57
|
+
it("reads LOGGING_LEVEL", ()=>{
|
|
58
|
+
vi.stubEnv("LOGGING_LEVEL", "error");
|
|
59
|
+
expect(getLogLevelFromEnv()).toBe("error");
|
|
60
|
+
});
|
|
61
|
+
it("LOG_LEVEL takes precedence over SCRIBE_LOG_LEVEL", ()=>{
|
|
62
|
+
vi.stubEnv("LOG_LEVEL", "fatal");
|
|
63
|
+
vi.stubEnv("SCRIBE_LOG_LEVEL", "trace");
|
|
64
|
+
expect(getLogLevelFromEnv()).toBe("fatal");
|
|
65
|
+
});
|
|
66
|
+
it("SCRIBE_LOG_LEVEL takes precedence over LOGGING_LEVEL", ()=>{
|
|
67
|
+
vi.stubEnv("SCRIBE_LOG_LEVEL", "debug");
|
|
68
|
+
vi.stubEnv("LOGGING_LEVEL", "error");
|
|
69
|
+
expect(getLogLevelFromEnv()).toBe("debug");
|
|
70
|
+
});
|
|
71
|
+
it("normalises to lowercase", ()=>{
|
|
72
|
+
vi.stubEnv("LOG_LEVEL", "DEBUG");
|
|
73
|
+
expect(getLogLevelFromEnv()).toBe("debug");
|
|
74
|
+
});
|
|
75
|
+
it("trims whitespace", ()=>{
|
|
76
|
+
vi.stubEnv("LOG_LEVEL", " info ");
|
|
77
|
+
expect(getLogLevelFromEnv()).toBe("info");
|
|
78
|
+
});
|
|
79
|
+
it("treats empty string as not set and falls through to next var", ()=>{
|
|
80
|
+
vi.stubEnv("LOG_LEVEL", "");
|
|
81
|
+
vi.stubEnv("SCRIBE_LOG_LEVEL", "warn");
|
|
82
|
+
expect(getLogLevelFromEnv()).toBe("warn");
|
|
83
|
+
});
|
|
84
|
+
it("returns null when all vars are empty", ()=>{
|
|
85
|
+
vi.stubEnv("LOG_LEVEL", "");
|
|
86
|
+
vi.stubEnv("SCRIBE_LOG_LEVEL", "");
|
|
87
|
+
vi.stubEnv("LOGGING_LEVEL", "");
|
|
88
|
+
expect(getLogLevelFromEnv()).toBeNull();
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
describe("isValidLogLevel", ()=>{
|
|
92
|
+
it.each([
|
|
93
|
+
"fatal",
|
|
94
|
+
"error",
|
|
95
|
+
"warn",
|
|
96
|
+
"info",
|
|
97
|
+
"debug",
|
|
98
|
+
"trace"
|
|
99
|
+
])("returns true for valid level '%s'", (level)=>{
|
|
100
|
+
expect(isValidLogLevel(level)).toBe(true);
|
|
101
|
+
});
|
|
102
|
+
it("returns false for unknown level", ()=>{
|
|
103
|
+
expect(isValidLogLevel("verbose")).toBe(false);
|
|
104
|
+
});
|
|
105
|
+
it("returns false for empty string", ()=>{
|
|
106
|
+
expect(isValidLogLevel("")).toBe(false);
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
describe("resolveLogLevel", ()=>{
|
|
110
|
+
beforeEach(()=>{
|
|
111
|
+
vi.stubEnv("LOG_LEVEL", undefined);
|
|
112
|
+
vi.stubEnv("SCRIBE_LOG_LEVEL", undefined);
|
|
113
|
+
vi.stubEnv("LOGGING_LEVEL", undefined);
|
|
114
|
+
});
|
|
115
|
+
afterEach(()=>{
|
|
116
|
+
vi.unstubAllEnvs();
|
|
117
|
+
});
|
|
118
|
+
it("uses explicit log level when valid", ()=>{
|
|
119
|
+
expect(resolveLogLevel("debug")).toBe("debug");
|
|
120
|
+
});
|
|
121
|
+
it("uses env log level when explicit is missing", ()=>{
|
|
122
|
+
vi.stubEnv("LOG_LEVEL", "warn");
|
|
123
|
+
expect(resolveLogLevel()).toBe("warn");
|
|
124
|
+
});
|
|
125
|
+
it("returns null when explicit and env are invalid using simple form", ()=>{
|
|
126
|
+
vi.stubEnv("LOG_LEVEL", "verbose");
|
|
127
|
+
expect(resolveLogLevel("nope")).toBeNull();
|
|
128
|
+
});
|
|
129
|
+
it("falls back to default when explicit and env are invalid using object form", ()=>{
|
|
130
|
+
expect(resolveLogLevel({
|
|
131
|
+
explicitLogLevel: "verbose",
|
|
132
|
+
envLogLevel: "nope",
|
|
133
|
+
defaultLogLevel: "info"
|
|
134
|
+
})).toBe("info");
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
describe("scribe logger factory — env var log level", ()=>{
|
|
138
|
+
beforeEach(()=>{
|
|
139
|
+
vi.stubEnv("LOG_LEVEL", undefined);
|
|
140
|
+
vi.stubEnv("SCRIBE_LOG_LEVEL", undefined);
|
|
141
|
+
vi.stubEnv("LOGGING_LEVEL", undefined);
|
|
142
|
+
});
|
|
143
|
+
afterEach(()=>{
|
|
144
|
+
vi.unstubAllEnvs();
|
|
145
|
+
});
|
|
146
|
+
it("falls back to 'info' when no env var and no explicit logLevel", ()=>{
|
|
147
|
+
const spy = vi.spyOn(console, "log").mockImplementation(()=>{});
|
|
148
|
+
const loggerFn = scribe.configure({
|
|
149
|
+
adapter: new ConsoleAdapter()
|
|
150
|
+
});
|
|
151
|
+
const logger = loggerFn("env-test");
|
|
152
|
+
logger.debug("should not appear");
|
|
153
|
+
expect(spy).not.toHaveBeenCalledWith(expect.stringContaining("DEBUG"));
|
|
154
|
+
logger.info("should appear");
|
|
155
|
+
expect(spy).toHaveBeenCalledWith(expect.stringContaining("INFO"));
|
|
156
|
+
spy.mockRestore();
|
|
157
|
+
});
|
|
158
|
+
it("uses SCRIBE_LOG_LEVEL env var when no explicit logLevel", ()=>{
|
|
159
|
+
vi.stubEnv("SCRIBE_LOG_LEVEL", "debug");
|
|
160
|
+
const spy = vi.spyOn(console, "log").mockImplementation(()=>{});
|
|
161
|
+
const loggerFn = scribe.configure({
|
|
162
|
+
adapter: new ConsoleAdapter()
|
|
163
|
+
});
|
|
164
|
+
const logger = loggerFn("env-debug-test");
|
|
165
|
+
logger.debug("should appear via env var");
|
|
166
|
+
expect(spy).toHaveBeenCalledWith(expect.stringContaining("DEBUG"));
|
|
167
|
+
spy.mockRestore();
|
|
168
|
+
});
|
|
169
|
+
it("explicit logLevel overrides env var", ()=>{
|
|
170
|
+
vi.stubEnv("SCRIBE_LOG_LEVEL", "debug");
|
|
171
|
+
const spy = vi.spyOn(console, "log").mockImplementation(()=>{});
|
|
172
|
+
const loggerFn = scribe.configure({
|
|
173
|
+
adapter: new ConsoleAdapter(),
|
|
174
|
+
options: {
|
|
175
|
+
logLevel: "error"
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
const logger = loggerFn("explicit-override-test");
|
|
179
|
+
logger.debug("should NOT appear");
|
|
180
|
+
expect(spy).not.toHaveBeenCalledWith(expect.stringContaining("DEBUG"));
|
|
181
|
+
logger.error("should appear");
|
|
182
|
+
expect(spy).toHaveBeenCalledWith(expect.stringContaining("ERROR"));
|
|
183
|
+
spy.mockRestore();
|
|
184
|
+
});
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL3NjcmliZS9zY3JpYmUvdGVzdHMvZW52LnNwZWMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYWZ0ZXJFYWNoLCBiZWZvcmVFYWNoLCBkZXNjcmliZSwgZXhwZWN0LCBpdCwgdmkgfSBmcm9tIFwidml0ZXN0XCI7XG5pbXBvcnQgeyBDb25zb2xlQWRhcHRlciB9IGZyb20gXCIuLi9zcmMvY29uc29sZS5hZGFwdGVyLmpzXCI7XG5pbXBvcnQge1xuXHRnZXRMb2dMZXZlbEZyb21Bcmd2LFxuXHRnZXRMb2dMZXZlbEZyb21FbnYsXG5cdGlzVmFsaWRMb2dMZXZlbCxcblx0cmVzb2x2ZUxvZ0xldmVsLFxufSBmcm9tIFwiLi4vc3JjL2Vudi5qc1wiO1xuaW1wb3J0IHsgc2NyaWJlIH0gZnJvbSBcIi4uL3NyYy9sb2dnZXIuZmFjdG9yeS5qc1wiO1xuXG5kZXNjcmliZShcImdldExvZ0xldmVsRnJvbUFyZ3ZcIiwgKCkgPT4ge1xuXHRpdChcInJlYWRzIGxvbmctZm9ybSBmbGFnIHdpdGggc2VwYXJhdGUgdmFsdWVcIiwgKCkgPT4ge1xuXHRcdGV4cGVjdChnZXRMb2dMZXZlbEZyb21Bcmd2KFtcIm5vZGVcIiwgXCJjbGkuanNcIiwgXCItLWxvZy1sZXZlbFwiLCBcInRyYWNlXCJdKSkudG9CZShcInRyYWNlXCIpO1xuXHR9KTtcblxuXHRpdChcInJlYWRzIHNob3J0LWZvcm0gZmxhZyB3aXRoIHNlcGFyYXRlIHZhbHVlXCIsICgpID0+IHtcblx0XHRleHBlY3QoZ2V0TG9nTGV2ZWxGcm9tQXJndihbXCJub2RlXCIsIFwiY2xpLmpzXCIsIFwiLWxcIiwgXCJkZWJ1Z1wiXSkpLnRvQmUoXCJkZWJ1Z1wiKTtcblx0fSk7XG5cblx0aXQoXCJyZWFkcyBlcXVhbHMtZm9ybSBmbGFnXCIsICgpID0+IHtcblx0XHRleHBlY3QoZ2V0TG9nTGV2ZWxGcm9tQXJndihbXCJub2RlXCIsIFwiY2xpLmpzXCIsIFwiLS1sb2ctbGV2ZWw9d2FyblwiXSkpLnRvQmUoXCJ3YXJuXCIpO1xuXHR9KTtcblxuXHRpdChcInJldHVybnMgdW5kZWZpbmVkIHdoZW4gZmxhZyBpcyBhYnNlbnRcIiwgKCkgPT4ge1xuXHRcdGV4cGVjdChnZXRMb2dMZXZlbEZyb21Bcmd2KFtcIm5vZGVcIiwgXCJjbGkuanNcIiwgXCJidWlsZFwiXSkpLnRvQmVVbmRlZmluZWQoKTtcblx0fSk7XG59KTtcblxuZGVzY3JpYmUoXCJnZXRMb2dMZXZlbEZyb21FbnZcIiwgKCkgPT4ge1xuXHRiZWZvcmVFYWNoKCgpID0+IHtcblx0XHR2aS5zdHViRW52KFwiTE9HX0xFVkVMXCIsIHVuZGVmaW5lZCk7XG5cdFx0dmkuc3R1YkVudihcIlNDUklCRV9MT0dfTEVWRUxcIiwgdW5kZWZpbmVkKTtcblx0XHR2aS5zdHViRW52KFwiTE9HR0lOR19MRVZFTFwiLCB1bmRlZmluZWQpO1xuXHR9KTtcblxuXHRhZnRlckVhY2goKCkgPT4ge1xuXHRcdHZpLnVuc3R1YkFsbEVudnMoKTtcblx0fSk7XG5cblx0aXQoXCJyZXR1cm5zIG51bGwgd2hlbiBubyBlbnYgdmFycyBhcmUgc2V0XCIsICgpID0+IHtcblx0XHRleHBlY3QoZ2V0TG9nTGV2ZWxGcm9tRW52KCkpLnRvQmVOdWxsKCk7XG5cdH0pO1xuXG5cdGl0KFwicmVhZHMgTE9HX0xFVkVMXCIsICgpID0+IHtcblx0XHR2aS5zdHViRW52KFwiTE9HX0xFVkVMXCIsIFwiZGVidWdcIik7XG5cdFx0ZXhwZWN0KGdldExvZ0xldmVsRnJvbUVudigpKS50b0JlKFwiZGVidWdcIik7XG5cdH0pO1xuXG5cdGl0KFwicmVhZHMgU0NSSUJFX0xPR19MRVZFTFwiLCAoKSA9PiB7XG5cdFx0dmkuc3R1YkVudihcIlNDUklCRV9MT0dfTEVWRUxcIiwgXCJ3YXJuXCIpO1xuXHRcdGV4cGVjdChnZXRMb2dMZXZlbEZyb21FbnYoKSkudG9CZShcIndhcm5cIik7XG5cdH0pO1xuXG5cdGl0KFwicmVhZHMgTE9HR0lOR19MRVZFTFwiLCAoKSA9PiB7XG5cdFx0dmkuc3R1YkVudihcIkxPR0dJTkdfTEVWRUxcIiwgXCJlcnJvclwiKTtcblx0XHRleHBlY3QoZ2V0TG9nTGV2ZWxGcm9tRW52KCkpLnRvQmUoXCJlcnJvclwiKTtcblx0fSk7XG5cblx0aXQoXCJMT0dfTEVWRUwgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIFNDUklCRV9MT0dfTEVWRUxcIiwgKCkgPT4ge1xuXHRcdHZpLnN0dWJFbnYoXCJMT0dfTEVWRUxcIiwgXCJmYXRhbFwiKTtcblx0XHR2aS5zdHViRW52KFwiU0NSSUJFX0xPR19MRVZFTFwiLCBcInRyYWNlXCIpO1xuXHRcdGV4cGVjdChnZXRMb2dMZXZlbEZyb21FbnYoKSkudG9CZShcImZhdGFsXCIpO1xuXHR9KTtcblxuXHRpdChcIlNDUklCRV9MT0dfTEVWRUwgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIExPR0dJTkdfTEVWRUxcIiwgKCkgPT4ge1xuXHRcdHZpLnN0dWJFbnYoXCJTQ1JJQkVfTE9HX0xFVkVMXCIsIFwiZGVidWdcIik7XG5cdFx0dmkuc3R1YkVudihcIkxPR0dJTkdfTEVWRUxcIiwgXCJlcnJvclwiKTtcblx0XHRleHBlY3QoZ2V0TG9nTGV2ZWxGcm9tRW52KCkpLnRvQmUoXCJkZWJ1Z1wiKTtcblx0fSk7XG5cblx0aXQoXCJub3JtYWxpc2VzIHRvIGxvd2VyY2FzZVwiLCAoKSA9PiB7XG5cdFx0dmkuc3R1YkVudihcIkxPR19MRVZFTFwiLCBcIkRFQlVHXCIpO1xuXHRcdGV4cGVjdChnZXRMb2dMZXZlbEZyb21FbnYoKSkudG9CZShcImRlYnVnXCIpO1xuXHR9KTtcblxuXHRpdChcInRyaW1zIHdoaXRlc3BhY2VcIiwgKCkgPT4ge1xuXHRcdHZpLnN0dWJFbnYoXCJMT0dfTEVWRUxcIiwgXCIgIGluZm8gIFwiKTtcblx0XHRleHBlY3QoZ2V0TG9nTGV2ZWxGcm9tRW52KCkpLnRvQmUoXCJpbmZvXCIpO1xuXHR9KTtcblxuXHRpdChcInRyZWF0cyBlbXB0eSBzdHJpbmcgYXMgbm90IHNldCBhbmQgZmFsbHMgdGhyb3VnaCB0byBuZXh0IHZhclwiLCAoKSA9PiB7XG5cdFx0dmkuc3R1YkVudihcIkxPR19MRVZFTFwiLCBcIlwiKTtcblx0XHR2aS5zdHViRW52KFwiU0NSSUJFX0xPR19MRVZFTFwiLCBcIndhcm5cIik7XG5cdFx0ZXhwZWN0KGdldExvZ0xldmVsRnJvbUVudigpKS50b0JlKFwid2FyblwiKTtcblx0fSk7XG5cblx0aXQoXCJyZXR1cm5zIG51bGwgd2hlbiBhbGwgdmFycyBhcmUgZW1wdHlcIiwgKCkgPT4ge1xuXHRcdHZpLnN0dWJFbnYoXCJMT0dfTEVWRUxcIiwgXCJcIik7XG5cdFx0dmkuc3R1YkVudihcIlNDUklCRV9MT0dfTEVWRUxcIiwgXCJcIik7XG5cdFx0dmkuc3R1YkVudihcIkxPR0dJTkdfTEVWRUxcIiwgXCJcIik7XG5cdFx0ZXhwZWN0KGdldExvZ0xldmVsRnJvbUVudigpKS50b0JlTnVsbCgpO1xuXHR9KTtcbn0pO1xuXG5kZXNjcmliZShcImlzVmFsaWRMb2dMZXZlbFwiLCAoKSA9PiB7XG5cdGl0LmVhY2goW1xuXHRcdFwiZmF0YWxcIixcblx0XHRcImVycm9yXCIsXG5cdFx0XCJ3YXJuXCIsXG5cdFx0XCJpbmZvXCIsXG5cdFx0XCJkZWJ1Z1wiLFxuXHRcdFwidHJhY2VcIixcblx0XSkoXCJyZXR1cm5zIHRydWUgZm9yIHZhbGlkIGxldmVsICclcydcIiwgKGxldmVsKSA9PiB7XG5cdFx0ZXhwZWN0KGlzVmFsaWRMb2dMZXZlbChsZXZlbCkpLnRvQmUodHJ1ZSk7XG5cdH0pO1xuXG5cdGl0KFwicmV0dXJucyBmYWxzZSBmb3IgdW5rbm93biBsZXZlbFwiLCAoKSA9PiB7XG5cdFx0ZXhwZWN0KGlzVmFsaWRMb2dMZXZlbChcInZlcmJvc2VcIikpLnRvQmUoZmFsc2UpO1xuXHR9KTtcblxuXHRpdChcInJldHVybnMgZmFsc2UgZm9yIGVtcHR5IHN0cmluZ1wiLCAoKSA9PiB7XG5cdFx0ZXhwZWN0KGlzVmFsaWRMb2dMZXZlbChcIlwiKSkudG9CZShmYWxzZSk7XG5cdH0pO1xufSk7XG5cbmRlc2NyaWJlKFwicmVzb2x2ZUxvZ0xldmVsXCIsICgpID0+IHtcblx0YmVmb3JlRWFjaCgoKSA9PiB7XG5cdFx0dmkuc3R1YkVudihcIkxPR19MRVZFTFwiLCB1bmRlZmluZWQpO1xuXHRcdHZpLnN0dWJFbnYoXCJTQ1JJQkVfTE9HX0xFVkVMXCIsIHVuZGVmaW5lZCk7XG5cdFx0dmkuc3R1YkVudihcIkxPR0dJTkdfTEVWRUxcIiwgdW5kZWZpbmVkKTtcblx0fSk7XG5cblx0YWZ0ZXJFYWNoKCgpID0+IHtcblx0XHR2aS51bnN0dWJBbGxFbnZzKCk7XG5cdH0pO1xuXG5cdGl0KFwidXNlcyBleHBsaWNpdCBsb2cgbGV2ZWwgd2hlbiB2YWxpZFwiLCAoKSA9PiB7XG5cdFx0ZXhwZWN0KHJlc29sdmVMb2dMZXZlbChcImRlYnVnXCIpKS50b0JlKFwiZGVidWdcIik7XG5cdH0pO1xuXG5cdGl0KFwidXNlcyBlbnYgbG9nIGxldmVsIHdoZW4gZXhwbGljaXQgaXMgbWlzc2luZ1wiLCAoKSA9PiB7XG5cdFx0dmkuc3R1YkVudihcIkxPR19MRVZFTFwiLCBcIndhcm5cIik7XG5cdFx0ZXhwZWN0KHJlc29sdmVMb2dMZXZlbCgpKS50b0JlKFwid2FyblwiKTtcblx0fSk7XG5cblx0aXQoXCJyZXR1cm5zIG51bGwgd2hlbiBleHBsaWNpdCBhbmQgZW52IGFyZSBpbnZhbGlkIHVzaW5nIHNpbXBsZSBmb3JtXCIsICgpID0+IHtcblx0XHR2aS5zdHViRW52KFwiTE9HX0xFVkVMXCIsIFwidmVyYm9zZVwiKTtcblx0XHRleHBlY3QocmVzb2x2ZUxvZ0xldmVsKFwibm9wZVwiKSkudG9CZU51bGwoKTtcblx0fSk7XG5cblx0aXQoXCJmYWxscyBiYWNrIHRvIGRlZmF1bHQgd2hlbiBleHBsaWNpdCBhbmQgZW52IGFyZSBpbnZhbGlkIHVzaW5nIG9iamVjdCBmb3JtXCIsICgpID0+IHtcblx0XHRleHBlY3QoXG5cdFx0XHRyZXNvbHZlTG9nTGV2ZWwoe1xuXHRcdFx0XHRleHBsaWNpdExvZ0xldmVsOiBcInZlcmJvc2VcIixcblx0XHRcdFx0ZW52TG9nTGV2ZWw6IFwibm9wZVwiLFxuXHRcdFx0XHRkZWZhdWx0TG9nTGV2ZWw6IFwiaW5mb1wiLFxuXHRcdFx0fSksXG5cdFx0KS50b0JlKFwiaW5mb1wiKTtcblx0fSk7XG59KTtcblxuZGVzY3JpYmUoXCJzY3JpYmUgbG9nZ2VyIGZhY3Rvcnkg4oCUIGVudiB2YXIgbG9nIGxldmVsXCIsICgpID0+IHtcblx0YmVmb3JlRWFjaCgoKSA9PiB7XG5cdFx0dmkuc3R1YkVudihcIkxPR19MRVZFTFwiLCB1bmRlZmluZWQpO1xuXHRcdHZpLnN0dWJFbnYoXCJTQ1JJQkVfTE9HX0xFVkVMXCIsIHVuZGVmaW5lZCk7XG5cdFx0dmkuc3R1YkVudihcIkxPR0dJTkdfTEVWRUxcIiwgdW5kZWZpbmVkKTtcblx0fSk7XG5cblx0YWZ0ZXJFYWNoKCgpID0+IHtcblx0XHR2aS51bnN0dWJBbGxFbnZzKCk7XG5cdH0pO1xuXG5cdGl0KFwiZmFsbHMgYmFjayB0byAnaW5mbycgd2hlbiBubyBlbnYgdmFyIGFuZCBubyBleHBsaWNpdCBsb2dMZXZlbFwiLCAoKSA9PiB7XG5cdFx0Y29uc3Qgc3B5ID0gdmkuc3B5T24oY29uc29sZSwgXCJsb2dcIikubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHt9KTtcblxuXHRcdGNvbnN0IGxvZ2dlckZuID0gc2NyaWJlLmNvbmZpZ3VyZSh7IGFkYXB0ZXI6IG5ldyBDb25zb2xlQWRhcHRlcigpIH0pO1xuXHRcdGNvbnN0IGxvZ2dlciA9IGxvZ2dlckZuKFwiZW52LXRlc3RcIik7XG5cblx0XHRsb2dnZXIuZGVidWcoXCJzaG91bGQgbm90IGFwcGVhclwiKTtcblx0XHRleHBlY3Qoc3B5KS5ub3QudG9IYXZlQmVlbkNhbGxlZFdpdGgoZXhwZWN0LnN0cmluZ0NvbnRhaW5pbmcoXCJERUJVR1wiKSk7XG5cblx0XHRsb2dnZXIuaW5mbyhcInNob3VsZCBhcHBlYXJcIik7XG5cdFx0ZXhwZWN0KHNweSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoZXhwZWN0LnN0cmluZ0NvbnRhaW5pbmcoXCJJTkZPXCIpKTtcblxuXHRcdHNweS5tb2NrUmVzdG9yZSgpO1xuXHR9KTtcblxuXHRpdChcInVzZXMgU0NSSUJFX0xPR19MRVZFTCBlbnYgdmFyIHdoZW4gbm8gZXhwbGljaXQgbG9nTGV2ZWxcIiwgKCkgPT4ge1xuXHRcdHZpLnN0dWJFbnYoXCJTQ1JJQkVfTE9HX0xFVkVMXCIsIFwiZGVidWdcIik7XG5cdFx0Y29uc3Qgc3B5ID0gdmkuc3B5T24oY29uc29sZSwgXCJsb2dcIikubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHt9KTtcblxuXHRcdGNvbnN0IGxvZ2dlckZuID0gc2NyaWJlLmNvbmZpZ3VyZSh7IGFkYXB0ZXI6IG5ldyBDb25zb2xlQWRhcHRlcigpIH0pO1xuXHRcdGNvbnN0IGxvZ2dlciA9IGxvZ2dlckZuKFwiZW52LWRlYnVnLXRlc3RcIik7XG5cblx0XHRsb2dnZXIuZGVidWcoXCJzaG91bGQgYXBwZWFyIHZpYSBlbnYgdmFyXCIpO1xuXHRcdGV4cGVjdChzcHkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGV4cGVjdC5zdHJpbmdDb250YWluaW5nKFwiREVCVUdcIikpO1xuXG5cdFx0c3B5Lm1vY2tSZXN0b3JlKCk7XG5cdH0pO1xuXG5cdGl0KFwiZXhwbGljaXQgbG9nTGV2ZWwgb3ZlcnJpZGVzIGVudiB2YXJcIiwgKCkgPT4ge1xuXHRcdHZpLnN0dWJFbnYoXCJTQ1JJQkVfTE9HX0xFVkVMXCIsIFwiZGVidWdcIik7XG5cdFx0Y29uc3Qgc3B5ID0gdmkuc3B5T24oY29uc29sZSwgXCJsb2dcIikubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHt9KTtcblxuXHRcdGNvbnN0IGxvZ2dlckZuID0gc2NyaWJlLmNvbmZpZ3VyZSh7XG5cdFx0XHRhZGFwdGVyOiBuZXcgQ29uc29sZUFkYXB0ZXIoKSxcblx0XHRcdG9wdGlvbnM6IHsgbG9nTGV2ZWw6IFwiZXJyb3JcIiB9LFxuXHRcdH0pO1xuXHRcdGNvbnN0IGxvZ2dlciA9IGxvZ2dlckZuKFwiZXhwbGljaXQtb3ZlcnJpZGUtdGVzdFwiKTtcblxuXHRcdGxvZ2dlci5kZWJ1ZyhcInNob3VsZCBOT1QgYXBwZWFyXCIpO1xuXHRcdGV4cGVjdChzcHkpLm5vdC50b0hhdmVCZWVuQ2FsbGVkV2l0aChleHBlY3Quc3RyaW5nQ29udGFpbmluZyhcIkRFQlVHXCIpKTtcblxuXHRcdGxvZ2dlci5lcnJvcihcInNob3VsZCBhcHBlYXJcIik7XG5cdFx0ZXhwZWN0KHNweSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoZXhwZWN0LnN0cmluZ0NvbnRhaW5pbmcoXCJFUlJPUlwiKSk7XG5cblx0XHRzcHkubW9ja1Jlc3RvcmUoKTtcblx0fSk7XG59KTtcbiJdLCJuYW1lcyI6WyJhZnRlckVhY2giLCJiZWZvcmVFYWNoIiwiZGVzY3JpYmUiLCJleHBlY3QiLCJpdCIsInZpIiwiQ29uc29sZUFkYXB0ZXIiLCJnZXRMb2dMZXZlbEZyb21Bcmd2IiwiZ2V0TG9nTGV2ZWxGcm9tRW52IiwiaXNWYWxpZExvZ0xldmVsIiwicmVzb2x2ZUxvZ0xldmVsIiwic2NyaWJlIiwidG9CZSIsInRvQmVVbmRlZmluZWQiLCJzdHViRW52IiwidW5kZWZpbmVkIiwidW5zdHViQWxsRW52cyIsInRvQmVOdWxsIiwiZWFjaCIsImxldmVsIiwiZXhwbGljaXRMb2dMZXZlbCIsImVudkxvZ0xldmVsIiwiZGVmYXVsdExvZ0xldmVsIiwic3B5Iiwic3B5T24iLCJjb25zb2xlIiwibW9ja0ltcGxlbWVudGF0aW9uIiwibG9nZ2VyRm4iLCJjb25maWd1cmUiLCJhZGFwdGVyIiwibG9nZ2VyIiwiZGVidWciLCJub3QiLCJ0b0hhdmVCZWVuQ2FsbGVkV2l0aCIsInN0cmluZ0NvbnRhaW5pbmciLCJpbmZvIiwibW9ja1Jlc3RvcmUiLCJvcHRpb25zIiwibG9nTGV2ZWwiLCJlcnJvciJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsU0FBUyxFQUFFQyxVQUFVLEVBQUVDLFFBQVEsRUFBRUMsTUFBTSxFQUFFQyxFQUFFLEVB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
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { ConsoleAdapter } from "../src/console.adapter.js";
|
|
3
|
+
import { scribe } from "../src/logger.factory.js";
|
|
4
|
+
describe("Logger Factory with Default Adapter", ()=>{
|
|
5
|
+
it("should use console adapter by default", ()=>{
|
|
6
|
+
const spy = vi.spyOn(console, "log").mockImplementation(()=>{});
|
|
7
|
+
// No configuration needed
|
|
8
|
+
const logger = scribe.logger("default-test");
|
|
9
|
+
logger.info("This should work");
|
|
10
|
+
expect(spy).toHaveBeenCalled();
|
|
11
|
+
spy.mockRestore();
|
|
12
|
+
});
|
|
13
|
+
it("should allow configuring a different adapter", ()=>{
|
|
14
|
+
const spy = vi.spyOn(console, "log").mockImplementation(()=>{});
|
|
15
|
+
// Configure with explicit console adapter
|
|
16
|
+
const loggerFn = scribe.configure({
|
|
17
|
+
adapter: new ConsoleAdapter()
|
|
18
|
+
});
|
|
19
|
+
const logger = loggerFn("configured-test");
|
|
20
|
+
logger.warn("Configured message");
|
|
21
|
+
expect(spy).toHaveBeenCalledWith(expect.stringContaining("WARN [configured-test]: Configured message"));
|
|
22
|
+
spy.mockRestore();
|
|
23
|
+
});
|
|
24
|
+
it("should work for multiple logger instances", ()=>{
|
|
25
|
+
const spy = vi.spyOn(console, "log").mockImplementation(()=>{});
|
|
26
|
+
const logger1 = scribe.logger("service1");
|
|
27
|
+
const logger2 = scribe.logger("service2");
|
|
28
|
+
logger1.info("Message from service1");
|
|
29
|
+
logger2.error("Message from service2");
|
|
30
|
+
expect(spy).toHaveBeenCalledWith(expect.stringContaining("INFO [service1]: Message from service1"));
|
|
31
|
+
expect(spy).toHaveBeenCalledWith(expect.stringContaining("ERROR [service2]: Message from service2"));
|
|
32
|
+
spy.mockRestore();
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL3NjcmliZS9zY3JpYmUvdGVzdHMvbG9nZ2VyLmZhY3RvcnkuZGVmYXVsdC5zcGVjLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlc2NyaWJlLCBleHBlY3QsIGl0LCB2aSB9IGZyb20gXCJ2aXRlc3RcIjtcbmltcG9ydCB7IENvbnNvbGVBZGFwdGVyIH0gZnJvbSBcIi4uL3NyYy9jb25zb2xlLmFkYXB0ZXIuanNcIjtcbmltcG9ydCB7IHNjcmliZSB9IGZyb20gXCIuLi9zcmMvbG9nZ2VyLmZhY3RvcnkuanNcIjtcblxuZGVzY3JpYmUoXCJMb2dnZXIgRmFjdG9yeSB3aXRoIERlZmF1bHQgQWRhcHRlclwiLCAoKSA9PiB7XG5cdGl0KFwic2hvdWxkIHVzZSBjb25zb2xlIGFkYXB0ZXIgYnkgZGVmYXVsdFwiLCAoKSA9PiB7XG5cdFx0Y29uc3Qgc3B5ID0gdmkuc3B5T24oY29uc29sZSwgXCJsb2dcIikubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHt9KTtcblxuXHRcdC8vIE5vIGNvbmZpZ3VyYXRpb24gbmVlZGVkXG5cdFx0Y29uc3QgbG9nZ2VyID0gc2NyaWJlLmxvZ2dlcihcImRlZmF1bHQtdGVzdFwiKTtcblxuXHRcdGxvZ2dlci5pbmZvKFwiVGhpcyBzaG91bGQgd29ya1wiKTtcblxuXHRcdGV4cGVjdChzcHkpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcblx0XHRzcHkubW9ja1Jlc3RvcmUoKTtcblx0fSk7XG5cblx0aXQoXCJzaG91bGQgYWxsb3cgY29uZmlndXJpbmcgYSBkaWZmZXJlbnQgYWRhcHRlclwiLCAoKSA9PiB7XG5cdFx0Y29uc3Qgc3B5ID0gdmkuc3B5T24oY29uc29sZSwgXCJsb2dcIikubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHt9KTtcblxuXHRcdC8vIENvbmZpZ3VyZSB3aXRoIGV4cGxpY2l0IGNvbnNvbGUgYWRhcHRlclxuXHRcdGNvbnN0IGxvZ2dlckZuID0gc2NyaWJlLmNvbmZpZ3VyZSh7XG5cdFx0XHRhZGFwdGVyOiBuZXcgQ29uc29sZUFkYXB0ZXIoKSxcblx0XHR9KTtcblxuXHRcdGNvbnN0IGxvZ2dlciA9IGxvZ2dlckZuKFwiY29uZmlndXJlZC10ZXN0XCIpO1xuXHRcdGxvZ2dlci53YXJuKFwiQ29uZmlndXJlZCBtZXNzYWdlXCIpO1xuXG5cdFx0ZXhwZWN0KHNweSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXG5cdFx0XHRleHBlY3Quc3RyaW5nQ29udGFpbmluZyhcIldBUk4gW2NvbmZpZ3VyZWQtdGVzdF06IENvbmZpZ3VyZWQgbWVzc2FnZVwiKSxcblx0XHQpO1xuXG5cdFx0c3B5Lm1vY2tSZXN0b3JlKCk7XG5cdH0pO1xuXG5cdGl0KFwic2hvdWxkIHdvcmsgZm9yIG11bHRpcGxlIGxvZ2dlciBpbnN0YW5jZXNcIiwgKCkgPT4ge1xuXHRcdGNvbnN0IHNweSA9IHZpLnNweU9uKGNvbnNvbGUsIFwibG9nXCIpLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB7fSk7XG5cblx0XHRjb25zdCBsb2dnZXIxID0gc2NyaWJlLmxvZ2dlcihcInNlcnZpY2UxXCIpO1xuXHRcdGNvbnN0IGxvZ2dlcjIgPSBzY3JpYmUubG9nZ2VyKFwic2VydmljZTJcIik7XG5cblx0XHRsb2dnZXIxLmluZm8oXCJNZXNzYWdlIGZyb20gc2VydmljZTFcIik7XG5cdFx0bG9nZ2VyMi5lcnJvcihcIk1lc3NhZ2UgZnJvbSBzZXJ2aWNlMlwiKTtcblxuXHRcdGV4cGVjdChzcHkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuXHRcdFx0ZXhwZWN0LnN0cmluZ0NvbnRhaW5pbmcoXCJJTkZPIFtzZXJ2aWNlMV06IE1lc3NhZ2UgZnJvbSBzZXJ2aWNlMVwiKSxcblx0XHQpO1xuXHRcdGV4cGVjdChzcHkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuXHRcdFx0ZXhwZWN0LnN0cmluZ0NvbnRhaW5pbmcoXCJFUlJPUiBbc2VydmljZTJdOiBNZXNzYWdlIGZyb20gc2VydmljZTJcIiksXG5cdFx0KTtcblxuXHRcdHNweS5tb2NrUmVzdG9yZSgpO1xuXHR9KTtcbn0pO1xuIl0sIm5hbWVzIjpbImRlc2NyaWJlIiwiZXhwZWN0IiwiaXQiLCJ2aSIsIkNvbnNvbGVBZGFwdGVyIiwic2NyaWJlIiwic3B5Iiwic3B5T24iLCJjb25zb2xlIiwibW9ja0ltcGxlbWVudGF0aW9uIiwibG9nZ2VyIiwiaW5mbyIsInRvSGF2ZUJlZW5DYWxsZWQiLCJtb2NrUmVzdG9yZSIsImxvZ2dlckZuIiwiY29uZmlndXJlIiwiYWRhcHRlciIsIndhcm4iLCJ0b0hhdmVCZWVuQ2FsbGVkV2l0aCIsInN0cmluZ0NvbnRhaW5pbmciLCJsb2dnZXIxIiwibG9nZ2VyMiIsImVycm9yIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxRQUFRLEVBQUVDLE1BQU0sRUFBRUMsRUFBRSxFQUFFQyxFQUFFLFFBQVEsU0FBUztBQUNsRCxTQUFTQyxjQUFjLFFBQVEsNEJBQTRCO0FBQzNELFNBQVNDLE1BQU0sUUFBUSwyQkFBMkI7QUFFbERMLFNBQVMsdUNBQXVDO0lBQy9DRSxHQUFHLHlDQUF5QztRQUMzQyxNQUFNSSxNQUFNSCxHQUFHSSxLQUFLLENBQUNDLFNBQVMsT0FBT0Msa0JBQWtCLENBQUMsS0FBTztRQUUvRCwwQkFBMEI7UUFDMUIsTUFBTUMsU0FBU0wsT0FBT0ssTUFBTSxDQUFDO1FBRTdCQSxPQUFPQyxJQUFJLENBQUM7UUFFWlYsT0FBT0ssS0FBS00sZ0JBQWdCO1FBQzVCTixJQUFJTyxXQUFXO0lBQ2hCO0lBRUFYLEdBQUcsZ0RBQWdEO1FBQ2xELE1BQU1JLE1BQU1ILEdBQUdJLEtBQUssQ0FBQ0MsU0FBUyxPQUFPQyxrQkFBa0IsQ0FBQyxLQUFPO1FBRS9ELDBDQUEwQztRQUMxQyxNQUFNSyxXQUFXVCxPQUFPVSxTQUFTLENBQUM7WUFDakNDLFNBQVMsSUFBSVo7UUFDZDtRQUVBLE1BQU1NLFNBQVNJLFNBQVM7UUFDeEJKLE9BQU9PLElBQUksQ0FBQztRQUVaaEIsT0FBT0ssS0FBS1ksb0JBQW9CLENBQy9CakIsT0FBT2tCLGdCQUFnQixDQUFDO1FBR3pCYixJQUFJTyxXQUFXO0lBQ2hCO0lBRUFYLEdBQUcsNkNBQTZDO1FBQy9DLE1BQU1JLE1BQU1ILEdBQUdJLEtBQUssQ0FBQ0MsU0FBUyxPQUFPQyxrQkFBa0IsQ0FBQyxLQUFPO1FBRS9ELE1BQU1XLFVBQVVmLE9BQU9LLE1BQU0sQ0FBQztRQUM5QixNQUFNVyxVQUFVaEIsT0FBT0ssTUFBTSxDQUFDO1FBRTlCVSxRQUFRVCxJQUFJLENBQUM7UUFDYlUsUUFBUUMsS0FBSyxDQUFDO1FBRWRyQixPQUFPSyxLQUFLWSxvQkFBb0IsQ0FDL0JqQixPQUFPa0IsZ0JBQWdCLENBQUM7UUFFekJsQixPQUFPSyxLQUFLWSxvQkFBb0IsQ0FDL0JqQixPQUFPa0IsZ0JBQWdCLENBQUM7UUFHekJiLElBQUlPLFdBQVc7SUFDaEI7QUFDRCJ9
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
value: true
|
|
4
|
-
});
|
|
5
|
-
Object.defineProperty(exports, "ConsoleAdapter", {
|
|
6
|
-
enumerable: true,
|
|
7
|
-
get: function() {
|
|
8
|
-
return ConsoleAdapter;
|
|
9
|
-
}
|
|
10
|
-
});
|
|
11
|
-
const _loggeradapter = require("./logger.adapter.js");
|
|
12
|
-
const _types = require("./types.js");
|
|
13
|
-
class ConsoleAdapter extends _loggeradapter.LogAdapter {
|
|
14
|
-
configuredLevels;
|
|
15
|
-
configuredLogLevel = _types.DefaultLogLevel;
|
|
16
|
-
configuredLogLevelValue = _types.LogLevels.info;
|
|
17
|
-
constructor(_options = {}){
|
|
18
|
-
super();
|
|
19
|
-
}
|
|
20
|
-
configure(scribeOptions) {
|
|
21
|
-
// Get merged log levels (default + custom) using parent class method
|
|
22
|
-
this.configuredLevels = this.getLogLevels(scribeOptions);
|
|
23
|
-
const logLevelStr = scribeOptions.logLevel ?? _types.DefaultLogLevel;
|
|
24
|
-
this.configuredLogLevel = logLevelStr;
|
|
25
|
-
this.configuredLogLevelValue = this.configuredLevels[logLevelStr] ?? _types.LogLevels.info;
|
|
26
|
-
}
|
|
27
|
-
getLogger(name) {
|
|
28
|
-
const loggerName = name || "default";
|
|
29
|
-
return this.createConsoleLogger(loggerName);
|
|
30
|
-
}
|
|
31
|
-
createConsoleLogger(name) {
|
|
32
|
-
// Use the levels configured during the configure() call
|
|
33
|
-
const allLevels = this.configuredLevels;
|
|
34
|
-
const currentLevel = this.configuredLogLevel;
|
|
35
|
-
const threshold = this.configuredLogLevelValue;
|
|
36
|
-
const baseLogger = {
|
|
37
|
-
get currentLevel () {
|
|
38
|
-
return currentLevel;
|
|
39
|
-
},
|
|
40
|
-
get logLevels () {
|
|
41
|
-
return allLevels;
|
|
42
|
-
}
|
|
43
|
-
};
|
|
44
|
-
const logFunction = (level)=>(msg, ...args)=>{
|
|
45
|
-
const timestamp = new Date().toISOString();
|
|
46
|
-
let message;
|
|
47
|
-
if (typeof msg === "object") {
|
|
48
|
-
message = msg instanceof Error ? (0, _loggeradapter.formatError)(msg) : JSON.stringify(msg);
|
|
49
|
-
} else {
|
|
50
|
-
message = String(msg);
|
|
51
|
-
}
|
|
52
|
-
const logLine = `[${timestamp}] ${level.toUpperCase()} [${name}]: ${message}`;
|
|
53
|
-
if (args.length > 0) {
|
|
54
|
-
console.log(logLine, ...args);
|
|
55
|
-
} else {
|
|
56
|
-
console.log(logLine);
|
|
57
|
-
}
|
|
58
|
-
};
|
|
59
|
-
const noop = ()=>{};
|
|
60
|
-
// Start with base logger and isLevelEnabled method
|
|
61
|
-
const logger = Object.assign(baseLogger, {
|
|
62
|
-
isLevelEnabled: (level)=>(allLevels[level] ?? 0) >= threshold
|
|
63
|
-
});
|
|
64
|
-
// Dynamically add all log level methods (default + custom)
|
|
65
|
-
// Levels below the configured threshold are patched to noop
|
|
66
|
-
for (const [levelName, levelValue] of Object.entries(allLevels)){
|
|
67
|
-
// biome-ignore lint/suspicious/noExplicitAny: Dynamic logger level creation requires any
|
|
68
|
-
logger[levelName] = levelValue >= threshold ? logFunction(levelName) : noop;
|
|
69
|
-
}
|
|
70
|
-
return logger;
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL3NjcmliZS9zY3JpYmUvc3JjL2NvbnNvbGUuYWRhcHRlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmb3JtYXRFcnJvciwgTG9nQWRhcHRlciB9IGZyb20gXCIuL2xvZ2dlci5hZGFwdGVyLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEJhc2VMb2dnZXIsIExvZ2dlciB9IGZyb20gXCIuL2xvZ2dlci50eXBlLmpzXCI7XG5pbXBvcnQge1xuXHREZWZhdWx0TG9nTGV2ZWwsXG5cdHR5cGUgTG9nQWRhcHRlck9wdGlvbnMsXG5cdExvZ0xldmVscyxcblx0dHlwZSBTY3JpYmVPcHRpb25zLFxufSBmcm9tIFwiLi90eXBlcy5qc1wiO1xuXG5leHBvcnQgdHlwZSBDb25zb2xlQWRhcHRlck9wdGlvbnMgPSB7fSAmIExvZ0FkYXB0ZXJPcHRpb25zO1xuXG5leHBvcnQgY2xhc3MgQ29uc29sZUFkYXB0ZXIgZXh0ZW5kcyBMb2dBZGFwdGVyIHtcblx0cHJpdmF0ZSBjb25maWd1cmVkTGV2ZWxzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+O1xuXHRwcml2YXRlIGNvbmZpZ3VyZWRMb2dMZXZlbDogc3RyaW5nID0gRGVmYXVsdExvZ0xldmVsO1xuXHRwcml2YXRlIGNvbmZpZ3VyZWRMb2dMZXZlbFZhbHVlOiBudW1iZXIgPSBMb2dMZXZlbHMuaW5mbztcblxuXHRwdWJsaWMgY29uc3RydWN0b3IoX29wdGlvbnM6IENvbnNvbGVBZGFwdGVyT3B0aW9ucyA9IHt9KSB7XG5cdFx0c3VwZXIoKTtcblx0fVxuXG5cdHB1YmxpYyBjb25maWd1cmU8VCBleHRlbmRzIHN0cmluZyA9IG5ldmVyLCBDdXN0b21Pbmx5IGV4dGVuZHMgdHJ1ZSB8IGZhbHNlID0gZmFsc2U+KFxuXHRcdHNjcmliZU9wdGlvbnM6IFNjcmliZU9wdGlvbnM8VCwgQ3VzdG9tT25seT4sXG5cdCkge1xuXHRcdC8vIEdldCBtZXJnZWQgbG9nIGxldmVscyAoZGVmYXVsdCArIGN1c3RvbSkgdXNpbmcgcGFyZW50IGNsYXNzIG1ldGhvZFxuXHRcdHRoaXMuY29uZmlndXJlZExldmVscyA9IHRoaXMuZ2V0TG9nTGV2ZWxzKHNjcmliZU9wdGlvbnMpO1xuXHRcdGNvbnN0IGxvZ0xldmVsU3RyID0gc2NyaWJlT3B0aW9ucy5sb2dMZXZlbCA/PyBEZWZhdWx0TG9nTGV2ZWw7XG5cdFx0dGhpcy5jb25maWd1cmVkTG9nTGV2ZWwgPSBsb2dMZXZlbFN0cjtcblx0XHR0aGlzLmNvbmZpZ3VyZWRMb2dMZXZlbFZhbHVlID0gdGhpcy5jb25maWd1cmVkTGV2ZWxzW2xvZ0xldmVsU3RyXSA/PyBMb2dMZXZlbHMuaW5mbztcblx0fVxuXG5cdHB1YmxpYyBnZXRMb2dnZXI8VCBleHRlbmRzIHN0cmluZyA9IG5ldmVyLCBDdXN0b21Pbmx5IGV4dGVuZHMgdHJ1ZSB8IGZhbHNlID0gZmFsc2U+KFxuXHRcdG5hbWU/OiBzdHJpbmcsXG5cdCk6IExvZ2dlcjxULCBDdXN0b21Pbmx5PiB7XG5cdFx0Y29uc3QgbG9nZ2VyTmFtZSA9IG5hbWUgfHwgXCJkZWZhdWx0XCI7XG5cdFx0cmV0dXJuIHRoaXMuY3JlYXRlQ29uc29sZUxvZ2dlcjxULCBDdXN0b21Pbmx5Pihsb2dnZXJOYW1lKTtcblx0fVxuXG5cdHByaXZhdGUgY3JlYXRlQ29uc29sZUxvZ2dlcjxcblx0XHRUIGV4dGVuZHMgc3RyaW5nID0gbmV2ZXIsXG5cdFx0Q3VzdG9tT25seSBleHRlbmRzIHRydWUgfCBmYWxzZSA9IGZhbHNlLFxuXHQ+KG5hbWU6IHN0cmluZyk6IExvZ2dlcjxULCBDdXN0b21Pbmx5PiB7XG5cdFx0Ly8gVXNlIHRoZSBsZXZlbHMgY29uZmlndXJlZCBkdXJpbmcgdGhlIGNvbmZpZ3VyZSgpIGNhbGxcblx0XHRjb25zdCBhbGxMZXZlbHMgPSB0aGlzLmNvbmZpZ3VyZWRMZXZlbHM7XG5cdFx0Y29uc3QgY3VycmVudExldmVsID0gdGhpcy5jb25maWd1cmVkTG9nTGV2ZWw7XG5cdFx0Y29uc3QgdGhyZXNob2xkID0gdGhpcy5jb25maWd1cmVkTG9nTGV2ZWxWYWx1ZTtcblxuXHRcdGNvbnN0IGJhc2VMb2dnZXI6IEJhc2VMb2dnZXIgPSB7XG5cdFx0XHRnZXQgY3VycmVudExldmVsKCkge1xuXHRcdFx0XHRyZXR1cm4gY3VycmVudExldmVsO1xuXHRcdFx0fSxcblx0XHRcdGdldCBsb2dMZXZlbHMoKSB7XG5cdFx0XHRcdHJldHVybiBhbGxMZXZlbHM7XG5cdFx0XHR9LFxuXHRcdH07XG5cblx0XHRjb25zdCBsb2dGdW5jdGlvbiA9XG5cdFx0XHQobGV2ZWw6IHN0cmluZykgPT5cblx0XHRcdChtc2c6IHN0cmluZyB8IG51bWJlciB8IG9iamVjdCwgLi4uYXJnczogdW5rbm93bltdKSA9PiB7XG5cdFx0XHRcdGNvbnN0IHRpbWVzdGFtcCA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcblx0XHRcdFx0bGV0IG1lc3NhZ2U6IHN0cmluZztcblxuXHRcdFx0XHRpZiAodHlwZW9mIG1zZyA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0XHRcdG1lc3NhZ2UgPSBtc2cgaW5zdGFuY2VvZiBFcnJvciA/IGZvcm1hdEVycm9yKG1zZykgOiBKU09OLnN0cmluZ2lmeShtc2cpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG1lc3NhZ2UgPSBTdHJpbmcobXNnKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IGxvZ0xpbmUgPSBgWyR7dGltZXN0YW1wfV0gJHtsZXZlbC50b1VwcGVyQ2FzZSgpfSBbJHtuYW1lfV06ICR7bWVzc2FnZX1gO1xuXG5cdFx0XHRcdGlmIChhcmdzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRjb25zb2xlLmxvZyhsb2dMaW5lLCAuLi5hcmdzKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjb25zb2xlLmxvZyhsb2dMaW5lKTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblxuXHRcdGNvbnN0IG5vb3AgPSAoKSA9PiB7fTtcblxuXHRcdC8vIFN0YXJ0IHdpdGggYmFzZSBsb2dnZXIgYW5kIGlzTGV2ZWxFbmFibGVkIG1ldGhvZFxuXHRcdGNvbnN0IGxvZ2dlciA9IE9iamVjdC5hc3NpZ24oYmFzZUxvZ2dlciwge1xuXHRcdFx0aXNMZXZlbEVuYWJsZWQ6IChsZXZlbDogc3RyaW5nKSA9PiAoYWxsTGV2ZWxzW2xldmVsXSA/PyAwKSA+PSB0aHJlc2hvbGQsXG5cdFx0fSk7XG5cblx0XHQvLyBEeW5hbWljYWxseSBhZGQgYWxsIGxvZyBsZXZlbCBtZXRob2RzIChkZWZhdWx0ICsgY3VzdG9tKVxuXHRcdC8vIExldmVscyBiZWxvdyB0aGUgY29uZmlndXJlZCB0aHJlc2hvbGQgYXJlIHBhdGNoZWQgdG8gbm9vcFxuXHRcdGZvciAoY29uc3QgW2xldmVsTmFtZSwgbGV2ZWxWYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoYWxsTGV2ZWxzKSkge1xuXHRcdFx0Ly8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBEeW5hbWljIGxvZ2dlciBsZXZlbCBjcmVhdGlvbiByZXF1aXJlcyBhbnlcblx0XHRcdChsb2dnZXIgYXMgYW55KVtsZXZlbE5hbWVdID0gbGV2ZWxWYWx1ZSA+PSB0aHJlc2hvbGQgPyBsb2dGdW5jdGlvbihsZXZlbE5hbWUpIDogbm9vcDtcblx0XHR9XG5cblx0XHRyZXR1cm4gbG9nZ2VyIGFzIExvZ2dlcjxULCBDdXN0b21Pbmx5Pjtcblx0fVxufVxuIl0sIm5hbWVzIjpbIkNvbnNvbGVBZGFwdGVyIiwiTG9nQWRhcHRlciIsImNvbmZpZ3VyZWRMZXZlbHMiLCJjb25maWd1cmVkTG9nTGV2ZWwiLCJEZWZhdWx0TG9nTGV2ZWwiLCJjb25maWd1cmVkTG9nTGV2ZWxWYWx1ZSIsIkxvZ0xldmVscyIsImluZm8iLCJfb3B0aW9ucyIsImNvbmZpZ3VyZSIsInNjcmliZU9wdGlvbnMiLCJnZXRMb2dMZXZlbHMiLCJsb2dMZXZlbFN0ciIsImxvZ0xldmVsIiwiZ2V0TG9nZ2VyIiwibmFtZSIsImxvZ2dlck5hbWUiLCJjcmVhdGVDb25zb2xlTG9nZ2VyIiwiYWxsTGV2ZWxzIiwiY3VycmVudExldmVsIiwidGhyZXNob2xkIiwiYmFzZUxvZ2dlciIsImxvZ0xldmVscyIsImxvZ0Z1bmN0aW9uIiwibGV2ZWwiLCJtc2ciLCJhcmdzIiwidGltZXN0YW1wIiwiRGF0ZSIsInRvSVNPU3RyaW5nIiwibWVzc2FnZSIsIkVycm9yIiwiZm9ybWF0RXJyb3IiLCJKU09OIiwic3RyaW5naWZ5IiwiU3RyaW5nIiwibG9nTGluZSIsInRvVXBwZXJDYXNlIiwibGVuZ3RoIiwiY29uc29sZSIsImxvZyIsIm5vb3AiLCJsb2dnZXIiLCJPYmplY3QiLCJhc3NpZ24iLCJpc0xldmVsRW5hYmxlZCIsImxldmVsTmFtZSIsImxldmVsVmFsdWUiLCJlbnRyaWVzIl0sIm1hcHBpbmdzIjoiOzs7OytCQVdhQTs7O2VBQUFBOzs7K0JBWDJCO3VCQU9qQztBQUlBLE1BQU1BLHVCQUF1QkMseUJBQVU7SUFDckNDLGlCQUF5QztJQUN6Q0MscUJBQTZCQyxzQkFBZSxDQUFDO0lBQzdDQywwQkFBa0NDLGdCQUFTLENBQUNDLElBQUksQ0FBQztJQUV6RCxZQUFtQkMsV0FBa0MsQ0FBQyxDQUFDLENBQUU7UUFDeEQsS0FBSztJQUNOO0lBRU9DLFVBQ05DLGFBQTJDLEVBQzFDO1FBQ0QscUVBQXFFO1FBQ3JFLElBQUksQ0FBQ1IsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDUyxZQUFZLENBQUNEO1FBQzFDLE1BQU1FLGNBQWNGLGNBQWNHLFFBQVEsSUFBSVQsc0JBQWU7UUFDN0QsSUFBSSxDQUFDRCxrQkFBa0IsR0FBR1M7UUFDMUIsSUFBSSxDQUFDUCx1QkFBdUIsR0FBRyxJQUFJLENBQUNILGdCQUFnQixDQUFDVSxZQUFZLElBQUlOLGdCQUFTLENBQUNDLElBQUk7SUFDcEY7SUFFT08sVUFDTkMsSUFBYSxFQUNXO1FBQ3hCLE1BQU1DLGFBQWFELFFBQVE7UUFDM0IsT0FBTyxJQUFJLENBQUNFLG1CQUFtQixDQUFnQkQ7SUFDaEQ7SUFFUUMsb0JBR05GLElBQVksRUFBeUI7UUFDdEMsd0RBQXdEO1FBQ3hELE1BQU1HLFlBQVksSUFBSSxDQUFDaEIsZ0JBQWdCO1FBQ3ZDLE1BQU1pQixlQUFlLElBQUksQ0FBQ2hCLGtCQUFrQjtRQUM1QyxNQUFNaUIsWUFBWSxJQUFJLENBQUNmLHVCQUF1QjtRQUU5QyxNQUFNZ0IsYUFBeUI7WUFDOUIsSUFBSUYsZ0JBQWU7Z0JBQ2xCLE9BQU9BO1lBQ1I7WUFDQSxJQUFJRyxhQUFZO2dCQUNmLE9BQU9KO1lBQ1I7UUFDRDtRQUVBLE1BQU1LLGNBQ0wsQ0FBQ0MsUUFDRCxDQUFDQyxLQUErQixHQUFHQztnQkFDbEMsTUFBTUMsWUFBWSxJQUFJQyxPQUFPQyxXQUFXO2dCQUN4QyxJQUFJQztnQkFFSixJQUFJLE9BQU9MLFFBQVEsVUFBVTtvQkFDNUJLLFVBQVVMLGVBQWVNLFFBQVFDLElBQUFBLDBCQUFXLEVBQUNQLE9BQU9RLEtBQUtDLFNBQVMsQ0FBQ1Q7Z0JBQ3BFLE9BQU87b0JBQ05LLFVBQVVLLE9BQU9WO2dCQUNsQjtnQkFFQSxNQUFNVyxVQUFVLENBQUMsQ0FBQyxFQUFFVCxVQUFVLEVBQUUsRUFBRUgsTUFBTWEsV0FBVyxHQUFHLEVBQUUsRUFBRXRCLEtBQUssR0FBRyxFQUFFZSxTQUFTO2dCQUU3RSxJQUFJSixLQUFLWSxNQUFNLEdBQUcsR0FBRztvQkFDcEJDLFFBQVFDLEdBQUcsQ0FBQ0osWUFBWVY7Z0JBQ3pCLE9BQU87b0JBQ05hLFFBQVFDLEdBQUcsQ0FBQ0o7Z0JBQ2I7WUFDRDtRQUVELE1BQU1LLE9BQU8sS0FBTztRQUVwQixtREFBbUQ7UUFDbkQsTUFBTUMsU0FBU0MsT0FBT0MsTUFBTSxDQUFDdkIsWUFBWTtZQUN4Q3dCLGdCQUFnQixDQUFDckIsUUFBa0IsQUFBQ04sQ0FBQUEsU0FBUyxDQUFDTSxNQUFNLElBQUksQ0FBQSxLQUFNSjtRQUMvRDtRQUVBLDJEQUEyRDtRQUMzRCw0REFBNEQ7UUFDNUQsS0FBSyxNQUFNLENBQUMwQixXQUFXQyxXQUFXLElBQUlKLE9BQU9LLE9BQU8sQ0FBQzlCLFdBQVk7WUFDaEUseUZBQXlGO1lBQ3hGd0IsTUFBYyxDQUFDSSxVQUFVLEdBQUdDLGNBQWMzQixZQUFZRyxZQUFZdUIsYUFBYUw7UUFDakY7UUFFQSxPQUFPQztJQUNSO0FBQ0QifQ==
|