logan-logger 2.1.0 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -65,7 +65,7 @@ Use named imports. There is no default export.
65
65
  | Runtime | Import | Notes |
66
66
  |---|---|---|
67
67
  | Auto-detect | `logan-logger` | Also the right choice for Next.js and other isomorphic frameworks |
68
- | Node.js 20+ | `logan-logger/node` | Adds the file transport and Morgan integration |
68
+ | Node.js 22.12+ | `logan-logger/node` | Adds the file transport and Morgan integration |
69
69
  | Bun | `logan-logger/bun` | Same as Node |
70
70
  | Browser / WebWorker | `logan-logger/browser` | CSS-styled console, performance marks, grouping |
71
71
  | Deno | `jsr:@logan/logger` | Console; native implementation planned |
package/dist/browser.cjs CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./chunks/config-DpSCCiRz.cjs");function t(){return typeof process<`u`&&process.env?process.env.NODE_ENV||process.env.NEXT_PUBLIC_APP_ENV||process.env.ENVIRONMENT||`development`:typeof window<`u`&&globalThis.__ENV__||`development`}function n(t){switch(t){case`production`:return e._.ERROR;case`staging`:case`test`:return e._.WARN;case`development`:case`dev`:return e._.DEBUG;default:return e._.INFO}}function r(t={}){let n=t.ignoreEnvironment?{}:e.n();return new e.u(e.r(t,n))}function i(){let e=t();return r({level:n(e),colorize:e!==`production`,timestamp:!0,format:e===`production`?`json`:`text`})}var a=i(),o={debug:(e,t)=>a.debug(e,t),info:(e,t)=>a.info(e,t),warn:(e,t)=>a.warn(e,t),error:(e,t)=>a.error(e,t)};exports.BrowserLogger=e.u,exports.ConsoleGroupLogger=e.d,exports.LogLevel=e._,exports.PerformanceLogger=e.f,exports.createLogger=r,exports.createLoggerForEnvironment=i,exports.detectRuntime=e.v,exports.filterSensitiveData=e.p,exports.formatLevel=e.c,exports.formatLogEntry=e.l,exports.isBrowser=e.y,exports.isBun=e.b,exports.isDeno=e.x,exports.isNode=e.S,exports.log=o,exports.logger=a,exports.safeStringify=e.m,exports.serializeError=e.h;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./chunks/config-IINkkZ84.cjs");function t(){return typeof process<`u`&&process.env?process.env.NODE_ENV||process.env.NEXT_PUBLIC_APP_ENV||process.env.ENVIRONMENT||`development`:typeof window<`u`&&globalThis.__ENV__||`development`}function n(t){switch(t){case`production`:return e._.ERROR;case`staging`:case`test`:return e._.WARN;case`development`:case`dev`:return e._.DEBUG;default:return e._.INFO}}function r(t={}){let n=t.ignoreEnvironment?{}:e.n();return new e.u(e.r(t,n))}function i(){let e=t();return r({level:n(e),colorize:e!==`production`,timestamp:!0,format:e===`production`?`json`:`text`})}var a=i(),o={debug:(e,t)=>a.debug(e,t),info:(e,t)=>a.info(e,t),warn:(e,t)=>a.warn(e,t),error:(e,t)=>a.error(e,t)};exports.BrowserLogger=e.u,exports.ConsoleGroupLogger=e.d,exports.LogLevel=e._,exports.PerformanceLogger=e.f,exports.createLogger=r,exports.createLoggerForEnvironment=i,exports.detectRuntime=e.v,exports.filterSensitiveData=e.p,exports.formatLevel=e.c,exports.formatLogEntry=e.l,exports.isBrowser=e.y,exports.isBun=e.b,exports.isDeno=e.x,exports.isNode=e.S,exports.log=o,exports.logger=a,exports.safeStringify=e.m,exports.serializeError=e.h;
package/dist/browser.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { S as e, _ as t, b as n, c as r, d as i, f as a, h as o, l as s, m as c, n as l, p as u, r as d, u as f, v as p, x as m, y as h } from "./chunks/config-CpbjY9zX.mjs";
1
+ import { S as e, _ as t, b as n, c as r, d as i, f as a, h as o, l as s, m as c, n as l, p as u, r as d, u as f, v as p, x as m, y as h } from "./chunks/config-BARemYd2.mjs";
2
2
  //#region src/browser.ts
3
3
  function g() {
4
4
  return typeof process < "u" && process.env ? process.env.NODE_ENV || process.env.NEXT_PUBLIC_APP_ENV || process.env.ENVIRONMENT || "development" : typeof window < "u" && globalThis.__ENV__ || "development";
package/dist/bun.cjs CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./chunks/config-DpSCCiRz.cjs"),t=require("./chunks/config-file-WYBC6sSB.cjs"),n=require("./chunks/file-transport-B34EGzxL.cjs");exports.ConsoleTransport=t.l,exports.FileTransport=n.t,exports.NodeLogger=t.s,exports.createLogger=t.r,exports.createLoggerForEnvironment=t.i,exports.createTransports=t.u,exports.detectRuntime=e.v,exports.filterSensitiveData=e.p,exports.formatLevel=e.c,exports.formatLogEntry=e.l,exports.getDefaultConfig=e.t,exports.isBrowser=e.y,exports.isBun=e.b,exports.isDeno=e.x,exports.isNode=e.S,exports.loadConfigFromEnvironment=e.n,exports.loadConfigFromFile=t.t,exports.mergeConfigs=e.r,exports.registerTransport=t.f,exports.resetEnvironmentWarnings=e.i,exports.safeStringify=e.m,exports.serializeError=e.h,exports.shouldColorize=e.a,exports.tryParseLogLevel=e.o;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./chunks/config-IINkkZ84.cjs"),t=require("./chunks/config-file-Cyys9_yO.cjs"),n=require("./chunks/file-transport-CZW_2423.cjs");exports.ConsoleTransport=t.l,exports.FileTransport=n.t,exports.NodeLogger=t.s,exports.createLogger=t.r,exports.createLoggerForEnvironment=t.i,exports.createTransports=t.u,exports.detectRuntime=e.v,exports.filterSensitiveData=e.p,exports.formatLevel=e.c,exports.formatLogEntry=e.l,exports.getDefaultConfig=e.t,exports.isBrowser=e.y,exports.isBun=e.b,exports.isDeno=e.x,exports.isNode=e.S,exports.loadConfigFromEnvironment=e.n,exports.loadConfigFromFile=t.t,exports.mergeConfigs=e.r,exports.registerTransport=t.f,exports.resetEnvironmentWarnings=e.i,exports.safeStringify=e.m,exports.serializeError=e.h,exports.shouldColorize=e.a,exports.tryParseLogLevel=e.o;
package/dist/bun.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { S as e, a as t, b as n, c as r, h as i, i as a, l as o, m as s, n as c, o as l, p as u, r as d, t as f, v as p, x as m, y as h } from "./chunks/config-CpbjY9zX.mjs";
2
- import { f as g, i as _, l as v, r as y, s as b, t as x, u as S } from "./chunks/config-file-CvMv3rgc.mjs";
3
- import { t as C } from "./chunks/file-transport-yIPiX8TP.mjs";
1
+ import { S as e, a as t, b as n, c as r, h as i, i as a, l as o, m as s, n as c, o as l, p as u, r as d, t as f, v as p, x as m, y as h } from "./chunks/config-BARemYd2.mjs";
2
+ import { f as g, i as _, l as v, r as y, s as b, t as x, u as S } from "./chunks/config-file-BkYtEgDX.mjs";
3
+ import { t as C } from "./chunks/file-transport-CCCBjSLN.mjs";
4
4
  export { v as ConsoleTransport, C as FileTransport, b as NodeLogger, y as createLogger, _ as createLoggerForEnvironment, S as createTransports, p as detectRuntime, u as filterSensitiveData, r as formatLevel, o as formatLogEntry, f as getDefaultConfig, h as isBrowser, n as isBun, m as isDeno, e as isNode, c as loadConfigFromEnvironment, x as loadConfigFromFile, d as mergeConfigs, g as registerTransport, a as resetEnvironmentWarnings, s as safeStringify, i as serializeError, t as shouldColorize, l as tryParseLogLevel };
@@ -133,7 +133,7 @@ function d(e, t, n, r) {
133
133
  if (n >= r) return "[MaxDepth]";
134
134
  t.add(i);
135
135
  try {
136
- if (i instanceof Error) return f(_(i), t, n, r);
136
+ if (i instanceof Error) return f(C(i), t, n, r);
137
137
  let e = i.toJSON;
138
138
  if (typeof e == "function") return d(e.call(i), t, n, r);
139
139
  if (Array.isArray(i)) {
@@ -155,24 +155,56 @@ function p(e, t, n = {}) {
155
155
  let r = n.maxDepth ?? u;
156
156
  return JSON.stringify(d(e, /* @__PURE__ */ new Set(), 0, r), null, t);
157
157
  }
158
- function m(e, t = [
158
+ var m = [
159
159
  "password",
160
160
  "token",
161
161
  "secret",
162
162
  "key",
163
- "auth"
164
- ]) {
163
+ "auth",
164
+ "authorization",
165
+ "apikey",
166
+ "authtoken",
167
+ "accesstoken",
168
+ "secretkey"
169
+ ], h = /[A-Z]+(?![a-z])|[A-Z]?[a-z]+|[0-9]+/g;
170
+ function g(e) {
171
+ return (e.match(h) ?? []).map((e) => e.toLowerCase());
172
+ }
173
+ function _(e) {
174
+ let t = [];
175
+ for (let n of e) {
176
+ let e = g(n);
177
+ if (e.length === 0) continue;
178
+ let r = e.join("");
179
+ t.push({
180
+ tokens: e.map((e) => [e, `${e}s`]),
181
+ joined: r,
182
+ joinedPlural: `${r}s`
183
+ });
184
+ }
185
+ return t;
186
+ }
187
+ function v(e, t) {
188
+ let n = g(e);
189
+ if (n.length === 0) return !1;
190
+ let r = n.join("");
191
+ return t.some((e) => e.tokens.every(([e, t]) => n.includes(e) || n.includes(t)) || r === e.joined || r === e.joinedPlural);
192
+ }
193
+ function y(e, t) {
165
194
  if (typeof e != "object" || !e) return e;
166
195
  let n = Array.isArray(e) ? [] : {};
167
- for (let [r, i] of Object.entries(e)) n[r] = t.some((e) => r.toLowerCase().includes(e.toLowerCase())) ? "[REDACTED]" : typeof i == "object" && i ? m(i, t) : i;
196
+ for (let [r, i] of Object.entries(e)) n[r] = v(r, t) ? "[REDACTED]" : typeof i == "object" && i ? y(i, t) : i;
168
197
  return n;
169
198
  }
170
- var h = [
199
+ function b(e, t = m) {
200
+ return y(e, _(t));
201
+ }
202
+ var x = [
171
203
  "name",
172
204
  "message",
173
205
  "stack"
174
206
  ];
175
- function g(e, t) {
207
+ function S(e, t) {
176
208
  let n = Object.getOwnPropertyDescriptor(e, t);
177
209
  if (n) {
178
210
  if (n.get) try {
@@ -183,19 +215,19 @@ function g(e, t) {
183
215
  return n.value;
184
216
  }
185
217
  }
186
- function _(e) {
218
+ function C(e) {
187
219
  if (!(e instanceof Error)) return e;
188
220
  let t = {
189
221
  name: e.name,
190
222
  message: e.message
191
223
  };
192
224
  e.stack !== void 0 && (t.stack = e.stack);
193
- for (let n of Object.getOwnPropertyNames(e)) h.includes(n) || (t[n] = g(e, n));
225
+ for (let n of Object.getOwnPropertyNames(e)) x.includes(n) || (t[n] = S(e, n));
194
226
  return t;
195
227
  }
196
228
  //#endregion
197
229
  //#region src/runtime/browser.ts
198
- var v = class e extends l {
230
+ var w = class e extends l {
199
231
  constructor(e = {}) {
200
232
  super(e);
201
233
  }
@@ -236,7 +268,7 @@ var v = class e extends l {
236
268
  shouldLog(e) {
237
269
  return !this.shouldLogInProduction() && e < c.ERROR ? !1 : super.shouldLog(e);
238
270
  }
239
- }, y = class extends v {
271
+ }, T = class extends w {
240
272
  constructor(...e) {
241
273
  super(...e), this.groupStack = [];
242
274
  }
@@ -273,7 +305,7 @@ var v = class e extends l {
273
305
  table(e) {
274
306
  console.table(e);
275
307
  }
276
- }, b = class extends v {
308
+ }, E = class extends w {
277
309
  mark(e) {
278
310
  typeof performance < "u" && performance.mark && performance.mark(e);
279
311
  }
@@ -304,7 +336,7 @@ var v = class e extends l {
304
336
  };
305
337
  //#endregion
306
338
  //#region src/utils/formatting.ts
307
- function x(e, t = "text", n = {}) {
339
+ function D(e, t = "text", n = {}) {
308
340
  if (t === "json") {
309
341
  let t = {
310
342
  timestamp: e.timestamp.toISOString(),
@@ -314,10 +346,10 @@ function x(e, t = "text", n = {}) {
314
346
  };
315
347
  return e.metadata !== void 0 && (t.metadata = e.metadata), p(t);
316
348
  }
317
- let r = n.timestamp === !1 ? "" : `[${e.timestamp.toISOString()}] `, i = S(e.level, n.colorize === !0), a = e.metadata ? ` ${p(e.metadata)}` : "";
349
+ let r = n.timestamp === !1 ? "" : `[${e.timestamp.toISOString()}] `, i = O(e.level, n.colorize === !0), a = e.metadata ? ` ${p(e.metadata)}` : "";
318
350
  return `${r}${i}: ${e.message}${a}`;
319
351
  }
320
- function S(e, t = !1) {
352
+ function O(e, t = !1) {
321
353
  let n = c[e].toUpperCase();
322
354
  if (!t) return n;
323
355
  let r = {
@@ -331,24 +363,24 @@ function S(e, t = !1) {
331
363
  }
332
364
  //#endregion
333
365
  //#region src/utils/warn-once.ts
334
- var C = /* @__PURE__ */ new Set();
335
- function w(e) {
336
- C.has(e) || (C.add(e), console.warn(e));
366
+ var k = /* @__PURE__ */ new Set();
367
+ function A(e) {
368
+ k.has(e) || (k.add(e), console.warn(e));
337
369
  }
338
- function T() {
339
- C.clear();
370
+ function j() {
371
+ k.clear();
340
372
  }
341
373
  //#endregion
342
374
  //#region src/utils/config.ts
343
- function E() {
375
+ function M() {
344
376
  return e().capabilities.colorSupport ? typeof process > "u" || !process.env ? !0 : process.env.NO_COLOR ? !1 : process.env.FORCE_COLOR ? process.env.FORCE_COLOR !== "0" : process.stdout?.isTTY === !0 : !1;
345
377
  }
346
- function D() {
378
+ function N() {
347
379
  return {
348
380
  level: c.INFO,
349
381
  format: "text",
350
382
  timestamp: !0,
351
- colorize: E(),
383
+ colorize: M(),
352
384
  metadata: {},
353
385
  transports: [{
354
386
  type: "console",
@@ -356,21 +388,21 @@ function D() {
356
388
  }]
357
389
  };
358
390
  }
359
- var O = [
391
+ var P = [
360
392
  "true",
361
393
  "1",
362
394
  "yes",
363
395
  "on"
364
- ], k = [
396
+ ], F = [
365
397
  "false",
366
398
  "0",
367
399
  "no",
368
400
  "off"
369
401
  ];
370
- function A() {
371
- T();
402
+ function I() {
403
+ j();
372
404
  }
373
- function j(e) {
405
+ function L(e) {
374
406
  switch (e.trim().toLowerCase()) {
375
407
  case "debug": return c.DEBUG;
376
408
  case "info": return c.INFO;
@@ -382,36 +414,36 @@ function j(e) {
382
414
  default: return;
383
415
  }
384
416
  }
385
- function M(e, t) {
417
+ function R(e, t) {
386
418
  let n = t.trim().toLowerCase();
387
- if (O.includes(n)) return !0;
388
- if (k.includes(n)) return !1;
389
- w(`[logan-logger] ${e}="${t}" is not a recognized boolean and was ignored. Accepted: ${O.join(", ")} / ${k.join(", ")}.`);
419
+ if (P.includes(n)) return !0;
420
+ if (F.includes(n)) return !1;
421
+ A(`[logan-logger] ${e}="${t}" is not a recognized boolean and was ignored. Accepted: ${P.join(", ")} / ${F.join(", ")}.`);
390
422
  }
391
- function N() {
423
+ function z() {
392
424
  let e = {};
393
425
  if (typeof process > "u" || !process.env) return e;
394
426
  let t = process.env;
395
427
  if (t.LOG_LEVEL) {
396
- let n = j(t.LOG_LEVEL);
397
- n === void 0 ? w(`[logan-logger] LOG_LEVEL="${t.LOG_LEVEL}" is not a recognized level and was ignored. Accepted: debug, info, warn, error, silent.`) : e.level = n;
428
+ let n = L(t.LOG_LEVEL);
429
+ n === void 0 ? A(`[logan-logger] LOG_LEVEL="${t.LOG_LEVEL}" is not a recognized level and was ignored. Accepted: debug, info, warn, error, silent.`) : e.level = n;
398
430
  }
399
431
  if (t.LOG_FORMAT) {
400
432
  let n = t.LOG_FORMAT.trim().toLowerCase();
401
- n === "json" || n === "text" ? e.format = n : w(`[logan-logger] LOG_FORMAT="${t.LOG_FORMAT}" is not a recognized format and was ignored. Accepted: json, text.`);
433
+ n === "json" || n === "text" ? e.format = n : A(`[logan-logger] LOG_FORMAT="${t.LOG_FORMAT}" is not a recognized format and was ignored. Accepted: json, text.`);
402
434
  }
403
435
  if (t.LOG_TIMESTAMP) {
404
- let n = M("LOG_TIMESTAMP", t.LOG_TIMESTAMP);
436
+ let n = R("LOG_TIMESTAMP", t.LOG_TIMESTAMP);
405
437
  n !== void 0 && (e.timestamp = n);
406
438
  }
407
439
  if (t.LOG_COLOR) {
408
- let n = M("LOG_COLOR", t.LOG_COLOR);
440
+ let n = R("LOG_COLOR", t.LOG_COLOR);
409
441
  n !== void 0 && (e.colorize = n);
410
442
  }
411
443
  return e;
412
444
  }
413
- function P(...e) {
414
- let t = D();
445
+ function B(...e) {
446
+ let t = N();
415
447
  return e.reduce((e, t) => ({
416
448
  ...e,
417
449
  ...t,
@@ -423,4 +455,4 @@ function P(...e) {
423
455
  }), t);
424
456
  }
425
457
  //#endregion
426
- export { i as S, c as _, E as a, s as b, S as c, y as d, b as f, l as g, _ as h, A as i, x as l, p as m, N as n, j as o, m as p, P as r, w as s, D as t, v as u, e as v, o as x, a as y };
458
+ export { i as S, c as _, M as a, s as b, O as c, T as d, E as f, l as g, C as h, I as i, D as l, p as m, z as n, L as o, b as p, B as r, A as s, N as t, w as u, e as v, o as x, a as y };
@@ -0,0 +1 @@
1
+ function e(){let e=t();return{name:e,version:n(e),capabilities:r(e)}}function t(){return globalThis.Deno===void 0?globalThis.Bun===void 0?typeof window<`u`&&typeof document<`u`?`browser`:typeof globalThis.importScripts==`function`&&typeof window>`u`?`webworker`:typeof process<`u`&&process.versions&&process.versions.node?`node`:`unknown`:`bun`:`deno`}function n(e){switch(e){case`node`:return typeof process<`u`?process.version:void 0;case`deno`:return globalThis.Deno===void 0?void 0:globalThis.Deno.version?.deno;case`bun`:return globalThis.Bun===void 0?void 0:globalThis.Bun.version;case`browser`:return typeof navigator<`u`?navigator.userAgent:void 0;default:return}}function r(e){switch(e){case`node`:return{fileSystem:!0,colorSupport:!0,processInfo:!0,streams:!0};case`deno`:return{fileSystem:!0,colorSupport:!0,processInfo:!0,streams:!0};case`bun`:return{fileSystem:!0,colorSupport:!0,processInfo:!0,streams:!0};case`browser`:return{fileSystem:!1,colorSupport:!0,processInfo:!1,streams:!1};case`webworker`:return{fileSystem:!1,colorSupport:!1,processInfo:!1,streams:!1};default:return{fileSystem:!1,colorSupport:!1,processInfo:!1,streams:!1}}}function i(){return t()===`node`}function a(){return t()===`browser`}function o(){return t()===`deno`}function s(){return t()===`bun`}var c=function(e){return e[e.DEBUG=0]=`DEBUG`,e[e.INFO=1]=`INFO`,e[e.WARN=2]=`WARN`,e[e.ERROR=3]=`ERROR`,e[e.SILENT=4]=`SILENT`,e}({}),l=class{constructor(t={}){this.childMetadata={},this.config=t,this.level=t.level??c.INFO,this.runtime=e().name,this.childMetadata={...t.metadata}}debug(e,t){this.log(c.DEBUG,e,t)}info(e,t){this.log(c.INFO,e,t)}warn(e,t){this.log(c.WARN,e,t)}error(e,t){this.log(c.ERROR,e,t)}log(e,t,n){if(!this.shouldLog(e))return;let r=typeof t==`function`?t():t,i={...this.childMetadata,...n},a={timestamp:new Date,level:e,message:r,metadata:Object.keys(i).length>0?i:void 0,runtime:this.runtime};this.writeLog(a)}setLevel(e){this.level=e}getLevel(){return this.level}child(e){let t=this.createChild();return t.childMetadata={...this.childMetadata,...e},t}shouldLog(e){return e>=this.level}},u=100;function d(e,t,n,r){if(e===void 0)return`[undefined]`;if(typeof e==`bigint`)return`[BigInt: ${e.toString()}]`;if(typeof e==`symbol`)return`[Symbol: ${e.toString()}]`;if(typeof e==`function`)return`[Function: ${e.name||`anonymous`}]`;if(typeof e!=`object`||!e)return e;let i=e;if(t.has(i))return`[Circular]`;if(n>=r)return`[MaxDepth]`;t.add(i);try{if(i instanceof Error)return f(C(i),t,n,r);let e=i.toJSON;if(typeof e==`function`)return d(e.call(i),t,n,r);if(Array.isArray(i)){let e=[];for(let a=0;a<i.length;a++)e.push(d(i[a],t,n+1,r));return e}return f(i,t,n,r)}finally{t.delete(i)}}function f(e,t,n,r){let i={};for(let[a,o]of Object.entries(e))i[a]=d(o,t,n+1,r);return i}function p(e,t,n={}){let r=n.maxDepth??u;return JSON.stringify(d(e,new Set,0,r),null,t)}var m=[`password`,`token`,`secret`,`key`,`auth`,`authorization`,`apikey`,`authtoken`,`accesstoken`,`secretkey`],h=/[A-Z]+(?![a-z])|[A-Z]?[a-z]+|[0-9]+/g;function g(e){return(e.match(h)??[]).map(e=>e.toLowerCase())}function _(e){let t=[];for(let n of e){let e=g(n);if(e.length===0)continue;let r=e.join(``);t.push({tokens:e.map(e=>[e,`${e}s`]),joined:r,joinedPlural:`${r}s`})}return t}function v(e,t){let n=g(e);if(n.length===0)return!1;let r=n.join(``);return t.some(e=>e.tokens.every(([e,t])=>n.includes(e)||n.includes(t))||r===e.joined||r===e.joinedPlural)}function y(e,t){if(typeof e!=`object`||!e)return e;let n=Array.isArray(e)?[]:{};for(let[r,i]of Object.entries(e))n[r]=v(r,t)?`[REDACTED]`:typeof i==`object`&&i?y(i,t):i;return n}function b(e,t=m){return y(e,_(t))}var x=[`name`,`message`,`stack`];function S(e,t){let n=Object.getOwnPropertyDescriptor(e,t);if(n){if(n.get)try{return n.get.call(e)}catch{return`[Throws]`}return n.value}}function C(e){if(!(e instanceof Error))return e;let t={name:e.name,message:e.message};e.stack!==void 0&&(t.stack=e.stack);for(let n of Object.getOwnPropertyNames(e))x.includes(n)||(t[n]=S(e,n));return t}var w=class e extends l{constructor(e={}){super(e)}writeLog(e){let t=this.formatMessage(e),n=this.getConsoleStyle(e.level),r=`%c${t}${e.metadata?` ${p(e.metadata)}`:``}`;switch(e.level){case c.DEBUG:console.debug?console.debug(r,n):console.log(r,n);break;case c.INFO:console.info(r,n);break;case c.WARN:console.warn(r,n);break;case c.ERROR:console.error(r,n)}}createChild(){return new e(this.config)}formatMessage(e){return`[${e.timestamp.toISOString()}] ${c[e.level].toUpperCase()}: ${e.message}`}getConsoleStyle(e){if(!this.config.colorize)return``;switch(e){case c.DEBUG:return`color: #888; font-weight: normal;`;case c.INFO:return`color: #007acc; font-weight: normal;`;case c.WARN:return`color: #ff8c00; font-weight: bold;`;case c.ERROR:return`color: #dc3545; font-weight: bold;`;default:return``}}shouldLogInProduction(){return(globalThis.process?.env?.NODE_ENV||globalThis.process?.env?.NEXT_PUBLIC_APP_ENV||`development`)!==`production`||this.level<=c.ERROR}shouldLog(e){return!this.shouldLogInProduction()&&e<c.ERROR?!1:super.shouldLog(e)}},T=class extends w{constructor(...e){super(...e),this.groupStack=[]}group(e){console.group(e),this.groupStack.push(e)}groupCollapsed(e){console.groupCollapsed(e),this.groupStack.push(e)}groupEnd(){console.groupEnd(),this.groupStack.pop()}getCurrentGroupStack(){return[...this.groupStack]}getCurrentGroupPath(){return this.groupStack.join(` > `)}time(e){console.time(e)}timeEnd(e){console.timeEnd(e)}trace(e,t){console.trace(e,t)}count(e){console.count(e)}countReset(e){console.countReset(e)}table(e){console.table(e)}},E=class extends w{mark(e){typeof performance<`u`&&performance.mark&&performance.mark(e)}measure(e,t,n){if(typeof performance<`u`&&performance.measure)try{performance.measure(e,t,n);let r=performance.getEntriesByName(e,`measure`);if(r.length>0){let t=r[r.length-1];this.info(`Performance: ${e}`,{duration:t.duration,startTime:t.startTime})}}catch(t){this.warn(`Failed to measure performance`,{name:e,error:t})}}clearMarks(e){typeof performance<`u`&&performance.clearMarks&&performance.clearMarks(e)}clearMeasures(e){typeof performance<`u`&&performance.clearMeasures&&performance.clearMeasures(e)}};function D(e,t=`text`,n={}){if(t===`json`){let t={timestamp:e.timestamp.toISOString(),level:c[e.level].toLowerCase(),message:e.message,runtime:e.runtime};return e.metadata!==void 0&&(t.metadata=e.metadata),p(t)}let r=n.timestamp===!1?``:`[${e.timestamp.toISOString()}] `,i=O(e.level,n.colorize===!0),a=e.metadata?` ${p(e.metadata)}`:``;return`${r}${i}: ${e.message}${a}`}function O(e,t=!1){let n=c[e].toUpperCase();if(!t)return n;let r={[c.DEBUG]:`\x1B[36m`,[c.INFO]:`\x1B[32m`,[c.WARN]:`\x1B[33m`,[c.ERROR]:`\x1B[31m`,[c.SILENT]:`\x1B[37m`};return`${r[e]||r[c.INFO]}${n}`}var k=new Set;function A(e){k.has(e)||(k.add(e),console.warn(e))}function j(){k.clear()}function M(){return e().capabilities.colorSupport?typeof process>`u`||!process.env?!0:process.env.NO_COLOR?!1:process.env.FORCE_COLOR?process.env.FORCE_COLOR!==`0`:process.stdout?.isTTY===!0:!1}function N(){return{level:c.INFO,format:`text`,timestamp:!0,colorize:M(),metadata:{},transports:[{type:`console`,options:{}}]}}var P=[`true`,`1`,`yes`,`on`],F=[`false`,`0`,`no`,`off`];function I(){j()}function L(e){switch(e.trim().toLowerCase()){case`debug`:return c.DEBUG;case`info`:return c.INFO;case`warn`:case`warning`:return c.WARN;case`error`:return c.ERROR;case`silent`:case`none`:return c.SILENT;default:return}}function R(e,t){let n=t.trim().toLowerCase();if(P.includes(n))return!0;if(F.includes(n))return!1;A(`[logan-logger] ${e}="${t}" is not a recognized boolean and was ignored. Accepted: ${P.join(`, `)} / ${F.join(`, `)}.`)}function z(){let e={};if(typeof process>`u`||!process.env)return e;let t=process.env;if(t.LOG_LEVEL){let n=L(t.LOG_LEVEL);n===void 0?A(`[logan-logger] LOG_LEVEL="${t.LOG_LEVEL}" is not a recognized level and was ignored. Accepted: debug, info, warn, error, silent.`):e.level=n}if(t.LOG_FORMAT){let n=t.LOG_FORMAT.trim().toLowerCase();n===`json`||n===`text`?e.format=n:A(`[logan-logger] LOG_FORMAT="${t.LOG_FORMAT}" is not a recognized format and was ignored. Accepted: json, text.`)}if(t.LOG_TIMESTAMP){let n=R(`LOG_TIMESTAMP`,t.LOG_TIMESTAMP);n!==void 0&&(e.timestamp=n)}if(t.LOG_COLOR){let n=R(`LOG_COLOR`,t.LOG_COLOR);n!==void 0&&(e.colorize=n)}return e}function B(...e){let t=N();return e.reduce((e,t)=>({...e,...t,metadata:{...e.metadata,...t.metadata},transports:t.transports||e.transports}),t)}Object.defineProperty(exports,"S",{enumerable:!0,get:function(){return i}}),Object.defineProperty(exports,"_",{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,"a",{enumerable:!0,get:function(){return M}}),Object.defineProperty(exports,"b",{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,"c",{enumerable:!0,get:function(){return O}}),Object.defineProperty(exports,"d",{enumerable:!0,get:function(){return T}}),Object.defineProperty(exports,"f",{enumerable:!0,get:function(){return E}}),Object.defineProperty(exports,"g",{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,"h",{enumerable:!0,get:function(){return C}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return I}}),Object.defineProperty(exports,"l",{enumerable:!0,get:function(){return D}}),Object.defineProperty(exports,"m",{enumerable:!0,get:function(){return p}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return z}}),Object.defineProperty(exports,"o",{enumerable:!0,get:function(){return L}}),Object.defineProperty(exports,"p",{enumerable:!0,get:function(){return b}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return B}}),Object.defineProperty(exports,"s",{enumerable:!0,get:function(){return A}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return N}}),Object.defineProperty(exports,"u",{enumerable:!0,get:function(){return w}}),Object.defineProperty(exports,"v",{enumerable:!0,get:function(){return e}}),Object.defineProperty(exports,"x",{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,"y",{enumerable:!0,get:function(){return a}});
@@ -1,4 +1,4 @@
1
- import { _ as e, a as t, g as n, l as r, n as i, o as a, r as o, s, u as c, v as l } from "./config-CpbjY9zX.mjs";
1
+ import { _ as e, a as t, g as n, l as r, n as i, o as a, r as o, s, u as c, v as l } from "./config-BARemYd2.mjs";
2
2
  //#region src/core/transport.ts
3
3
  var u = /* @__PURE__ */ new Map();
4
4
  function d(e, t) {
@@ -1 +1 @@
1
- const e=require("./config-DpSCCiRz.cjs");var t=new Map;function n(e,n){t.set(e,n)}function r(e){return t.get(e)}var i=class{constructor(e={}){this.type=`console`,this.level=e.level,this.format=e.format===`json`?`json`:`text`,this.formatOptions={timestamp:e.timestamp!==!1,colorize:e.colorize===!0}}write(t){let n=e.l(t,this.format,this.formatOptions);switch(t.level){case e._.DEBUG:console.debug(n);break;case e._.WARN:console.warn(n);break;case e._.ERROR:console.error(n);break;default:console.info(n)}}};n(`console`,(e,t)=>{let n=e.options??{};return new i({format:n.format??t.format,timestamp:n.timestamp??t.timestamp,colorize:n.colorize??t.colorize,level:e.level})}),n(`custom`,e=>{let t=e.options?.transport;if(!t||typeof t.write!=`function`)throw Error(`custom transport requires options.transport to be an object with a write(entry) method`);return e.level===void 0?t:{type:t.type??`custom`,level:e.level,write:e=>t.write(e),close:t.close?()=>t.close?.():void 0}});function a(e){let t={format:e.format??`text`,timestamp:e.timestamp??!0,colorize:e.colorize??!1};if(e.transports===void 0)return[new i({format:t.format,timestamp:t.timestamp,colorize:t.colorize})];let n=[];for(let i of e.transports){let e=r(i.type);if(!e){console.warn(`[logan-logger] ${o(i.type)}`);continue}try{n.push(e(i,t))}catch(e){console.warn(`[logan-logger] transport '${i.type}' failed to initialize:`,e)}}return n}function o(e){return e===`file`?`the 'file' transport is not registered; import from 'logan-logger/node' (or 'logan-logger/bun') rather than the main entry point to use file logging`:e===`http`?`the 'http' transport is not built in; supply one with { type: 'custom', options: { transport } }`:`unknown transport type '${e}'; skipping`}var s=class t extends e.g{constructor(e={},t){super(e),this.transports=t??a(e)}getTransports(){return this.transports}close(){for(let e of this.transports)e.close?.()}writeLog(e){for(let t of this.transports)if(!(t.level!==void 0&&e.level<t.level))try{t.write(e)}catch(e){console.warn(`[logan-logger] transport '${t.type}' failed to write:`,e)}}createChild(){return new t(this.config,this.transports)}};function c(e){return{write:t=>{e.info(t.trim())}}}var l=class t{static create(n={}){let r=e.v(),i=t.mergeConfig(n);switch(r.name){case`node`:return new s(i);case`deno`:return new e.u(i);case`bun`:return new s(i);case`browser`:case`webworker`:return new e.u(i);default:return new e.u(i)}}static createChild(e,t){return e.child(t)}static mergeConfig(t){let n=t.ignoreEnvironment?{}:e.n();return e.r(t,n)}};function u(e){return l.create(e)}function d(){let t=f();return u({level:p(t),colorize:t!==`production`&&e.a(),timestamp:!0,format:t===`production`?`json`:`text`})}function f(){return typeof process<`u`&&process.env?process.env.NODE_ENV||process.env.NEXT_PUBLIC_APP_ENV||process.env.ENVIRONMENT||`development`:typeof window<`u`&&globalThis.__ENV__||`development`}function p(t){switch(t){case`production`:return e._.ERROR;case`staging`:case`test`:return e._.WARN;case`development`:case`dev`:return e._.DEBUG;default:return e._.INFO}}function m(t){return e.o(t)??e._.INFO}function h(t){switch(t){case e._.DEBUG:return`debug`;case e._.INFO:return`info`;case e._.WARN:return`warn`;case e._.ERROR:return`error`;case e._.SILENT:return`silent`;default:return`info`}}var g=[{path:`logan.config.json`},{path:`.loganrc`},{path:`package.json`,key:`logan`}],_=new Set([`level`,`format`,`timestamp`,`colorize`,`ignoreEnvironment`,`metadata`,`transports`,`$schema`]),v=new Set([`EACCES`,`EPERM`,`NotCapable`,`PermissionDenied`]);function y(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function b(e){return e instanceof Error?e.message:String(e)}function x(e){let t=/at position \d+(?: \(line \d+ column \d+\))?/.exec(b(e));return t?`not valid JSON (${t[0]})`:`not valid JSON`}function S(e){return e.startsWith(`/`)||e.startsWith(`\\`)||/^[A-Za-z]:/.test(e)}function C(e,t){return t===void 0||t===``||S(e)?e:`${t.replace(/[\\/]+$/,``)}/${e}`}async function w(e,t){if(e===`deno`)return e=>C(e,t);let{resolve:n}=await import(`node:path`);return t===void 0?e=>n(e):e=>n(t,e)}function T(e){let t=e.split(/[\\/]/);return t[t.length-1]||e}function E(e){if(e===`deno`)try{return globalThis.Deno?.cwd?.()}catch{return}return typeof process<`u`&&typeof process.cwd==`function`?process.cwd():void 0}function D(e){let t=e?.code??``,n=e?.name??``;return t===`ENOENT`||n===`NotFound`?{kind:`absent`}:v.has(t)||v.has(n)?{kind:`denied`,reason:b(e)}:{kind:`unreadable`,reason:b(e)}}async function O(e,t){let n=t===`deno`?()=>globalThis.Deno.readTextFile(e):async()=>(await import(`node:fs/promises`)).readFile(e,`utf-8`);try{return{kind:`content`,content:await n()}}catch(e){return D(e)}}function k(t){if(typeof t==`string`)return e.o(t);if(typeof t==`number`&&e._[t]!==void 0)return t}function A(t,n,r){let i=t=>{e.s(`[logan-logger] ${r}: ignoring transports[${n}]: ${t}.`)};if(!y(t)){i(`expected an object, got ${JSON.stringify(t)??typeof t}`);return}if(typeof t.type!=`string`){i(`"type" is required and must be a string`);return}if(t.options!==void 0&&!y(t.options)){i(`"options" must be an object`);return}let a={type:t.type,options:t.options??{}};if(t.level!==void 0){let i=k(t.level);i===void 0?e.s(`[logan-logger] ${r}: ignoring transports[${n}].level=${JSON.stringify(t.level)}. Accepted: debug, info, warn, error, silent.`):a.level=i}return a}function j(t,n){let r={},i=(t,r,i)=>{e.s(`[logan-logger] ${n}: ignoring ${t}=${JSON.stringify(r)}. Accepted: ${i}.`)};for(let r of Object.keys(t))_.has(r)||e.s(`[logan-logger] ${n}: ignoring unknown field "${r}". Known fields: level, format, timestamp, colorize, ignoreEnvironment, metadata, transports.`);if(t.level!==void 0){let e=k(t.level);e===void 0?i(`level`,t.level,`debug, info, warn, error, silent`):r.level=e}t.format!==void 0&&(t.format===`json`||t.format===`text`||t.format===`custom`?r.format=t.format:i(`format`,t.format,`json, text, custom`));for(let e of[`timestamp`,`colorize`,`ignoreEnvironment`])t[e]!==void 0&&(typeof t[e]==`boolean`?r[e]=t[e]:i(e,t[e],`true, false`));if(t.metadata!==void 0&&(y(t.metadata)?r.metadata=t.metadata:i(`metadata`,t.metadata,`an object`)),Array.isArray(t.transports)){let e=t.transports.map((e,t)=>A(e,t,n)).filter(e=>e!==void 0);(e.length>0||t.transports.length===0)&&(r.transports=e)}else t.transports!==void 0&&i(`transports`,t.transports,`an array of transport configs`);return r}async function M(e,t){let n=await O(e.path,t);if(n.kind===`absent`)return n;if(n.kind!==`content`)return{kind:n.kind,path:e.path,reason:n.reason};let r;try{r=JSON.parse(n.content)}catch(t){return{kind:`invalid`,path:e.path,reason:x(t)}}let i=r;if(e.key){if(!y(r))return{kind:`invalid`,path:e.path,reason:`expected a JSON object`};if(!Object.hasOwn(r,e.key))return{kind:`keyless`,path:e.path,key:e.key};i=r[e.key]}if(!y(i)){let t=e.key?`the "${e.key}" key`:`the file`;return{kind:`invalid`,path:e.path,reason:`expected ${t} to be an object`}}return{kind:`found`,config:j(i,e.path)}}function N(e){let t=g.find(t=>t.path===T(e));return t?{...t,path:e}:{path:e}}function P(t,n){e.s(`[logan-logger] cannot read config at ${t} — no permission; using defaults instead: ${n}`)}async function F(t,n={}){let r=e.v();if(!r.capabilities.fileSystem)return{};let i=n.cwd||E(r.name),a=await w(r.name,i);if(t!==void 0){let e=a(t),n=await M(N(e),r.name);if(n.kind===`found`)return n.config;if(n.kind===`absent`)throw Error(`[logan-logger] config file not found: ${e}`);if(n.kind===`keyless`)throw Error(`[logan-logger] no "${n.key}" key in ${n.path}`);if(n.kind===`denied`)return P(n.path,n.reason),{};throw n.kind===`unreadable`?Error(`[logan-logger] config at ${n.path} is not a readable file: ${n.reason}`):Error(`[logan-logger] config at ${n.path} is invalid: ${n.reason}`)}for(let t of g){let n=await M({...t,path:a(t.path)},r.name);if(n.kind===`found`)return n.config;if(n.kind===`invalid`)return e.s(`[logan-logger] config at ${n.path} is invalid: ${n.reason}`),{};if(n.kind===`denied`)return P(n.path,n.reason),{};n.kind===`unreadable`&&e.s(`[logan-logger] skipping ${n.path}: not a readable file (${n.reason})`)}return{}}Object.defineProperty(exports,"a",{enumerable:!0,get:function(){return h}}),Object.defineProperty(exports,"c",{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,"d",{enumerable:!0,get:function(){return r}}),Object.defineProperty(exports,"f",{enumerable:!0,get:function(){return n}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return d}}),Object.defineProperty(exports,"l",{enumerable:!0,get:function(){return i}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,"o",{enumerable:!0,get:function(){return m}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return u}}),Object.defineProperty(exports,"s",{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return F}}),Object.defineProperty(exports,"u",{enumerable:!0,get:function(){return a}});
1
+ const e=require("./config-IINkkZ84.cjs");var t=new Map;function n(e,n){t.set(e,n)}function r(e){return t.get(e)}var i=class{constructor(e={}){this.type=`console`,this.level=e.level,this.format=e.format===`json`?`json`:`text`,this.formatOptions={timestamp:e.timestamp!==!1,colorize:e.colorize===!0}}write(t){let n=e.l(t,this.format,this.formatOptions);switch(t.level){case e._.DEBUG:console.debug(n);break;case e._.WARN:console.warn(n);break;case e._.ERROR:console.error(n);break;default:console.info(n)}}};n(`console`,(e,t)=>{let n=e.options??{};return new i({format:n.format??t.format,timestamp:n.timestamp??t.timestamp,colorize:n.colorize??t.colorize,level:e.level})}),n(`custom`,e=>{let t=e.options?.transport;if(!t||typeof t.write!=`function`)throw Error(`custom transport requires options.transport to be an object with a write(entry) method`);return e.level===void 0?t:{type:t.type??`custom`,level:e.level,write:e=>t.write(e),close:t.close?()=>t.close?.():void 0}});function a(e){let t={format:e.format??`text`,timestamp:e.timestamp??!0,colorize:e.colorize??!1};if(e.transports===void 0)return[new i({format:t.format,timestamp:t.timestamp,colorize:t.colorize})];let n=[];for(let i of e.transports){let e=r(i.type);if(!e){console.warn(`[logan-logger] ${o(i.type)}`);continue}try{n.push(e(i,t))}catch(e){console.warn(`[logan-logger] transport '${i.type}' failed to initialize:`,e)}}return n}function o(e){return e===`file`?`the 'file' transport is not registered; import from 'logan-logger/node' (or 'logan-logger/bun') rather than the main entry point to use file logging`:e===`http`?`the 'http' transport is not built in; supply one with { type: 'custom', options: { transport } }`:`unknown transport type '${e}'; skipping`}var s=class t extends e.g{constructor(e={},t){super(e),this.transports=t??a(e)}getTransports(){return this.transports}close(){for(let e of this.transports)e.close?.()}writeLog(e){for(let t of this.transports)if(!(t.level!==void 0&&e.level<t.level))try{t.write(e)}catch(e){console.warn(`[logan-logger] transport '${t.type}' failed to write:`,e)}}createChild(){return new t(this.config,this.transports)}};function c(e){return{write:t=>{e.info(t.trim())}}}var l=class t{static create(n={}){let r=e.v(),i=t.mergeConfig(n);switch(r.name){case`node`:return new s(i);case`deno`:return new e.u(i);case`bun`:return new s(i);case`browser`:case`webworker`:return new e.u(i);default:return new e.u(i)}}static createChild(e,t){return e.child(t)}static mergeConfig(t){let n=t.ignoreEnvironment?{}:e.n();return e.r(t,n)}};function u(e){return l.create(e)}function d(){let t=f();return u({level:p(t),colorize:t!==`production`&&e.a(),timestamp:!0,format:t===`production`?`json`:`text`})}function f(){return typeof process<`u`&&process.env?process.env.NODE_ENV||process.env.NEXT_PUBLIC_APP_ENV||process.env.ENVIRONMENT||`development`:typeof window<`u`&&globalThis.__ENV__||`development`}function p(t){switch(t){case`production`:return e._.ERROR;case`staging`:case`test`:return e._.WARN;case`development`:case`dev`:return e._.DEBUG;default:return e._.INFO}}function m(t){return e.o(t)??e._.INFO}function h(t){switch(t){case e._.DEBUG:return`debug`;case e._.INFO:return`info`;case e._.WARN:return`warn`;case e._.ERROR:return`error`;case e._.SILENT:return`silent`;default:return`info`}}var g=[{path:`logan.config.json`},{path:`.loganrc`},{path:`package.json`,key:`logan`}],_=new Set([`level`,`format`,`timestamp`,`colorize`,`ignoreEnvironment`,`metadata`,`transports`,`$schema`]),v=new Set([`EACCES`,`EPERM`,`NotCapable`,`PermissionDenied`]);function y(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function b(e){return e instanceof Error?e.message:String(e)}function x(e){let t=/at position \d+(?: \(line \d+ column \d+\))?/.exec(b(e));return t?`not valid JSON (${t[0]})`:`not valid JSON`}function S(e){return e.startsWith(`/`)||e.startsWith(`\\`)||/^[A-Za-z]:/.test(e)}function C(e,t){return t===void 0||t===``||S(e)?e:`${t.replace(/[\\/]+$/,``)}/${e}`}async function w(e,t){if(e===`deno`)return e=>C(e,t);let{resolve:n}=await import(`node:path`);return t===void 0?e=>n(e):e=>n(t,e)}function T(e){let t=e.split(/[\\/]/);return t[t.length-1]||e}function E(e){if(e===`deno`)try{return globalThis.Deno?.cwd?.()}catch{return}return typeof process<`u`&&typeof process.cwd==`function`?process.cwd():void 0}function D(e){let t=e?.code??``,n=e?.name??``;return t===`ENOENT`||n===`NotFound`?{kind:`absent`}:v.has(t)||v.has(n)?{kind:`denied`,reason:b(e)}:{kind:`unreadable`,reason:b(e)}}async function O(e,t){let n=t===`deno`?()=>globalThis.Deno.readTextFile(e):async()=>(await import(`node:fs/promises`)).readFile(e,`utf-8`);try{return{kind:`content`,content:await n()}}catch(e){return D(e)}}function k(t){if(typeof t==`string`)return e.o(t);if(typeof t==`number`&&e._[t]!==void 0)return t}function A(t,n,r){let i=t=>{e.s(`[logan-logger] ${r}: ignoring transports[${n}]: ${t}.`)};if(!y(t)){i(`expected an object, got ${JSON.stringify(t)??typeof t}`);return}if(typeof t.type!=`string`){i(`"type" is required and must be a string`);return}if(t.options!==void 0&&!y(t.options)){i(`"options" must be an object`);return}let a={type:t.type,options:t.options??{}};if(t.level!==void 0){let i=k(t.level);i===void 0?e.s(`[logan-logger] ${r}: ignoring transports[${n}].level=${JSON.stringify(t.level)}. Accepted: debug, info, warn, error, silent.`):a.level=i}return a}function j(t,n){let r={},i=(t,r,i)=>{e.s(`[logan-logger] ${n}: ignoring ${t}=${JSON.stringify(r)}. Accepted: ${i}.`)};for(let r of Object.keys(t))_.has(r)||e.s(`[logan-logger] ${n}: ignoring unknown field "${r}". Known fields: level, format, timestamp, colorize, ignoreEnvironment, metadata, transports.`);if(t.level!==void 0){let e=k(t.level);e===void 0?i(`level`,t.level,`debug, info, warn, error, silent`):r.level=e}t.format!==void 0&&(t.format===`json`||t.format===`text`||t.format===`custom`?r.format=t.format:i(`format`,t.format,`json, text, custom`));for(let e of[`timestamp`,`colorize`,`ignoreEnvironment`])t[e]!==void 0&&(typeof t[e]==`boolean`?r[e]=t[e]:i(e,t[e],`true, false`));if(t.metadata!==void 0&&(y(t.metadata)?r.metadata=t.metadata:i(`metadata`,t.metadata,`an object`)),Array.isArray(t.transports)){let e=t.transports.map((e,t)=>A(e,t,n)).filter(e=>e!==void 0);(e.length>0||t.transports.length===0)&&(r.transports=e)}else t.transports!==void 0&&i(`transports`,t.transports,`an array of transport configs`);return r}async function M(e,t){let n=await O(e.path,t);if(n.kind===`absent`)return n;if(n.kind!==`content`)return{kind:n.kind,path:e.path,reason:n.reason};let r;try{r=JSON.parse(n.content)}catch(t){return{kind:`invalid`,path:e.path,reason:x(t)}}let i=r;if(e.key){if(!y(r))return{kind:`invalid`,path:e.path,reason:`expected a JSON object`};if(!Object.hasOwn(r,e.key))return{kind:`keyless`,path:e.path,key:e.key};i=r[e.key]}if(!y(i)){let t=e.key?`the "${e.key}" key`:`the file`;return{kind:`invalid`,path:e.path,reason:`expected ${t} to be an object`}}return{kind:`found`,config:j(i,e.path)}}function N(e){let t=g.find(t=>t.path===T(e));return t?{...t,path:e}:{path:e}}function P(t,n){e.s(`[logan-logger] cannot read config at ${t} — no permission; using defaults instead: ${n}`)}async function F(t,n={}){let r=e.v();if(!r.capabilities.fileSystem)return{};let i=n.cwd||E(r.name),a=await w(r.name,i);if(t!==void 0){let e=a(t),n=await M(N(e),r.name);if(n.kind===`found`)return n.config;if(n.kind===`absent`)throw Error(`[logan-logger] config file not found: ${e}`);if(n.kind===`keyless`)throw Error(`[logan-logger] no "${n.key}" key in ${n.path}`);if(n.kind===`denied`)return P(n.path,n.reason),{};throw n.kind===`unreadable`?Error(`[logan-logger] config at ${n.path} is not a readable file: ${n.reason}`):Error(`[logan-logger] config at ${n.path} is invalid: ${n.reason}`)}for(let t of g){let n=await M({...t,path:a(t.path)},r.name);if(n.kind===`found`)return n.config;if(n.kind===`invalid`)return e.s(`[logan-logger] config at ${n.path} is invalid: ${n.reason}`),{};if(n.kind===`denied`)return P(n.path,n.reason),{};n.kind===`unreadable`&&e.s(`[logan-logger] skipping ${n.path}: not a readable file (${n.reason})`)}return{}}Object.defineProperty(exports,"a",{enumerable:!0,get:function(){return h}}),Object.defineProperty(exports,"c",{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,"d",{enumerable:!0,get:function(){return r}}),Object.defineProperty(exports,"f",{enumerable:!0,get:function(){return n}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return d}}),Object.defineProperty(exports,"l",{enumerable:!0,get:function(){return i}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,"o",{enumerable:!0,get:function(){return m}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return u}}),Object.defineProperty(exports,"s",{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return F}}),Object.defineProperty(exports,"u",{enumerable:!0,get:function(){return a}});
@@ -1,5 +1,5 @@
1
- import { l as e } from "./config-CpbjY9zX.mjs";
2
- import { f as t } from "./config-file-CvMv3rgc.mjs";
1
+ import { l as e } from "./config-BARemYd2.mjs";
2
+ import { f as t } from "./config-file-BkYtEgDX.mjs";
3
3
  import { closeSync as n, existsSync as r, fstatSync as i, mkdirSync as a, openSync as o, renameSync as s, unlinkSync as c, writeSync as l } from "node:fs";
4
4
  import { dirname as u, resolve as d } from "node:path";
5
5
  //#region src/runtime/file-transport.ts
@@ -1 +1 @@
1
- const e=require("./config-DpSCCiRz.cjs"),t=require("./config-file-WYBC6sSB.cjs");let n=require("node:fs"),r=require("node:path");var i=5242880,a=5,o=class{constructor(e){if(this.type=`file`,this.size=0,this.warned=!1,!e?.filename)throw Error(`file transport requires options.filename`);this.path=(0,r.resolve)(e.filename),this.maxsize=e.maxsize??i,this.maxFiles=e.maxFiles??a,this.format=e.format===`text`?`text`:`json`,this.timestamp=e.timestamp!==!1,this.level=e.level}get filename(){return this.path}write(t){let r=`${e.l(t,this.format,{timestamp:this.timestamp,colorize:!1})}\n`;try{this.open(),this.maxsize>0&&this.size>=this.maxsize&&(this.rotate(),this.open()),this.size+=(0,n.writeSync)(this.fd,r)}catch(e){this.warnOnce(e)}}close(){if(this.fd!==void 0)try{(0,n.closeSync)(this.fd)}finally{this.fd=void 0}}open(){if(this.fd!==void 0)return;let e=(0,r.dirname)(this.path);try{(0,n.mkdirSync)(e,{recursive:!0})}catch(t){throw s(`create log directory`,e,t)}try{this.fd=(0,n.openSync)(this.path,`a`)}catch(e){throw s(`open log file`,this.path,e)}this.size=(0,n.fstatSync)(this.fd).size}rotate(){if(this.close(),this.maxFiles<=0){(0,n.existsSync)(this.path)&&(0,n.unlinkSync)(this.path),this.size=0;return}let e=`${this.path}.${this.maxFiles}`;(0,n.existsSync)(e)&&(0,n.unlinkSync)(e);for(let e=this.maxFiles-1;e>=1;e--){let t=`${this.path}.${e}`;(0,n.existsSync)(t)&&(0,n.renameSync)(t,`${this.path}.${e+1}`)}(0,n.existsSync)(this.path)&&(0,n.renameSync)(this.path,`${this.path}.1`),this.size=0}warnOnce(e){this.close(),!this.warned&&(this.warned=!0,console.warn(`[logan-logger] file transport for '${this.path}' failed and will keep retrying quietly:`,e instanceof Error?e.message:e))}};function s(e,t,n){let r=n,i=r?.code?` [${r.code}]`:``,a=r?.syscall?` during ${r.syscall}`:``,o=Error(`could not ${e} '${t}'${i}${a}: ${r?.message??n}`);return o.cause=n,o}t.f(`file`,(e,t)=>{let n=e.options??{};return new o({filename:n.filename,maxsize:n.maxsize,maxFiles:n.maxFiles,format:n.format,timestamp:n.timestamp??t.timestamp,level:e.level})}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return o}});
1
+ const e=require("./config-IINkkZ84.cjs"),t=require("./config-file-Cyys9_yO.cjs");let n=require("node:fs"),r=require("node:path");var i=5242880,a=5,o=class{constructor(e){if(this.type=`file`,this.size=0,this.warned=!1,!e?.filename)throw Error(`file transport requires options.filename`);this.path=(0,r.resolve)(e.filename),this.maxsize=e.maxsize??i,this.maxFiles=e.maxFiles??a,this.format=e.format===`text`?`text`:`json`,this.timestamp=e.timestamp!==!1,this.level=e.level}get filename(){return this.path}write(t){let r=`${e.l(t,this.format,{timestamp:this.timestamp,colorize:!1})}\n`;try{this.open(),this.maxsize>0&&this.size>=this.maxsize&&(this.rotate(),this.open()),this.size+=(0,n.writeSync)(this.fd,r)}catch(e){this.warnOnce(e)}}close(){if(this.fd!==void 0)try{(0,n.closeSync)(this.fd)}finally{this.fd=void 0}}open(){if(this.fd!==void 0)return;let e=(0,r.dirname)(this.path);try{(0,n.mkdirSync)(e,{recursive:!0})}catch(t){throw s(`create log directory`,e,t)}try{this.fd=(0,n.openSync)(this.path,`a`)}catch(e){throw s(`open log file`,this.path,e)}this.size=(0,n.fstatSync)(this.fd).size}rotate(){if(this.close(),this.maxFiles<=0){(0,n.existsSync)(this.path)&&(0,n.unlinkSync)(this.path),this.size=0;return}let e=`${this.path}.${this.maxFiles}`;(0,n.existsSync)(e)&&(0,n.unlinkSync)(e);for(let e=this.maxFiles-1;e>=1;e--){let t=`${this.path}.${e}`;(0,n.existsSync)(t)&&(0,n.renameSync)(t,`${this.path}.${e+1}`)}(0,n.existsSync)(this.path)&&(0,n.renameSync)(this.path,`${this.path}.1`),this.size=0}warnOnce(e){this.close(),!this.warned&&(this.warned=!0,console.warn(`[logan-logger] file transport for '${this.path}' failed and will keep retrying quietly:`,e instanceof Error?e.message:e))}};function s(e,t,n){let r=n,i=r?.code?` [${r.code}]`:``,a=r?.syscall?` during ${r.syscall}`:``,o=Error(`could not ${e} '${t}'${i}${a}: ${r?.message??n}`);return o.cause=n,o}t.f(`file`,(e,t)=>{let n=e.options??{};return new o({filename:n.filename,maxsize:n.maxsize,maxFiles:n.maxFiles,format:n.format,timestamp:n.timestamp??t.timestamp,level:e.level})}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return o}});
package/dist/deno.cjs CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./chunks/config-DpSCCiRz.cjs"),t=require("./chunks/config-file-WYBC6sSB.cjs");exports.BrowserLogger=e.u,exports.ConsoleGroupLogger=e.d,exports.ConsoleTransport=t.l,exports.PerformanceLogger=e.f,exports.createLogger=t.r,exports.createLoggerForEnvironment=t.i,exports.createTransports=t.u,exports.detectRuntime=e.v,exports.filterSensitiveData=e.p,exports.formatLevel=e.c,exports.formatLogEntry=e.l,exports.getDefaultConfig=e.t,exports.isBrowser=e.y,exports.isBun=e.b,exports.isDeno=e.x,exports.isNode=e.S,exports.loadConfigFromEnvironment=e.n,exports.loadConfigFromFile=t.t,exports.mergeConfigs=e.r,exports.registerTransport=t.f,exports.resetEnvironmentWarnings=e.i,exports.safeStringify=e.m,exports.serializeError=e.h,exports.shouldColorize=e.a,exports.tryParseLogLevel=e.o;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./chunks/config-IINkkZ84.cjs"),t=require("./chunks/config-file-Cyys9_yO.cjs");exports.BrowserLogger=e.u,exports.ConsoleGroupLogger=e.d,exports.ConsoleTransport=t.l,exports.PerformanceLogger=e.f,exports.createLogger=t.r,exports.createLoggerForEnvironment=t.i,exports.createTransports=t.u,exports.detectRuntime=e.v,exports.filterSensitiveData=e.p,exports.formatLevel=e.c,exports.formatLogEntry=e.l,exports.getDefaultConfig=e.t,exports.isBrowser=e.y,exports.isBun=e.b,exports.isDeno=e.x,exports.isNode=e.S,exports.loadConfigFromEnvironment=e.n,exports.loadConfigFromFile=t.t,exports.mergeConfigs=e.r,exports.registerTransport=t.f,exports.resetEnvironmentWarnings=e.i,exports.safeStringify=e.m,exports.serializeError=e.h,exports.shouldColorize=e.a,exports.tryParseLogLevel=e.o;
package/dist/deno.mjs CHANGED
@@ -1,3 +1,3 @@
1
- import { S as e, a as t, b as n, c as r, d as i, f as a, h as o, i as s, l as c, m as l, n as u, o as d, p as f, r as p, t as m, u as h, v as g, x as _, y as v } from "./chunks/config-CpbjY9zX.mjs";
2
- import { f as y, i as b, l as x, r as S, t as C, u as w } from "./chunks/config-file-CvMv3rgc.mjs";
1
+ import { S as e, a as t, b as n, c as r, d as i, f as a, h as o, i as s, l as c, m as l, n as u, o as d, p as f, r as p, t as m, u as h, v as g, x as _, y as v } from "./chunks/config-BARemYd2.mjs";
2
+ import { f as y, i as b, l as x, r as S, t as C, u as w } from "./chunks/config-file-BkYtEgDX.mjs";
3
3
  export { h as BrowserLogger, i as ConsoleGroupLogger, x as ConsoleTransport, a as PerformanceLogger, S as createLogger, b as createLoggerForEnvironment, w as createTransports, g as detectRuntime, f as filterSensitiveData, r as formatLevel, c as formatLogEntry, m as getDefaultConfig, v as isBrowser, n as isBun, _ as isDeno, e as isNode, u as loadConfigFromEnvironment, C as loadConfigFromFile, p as mergeConfigs, y as registerTransport, s as resetEnvironmentWarnings, l as safeStringify, o as serializeError, t as shouldColorize, d as tryParseLogLevel };
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./chunks/config-DpSCCiRz.cjs"),t=require("./chunks/config-file-WYBC6sSB.cjs");var n=t.i(),r={debug:(e,t)=>n.debug(e,t),info:(e,t)=>n.info(e,t),warn:(e,t)=>n.warn(e,t),error:(e,t)=>n.error(e,t)};exports.BaseLogger=e.g,exports.BrowserLogger=e.u,exports.ConsoleGroupLogger=e.d,exports.ConsoleTransport=t.l,exports.LogLevel=e._,exports.LoggerFactory=t.n,exports.PerformanceLogger=e.f,exports.createLogger=t.r,exports.createLoggerForEnvironment=t.i,exports.createTransports=t.u,exports.detectRuntime=e.v,exports.filterSensitiveData=e.p,exports.formatLevel=e.c,exports.formatLogEntry=e.l,exports.getDefaultConfig=e.t,exports.getTransportFactory=t.d,exports.isBrowser=e.y,exports.isBun=e.b,exports.isDeno=e.x,exports.isNode=e.S,exports.loadConfigFromEnvironment=e.n,exports.loadConfigFromFile=t.t,exports.log=r,exports.logLevelToString=t.a,exports.logger=n,exports.mergeConfigs=e.r,exports.registerTransport=t.f,exports.resetEnvironmentWarnings=e.i,exports.safeStringify=e.m,exports.serializeError=e.h,exports.shouldColorize=e.a,exports.stringToLogLevel=t.o,exports.tryParseLogLevel=e.o;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./chunks/config-IINkkZ84.cjs"),t=require("./chunks/config-file-Cyys9_yO.cjs");var n=t.i(),r={debug:(e,t)=>n.debug(e,t),info:(e,t)=>n.info(e,t),warn:(e,t)=>n.warn(e,t),error:(e,t)=>n.error(e,t)};exports.BaseLogger=e.g,exports.BrowserLogger=e.u,exports.ConsoleGroupLogger=e.d,exports.ConsoleTransport=t.l,exports.LogLevel=e._,exports.LoggerFactory=t.n,exports.PerformanceLogger=e.f,exports.createLogger=t.r,exports.createLoggerForEnvironment=t.i,exports.createTransports=t.u,exports.detectRuntime=e.v,exports.filterSensitiveData=e.p,exports.formatLevel=e.c,exports.formatLogEntry=e.l,exports.getDefaultConfig=e.t,exports.getTransportFactory=t.d,exports.isBrowser=e.y,exports.isBun=e.b,exports.isDeno=e.x,exports.isNode=e.S,exports.loadConfigFromEnvironment=e.n,exports.loadConfigFromFile=t.t,exports.log=r,exports.logLevelToString=t.a,exports.logger=n,exports.mergeConfigs=e.r,exports.registerTransport=t.f,exports.resetEnvironmentWarnings=e.i,exports.safeStringify=e.m,exports.serializeError=e.h,exports.shouldColorize=e.a,exports.stringToLogLevel=t.o,exports.tryParseLogLevel=e.o;
package/dist/index.mjs CHANGED
@@ -1,5 +1,5 @@
1
- import { S as e, _ as t, a as n, b as r, c as i, d as a, f as o, g as s, h as c, i as l, l as u, m as d, n as f, o as p, p as m, r as h, t as g, u as _, v, x as y, y as b } from "./chunks/config-CpbjY9zX.mjs";
2
- import { a as x, d as S, f as C, i as w, l as T, n as E, o as D, r as O, t as k, u as A } from "./chunks/config-file-CvMv3rgc.mjs";
1
+ import { S as e, _ as t, a as n, b as r, c as i, d as a, f as o, g as s, h as c, i as l, l as u, m as d, n as f, o as p, p as m, r as h, t as g, u as _, v, x as y, y as b } from "./chunks/config-BARemYd2.mjs";
2
+ import { a as x, d as S, f as C, i as w, l as T, n as E, o as D, r as O, t as k, u as A } from "./chunks/config-file-BkYtEgDX.mjs";
3
3
  //#region src/index.ts
4
4
  var j = w(), M = {
5
5
  debug: (e, t) => j.debug(e, t),
package/dist/node.cjs CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./chunks/config-file-WYBC6sSB.cjs"),t=require("./chunks/file-transport-B34EGzxL.cjs");exports.ConsoleTransport=e.l,exports.FileTransport=t.t,exports.NodeLogger=e.s,exports.createLogger=e.r,exports.createLoggerForEnvironment=e.i,exports.createMorganStream=e.c,exports.createTransports=e.u,exports.loadConfigFromFile=e.t,exports.registerTransport=e.f;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./chunks/config-file-Cyys9_yO.cjs"),t=require("./chunks/file-transport-CZW_2423.cjs");exports.ConsoleTransport=e.l,exports.FileTransport=t.t,exports.NodeLogger=e.s,exports.createLogger=e.r,exports.createLoggerForEnvironment=e.i,exports.createMorganStream=e.c,exports.createTransports=e.u,exports.loadConfigFromFile=e.t,exports.registerTransport=e.f;
package/dist/node.mjs CHANGED
@@ -1,3 +1,3 @@
1
- import { c as e, f as t, i as n, l as r, r as i, s as a, t as o, u as s } from "./chunks/config-file-CvMv3rgc.mjs";
2
- import { t as c } from "./chunks/file-transport-yIPiX8TP.mjs";
1
+ import { c as e, f as t, i as n, l as r, r as i, s as a, t as o, u as s } from "./chunks/config-file-BkYtEgDX.mjs";
2
+ import { t as c } from "./chunks/file-transport-CCCBjSLN.mjs";
3
3
  export { r as ConsoleTransport, c as FileTransport, a as NodeLogger, i as createLogger, n as createLoggerForEnvironment, e as createMorganStream, s as createTransports, o as loadConfigFromFile, t as registerTransport };
@@ -24,14 +24,27 @@ export interface SafeStringifyOptions {
24
24
  export declare function safeStringify(obj: any, space?: number, options?: SafeStringifyOptions): string;
25
25
  /**
26
26
  * Filter out sensitive data from an object before logging.
27
+ *
28
+ * Never applied automatically — the caller invokes it (SPEC §8.3).
29
+ *
30
+ * Both the field name and each key are split into tokens, so `api_key`, `apiKey`
31
+ * and `API-KEY` are all redacted while `monkey` and `tokenizer` are not. A field
32
+ * matches a key when every token of the key is present in the field name, or
33
+ * when the two token lists joined are equal; a token also matches that token
34
+ * followed by `s`. Supplying a key set **replaces** the defaults rather than
35
+ * extending them.
36
+ *
37
+ * Because matching is on whole tokens, a name like `mytoken` is one token and is
38
+ * not redacted; pass your own keys if your codebase names fields that way.
39
+ *
27
40
  * @param obj - The object to filter
28
- * @param sensitiveKeys - Array of key names to redact (case-insensitive)
41
+ * @param sensitiveKeys - Key names to redact, tokenized and matched case-insensitively
29
42
  * @returns A new object with sensitive values replaced with '[REDACTED]'
30
43
  * @example
31
44
  * ```typescript
32
- * const data = { username: 'john', password: 'secret123' };
45
+ * const data = { username: 'john', password: 'secret123', monkey: 'george' };
33
46
  * const filtered = filterSensitiveData(data);
34
- * // Result: { username: 'john', password: '[REDACTED]' }
47
+ * // Result: { username: 'john', password: '[REDACTED]', monkey: 'george' }
35
48
  * ```
36
49
  */
37
50
  export declare function filterSensitiveData(obj: any, sensitiveKeys?: string[]): any;
@@ -24,14 +24,27 @@ export interface SafeStringifyOptions {
24
24
  export declare function safeStringify(obj: any, space?: number, options?: SafeStringifyOptions): string;
25
25
  /**
26
26
  * Filter out sensitive data from an object before logging.
27
+ *
28
+ * Never applied automatically — the caller invokes it (SPEC §8.3).
29
+ *
30
+ * Both the field name and each key are split into tokens, so `api_key`, `apiKey`
31
+ * and `API-KEY` are all redacted while `monkey` and `tokenizer` are not. A field
32
+ * matches a key when every token of the key is present in the field name, or
33
+ * when the two token lists joined are equal; a token also matches that token
34
+ * followed by `s`. Supplying a key set **replaces** the defaults rather than
35
+ * extending them.
36
+ *
37
+ * Because matching is on whole tokens, a name like `mytoken` is one token and is
38
+ * not redacted; pass your own keys if your codebase names fields that way.
39
+ *
27
40
  * @param obj - The object to filter
28
- * @param sensitiveKeys - Array of key names to redact (case-insensitive)
41
+ * @param sensitiveKeys - Key names to redact, tokenized and matched case-insensitively
29
42
  * @returns A new object with sensitive values replaced with '[REDACTED]'
30
43
  * @example
31
44
  * ```typescript
32
- * const data = { username: 'john', password: 'secret123' };
45
+ * const data = { username: 'john', password: 'secret123', monkey: 'george' };
33
46
  * const filtered = filterSensitiveData(data);
34
- * // Result: { username: 'john', password: '[REDACTED]' }
47
+ * // Result: { username: 'john', password: '[REDACTED]', monkey: 'george' }
35
48
  * ```
36
49
  */
37
50
  export declare function filterSensitiveData(obj: any, sensitiveKeys?: string[]): any;
@@ -24,14 +24,27 @@ export interface SafeStringifyOptions {
24
24
  export declare function safeStringify(obj: any, space?: number, options?: SafeStringifyOptions): string;
25
25
  /**
26
26
  * Filter out sensitive data from an object before logging.
27
+ *
28
+ * Never applied automatically — the caller invokes it (SPEC §8.3).
29
+ *
30
+ * Both the field name and each key are split into tokens, so `api_key`, `apiKey`
31
+ * and `API-KEY` are all redacted while `monkey` and `tokenizer` are not. A field
32
+ * matches a key when every token of the key is present in the field name, or
33
+ * when the two token lists joined are equal; a token also matches that token
34
+ * followed by `s`. Supplying a key set **replaces** the defaults rather than
35
+ * extending them.
36
+ *
37
+ * Because matching is on whole tokens, a name like `mytoken` is one token and is
38
+ * not redacted; pass your own keys if your codebase names fields that way.
39
+ *
27
40
  * @param obj - The object to filter
28
- * @param sensitiveKeys - Array of key names to redact (case-insensitive)
41
+ * @param sensitiveKeys - Key names to redact, tokenized and matched case-insensitively
29
42
  * @returns A new object with sensitive values replaced with '[REDACTED]'
30
43
  * @example
31
44
  * ```typescript
32
- * const data = { username: 'john', password: 'secret123' };
45
+ * const data = { username: 'john', password: 'secret123', monkey: 'george' };
33
46
  * const filtered = filterSensitiveData(data);
34
- * // Result: { username: 'john', password: '[REDACTED]' }
47
+ * // Result: { username: 'john', password: '[REDACTED]', monkey: 'george' }
35
48
  * ```
36
49
  */
37
50
  export declare function filterSensitiveData(obj: any, sensitiveKeys?: string[]): any;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "logan-logger",
3
- "version": "2.1.0",
3
+ "version": "2.3.0",
4
4
  "packageManager": "pnpm@11.9.0",
5
5
  "description": "Universal TypeScript logging library for all JavaScript runtimes",
6
6
  "main": "dist/index.cjs",
@@ -122,7 +122,7 @@
122
122
  "vitest": "^4.1.0"
123
123
  },
124
124
  "engines": {
125
- "node": "^20.19.0 || >=22.12.0"
125
+ "node": ">=22.12.0"
126
126
  },
127
127
  "files": [
128
128
  "dist",
@@ -1 +0,0 @@
1
- function e(){let e=t();return{name:e,version:n(e),capabilities:r(e)}}function t(){return globalThis.Deno===void 0?globalThis.Bun===void 0?typeof window<`u`&&typeof document<`u`?`browser`:typeof globalThis.importScripts==`function`&&typeof window>`u`?`webworker`:typeof process<`u`&&process.versions&&process.versions.node?`node`:`unknown`:`bun`:`deno`}function n(e){switch(e){case`node`:return typeof process<`u`?process.version:void 0;case`deno`:return globalThis.Deno===void 0?void 0:globalThis.Deno.version?.deno;case`bun`:return globalThis.Bun===void 0?void 0:globalThis.Bun.version;case`browser`:return typeof navigator<`u`?navigator.userAgent:void 0;default:return}}function r(e){switch(e){case`node`:return{fileSystem:!0,colorSupport:!0,processInfo:!0,streams:!0};case`deno`:return{fileSystem:!0,colorSupport:!0,processInfo:!0,streams:!0};case`bun`:return{fileSystem:!0,colorSupport:!0,processInfo:!0,streams:!0};case`browser`:return{fileSystem:!1,colorSupport:!0,processInfo:!1,streams:!1};case`webworker`:return{fileSystem:!1,colorSupport:!1,processInfo:!1,streams:!1};default:return{fileSystem:!1,colorSupport:!1,processInfo:!1,streams:!1}}}function i(){return t()===`node`}function a(){return t()===`browser`}function o(){return t()===`deno`}function s(){return t()===`bun`}var c=function(e){return e[e.DEBUG=0]=`DEBUG`,e[e.INFO=1]=`INFO`,e[e.WARN=2]=`WARN`,e[e.ERROR=3]=`ERROR`,e[e.SILENT=4]=`SILENT`,e}({}),l=class{constructor(t={}){this.childMetadata={},this.config=t,this.level=t.level??c.INFO,this.runtime=e().name,this.childMetadata={...t.metadata}}debug(e,t){this.log(c.DEBUG,e,t)}info(e,t){this.log(c.INFO,e,t)}warn(e,t){this.log(c.WARN,e,t)}error(e,t){this.log(c.ERROR,e,t)}log(e,t,n){if(!this.shouldLog(e))return;let r=typeof t==`function`?t():t,i={...this.childMetadata,...n},a={timestamp:new Date,level:e,message:r,metadata:Object.keys(i).length>0?i:void 0,runtime:this.runtime};this.writeLog(a)}setLevel(e){this.level=e}getLevel(){return this.level}child(e){let t=this.createChild();return t.childMetadata={...this.childMetadata,...e},t}shouldLog(e){return e>=this.level}},u=100;function d(e,t,n,r){if(e===void 0)return`[undefined]`;if(typeof e==`bigint`)return`[BigInt: ${e.toString()}]`;if(typeof e==`symbol`)return`[Symbol: ${e.toString()}]`;if(typeof e==`function`)return`[Function: ${e.name||`anonymous`}]`;if(typeof e!=`object`||!e)return e;let i=e;if(t.has(i))return`[Circular]`;if(n>=r)return`[MaxDepth]`;t.add(i);try{if(i instanceof Error)return f(_(i),t,n,r);let e=i.toJSON;if(typeof e==`function`)return d(e.call(i),t,n,r);if(Array.isArray(i)){let e=[];for(let a=0;a<i.length;a++)e.push(d(i[a],t,n+1,r));return e}return f(i,t,n,r)}finally{t.delete(i)}}function f(e,t,n,r){let i={};for(let[a,o]of Object.entries(e))i[a]=d(o,t,n+1,r);return i}function p(e,t,n={}){let r=n.maxDepth??u;return JSON.stringify(d(e,new Set,0,r),null,t)}function m(e,t=[`password`,`token`,`secret`,`key`,`auth`]){if(typeof e!=`object`||!e)return e;let n=Array.isArray(e)?[]:{};for(let[r,i]of Object.entries(e))n[r]=t.some(e=>r.toLowerCase().includes(e.toLowerCase()))?`[REDACTED]`:typeof i==`object`&&i?m(i,t):i;return n}var h=[`name`,`message`,`stack`];function g(e,t){let n=Object.getOwnPropertyDescriptor(e,t);if(n){if(n.get)try{return n.get.call(e)}catch{return`[Throws]`}return n.value}}function _(e){if(!(e instanceof Error))return e;let t={name:e.name,message:e.message};e.stack!==void 0&&(t.stack=e.stack);for(let n of Object.getOwnPropertyNames(e))h.includes(n)||(t[n]=g(e,n));return t}var v=class e extends l{constructor(e={}){super(e)}writeLog(e){let t=this.formatMessage(e),n=this.getConsoleStyle(e.level),r=`%c${t}${e.metadata?` ${p(e.metadata)}`:``}`;switch(e.level){case c.DEBUG:console.debug?console.debug(r,n):console.log(r,n);break;case c.INFO:console.info(r,n);break;case c.WARN:console.warn(r,n);break;case c.ERROR:console.error(r,n)}}createChild(){return new e(this.config)}formatMessage(e){return`[${e.timestamp.toISOString()}] ${c[e.level].toUpperCase()}: ${e.message}`}getConsoleStyle(e){if(!this.config.colorize)return``;switch(e){case c.DEBUG:return`color: #888; font-weight: normal;`;case c.INFO:return`color: #007acc; font-weight: normal;`;case c.WARN:return`color: #ff8c00; font-weight: bold;`;case c.ERROR:return`color: #dc3545; font-weight: bold;`;default:return``}}shouldLogInProduction(){return(globalThis.process?.env?.NODE_ENV||globalThis.process?.env?.NEXT_PUBLIC_APP_ENV||`development`)!==`production`||this.level<=c.ERROR}shouldLog(e){return!this.shouldLogInProduction()&&e<c.ERROR?!1:super.shouldLog(e)}},y=class extends v{constructor(...e){super(...e),this.groupStack=[]}group(e){console.group(e),this.groupStack.push(e)}groupCollapsed(e){console.groupCollapsed(e),this.groupStack.push(e)}groupEnd(){console.groupEnd(),this.groupStack.pop()}getCurrentGroupStack(){return[...this.groupStack]}getCurrentGroupPath(){return this.groupStack.join(` > `)}time(e){console.time(e)}timeEnd(e){console.timeEnd(e)}trace(e,t){console.trace(e,t)}count(e){console.count(e)}countReset(e){console.countReset(e)}table(e){console.table(e)}},b=class extends v{mark(e){typeof performance<`u`&&performance.mark&&performance.mark(e)}measure(e,t,n){if(typeof performance<`u`&&performance.measure)try{performance.measure(e,t,n);let r=performance.getEntriesByName(e,`measure`);if(r.length>0){let t=r[r.length-1];this.info(`Performance: ${e}`,{duration:t.duration,startTime:t.startTime})}}catch(t){this.warn(`Failed to measure performance`,{name:e,error:t})}}clearMarks(e){typeof performance<`u`&&performance.clearMarks&&performance.clearMarks(e)}clearMeasures(e){typeof performance<`u`&&performance.clearMeasures&&performance.clearMeasures(e)}};function x(e,t=`text`,n={}){if(t===`json`){let t={timestamp:e.timestamp.toISOString(),level:c[e.level].toLowerCase(),message:e.message,runtime:e.runtime};return e.metadata!==void 0&&(t.metadata=e.metadata),p(t)}let r=n.timestamp===!1?``:`[${e.timestamp.toISOString()}] `,i=S(e.level,n.colorize===!0),a=e.metadata?` ${p(e.metadata)}`:``;return`${r}${i}: ${e.message}${a}`}function S(e,t=!1){let n=c[e].toUpperCase();if(!t)return n;let r={[c.DEBUG]:`\x1B[36m`,[c.INFO]:`\x1B[32m`,[c.WARN]:`\x1B[33m`,[c.ERROR]:`\x1B[31m`,[c.SILENT]:`\x1B[37m`};return`${r[e]||r[c.INFO]}${n}`}var C=new Set;function w(e){C.has(e)||(C.add(e),console.warn(e))}function T(){C.clear()}function E(){return e().capabilities.colorSupport?typeof process>`u`||!process.env?!0:process.env.NO_COLOR?!1:process.env.FORCE_COLOR?process.env.FORCE_COLOR!==`0`:process.stdout?.isTTY===!0:!1}function D(){return{level:c.INFO,format:`text`,timestamp:!0,colorize:E(),metadata:{},transports:[{type:`console`,options:{}}]}}var O=[`true`,`1`,`yes`,`on`],k=[`false`,`0`,`no`,`off`];function A(){T()}function j(e){switch(e.trim().toLowerCase()){case`debug`:return c.DEBUG;case`info`:return c.INFO;case`warn`:case`warning`:return c.WARN;case`error`:return c.ERROR;case`silent`:case`none`:return c.SILENT;default:return}}function M(e,t){let n=t.trim().toLowerCase();if(O.includes(n))return!0;if(k.includes(n))return!1;w(`[logan-logger] ${e}="${t}" is not a recognized boolean and was ignored. Accepted: ${O.join(`, `)} / ${k.join(`, `)}.`)}function N(){let e={};if(typeof process>`u`||!process.env)return e;let t=process.env;if(t.LOG_LEVEL){let n=j(t.LOG_LEVEL);n===void 0?w(`[logan-logger] LOG_LEVEL="${t.LOG_LEVEL}" is not a recognized level and was ignored. Accepted: debug, info, warn, error, silent.`):e.level=n}if(t.LOG_FORMAT){let n=t.LOG_FORMAT.trim().toLowerCase();n===`json`||n===`text`?e.format=n:w(`[logan-logger] LOG_FORMAT="${t.LOG_FORMAT}" is not a recognized format and was ignored. Accepted: json, text.`)}if(t.LOG_TIMESTAMP){let n=M(`LOG_TIMESTAMP`,t.LOG_TIMESTAMP);n!==void 0&&(e.timestamp=n)}if(t.LOG_COLOR){let n=M(`LOG_COLOR`,t.LOG_COLOR);n!==void 0&&(e.colorize=n)}return e}function P(...e){let t=D();return e.reduce((e,t)=>({...e,...t,metadata:{...e.metadata,...t.metadata},transports:t.transports||e.transports}),t)}Object.defineProperty(exports,"S",{enumerable:!0,get:function(){return i}}),Object.defineProperty(exports,"_",{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,"a",{enumerable:!0,get:function(){return E}}),Object.defineProperty(exports,"b",{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,"c",{enumerable:!0,get:function(){return S}}),Object.defineProperty(exports,"d",{enumerable:!0,get:function(){return y}}),Object.defineProperty(exports,"f",{enumerable:!0,get:function(){return b}}),Object.defineProperty(exports,"g",{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,"h",{enumerable:!0,get:function(){return _}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return A}}),Object.defineProperty(exports,"l",{enumerable:!0,get:function(){return x}}),Object.defineProperty(exports,"m",{enumerable:!0,get:function(){return p}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return N}}),Object.defineProperty(exports,"o",{enumerable:!0,get:function(){return j}}),Object.defineProperty(exports,"p",{enumerable:!0,get:function(){return m}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return P}}),Object.defineProperty(exports,"s",{enumerable:!0,get:function(){return w}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return D}}),Object.defineProperty(exports,"u",{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,"v",{enumerable:!0,get:function(){return e}}),Object.defineProperty(exports,"x",{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,"y",{enumerable:!0,get:function(){return a}});