@decohere/scribe 0.0.1-dev.125 → 0.0.1-dev.13

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.
Files changed (40) hide show
  1. package/commonjs/src/console.adapter.js +14 -21
  2. package/commonjs/src/env.js +3 -2
  3. package/commonjs/src/errors.js +2 -0
  4. package/commonjs/src/index.js +2 -3
  5. package/commonjs/src/logger.adapter.js +6 -58
  6. package/commonjs/src/logger.factory.js +11 -112
  7. package/commonjs/src/logger.type.js +2 -0
  8. package/commonjs/src/testing/index.js +2 -14
  9. package/commonjs/src/types.js +6 -19
  10. package/es6/src/console.adapter.js +15 -22
  11. package/es6/src/env.js +4 -3
  12. package/es6/src/errors.js +2 -0
  13. package/es6/src/index.js +2 -3
  14. package/es6/src/logger.adapter.js +3 -45
  15. package/es6/src/logger.factory.js +11 -112
  16. package/es6/src/logger.type.js +2 -0
  17. package/es6/src/testing/index.js +3 -1
  18. package/es6/src/types.js +6 -16
  19. package/package.json +1 -15
  20. package/types/src/console.adapter.d.ts +0 -1
  21. package/types/src/env.d.ts +1 -1
  22. package/types/src/index.d.ts +0 -3
  23. package/types/src/logger.adapter.d.ts +1 -32
  24. package/types/src/logger.factory.d.ts +2 -31
  25. package/types/src/logger.type.d.ts +0 -5
  26. package/types/src/testing/index.d.ts +1 -1
  27. package/types/src/types.d.ts +0 -7
  28. package/LICENSE +0 -15
  29. package/commonjs/src/log-entry.adapter.js +0 -55
  30. package/commonjs/src/log-entry.js +0 -89
  31. package/commonjs/src/redact.js +0 -67
  32. package/commonjs/src/testing/capture.adapter.js +0 -23
  33. package/es6/src/log-entry.adapter.js +0 -49
  34. package/es6/src/log-entry.js +0 -79
  35. package/es6/src/redact.js +0 -57
  36. package/es6/src/testing/capture.adapter.js +0 -17
  37. package/types/src/log-entry.adapter.d.ts +0 -20
  38. package/types/src/log-entry.d.ts +0 -38
  39. package/types/src/redact.d.ts +0 -10
  40. package/types/src/testing/capture.adapter.d.ts +0 -14
@@ -1,53 +1,9 @@
1
1
  import { LogLevels } from "./types.js";
2
- export function formatError(err) {
3
- return err.stack ?? err.message;
4
- }
5
- /** How many causes deep `serializeError` follows by default. */ export const DefaultErrorCauseDepth = 3;
6
- /**
7
- * Plain-object form of an error for structured logs. An `Error` cause, or an
8
- * `Error` in another own property, is serialized the same way, up to
9
- * `causeDepth` levels; any other value is kept as it is.
10
- */ export function serializeError(err, causeDepth = DefaultErrorCauseDepth) {
11
- const out = {
12
- name: err.name,
13
- message: err.message
14
- };
15
- if (err.stack != null) {
16
- out.stack = err.stack;
17
- }
18
- for (const [key, value] of Object.entries(err)){
19
- if (key === "cause" || key in out) {
20
- continue;
21
- }
22
- if (!(value instanceof Error)) {
23
- out[key] = value;
24
- } else if (causeDepth > 0) {
25
- out[key] = serializeError(value, causeDepth - 1);
26
- }
27
- }
28
- const { cause } = err;
29
- if (cause instanceof Error) {
30
- if (causeDepth > 0) {
31
- out.cause = serializeError(cause, causeDepth - 1);
32
- }
33
- } else if (cause !== undefined) {
34
- out.cause = cause;
35
- }
36
- return out;
37
- }
38
2
  export class LogAdapter {
39
3
  flush(cb) {
40
4
  cb?.();
41
5
  }
42
- retire() {
43
- // Console / no-op adapters have nothing to release.
44
- }
45
- async stop() {
46
- await this[Symbol.asyncDispose]();
47
- }
48
- async [Symbol.asyncDispose]() {
49
- // Console / no-op adapters have nothing to release.
50
- }
6
+ // biome-ignore lint/suspicious/noExplicitAny: Generic utility method needs flexible typing
51
7
  getLogLevels(options) {
52
8
  const { customOnly, customLevels } = options;
53
9
  if (customOnly) {
@@ -64,3 +20,5 @@ export class LogAdapter {
64
20
  return unique;
65
21
  }
66
22
  }
23
+
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL3NjcmliZS9zY3JpYmUvc3JjL2xvZ2dlci5hZGFwdGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgTG9nZ2VyIH0gZnJvbSBcIi4vbG9nZ2VyLnR5cGUuanNcIjtcbmltcG9ydCB7IExvZ0xldmVscywgdHlwZSBTY3JpYmVPcHRpb25zIH0gZnJvbSBcIi4vdHlwZXMuanNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBMb2dnZXJBZGFwdGVyIHtcblx0Y29uZmlndXJlPFQgZXh0ZW5kcyBzdHJpbmcgPSBuZXZlciwgQ3VzdG9tT25seSBleHRlbmRzIHRydWUgfCBmYWxzZSA9IGZhbHNlPihcblx0XHRvcHRpb25zOiBTY3JpYmVPcHRpb25zPFQsIEN1c3RvbU9ubHk+LFxuXHQpO1xuXHRnZXRMb2dnZXI8VCBleHRlbmRzIHN0cmluZyA9IG5ldmVyLCBDdXN0b21Pbmx5IGV4dGVuZHMgdHJ1ZSB8IGZhbHNlID0gZmFsc2U+KFxuXHRcdG5hbWU6IHN0cmluZyxcblx0KTogTG9nZ2VyPFQsIEN1c3RvbU9ubHk+O1xuXHRmbHVzaChjYj86ICgpID0+IHZvaWQpOiB2b2lkO1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTG9nQWRhcHRlciBpbXBsZW1lbnRzIExvZ2dlckFkYXB0ZXIge1xuXHRwdWJsaWMgYWJzdHJhY3QgY29uZmlndXJlPFQgZXh0ZW5kcyBzdHJpbmcgPSBuZXZlciwgQ3VzdG9tT25seSBleHRlbmRzIHRydWUgfCBmYWxzZSA9IGZhbHNlPihcblx0XHRvcHRpb25zOiBTY3JpYmVPcHRpb25zPFQsIEN1c3RvbU9ubHk+LFxuXHQpO1xuXG5cdHB1YmxpYyBhYnN0cmFjdCBnZXRMb2dnZXI8VCBleHRlbmRzIHN0cmluZyA9IG5ldmVyLCBDdXN0b21Pbmx5IGV4dGVuZHMgdHJ1ZSB8IGZhbHNlID0gZmFsc2U+KFxuXHRcdG5hbWU6IHN0cmluZyxcblx0KTogTG9nZ2VyPFQsIEN1c3RvbU9ubHk+O1xuXG5cdHB1YmxpYyBmbHVzaChjYj86ICgpID0+IHZvaWQpOiB2b2lkIHtcblx0XHRjYj8uKCk7XG5cdH1cblxuXHQvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IEdlbmVyaWMgdXRpbGl0eSBtZXRob2QgbmVlZHMgZmxleGlibGUgdHlwaW5nXG5cdHByb3RlY3RlZCBnZXRMb2dMZXZlbHMob3B0aW9uczogU2NyaWJlT3B0aW9uczxhbnksIGFueT4pOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+IHtcblx0XHRjb25zdCB7IGN1c3RvbU9ubHksIGN1c3RvbUxldmVscyB9ID0gb3B0aW9ucztcblx0XHRpZiAoY3VzdG9tT25seSkge1xuXHRcdFx0cmV0dXJuIGN1c3RvbUxldmVscztcblx0XHR9XG5cdFx0Y29uc3QgbGV2ZWxzID0gdGhpcy5nZXRVbmlxdWVMZXZlbHMoTG9nTGV2ZWxzLCBjdXN0b21MZXZlbHMpO1xuXHRcdHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMobGV2ZWxzKTtcblx0fVxuXG5cdHByb3RlY3RlZCBnZXRVbmlxdWVMZXZlbHMoXG5cdFx0ZGVmYXVsdExldmVsczogUmVjb3JkPHN0cmluZywgbnVtYmVyPixcblx0XHRjdXN0b21MZXZlbHM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4sXG5cdCkge1xuXHRcdGNvbnN0IGRlZmF1bHRFbnRyaWVzID0gT2JqZWN0LmVudHJpZXMoZGVmYXVsdExldmVscyA/PyB7fSk7XG5cdFx0Y29uc3QgY3VzdG9tRW50cmllcyA9IE9iamVjdC5lbnRyaWVzKGN1c3RvbUxldmVscyA/PyB7fSk7XG5cdFx0Y29uc3QgZGVmYXVsdE5vdEluQ3VzdG9tID0gZGVmYXVsdEVudHJpZXMuZmlsdGVyKFxuXHRcdFx0KFtka10pID0+IGN1c3RvbUVudHJpZXMuZmluZEluZGV4KChbY2tdKSA9PiBjayA9PT0gZGspID09PSAtMSxcblx0XHQpO1xuXG5cdFx0Y29uc3QgdW5pcXVlID0gZGVmYXVsdE5vdEluQ3VzdG9tLmNvbmNhdChjdXN0b21FbnRyaWVzKTtcblx0XHRyZXR1cm4gdW5pcXVlO1xuXHR9XG59XG4iXSwibmFtZXMiOlsiTG9nTGV2ZWxzIiwiTG9nQWRhcHRlciIsImZsdXNoIiwiY2IiLCJnZXRMb2dMZXZlbHMiLCJvcHRpb25zIiwiY3VzdG9tT25seSIsImN1c3RvbUxldmVscyIsImxldmVscyIsImdldFVuaXF1ZUxldmVscyIsIk9iamVjdCIsImZyb21FbnRyaWVzIiwiZGVmYXVsdExldmVscyIsImRlZmF1bHRFbnRyaWVzIiwiZW50cmllcyIsImN1c3RvbUVudHJpZXMiLCJkZWZhdWx0Tm90SW5DdXN0b20iLCJmaWx0ZXIiLCJkayIsImZpbmRJbmRleCIsImNrIiwidW5pcXVlIiwiY29uY2F0Il0sIm1hcHBpbmdzIjoiQUFDQSxTQUFTQSxTQUFTLFFBQTRCLGFBQWE7QUFZM0QsT0FBTyxNQUFlQztJQVNkQyxNQUFNQyxFQUFlLEVBQVE7UUFDbkNBO0lBQ0Q7SUFFQSwyRkFBMkY7SUFDakZDLGFBQWFDLE9BQWdDLEVBQTBCO1FBQ2hGLE1BQU0sRUFBRUMsVUFBVSxFQUFFQyxZQUFZLEVBQUUsR0FBR0Y7UUFDckMsSUFBSUMsWUFBWTtZQUNmLE9BQU9DO1FBQ1I7UUFDQSxNQUFNQyxTQUFTLElBQUksQ0FBQ0MsZUFBZSxDQUFDVCxXQUFXTztRQUMvQyxPQUFPRyxPQUFPQyxXQUFXLENBQUNIO0lBQzNCO0lBRVVDLGdCQUNURyxhQUFxQyxFQUNyQ0wsWUFBb0MsRUFDbkM7UUFDRCxNQUFNTSxpQkFBaUJILE9BQU9JLE9BQU8sQ0FBQ0YsaUJBQWlCLENBQUM7UUFDeEQsTUFBTUcsZ0JBQWdCTCxPQUFPSSxPQUFPLENBQUNQLGdCQUFnQixDQUFDO1FBQ3RELE1BQU1TLHFCQUFxQkgsZUFBZUksTUFBTSxDQUMvQyxDQUFDLENBQUNDLEdBQUcsR0FBS0gsY0FBY0ksU0FBUyxDQUFDLENBQUMsQ0FBQ0MsR0FBRyxHQUFLQSxPQUFPRixRQUFRLENBQUM7UUFHN0QsTUFBTUcsU0FBU0wsbUJBQW1CTSxNQUFNLENBQUNQO1FBQ3pDLE9BQU9NO0lBQ1I7QUFDRCJ9
@@ -1,81 +1,23 @@
1
1
  import { ConsoleAdapter } from "./console.adapter.js";
2
2
  import { resolveLogLevel } from "./env.js";
3
3
  import { LoggingConfigurationError } from "./errors.js";
4
- import { logEntry } from "./log-entry.js";
5
4
  import { DefaultLogLevel, DefaultRedactions } from "./types.js";
6
5
  export class scribe {
7
6
  loggerProvider;
8
- /** True after `configure({ adapter })` — the constructor’s ConsoleAdapter is only a fallback. */ adapterConfigured = false;
9
- defaultAdapterWarned = false;
10
- tap;
11
7
  static instance = new scribe();
12
8
  static logger(name, customLevels) {
13
- // Apply custom levels once against the active adapter; the live handle
14
- // re-resolves the underlying logger on each use.
15
- if (customLevels) {
16
- scribe.instance.getLogger(name, customLevels);
17
- }
18
- return scribe.createLiveLogger(name);
9
+ return scribe.instance.getLogger(name, customLevels);
19
10
  }
20
11
  static configure(configOptions) {
21
- const previous = scribe.instance;
22
- // Sync: stop writes into the old ThreadStream before a new worker starts.
23
- previous.retire();
24
12
  scribe.instance = new scribe();
25
- scribe.instance.configure(configOptions);
26
- // Async drain of the retired adapter (flush / end). Flux/App.dispose may
27
- // have already done this; reconfigure without stop still needs it.
28
- void previous.stop();
29
- return (name)=>scribe.logger(name);
13
+ return scribe.instance.configure(configOptions);
14
+ }
15
+ static get extend() {
16
+ return scribe.instance;
30
17
  }
31
18
  static flush(cb) {
32
19
  scribe.instance.loggerProvider.flush(cb);
33
20
  }
34
- /** Synchronously stop accepting writes on the active adapter. */ static retire() {
35
- scribe.instance.retire();
36
- }
37
- /** Drain the active adapter and release workers / destinations. */ static async stop() {
38
- await scribe.instance.stop();
39
- }
40
- /**
41
- * Module-level `const log = scribe.logger(...)` must follow a later
42
- * `scribe.configure()` (CLI / Flux / HotReloadServer). Forward every use to
43
- * the active adapter logger for `name`, and `child(fields)` to a live handle
44
- * that adds `bindings`, so children follow a reconfigure too.
45
- */ static createLiveLogger(name, bindings = {}) {
46
- const bound = Object.keys(bindings).length > 0;
47
- const resolve = ()=>{
48
- const root = scribe.instance.getLogger(name);
49
- return bound ? root.child(bindings) : root;
50
- };
51
- return new Proxy({}, {
52
- get (_target, prop) {
53
- if (prop === "child") {
54
- return (fields)=>scribe.createLiveLogger(name, {
55
- ...bindings,
56
- ...fields
57
- });
58
- }
59
- const underlying = resolve();
60
- const value = Reflect.get(underlying, prop, underlying);
61
- if (typeof value !== "function") {
62
- return value;
63
- }
64
- const method = value.bind(underlying);
65
- const instance = scribe.instance;
66
- if (instance.tap == null || typeof prop !== "string" || !Object.hasOwn(underlying.logLevels, prop) || !underlying.isLevelEnabled(prop)) {
67
- return method;
68
- }
69
- return (...args)=>{
70
- method(...args);
71
- instance.notifyTap(prop, name ?? "default", args, bindings);
72
- };
73
- },
74
- has (_target, prop) {
75
- return Reflect.has(resolve(), prop);
76
- }
77
- });
78
- }
79
21
  constructor(){
80
22
  // Initialize with default console adapter
81
23
  this.loggerProvider = new ConsoleAdapter();
@@ -83,32 +25,13 @@ export class scribe {
83
25
  this.loggerProvider.configure(defaultOptions);
84
26
  }
85
27
  configure(configOptions) {
86
- const { adapter, options, tap } = configOptions;
87
- const previous = this.loggerProvider;
88
- if (previous !== adapter) {
89
- previous.retire();
90
- }
28
+ const { adapter, options } = configOptions;
91
29
  this.loggerProvider = adapter;
92
- this.adapterConfigured = true;
93
- this.tap = tap;
94
30
  const defaultsAndOptions = this.mergeDefaults(options);
95
31
  adapter.configure(defaultsAndOptions);
96
- if (previous !== adapter) {
97
- void previous.stop();
98
- }
99
- return (name)=>scribe.logger(name);
100
- }
101
- retire() {
102
- this.loggerProvider.retire();
103
- }
104
- async stop() {
105
- await this.loggerProvider.stop();
106
- }
107
- async [Symbol.asyncDispose]() {
108
- await this.stop();
32
+ return (name)=>adapter.getLogger(name);
109
33
  }
110
34
  getLogger(name, customLevels) {
111
- this.warnIfDefaultAdapter();
112
35
  // If custom levels are provided, we need to reconfigure the adapter
113
36
  if (customLevels) {
114
37
  const currentOptions = this.mergeDefaults({
@@ -120,30 +43,6 @@ export class scribe {
120
43
  this.supportsLevels(customLevels, logger);
121
44
  return logger;
122
45
  }
123
- notifyTap(level, name, args, bindings) {
124
- const tap = this.tap;
125
- if (tap == null) {
126
- return;
127
- }
128
- try {
129
- tap(logEntry.from(level, name, args, {
130
- bindings
131
- }));
132
- } catch (err) {
133
- // Not swallowed: the logging call returns, the runtime reports the tap's error.
134
- queueMicrotask(()=>{
135
- throw err;
136
- });
137
- }
138
- }
139
- warnIfDefaultAdapter() {
140
- if (this.adapterConfigured || this.defaultAdapterWarned) {
141
- return;
142
- }
143
- this.defaultAdapterWarned = true;
144
- // console.warn, not the stderr stream: the facade runs in browsers and Workers too.
145
- 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");
146
- }
147
46
  supportsLevels(customLevels, logger) {
148
47
  if (!customLevels) {
149
48
  return;
@@ -158,12 +57,12 @@ export class scribe {
158
57
  }
159
58
  mergeDefaults(options) {
160
59
  const logLevel = resolveLogLevel(options?.logLevel) ?? DefaultLogLevel;
161
- // Resolved logLevel must win over options spread (invalid explicit values
162
- // would otherwise stick).
163
60
  return {
61
+ logLevel,
164
62
  redactions: DefaultRedactions,
165
- ...options,
166
- logLevel
63
+ ...options
167
64
  };
168
65
  }
169
66
  }
67
+
68
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL3NjcmliZS9zY3JpYmUvc3JjL2xvZ2dlci5mYWN0b3J5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbnNvbGVBZGFwdGVyIH0gZnJvbSBcIi4vY29uc29sZS5hZGFwdGVyLmpzXCI7XG5pbXBvcnQgeyByZXNvbHZlTG9nTGV2ZWwgfSBmcm9tIFwiLi9lbnYuanNcIjtcbmltcG9ydCB7IExvZ2dpbmdDb25maWd1cmF0aW9uRXJyb3IgfSBmcm9tIFwiLi9lcnJvcnMuanNcIjtcbmltcG9ydCB0eXBlIHsgTG9nZ2VyQWRhcHRlciB9IGZyb20gXCIuL2xvZ2dlci5hZGFwdGVyLmpzXCI7XG5pbXBvcnQgdHlwZSB7IExvZ2dlciB9IGZyb20gXCIuL2xvZ2dlci50eXBlLmpzXCI7XG5pbXBvcnQgeyBEZWZhdWx0TG9nTGV2ZWwsIERlZmF1bHRSZWRhY3Rpb25zLCB0eXBlIFNjcmliZU9wdGlvbnMgfSBmcm9tIFwiLi90eXBlcy5qc1wiO1xuXG50eXBlIExvZ2dlckZhY3RvcnlPcHRpb25zPFxuXHRUIGV4dGVuZHMgc3RyaW5nID0gbmV2ZXIsXG5cdEN1c3RvbU9ubHkgZXh0ZW5kcyB0cnVlIHwgZmFsc2UgPSBmYWxzZSxcbj4gPSB7XG5cdG9wdGlvbnM/OiBTY3JpYmVPcHRpb25zPFQsIEN1c3RvbU9ubHk+O1xuXHRhZGFwdGVyOiBMb2dnZXJBZGFwdGVyO1xufTtcblxuZXhwb3J0IGNsYXNzIHNjcmliZSB7XG5cdHByaXZhdGUgbG9nZ2VyUHJvdmlkZXI6IExvZ2dlckFkYXB0ZXI7XG5cdHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBzY3JpYmUgPSBuZXcgc2NyaWJlKCk7XG5cblx0cHVibGljIHN0YXRpYyBsb2dnZXI8VCBleHRlbmRzIHN0cmluZyA9IG5ldmVyLCBDdXN0b21Pbmx5IGV4dGVuZHMgdHJ1ZSB8IGZhbHNlID0gZmFsc2U+KFxuXHRcdG5hbWU/OiBzdHJpbmcsXG5cdFx0Y3VzdG9tTGV2ZWxzPzoge1xuXHRcdFx0W2xldmVsIGluIFRdOiBudW1iZXI7XG5cdFx0fSxcblx0KTogTG9nZ2VyPFQsIEN1c3RvbU9ubHk+IHtcblx0XHRyZXR1cm4gc2NyaWJlLmluc3RhbmNlLmdldExvZ2dlcjxULCBDdXN0b21Pbmx5PihuYW1lLCBjdXN0b21MZXZlbHMpIGFzIExvZ2dlcjxcblx0XHRcdFQsXG5cdFx0XHRDdXN0b21Pbmx5XG5cdFx0Pjtcblx0fVxuXG5cdHB1YmxpYyBzdGF0aWMgY29uZmlndXJlPFQgZXh0ZW5kcyBzdHJpbmcgPSBuZXZlciwgQ3VzdG9tT25seSBleHRlbmRzIHRydWUgfCBmYWxzZSA9IGZhbHNlPihcblx0XHRjb25maWdPcHRpb25zOiBMb2dnZXJGYWN0b3J5T3B0aW9uczxULCBDdXN0b21Pbmx5Pixcblx0KSB7XG5cdFx0c2NyaWJlLmluc3RhbmNlID0gbmV3IHNjcmliZSgpO1xuXHRcdHJldHVybiBzY3JpYmUuaW5zdGFuY2UuY29uZmlndXJlPFQsIEN1c3RvbU9ubHk+KGNvbmZpZ09wdGlvbnMpO1xuXHR9XG5cblx0cHVibGljIHN0YXRpYyBnZXQgZXh0ZW5kKCkge1xuXHRcdHJldHVybiBzY3JpYmUuaW5zdGFuY2U7XG5cdH1cblxuXHRwdWJsaWMgc3RhdGljIGZsdXNoKGNiPzogKCkgPT4gdm9pZCk6IHZvaWQge1xuXHRcdHNjcmliZS5pbnN0YW5jZS5sb2dnZXJQcm92aWRlci5mbHVzaChjYik7XG5cdH1cblxuXHRwdWJsaWMgY29uc3RydWN0b3IoKSB7XG5cdFx0Ly8gSW5pdGlhbGl6ZSB3aXRoIGRlZmF1bHQgY29uc29sZSBhZGFwdGVyXG5cdFx0dGhpcy5sb2dnZXJQcm92aWRlciA9IG5ldyBDb25zb2xlQWRhcHRlcigpO1xuXHRcdGNvbnN0IGRlZmF1bHRPcHRpb25zID0gdGhpcy5tZXJnZURlZmF1bHRzKCk7XG5cdFx0dGhpcy5sb2dnZXJQcm92aWRlci5jb25maWd1cmUoZGVmYXVsdE9wdGlvbnMpO1xuXHR9XG5cblx0cHVibGljIGNvbmZpZ3VyZTxUIGV4dGVuZHMgc3RyaW5nID0gbmV2ZXIsIEN1c3RvbU9ubHkgZXh0ZW5kcyB0cnVlIHwgZmFsc2UgPSBmYWxzZT4oXG5cdFx0Y29uZmlnT3B0aW9uczogTG9nZ2VyRmFjdG9yeU9wdGlvbnM8VCwgQ3VzdG9tT25seT4sXG5cdCk6IChuYW1lPzogc3RyaW5nKSA9PiBMb2dnZXI8VCwgQ3VzdG9tT25seT4ge1xuXHRcdGNvbnN0IHsgYWRhcHRlciwgb3B0aW9ucyB9ID0gY29uZmlnT3B0aW9ucztcblx0XHR0aGlzLmxvZ2dlclByb3ZpZGVyID0gYWRhcHRlcjtcblx0XHRjb25zdCBkZWZhdWx0c0FuZE9wdGlvbnMgPSB0aGlzLm1lcmdlRGVmYXVsdHM8VCwgQ3VzdG9tT25seT4ob3B0aW9ucyk7XG5cdFx0YWRhcHRlci5jb25maWd1cmUoZGVmYXVsdHNBbmRPcHRpb25zKTtcblx0XHRyZXR1cm4gKG5hbWU/OiBzdHJpbmcpID0+IGFkYXB0ZXIuZ2V0TG9nZ2VyKG5hbWUpIGFzIExvZ2dlcjxULCBDdXN0b21Pbmx5Pjtcblx0fVxuXG5cdHB1YmxpYyBnZXRMb2dnZXI8VCBleHRlbmRzIHN0cmluZyA9IG5ldmVyLCBDdXN0b21Pbmx5IGV4dGVuZHMgdHJ1ZSB8IGZhbHNlID0gZmFsc2U+KFxuXHRcdG5hbWU/OiBzdHJpbmcsXG5cdFx0Y3VzdG9tTGV2ZWxzPzoge1xuXHRcdFx0W2xldmVsIGluIFRdOiBudW1iZXI7XG5cdFx0fSxcblx0KTogTG9nZ2VyPFQsIEN1c3RvbU9ubHk+IHtcblx0XHQvLyBJZiBjdXN0b20gbGV2ZWxzIGFyZSBwcm92aWRlZCwgd2UgbmVlZCB0byByZWNvbmZpZ3VyZSB0aGUgYWRhcHRlclxuXHRcdGlmIChjdXN0b21MZXZlbHMpIHtcblx0XHRcdGNvbnN0IGN1cnJlbnRPcHRpb25zID0gdGhpcy5tZXJnZURlZmF1bHRzKHsgY3VzdG9tTGV2ZWxzIH0pO1xuXHRcdFx0dGhpcy5sb2dnZXJQcm92aWRlci5jb25maWd1cmUoY3VycmVudE9wdGlvbnMpO1xuXHRcdH1cblxuXHRcdGNvbnN0IGxvZ2dlciA9IHRoaXMubG9nZ2VyUHJvdmlkZXIuZ2V0TG9nZ2VyKG5hbWUpIGFzIExvZ2dlcjxULCBDdXN0b21Pbmx5Pjtcblx0XHR0aGlzLnN1cHBvcnRzTGV2ZWxzKGN1c3RvbUxldmVscywgbG9nZ2VyKTtcblx0XHRyZXR1cm4gbG9nZ2VyO1xuXHR9XG5cblx0cHJpdmF0ZSBzdXBwb3J0c0xldmVsczxUIGV4dGVuZHMgc3RyaW5nID0gbmV2ZXIsIEN1c3RvbU9ubHkgZXh0ZW5kcyB0cnVlID0gdW5kZWZpbmVkPihcblx0XHRjdXN0b21MZXZlbHM6IHtcblx0XHRcdFtsZXZlbCBpbiBUXTogbnVtYmVyO1xuXHRcdH0sXG5cdFx0bG9nZ2VyOiBMb2dnZXI8VCwgQ3VzdG9tT25seT4sXG5cdCkge1xuXHRcdGlmICghY3VzdG9tTGV2ZWxzKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgbWlzc2luZ0xldmVsID0gT2JqZWN0LmVudHJpZXMoY3VzdG9tTGV2ZWxzKS5maW5kKFxuXHRcdFx0KGtleSkgPT4gIWxvZ2dlci5sb2dMZXZlbHNba2V5LmF0KDApLnRvU3RyaW5nKCldLFxuXHRcdCk7XG5cblx0XHRpZiAobWlzc2luZ0xldmVsICE9IG51bGwpIHtcblx0XHRcdHRocm93IG5ldyBMb2dnaW5nQ29uZmlndXJhdGlvbkVycm9yKFxuXHRcdFx0XHRgQ3VycmVudCBsb2dnZXIgd2FzIG5vdCBjb25maWd1cmVkIGZvciBjdXN0b20gbGV2ZWwgJHttaXNzaW5nTGV2ZWx9LCB2YWxpZCBsZXZlbHMgYXJlOiAke0pTT04uc3RyaW5naWZ5KGxvZ2dlci5sb2dMZXZlbHMpfWAsXG5cdFx0XHQpO1xuXHRcdH1cblx0XHRyZXR1cm4geyBtaXNzaW5nTGV2ZWwgfTtcblx0fVxuXG5cdHByaXZhdGUgbWVyZ2VEZWZhdWx0czxUIGV4dGVuZHMgc3RyaW5nID0gbmV2ZXIsIEN1c3RvbU9ubHkgZXh0ZW5kcyB0cnVlIHwgZmFsc2UgPSBmYWxzZT4oXG5cdFx0b3B0aW9ucz86IFNjcmliZU9wdGlvbnM8VCwgQ3VzdG9tT25seT4sXG5cdCk6IFNjcmliZU9wdGlvbnM8VCwgQ3VzdG9tT25seT4ge1xuXHRcdGNvbnN0IGxvZ0xldmVsID0gcmVzb2x2ZUxvZ0xldmVsKG9wdGlvbnM/LmxvZ0xldmVsKSA/PyBEZWZhdWx0TG9nTGV2ZWw7XG5cdFx0cmV0dXJuIHsgbG9nTGV2ZWwsIHJlZGFjdGlvbnM6IERlZmF1bHRSZWRhY3Rpb25zLCAuLi5vcHRpb25zIH07XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJDb25zb2xlQWRhcHRlciIsInJlc29sdmVMb2dMZXZlbCIsIkxvZ2dpbmdDb25maWd1cmF0aW9uRXJyb3IiLCJEZWZhdWx0TG9nTGV2ZWwiLCJEZWZhdWx0UmVkYWN0aW9ucyIsInNjcmliZSIsImxvZ2dlclByb3ZpZGVyIiwiaW5zdGFuY2UiLCJsb2dnZXIiLCJuYW1lIiwiY3VzdG9tTGV2ZWxzIiwiZ2V0TG9nZ2VyIiwiY29uZmlndXJlIiwiY29uZmlnT3B0aW9ucyIsImV4dGVuZCIsImZsdXNoIiwiY2IiLCJkZWZhdWx0T3B0aW9ucyIsIm1lcmdlRGVmYXVsdHMiLCJhZGFwdGVyIiwib3B0aW9ucyIsImRlZmF1bHRzQW5kT3B0aW9ucyIsImN1cnJlbnRPcHRpb25zIiwic3VwcG9ydHNMZXZlbHMiLCJtaXNzaW5nTGV2ZWwiLCJPYmplY3QiLCJlbnRyaWVzIiwiZmluZCIsImtleSIsImxvZ0xldmVscyIsImF0IiwidG9TdHJpbmciLCJKU09OIiwic3RyaW5naWZ5IiwibG9nTGV2ZWwiLCJyZWRhY3Rpb25zIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxjQUFjLFFBQVEsdUJBQXVCO0FBQ3RELFNBQVNDLGVBQWUsUUFBUSxXQUFXO0FBQzNDLFNBQVNDLHlCQUF5QixRQUFRLGNBQWM7QUFHeEQsU0FBU0MsZUFBZSxFQUFFQyxpQkFBaUIsUUFBNEIsYUFBYTtBQVVwRixPQUFPLE1BQU1DO0lBQ0pDLGVBQThCO0lBQ3RDLE9BQWVDLFdBQW1CLElBQUlGLFNBQVM7SUFFL0MsT0FBY0csT0FDYkMsSUFBYSxFQUNiQyxZQUVDLEVBQ3VCO1FBQ3hCLE9BQU9MLE9BQU9FLFFBQVEsQ0FBQ0ksU0FBUyxDQUFnQkYsTUFBTUM7SUFJdkQ7SUFFQSxPQUFjRSxVQUNiQyxhQUFrRCxFQUNqRDtRQUNEUixPQUFPRSxRQUFRLEdBQUcsSUFBSUY7UUFDdEIsT0FBT0EsT0FBT0UsUUFBUSxDQUFDSyxTQUFTLENBQWdCQztJQUNqRDtJQUVBLFdBQWtCQyxTQUFTO1FBQzFCLE9BQU9ULE9BQU9FLFFBQVE7SUFDdkI7SUFFQSxPQUFjUSxNQUFNQyxFQUFlLEVBQVE7UUFDMUNYLE9BQU9FLFFBQVEsQ0FBQ0QsY0FBYyxDQUFDUyxLQUFLLENBQUNDO0lBQ3RDO0lBRUEsYUFBcUI7UUFDcEIsMENBQTBDO1FBQzFDLElBQUksQ0FBQ1YsY0FBYyxHQUFHLElBQUlOO1FBQzFCLE1BQU1pQixpQkFBaUIsSUFBSSxDQUFDQyxhQUFhO1FBQ3pDLElBQUksQ0FBQ1osY0FBYyxDQUFDTSxTQUFTLENBQUNLO0lBQy9CO0lBRU9MLFVBQ05DLGFBQWtELEVBQ1A7UUFDM0MsTUFBTSxFQUFFTSxPQUFPLEVBQUVDLE9BQU8sRUFBRSxHQUFHUDtRQUM3QixJQUFJLENBQUNQLGNBQWMsR0FBR2E7UUFDdEIsTUFBTUUscUJBQXFCLElBQUksQ0FBQ0gsYUFBYSxDQUFnQkU7UUFDN0RELFFBQVFQLFNBQVMsQ0FBQ1M7UUFDbEIsT0FBTyxDQUFDWixPQUFrQlUsUUFBUVIsU0FBUyxDQUFDRjtJQUM3QztJQUVPRSxVQUNORixJQUFhLEVBQ2JDLFlBRUMsRUFDdUI7UUFDeEIsb0VBQW9FO1FBQ3BFLElBQUlBLGNBQWM7WUFDakIsTUFBTVksaUJBQWlCLElBQUksQ0FBQ0osYUFBYSxDQUFDO2dCQUFFUjtZQUFhO1lBQ3pELElBQUksQ0FBQ0osY0FBYyxDQUFDTSxTQUFTLENBQUNVO1FBQy9CO1FBRUEsTUFBTWQsU0FBUyxJQUFJLENBQUNGLGNBQWMsQ0FBQ0ssU0FBUyxDQUFDRjtRQUM3QyxJQUFJLENBQUNjLGNBQWMsQ0FBQ2IsY0FBY0Y7UUFDbEMsT0FBT0E7SUFDUjtJQUVRZSxlQUNQYixZQUVDLEVBQ0RGLE1BQTZCLEVBQzVCO1FBQ0QsSUFBSSxDQUFDRSxjQUFjO1lBQ2xCO1FBQ0Q7UUFFQSxNQUFNYyxlQUFlQyxPQUFPQyxPQUFPLENBQUNoQixjQUFjaUIsSUFBSSxDQUNyRCxDQUFDQyxNQUFRLENBQUNwQixPQUFPcUIsU0FBUyxDQUFDRCxJQUFJRSxFQUFFLENBQUMsR0FBR0MsUUFBUSxHQUFHO1FBR2pELElBQUlQLGdCQUFnQixNQUFNO1lBQ3pCLE1BQU0sSUFBSXRCLDBCQUNULENBQUMsbURBQW1ELEVBQUVzQixhQUFhLG9CQUFvQixFQUFFUSxLQUFLQyxTQUFTLENBQUN6QixPQUFPcUIsU0FBUyxHQUFHO1FBRTdIO1FBQ0EsT0FBTztZQUFFTDtRQUFhO0lBQ3ZCO0lBRVFOLGNBQ1BFLE9BQXNDLEVBQ1A7UUFDL0IsTUFBTWMsV0FBV2pDLGdCQUFnQm1CLFNBQVNjLGFBQWEvQjtRQUN2RCxPQUFPO1lBQUUrQjtZQUFVQyxZQUFZL0I7WUFBbUIsR0FBR2dCLE9BQU87UUFBQztJQUM5RDtBQUNEIn0=
@@ -1 +1,3 @@
1
1
  export { };
2
+
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL3NjcmliZS9zY3JpYmUvc3JjL2xvZ2dlci50eXBlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgRGVmYXVsdExldmVscyB9IGZyb20gXCIuL3R5cGVzLmpzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZUxvZ2dlciB7XG5cdGdldCBjdXJyZW50TGV2ZWwoKTogc3RyaW5nO1xuXHRnZXQgbG9nTGV2ZWxzKCk6IFJlY29yZDxzdHJpbmcsIG51bWJlcj47XG59XG5cbmV4cG9ydCB0eXBlIExvZ0ZuID0gKG1zZzogc3RyaW5nIHwgbnVtYmVyIHwgb2JqZWN0LCAuLi5hcmdzOiB1bmtub3duW10pID0+IHZvaWQ7XG5cbmV4cG9ydCB0eXBlIExvZ2dlcjxcblx0Q3VzdG9tTGV2ZWxzIGV4dGVuZHMgc3RyaW5nID0gbmV2ZXIsXG5cdEN1c3RvbU9ubHkgZXh0ZW5kcyB0cnVlIHwgZmFsc2UgPSB1bmRlZmluZWQsXG4+ID0ge1xuXHRbSyBpbiBEZWZhdWx0TGV2ZWxzIGFzIEN1c3RvbU9ubHkgZXh0ZW5kcyBmYWxzZSA/IEsgOiBuZXZlcl06IExvZ0ZuO1xufSAmIHtcblx0W1Byb3BlcnR5IGluIEN1c3RvbUxldmVsc106IExvZ0ZuO1xufSAmIHtcblx0aXNMZXZlbEVuYWJsZWQobGV2ZWw6IHN0cmluZyk6IGJvb2xlYW47XG59ICYgQmFzZUxvZ2dlcjtcbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFTQSxXQVNlIn0=
@@ -1 +1,3 @@
1
- export * from "./capture.adapter.js";
1
+ export { };
2
+
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL3NjcmliZS9zY3JpYmUvc3JjL3Rlc3RpbmcvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHt9O1xuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFdBQVUifQ==
package/es6/src/types.js CHANGED
@@ -15,21 +15,11 @@ export const LogLevels = {
15
15
  trace: 10
16
16
  };
17
17
  export const DefaultLogLevel = "info";
18
- /** Pino's default censor. ConsoleAdapter uses the same placeholder. */ export const DefaultCensor = "[Redacted]";
19
- /**
20
- * Object keys Scribe redacts. Adapters apply this list — Pino via `redact.paths`
21
- * (top-level and one nest), ConsoleAdapter via `redact.object`.
22
- */ export const DefaultRedactionKeys = [
23
- "password",
24
- "secret",
25
- "token",
26
- "otp",
27
- "pw",
28
- "userconfig"
29
- ];
30
18
  export const DefaultRedactions = {
31
- paths: DefaultRedactionKeys.flatMap((key)=>[
32
- key,
33
- `*.${key}`
34
- ])
19
+ paths: [
20
+ "*.password",
21
+ "*.secret"
22
+ ]
35
23
  };
24
+
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL3NjcmliZS9zY3JpYmUvc3JjL3R5cGVzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImNvbnN0IExPR19MRVZFTFMgPSBbXCJmYXRhbFwiLCBcImVycm9yXCIsIFwid2FyblwiLCBcImluZm9cIiwgXCJkZWJ1Z1wiLCBcInRyYWNlXCJdIGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBMb2dMZXZlbCA9IHR5cGVvZiBMT0dfTEVWRUxTO1xuXG5leHBvcnQgdHlwZSBEZWZhdWx0TGV2ZWxzID0gTG9nTGV2ZWxbbnVtYmVyXTtcblxuZXhwb3J0IGNvbnN0IExvZ0xldmVscyA9IHtcblx0ZmF0YWw6IDYwLFxuXHRlcnJvcjogNTAsXG5cdHdhcm46IDQwLFxuXHRpbmZvOiAzMCxcblx0ZGVidWc6IDIwLFxuXHR0cmFjZTogMTAsXG59IHNhdGlzZmllcyBSZWNvcmQ8RGVmYXVsdExldmVscywgbnVtYmVyPjtcblxuZXhwb3J0IGNvbnN0IERlZmF1bHRMb2dMZXZlbDogRGVmYXVsdExldmVscyA9IFwiaW5mb1wiO1xuXG5leHBvcnQgdHlwZSBSZWRhY3Rpb25PcHRpb25zID0ge1xuXHRwYXRoczogc3RyaW5nW107XG59O1xuXG5leHBvcnQgY29uc3QgRGVmYXVsdFJlZGFjdGlvbnM6IFJlZGFjdGlvbk9wdGlvbnMgPSB7IHBhdGhzOiBbXCIqLnBhc3N3b3JkXCIsIFwiKi5zZWNyZXRcIl0gfTtcblxuZXhwb3J0IGludGVyZmFjZSBTY3JpYmVPcHRpb25zPFxuXHRUIGV4dGVuZHMgc3RyaW5nID0gbmV2ZXIsXG5cdEN1c3RvbU9ubHkgZXh0ZW5kcyB0cnVlIHwgZmFsc2UgPSB1bmRlZmluZWQsXG4+IHtcblx0bG9nTGV2ZWw/OiBEZWZhdWx0TGV2ZWxzIHwgc3RyaW5nO1xuXHRjdXN0b21MZXZlbHM/OiB7XG5cdFx0W2xldmVsIGluIFRdOiBudW1iZXI7XG5cdH07XG5cdGN1c3RvbU9ubHk/OiBDdXN0b21Pbmx5O1xuXHRyZWRhY3Rpb25zPzogUmVkYWN0aW9uT3B0aW9ucztcbn1cblxuZXhwb3J0IHR5cGUgTG9nQWRhcHRlck9wdGlvbnMgPSBSZWNvcmQ8c3RyaW5nLCBuZXZlcj47XG4iXSwibmFtZXMiOlsiTE9HX0xFVkVMUyIsIkxvZ0xldmVscyIsImZhdGFsIiwiZXJyb3IiLCJ3YXJuIiwiaW5mbyIsImRlYnVnIiwidHJhY2UiLCJEZWZhdWx0TG9nTGV2ZWwiLCJEZWZhdWx0UmVkYWN0aW9ucyIsInBhdGhzIl0sIm1hcHBpbmdzIjoiQUFBQSxNQUFNQSxhQUFhO0lBQUM7SUFBUztJQUFTO0lBQVE7SUFBUTtJQUFTO0NBQVE7QUFNdkUsT0FBTyxNQUFNQyxZQUFZO0lBQ3hCQyxPQUFPO0lBQ1BDLE9BQU87SUFDUEMsTUFBTTtJQUNOQyxNQUFNO0lBQ05DLE9BQU87SUFDUEMsT0FBTztBQUNSLEVBQTBDO0FBRTFDLE9BQU8sTUFBTUMsa0JBQWlDLE9BQU87QUFNckQsT0FBTyxNQUFNQyxvQkFBc0M7SUFBRUMsT0FBTztRQUFDO1FBQWM7S0FBVztBQUFDLEVBQUUifQ==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@decohere/scribe",
3
- "version": "0.0.1-dev.125",
3
+ "version": "0.0.1-dev.13",
4
4
  "description": "Structured logging interface with pluggable adapters",
5
5
  "keywords": [
6
6
  "typescript",
@@ -8,15 +8,6 @@
8
8
  "structured-logging",
9
9
  "decohere"
10
10
  ],
11
- "homepage": "https://github.com/typesmiths/decohere/tree/main/projects/scribe/scribe#readme",
12
- "bugs": {
13
- "url": "https://github.com/typesmiths/decohere/issues"
14
- },
15
- "repository": {
16
- "type": "git",
17
- "url": "git+https://github.com/typesmiths/decohere.git",
18
- "directory": "projects/scribe/scribe"
19
- },
20
11
  "license": "ISC",
21
12
  "author": "Typesmiths",
22
13
  "type": "module",
@@ -26,11 +17,6 @@
26
17
  "types": "./types/src/index.d.ts",
27
18
  "import": "./es6/src/index.js",
28
19
  "require": "./commonjs/src/index.js"
29
- },
30
- "./testing": {
31
- "types": "./types/src/testing/index.d.ts",
32
- "import": "./es6/src/testing/index.js",
33
- "require": "./commonjs/src/testing/index.js"
34
20
  }
35
21
  },
36
22
  "scripts": {
@@ -6,7 +6,6 @@ export declare class ConsoleAdapter extends LogAdapter {
6
6
  private configuredLevels;
7
7
  private configuredLogLevel;
8
8
  private configuredLogLevelValue;
9
- private redactionKeys;
10
9
  constructor(_options?: ConsoleAdapterOptions);
11
10
  configure<T extends string = never, CustomOnly extends true | false = false>(scribeOptions: ScribeOptions<T, CustomOnly>): void;
12
11
  getLogger<T extends string = never, CustomOnly extends true | false = false>(name?: string): Logger<T, CustomOnly>;
@@ -2,7 +2,7 @@ import type { DefaultLevels } from "./types.js";
2
2
  /**
3
3
  * Reads the log level from environment variables.
4
4
  * Checks LOG_LEVEL, SCRIBE_LOG_LEVEL, and LOGGING_LEVEL in order.
5
- * Returns null if none are set, or if the runtime has no `process` (browsers).
5
+ * Returns null if none are set.
6
6
  */
7
7
  export declare function getLogLevelFromEnv(): string | null;
8
8
  /**
@@ -1,10 +1,7 @@
1
1
  export * from "./console.adapter.js";
2
2
  export * from "./env.js";
3
3
  export * from "./errors.js";
4
- export * from "./log-entry.adapter.js";
5
- export * from "./log-entry.js";
6
4
  export * from "./logger.adapter.js";
7
5
  export * from "./logger.factory.js";
8
6
  export * from "./logger.type.js";
9
- export * from "./redact.js";
10
7
  export * from "./types.js";
@@ -1,45 +1,14 @@
1
1
  import type { Logger } from "./logger.type.js";
2
2
  import { type ScribeOptions } from "./types.js";
3
- export declare function formatError(err: Error): string;
4
- export type SerializedError = {
5
- name: string;
6
- message: string;
7
- stack?: string;
8
- cause?: unknown;
9
- /** Own enumerable properties such as `code` or `statusCode`. */
10
- [property: string]: unknown;
11
- };
12
- /** How many causes deep `serializeError` follows by default. */
13
- export declare const DefaultErrorCauseDepth = 3;
14
- /**
15
- * Plain-object form of an error for structured logs. An `Error` cause, or an
16
- * `Error` in another own property, is serialized the same way, up to
17
- * `causeDepth` levels; any other value is kept as it is.
18
- */
19
- export declare function serializeError(err: Error, causeDepth?: number): SerializedError;
20
- export interface LoggerAdapter extends AsyncDisposable {
3
+ export interface LoggerAdapter {
21
4
  configure<T extends string = never, CustomOnly extends true | false = false>(options: ScribeOptions<T, CustomOnly>): any;
22
5
  getLogger<T extends string = never, CustomOnly extends true | false = false>(name: string): Logger<T, CustomOnly>;
23
6
  flush(cb?: () => void): void;
24
- /**
25
- * Synchronously stop accepting writes (kill ThreadStream / close fds).
26
- * Call before swapping adapters so a dead worker cannot spam on further logs.
27
- * Idempotent — safe to call more than once.
28
- */
29
- retire(): void;
30
- /**
31
- * Drain buffered output and release unmanaged handles (workers, fds).
32
- * Idempotent — safe to call more than once.
33
- */
34
- stop(): Promise<void>;
35
7
  }
36
8
  export declare abstract class LogAdapter implements LoggerAdapter {
37
9
  abstract configure<T extends string = never, CustomOnly extends true | false = false>(options: ScribeOptions<T, CustomOnly>): any;
38
10
  abstract getLogger<T extends string = never, CustomOnly extends true | false = false>(name: string): Logger<T, CustomOnly>;
39
11
  flush(cb?: () => void): void;
40
- retire(): void;
41
- stop(): Promise<void>;
42
- [Symbol.asyncDispose](): Promise<void>;
43
12
  protected getLogLevels(options: ScribeOptions<any, any>): Record<string, number>;
44
13
  protected getUniqueLevels(defaultLevels: Record<string, number>, customLevels: Record<string, number>): [string, number][];
45
14
  }
@@ -1,53 +1,24 @@
1
- import { type LogEntry } from "./log-entry.js";
2
1
  import type { LoggerAdapter } from "./logger.adapter.js";
3
2
  import type { Logger } from "./logger.type.js";
4
3
  import { type ScribeOptions } from "./types.js";
5
4
  type LoggerFactoryOptions<T extends string = never, CustomOnly extends true | false = false> = {
6
5
  options?: ScribeOptions<T, CustomOnly>;
7
6
  adapter: LoggerAdapter;
8
- /**
9
- * Called with every entry a `scribe.logger(...)` handle writes (levels the
10
- * adapter has enabled). For error reporters such as Sentry. Scribe does not
11
- * redact what it hands the tap; the tap, or the service behind it, does.
12
- * A tap that throws does not break the call that logged: the error is
13
- * rethrown on a microtask, where the runtime reports it as uncaught.
14
- */
15
- tap?: LogTap;
16
7
  };
17
- export type LogTap = (entry: LogEntry) => void;
18
- export declare class scribe implements AsyncDisposable {
8
+ export declare class scribe {
19
9
  private loggerProvider;
20
- /** True after `configure({ adapter })` — the constructor’s ConsoleAdapter is only a fallback. */
21
- private adapterConfigured;
22
- private defaultAdapterWarned;
23
- private tap;
24
10
  private static instance;
25
11
  static logger<T extends string = never, CustomOnly extends true | false = false>(name?: string, customLevels?: {
26
12
  [level in T]: number;
27
13
  }): Logger<T, CustomOnly>;
28
14
  static configure<T extends string = never, CustomOnly extends true | false = false>(configOptions: LoggerFactoryOptions<T, CustomOnly>): (name?: string) => Logger<T, CustomOnly>;
15
+ static get extend(): scribe;
29
16
  static flush(cb?: () => void): void;
30
- /** Synchronously stop accepting writes on the active adapter. */
31
- static retire(): void;
32
- /** Drain the active adapter and release workers / destinations. */
33
- static stop(): Promise<void>;
34
- /**
35
- * Module-level `const log = scribe.logger(...)` must follow a later
36
- * `scribe.configure()` (CLI / Flux / HotReloadServer). Forward every use to
37
- * the active adapter logger for `name`, and `child(fields)` to a live handle
38
- * that adds `bindings`, so children follow a reconfigure too.
39
- */
40
- private static createLiveLogger;
41
17
  constructor();
42
18
  configure<T extends string = never, CustomOnly extends true | false = false>(configOptions: LoggerFactoryOptions<T, CustomOnly>): (name?: string) => Logger<T, CustomOnly>;
43
- retire(): void;
44
- stop(): Promise<void>;
45
- [Symbol.asyncDispose](): Promise<void>;
46
19
  getLogger<T extends string = never, CustomOnly extends true | false = false>(name?: string, customLevels?: {
47
20
  [level in T]: number;
48
21
  }): Logger<T, CustomOnly>;
49
- private notifyTap;
50
- private warnIfDefaultAdapter;
51
22
  private supportsLevels;
52
23
  private mergeDefaults;
53
24
  }
@@ -10,9 +10,4 @@ export type Logger<CustomLevels extends string = never, CustomOnly extends true
10
10
  [Property in CustomLevels]: LogFn;
11
11
  } & {
12
12
  isLevelEnabled(level: string): boolean;
13
- /**
14
- * A logger with the same name and levels that adds `fields` (a request id, a
15
- * job name) to every entry. Children of children merge their fields.
16
- */
17
- child(fields: Record<string, unknown>): Logger<CustomLevels, CustomOnly>;
18
13
  } & BaseLogger;
@@ -1 +1 @@
1
- export * from "./capture.adapter.js";
1
+ export {};
@@ -13,13 +13,6 @@ export declare const DefaultLogLevel: DefaultLevels;
13
13
  export type RedactionOptions = {
14
14
  paths: string[];
15
15
  };
16
- /** Pino's default censor. ConsoleAdapter uses the same placeholder. */
17
- export declare const DefaultCensor = "[Redacted]";
18
- /**
19
- * Object keys Scribe redacts. Adapters apply this list — Pino via `redact.paths`
20
- * (top-level and one nest), ConsoleAdapter via `redact.object`.
21
- */
22
- export declare const DefaultRedactionKeys: readonly ["password", "secret", "token", "otp", "pw", "userconfig"];
23
16
  export declare const DefaultRedactions: RedactionOptions;
24
17
  export interface ScribeOptions<T extends string = never, CustomOnly extends true | false = undefined> {
25
18
  logLevel?: DefaultLevels | string;
package/LICENSE DELETED
@@ -1,15 +0,0 @@
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.
@@ -1,55 +0,0 @@
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
- }
@@ -1,89 +0,0 @@
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
- };