@decohere/scribe 0.0.1-dev.39 → 0.0.1-dev.4

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@decohere/scribe",
3
- "version": "0.0.1-dev.39",
3
+ "version": "0.0.1-dev.4",
4
4
  "description": "Structured logging interface with pluggable adapters",
5
5
  "keywords": [
6
6
  "typescript",
@@ -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==