logan-logger 2.3.0 → 2.4.1

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/dist/browser.cjs CHANGED
@@ -1 +1 @@
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;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./chunks/config-CnELi-yt.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-BARemYd2.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-BBZVKKzL.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-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;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./chunks/config-CnELi-yt.cjs"),t=require("./chunks/config-file-Crelwql6.cjs"),n=require("./chunks/file-transport-CgP5N9OA.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-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";
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-BBZVKKzL.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-BXaWx_5g.mjs";
3
+ import { t as C } from "./chunks/file-transport-DcBX0d8O.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 };
@@ -72,24 +72,32 @@ function s() {
72
72
  return t() === "bun";
73
73
  }
74
74
  //#endregion
75
+ //#region src/core/internal.ts
76
+ var c = Symbol.for("logan-logger.internals");
77
+ function l(e) {
78
+ return e[c] ?? {};
79
+ }
80
+ //#endregion
75
81
  //#region src/core/types.ts
76
- var c = /* @__PURE__ */ function(e) {
82
+ var u = /* @__PURE__ */ function(e) {
77
83
  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;
78
- }({}), l = class {
84
+ }({}), d = () => /* @__PURE__ */ new Date(), f = class {
79
85
  constructor(t = {}) {
80
- this.childMetadata = {}, this.config = t, this.level = t.level ?? c.INFO, this.runtime = e().name, this.childMetadata = { ...t.metadata };
86
+ this.childMetadata = {}, this.config = t, this.level = t.level ?? u.INFO;
87
+ let n = l(t);
88
+ this.now = n.now ?? d, this.runtime = n.runtime ?? e().name, this.childMetadata = { ...t.metadata };
81
89
  }
82
90
  debug(e, t) {
83
- this.log(c.DEBUG, e, t);
91
+ this.log(u.DEBUG, e, t);
84
92
  }
85
93
  info(e, t) {
86
- this.log(c.INFO, e, t);
94
+ this.log(u.INFO, e, t);
87
95
  }
88
96
  warn(e, t) {
89
- this.log(c.WARN, e, t);
97
+ this.log(u.WARN, e, t);
90
98
  }
91
99
  error(e, t) {
92
- this.log(c.ERROR, e, t);
100
+ this.log(u.ERROR, e, t);
93
101
  }
94
102
  log(e, t, n) {
95
103
  if (!this.shouldLog(e)) return;
@@ -97,7 +105,7 @@ var c = /* @__PURE__ */ function(e) {
97
105
  ...this.childMetadata,
98
106
  ...n
99
107
  }, a = {
100
- timestamp: /* @__PURE__ */ new Date(),
108
+ timestamp: this.now(),
101
109
  level: e,
102
110
  message: r,
103
111
  metadata: Object.keys(i).length > 0 ? i : void 0,
@@ -121,8 +129,8 @@ var c = /* @__PURE__ */ function(e) {
121
129
  shouldLog(e) {
122
130
  return e >= this.level;
123
131
  }
124
- }, u = 100;
125
- function d(e, t, n, r) {
132
+ }, p = 100;
133
+ function m(e, t, n, r) {
126
134
  if (e === void 0) return "[undefined]";
127
135
  if (typeof e == "bigint") return `[BigInt: ${e.toString()}]`;
128
136
  if (typeof e == "symbol") return `[Symbol: ${e.toString()}]`;
@@ -133,29 +141,29 @@ function d(e, t, n, r) {
133
141
  if (n >= r) return "[MaxDepth]";
134
142
  t.add(i);
135
143
  try {
136
- if (i instanceof Error) return f(C(i), t, n, r);
144
+ if (i instanceof Error) return h(E(i), t, n, r);
137
145
  let e = i.toJSON;
138
- if (typeof e == "function") return d(e.call(i), t, n, r);
146
+ if (typeof e == "function") return m(e.call(i), t, n, r);
139
147
  if (Array.isArray(i)) {
140
148
  let e = [];
141
- for (let a = 0; a < i.length; a++) e.push(d(i[a], t, n + 1, r));
149
+ for (let a = 0; a < i.length; a++) e.push(m(i[a], t, n + 1, r));
142
150
  return e;
143
151
  }
144
- return f(i, t, n, r);
152
+ return h(i, t, n, r);
145
153
  } finally {
146
154
  t.delete(i);
147
155
  }
148
156
  }
149
- function f(e, t, n, r) {
157
+ function h(e, t, n, r) {
150
158
  let i = {};
151
- for (let [a, o] of Object.entries(e)) i[a] = d(o, t, n + 1, r);
159
+ for (let [a, o] of Object.entries(e)) i[a] = m(o, t, n + 1, r);
152
160
  return i;
153
161
  }
154
- function p(e, t, n = {}) {
155
- let r = n.maxDepth ?? u;
156
- return JSON.stringify(d(e, /* @__PURE__ */ new Set(), 0, r), null, t);
162
+ function g(e, t, n = {}) {
163
+ let r = n.maxDepth ?? p;
164
+ return JSON.stringify(m(e, /* @__PURE__ */ new Set(), 0, r), null, t);
157
165
  }
158
- var m = [
166
+ var _ = [
159
167
  "password",
160
168
  "token",
161
169
  "secret",
@@ -166,14 +174,14 @@ var m = [
166
174
  "authtoken",
167
175
  "accesstoken",
168
176
  "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());
177
+ ], v = /[A-Z]+(?![a-z])|[A-Z]?[a-z]+|[0-9]+/g;
178
+ function y(e) {
179
+ return (e.match(v) ?? []).map((e) => e.toLowerCase());
172
180
  }
173
- function _(e) {
181
+ function b(e) {
174
182
  let t = [];
175
183
  for (let n of e) {
176
- let e = g(n);
184
+ let e = y(n);
177
185
  if (e.length === 0) continue;
178
186
  let r = e.join("");
179
187
  t.push({
@@ -184,27 +192,30 @@ function _(e) {
184
192
  }
185
193
  return t;
186
194
  }
187
- function v(e, t) {
188
- let n = g(e);
195
+ function x(e, t) {
196
+ let n = y(e);
189
197
  if (n.length === 0) return !1;
190
198
  let r = n.join("");
191
199
  return t.some((e) => e.tokens.every(([e, t]) => n.includes(e) || n.includes(t)) || r === e.joined || r === e.joinedPlural);
192
200
  }
193
- function y(e, t) {
201
+ function S(e, t, n) {
194
202
  if (typeof e != "object" || !e) return e;
195
- let n = Array.isArray(e) ? [] : {};
196
- for (let [r, i] of Object.entries(e)) n[r] = v(r, t) ? "[REDACTED]" : typeof i == "object" && i ? y(i, t) : i;
197
- return n;
203
+ let r = n.get(e);
204
+ if (r !== void 0) return r;
205
+ let i = Array.isArray(e) ? [] : {};
206
+ n.set(e, i);
207
+ for (let [r, a] of Object.entries(e)) i[r] = x(r, t) ? "[REDACTED]" : S(a, t, n);
208
+ return i;
198
209
  }
199
- function b(e, t = m) {
200
- return y(e, _(t));
210
+ function C(e, t = _) {
211
+ return S(e, b(t), /* @__PURE__ */ new Map());
201
212
  }
202
- var x = [
213
+ var w = [
203
214
  "name",
204
215
  "message",
205
216
  "stack"
206
217
  ];
207
- function S(e, t) {
218
+ function T(e, t) {
208
219
  let n = Object.getOwnPropertyDescriptor(e, t);
209
220
  if (n) {
210
221
  if (n.get) try {
@@ -215,60 +226,60 @@ function S(e, t) {
215
226
  return n.value;
216
227
  }
217
228
  }
218
- function C(e) {
229
+ function E(e) {
219
230
  if (!(e instanceof Error)) return e;
220
231
  let t = {
221
232
  name: e.name,
222
233
  message: e.message
223
234
  };
224
235
  e.stack !== void 0 && (t.stack = e.stack);
225
- for (let n of Object.getOwnPropertyNames(e)) x.includes(n) || (t[n] = S(e, n));
236
+ for (let n of Object.getOwnPropertyNames(e)) w.includes(n) || (t[n] = T(e, n));
226
237
  return t;
227
238
  }
228
239
  //#endregion
229
240
  //#region src/runtime/browser.ts
230
- var w = class e extends l {
241
+ var D = class e extends f {
231
242
  constructor(e = {}) {
232
243
  super(e);
233
244
  }
234
245
  writeLog(e) {
235
- let t = this.formatMessage(e), n = this.getConsoleStyle(e.level), r = `%c${t}${e.metadata ? ` ${p(e.metadata)}` : ""}`;
246
+ let t = this.formatMessage(e), n = this.getConsoleStyle(e.level), r = `%c${t}${e.metadata ? ` ${g(e.metadata)}` : ""}`;
236
247
  switch (e.level) {
237
- case c.DEBUG:
248
+ case u.DEBUG:
238
249
  console.debug ? console.debug(r, n) : console.log(r, n);
239
250
  break;
240
- case c.INFO:
251
+ case u.INFO:
241
252
  console.info(r, n);
242
253
  break;
243
- case c.WARN:
254
+ case u.WARN:
244
255
  console.warn(r, n);
245
256
  break;
246
- case c.ERROR: console.error(r, n);
257
+ case u.ERROR: console.error(r, n);
247
258
  }
248
259
  }
249
260
  createChild() {
250
261
  return new e(this.config);
251
262
  }
252
263
  formatMessage(e) {
253
- return `[${e.timestamp.toISOString()}] ${c[e.level].toUpperCase()}: ${e.message}`;
264
+ return `[${e.timestamp.toISOString()}] ${u[e.level].toUpperCase()}: ${e.message}`;
254
265
  }
255
266
  getConsoleStyle(e) {
256
267
  if (!this.config.colorize) return "";
257
268
  switch (e) {
258
- case c.DEBUG: return "color: #888; font-weight: normal;";
259
- case c.INFO: return "color: #007acc; font-weight: normal;";
260
- case c.WARN: return "color: #ff8c00; font-weight: bold;";
261
- case c.ERROR: return "color: #dc3545; font-weight: bold;";
269
+ case u.DEBUG: return "color: #888; font-weight: normal;";
270
+ case u.INFO: return "color: #007acc; font-weight: normal;";
271
+ case u.WARN: return "color: #ff8c00; font-weight: bold;";
272
+ case u.ERROR: return "color: #dc3545; font-weight: bold;";
262
273
  default: return "";
263
274
  }
264
275
  }
265
276
  shouldLogInProduction() {
266
- return (globalThis.process?.env?.NODE_ENV || globalThis.process?.env?.NEXT_PUBLIC_APP_ENV || "development") !== "production" || this.level <= c.ERROR;
277
+ return (globalThis.process?.env?.NODE_ENV || globalThis.process?.env?.NEXT_PUBLIC_APP_ENV || "development") !== "production" || this.level <= u.ERROR;
267
278
  }
268
279
  shouldLog(e) {
269
- return !this.shouldLogInProduction() && e < c.ERROR ? !1 : super.shouldLog(e);
280
+ return !this.shouldLogInProduction() && e < u.ERROR ? !1 : super.shouldLog(e);
270
281
  }
271
- }, T = class extends w {
282
+ }, O = class extends D {
272
283
  constructor(...e) {
273
284
  super(...e), this.groupStack = [];
274
285
  }
@@ -305,7 +316,7 @@ var w = class e extends l {
305
316
  table(e) {
306
317
  console.table(e);
307
318
  }
308
- }, E = class extends w {
319
+ }, k = class extends D {
309
320
  mark(e) {
310
321
  typeof performance < "u" && performance.mark && performance.mark(e);
311
322
  }
@@ -336,51 +347,51 @@ var w = class e extends l {
336
347
  };
337
348
  //#endregion
338
349
  //#region src/utils/formatting.ts
339
- function D(e, t = "text", n = {}) {
350
+ function A(e, t = "text", n = {}) {
340
351
  if (t === "json") {
341
352
  let t = {
342
353
  timestamp: e.timestamp.toISOString(),
343
- level: c[e.level].toLowerCase(),
354
+ level: u[e.level].toLowerCase(),
344
355
  message: e.message,
345
356
  runtime: e.runtime
346
357
  };
347
- return e.metadata !== void 0 && (t.metadata = e.metadata), p(t);
358
+ return e.metadata !== void 0 && (t.metadata = e.metadata), g(t);
348
359
  }
349
- let r = n.timestamp === !1 ? "" : `[${e.timestamp.toISOString()}] `, i = O(e.level, n.colorize === !0), a = e.metadata ? ` ${p(e.metadata)}` : "";
360
+ let r = n.timestamp === !1 ? "" : `[${e.timestamp.toISOString()}] `, i = j(e.level, n.colorize === !0), a = e.metadata ? ` ${g(e.metadata)}` : "";
350
361
  return `${r}${i}: ${e.message}${a}`;
351
362
  }
352
- function O(e, t = !1) {
353
- let n = c[e].toUpperCase();
363
+ function j(e, t = !1) {
364
+ let n = u[e].toUpperCase();
354
365
  if (!t) return n;
355
366
  let r = {
356
- [c.DEBUG]: "\x1B[36m",
357
- [c.INFO]: "\x1B[32m",
358
- [c.WARN]: "\x1B[33m",
359
- [c.ERROR]: "\x1B[31m",
360
- [c.SILENT]: "\x1B[37m"
367
+ [u.DEBUG]: "\x1B[36m",
368
+ [u.INFO]: "\x1B[32m",
369
+ [u.WARN]: "\x1B[33m",
370
+ [u.ERROR]: "\x1B[31m",
371
+ [u.SILENT]: "\x1B[37m"
361
372
  };
362
- return `${r[e] || r[c.INFO]}${n}`;
373
+ return `${r[e] || r[u.INFO]}${n}`;
363
374
  }
364
375
  //#endregion
365
376
  //#region src/utils/warn-once.ts
366
- var k = /* @__PURE__ */ new Set();
367
- function A(e) {
368
- k.has(e) || (k.add(e), console.warn(e));
377
+ var M = /* @__PURE__ */ new Set();
378
+ function N(e) {
379
+ M.has(e) || (M.add(e), console.warn(e));
369
380
  }
370
- function j() {
371
- k.clear();
381
+ function P() {
382
+ M.clear();
372
383
  }
373
384
  //#endregion
374
385
  //#region src/utils/config.ts
375
- function M() {
386
+ function F() {
376
387
  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;
377
388
  }
378
- function N() {
389
+ function I() {
379
390
  return {
380
- level: c.INFO,
391
+ level: u.INFO,
381
392
  format: "text",
382
393
  timestamp: !0,
383
- colorize: M(),
394
+ colorize: F(),
384
395
  metadata: {},
385
396
  transports: [{
386
397
  type: "console",
@@ -388,62 +399,62 @@ function N() {
388
399
  }]
389
400
  };
390
401
  }
391
- var P = [
402
+ var L = [
392
403
  "true",
393
404
  "1",
394
405
  "yes",
395
406
  "on"
396
- ], F = [
407
+ ], R = [
397
408
  "false",
398
409
  "0",
399
410
  "no",
400
411
  "off"
401
412
  ];
402
- function I() {
403
- j();
413
+ function z() {
414
+ P();
404
415
  }
405
- function L(e) {
416
+ function B(e) {
406
417
  switch (e.trim().toLowerCase()) {
407
- case "debug": return c.DEBUG;
408
- case "info": return c.INFO;
418
+ case "debug": return u.DEBUG;
419
+ case "info": return u.INFO;
409
420
  case "warn":
410
- case "warning": return c.WARN;
411
- case "error": return c.ERROR;
421
+ case "warning": return u.WARN;
422
+ case "error": return u.ERROR;
412
423
  case "silent":
413
- case "none": return c.SILENT;
424
+ case "none": return u.SILENT;
414
425
  default: return;
415
426
  }
416
427
  }
417
- function R(e, t) {
428
+ function V(e, t) {
418
429
  let n = t.trim().toLowerCase();
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(", ")}.`);
430
+ if (L.includes(n)) return !0;
431
+ if (R.includes(n)) return !1;
432
+ N(`[logan-logger] ${e}="${t}" is not a recognized boolean and was ignored. Accepted: ${L.join(", ")} / ${R.join(", ")}.`);
422
433
  }
423
- function z() {
434
+ function H() {
424
435
  let e = {};
425
436
  if (typeof process > "u" || !process.env) return e;
426
437
  let t = process.env;
427
438
  if (t.LOG_LEVEL) {
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;
439
+ let n = B(t.LOG_LEVEL);
440
+ n === void 0 ? N(`[logan-logger] LOG_LEVEL="${t.LOG_LEVEL}" is not a recognized level and was ignored. Accepted: debug, info, warn, error, silent.`) : e.level = n;
430
441
  }
431
442
  if (t.LOG_FORMAT) {
432
443
  let n = t.LOG_FORMAT.trim().toLowerCase();
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.`);
444
+ n === "json" || n === "text" ? e.format = n : N(`[logan-logger] LOG_FORMAT="${t.LOG_FORMAT}" is not a recognized format and was ignored. Accepted: json, text.`);
434
445
  }
435
446
  if (t.LOG_TIMESTAMP) {
436
- let n = R("LOG_TIMESTAMP", t.LOG_TIMESTAMP);
447
+ let n = V("LOG_TIMESTAMP", t.LOG_TIMESTAMP);
437
448
  n !== void 0 && (e.timestamp = n);
438
449
  }
439
450
  if (t.LOG_COLOR) {
440
- let n = R("LOG_COLOR", t.LOG_COLOR);
451
+ let n = V("LOG_COLOR", t.LOG_COLOR);
441
452
  n !== void 0 && (e.colorize = n);
442
453
  }
443
454
  return e;
444
455
  }
445
- function B(...e) {
446
- let t = N();
456
+ function U(...e) {
457
+ let t = I();
447
458
  return e.reduce((e, t) => ({
448
459
  ...e,
449
460
  ...t,
@@ -455,4 +466,4 @@ function B(...e) {
455
466
  }), t);
456
467
  }
457
468
  //#endregion
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 };
469
+ export { i as S, u as _, F as a, s as b, j as c, O as d, k as f, f as g, E as h, z as i, A as l, g as m, H as n, B as o, C as p, U as r, N as s, I as t, D 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=Symbol.for(`logan-logger.internals`);function l(e){return e[c]??{}}var u=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}({}),d=()=>new Date,f=class{constructor(t={}){this.childMetadata={},this.config=t,this.level=t.level??u.INFO;let n=l(t);this.now=n.now??d,this.runtime=n.runtime??e().name,this.childMetadata={...t.metadata}}debug(e,t){this.log(u.DEBUG,e,t)}info(e,t){this.log(u.INFO,e,t)}warn(e,t){this.log(u.WARN,e,t)}error(e,t){this.log(u.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:this.now(),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}},p=100;function m(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 h(E(i),t,n,r);let e=i.toJSON;if(typeof e==`function`)return m(e.call(i),t,n,r);if(Array.isArray(i)){let e=[];for(let a=0;a<i.length;a++)e.push(m(i[a],t,n+1,r));return e}return h(i,t,n,r)}finally{t.delete(i)}}function h(e,t,n,r){let i={};for(let[a,o]of Object.entries(e))i[a]=m(o,t,n+1,r);return i}function g(e,t,n={}){let r=n.maxDepth??p;return JSON.stringify(m(e,new Set,0,r),null,t)}var _=[`password`,`token`,`secret`,`key`,`auth`,`authorization`,`apikey`,`authtoken`,`accesstoken`,`secretkey`],v=/[A-Z]+(?![a-z])|[A-Z]?[a-z]+|[0-9]+/g;function y(e){return(e.match(v)??[]).map(e=>e.toLowerCase())}function b(e){let t=[];for(let n of e){let e=y(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 x(e,t){let n=y(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 S(e,t,n){if(typeof e!=`object`||!e)return e;let r=n.get(e);if(r!==void 0)return r;let i=Array.isArray(e)?[]:{};n.set(e,i);for(let[r,a]of Object.entries(e))i[r]=x(r,t)?`[REDACTED]`:S(a,t,n);return i}function C(e,t=_){return S(e,b(t),new Map)}var w=[`name`,`message`,`stack`];function T(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(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))w.includes(n)||(t[n]=T(e,n));return t}var D=class e extends f{constructor(e={}){super(e)}writeLog(e){let t=this.formatMessage(e),n=this.getConsoleStyle(e.level),r=`%c${t}${e.metadata?` ${g(e.metadata)}`:``}`;switch(e.level){case u.DEBUG:console.debug?console.debug(r,n):console.log(r,n);break;case u.INFO:console.info(r,n);break;case u.WARN:console.warn(r,n);break;case u.ERROR:console.error(r,n)}}createChild(){return new e(this.config)}formatMessage(e){return`[${e.timestamp.toISOString()}] ${u[e.level].toUpperCase()}: ${e.message}`}getConsoleStyle(e){if(!this.config.colorize)return``;switch(e){case u.DEBUG:return`color: #888; font-weight: normal;`;case u.INFO:return`color: #007acc; font-weight: normal;`;case u.WARN:return`color: #ff8c00; font-weight: bold;`;case u.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<=u.ERROR}shouldLog(e){return!this.shouldLogInProduction()&&e<u.ERROR?!1:super.shouldLog(e)}},O=class extends D{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)}},k=class extends D{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 A(e,t=`text`,n={}){if(t===`json`){let t={timestamp:e.timestamp.toISOString(),level:u[e.level].toLowerCase(),message:e.message,runtime:e.runtime};return e.metadata!==void 0&&(t.metadata=e.metadata),g(t)}let r=n.timestamp===!1?``:`[${e.timestamp.toISOString()}] `,i=j(e.level,n.colorize===!0),a=e.metadata?` ${g(e.metadata)}`:``;return`${r}${i}: ${e.message}${a}`}function j(e,t=!1){let n=u[e].toUpperCase();if(!t)return n;let r={[u.DEBUG]:`\x1B[36m`,[u.INFO]:`\x1B[32m`,[u.WARN]:`\x1B[33m`,[u.ERROR]:`\x1B[31m`,[u.SILENT]:`\x1B[37m`};return`${r[e]||r[u.INFO]}${n}`}var M=new Set;function N(e){M.has(e)||(M.add(e),console.warn(e))}function P(){M.clear()}function F(){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 I(){return{level:u.INFO,format:`text`,timestamp:!0,colorize:F(),metadata:{},transports:[{type:`console`,options:{}}]}}var L=[`true`,`1`,`yes`,`on`],R=[`false`,`0`,`no`,`off`];function z(){P()}function B(e){switch(e.trim().toLowerCase()){case`debug`:return u.DEBUG;case`info`:return u.INFO;case`warn`:case`warning`:return u.WARN;case`error`:return u.ERROR;case`silent`:case`none`:return u.SILENT;default:return}}function V(e,t){let n=t.trim().toLowerCase();if(L.includes(n))return!0;if(R.includes(n))return!1;N(`[logan-logger] ${e}="${t}" is not a recognized boolean and was ignored. Accepted: ${L.join(`, `)} / ${R.join(`, `)}.`)}function H(){let e={};if(typeof process>`u`||!process.env)return e;let t=process.env;if(t.LOG_LEVEL){let n=B(t.LOG_LEVEL);n===void 0?N(`[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:N(`[logan-logger] LOG_FORMAT="${t.LOG_FORMAT}" is not a recognized format and was ignored. Accepted: json, text.`)}if(t.LOG_TIMESTAMP){let n=V(`LOG_TIMESTAMP`,t.LOG_TIMESTAMP);n!==void 0&&(e.timestamp=n)}if(t.LOG_COLOR){let n=V(`LOG_COLOR`,t.LOG_COLOR);n!==void 0&&(e.colorize=n)}return e}function U(...e){let t=I();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 u}}),Object.defineProperty(exports,"a",{enumerable:!0,get:function(){return F}}),Object.defineProperty(exports,"b",{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,"c",{enumerable:!0,get:function(){return j}}),Object.defineProperty(exports,"d",{enumerable:!0,get:function(){return O}}),Object.defineProperty(exports,"f",{enumerable:!0,get:function(){return k}}),Object.defineProperty(exports,"g",{enumerable:!0,get:function(){return f}}),Object.defineProperty(exports,"h",{enumerable:!0,get:function(){return E}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return z}}),Object.defineProperty(exports,"l",{enumerable:!0,get:function(){return A}}),Object.defineProperty(exports,"m",{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return H}}),Object.defineProperty(exports,"o",{enumerable:!0,get:function(){return B}}),Object.defineProperty(exports,"p",{enumerable:!0,get:function(){return C}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return U}}),Object.defineProperty(exports,"s",{enumerable:!0,get:function(){return N}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return I}}),Object.defineProperty(exports,"u",{enumerable:!0,get:function(){return D}}),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-BARemYd2.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-BBZVKKzL.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-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
+ const e=require("./config-CnELi-yt.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 +1 @@
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}});
1
+ const e=require("./config-CnELi-yt.cjs"),t=require("./config-file-Crelwql6.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,5 +1,5 @@
1
- import { l as e } from "./config-BARemYd2.mjs";
2
- import { f as t } from "./config-file-BkYtEgDX.mjs";
1
+ import { l as e } from "./config-BBZVKKzL.mjs";
2
+ import { f as t } from "./config-file-BXaWx_5g.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
@@ -0,0 +1,47 @@
1
+ import { LoggerConfig, RuntimeName } from './types.cjs';
2
+ /**
3
+ * Key under which a caller may freeze the two values a record takes from its
4
+ * surroundings rather than from its caller: the wall clock and the detected
5
+ * runtime.
6
+ *
7
+ * This is a **test seam**, not configuration. It rides on the config object
8
+ * under a symbol instead of becoming a named `LoggerConfig` field because a
9
+ * named field would be public API — permanently documented, permanently
10
+ * supported — for something whose only caller is a conformance harness. The
11
+ * treering fixtures supply a frozen `timestamp` and `runtime` on every case
12
+ * that emits a record, and `fixtures/README.md` requires the runner to inject
13
+ * them rather than let the implementation read a real clock.
14
+ *
15
+ * Carrying it on the config also makes inheritance free: `BaseLogger.child()`
16
+ * hands `this.config` to the child it builds, so every descendant sees the same
17
+ * frozen values. A constructor argument or a protected member would each need
18
+ * `child()` to be taught about them separately.
19
+ *
20
+ * `Symbol.for` rather than `Symbol()`: a test runner that isolates module
21
+ * graphs can end up holding two instances of this file, and a per-instance
22
+ * symbol would not match across them.
23
+ */
24
+ export declare const LOGGER_INTERNALS: unique symbol;
25
+ /** Environment-derived values a caller may pin. */
26
+ export interface LoggerInternals {
27
+ /** Supplies the record timestamp. Defaults to the real clock. */
28
+ now?: () => Date;
29
+ /** Stands in for `detectRuntime().name` on the `runtime` field. */
30
+ runtime?: RuntimeName;
31
+ }
32
+ type ConfigWithInternals = Partial<LoggerConfig> & {
33
+ [LOGGER_INTERNALS]?: LoggerInternals;
34
+ };
35
+ /** Read whatever internals a config carries; an empty object when it carries none. */
36
+ export declare function readLoggerInternals(config: Partial<LoggerConfig>): LoggerInternals;
37
+ /**
38
+ * Attach internals to a copy of `config`.
39
+ *
40
+ * The property is enumerable, which is what lets `mergeConfigs` carry it
41
+ * through: object spread copies own enumerable symbol-keyed properties.
42
+ * @param config - Configuration to copy
43
+ * @param internals - Values to pin
44
+ * @returns A new config object carrying the internals
45
+ */
46
+ export declare function withLoggerInternals<T extends Partial<LoggerConfig>>(config: T, internals: LoggerInternals): T & ConfigWithInternals;
47
+ export {};
@@ -0,0 +1,47 @@
1
+ import { LoggerConfig, RuntimeName } from './types.mjs';
2
+ /**
3
+ * Key under which a caller may freeze the two values a record takes from its
4
+ * surroundings rather than from its caller: the wall clock and the detected
5
+ * runtime.
6
+ *
7
+ * This is a **test seam**, not configuration. It rides on the config object
8
+ * under a symbol instead of becoming a named `LoggerConfig` field because a
9
+ * named field would be public API — permanently documented, permanently
10
+ * supported — for something whose only caller is a conformance harness. The
11
+ * treering fixtures supply a frozen `timestamp` and `runtime` on every case
12
+ * that emits a record, and `fixtures/README.md` requires the runner to inject
13
+ * them rather than let the implementation read a real clock.
14
+ *
15
+ * Carrying it on the config also makes inheritance free: `BaseLogger.child()`
16
+ * hands `this.config` to the child it builds, so every descendant sees the same
17
+ * frozen values. A constructor argument or a protected member would each need
18
+ * `child()` to be taught about them separately.
19
+ *
20
+ * `Symbol.for` rather than `Symbol()`: a test runner that isolates module
21
+ * graphs can end up holding two instances of this file, and a per-instance
22
+ * symbol would not match across them.
23
+ */
24
+ export declare const LOGGER_INTERNALS: unique symbol;
25
+ /** Environment-derived values a caller may pin. */
26
+ export interface LoggerInternals {
27
+ /** Supplies the record timestamp. Defaults to the real clock. */
28
+ now?: () => Date;
29
+ /** Stands in for `detectRuntime().name` on the `runtime` field. */
30
+ runtime?: RuntimeName;
31
+ }
32
+ type ConfigWithInternals = Partial<LoggerConfig> & {
33
+ [LOGGER_INTERNALS]?: LoggerInternals;
34
+ };
35
+ /** Read whatever internals a config carries; an empty object when it carries none. */
36
+ export declare function readLoggerInternals(config: Partial<LoggerConfig>): LoggerInternals;
37
+ /**
38
+ * Attach internals to a copy of `config`.
39
+ *
40
+ * The property is enumerable, which is what lets `mergeConfigs` carry it
41
+ * through: object spread copies own enumerable symbol-keyed properties.
42
+ * @param config - Configuration to copy
43
+ * @param internals - Values to pin
44
+ * @returns A new config object carrying the internals
45
+ */
46
+ export declare function withLoggerInternals<T extends Partial<LoggerConfig>>(config: T, internals: LoggerInternals): T & ConfigWithInternals;
47
+ export {};
@@ -0,0 +1,47 @@
1
+ import { LoggerConfig, RuntimeName } from './types';
2
+ /**
3
+ * Key under which a caller may freeze the two values a record takes from its
4
+ * surroundings rather than from its caller: the wall clock and the detected
5
+ * runtime.
6
+ *
7
+ * This is a **test seam**, not configuration. It rides on the config object
8
+ * under a symbol instead of becoming a named `LoggerConfig` field because a
9
+ * named field would be public API — permanently documented, permanently
10
+ * supported — for something whose only caller is a conformance harness. The
11
+ * treering fixtures supply a frozen `timestamp` and `runtime` on every case
12
+ * that emits a record, and `fixtures/README.md` requires the runner to inject
13
+ * them rather than let the implementation read a real clock.
14
+ *
15
+ * Carrying it on the config also makes inheritance free: `BaseLogger.child()`
16
+ * hands `this.config` to the child it builds, so every descendant sees the same
17
+ * frozen values. A constructor argument or a protected member would each need
18
+ * `child()` to be taught about them separately.
19
+ *
20
+ * `Symbol.for` rather than `Symbol()`: a test runner that isolates module
21
+ * graphs can end up holding two instances of this file, and a per-instance
22
+ * symbol would not match across them.
23
+ */
24
+ export declare const LOGGER_INTERNALS: unique symbol;
25
+ /** Environment-derived values a caller may pin. */
26
+ export interface LoggerInternals {
27
+ /** Supplies the record timestamp. Defaults to the real clock. */
28
+ now?: () => Date;
29
+ /** Stands in for `detectRuntime().name` on the `runtime` field. */
30
+ runtime?: RuntimeName;
31
+ }
32
+ type ConfigWithInternals = Partial<LoggerConfig> & {
33
+ [LOGGER_INTERNALS]?: LoggerInternals;
34
+ };
35
+ /** Read whatever internals a config carries; an empty object when it carries none. */
36
+ export declare function readLoggerInternals(config: Partial<LoggerConfig>): LoggerInternals;
37
+ /**
38
+ * Attach internals to a copy of `config`.
39
+ *
40
+ * The property is enumerable, which is what lets `mergeConfigs` carry it
41
+ * through: object spread copies own enumerable symbol-keyed properties.
42
+ * @param config - Configuration to copy
43
+ * @param internals - Values to pin
44
+ * @returns A new config object carrying the internals
45
+ */
46
+ export declare function withLoggerInternals<T extends Partial<LoggerConfig>>(config: T, internals: LoggerInternals): T & ConfigWithInternals;
47
+ export {};
@@ -3,6 +3,14 @@ export declare abstract class BaseLogger implements ILogger {
3
3
  protected level: LogLevel;
4
4
  protected config: Partial<LoggerConfig>;
5
5
  protected runtime: RuntimeName;
6
+ /**
7
+ * Source of the `timestamp` on every record.
8
+ *
9
+ * A seam rather than a direct `new Date()` so conformance fixtures can pin it
10
+ * and compare output byte for byte. See `core/internal.ts` for why it is not
11
+ * a public config field.
12
+ */
13
+ protected readonly now: () => Date;
6
14
  protected childMetadata: Record<string, any>;
7
15
  protected constructor(config?: Partial<LoggerConfig>);
8
16
  debug(message: LogMessage, metadata?: any): void;
@@ -3,6 +3,14 @@ export declare abstract class BaseLogger implements ILogger {
3
3
  protected level: LogLevel;
4
4
  protected config: Partial<LoggerConfig>;
5
5
  protected runtime: RuntimeName;
6
+ /**
7
+ * Source of the `timestamp` on every record.
8
+ *
9
+ * A seam rather than a direct `new Date()` so conformance fixtures can pin it
10
+ * and compare output byte for byte. See `core/internal.ts` for why it is not
11
+ * a public config field.
12
+ */
13
+ protected readonly now: () => Date;
6
14
  protected childMetadata: Record<string, any>;
7
15
  protected constructor(config?: Partial<LoggerConfig>);
8
16
  debug(message: LogMessage, metadata?: any): void;
@@ -3,6 +3,14 @@ export declare abstract class BaseLogger implements ILogger {
3
3
  protected level: LogLevel;
4
4
  protected config: Partial<LoggerConfig>;
5
5
  protected runtime: RuntimeName;
6
+ /**
7
+ * Source of the `timestamp` on every record.
8
+ *
9
+ * A seam rather than a direct `new Date()` so conformance fixtures can pin it
10
+ * and compare output byte for byte. See `core/internal.ts` for why it is not
11
+ * a public config field.
12
+ */
13
+ protected readonly now: () => Date;
6
14
  protected childMetadata: Record<string, any>;
7
15
  protected constructor(config?: Partial<LoggerConfig>);
8
16
  debug(message: LogMessage, metadata?: any): void;
package/dist/deno.cjs CHANGED
@@ -1 +1 @@
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;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./chunks/config-CnELi-yt.cjs"),t=require("./chunks/config-file-Crelwql6.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-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";
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-BBZVKKzL.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-BXaWx_5g.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-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;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./chunks/config-CnELi-yt.cjs"),t=require("./chunks/config-file-Crelwql6.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-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";
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-BBZVKKzL.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-BXaWx_5g.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-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;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./chunks/config-file-Crelwql6.cjs"),t=require("./chunks/file-transport-CgP5N9OA.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-BkYtEgDX.mjs";
2
- import { t as c } from "./chunks/file-transport-CCCBjSLN.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-BXaWx_5g.mjs";
2
+ import { t as c } from "./chunks/file-transport-DcBX0d8O.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 };
@@ -37,6 +37,12 @@ export declare function safeStringify(obj: any, space?: number, options?: SafeSt
37
37
  * Because matching is on whole tokens, a name like `mytoken` is one token and is
38
38
  * not redacted; pass your own keys if your codebase names fields that way.
39
39
  *
40
+ * The result mirrors the input's structure, cycles and shared references
41
+ * included (SPEC §8.4). Redaction produces a value, not a serialization, so it
42
+ * makes no promise that the result is JSON-encodable: hand it to
43
+ * {@link safeStringify}, which renders a cycle as `'[Circular]'`, rather than
44
+ * to `JSON.stringify`, which throws on one exactly as it would on the input.
45
+ *
40
46
  * @param obj - The object to filter
41
47
  * @param sensitiveKeys - Key names to redact, tokenized and matched case-insensitively
42
48
  * @returns A new object with sensitive values replaced with '[REDACTED]'
@@ -45,6 +51,11 @@ export declare function safeStringify(obj: any, space?: number, options?: SafeSt
45
51
  * const data = { username: 'john', password: 'secret123', monkey: 'george' };
46
52
  * const filtered = filterSensitiveData(data);
47
53
  * // Result: { username: 'john', password: '[REDACTED]', monkey: 'george' }
54
+ *
55
+ * const cyclic: any = { password: 'hunter2' };
56
+ * cyclic.self = cyclic;
57
+ * safeStringify(filterSensitiveData(cyclic));
58
+ * // {"password":"[REDACTED]","self":"[Circular]"}
48
59
  * ```
49
60
  */
50
61
  export declare function filterSensitiveData(obj: any, sensitiveKeys?: string[]): any;
@@ -37,6 +37,12 @@ export declare function safeStringify(obj: any, space?: number, options?: SafeSt
37
37
  * Because matching is on whole tokens, a name like `mytoken` is one token and is
38
38
  * not redacted; pass your own keys if your codebase names fields that way.
39
39
  *
40
+ * The result mirrors the input's structure, cycles and shared references
41
+ * included (SPEC §8.4). Redaction produces a value, not a serialization, so it
42
+ * makes no promise that the result is JSON-encodable: hand it to
43
+ * {@link safeStringify}, which renders a cycle as `'[Circular]'`, rather than
44
+ * to `JSON.stringify`, which throws on one exactly as it would on the input.
45
+ *
40
46
  * @param obj - The object to filter
41
47
  * @param sensitiveKeys - Key names to redact, tokenized and matched case-insensitively
42
48
  * @returns A new object with sensitive values replaced with '[REDACTED]'
@@ -45,6 +51,11 @@ export declare function safeStringify(obj: any, space?: number, options?: SafeSt
45
51
  * const data = { username: 'john', password: 'secret123', monkey: 'george' };
46
52
  * const filtered = filterSensitiveData(data);
47
53
  * // Result: { username: 'john', password: '[REDACTED]', monkey: 'george' }
54
+ *
55
+ * const cyclic: any = { password: 'hunter2' };
56
+ * cyclic.self = cyclic;
57
+ * safeStringify(filterSensitiveData(cyclic));
58
+ * // {"password":"[REDACTED]","self":"[Circular]"}
48
59
  * ```
49
60
  */
50
61
  export declare function filterSensitiveData(obj: any, sensitiveKeys?: string[]): any;
@@ -37,6 +37,12 @@ export declare function safeStringify(obj: any, space?: number, options?: SafeSt
37
37
  * Because matching is on whole tokens, a name like `mytoken` is one token and is
38
38
  * not redacted; pass your own keys if your codebase names fields that way.
39
39
  *
40
+ * The result mirrors the input's structure, cycles and shared references
41
+ * included (SPEC §8.4). Redaction produces a value, not a serialization, so it
42
+ * makes no promise that the result is JSON-encodable: hand it to
43
+ * {@link safeStringify}, which renders a cycle as `'[Circular]'`, rather than
44
+ * to `JSON.stringify`, which throws on one exactly as it would on the input.
45
+ *
40
46
  * @param obj - The object to filter
41
47
  * @param sensitiveKeys - Key names to redact, tokenized and matched case-insensitively
42
48
  * @returns A new object with sensitive values replaced with '[REDACTED]'
@@ -45,6 +51,11 @@ export declare function safeStringify(obj: any, space?: number, options?: SafeSt
45
51
  * const data = { username: 'john', password: 'secret123', monkey: 'george' };
46
52
  * const filtered = filterSensitiveData(data);
47
53
  * // Result: { username: 'john', password: '[REDACTED]', monkey: 'george' }
54
+ *
55
+ * const cyclic: any = { password: 'hunter2' };
56
+ * cyclic.self = cyclic;
57
+ * safeStringify(filterSensitiveData(cyclic));
58
+ * // {"password":"[REDACTED]","self":"[Circular]"}
48
59
  * ```
49
60
  */
50
61
  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.3.0",
3
+ "version": "2.4.1",
4
4
  "packageManager": "pnpm@11.9.0",
5
5
  "description": "Universal TypeScript logging library for all JavaScript runtimes",
6
6
  "main": "dist/index.cjs",
@@ -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(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}});