@nexusts/logger 0.9.6 → 0.9.8

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/index.d.ts CHANGED
@@ -22,7 +22,7 @@
22
22
  *
23
23
  * @Injectable()
24
24
  * class MyService {
25
- * constructor(@Inject(Logger.TOKEN) private logger: Logger) {}
25
+ * @Inject(Logger.TOKEN) declare private logger: Logger;
26
26
  *
27
27
  * async handle() {
28
28
  * this.logger.info({ userId: 'u-1' }, 'user signed in');
package/dist/index.js CHANGED
@@ -25,11 +25,6 @@ var __legacyDecorateClassTS = function(decorators, target, key, desc) {
25
25
  r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
26
26
  return c > 3 && r && Object.defineProperty(target, key, r), r;
27
27
  };
28
- var __legacyDecorateParamTS = (index, decorator) => (target, key) => decorator(target, key, index);
29
- var __legacyMetadataTS = (k, v) => {
30
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function")
31
- return Reflect.metadata(k, v);
32
- };
33
28
  var __require = import.meta.require;
34
29
  // packages/logger/src/logger.service.ts
35
30
  import { AsyncLocalStorage } from "async_hooks";
@@ -174,24 +169,63 @@ var LEVEL_RANK = {
174
169
 
175
170
  class Logger {
176
171
  static TOKEN = Symbol.for("nexus:Logger");
177
- transports;
178
- silent;
179
- base;
180
- level;
172
+ _transports = [];
173
+ _silent = false;
174
+ _base = {};
175
+ _level = "info";
176
+ _initialized = false;
181
177
  als = new AsyncLocalStorage;
182
- constructor(options = {}) {
183
- this.silent = options.silent ?? false;
184
- this.base = options.base ?? {};
185
- this.level = options.level ?? (process.env["NODE_ENV"] === "production" ? "info" : "debug");
186
- if (options.transports && options.transports.length > 0) {
187
- this.transports = options.transports;
188
- } else {
189
- const pretty = options.pretty ?? process.env["NODE_ENV"] !== "production";
190
- this.transports = [
191
- pretty ? new PrettyTransport(this.level, this.base) : new PinoTransport(this.level, this.base)
192
- ];
178
+ init() {
179
+ if (this._initialized)
180
+ return;
181
+ this._initialized = true;
182
+ const opts = this.options ?? {};
183
+ this._silent = opts.silent ?? false;
184
+ this._base = opts.base ?? {};
185
+ this._level = opts.level ?? (process.env["NODE_ENV"] === "production" ? "info" : "debug");
186
+ if (this._transports.length === 0) {
187
+ if (opts.transports && opts.transports.length > 0) {
188
+ this._transports = opts.transports;
189
+ } else {
190
+ const pretty = opts.pretty ?? process.env["NODE_ENV"] !== "production";
191
+ this._transports = [
192
+ pretty ? new PrettyTransport(this._level, this._base) : new PinoTransport(this._level, this._base)
193
+ ];
194
+ }
193
195
  }
194
196
  }
197
+ get silent() {
198
+ this.init();
199
+ return this._silent;
200
+ }
201
+ set silent(v) {
202
+ this.init();
203
+ this._silent = v;
204
+ }
205
+ get base() {
206
+ this.init();
207
+ return this._base;
208
+ }
209
+ set base(v) {
210
+ this.init();
211
+ this._base = v;
212
+ }
213
+ get level() {
214
+ this.init();
215
+ return this._level;
216
+ }
217
+ set level(v) {
218
+ this.init();
219
+ this._level = v;
220
+ }
221
+ get transports() {
222
+ this.init();
223
+ return this._transports;
224
+ }
225
+ set transports(v) {
226
+ this._transports = v;
227
+ this.init();
228
+ }
195
229
  trace(arg1, arg2) {
196
230
  this.emit("trace", arg1, arg2);
197
231
  }
@@ -219,25 +253,29 @@ class Logger {
219
253
  return this.als.getStore() ?? {};
220
254
  }
221
255
  child(bindings) {
256
+ this.init();
222
257
  const child = Object.create(Logger.prototype);
223
- child.transports = this.transports;
224
- child.silent = this.silent;
225
- child.base = { ...this.base, ...bindings };
226
- child.level = this.level;
258
+ child._transports = this._transports;
259
+ child._silent = this._silent;
260
+ child._base = { ...this._base, ...bindings };
261
+ child._level = this._level;
227
262
  child.als = this.als;
263
+ child._initialized = true;
228
264
  return child;
229
265
  }
230
266
  async ready() {
231
- for (const t of this.transports) {
267
+ this.init();
268
+ for (const t of this._transports) {
232
269
  const r = t.ready;
233
270
  if (r)
234
271
  await r.call(t);
235
272
  }
236
273
  }
237
274
  emit(level, arg1, arg2) {
238
- if (this.silent)
275
+ this.init();
276
+ if (this._silent)
239
277
  return;
240
- if (LEVEL_RANK[level] < LEVEL_RANK[this.level])
278
+ if (LEVEL_RANK[level] < LEVEL_RANK[this._level])
241
279
  return;
242
280
  let meta = {};
243
281
  let msg;
@@ -252,23 +290,22 @@ class Logger {
252
290
  level,
253
291
  time: Date.now(),
254
292
  msg,
255
- ...this.base,
293
+ ...this._base,
256
294
  ...meta,
257
295
  ...ctx
258
296
  };
259
- for (const t of this.transports) {
297
+ for (const t of this._transports) {
260
298
  try {
261
299
  t.write(record);
262
300
  } catch {}
263
301
  }
264
302
  }
265
303
  }
304
+ __legacyDecorateClassTS([
305
+ Inject("LOGGER_OPTIONS")
306
+ ], Logger.prototype, "options", undefined);
266
307
  Logger = __legacyDecorateClassTS([
267
- Injectable(),
268
- __legacyDecorateParamTS(0, Inject("LOGGER_OPTIONS")),
269
- __legacyMetadataTS("design:paramtypes", [
270
- typeof LoggerOptions === "undefined" ? Object : LoggerOptions
271
- ])
308
+ Injectable()
272
309
  ], Logger);
273
310
  // packages/logger/src/logger.module.ts
274
311
  import { Module } from "@nexusts/core";
@@ -306,5 +343,5 @@ export {
306
343
  Logger
307
344
  };
308
345
 
309
- //# debugId=2CAEE63E12F93B7564756E2164756E21
346
+ //# debugId=57B2399E8089239B64756E2164756E21
310
347
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -2,11 +2,11 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/logger.service.ts", "../src/transports/index.ts", "../src/logger.module.ts"],
4
4
  "sourcesContent": [
5
- "/**\n * `Logger` — the user-facing logging interface.\n *\n * Logger is request-scoped via `AsyncLocalStorage`: any `logger.info(...)`\n * call inside a request automatically merges in fields set by\n * `logger.with({ requestId, userId, ... })`.\n *\n * Usage:\n * constructor(@Inject(Logger.TOKEN) private logger: Logger) {}\n *\n * this.logger.info({ userId: 'u-1' }, 'user signed in');\n * this.logger.error({ err }, 'failed to save');\n */\n\nimport { AsyncLocalStorage } from \"node:async_hooks\";\nimport { Inject, Injectable } from \"@nexusts/core\";\nimport type {\n\tLogLevel,\n\tLogRecord,\n\tLogTransport,\n\tLoggerOptions,\n\tLogContext,\n} from \"./types.js\";\nimport { PinoTransport, PrettyTransport, NullTransport } from \"./transports/index.js\";\n\nconst LEVEL_RANK: Record<LogLevel, number> = {\n\ttrace: 10,\n\tdebug: 20,\n\tinfo: 30,\n\twarn: 40,\n\terror: 50,\n\tfatal: 60,\n};\n\n@Injectable()\nexport class Logger {\n\t/** DI token — use with `@Inject(Logger.TOKEN)`. */\n\tstatic readonly TOKEN = Symbol.for(\"nexus:Logger\");\n\n\ttransports: LogTransport[];\n\tsilent: boolean;\n\tbase: Record<string, unknown>;\n\tlevel: LogLevel;\n\tals = new AsyncLocalStorage<LogContext>();\n\n\tconstructor(@Inject(\"LOGGER_OPTIONS\") options: LoggerOptions = {}) {\n\t\tthis.silent = options.silent ?? false;\n\t\tthis.base = options.base ?? {};\n\t\tthis.level = options.level ?? (process.env[\"NODE_ENV\"] === \"production\" ? \"info\" : \"debug\");\n\t\tif (options.transports && options.transports.length > 0) {\n\t\t\tthis.transports = options.transports;\n\t\t} else {\n\t\t\tconst pretty = options.pretty ?? process.env[\"NODE_ENV\"] !== \"production\";\n\t\t\tthis.transports = [\n\t\t\t\tpretty\n\t\t\t\t\t? new PrettyTransport(this.level, this.base)\n\t\t\t\t\t: new PinoTransport(this.level, this.base),\n\t\t\t];\n\t\t}\n\t}\n\n\t// ===========================================================================\n\t// Level methods\n\t// ===========================================================================\n\n\ttrace(meta: Record<string, unknown>, msg: string): void;\n\ttrace(msg: string): void;\n\ttrace(arg1: Record<string, unknown> | string, arg2?: string): void {\n\t\tthis.emit(\"trace\", arg1, arg2);\n\t}\n\n\tdebug(meta: Record<string, unknown>, msg: string): void;\n\tdebug(msg: string): void;\n\tdebug(arg1: Record<string, unknown> | string, arg2?: string): void {\n\t\tthis.emit(\"debug\", arg1, arg2);\n\t}\n\n\tinfo(meta: Record<string, unknown>, msg: string): void;\n\tinfo(msg: string): void;\n\tinfo(arg1: Record<string, unknown> | string, arg2?: string): void {\n\t\tthis.emit(\"info\", arg1, arg2);\n\t}\n\n\twarn(meta: Record<string, unknown>, msg: string): void;\n\twarn(msg: string): void;\n\twarn(arg1: Record<string, unknown> | string, arg2?: string): void {\n\t\tthis.emit(\"warn\", arg1, arg2);\n\t}\n\n\terror(meta: Record<string, unknown>, msg: string): void;\n\terror(msg: string): void;\n\terror(arg1: Record<string, unknown> | string, arg2?: string): void {\n\t\tthis.emit(\"error\", arg1, arg2);\n\t}\n\n\tfatal(meta: Record<string, unknown>, msg: string): void;\n\tfatal(msg: string): void;\n\tfatal(arg1: Record<string, unknown> | string, arg2?: string): void {\n\t\tthis.emit(\"fatal\", arg1, arg2);\n\t}\n\n\t// ===========================================================================\n\t// Context\n\t// ===========================================================================\n\n\t/**\n\t * Run `fn` inside a logger context — every log emitted during\n\t * `fn()` is tagged with `meta`.\n\t */\n\twith<T>(meta: LogContext, fn: () => T): T {\n\t\tconst prev = this.als.getStore() ?? {};\n\t\tconst next: LogContext = { ...prev, ...meta };\n\t\treturn this.als.run(next, fn);\n\t}\n\n\t/** Read the current request context (or empty object). */\n\tget context(): LogContext {\n\t\treturn this.als.getStore() ?? {};\n\t}\n\n\t// ===========================================================================\n\t// Child loggers\n\t// ===========================================================================\n\n\t/**\n\t * Derive a child logger that always merges `bindings` into every\n\t * record. Useful for service-scoped loggers.\n\t */\n\tchild(bindings: Record<string, unknown>): Logger {\n\t\tconst child = Object.create(Logger.prototype) as Logger;\n\t\tchild.transports = this.transports;\n\t\tchild.silent = this.silent;\n\t\tchild.base = { ...this.base, ...bindings };\n\t\tchild.level = this.level;\n\t\tchild.als = this.als;\n\t\treturn child;\n\t}\n\n\t// ===========================================================================\n\t// Lifecycle\n\t// ===========================================================================\n\n\t/** Wait for transports to finish loading (Pino is async). */\n\tasync ready(): Promise<void> {\n\t\tfor (const t of this.transports) {\n\t\t\tconst r = (t as { ready?: () => Promise<void> }).ready;\n\t\t\tif (r) await r.call(t);\n\t\t}\n\t}\n\n\t// ===========================================================================\n\t// Internal\n\t// ===========================================================================\n\n\tprivate emit(level: LogLevel, arg1: Record<string, unknown> | string, arg2?: string): void {\n\t\tif (this.silent) return;\n\t\tif (LEVEL_RANK[level] < LEVEL_RANK[this.level]) return;\n\n\t\tlet meta: Record<string, unknown> = {};\n\t\tlet msg: string;\n\t\tif (typeof arg1 === \"string\") {\n\t\t\tmsg = arg1;\n\t\t} else {\n\t\t\tmeta = arg1;\n\t\t\tmsg = arg2 ?? \"\";\n\t\t}\n\n\t\tconst ctx = this.als.getStore() ?? {};\n\t\tconst record: LogRecord = {\n\t\t\tlevel,\n\t\t\ttime: Date.now(),\n\t\t\tmsg,\n\t\t\t...this.base,\n\t\t\t...meta,\n\t\t\t...ctx,\n\t\t};\n\t\tfor (const t of this.transports) {\n\t\t\ttry {\n\t\t\t\tt.write(record);\n\t\t\t} catch {\n\t\t\t\t// never let a logging error crash the request\n\t\t\t}\n\t\t}\n\t}\n}\n\n// Re-export NullTransport for tests.\nexport { NullTransport };",
5
+ "/**\n * `Logger` — the user-facing logging interface.\n *\n * Logger is request-scoped via `AsyncLocalStorage`: any `logger.info(...)`\n * call inside a request automatically merges in fields set by\n * `logger.with({ requestId, userId, ... })`.\n *\n * Usage:\n * @Inject(Logger.TOKEN) declare logger: Logger;\n *\n * this.logger.info({ userId: 'u-1' }, 'user signed in');\n * this.logger.error({ err }, 'failed to save');\n */\n\nimport { AsyncLocalStorage } from \"node:async_hooks\";\nimport { Inject, Injectable } from \"@nexusts/core\";\nimport type {\n\tLogLevel,\n\tLogRecord,\n\tLogTransport,\n\tLoggerOptions,\n\tLogContext,\n} from \"./types.js\";\nimport { PinoTransport, PrettyTransport, NullTransport } from \"./transports/index.js\";\n\nconst LEVEL_RANK: Record<LogLevel, number> = {\n\ttrace: 10,\n\tdebug: 20,\n\tinfo: 30,\n\twarn: 40,\n\terror: 50,\n\tfatal: 60,\n};\n\n@Injectable()\nexport class Logger {\n\t/** DI token — use with `@Inject(Logger.TOKEN)`. */\n\tstatic readonly TOKEN = Symbol.for(\"nexus:Logger\");\n\n\t/** Logger options — injected by DI container. */\n\t@Inject(\"LOGGER_OPTIONS\") declare private options: LoggerOptions;\n\n\tprivate _transports: LogTransport[] = [];\n\tprivate _silent = false;\n\tprivate _base: Record<string, unknown> = {};\n\tprivate _level: LogLevel = \"info\";\n\tprivate _initialized = false;\n\tals = new AsyncLocalStorage<LogContext>();\n\n\tprivate init(): void {\n\t\tif (this._initialized) return;\n\t\tthis._initialized = true;\n\t\tconst opts = this.options ?? {};\n\t\tthis._silent = opts.silent ?? false;\n\t\tthis._base = opts.base ?? {};\n\t\tthis._level = opts.level ?? (process.env[\"NODE_ENV\"] === \"production\" ? \"info\" : \"debug\");\n\t\t// Only set default transports if none have been assigned externally.\n\t\tif (this._transports.length === 0) {\n\t\t\tif (opts.transports && opts.transports.length > 0) {\n\t\t\t\tthis._transports = opts.transports;\n\t\t\t} else {\n\t\t\t\tconst pretty = opts.pretty ?? process.env[\"NODE_ENV\"] !== \"production\";\n\t\t\t\tthis._transports = [\n\t\t\t\t\tpretty\n\t\t\t\t\t\t? new PrettyTransport(this._level, this._base)\n\t\t\t\t\t\t: new PinoTransport(this._level, this._base),\n\t\t\t\t];\n\t\t\t}\n\t\t}\n\t}\n\n\tget silent(): boolean { this.init(); return this._silent; }\n\tset silent(v: boolean) { this.init(); this._silent = v; }\n\n\tget base(): Record<string, unknown> { this.init(); return this._base; }\n\tset base(v: Record<string, unknown>) { this.init(); this._base = v; }\n\n\tget level(): LogLevel { this.init(); return this._level; }\n\tset level(v: LogLevel) { this.init(); this._level = v; }\n\n\tget transports(): LogTransport[] { this.init(); return this._transports; }\n\tset transports(v: LogTransport[]) { this._transports = v; this.init(); }\n\n\t// ===========================================================================\n\t// Level methods\n\t// ===========================================================================\n\n\ttrace(meta: Record<string, unknown>, msg: string): void;\n\ttrace(msg: string): void;\n\ttrace(arg1: Record<string, unknown> | string, arg2?: string): void {\n\t\tthis.emit(\"trace\", arg1, arg2);\n\t}\n\n\tdebug(meta: Record<string, unknown>, msg: string): void;\n\tdebug(msg: string): void;\n\tdebug(arg1: Record<string, unknown> | string, arg2?: string): void {\n\t\tthis.emit(\"debug\", arg1, arg2);\n\t}\n\n\tinfo(meta: Record<string, unknown>, msg: string): void;\n\tinfo(msg: string): void;\n\tinfo(arg1: Record<string, unknown> | string, arg2?: string): void {\n\t\tthis.emit(\"info\", arg1, arg2);\n\t}\n\n\twarn(meta: Record<string, unknown>, msg: string): void;\n\twarn(msg: string): void;\n\twarn(arg1: Record<string, unknown> | string, arg2?: string): void {\n\t\tthis.emit(\"warn\", arg1, arg2);\n\t}\n\n\terror(meta: Record<string, unknown>, msg: string): void;\n\terror(msg: string): void;\n\terror(arg1: Record<string, unknown> | string, arg2?: string): void {\n\t\tthis.emit(\"error\", arg1, arg2);\n\t}\n\n\tfatal(meta: Record<string, unknown>, msg: string): void;\n\tfatal(msg: string): void;\n\tfatal(arg1: Record<string, unknown> | string, arg2?: string): void {\n\t\tthis.emit(\"fatal\", arg1, arg2);\n\t}\n\n\t// ===========================================================================\n\t// Context\n\t// ===========================================================================\n\n\t/**\n\t * Run `fn` inside a logger context — every log emitted during\n\t * `fn()` is tagged with `meta`.\n\t */\n\twith<T>(meta: LogContext, fn: () => T): T {\n\t\tconst prev = this.als.getStore() ?? {};\n\t\tconst next: LogContext = { ...prev, ...meta };\n\t\treturn this.als.run(next, fn);\n\t}\n\n\t/** Read the current request context (or empty object). */\n\tget context(): LogContext {\n\t\treturn this.als.getStore() ?? {};\n\t}\n\n\t// ===========================================================================\n\t// Child loggers\n\t// ===========================================================================\n\n\t/**\n\t * Derive a child logger that always merges `bindings` into every\n\t * record. Useful for service-scoped loggers.\n\t */\n\tchild(bindings: Record<string, unknown>): Logger {\n\t\tthis.init();\n\t\tconst child = Object.create(Logger.prototype) as Logger;\n\t\tchild._transports = this._transports;\n\t\tchild._silent = this._silent;\n\t\tchild._base = { ...this._base, ...bindings };\n\t\tchild._level = this._level;\n\t\tchild.als = this.als;\n\t\tchild._initialized = true;\n\t\treturn child;\n\t}\n\n\t// ===========================================================================\n\t// Lifecycle\n\t// ===========================================================================\n\n\t/** Wait for transports to finish loading (Pino is async). */\n\tasync ready(): Promise<void> {\n\t\tthis.init();\n\t\tfor (const t of this._transports) {\n\t\t\tconst r = (t as { ready?: () => Promise<void> }).ready;\n\t\t\tif (r) await r.call(t);\n\t\t}\n\t}\n\n\t// ===========================================================================\n\t// Internal\n\t// ===========================================================================\n\n\tprivate emit(level: LogLevel, arg1: Record<string, unknown> | string, arg2?: string): void {\n\t\tthis.init();\n\t\tif (this._silent) return;\n\t\tif (LEVEL_RANK[level] < LEVEL_RANK[this._level]) return;\n\n\t\tlet meta: Record<string, unknown> = {};\n\t\tlet msg: string;\n\t\tif (typeof arg1 === \"string\") {\n\t\t\tmsg = arg1;\n\t\t} else {\n\t\t\tmeta = arg1;\n\t\t\tmsg = arg2 ?? \"\";\n\t\t}\n\n\t\tconst ctx = this.als.getStore() ?? {};\n\t\tconst record: LogRecord = {\n\t\t\tlevel,\n\t\t\ttime: Date.now(),\n\t\t\tmsg,\n\t\t\t...this._base,\n\t\t\t...meta,\n\t\t\t...ctx,\n\t\t};\n\t\tfor (const t of this._transports) {\n\t\t\ttry {\n\t\t\t\tt.write(record);\n\t\t\t} catch {\n\t\t\t\t// never let a logging error crash the request\n\t\t\t}\n\t\t}\n\t}\n}\n\n// Re-export NullTransport for tests.\nexport { NullTransport };\n",
6
6
  "/**\n * Built-in transports.\n *\n * - **PinoTransport** — JSON output via `pino` (production).\n * - **PrettyTransport** — colorized via `pino-pretty` (development).\n *\n * Both wrap the pino API and feed records into the same write loop,\n * so switching is one config flag.\n */\n\nimport type { LogLevel, LogRecord, LogTransport } from \"../types.js\";\n\ninterface PinoLike {\n\tlevel: string;\n\tinfo: (obj: object, msg?: string) => void;\n\twarn: (obj: object, msg?: string) => void;\n\terror: (obj: object, msg?: string) => void;\n\tdebug: (obj: object, msg?: string) => void;\n\ttrace: (obj: object, msg?: string) => void;\n\tfatal: (obj: object, msg?: string) => void;\n\tflush?: () => void;\n}\n\nlet pinoSingleton: PinoLike | null = null;\nlet prettySingleton: PinoLike | null = null;\n\nasync function loadPino(\n\tpretty: boolean,\n\tlevel: LogLevel,\n\tbase?: Record<string, unknown>,\n): Promise<PinoLike> {\n\tconst pinoMod = await import(\"pino\");\n\tconst pino = pinoMod.default ?? pinoMod;\n\tif (pretty) {\n\t\tif (prettySingleton) return prettySingleton;\n\t\t// Try to use pino-pretty for colorized output (optional peer dep).\n\t\tconst opts: Record<string, unknown> = {\n\t\t\tlevel,\n\t\t\tbase,\n\t\t\terrorKey: \"error\",\n\t\t\ttimestamp: () => `,\"time\":\"${new Date().toISOString()}\"`,\n\t\t};\n\t\ttry {\n\t\t\tconst prettyMod = (await import(\"pino-pretty\")) as {\n\t\t\t\tdefault?: (opts: unknown) => unknown;\n\t\t\t};\n\t\t\tconst transport = prettyMod.default ?? prettyMod;\n\t\t\tif (typeof transport === \"function\") {\n\t\t\t\topts.transport = transport({\n\t\t\t\t\ttranslateTime: \"HH:MM:ss.l\",\n\t\t\t\t\tignore: \"pid,hostname\",\n\t\t\t\t\tcolorize: true,\n\t\t\t\t});\n\t\t\t}\n\t\t} catch {\n\t\t\t// pino-pretty not installed — use pino's built-in pretty mode\n\t\t}\n\t\tprettySingleton = (pino as unknown as (opts: unknown) => PinoLike)(opts);\n\t\treturn prettySingleton;\n\t}\n\tif (pinoSingleton) return pinoSingleton;\n\tpinoSingleton = (pino as unknown as (opts: unknown) => PinoLike)({\n\t\tlevel,\n\t\tbase,\n\t\ttimestamp: () => `,\"time\":\"${new Date().toISOString()}\"`,\n\t});\n\treturn pinoSingleton;\n}\n\n/** JSON transport via pino. */\nexport class PinoTransport implements LogTransport {\n\treadonly name = \"pino\";\n\treadonly isDefault = true;\n\t#pino: PinoLike | null = null;\n\t#ready: Promise<void>;\n\n\tconstructor(level: LogLevel, base?: Record<string, unknown>) {\n\t\tthis.#ready = loadPino(false, level, base).then((p) => {\n\t\t\tthis.#pino = p;\n\t\t});\n\t}\n\n\tasync ready(): Promise<void> {\n\t\tawait this.#ready;\n\t}\n\n\twrite(record: LogRecord): void {\n\t\tif (!this.#pino) return;\n\t\tconst { level, time, msg, ...rest } = record;\n\t\tconst obj = { time, ...rest };\n\t\tswitch (level) {\n\t\t\tcase \"trace\":\n\t\t\t\tthis.#pino.trace(obj, msg);\n\t\t\t\tbreak;\n\t\t\tcase \"debug\":\n\t\t\t\tthis.#pino.debug(obj, msg);\n\t\t\t\tbreak;\n\t\t\tcase \"info\":\n\t\t\t\tthis.#pino.info(obj, msg);\n\t\t\t\tbreak;\n\t\t\tcase \"warn\":\n\t\t\t\tthis.#pino.warn(obj, msg);\n\t\t\t\tbreak;\n\t\t\tcase \"error\":\n\t\t\t\tthis.#pino.error(obj, msg);\n\t\t\t\tbreak;\n\t\t\tcase \"fatal\":\n\t\t\t\tthis.#pino.fatal(obj, msg);\n\t\t\t\tbreak;\n\t\t}\n\t}\n}\n\n/** Pretty-print transport via pino-pretty (development). */\nexport class PrettyTransport implements LogTransport {\n\treadonly name = \"pretty\";\n\treadonly isDefault = true;\n\t#pino: PinoLike | null = null;\n\t#ready: Promise<void>;\n\n\tconstructor(level: LogLevel, base?: Record<string, unknown>) {\n\t\tthis.#ready = loadPino(true, level, base).then((p) => {\n\t\t\tthis.#pino = p;\n\t\t});\n\t}\n\n\tasync ready(): Promise<void> {\n\t\tawait this.#ready;\n\t}\n\n\twrite(record: LogRecord): void {\n\t\tif (!this.#pino) return;\n\t\tconst { level, time, msg, ...rest } = record;\n\t\tconst obj = { time, ...rest };\n\t\tswitch (level) {\n\t\t\tcase \"trace\":\n\t\t\t\tthis.#pino.trace(obj, msg);\n\t\t\t\tbreak;\n\t\t\tcase \"debug\":\n\t\t\t\tthis.#pino.debug(obj, msg);\n\t\t\t\tbreak;\n\t\t\tcase \"info\":\n\t\t\t\tthis.#pino.info(obj, msg);\n\t\t\t\tbreak;\n\t\t\tcase \"warn\":\n\t\t\t\tthis.#pino.warn(obj, msg);\n\t\t\t\tbreak;\n\t\t\tcase \"error\":\n\t\t\t\tthis.#pino.error(obj, msg);\n\t\t\t\tbreak;\n\t\t\tcase \"fatal\":\n\t\t\t\tthis.#pino.fatal(obj, msg);\n\t\t\t\tbreak;\n\t\t}\n\t}\n}\n\n/** Null transport — drops everything. For tests. */\nexport class NullTransport implements LogTransport {\n\treadonly name = \"null\";\n\treadonly isDefault = false;\n\twrite(_record: LogRecord): void {\n\t\t// discard\n\t}\n}\n",
7
- "/**\n * `LoggerModule` — drop-in module for structured logging.\n *\n * Usage:\n * @Module({\n * imports: [\n * LoggerModule.forRoot({\n * level: 'info', // 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'fatal'\n * pretty: process.env.NODE_ENV !== 'production',\n * base: { service: 'my-app' },\n * }),\n * ],\n * })\n * export class AppModule {}\n *\n * // any service\n * @Injectable()\n * class MyService {\n * constructor(@Inject(Logger.TOKEN) private logger: Logger) {}\n *\n * async handle() {\n * await this.logger.with({ requestId: 'r-1' }, async () => {\n * this.logger.info({ userId: 'u-1' }, 'processing');\n * });\n * }\n * }\n */\n\nimport { Module } from \"@nexusts/core\";\nimport { Logger } from \"./logger.service.js\";\nimport type { LoggerOptions } from \"./types.js\";\nimport { safeGetMeta, safeDefineMeta, safeHasMeta } from \"@nexusts/core/di/safe-reflect\";\n\n@Module({\n\tproviders: [Logger, { provide: Logger.TOKEN, useExisting: Logger }],\n\texports: [Logger, Logger.TOKEN],\n})\nexport class LoggerModule {\n\tstatic forRoot(options: LoggerOptions = {}) {\n\t\t@Module({\n\t\t\tproviders: [\n\t\t\t\tLogger,\n\t\t\t\t{ provide: Logger.TOKEN, useExisting: Logger },\n\t\t\t\t{ provide: \"LOGGER_OPTIONS\", useValue: options },\n\t\t\t],\n\t\t\texports: [Logger, Logger.TOKEN],\n\t\t})\n\t\tclass ConfiguredLoggerModule {}\n\n\t\tObject.defineProperty(ConfiguredLoggerModule, \"name\", {\n\t\t\tvalue: \"ConfiguredLoggerModule\",\n\t\t});\n\n\t\treturn ConfiguredLoggerModule;\n\t}\n}\n"
7
+ "/**\n * `LoggerModule` — drop-in module for structured logging.\n *\n * Usage:\n * @Module({\n * imports: [\n * LoggerModule.forRoot({\n * level: 'info', // 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'fatal'\n * pretty: process.env.NODE_ENV !== 'production',\n * base: { service: 'my-app' },\n * }),\n * ],\n * })\n * export class AppModule {}\n *\n * // any service\n * @Injectable()\n * class MyService {\n * @Inject(Logger.TOKEN) declare private logger: Logger;\n *\n * async handle() {\n * await this.logger.with({ requestId: 'r-1' }, async () => {\n * this.logger.info({ userId: 'u-1' }, 'processing');\n * });\n * }\n * }\n */\n\nimport { Module } from \"@nexusts/core\";\nimport { Logger } from \"./logger.service.js\";\nimport type { LoggerOptions } from \"./types.js\";\n\n@Module({\n\tproviders: [Logger, { provide: Logger.TOKEN, useExisting: Logger }],\n\texports: [Logger, Logger.TOKEN],\n})\nexport class LoggerModule {\n\tstatic forRoot(options: LoggerOptions = {}) {\n\t\t@Module({\n\t\t\tproviders: [\n\t\t\t\tLogger,\n\t\t\t\t{ provide: Logger.TOKEN, useExisting: Logger },\n\t\t\t\t{ provide: \"LOGGER_OPTIONS\", useValue: options },\n\t\t\t],\n\t\t\texports: [Logger, Logger.TOKEN],\n\t\t})\n\t\tclass ConfiguredLoggerModule {}\n\n\t\tObject.defineProperty(ConfiguredLoggerModule, \"name\", {\n\t\t\tvalue: \"ConfiguredLoggerModule\",\n\t\t});\n\n\t\treturn ConfiguredLoggerModule;\n\t}\n}\n"
8
8
  ],
9
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAcA;AACA;;;ACQA,IAAI,gBAAiC;AACrC,IAAI,kBAAmC;AAEvC,eAAe,QAAQ,CACtB,QACA,OACA,MACoB;AAAA,EACpB,MAAM,UAAU,MAAa;AAAA,EAC7B,MAAM,OAAO,QAAQ,WAAW;AAAA,EAChC,IAAI,QAAQ;AAAA,IACX,IAAI;AAAA,MAAiB,OAAO;AAAA,IAE5B,MAAM,OAAgC;AAAA,MACrC;AAAA,MACA;AAAA,MACA,UAAU;AAAA,MACV,WAAW,MAAM,YAAY,IAAI,KAAK,EAAE,YAAY;AAAA,IACrD;AAAA,IACA,IAAI;AAAA,MACH,MAAM,YAAa,MAAa;AAAA,MAGhC,MAAM,YAAY,UAAU,WAAW;AAAA,MACvC,IAAI,OAAO,cAAc,YAAY;AAAA,QACpC,KAAK,YAAY,UAAU;AAAA,UAC1B,eAAe;AAAA,UACf,QAAQ;AAAA,UACR,UAAU;AAAA,QACX,CAAC;AAAA,MACF;AAAA,MACC,MAAM;AAAA,IAGR,kBAAmB,KAAgD,IAAI;AAAA,IACvE,OAAO;AAAA,EACR;AAAA,EACA,IAAI;AAAA,IAAe,OAAO;AAAA,EAC1B,gBAAiB,KAAgD;AAAA,IAChE;AAAA,IACA;AAAA,IACA,WAAW,MAAM,YAAY,IAAI,KAAK,EAAE,YAAY;AAAA,EACrD,CAAC;AAAA,EACD,OAAO;AAAA;AAAA;AAID,MAAM,cAAsC;AAAA,EACzC,OAAO;AAAA,EACP,YAAY;AAAA,EACrB,QAAyB;AAAA,EACzB;AAAA,EAEA,WAAW,CAAC,OAAiB,MAAgC;AAAA,IAC5D,KAAK,SAAS,SAAS,OAAO,OAAO,IAAI,EAAE,KAAK,CAAC,MAAM;AAAA,MACtD,KAAK,QAAQ;AAAA,KACb;AAAA;AAAA,OAGI,MAAK,GAAkB;AAAA,IAC5B,MAAM,KAAK;AAAA;AAAA,EAGZ,KAAK,CAAC,QAAyB;AAAA,IAC9B,IAAI,CAAC,KAAK;AAAA,MAAO;AAAA,IACjB,QAAQ,OAAO,MAAM,QAAQ,SAAS;AAAA,IACtC,MAAM,MAAM,EAAE,SAAS,KAAK;AAAA,IAC5B,QAAQ;AAAA,WACF;AAAA,QACJ,KAAK,MAAM,MAAM,KAAK,GAAG;AAAA,QACzB;AAAA,WACI;AAAA,QACJ,KAAK,MAAM,MAAM,KAAK,GAAG;AAAA,QACzB;AAAA,WACI;AAAA,QACJ,KAAK,MAAM,KAAK,KAAK,GAAG;AAAA,QACxB;AAAA,WACI;AAAA,QACJ,KAAK,MAAM,KAAK,KAAK,GAAG;AAAA,QACxB;AAAA,WACI;AAAA,QACJ,KAAK,MAAM,MAAM,KAAK,GAAG;AAAA,QACzB;AAAA,WACI;AAAA,QACJ,KAAK,MAAM,MAAM,KAAK,GAAG;AAAA,QACzB;AAAA;AAAA;AAGJ;AAAA;AAGO,MAAM,gBAAwC;AAAA,EAC3C,OAAO;AAAA,EACP,YAAY;AAAA,EACrB,QAAyB;AAAA,EACzB;AAAA,EAEA,WAAW,CAAC,OAAiB,MAAgC;AAAA,IAC5D,KAAK,SAAS,SAAS,MAAM,OAAO,IAAI,EAAE,KAAK,CAAC,MAAM;AAAA,MACrD,KAAK,QAAQ;AAAA,KACb;AAAA;AAAA,OAGI,MAAK,GAAkB;AAAA,IAC5B,MAAM,KAAK;AAAA;AAAA,EAGZ,KAAK,CAAC,QAAyB;AAAA,IAC9B,IAAI,CAAC,KAAK;AAAA,MAAO;AAAA,IACjB,QAAQ,OAAO,MAAM,QAAQ,SAAS;AAAA,IACtC,MAAM,MAAM,EAAE,SAAS,KAAK;AAAA,IAC5B,QAAQ;AAAA,WACF;AAAA,QACJ,KAAK,MAAM,MAAM,KAAK,GAAG;AAAA,QACzB;AAAA,WACI;AAAA,QACJ,KAAK,MAAM,MAAM,KAAK,GAAG;AAAA,QACzB;AAAA,WACI;AAAA,QACJ,KAAK,MAAM,KAAK,KAAK,GAAG;AAAA,QACxB;AAAA,WACI;AAAA,QACJ,KAAK,MAAM,KAAK,KAAK,GAAG;AAAA,QACxB;AAAA,WACI;AAAA,QACJ,KAAK,MAAM,MAAM,KAAK,GAAG;AAAA,QACzB;AAAA,WACI;AAAA,QACJ,KAAK,MAAM,MAAM,KAAK,GAAG;AAAA,QACzB;AAAA;AAAA;AAGJ;AAAA;AAGO,MAAM,cAAsC;AAAA,EACzC,OAAO;AAAA,EACP,YAAY;AAAA,EACrB,KAAK,CAAC,SAA0B;AAGjC;;;AD3IA,IAAM,aAAuC;AAAA,EAC5C,OAAO;AAAA,EACP,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AACR;AAAA;AAGO,MAAM,OAAO;AAAA,SAEH,QAAQ,OAAO,IAAI,cAAc;AAAA,EAEjD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,MAAM,IAAI;AAAA,EAEV,WAAW,CAA2B,UAAyB,CAAC,GAAG;AAAA,IAClE,KAAK,SAAS,QAAQ,UAAU;AAAA,IAChC,KAAK,OAAO,QAAQ,QAAQ,CAAC;AAAA,IAC7B,KAAK,QAAQ,QAAQ,UAAU,QAAQ,IAAI,gBAAgB,eAAe,SAAS;AAAA,IACnF,IAAI,QAAQ,cAAc,QAAQ,WAAW,SAAS,GAAG;AAAA,MACxD,KAAK,aAAa,QAAQ;AAAA,IAC3B,EAAO;AAAA,MACN,MAAM,SAAS,QAAQ,UAAU,QAAQ,IAAI,gBAAgB;AAAA,MAC7D,KAAK,aAAa;AAAA,QACjB,SACG,IAAI,gBAAgB,KAAK,OAAO,KAAK,IAAI,IACzC,IAAI,cAAc,KAAK,OAAO,KAAK,IAAI;AAAA,MAC3C;AAAA;AAAA;AAAA,EAUF,KAAK,CAAC,MAAwC,MAAqB;AAAA,IAClE,KAAK,KAAK,SAAS,MAAM,IAAI;AAAA;AAAA,EAK9B,KAAK,CAAC,MAAwC,MAAqB;AAAA,IAClE,KAAK,KAAK,SAAS,MAAM,IAAI;AAAA;AAAA,EAK9B,IAAI,CAAC,MAAwC,MAAqB;AAAA,IACjE,KAAK,KAAK,QAAQ,MAAM,IAAI;AAAA;AAAA,EAK7B,IAAI,CAAC,MAAwC,MAAqB;AAAA,IACjE,KAAK,KAAK,QAAQ,MAAM,IAAI;AAAA;AAAA,EAK7B,KAAK,CAAC,MAAwC,MAAqB;AAAA,IAClE,KAAK,KAAK,SAAS,MAAM,IAAI;AAAA;AAAA,EAK9B,KAAK,CAAC,MAAwC,MAAqB;AAAA,IAClE,KAAK,KAAK,SAAS,MAAM,IAAI;AAAA;AAAA,EAW9B,IAAO,CAAC,MAAkB,IAAgB;AAAA,IACzC,MAAM,OAAO,KAAK,IAAI,SAAS,KAAK,CAAC;AAAA,IACrC,MAAM,OAAmB,KAAK,SAAS,KAAK;AAAA,IAC5C,OAAO,KAAK,IAAI,IAAI,MAAM,EAAE;AAAA;AAAA,MAIzB,OAAO,GAAe;AAAA,IACzB,OAAO,KAAK,IAAI,SAAS,KAAK,CAAC;AAAA;AAAA,EAWhC,KAAK,CAAC,UAA2C;AAAA,IAChD,MAAM,QAAQ,OAAO,OAAO,OAAO,SAAS;AAAA,IAC5C,MAAM,aAAa,KAAK;AAAA,IACxB,MAAM,SAAS,KAAK;AAAA,IACpB,MAAM,OAAO,KAAK,KAAK,SAAS,SAAS;AAAA,IACzC,MAAM,QAAQ,KAAK;AAAA,IACnB,MAAM,MAAM,KAAK;AAAA,IACjB,OAAO;AAAA;AAAA,OAQF,MAAK,GAAkB;AAAA,IAC5B,WAAW,KAAK,KAAK,YAAY;AAAA,MAChC,MAAM,IAAK,EAAsC;AAAA,MACjD,IAAI;AAAA,QAAG,MAAM,EAAE,KAAK,CAAC;AAAA,IACtB;AAAA;AAAA,EAOO,IAAI,CAAC,OAAiB,MAAwC,MAAqB;AAAA,IAC1F,IAAI,KAAK;AAAA,MAAQ;AAAA,IACjB,IAAI,WAAW,SAAS,WAAW,KAAK;AAAA,MAAQ;AAAA,IAEhD,IAAI,OAAgC,CAAC;AAAA,IACrC,IAAI;AAAA,IACJ,IAAI,OAAO,SAAS,UAAU;AAAA,MAC7B,MAAM;AAAA,IACP,EAAO;AAAA,MACN,OAAO;AAAA,MACP,MAAM,QAAQ;AAAA;AAAA,IAGf,MAAM,MAAM,KAAK,IAAI,SAAS,KAAK,CAAC;AAAA,IACpC,MAAM,SAAoB;AAAA,MACzB;AAAA,MACA,MAAM,KAAK,IAAI;AAAA,MACf;AAAA,SACG,KAAK;AAAA,SACL;AAAA,SACA;AAAA,IACJ;AAAA,IACA,WAAW,KAAK,KAAK,YAAY;AAAA,MAChC,IAAI;AAAA,QACH,EAAE,MAAM,MAAM;AAAA,QACb,MAAM;AAAA,IAGT;AAAA;AAEF;AArJa,SAAN;AAAA,EADN,WAAW;AAAA,EAWE,kCAAO,gBAAgB;AAAA,EAV9B;AAAA;AAAA;AAAA,GAAM;;AEPb;AASO,MAAM,aAAa;AAAA,SAClB,OAAO,CAAC,UAAyB,CAAC,GAAG;AAAA,IAS3C,MAAM,uBAAuB;AAAA,IAAC;AAAA,IAAxB,yBAAN;AAAA,MARC,OAAO;AAAA,QACP,WAAW;AAAA,UACV;AAAA,UACA,EAAE,SAAS,OAAO,OAAO,aAAa,OAAO;AAAA,UAC7C,EAAE,SAAS,kBAAkB,UAAU,QAAQ;AAAA,QAChD;AAAA,QACA,SAAS,CAAC,QAAQ,OAAO,KAAK;AAAA,MAC/B,CAAC;AAAA,OACK;AAAA,IAEN,OAAO,eAAe,wBAAwB,QAAQ;AAAA,MACrD,OAAO;AAAA,IACR,CAAC;AAAA,IAED,OAAO;AAAA;AAET;AAlBa,eAAN;AAAA,EAJN,OAAO;AAAA,IACP,WAAW,CAAC,QAAQ,EAAE,SAAS,OAAO,OAAO,aAAa,OAAO,CAAC;AAAA,IAClE,SAAS,CAAC,QAAQ,OAAO,KAAK;AAAA,EAC/B,CAAC;AAAA,GACY;",
10
- "debugId": "2CAEE63E12F93B7564756E2164756E21",
9
+ "mappings": "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",
10
+ "debugId": "57B2399E8089239B64756E2164756E21",
11
11
  "names": []
12
12
  }
@@ -16,7 +16,7 @@
16
16
  * // any service
17
17
  * @Injectable()
18
18
  * class MyService {
19
- * constructor(@Inject(Logger.TOKEN) private logger: Logger) {}
19
+ * @Inject(Logger.TOKEN) declare private logger: Logger;
20
20
  *
21
21
  * async handle() {
22
22
  * await this.logger.with({ requestId: 'r-1' }, async () => {
@@ -6,23 +6,34 @@
6
6
  * `logger.with({ requestId, userId, ... })`.
7
7
  *
8
8
  * Usage:
9
- * constructor(@Inject(Logger.TOKEN) private logger: Logger) {}
9
+ * @Inject(Logger.TOKEN) declare logger: Logger;
10
10
  *
11
11
  * this.logger.info({ userId: 'u-1' }, 'user signed in');
12
12
  * this.logger.error({ err }, 'failed to save');
13
13
  */
14
14
  import { AsyncLocalStorage } from "node:async_hooks";
15
- import type { LogLevel, LogTransport, LoggerOptions, LogContext } from "./types.js";
15
+ import type { LogLevel, LogTransport, LogContext } from "./types.js";
16
16
  import { NullTransport } from "./transports/index.js";
17
17
  export declare class Logger {
18
18
  /** DI token — use with `@Inject(Logger.TOKEN)`. */
19
19
  static readonly TOKEN: unique symbol;
20
- transports: LogTransport[];
21
- silent: boolean;
22
- base: Record<string, unknown>;
23
- level: LogLevel;
20
+ /** Logger options — injected by DI container. */
21
+ private options;
22
+ private _transports;
23
+ private _silent;
24
+ private _base;
25
+ private _level;
26
+ private _initialized;
24
27
  als: AsyncLocalStorage<LogContext>;
25
- constructor(options?: LoggerOptions);
28
+ private init;
29
+ get silent(): boolean;
30
+ set silent(v: boolean);
31
+ get base(): Record<string, unknown>;
32
+ set base(v: Record<string, unknown>);
33
+ get level(): LogLevel;
34
+ set level(v: LogLevel);
35
+ get transports(): LogTransport[];
36
+ set transports(v: LogTransport[]);
26
37
  trace(meta: Record<string, unknown>, msg: string): void;
27
38
  trace(msg: string): void;
28
39
  debug(meta: Record<string, unknown>, msg: string): void;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nexusts/logger",
3
- "version": "0.9.6",
3
+ "version": "0.9.8",
4
4
  "description": "Pino-backed structured logging",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -26,7 +26,7 @@
26
26
  ],
27
27
  "license": "MIT",
28
28
  "dependencies": {
29
- "@nexusts/core": "^0.9.6",
29
+ "@nexusts/core": "^0.9.8",
30
30
  "pino": "^9.0.0"
31
31
  },
32
32
  "repository": {