@decohere/scribe 0.0.1-dev.13 → 0.0.1-dev.130
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/LICENSE +15 -0
- package/commonjs/src/console.adapter.js +21 -14
- package/commonjs/src/env.js +2 -3
- package/commonjs/src/errors.js +0 -2
- package/commonjs/src/index.js +3 -2
- package/commonjs/src/log-entry.adapter.js +55 -0
- package/commonjs/src/log-entry.js +89 -0
- package/commonjs/src/logger.adapter.js +58 -6
- package/commonjs/src/logger.factory.js +112 -11
- package/commonjs/src/logger.type.js +0 -2
- package/commonjs/src/redact.js +67 -0
- package/commonjs/src/testing/capture.adapter.js +23 -0
- package/commonjs/src/testing/index.js +14 -2
- package/commonjs/src/types.js +19 -6
- package/es6/src/console.adapter.js +22 -15
- package/es6/src/env.js +3 -4
- package/es6/src/errors.js +0 -2
- package/es6/src/index.js +3 -2
- package/es6/src/log-entry.adapter.js +49 -0
- package/es6/src/log-entry.js +79 -0
- package/es6/src/logger.adapter.js +45 -3
- package/es6/src/logger.factory.js +112 -11
- package/es6/src/logger.type.js +0 -2
- package/es6/src/redact.js +57 -0
- package/es6/src/testing/capture.adapter.js +17 -0
- package/es6/src/testing/index.js +1 -3
- package/es6/src/types.js +16 -6
- package/package.json +15 -1
- package/types/src/console.adapter.d.ts +1 -0
- package/types/src/env.d.ts +1 -1
- package/types/src/index.d.ts +3 -0
- package/types/src/log-entry.adapter.d.ts +20 -0
- package/types/src/log-entry.d.ts +38 -0
- package/types/src/logger.adapter.d.ts +32 -1
- package/types/src/logger.factory.d.ts +31 -2
- package/types/src/logger.type.d.ts +5 -0
- package/types/src/redact.d.ts +10 -0
- package/types/src/testing/capture.adapter.d.ts +14 -0
- package/types/src/testing/index.d.ts +1 -1
- package/types/src/types.d.ts +7 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
ISC License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025-2026 Typesmiths
|
|
4
|
+
|
|
5
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
|
6
|
+
purpose with or without fee is hereby granted, provided that the above
|
|
7
|
+
copyright notice and this permission notice appear in all copies.
|
|
8
|
+
|
|
9
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
10
|
+
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
11
|
+
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
12
|
+
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
13
|
+
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
14
|
+
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
15
|
+
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
@@ -9,30 +9,35 @@ Object.defineProperty(exports, "ConsoleAdapter", {
|
|
|
9
9
|
}
|
|
10
10
|
});
|
|
11
11
|
const _loggeradapter = require("./logger.adapter.js");
|
|
12
|
+
const _redact = require("./redact.js");
|
|
12
13
|
const _types = require("./types.js");
|
|
13
14
|
class ConsoleAdapter extends _loggeradapter.LogAdapter {
|
|
14
15
|
configuredLevels;
|
|
15
16
|
configuredLogLevel = _types.DefaultLogLevel;
|
|
16
17
|
configuredLogLevelValue = _types.LogLevels.info;
|
|
18
|
+
redactionKeys = _redact.redact.fromOptions();
|
|
17
19
|
constructor(_options = {}){
|
|
18
20
|
super();
|
|
19
21
|
}
|
|
20
22
|
configure(scribeOptions) {
|
|
21
|
-
// Get merged log levels (default + custom) using parent class method
|
|
22
23
|
this.configuredLevels = this.getLogLevels(scribeOptions);
|
|
23
24
|
const logLevelStr = scribeOptions.logLevel ?? _types.DefaultLogLevel;
|
|
24
25
|
this.configuredLogLevel = logLevelStr;
|
|
25
26
|
this.configuredLogLevelValue = this.configuredLevels[logLevelStr] ?? _types.LogLevels.info;
|
|
27
|
+
this.redactionKeys = _redact.redact.fromOptions(scribeOptions.redactions);
|
|
26
28
|
}
|
|
27
29
|
getLogger(name) {
|
|
28
30
|
const loggerName = name || "default";
|
|
29
|
-
return this.createConsoleLogger(loggerName);
|
|
31
|
+
return this.createConsoleLogger(loggerName, {});
|
|
30
32
|
}
|
|
31
|
-
createConsoleLogger(name) {
|
|
32
|
-
// Use the levels configured during the configure() call
|
|
33
|
+
createConsoleLogger(name, bindings) {
|
|
33
34
|
const allLevels = this.configuredLevels;
|
|
34
35
|
const currentLevel = this.configuredLogLevel;
|
|
35
36
|
const threshold = this.configuredLogLevelValue;
|
|
37
|
+
const redactionKeys = this.redactionKeys;
|
|
38
|
+
const bound = Object.keys(bindings).length > 0 ? [
|
|
39
|
+
_redact.redact.object(bindings, redactionKeys)
|
|
40
|
+
] : [];
|
|
36
41
|
const baseLogger = {
|
|
37
42
|
get currentLevel () {
|
|
38
43
|
return currentLevel;
|
|
@@ -45,30 +50,32 @@ class ConsoleAdapter extends _loggeradapter.LogAdapter {
|
|
|
45
50
|
const timestamp = new Date().toISOString();
|
|
46
51
|
let message;
|
|
47
52
|
if (typeof msg === "object") {
|
|
48
|
-
message = JSON.stringify(msg);
|
|
53
|
+
message = msg instanceof Error ? (0, _loggeradapter.formatError)(msg) : JSON.stringify(_redact.redact.object(msg, redactionKeys));
|
|
49
54
|
} else {
|
|
50
55
|
message = String(msg);
|
|
51
56
|
}
|
|
52
57
|
const logLine = `[${timestamp}] ${level.toUpperCase()} [${name}]: ${message}`;
|
|
53
|
-
|
|
54
|
-
|
|
58
|
+
const payload = [
|
|
59
|
+
...args.map((arg)=>_redact.redact.object(arg, redactionKeys)),
|
|
60
|
+
...bound
|
|
61
|
+
];
|
|
62
|
+
if (payload.length > 0) {
|
|
63
|
+
console.log(logLine, ...payload);
|
|
55
64
|
} else {
|
|
56
65
|
console.log(logLine);
|
|
57
66
|
}
|
|
58
67
|
};
|
|
59
68
|
const noop = ()=>{};
|
|
60
|
-
// Start with base logger and isLevelEnabled method
|
|
61
69
|
const logger = Object.assign(baseLogger, {
|
|
62
|
-
isLevelEnabled: (level)=>(allLevels[level] ?? 0) >= threshold
|
|
70
|
+
isLevelEnabled: (level)=>(allLevels[level] ?? 0) >= threshold,
|
|
71
|
+
child: (fields)=>this.createConsoleLogger(name, {
|
|
72
|
+
...bindings,
|
|
73
|
+
...fields
|
|
74
|
+
})
|
|
63
75
|
});
|
|
64
|
-
// Dynamically add all log level methods (default + custom)
|
|
65
|
-
// Levels below the configured threshold are patched to noop
|
|
66
76
|
for (const [levelName, levelValue] of Object.entries(allLevels)){
|
|
67
|
-
// biome-ignore lint/suspicious/noExplicitAny: Dynamic logger level creation requires any
|
|
68
77
|
logger[levelName] = levelValue >= threshold ? logFunction(levelName) : noop;
|
|
69
78
|
}
|
|
70
79
|
return logger;
|
|
71
80
|
}
|
|
72
81
|
}
|
|
73
|
-
|
|
74
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL3NjcmliZS9zY3JpYmUvc3JjL2NvbnNvbGUuYWRhcHRlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBMb2dBZGFwdGVyIH0gZnJvbSBcIi4vbG9nZ2VyLmFkYXB0ZXIuanNcIjtcbmltcG9ydCB0eXBlIHsgQmFzZUxvZ2dlciwgTG9nZ2VyIH0gZnJvbSBcIi4vbG9nZ2VyLnR5cGUuanNcIjtcbmltcG9ydCB7XG5cdERlZmF1bHRMb2dMZXZlbCxcblx0dHlwZSBMb2dBZGFwdGVyT3B0aW9ucyxcblx0TG9nTGV2ZWxzLFxuXHR0eXBlIFNjcmliZU9wdGlvbnMsXG59IGZyb20gXCIuL3R5cGVzLmpzXCI7XG5cbmV4cG9ydCB0eXBlIENvbnNvbGVBZGFwdGVyT3B0aW9ucyA9IHt9ICYgTG9nQWRhcHRlck9wdGlvbnM7XG5cbmV4cG9ydCBjbGFzcyBDb25zb2xlQWRhcHRlciBleHRlbmRzIExvZ0FkYXB0ZXIge1xuXHRwcml2YXRlIGNvbmZpZ3VyZWRMZXZlbHM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj47XG5cdHByaXZhdGUgY29uZmlndXJlZExvZ0xldmVsOiBzdHJpbmcgPSBEZWZhdWx0TG9nTGV2ZWw7XG5cdHByaXZhdGUgY29uZmlndXJlZExvZ0xldmVsVmFsdWU6IG51bWJlciA9IExvZ0xldmVscy5pbmZvO1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3Rvcihfb3B0aW9uczogQ29uc29sZUFkYXB0ZXJPcHRpb25zID0ge30pIHtcblx0XHRzdXBlcigpO1xuXHR9XG5cblx0cHVibGljIGNvbmZpZ3VyZTxUIGV4dGVuZHMgc3RyaW5nID0gbmV2ZXIsIEN1c3RvbU9ubHkgZXh0ZW5kcyB0cnVlIHwgZmFsc2UgPSBmYWxzZT4oXG5cdFx0c2NyaWJlT3B0aW9uczogU2NyaWJlT3B0aW9uczxULCBDdXN0b21Pbmx5Pixcblx0KSB7XG5cdFx0Ly8gR2V0IG1lcmdlZCBsb2cgbGV2ZWxzIChkZWZhdWx0ICsgY3VzdG9tKSB1c2luZyBwYXJlbnQgY2xhc3MgbWV0aG9kXG5cdFx0dGhpcy5jb25maWd1cmVkTGV2ZWxzID0gdGhpcy5nZXRMb2dMZXZlbHMoc2NyaWJlT3B0aW9ucyk7XG5cdFx0Y29uc3QgbG9nTGV2ZWxTdHIgPSBzY3JpYmVPcHRpb25zLmxvZ0xldmVsID8/IERlZmF1bHRMb2dMZXZlbDtcblx0XHR0aGlzLmNvbmZpZ3VyZWRMb2dMZXZlbCA9IGxvZ0xldmVsU3RyO1xuXHRcdHRoaXMuY29uZmlndXJlZExvZ0xldmVsVmFsdWUgPSB0aGlzLmNvbmZpZ3VyZWRMZXZlbHNbbG9nTGV2ZWxTdHJdID8/IExvZ0xldmVscy5pbmZvO1xuXHR9XG5cblx0cHVibGljIGdldExvZ2dlcjxUIGV4dGVuZHMgc3RyaW5nID0gbmV2ZXIsIEN1c3RvbU9ubHkgZXh0ZW5kcyB0cnVlIHwgZmFsc2UgPSBmYWxzZT4oXG5cdFx0bmFtZT86IHN0cmluZyxcblx0KTogTG9nZ2VyPFQsIEN1c3RvbU9ubHk+IHtcblx0XHRjb25zdCBsb2dnZXJOYW1lID0gbmFtZSB8fCBcImRlZmF1bHRcIjtcblx0XHRyZXR1cm4gdGhpcy5jcmVhdGVDb25zb2xlTG9nZ2VyPFQsIEN1c3RvbU9ubHk+KGxvZ2dlck5hbWUpO1xuXHR9XG5cblx0cHJpdmF0ZSBjcmVhdGVDb25zb2xlTG9nZ2VyPFxuXHRcdFQgZXh0ZW5kcyBzdHJpbmcgPSBuZXZlcixcblx0XHRDdXN0b21Pbmx5IGV4dGVuZHMgdHJ1ZSB8IGZhbHNlID0gZmFsc2UsXG5cdD4obmFtZTogc3RyaW5nKTogTG9nZ2VyPFQsIEN1c3RvbU9ubHk+IHtcblx0XHQvLyBVc2UgdGhlIGxldmVscyBjb25maWd1cmVkIGR1cmluZyB0aGUgY29uZmlndXJlKCkgY2FsbFxuXHRcdGNvbnN0IGFsbExldmVscyA9IHRoaXMuY29uZmlndXJlZExldmVscztcblx0XHRjb25zdCBjdXJyZW50TGV2ZWwgPSB0aGlzLmNvbmZpZ3VyZWRMb2dMZXZlbDtcblx0XHRjb25zdCB0aHJlc2hvbGQgPSB0aGlzLmNvbmZpZ3VyZWRMb2dMZXZlbFZhbHVlO1xuXG5cdFx0Y29uc3QgYmFzZUxvZ2dlcjogQmFzZUxvZ2dlciA9IHtcblx0XHRcdGdldCBjdXJyZW50TGV2ZWwoKSB7XG5cdFx0XHRcdHJldHVybiBjdXJyZW50TGV2ZWw7XG5cdFx0XHR9LFxuXHRcdFx0Z2V0IGxvZ0xldmVscygpIHtcblx0XHRcdFx0cmV0dXJuIGFsbExldmVscztcblx0XHRcdH0sXG5cdFx0fTtcblxuXHRcdGNvbnN0IGxvZ0Z1bmN0aW9uID1cblx0XHRcdChsZXZlbDogc3RyaW5nKSA9PlxuXHRcdFx0KG1zZzogc3RyaW5nIHwgbnVtYmVyIHwgb2JqZWN0LCAuLi5hcmdzOiB1bmtub3duW10pID0+IHtcblx0XHRcdFx0Y29uc3QgdGltZXN0YW1wID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuXHRcdFx0XHRsZXQgbWVzc2FnZTogc3RyaW5nO1xuXG5cdFx0XHRcdGlmICh0eXBlb2YgbXNnID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRcdFx0bWVzc2FnZSA9IEpTT04uc3RyaW5naWZ5KG1zZyk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bWVzc2FnZSA9IFN0cmluZyhtc2cpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29uc3QgbG9nTGluZSA9IGBbJHt0aW1lc3RhbXB9XSAke2xldmVsLnRvVXBwZXJDYXNlKCl9IFske25hbWV9XTogJHttZXNzYWdlfWA7XG5cblx0XHRcdFx0aWYgKGFyZ3MubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdGNvbnNvbGUubG9nKGxvZ0xpbmUsIC4uLmFyZ3MpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNvbnNvbGUubG9nKGxvZ0xpbmUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXG5cdFx0Y29uc3Qgbm9vcCA9ICgpID0+IHt9O1xuXG5cdFx0Ly8gU3RhcnQgd2l0aCBiYXNlIGxvZ2dlciBhbmQgaXNMZXZlbEVuYWJsZWQgbWV0aG9kXG5cdFx0Y29uc3QgbG9nZ2VyID0gT2JqZWN0LmFzc2lnbihiYXNlTG9nZ2VyLCB7XG5cdFx0XHRpc0xldmVsRW5hYmxlZDogKGxldmVsOiBzdHJpbmcpID0+IChhbGxMZXZlbHNbbGV2ZWxdID8/IDApID49IHRocmVzaG9sZCxcblx0XHR9KTtcblxuXHRcdC8vIER5bmFtaWNhbGx5IGFkZCBhbGwgbG9nIGxldmVsIG1ldGhvZHMgKGRlZmF1bHQgKyBjdXN0b20pXG5cdFx0Ly8gTGV2ZWxzIGJlbG93IHRoZSBjb25maWd1cmVkIHRocmVzaG9sZCBhcmUgcGF0Y2hlZCB0byBub29wXG5cdFx0Zm9yIChjb25zdCBbbGV2ZWxOYW1lLCBsZXZlbFZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhhbGxMZXZlbHMpKSB7XG5cdFx0XHQvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IER5bmFtaWMgbG9nZ2VyIGxldmVsIGNyZWF0aW9uIHJlcXVpcmVzIGFueVxuXHRcdFx0KGxvZ2dlciBhcyBhbnkpW2xldmVsTmFtZV0gPSBsZXZlbFZhbHVlID49IHRocmVzaG9sZCA/IGxvZ0Z1bmN0aW9uKGxldmVsTmFtZSkgOiBub29wO1xuXHRcdH1cblxuXHRcdHJldHVybiBsb2dnZXIgYXMgTG9nZ2VyPFQsIEN1c3RvbU9ubHk+O1xuXHR9XG59XG4iXSwibmFtZXMiOlsiQ29uc29sZUFkYXB0ZXIiLCJMb2dBZGFwdGVyIiwiY29uZmlndXJlZExldmVscyIsImNvbmZpZ3VyZWRMb2dMZXZlbCIsIkRlZmF1bHRMb2dMZXZlbCIsImNvbmZpZ3VyZWRMb2dMZXZlbFZhbHVlIiwiTG9nTGV2ZWxzIiwiaW5mbyIsIl9vcHRpb25zIiwiY29uZmlndXJlIiwic2NyaWJlT3B0aW9ucyIsImdldExvZ0xldmVscyIsImxvZ0xldmVsU3RyIiwibG9nTGV2ZWwiLCJnZXRMb2dnZXIiLCJuYW1lIiwibG9nZ2VyTmFtZSIsImNyZWF0ZUNvbnNvbGVMb2dnZXIiLCJhbGxMZXZlbHMiLCJjdXJyZW50TGV2ZWwiLCJ0aHJlc2hvbGQiLCJiYXNlTG9nZ2VyIiwibG9nTGV2ZWxzIiwibG9nRnVuY3Rpb24iLCJsZXZlbCIsIm1zZyIsImFyZ3MiLCJ0aW1lc3RhbXAiLCJEYXRlIiwidG9JU09TdHJpbmciLCJtZXNzYWdlIiwiSlNPTiIsInN0cmluZ2lmeSIsIlN0cmluZyIsImxvZ0xpbmUiLCJ0b1VwcGVyQ2FzZSIsImxlbmd0aCIsImNvbnNvbGUiLCJsb2ciLCJub29wIiwibG9nZ2VyIiwiT2JqZWN0IiwiYXNzaWduIiwiaXNMZXZlbEVuYWJsZWQiLCJsZXZlbE5hbWUiLCJsZXZlbFZhbHVlIiwiZW50cmllcyJdLCJtYXBwaW5ncyI6Ijs7OzsrQkFXYUE7OztlQUFBQTs7OytCQVhjO3VCQU9wQjtBQUlBLE1BQU1BLHVCQUF1QkMseUJBQVU7SUFDckNDLGlCQUF5QztJQUN6Q0MscUJBQTZCQyxzQkFBZSxDQUFDO0lBQzdDQywwQkFBa0NDLGdCQUFTLENBQUNDLElBQUksQ0FBQztJQUV6RCxZQUFtQkMsV0FBa0MsQ0FBQyxDQUFDLENBQUU7UUFDeEQsS0FBSztJQUNOO0lBRU9DLFVBQ05DLGFBQTJDLEVBQzFDO1FBQ0QscUVBQXFFO1FBQ3JFLElBQUksQ0FBQ1IsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDUyxZQUFZLENBQUNEO1FBQzFDLE1BQU1FLGNBQWNGLGNBQWNHLFFBQVEsSUFBSVQsc0JBQWU7UUFDN0QsSUFBSSxDQUFDRCxrQkFBa0IsR0FBR1M7UUFDMUIsSUFBSSxDQUFDUCx1QkFBdUIsR0FBRyxJQUFJLENBQUNILGdCQUFnQixDQUFDVSxZQUFZLElBQUlOLGdCQUFTLENBQUNDLElBQUk7SUFDcEY7SUFFT08sVUFDTkMsSUFBYSxFQUNXO1FBQ3hCLE1BQU1DLGFBQWFELFFBQVE7UUFDM0IsT0FBTyxJQUFJLENBQUNFLG1CQUFtQixDQUFnQkQ7SUFDaEQ7SUFFUUMsb0JBR05GLElBQVksRUFBeUI7UUFDdEMsd0RBQXdEO1FBQ3hELE1BQU1HLFlBQVksSUFBSSxDQUFDaEIsZ0JBQWdCO1FBQ3ZDLE1BQU1pQixlQUFlLElBQUksQ0FBQ2hCLGtCQUFrQjtRQUM1QyxNQUFNaUIsWUFBWSxJQUFJLENBQUNmLHVCQUF1QjtRQUU5QyxNQUFNZ0IsYUFBeUI7WUFDOUIsSUFBSUYsZ0JBQWU7Z0JBQ2xCLE9BQU9BO1lBQ1I7WUFDQSxJQUFJRyxhQUFZO2dCQUNmLE9BQU9KO1lBQ1I7UUFDRDtRQUVBLE1BQU1LLGNBQ0wsQ0FBQ0MsUUFDRCxDQUFDQyxLQUErQixHQUFHQztnQkFDbEMsTUFBTUMsWUFBWSxJQUFJQyxPQUFPQyxXQUFXO2dCQUN4QyxJQUFJQztnQkFFSixJQUFJLE9BQU9MLFFBQVEsVUFBVTtvQkFDNUJLLFVBQVVDLEtBQUtDLFNBQVMsQ0FBQ1A7Z0JBQzFCLE9BQU87b0JBQ05LLFVBQVVHLE9BQU9SO2dCQUNsQjtnQkFFQSxNQUFNUyxVQUFVLENBQUMsQ0FBQyxFQUFFUCxVQUFVLEVBQUUsRUFBRUgsTUFBTVcsV0FBVyxHQUFHLEVBQUUsRUFBRXBCLEtBQUssR0FBRyxFQUFFZSxTQUFTO2dCQUU3RSxJQUFJSixLQUFLVSxNQUFNLEdBQUcsR0FBRztvQkFDcEJDLFFBQVFDLEdBQUcsQ0FBQ0osWUFBWVI7Z0JBQ3pCLE9BQU87b0JBQ05XLFFBQVFDLEdBQUcsQ0FBQ0o7Z0JBQ2I7WUFDRDtRQUVELE1BQU1LLE9BQU8sS0FBTztRQUVwQixtREFBbUQ7UUFDbkQsTUFBTUMsU0FBU0MsT0FBT0MsTUFBTSxDQUFDckIsWUFBWTtZQUN4Q3NCLGdCQUFnQixDQUFDbkIsUUFBa0IsQUFBQ04sQ0FBQUEsU0FBUyxDQUFDTSxNQUFNLElBQUksQ0FBQSxLQUFNSjtRQUMvRDtRQUVBLDJEQUEyRDtRQUMzRCw0REFBNEQ7UUFDNUQsS0FBSyxNQUFNLENBQUN3QixXQUFXQyxXQUFXLElBQUlKLE9BQU9LLE9BQU8sQ0FBQzVCLFdBQVk7WUFDaEUseUZBQXlGO1lBQ3hGc0IsTUFBYyxDQUFDSSxVQUFVLEdBQUdDLGNBQWN6QixZQUFZRyxZQUFZcUIsYUFBYUw7UUFDakY7UUFFQSxPQUFPQztJQUNSO0FBQ0QifQ==
|
package/commonjs/src/env.js
CHANGED
|
@@ -39,8 +39,9 @@ const VALID_LEVELS = [
|
|
|
39
39
|
"trace"
|
|
40
40
|
];
|
|
41
41
|
function getLogLevelFromEnv() {
|
|
42
|
+
const env = globalThis.process?.env;
|
|
42
43
|
for (const name of ENV_VAR_NAMES){
|
|
43
|
-
const value =
|
|
44
|
+
const value = env?.[name]?.trim().toLowerCase();
|
|
44
45
|
if (value) {
|
|
45
46
|
return value;
|
|
46
47
|
}
|
|
@@ -90,5 +91,3 @@ function resolveLogLevel(arg) {
|
|
|
90
91
|
}
|
|
91
92
|
return defaultLogLevel;
|
|
92
93
|
}
|
|
93
|
-
|
|
94
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL3NjcmliZS9zY3JpYmUvc3JjL2Vudi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IERlZmF1bHRMZXZlbHMgfSBmcm9tIFwiLi90eXBlcy5qc1wiO1xuXG4vKipcbiAqIEVudmlyb25tZW50IHZhcmlhYmxlIG5hbWVzIGNoZWNrZWQgaW4gb3JkZXIgb2YgcHJlY2VkZW5jZS5cbiAqIFRoZSBmaXJzdCBub24tZW1wdHkgdmFsdWUgZm91bmQgaXMgdXNlZC5cbiAqL1xuY29uc3QgRU5WX1ZBUl9OQU1FUyA9IFtcIkxPR19MRVZFTFwiLCBcIlNDUklCRV9MT0dfTEVWRUxcIiwgXCJMT0dHSU5HX0xFVkVMXCJdIGFzIGNvbnN0O1xuXG5jb25zdCBWQUxJRF9MRVZFTFM6IERlZmF1bHRMZXZlbHNbXSA9IFtcImZhdGFsXCIsIFwiZXJyb3JcIiwgXCJ3YXJuXCIsIFwiaW5mb1wiLCBcImRlYnVnXCIsIFwidHJhY2VcIl07XG5cbi8qKlxuICogUmVhZHMgdGhlIGxvZyBsZXZlbCBmcm9tIGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAqIENoZWNrcyBMT0dfTEVWRUwsIFNDUklCRV9MT0dfTEVWRUwsIGFuZCBMT0dHSU5HX0xFVkVMIGluIG9yZGVyLlxuICogUmV0dXJucyBudWxsIGlmIG5vbmUgYXJlIHNldC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExvZ0xldmVsRnJvbUVudigpOiBzdHJpbmcgfCBudWxsIHtcblx0Zm9yIChjb25zdCBuYW1lIG9mIEVOVl9WQVJfTkFNRVMpIHtcblx0XHRjb25zdCB2YWx1ZSA9IHByb2Nlc3MuZW52W25hbWVdPy50cmltKCkudG9Mb3dlckNhc2UoKTtcblx0XHRpZiAodmFsdWUpIHtcblx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogUmVhZHMgYSBsb2ctbGV2ZWwgZmxhZyBmcm9tIGFyZ3YuXG4gKiBTdXBwb3J0czogLS1sb2ctbGV2ZWwgPHZhbHVlPiwgLWwgPHZhbHVlPiwgYW5kIC0tbG9nLWxldmVsPTx2YWx1ZT5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExvZ0xldmVsRnJvbUFyZ3YoYXJndjogcmVhZG9ubHkgc3RyaW5nW10pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgYXJndi5sZW5ndGg7IGluZGV4ICs9IDEpIHtcblx0XHRjb25zdCBhcmcgPSBhcmd2W2luZGV4XTtcblx0XHRpZiAoYXJnID09PSBcIi0tbG9nLWxldmVsXCIgfHwgYXJnID09PSBcIi1sXCIpIHtcblx0XHRcdHJldHVybiBhcmd2W2luZGV4ICsgMV07XG5cdFx0fVxuXHRcdGlmIChhcmcuc3RhcnRzV2l0aChcIi0tbG9nLWxldmVsPVwiKSkge1xuXHRcdFx0cmV0dXJuIGFyZy5zbGljZShcIi0tbG9nLWxldmVsPVwiLmxlbmd0aCk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHN0cmluZyBpcyBhIHJlY29nbmlzZWQgZGVmYXVsdCBsb2cgbGV2ZWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkTG9nTGV2ZWwobGV2ZWw6IHN0cmluZyk6IGxldmVsIGlzIERlZmF1bHRMZXZlbHMge1xuXHRyZXR1cm4gKFZBTElEX0xFVkVMUyBhcyBzdHJpbmdbXSkuaW5jbHVkZXMobGV2ZWwpO1xufVxuXG5leHBvcnQgdHlwZSBSZXNvbHZlTG9nTGV2ZWxPcHRpb25zID0ge1xuXHRleHBsaWNpdExvZ0xldmVsPzogc3RyaW5nIHwgbnVsbDtcblx0ZW52TG9nTGV2ZWw/OiBzdHJpbmcgfCBudWxsO1xuXHRkZWZhdWx0TG9nTGV2ZWw6IHN0cmluZztcbn07XG5cbi8qKlxuICogUmVzb2x2ZXMgbG9nIGxldmVsIHdpdGggcHJlY2VkZW5jZTogZXhwbGljaXQgPiBlbnYgPiBkZWZhdWx0LlxuICogSW52YWxpZCBleHBsaWNpdC9lbnYgbGV2ZWxzIGZhbGwgYmFjayB0byBkZWZhdWx0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUxvZ0xldmVsKGV4cGxpY2l0TG9nTGV2ZWw/OiBzdHJpbmcgfCBudWxsKTogc3RyaW5nIHwgbnVsbDtcbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlTG9nTGV2ZWwob3B0aW9uczogUmVzb2x2ZUxvZ0xldmVsT3B0aW9ucyk6IHN0cmluZztcbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlTG9nTGV2ZWwoYXJnPzogc3RyaW5nIHwgbnVsbCB8IFJlc29sdmVMb2dMZXZlbE9wdGlvbnMpOiBzdHJpbmcgfCBudWxsIHtcblx0aWYgKHR5cGVvZiBhcmcgPT09IFwic3RyaW5nXCIpIHtcblx0XHRpZiAoaXNWYWxpZExvZ0xldmVsKGFyZykpIHtcblx0XHRcdHJldHVybiBhcmc7XG5cdFx0fVxuXG5cdFx0Y29uc3QgZW52TG9nTGV2ZWwgPSBnZXRMb2dMZXZlbEZyb21FbnYoKTtcblx0XHRpZiAoZW52TG9nTGV2ZWwgIT0gbnVsbCAmJiBpc1ZhbGlkTG9nTGV2ZWwoZW52TG9nTGV2ZWwpKSB7XG5cdFx0XHRyZXR1cm4gZW52TG9nTGV2ZWw7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHRpZiAoYXJnID09IG51bGwpIHtcblx0XHRjb25zdCBlbnZMb2dMZXZlbCA9IGdldExvZ0xldmVsRnJvbUVudigpO1xuXHRcdGlmIChlbnZMb2dMZXZlbCAhPSBudWxsICYmIGlzVmFsaWRMb2dMZXZlbChlbnZMb2dMZXZlbCkpIHtcblx0XHRcdHJldHVybiBlbnZMb2dMZXZlbDtcblx0XHR9XG5cblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdGNvbnN0IHsgZXhwbGljaXRMb2dMZXZlbCwgZW52TG9nTGV2ZWwsIGRlZmF1bHRMb2dMZXZlbCB9ID0gYXJnO1xuXHRpZiAoZXhwbGljaXRMb2dMZXZlbCAhPSBudWxsICYmIGlzVmFsaWRMb2dMZXZlbChleHBsaWNpdExvZ0xldmVsKSkge1xuXHRcdHJldHVybiBleHBsaWNpdExvZ0xldmVsO1xuXHR9XG5cblx0Y29uc3QgcmVzb2x2ZWRFbnZMb2dMZXZlbCA9IGVudkxvZ0xldmVsID8/IGdldExvZ0xldmVsRnJvbUVudigpO1xuXHRpZiAocmVzb2x2ZWRFbnZMb2dMZXZlbCAhPSBudWxsICYmIGlzVmFsaWRMb2dMZXZlbChyZXNvbHZlZEVudkxvZ0xldmVsKSkge1xuXHRcdHJldHVybiByZXNvbHZlZEVudkxvZ0xldmVsO1xuXHR9XG5cblx0cmV0dXJuIGRlZmF1bHRMb2dMZXZlbDtcbn1cbiJdLCJuYW1lcyI6WyJnZXRMb2dMZXZlbEZyb21Bcmd2IiwiZ2V0TG9nTGV2ZWxGcm9tRW52IiwiaXNWYWxpZExvZ0xldmVsIiwicmVzb2x2ZUxvZ0xldmVsIiwiRU5WX1ZBUl9OQU1FUyIsIlZBTElEX0xFVkVMUyIsIm5hbWUiLCJ2YWx1ZSIsInByb2Nlc3MiLCJlbnYiLCJ0cmltIiwidG9Mb3dlckNhc2UiLCJhcmd2IiwiaW5kZXgiLCJsZW5ndGgiLCJhcmciLCJzdGFydHNXaXRoIiwic2xpY2UiLCJ1bmRlZmluZWQiLCJsZXZlbCIsImluY2x1ZGVzIiwiZW52TG9nTGV2ZWwiLCJleHBsaWNpdExvZ0xldmVsIiwiZGVmYXVsdExvZ0xldmVsIiwicmVzb2x2ZWRFbnZMb2dMZXZlbCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7UUE2QmdCQTtlQUFBQTs7UUFkQUM7ZUFBQUE7O1FBK0JBQztlQUFBQTs7UUFnQkFDO2VBQUFBOzs7QUE1RGhCOzs7Q0FHQyxHQUNELE1BQU1DLGdCQUFnQjtJQUFDO0lBQWE7SUFBb0I7Q0FBZ0I7QUFFeEUsTUFBTUMsZUFBZ0M7SUFBQztJQUFTO0lBQVM7SUFBUTtJQUFRO0lBQVM7Q0FBUTtBQU9uRixTQUFTSjtJQUNmLEtBQUssTUFBTUssUUFBUUYsY0FBZTtRQUNqQyxNQUFNRyxRQUFRQyxRQUFRQyxHQUFHLENBQUNILEtBQUssRUFBRUksT0FBT0M7UUFDeEMsSUFBSUosT0FBTztZQUNWLE9BQU9BO1FBQ1I7SUFDRDtJQUNBLE9BQU87QUFDUjtBQU1PLFNBQVNQLG9CQUFvQlksSUFBdUI7SUFDMUQsSUFBSyxJQUFJQyxRQUFRLEdBQUdBLFFBQVFELEtBQUtFLE1BQU0sRUFBRUQsU0FBUyxFQUFHO1FBQ3BELE1BQU1FLE1BQU1ILElBQUksQ0FBQ0MsTUFBTTtRQUN2QixJQUFJRSxRQUFRLGlCQUFpQkEsUUFBUSxNQUFNO1lBQzFDLE9BQU9ILElBQUksQ0FBQ0MsUUFBUSxFQUFFO1FBQ3ZCO1FBQ0EsSUFBSUUsSUFBSUMsVUFBVSxDQUFDLGlCQUFpQjtZQUNuQyxPQUFPRCxJQUFJRSxLQUFLLENBQUMsZUFBZUgsTUFBTTtRQUN2QztJQUNEO0lBRUEsT0FBT0k7QUFDUjtBQUtPLFNBQVNoQixnQkFBZ0JpQixLQUFhO0lBQzVDLE9BQU8sQUFBQ2QsYUFBMEJlLFFBQVEsQ0FBQ0Q7QUFDNUM7QUFjTyxTQUFTaEIsZ0JBQWdCWSxHQUE0QztJQUMzRSxJQUFJLE9BQU9BLFFBQVEsVUFBVTtRQUM1QixJQUFJYixnQkFBZ0JhLE1BQU07WUFDekIsT0FBT0E7UUFDUjtRQUVBLE1BQU1NLGNBQWNwQjtRQUNwQixJQUFJb0IsZUFBZSxRQUFRbkIsZ0JBQWdCbUIsY0FBYztZQUN4RCxPQUFPQTtRQUNSO1FBRUEsT0FBTztJQUNSO0lBRUEsSUFBSU4sT0FBTyxNQUFNO1FBQ2hCLE1BQU1NLGNBQWNwQjtRQUNwQixJQUFJb0IsZUFBZSxRQUFRbkIsZ0JBQWdCbUIsY0FBYztZQUN4RCxPQUFPQTtRQUNSO1FBRUEsT0FBTztJQUNSO0lBRUEsTUFBTSxFQUFFQyxnQkFBZ0IsRUFBRUQsV0FBVyxFQUFFRSxlQUFlLEVBQUUsR0FBR1I7SUFDM0QsSUFBSU8sb0JBQW9CLFFBQVFwQixnQkFBZ0JvQixtQkFBbUI7UUFDbEUsT0FBT0E7SUFDUjtJQUVBLE1BQU1FLHNCQUFzQkgsZUFBZXBCO0lBQzNDLElBQUl1Qix1QkFBdUIsUUFBUXRCLGdCQUFnQnNCLHNCQUFzQjtRQUN4RSxPQUFPQTtJQUNSO0lBRUEsT0FBT0Q7QUFDUiJ9
|
package/commonjs/src/errors.js
CHANGED
|
@@ -10,5 +10,3 @@ Object.defineProperty(exports, "LoggingConfigurationError", {
|
|
|
10
10
|
});
|
|
11
11
|
class LoggingConfigurationError extends Error {
|
|
12
12
|
}
|
|
13
|
-
|
|
14
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL3NjcmliZS9zY3JpYmUvc3JjL2Vycm9ycy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY2xhc3MgTG9nZ2luZ0NvbmZpZ3VyYXRpb25FcnJvciBleHRlbmRzIEVycm9yIHt9XG4iXSwibmFtZXMiOlsiTG9nZ2luZ0NvbmZpZ3VyYXRpb25FcnJvciIsIkVycm9yIl0sIm1hcHBpbmdzIjoiOzs7OytCQUFhQTs7O2VBQUFBOzs7QUFBTixNQUFNQSxrQ0FBa0NDO0FBQU8ifQ==
|
package/commonjs/src/index.js
CHANGED
|
@@ -5,9 +5,12 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
_export_star(require("./console.adapter.js"), exports);
|
|
6
6
|
_export_star(require("./env.js"), exports);
|
|
7
7
|
_export_star(require("./errors.js"), exports);
|
|
8
|
+
_export_star(require("./log-entry.adapter.js"), exports);
|
|
9
|
+
_export_star(require("./log-entry.js"), exports);
|
|
8
10
|
_export_star(require("./logger.adapter.js"), exports);
|
|
9
11
|
_export_star(require("./logger.factory.js"), exports);
|
|
10
12
|
_export_star(require("./logger.type.js"), exports);
|
|
13
|
+
_export_star(require("./redact.js"), exports);
|
|
11
14
|
_export_star(require("./types.js"), exports);
|
|
12
15
|
function _export_star(from, to) {
|
|
13
16
|
Object.keys(from).forEach(function(k) {
|
|
@@ -22,5 +25,3 @@ function _export_star(from, to) {
|
|
|
22
25
|
});
|
|
23
26
|
return from;
|
|
24
27
|
}
|
|
25
|
-
|
|
26
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL3NjcmliZS9zY3JpYmUvc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCIuL2NvbnNvbGUuYWRhcHRlci5qc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZW52LmpzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9lcnJvcnMuanNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2xvZ2dlci5hZGFwdGVyLmpzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9sb2dnZXIuZmFjdG9yeS5qc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vbG9nZ2VyLnR5cGUuanNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3R5cGVzLmpzXCI7XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztxQkFBYztxQkFDQTtxQkFDQTtxQkFDQTtxQkFDQTtxQkFDQTtxQkFDQSJ9
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "LogEntryAdapter", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return LogEntryAdapter;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _logentry = require("./log-entry.js");
|
|
12
|
+
const _loggeradapter = require("./logger.adapter.js");
|
|
13
|
+
const _redact = require("./redact.js");
|
|
14
|
+
const _types = require("./types.js");
|
|
15
|
+
class LogEntryAdapter extends _loggeradapter.LogAdapter {
|
|
16
|
+
levels = _types.LogLevels;
|
|
17
|
+
level = _types.DefaultLogLevel;
|
|
18
|
+
threshold = _types.LogLevels.info;
|
|
19
|
+
redactionKeys = _redact.redact.fromOptions();
|
|
20
|
+
configure(scribeOptions) {
|
|
21
|
+
this.levels = this.getLogLevels(scribeOptions);
|
|
22
|
+
this.level = scribeOptions.logLevel ?? _types.DefaultLogLevel;
|
|
23
|
+
this.threshold = this.levels[this.level] ?? _types.LogLevels.info;
|
|
24
|
+
this.redactionKeys = _redact.redact.fromOptions(scribeOptions.redactions);
|
|
25
|
+
}
|
|
26
|
+
getLogger(name) {
|
|
27
|
+
return this.createLogger(name || "default", {});
|
|
28
|
+
}
|
|
29
|
+
createLogger(name, bindings) {
|
|
30
|
+
const { levels, level: currentLevel, threshold, redactionKeys } = this;
|
|
31
|
+
const baseLogger = {
|
|
32
|
+
get currentLevel () {
|
|
33
|
+
return currentLevel;
|
|
34
|
+
},
|
|
35
|
+
get logLevels () {
|
|
36
|
+
return levels;
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
const noop = ()=>{};
|
|
40
|
+
const methods = {};
|
|
41
|
+
for (const [level, value] of Object.entries(levels)){
|
|
42
|
+
methods[level] = value >= threshold ? (...args)=>this.write(_logentry.logEntry.from(level, name, args, {
|
|
43
|
+
bindings,
|
|
44
|
+
redactionKeys
|
|
45
|
+
})) : noop;
|
|
46
|
+
}
|
|
47
|
+
return Object.assign(baseLogger, methods, {
|
|
48
|
+
isLevelEnabled: (level)=>(levels[level] ?? 0) >= threshold,
|
|
49
|
+
child: (fields)=>this.createLogger(name, {
|
|
50
|
+
...bindings,
|
|
51
|
+
...fields
|
|
52
|
+
})
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "logEntry", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return logEntry;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _loggeradapter = require("./logger.adapter.js");
|
|
12
|
+
const _redact = require("./redact.js");
|
|
13
|
+
function isFields(value) {
|
|
14
|
+
return value != null && typeof value === "object" && !Array.isArray(value);
|
|
15
|
+
}
|
|
16
|
+
/** Serialize errors passed as fields (`{ error }`), so they keep their message and stack. */ function serializeErrors(fields) {
|
|
17
|
+
const out = {};
|
|
18
|
+
for (const [key, value] of Object.entries(fields)){
|
|
19
|
+
out[key] = value instanceof Error ? (0, _loggeradapter.serializeError)(value) : value;
|
|
20
|
+
}
|
|
21
|
+
return out;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Builds an entry from a log call's arguments:
|
|
25
|
+
*
|
|
26
|
+
* - `log.info("text")`, `log.info(42)` → `msg`
|
|
27
|
+
* - `log.error(err)` → `msg` is `err.message`, `err` the serialized error
|
|
28
|
+
* - `log.info({ fields })`, `log.info({ fields }, "text")` → `fields` (a string
|
|
29
|
+
* `msg` field becomes the message)
|
|
30
|
+
* - `log.info("text", { fields })` → `msg` + `fields`
|
|
31
|
+
* - `log.error("text", err)` → `msg` + `err`
|
|
32
|
+
* - `log.info("text", value)` → `msg` + `fields.data`; any further arguments go
|
|
33
|
+
* in `fields.args`
|
|
34
|
+
*/ function from(level, name, [first, ...rest], { bindings, redactionKeys }) {
|
|
35
|
+
let msg;
|
|
36
|
+
let err;
|
|
37
|
+
let fields = {};
|
|
38
|
+
if (first instanceof Error) {
|
|
39
|
+
err = first;
|
|
40
|
+
msg = first.message;
|
|
41
|
+
} else if (isFields(first)) {
|
|
42
|
+
const { msg: fieldMsg, ...others } = first;
|
|
43
|
+
fields = others;
|
|
44
|
+
if (typeof fieldMsg === "string") {
|
|
45
|
+
msg = fieldMsg;
|
|
46
|
+
} else if (fieldMsg !== undefined) {
|
|
47
|
+
fields.msg = fieldMsg;
|
|
48
|
+
}
|
|
49
|
+
if (typeof rest[0] === "string") {
|
|
50
|
+
msg = rest.shift();
|
|
51
|
+
}
|
|
52
|
+
} else if (first !== undefined) {
|
|
53
|
+
msg = String(first);
|
|
54
|
+
}
|
|
55
|
+
const [second, ...extra] = rest;
|
|
56
|
+
if (second instanceof Error && err == null) {
|
|
57
|
+
err = second;
|
|
58
|
+
} else if (isFields(second)) {
|
|
59
|
+
fields = {
|
|
60
|
+
...fields,
|
|
61
|
+
...second
|
|
62
|
+
};
|
|
63
|
+
} else if (second !== undefined) {
|
|
64
|
+
fields.data = second;
|
|
65
|
+
}
|
|
66
|
+
if (extra.length > 0) {
|
|
67
|
+
fields.args = extra;
|
|
68
|
+
}
|
|
69
|
+
const allFields = serializeErrors({
|
|
70
|
+
...bindings,
|
|
71
|
+
...fields
|
|
72
|
+
});
|
|
73
|
+
const entry = {
|
|
74
|
+
level,
|
|
75
|
+
name,
|
|
76
|
+
fields: redactionKeys == null ? allFields : _redact.redact.object(allFields, redactionKeys)
|
|
77
|
+
};
|
|
78
|
+
if (msg !== undefined) {
|
|
79
|
+
entry.msg = msg;
|
|
80
|
+
}
|
|
81
|
+
if (err != null) {
|
|
82
|
+
const serialized = (0, _loggeradapter.serializeError)(err);
|
|
83
|
+
entry.err = redactionKeys == null ? serialized : _redact.redact.object(serialized, redactionKeys);
|
|
84
|
+
}
|
|
85
|
+
return entry;
|
|
86
|
+
}
|
|
87
|
+
const logEntry = {
|
|
88
|
+
from
|
|
89
|
+
};
|
|
@@ -2,18 +2,72 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", {
|
|
3
3
|
value: true
|
|
4
4
|
});
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
function _export(target, all) {
|
|
6
|
+
for(var name in all)Object.defineProperty(target, name, {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: Object.getOwnPropertyDescriptor(all, name).get
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
_export(exports, {
|
|
12
|
+
get DefaultErrorCauseDepth () {
|
|
13
|
+
return DefaultErrorCauseDepth;
|
|
14
|
+
},
|
|
15
|
+
get LogAdapter () {
|
|
8
16
|
return LogAdapter;
|
|
17
|
+
},
|
|
18
|
+
get formatError () {
|
|
19
|
+
return formatError;
|
|
20
|
+
},
|
|
21
|
+
get serializeError () {
|
|
22
|
+
return serializeError;
|
|
9
23
|
}
|
|
10
24
|
});
|
|
11
25
|
const _types = require("./types.js");
|
|
26
|
+
function formatError(err) {
|
|
27
|
+
return err.stack ?? err.message;
|
|
28
|
+
}
|
|
29
|
+
const DefaultErrorCauseDepth = 3;
|
|
30
|
+
function serializeError(err, causeDepth = DefaultErrorCauseDepth) {
|
|
31
|
+
const out = {
|
|
32
|
+
name: err.name,
|
|
33
|
+
message: err.message
|
|
34
|
+
};
|
|
35
|
+
if (err.stack != null) {
|
|
36
|
+
out.stack = err.stack;
|
|
37
|
+
}
|
|
38
|
+
for (const [key, value] of Object.entries(err)){
|
|
39
|
+
if (key === "cause" || key in out) {
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
if (!(value instanceof Error)) {
|
|
43
|
+
out[key] = value;
|
|
44
|
+
} else if (causeDepth > 0) {
|
|
45
|
+
out[key] = serializeError(value, causeDepth - 1);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
const { cause } = err;
|
|
49
|
+
if (cause instanceof Error) {
|
|
50
|
+
if (causeDepth > 0) {
|
|
51
|
+
out.cause = serializeError(cause, causeDepth - 1);
|
|
52
|
+
}
|
|
53
|
+
} else if (cause !== undefined) {
|
|
54
|
+
out.cause = cause;
|
|
55
|
+
}
|
|
56
|
+
return out;
|
|
57
|
+
}
|
|
12
58
|
class LogAdapter {
|
|
13
59
|
flush(cb) {
|
|
14
60
|
cb?.();
|
|
15
61
|
}
|
|
16
|
-
|
|
62
|
+
retire() {
|
|
63
|
+
// Console / no-op adapters have nothing to release.
|
|
64
|
+
}
|
|
65
|
+
async stop() {
|
|
66
|
+
await this[Symbol.asyncDispose]();
|
|
67
|
+
}
|
|
68
|
+
async [Symbol.asyncDispose]() {
|
|
69
|
+
// Console / no-op adapters have nothing to release.
|
|
70
|
+
}
|
|
17
71
|
getLogLevels(options) {
|
|
18
72
|
const { customOnly, customLevels } = options;
|
|
19
73
|
if (customOnly) {
|
|
@@ -30,5 +84,3 @@ class LogAdapter {
|
|
|
30
84
|
return unique;
|
|
31
85
|
}
|
|
32
86
|
}
|
|
33
|
-
|
|
34
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL3NjcmliZS9zY3JpYmUvc3JjL2xvZ2dlci5hZGFwdGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgTG9nZ2VyIH0gZnJvbSBcIi4vbG9nZ2VyLnR5cGUuanNcIjtcbmltcG9ydCB7IExvZ0xldmVscywgdHlwZSBTY3JpYmVPcHRpb25zIH0gZnJvbSBcIi4vdHlwZXMuanNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBMb2dnZXJBZGFwdGVyIHtcblx0Y29uZmlndXJlPFQgZXh0ZW5kcyBzdHJpbmcgPSBuZXZlciwgQ3VzdG9tT25seSBleHRlbmRzIHRydWUgfCBmYWxzZSA9IGZhbHNlPihcblx0XHRvcHRpb25zOiBTY3JpYmVPcHRpb25zPFQsIEN1c3RvbU9ubHk+LFxuXHQpO1xuXHRnZXRMb2dnZXI8VCBleHRlbmRzIHN0cmluZyA9IG5ldmVyLCBDdXN0b21Pbmx5IGV4dGVuZHMgdHJ1ZSB8IGZhbHNlID0gZmFsc2U+KFxuXHRcdG5hbWU6IHN0cmluZyxcblx0KTogTG9nZ2VyPFQsIEN1c3RvbU9ubHk+O1xuXHRmbHVzaChjYj86ICgpID0+IHZvaWQpOiB2b2lkO1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTG9nQWRhcHRlciBpbXBsZW1lbnRzIExvZ2dlckFkYXB0ZXIge1xuXHRwdWJsaWMgYWJzdHJhY3QgY29uZmlndXJlPFQgZXh0ZW5kcyBzdHJpbmcgPSBuZXZlciwgQ3VzdG9tT25seSBleHRlbmRzIHRydWUgfCBmYWxzZSA9IGZhbHNlPihcblx0XHRvcHRpb25zOiBTY3JpYmVPcHRpb25zPFQsIEN1c3RvbU9ubHk+LFxuXHQpO1xuXG5cdHB1YmxpYyBhYnN0cmFjdCBnZXRMb2dnZXI8VCBleHRlbmRzIHN0cmluZyA9IG5ldmVyLCBDdXN0b21Pbmx5IGV4dGVuZHMgdHJ1ZSB8IGZhbHNlID0gZmFsc2U+KFxuXHRcdG5hbWU6IHN0cmluZyxcblx0KTogTG9nZ2VyPFQsIEN1c3RvbU9ubHk+O1xuXG5cdHB1YmxpYyBmbHVzaChjYj86ICgpID0+IHZvaWQpOiB2b2lkIHtcblx0XHRjYj8uKCk7XG5cdH1cblxuXHQvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IEdlbmVyaWMgdXRpbGl0eSBtZXRob2QgbmVlZHMgZmxleGlibGUgdHlwaW5nXG5cdHByb3RlY3RlZCBnZXRMb2dMZXZlbHMob3B0aW9uczogU2NyaWJlT3B0aW9uczxhbnksIGFueT4pOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+IHtcblx0XHRjb25zdCB7IGN1c3RvbU9ubHksIGN1c3RvbUxldmVscyB9ID0gb3B0aW9ucztcblx0XHRpZiAoY3VzdG9tT25seSkge1xuXHRcdFx0cmV0dXJuIGN1c3RvbUxldmVscztcblx0XHR9XG5cdFx0Y29uc3QgbGV2ZWxzID0gdGhpcy5nZXRVbmlxdWVMZXZlbHMoTG9nTGV2ZWxzLCBjdXN0b21MZXZlbHMpO1xuXHRcdHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMobGV2ZWxzKTtcblx0fVxuXG5cdHByb3RlY3RlZCBnZXRVbmlxdWVMZXZlbHMoXG5cdFx0ZGVmYXVsdExldmVsczogUmVjb3JkPHN0cmluZywgbnVtYmVyPixcblx0XHRjdXN0b21MZXZlbHM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4sXG5cdCkge1xuXHRcdGNvbnN0IGRlZmF1bHRFbnRyaWVzID0gT2JqZWN0LmVudHJpZXMoZGVmYXVsdExldmVscyA/PyB7fSk7XG5cdFx0Y29uc3QgY3VzdG9tRW50cmllcyA9IE9iamVjdC5lbnRyaWVzKGN1c3RvbUxldmVscyA/PyB7fSk7XG5cdFx0Y29uc3QgZGVmYXVsdE5vdEluQ3VzdG9tID0gZGVmYXVsdEVudHJpZXMuZmlsdGVyKFxuXHRcdFx0KFtka10pID0+IGN1c3RvbUVudHJpZXMuZmluZEluZGV4KChbY2tdKSA9PiBjayA9PT0gZGspID09PSAtMSxcblx0XHQpO1xuXG5cdFx0Y29uc3QgdW5pcXVlID0gZGVmYXVsdE5vdEluQ3VzdG9tLmNvbmNhdChjdXN0b21FbnRyaWVzKTtcblx0XHRyZXR1cm4gdW5pcXVlO1xuXHR9XG59XG4iXSwibmFtZXMiOlsiTG9nQWRhcHRlciIsImZsdXNoIiwiY2IiLCJnZXRMb2dMZXZlbHMiLCJvcHRpb25zIiwiY3VzdG9tT25seSIsImN1c3RvbUxldmVscyIsImxldmVscyIsImdldFVuaXF1ZUxldmVscyIsIkxvZ0xldmVscyIsIk9iamVjdCIsImZyb21FbnRyaWVzIiwiZGVmYXVsdExldmVscyIsImRlZmF1bHRFbnRyaWVzIiwiZW50cmllcyIsImN1c3RvbUVudHJpZXMiLCJkZWZhdWx0Tm90SW5DdXN0b20iLCJmaWx0ZXIiLCJkayIsImZpbmRJbmRleCIsImNrIiwidW5pcXVlIiwiY29uY2F0Il0sIm1hcHBpbmdzIjoiOzs7OytCQWFzQkE7OztlQUFBQTs7O3VCQVp3QjtBQVl2QyxNQUFlQTtJQVNkQyxNQUFNQyxFQUFlLEVBQVE7UUFDbkNBO0lBQ0Q7SUFFQSwyRkFBMkY7SUFDakZDLGFBQWFDLE9BQWdDLEVBQTBCO1FBQ2hGLE1BQU0sRUFBRUMsVUFBVSxFQUFFQyxZQUFZLEVBQUUsR0FBR0Y7UUFDckMsSUFBSUMsWUFBWTtZQUNmLE9BQU9DO1FBQ1I7UUFDQSxNQUFNQyxTQUFTLElBQUksQ0FBQ0MsZUFBZSxDQUFDQyxnQkFBUyxFQUFFSDtRQUMvQyxPQUFPSSxPQUFPQyxXQUFXLENBQUNKO0lBQzNCO0lBRVVDLGdCQUNUSSxhQUFxQyxFQUNyQ04sWUFBb0MsRUFDbkM7UUFDRCxNQUFNTyxpQkFBaUJILE9BQU9JLE9BQU8sQ0FBQ0YsaUJBQWlCLENBQUM7UUFDeEQsTUFBTUcsZ0JBQWdCTCxPQUFPSSxPQUFPLENBQUNSLGdCQUFnQixDQUFDO1FBQ3RELE1BQU1VLHFCQUFxQkgsZUFBZUksTUFBTSxDQUMvQyxDQUFDLENBQUNDLEdBQUcsR0FBS0gsY0FBY0ksU0FBUyxDQUFDLENBQUMsQ0FBQ0MsR0FBRyxHQUFLQSxPQUFPRixRQUFRLENBQUM7UUFHN0QsTUFBTUcsU0FBU0wsbUJBQW1CTSxNQUFNLENBQUNQO1FBQ3pDLE9BQU9NO0lBQ1I7QUFDRCJ9
|
|
@@ -11,23 +11,81 @@ Object.defineProperty(exports, "scribe", {
|
|
|
11
11
|
const _consoleadapter = require("./console.adapter.js");
|
|
12
12
|
const _env = require("./env.js");
|
|
13
13
|
const _errors = require("./errors.js");
|
|
14
|
+
const _logentry = require("./log-entry.js");
|
|
14
15
|
const _types = require("./types.js");
|
|
15
16
|
class scribe {
|
|
16
17
|
loggerProvider;
|
|
18
|
+
/** True after `configure({ adapter })` — the constructor’s ConsoleAdapter is only a fallback. */ adapterConfigured = false;
|
|
19
|
+
defaultAdapterWarned = false;
|
|
20
|
+
tap;
|
|
17
21
|
static instance = new scribe();
|
|
18
22
|
static logger(name, customLevels) {
|
|
19
|
-
|
|
23
|
+
// Apply custom levels once against the active adapter; the live handle
|
|
24
|
+
// re-resolves the underlying logger on each use.
|
|
25
|
+
if (customLevels) {
|
|
26
|
+
scribe.instance.getLogger(name, customLevels);
|
|
27
|
+
}
|
|
28
|
+
return scribe.createLiveLogger(name);
|
|
20
29
|
}
|
|
21
30
|
static configure(configOptions) {
|
|
31
|
+
const previous = scribe.instance;
|
|
32
|
+
// Sync: stop writes into the old ThreadStream before a new worker starts.
|
|
33
|
+
previous.retire();
|
|
22
34
|
scribe.instance = new scribe();
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
35
|
+
scribe.instance.configure(configOptions);
|
|
36
|
+
// Async drain of the retired adapter (flush / end). Flux/App.dispose may
|
|
37
|
+
// have already done this; reconfigure without stop still needs it.
|
|
38
|
+
void previous.stop();
|
|
39
|
+
return (name)=>scribe.logger(name);
|
|
27
40
|
}
|
|
28
41
|
static flush(cb) {
|
|
29
42
|
scribe.instance.loggerProvider.flush(cb);
|
|
30
43
|
}
|
|
44
|
+
/** Synchronously stop accepting writes on the active adapter. */ static retire() {
|
|
45
|
+
scribe.instance.retire();
|
|
46
|
+
}
|
|
47
|
+
/** Drain the active adapter and release workers / destinations. */ static async stop() {
|
|
48
|
+
await scribe.instance.stop();
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Module-level `const log = scribe.logger(...)` must follow a later
|
|
52
|
+
* `scribe.configure()` (CLI / Flux / HotReloadServer). Forward every use to
|
|
53
|
+
* the active adapter logger for `name`, and `child(fields)` to a live handle
|
|
54
|
+
* that adds `bindings`, so children follow a reconfigure too.
|
|
55
|
+
*/ static createLiveLogger(name, bindings = {}) {
|
|
56
|
+
const bound = Object.keys(bindings).length > 0;
|
|
57
|
+
const resolve = ()=>{
|
|
58
|
+
const root = scribe.instance.getLogger(name);
|
|
59
|
+
return bound ? root.child(bindings) : root;
|
|
60
|
+
};
|
|
61
|
+
return new Proxy({}, {
|
|
62
|
+
get (_target, prop) {
|
|
63
|
+
if (prop === "child") {
|
|
64
|
+
return (fields)=>scribe.createLiveLogger(name, {
|
|
65
|
+
...bindings,
|
|
66
|
+
...fields
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
const underlying = resolve();
|
|
70
|
+
const value = Reflect.get(underlying, prop, underlying);
|
|
71
|
+
if (typeof value !== "function") {
|
|
72
|
+
return value;
|
|
73
|
+
}
|
|
74
|
+
const method = value.bind(underlying);
|
|
75
|
+
const instance = scribe.instance;
|
|
76
|
+
if (instance.tap == null || typeof prop !== "string" || !Object.hasOwn(underlying.logLevels, prop) || !underlying.isLevelEnabled(prop)) {
|
|
77
|
+
return method;
|
|
78
|
+
}
|
|
79
|
+
return (...args)=>{
|
|
80
|
+
method(...args);
|
|
81
|
+
instance.notifyTap(prop, name ?? "default", args, bindings);
|
|
82
|
+
};
|
|
83
|
+
},
|
|
84
|
+
has (_target, prop) {
|
|
85
|
+
return Reflect.has(resolve(), prop);
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
}
|
|
31
89
|
constructor(){
|
|
32
90
|
// Initialize with default console adapter
|
|
33
91
|
this.loggerProvider = new _consoleadapter.ConsoleAdapter();
|
|
@@ -35,13 +93,32 @@ class scribe {
|
|
|
35
93
|
this.loggerProvider.configure(defaultOptions);
|
|
36
94
|
}
|
|
37
95
|
configure(configOptions) {
|
|
38
|
-
const { adapter, options } = configOptions;
|
|
96
|
+
const { adapter, options, tap } = configOptions;
|
|
97
|
+
const previous = this.loggerProvider;
|
|
98
|
+
if (previous !== adapter) {
|
|
99
|
+
previous.retire();
|
|
100
|
+
}
|
|
39
101
|
this.loggerProvider = adapter;
|
|
102
|
+
this.adapterConfigured = true;
|
|
103
|
+
this.tap = tap;
|
|
40
104
|
const defaultsAndOptions = this.mergeDefaults(options);
|
|
41
105
|
adapter.configure(defaultsAndOptions);
|
|
42
|
-
|
|
106
|
+
if (previous !== adapter) {
|
|
107
|
+
void previous.stop();
|
|
108
|
+
}
|
|
109
|
+
return (name)=>scribe.logger(name);
|
|
110
|
+
}
|
|
111
|
+
retire() {
|
|
112
|
+
this.loggerProvider.retire();
|
|
113
|
+
}
|
|
114
|
+
async stop() {
|
|
115
|
+
await this.loggerProvider.stop();
|
|
116
|
+
}
|
|
117
|
+
async [Symbol.asyncDispose]() {
|
|
118
|
+
await this.stop();
|
|
43
119
|
}
|
|
44
120
|
getLogger(name, customLevels) {
|
|
121
|
+
this.warnIfDefaultAdapter();
|
|
45
122
|
// If custom levels are provided, we need to reconfigure the adapter
|
|
46
123
|
if (customLevels) {
|
|
47
124
|
const currentOptions = this.mergeDefaults({
|
|
@@ -53,6 +130,30 @@ class scribe {
|
|
|
53
130
|
this.supportsLevels(customLevels, logger);
|
|
54
131
|
return logger;
|
|
55
132
|
}
|
|
133
|
+
notifyTap(level, name, args, bindings) {
|
|
134
|
+
const tap = this.tap;
|
|
135
|
+
if (tap == null) {
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
try {
|
|
139
|
+
tap(_logentry.logEntry.from(level, name, args, {
|
|
140
|
+
bindings
|
|
141
|
+
}));
|
|
142
|
+
} catch (err) {
|
|
143
|
+
// Not swallowed: the logging call returns, the runtime reports the tap's error.
|
|
144
|
+
queueMicrotask(()=>{
|
|
145
|
+
throw err;
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
warnIfDefaultAdapter() {
|
|
150
|
+
if (this.adapterConfigured || this.defaultAdapterWarned) {
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
this.defaultAdapterWarned = true;
|
|
154
|
+
// console.warn, not the stderr stream: the facade runs in browsers and Workers too.
|
|
155
|
+
console.warn("[scribe] No logger adapter configured; using the default ConsoleAdapter. " + "Configure an adapter at your composition root (for production, prefer " + "@decohere/scribe-pino → JSON on stdout). See " + "https://github.com/typesmiths/decohere/blob/main/projects/scribe/README.md");
|
|
156
|
+
}
|
|
56
157
|
supportsLevels(customLevels, logger) {
|
|
57
158
|
if (!customLevels) {
|
|
58
159
|
return;
|
|
@@ -67,12 +168,12 @@ class scribe {
|
|
|
67
168
|
}
|
|
68
169
|
mergeDefaults(options) {
|
|
69
170
|
const logLevel = (0, _env.resolveLogLevel)(options?.logLevel) ?? _types.DefaultLogLevel;
|
|
171
|
+
// Resolved logLevel must win over options spread (invalid explicit values
|
|
172
|
+
// would otherwise stick).
|
|
70
173
|
return {
|
|
71
|
-
logLevel,
|
|
72
174
|
redactions: _types.DefaultRedactions,
|
|
73
|
-
...options
|
|
175
|
+
...options,
|
|
176
|
+
logLevel
|
|
74
177
|
};
|
|
75
178
|
}
|
|
76
179
|
}
|
|
77
|
-
|
|
78
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL3NjcmliZS9zY3JpYmUvc3JjL2xvZ2dlci5mYWN0b3J5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbnNvbGVBZGFwdGVyIH0gZnJvbSBcIi4vY29uc29sZS5hZGFwdGVyLmpzXCI7XG5pbXBvcnQgeyByZXNvbHZlTG9nTGV2ZWwgfSBmcm9tIFwiLi9lbnYuanNcIjtcbmltcG9ydCB7IExvZ2dpbmdDb25maWd1cmF0aW9uRXJyb3IgfSBmcm9tIFwiLi9lcnJvcnMuanNcIjtcbmltcG9ydCB0eXBlIHsgTG9nZ2VyQWRhcHRlciB9IGZyb20gXCIuL2xvZ2dlci5hZGFwdGVyLmpzXCI7XG5pbXBvcnQgdHlwZSB7IExvZ2dlciB9IGZyb20gXCIuL2xvZ2dlci50eXBlLmpzXCI7XG5pbXBvcnQgeyBEZWZhdWx0TG9nTGV2ZWwsIERlZmF1bHRSZWRhY3Rpb25zLCB0eXBlIFNjcmliZU9wdGlvbnMgfSBmcm9tIFwiLi90eXBlcy5qc1wiO1xuXG50eXBlIExvZ2dlckZhY3RvcnlPcHRpb25zPFxuXHRUIGV4dGVuZHMgc3RyaW5nID0gbmV2ZXIsXG5cdEN1c3RvbU9ubHkgZXh0ZW5kcyB0cnVlIHwgZmFsc2UgPSBmYWxzZSxcbj4gPSB7XG5cdG9wdGlvbnM/OiBTY3JpYmVPcHRpb25zPFQsIEN1c3RvbU9ubHk+O1xuXHRhZGFwdGVyOiBMb2dnZXJBZGFwdGVyO1xufTtcblxuZXhwb3J0IGNsYXNzIHNjcmliZSB7XG5cdHByaXZhdGUgbG9nZ2VyUHJvdmlkZXI6IExvZ2dlckFkYXB0ZXI7XG5cdHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBzY3JpYmUgPSBuZXcgc2NyaWJlKCk7XG5cblx0cHVibGljIHN0YXRpYyBsb2dnZXI8VCBleHRlbmRzIHN0cmluZyA9IG5ldmVyLCBDdXN0b21Pbmx5IGV4dGVuZHMgdHJ1ZSB8IGZhbHNlID0gZmFsc2U+KFxuXHRcdG5hbWU/OiBzdHJpbmcsXG5cdFx0Y3VzdG9tTGV2ZWxzPzoge1xuXHRcdFx0W2xldmVsIGluIFRdOiBudW1iZXI7XG5cdFx0fSxcblx0KTogTG9nZ2VyPFQsIEN1c3RvbU9ubHk+IHtcblx0XHRyZXR1cm4gc2NyaWJlLmluc3RhbmNlLmdldExvZ2dlcjxULCBDdXN0b21Pbmx5PihuYW1lLCBjdXN0b21MZXZlbHMpIGFzIExvZ2dlcjxcblx0XHRcdFQsXG5cdFx0XHRDdXN0b21Pbmx5XG5cdFx0Pjtcblx0fVxuXG5cdHB1YmxpYyBzdGF0aWMgY29uZmlndXJlPFQgZXh0ZW5kcyBzdHJpbmcgPSBuZXZlciwgQ3VzdG9tT25seSBleHRlbmRzIHRydWUgfCBmYWxzZSA9IGZhbHNlPihcblx0XHRjb25maWdPcHRpb25zOiBMb2dnZXJGYWN0b3J5T3B0aW9uczxULCBDdXN0b21Pbmx5Pixcblx0KSB7XG5cdFx0c2NyaWJlLmluc3RhbmNlID0gbmV3IHNjcmliZSgpO1xuXHRcdHJldHVybiBzY3JpYmUuaW5zdGFuY2UuY29uZmlndXJlPFQsIEN1c3RvbU9ubHk+KGNvbmZpZ09wdGlvbnMpO1xuXHR9XG5cblx0cHVibGljIHN0YXRpYyBnZXQgZXh0ZW5kKCkge1xuXHRcdHJldHVybiBzY3JpYmUuaW5zdGFuY2U7XG5cdH1cblxuXHRwdWJsaWMgc3RhdGljIGZsdXNoKGNiPzogKCkgPT4gdm9pZCk6IHZvaWQge1xuXHRcdHNjcmliZS5pbnN0YW5jZS5sb2dnZXJQcm92aWRlci5mbHVzaChjYik7XG5cdH1cblxuXHRwdWJsaWMgY29uc3RydWN0b3IoKSB7XG5cdFx0Ly8gSW5pdGlhbGl6ZSB3aXRoIGRlZmF1bHQgY29uc29sZSBhZGFwdGVyXG5cdFx0dGhpcy5sb2dnZXJQcm92aWRlciA9IG5ldyBDb25zb2xlQWRhcHRlcigpO1xuXHRcdGNvbnN0IGRlZmF1bHRPcHRpb25zID0gdGhpcy5tZXJnZURlZmF1bHRzKCk7XG5cdFx0dGhpcy5sb2dnZXJQcm92aWRlci5jb25maWd1cmUoZGVmYXVsdE9wdGlvbnMpO1xuXHR9XG5cblx0cHVibGljIGNvbmZpZ3VyZTxUIGV4dGVuZHMgc3RyaW5nID0gbmV2ZXIsIEN1c3RvbU9ubHkgZXh0ZW5kcyB0cnVlIHwgZmFsc2UgPSBmYWxzZT4oXG5cdFx0Y29uZmlnT3B0aW9uczogTG9nZ2VyRmFjdG9yeU9wdGlvbnM8VCwgQ3VzdG9tT25seT4sXG5cdCk6IChuYW1lPzogc3RyaW5nKSA9PiBMb2dnZXI8VCwgQ3VzdG9tT25seT4ge1xuXHRcdGNvbnN0IHsgYWRhcHRlciwgb3B0aW9ucyB9ID0gY29uZmlnT3B0aW9ucztcblx0XHR0aGlzLmxvZ2dlclByb3ZpZGVyID0gYWRhcHRlcjtcblx0XHRjb25zdCBkZWZhdWx0c0FuZE9wdGlvbnMgPSB0aGlzLm1lcmdlRGVmYXVsdHM8VCwgQ3VzdG9tT25seT4ob3B0aW9ucyk7XG5cdFx0YWRhcHRlci5jb25maWd1cmUoZGVmYXVsdHNBbmRPcHRpb25zKTtcblx0XHRyZXR1cm4gKG5hbWU/OiBzdHJpbmcpID0+IGFkYXB0ZXIuZ2V0TG9nZ2VyKG5hbWUpIGFzIExvZ2dlcjxULCBDdXN0b21Pbmx5Pjtcblx0fVxuXG5cdHB1YmxpYyBnZXRMb2dnZXI8VCBleHRlbmRzIHN0cmluZyA9IG5ldmVyLCBDdXN0b21Pbmx5IGV4dGVuZHMgdHJ1ZSB8IGZhbHNlID0gZmFsc2U+KFxuXHRcdG5hbWU/OiBzdHJpbmcsXG5cdFx0Y3VzdG9tTGV2ZWxzPzoge1xuXHRcdFx0W2xldmVsIGluIFRdOiBudW1iZXI7XG5cdFx0fSxcblx0KTogTG9nZ2VyPFQsIEN1c3RvbU9ubHk+IHtcblx0XHQvLyBJZiBjdXN0b20gbGV2ZWxzIGFyZSBwcm92aWRlZCwgd2UgbmVlZCB0byByZWNvbmZpZ3VyZSB0aGUgYWRhcHRlclxuXHRcdGlmIChjdXN0b21MZXZlbHMpIHtcblx0XHRcdGNvbnN0IGN1cnJlbnRPcHRpb25zID0gdGhpcy5tZXJnZURlZmF1bHRzKHsgY3VzdG9tTGV2ZWxzIH0pO1xuXHRcdFx0dGhpcy5sb2dnZXJQcm92aWRlci5jb25maWd1cmUoY3VycmVudE9wdGlvbnMpO1xuXHRcdH1cblxuXHRcdGNvbnN0IGxvZ2dlciA9IHRoaXMubG9nZ2VyUHJvdmlkZXIuZ2V0TG9nZ2VyKG5hbWUpIGFzIExvZ2dlcjxULCBDdXN0b21Pbmx5Pjtcblx0XHR0aGlzLnN1cHBvcnRzTGV2ZWxzKGN1c3RvbUxldmVscywgbG9nZ2VyKTtcblx0XHRyZXR1cm4gbG9nZ2VyO1xuXHR9XG5cblx0cHJpdmF0ZSBzdXBwb3J0c0xldmVsczxUIGV4dGVuZHMgc3RyaW5nID0gbmV2ZXIsIEN1c3RvbU9ubHkgZXh0ZW5kcyB0cnVlID0gdW5kZWZpbmVkPihcblx0XHRjdXN0b21MZXZlbHM6IHtcblx0XHRcdFtsZXZlbCBpbiBUXTogbnVtYmVyO1xuXHRcdH0sXG5cdFx0bG9nZ2VyOiBMb2dnZXI8VCwgQ3VzdG9tT25seT4sXG5cdCkge1xuXHRcdGlmICghY3VzdG9tTGV2ZWxzKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgbWlzc2luZ0xldmVsID0gT2JqZWN0LmVudHJpZXMoY3VzdG9tTGV2ZWxzKS5maW5kKFxuXHRcdFx0KGtleSkgPT4gIWxvZ2dlci5sb2dMZXZlbHNba2V5LmF0KDApLnRvU3RyaW5nKCldLFxuXHRcdCk7XG5cblx0XHRpZiAobWlzc2luZ0xldmVsICE9IG51bGwpIHtcblx0XHRcdHRocm93IG5ldyBMb2dnaW5nQ29uZmlndXJhdGlvbkVycm9yKFxuXHRcdFx0XHRgQ3VycmVudCBsb2dnZXIgd2FzIG5vdCBjb25maWd1cmVkIGZvciBjdXN0b20gbGV2ZWwgJHttaXNzaW5nTGV2ZWx9LCB2YWxpZCBsZXZlbHMgYXJlOiAke0pTT04uc3RyaW5naWZ5KGxvZ2dlci5sb2dMZXZlbHMpfWAsXG5cdFx0XHQpO1xuXHRcdH1cblx0XHRyZXR1cm4geyBtaXNzaW5nTGV2ZWwgfTtcblx0fVxuXG5cdHByaXZhdGUgbWVyZ2VEZWZhdWx0czxUIGV4dGVuZHMgc3RyaW5nID0gbmV2ZXIsIEN1c3RvbU9ubHkgZXh0ZW5kcyB0cnVlIHwgZmFsc2UgPSBmYWxzZT4oXG5cdFx0b3B0aW9ucz86IFNjcmliZU9wdGlvbnM8VCwgQ3VzdG9tT25seT4sXG5cdCk6IFNjcmliZU9wdGlvbnM8VCwgQ3VzdG9tT25seT4ge1xuXHRcdGNvbnN0IGxvZ0xldmVsID0gcmVzb2x2ZUxvZ0xldmVsKG9wdGlvbnM/LmxvZ0xldmVsKSA/PyBEZWZhdWx0TG9nTGV2ZWw7XG5cdFx0cmV0dXJuIHsgbG9nTGV2ZWwsIHJlZGFjdGlvbnM6IERlZmF1bHRSZWRhY3Rpb25zLCAuLi5vcHRpb25zIH07XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJzY3JpYmUiLCJsb2dnZXJQcm92aWRlciIsImluc3RhbmNlIiwibG9nZ2VyIiwibmFtZSIsImN1c3RvbUxldmVscyIsImdldExvZ2dlciIsImNvbmZpZ3VyZSIsImNvbmZpZ09wdGlvbnMiLCJleHRlbmQiLCJmbHVzaCIsImNiIiwiQ29uc29sZUFkYXB0ZXIiLCJkZWZhdWx0T3B0aW9ucyIsIm1lcmdlRGVmYXVsdHMiLCJhZGFwdGVyIiwib3B0aW9ucyIsImRlZmF1bHRzQW5kT3B0aW9ucyIsImN1cnJlbnRPcHRpb25zIiwic3VwcG9ydHNMZXZlbHMiLCJtaXNzaW5nTGV2ZWwiLCJPYmplY3QiLCJlbnRyaWVzIiwiZmluZCIsImtleSIsImxvZ0xldmVscyIsImF0IiwidG9TdHJpbmciLCJMb2dnaW5nQ29uZmlndXJhdGlvbkVycm9yIiwiSlNPTiIsInN0cmluZ2lmeSIsImxvZ0xldmVsIiwicmVzb2x2ZUxvZ0xldmVsIiwiRGVmYXVsdExvZ0xldmVsIiwicmVkYWN0aW9ucyIsIkRlZmF1bHRSZWRhY3Rpb25zIl0sIm1hcHBpbmdzIjoiOzs7OytCQWVhQTs7O2VBQUFBOzs7Z0NBZmtCO3FCQUNDO3dCQUNVO3VCQUc2QjtBQVVoRSxNQUFNQTtJQUNKQyxlQUE4QjtJQUN0QyxPQUFlQyxXQUFtQixJQUFJRixTQUFTO0lBRS9DLE9BQWNHLE9BQ2JDLElBQWEsRUFDYkMsWUFFQyxFQUN1QjtRQUN4QixPQUFPTCxPQUFPRSxRQUFRLENBQUNJLFNBQVMsQ0FBZ0JGLE1BQU1DO0lBSXZEO0lBRUEsT0FBY0UsVUFDYkMsYUFBa0QsRUFDakQ7UUFDRFIsT0FBT0UsUUFBUSxHQUFHLElBQUlGO1FBQ3RCLE9BQU9BLE9BQU9FLFFBQVEsQ0FBQ0ssU0FBUyxDQUFnQkM7SUFDakQ7SUFFQSxXQUFrQkMsU0FBUztRQUMxQixPQUFPVCxPQUFPRSxRQUFRO0lBQ3ZCO0lBRUEsT0FBY1EsTUFBTUMsRUFBZSxFQUFRO1FBQzFDWCxPQUFPRSxRQUFRLENBQUNELGNBQWMsQ0FBQ1MsS0FBSyxDQUFDQztJQUN0QztJQUVBLGFBQXFCO1FBQ3BCLDBDQUEwQztRQUMxQyxJQUFJLENBQUNWLGNBQWMsR0FBRyxJQUFJVyw4QkFBYztRQUN4QyxNQUFNQyxpQkFBaUIsSUFBSSxDQUFDQyxhQUFhO1FBQ3pDLElBQUksQ0FBQ2IsY0FBYyxDQUFDTSxTQUFTLENBQUNNO0lBQy9CO0lBRU9OLFVBQ05DLGFBQWtELEVBQ1A7UUFDM0MsTUFBTSxFQUFFTyxPQUFPLEVBQUVDLE9BQU8sRUFBRSxHQUFHUjtRQUM3QixJQUFJLENBQUNQLGNBQWMsR0FBR2M7UUFDdEIsTUFBTUUscUJBQXFCLElBQUksQ0FBQ0gsYUFBYSxDQUFnQkU7UUFDN0RELFFBQVFSLFNBQVMsQ0FBQ1U7UUFDbEIsT0FBTyxDQUFDYixPQUFrQlcsUUFBUVQsU0FBUyxDQUFDRjtJQUM3QztJQUVPRSxVQUNORixJQUFhLEVBQ2JDLFlBRUMsRUFDdUI7UUFDeEIsb0VBQW9FO1FBQ3BFLElBQUlBLGNBQWM7WUFDakIsTUFBTWEsaUJBQWlCLElBQUksQ0FBQ0osYUFBYSxDQUFDO2dCQUFFVDtZQUFhO1lBQ3pELElBQUksQ0FBQ0osY0FBYyxDQUFDTSxTQUFTLENBQUNXO1FBQy9CO1FBRUEsTUFBTWYsU0FBUyxJQUFJLENBQUNGLGNBQWMsQ0FBQ0ssU0FBUyxDQUFDRjtRQUM3QyxJQUFJLENBQUNlLGNBQWMsQ0FBQ2QsY0FBY0Y7UUFDbEMsT0FBT0E7SUFDUjtJQUVRZ0IsZUFDUGQsWUFFQyxFQUNERixNQUE2QixFQUM1QjtRQUNELElBQUksQ0FBQ0UsY0FBYztZQUNsQjtRQUNEO1FBRUEsTUFBTWUsZUFBZUMsT0FBT0MsT0FBTyxDQUFDakIsY0FBY2tCLElBQUksQ0FDckQsQ0FBQ0MsTUFBUSxDQUFDckIsT0FBT3NCLFNBQVMsQ0FBQ0QsSUFBSUUsRUFBRSxDQUFDLEdBQUdDLFFBQVEsR0FBRztRQUdqRCxJQUFJUCxnQkFBZ0IsTUFBTTtZQUN6QixNQUFNLElBQUlRLGlDQUF5QixDQUNsQyxDQUFDLG1EQUFtRCxFQUFFUixhQUFhLG9CQUFvQixFQUFFUyxLQUFLQyxTQUFTLENBQUMzQixPQUFPc0IsU0FBUyxHQUFHO1FBRTdIO1FBQ0EsT0FBTztZQUFFTDtRQUFhO0lBQ3ZCO0lBRVFOLGNBQ1BFLE9BQXNDLEVBQ1A7UUFDL0IsTUFBTWUsV0FBV0MsSUFBQUEsb0JBQWUsRUFBQ2hCLFNBQVNlLGFBQWFFLHNCQUFlO1FBQ3RFLE9BQU87WUFBRUY7WUFBVUcsWUFBWUMsd0JBQWlCO1lBQUUsR0FBR25CLE9BQU87UUFBQztJQUM5RDtBQUNEIn0=
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "redact", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return redact;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _types = require("./types.js");
|
|
12
|
+
function keysFromPaths(paths) {
|
|
13
|
+
const keys = new Set();
|
|
14
|
+
for (const path of paths){
|
|
15
|
+
const segments = path.split(".").filter((segment)=>segment.length > 0 && segment !== "*");
|
|
16
|
+
const key = segments.at(-1);
|
|
17
|
+
if (key != null) {
|
|
18
|
+
keys.add(key);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return keys;
|
|
22
|
+
}
|
|
23
|
+
function isPlainObject(value) {
|
|
24
|
+
if (value == null || typeof value !== "object" || Array.isArray(value) || value instanceof Error) {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
const proto = Object.getPrototypeOf(value);
|
|
28
|
+
return proto === Object.prototype || proto === null;
|
|
29
|
+
}
|
|
30
|
+
function object(value, keys, censor = _types.DefaultCensor, copies = new WeakMap()) {
|
|
31
|
+
if (value == null || typeof value !== "object") {
|
|
32
|
+
return value;
|
|
33
|
+
}
|
|
34
|
+
if (value instanceof Error) {
|
|
35
|
+
return value;
|
|
36
|
+
}
|
|
37
|
+
// A cycle in the input stays a cycle in the copy.
|
|
38
|
+
const copied = copies.get(value);
|
|
39
|
+
if (copied !== undefined) {
|
|
40
|
+
return copied;
|
|
41
|
+
}
|
|
42
|
+
if (Array.isArray(value)) {
|
|
43
|
+
const out = [];
|
|
44
|
+
copies.set(value, out);
|
|
45
|
+
for (const item of value){
|
|
46
|
+
out.push(object(item, keys, censor, copies));
|
|
47
|
+
}
|
|
48
|
+
return out;
|
|
49
|
+
}
|
|
50
|
+
if (!isPlainObject(value)) {
|
|
51
|
+
return value;
|
|
52
|
+
}
|
|
53
|
+
const out = {};
|
|
54
|
+
copies.set(value, out);
|
|
55
|
+
for (const [key, nested] of Object.entries(value)){
|
|
56
|
+
out[key] = keys.has(key) ? censor : object(nested, keys, censor, copies);
|
|
57
|
+
}
|
|
58
|
+
return out;
|
|
59
|
+
}
|
|
60
|
+
function fromOptions(options) {
|
|
61
|
+
return keysFromPaths(options?.paths ?? _types.DefaultRedactions.paths);
|
|
62
|
+
}
|
|
63
|
+
const redact = {
|
|
64
|
+
object,
|
|
65
|
+
keysFromPaths,
|
|
66
|
+
fromOptions
|
|
67
|
+
};
|