functype-log 1.2.1 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -37,6 +37,45 @@ await program.provideLayer(LoggerLive.console()).runOrThrow()
37
37
  await program.provideLayer(LoggerLive.console({ prefix: "[APP]" })).runOrThrow()
38
38
  ```
39
39
 
40
+ `ConsoleLoggerOptions` accepts `level`, `prefix`, `stream`, and `console`:
41
+
42
+ ```typescript
43
+ // Default — info/debug → stdout (console.info/console.debug),
44
+ // warn/error → stderr (console.warn/console.error). Matches loglayer's
45
+ // per-level routing and the convention of pino / winston / bunyan.
46
+ LoggerLive.console()
47
+
48
+ // Route ALL levels through stderr. Required when stdout is reserved as a
49
+ // data/protocol channel — e.g. MCP-over-stdio servers (stdout carries
50
+ // JSON-RPC; any other bytes corrupt the protocol), or CLI tools that emit
51
+ // structured output on stdout.
52
+ LoggerLive.console({ stream: "stderr" })
53
+
54
+ // Fully override the sink — file streams, structured collectors, in-memory
55
+ // capture for tests. Takes precedence over `stream`. Only the methods
56
+ // loglayer's ConsoleTransport calls need to be present
57
+ // (log / info / debug / trace / warn / error).
58
+ LoggerLive.console({
59
+ console: {
60
+ info: (...args) => myStream.write(format(args) + "\n"),
61
+ warn: (...args) => myStream.write(format(args) + "\n"),
62
+ error: (...args) => myStream.write(format(args) + "\n"),
63
+ debug: () => {},
64
+ trace: () => {},
65
+ log: (...args) => myStream.write(format(args) + "\n"),
66
+ },
67
+ })
68
+ ```
69
+
70
+ The same options propagate to `createDirectConsoleLogger`:
71
+
72
+ ```typescript
73
+ import { createDirectConsoleLogger } from "functype-log/direct"
74
+
75
+ const log = createDirectConsoleLogger({ stream: "stderr" }) // MCP-safe
76
+ log.info("connection established") // → stderr, not stdout
77
+ ```
78
+
40
79
  ### Silent (testing/suppression)
41
80
 
42
81
  ```typescript
@@ -160,8 +199,37 @@ import { Logger } from "functype-log/logger" // types only
160
199
  import { LoggerLive } from "functype-log/layers" // layer constructors
161
200
  import { createTestLogger } from "functype-log/testing" // test utilities
162
201
  import { withLogging } from "functype-log/middleware" // middleware
202
+ import { createDirectConsoleLogger } from "functype-log/direct" // sync/imperative API
203
+ ```
204
+
205
+ ## Interop with `functype`'s core `Logger` (1.3.0+)
206
+
207
+ The core `functype` package ships a minimal `Logger` interface at `functype` (and `functype/logger`) — 4 mandatory methods (`debug`/`info`/`warn`/`error`) returning `void`, designed as the shared shape for boot-diagnostic / observability hooks across the ecosystem (see `bootDiagnostics` in `functype-os/config`).
208
+
209
+ `DirectLogger` from `functype-log/direct` **structurally satisfies** that core `Logger` interface — its `debug`/`info`/`warn`/`error` methods are a superset of the core shape. You can pass a `DirectLogger` directly anywhere a core `Logger` is expected, with no adapter:
210
+
211
+ ```typescript
212
+ import { createDirectConsoleLogger } from "functype-log/direct"
213
+ import type { Logger } from "functype"
214
+
215
+ const logger: Logger = createDirectConsoleLogger() // structural compat — no cast required
216
+ ```
217
+
218
+ This means you can plug `functype-log` into `bootDiagnostics` (or any other functype-ecosystem hook taking a core `Logger`) without coupling the consumer package to LogLayer:
219
+
220
+ ```typescript
221
+ import { bootDiagnostics, Layered, ProcessEnvSource } from "functype-os/config"
222
+ import { createDirectConsoleLogger } from "functype-log/direct"
223
+
224
+ bootDiagnostics({
225
+ source: Layered([ProcessEnvSource()]),
226
+ required: ["DATABASE_URL"],
227
+ logger: createDirectConsoleLogger(),
228
+ })
163
229
  ```
164
230
 
231
+ The IO-shaped `Logger` (this package's primary API) does NOT structurally satisfy the core `Logger` — its methods return `IO<never, never, void>` instead of `void`. For IO-aware code that needs to also drive boot diagnostics, derive a `DirectLogger` via `toDirectLogger(ioLogger)` and pass that.
232
+
165
233
  ## Requirements
166
234
 
167
235
  - functype >= 0.55.0
@@ -0,0 +1,32 @@
1
+ import { i as Logger, n as LogLevel } from "./Logger-CGFuJPzn.js";
2
+
3
+ //#region src/layers/ConsoleLogger.d.ts
4
+ type ConsoleLoggerOptions = {
5
+ readonly level?: LogLevel;
6
+ readonly prefix?: string;
7
+ /**
8
+ * Which standard stream console output is routed to.
9
+ *
10
+ * - `"stdout"` (default) — uses the global `console`. `info`/`debug` land
11
+ * on stdout; `warn`/`error`/`trace` land on stderr (loglayer's per-level
12
+ * routing). Matches the convention of every other Node logging library
13
+ * (pino, winston, bunyan).
14
+ * - `"stderr"` — routes ALL levels through `console.error` (stderr). Use
15
+ * when stdout is a reserved data/protocol channel — most notably
16
+ * MCP-over-stdio servers where stdout carries JSON-RPC and any other
17
+ * bytes corrupt the protocol.
18
+ */
19
+ readonly stream?: "stdout" | "stderr";
20
+ /**
21
+ * Fully override the console sink. Takes precedence over `stream`. Use for
22
+ * routing to a file stream, structured collector, or other custom sink.
23
+ *
24
+ * Only the methods called by loglayer's `ConsoleTransport` need to be
25
+ * present (`log`/`info`/`debug`/`trace`/`warn`/`error`).
26
+ */
27
+ readonly console?: Partial<Console>;
28
+ };
29
+ declare const createConsoleLogger: (options?: ConsoleLoggerOptions) => Logger;
30
+ //#endregion
31
+ export { createConsoleLogger as n, ConsoleLoggerOptions as t };
32
+ //# sourceMappingURL=ConsoleLogger-DA6_SLWt.d.ts.map
@@ -1,5 +1,5 @@
1
1
  import { i as Logger, r as LogMetadata } from "./Logger-CGFuJPzn.js";
2
- import { t as ConsoleLoggerOptions } from "./ConsoleLogger-D7C4ytKU.js";
2
+ import { t as ConsoleLoggerOptions } from "./ConsoleLogger-DA6_SLWt.js";
3
3
 
4
4
  //#region src/direct/DirectLogger.d.ts
5
5
  type DirectLogger = {
@@ -18,4 +18,4 @@ declare const createDirectConsoleLogger: (options?: ConsoleLoggerOptions) => Dir
18
18
  declare const directSilentLogger: DirectLogger;
19
19
  //#endregion
20
20
  export { toDirectLogger as i, createDirectConsoleLogger as n, directSilentLogger as r, DirectLogger as t };
21
- //# sourceMappingURL=DirectLogger-J-MZFwsP.d.ts.map
21
+ //# sourceMappingURL=DirectLogger-DD-W9b5Z.d.ts.map
@@ -1,5 +1,5 @@
1
1
  import { n as LogLevel, t as LogEntry } from "./Logger-CGFuJPzn.js";
2
- import { t as DirectLogger } from "./DirectLogger-J-MZFwsP.js";
2
+ import { t as DirectLogger } from "./DirectLogger-DD-W9b5Z.js";
3
3
  import { List } from "functype";
4
4
 
5
5
  //#region src/direct/DirectTestLogger.d.ts
@@ -12,4 +12,4 @@ type DirectTestLoggerHandle = {
12
12
  declare const createDirectTestLogger: () => DirectTestLoggerHandle;
13
13
  //#endregion
14
14
  export { createDirectTestLogger as n, DirectTestLoggerHandle as t };
15
- //# sourceMappingURL=DirectTestLogger-CEA3uxf8.d.ts.map
15
+ //# sourceMappingURL=DirectTestLogger-_mZeya1X.d.ts.map
@@ -1,5 +1,5 @@
1
1
  import { i as Logger } from "./Logger-CGFuJPzn.js";
2
- import { t as ConsoleLoggerOptions } from "./ConsoleLogger-D7C4ytKU.js";
2
+ import { t as ConsoleLoggerOptions } from "./ConsoleLogger-DA6_SLWt.js";
3
3
  import { Layer } from "functype";
4
4
  import { ILogLayer } from "loglayer";
5
5
 
@@ -11,4 +11,4 @@ declare const LoggerLive: {
11
11
  };
12
12
  //#endregion
13
13
  export { LoggerLive as t };
14
- //# sourceMappingURL=LoggerLayer-Q-W1mssb.d.ts.map
14
+ //# sourceMappingURL=LoggerLayer-CbTtwJZw.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"LogLayerAdapter.js","names":[],"sources":["../../src/adapter/LogLayerAdapter.ts"],"sourcesContent":["import { IO } from \"functype\"\nimport type { ILogLayer } from \"loglayer\"\n\nimport type { Logger, LogLevel, LogMetadata } from \"../logger/Logger\"\n\nconst makeMethod =\n (logLayer: ILogLayer, level: LogLevel, baseError?: Error) =>\n (message: string, metadata?: LogMetadata): IO<never, never, void> =>\n IO.sync(() => {\n const base = metadata ? logLayer.withMetadata(metadata) : logLayer\n const entry = baseError ? base.withError(baseError) : base\n entry[level](message)\n })\n\nexport const logLayerAdapter = (logLayer: ILogLayer, baseError?: Error): Logger => ({\n trace: makeMethod(logLayer, \"trace\", baseError),\n debug: makeMethod(logLayer, \"debug\", baseError),\n info: makeMethod(logLayer, \"info\", baseError),\n warn: makeMethod(logLayer, \"warn\", baseError),\n error: makeMethod(logLayer, \"error\", baseError),\n fatal: makeMethod(logLayer, \"fatal\", baseError),\n withError: (err: Error) => logLayerAdapter(logLayer, err),\n withContext: (ctx: LogMetadata) => logLayerAdapter(logLayer.withContext(ctx), baseError),\n child: (ctx?: LogMetadata) => {\n const childLog = logLayer.child()\n return ctx ? logLayerAdapter(childLog.withContext(ctx)) : logLayerAdapter(childLog)\n },\n})\n"],"mappings":"8BAKA,MAAM,GACH,EAAqB,EAAiB,KACtC,EAAiB,IAChB,EAAG,SAAW,CACZ,IAAM,EAAO,EAAW,EAAS,aAAa,CAAQ,EAAI,GAC5C,EAAY,EAAK,UAAU,CAAS,EAAI,GAChD,GAAO,CAAO,CACtB,CAAC,EAEQ,GAAmB,EAAqB,KAA+B,CAClF,MAAO,EAAW,EAAU,QAAS,CAAS,EAC9C,MAAO,EAAW,EAAU,QAAS,CAAS,EAC9C,KAAM,EAAW,EAAU,OAAQ,CAAS,EAC5C,KAAM,EAAW,EAAU,OAAQ,CAAS,EAC5C,MAAO,EAAW,EAAU,QAAS,CAAS,EAC9C,MAAO,EAAW,EAAU,QAAS,CAAS,EAC9C,UAAY,GAAe,EAAgB,EAAU,CAAG,EACxD,YAAc,GAAqB,EAAgB,EAAS,YAAY,CAAG,EAAG,CAAS,EACvF,MAAQ,GAAsB,CAC5B,IAAM,EAAW,EAAS,MAAM,EAChC,OAAa,EAAN,EAAsB,EAAS,YAAY,CAAG,EAAqB,CAAQ,CACpF,CACF"}
1
+ {"version":3,"file":"LogLayerAdapter.js","names":[],"sources":["../../src/adapter/LogLayerAdapter.ts"],"sourcesContent":["import { IO } from \"functype\"\nimport type { ILogLayer } from \"loglayer\"\n\nimport type { Logger, LogLevel, LogMetadata } from \"../logger/Logger\"\n\nconst makeMethod =\n (logLayer: ILogLayer, level: LogLevel, baseError?: Error) =>\n (message: string, metadata?: LogMetadata): IO<never, never, void> =>\n IO.sync(() => {\n const base = metadata ? logLayer.withMetadata(metadata) : logLayer\n const entry = baseError ? base.withError(baseError) : base\n entry[level](message)\n })\n\nexport const logLayerAdapter = (logLayer: ILogLayer, baseError?: Error): Logger => ({\n trace: makeMethod(logLayer, \"trace\", baseError),\n debug: makeMethod(logLayer, \"debug\", baseError),\n info: makeMethod(logLayer, \"info\", baseError),\n warn: makeMethod(logLayer, \"warn\", baseError),\n error: makeMethod(logLayer, \"error\", baseError),\n fatal: makeMethod(logLayer, \"fatal\", baseError),\n withError: (err: Error) => logLayerAdapter(logLayer, err),\n withContext: (ctx: LogMetadata) => logLayerAdapter(logLayer.withContext(ctx), baseError),\n child: (ctx?: LogMetadata) => {\n const childLog = logLayer.child()\n return ctx ? logLayerAdapter(childLog.withContext(ctx)) : logLayerAdapter(childLog)\n },\n})\n"],"mappings":"8BAKA,MAAM,GACH,EAAqB,EAAiB,KACtC,EAAiB,IAChB,EAAG,SAAW,CACZ,IAAM,EAAO,EAAW,EAAS,aAAa,CAAQ,EAAI,GAC5C,EAAY,EAAK,UAAU,CAAS,EAAI,EAAA,CAChD,EAAM,CAAC,CAAO,CACtB,CAAC,EAEQ,GAAmB,EAAqB,KAA+B,CAClF,MAAO,EAAW,EAAU,QAAS,CAAS,EAC9C,MAAO,EAAW,EAAU,QAAS,CAAS,EAC9C,KAAM,EAAW,EAAU,OAAQ,CAAS,EAC5C,KAAM,EAAW,EAAU,OAAQ,CAAS,EAC5C,MAAO,EAAW,EAAU,QAAS,CAAS,EAC9C,MAAO,EAAW,EAAU,QAAS,CAAS,EAC9C,UAAY,GAAe,EAAgB,EAAU,CAAG,EACxD,YAAc,GAAqB,EAAgB,EAAS,YAAY,CAAG,EAAG,CAAS,EACvF,MAAQ,GAAsB,CAC5B,IAAM,EAAW,EAAS,MAAM,EAChC,OAAa,EAAN,EAAsB,EAAS,YAAY,CAAG,EAAqB,CAAQ,CACpF,CACF"}
@@ -1,2 +1,2 @@
1
- import { i as toDirectLogger, n as createDirectConsoleLogger, r as directSilentLogger, t as DirectLogger } from "../DirectLogger-J-MZFwsP.js";
1
+ import { i as toDirectLogger, n as createDirectConsoleLogger, r as directSilentLogger, t as DirectLogger } from "../DirectLogger-DD-W9b5Z.js";
2
2
  export { DirectLogger, createDirectConsoleLogger, directSilentLogger, toDirectLogger };
@@ -1 +1 @@
1
- {"version":3,"file":"DirectLogger.js","names":[],"sources":["../../src/direct/DirectLogger.ts"],"sourcesContent":["import type { ConsoleLoggerOptions } from \"../layers/ConsoleLogger\"\nimport { createConsoleLogger } from \"../layers/ConsoleLogger\"\nimport { silentLogger } from \"../layers/SilentLogger\"\nimport type { Logger, LogMetadata } from \"../logger/Logger\"\n\nexport type DirectLogger = {\n readonly trace: (message: string, metadata?: LogMetadata) => void\n readonly debug: (message: string, metadata?: LogMetadata) => void\n readonly info: (message: string, metadata?: LogMetadata) => void\n readonly warn: (message: string, metadata?: LogMetadata) => void\n readonly error: (message: string, metadata?: LogMetadata) => void\n readonly fatal: (message: string, metadata?: LogMetadata) => void\n readonly withError: (error: Error) => DirectLogger\n readonly withContext: (context: LogMetadata) => DirectLogger\n readonly child: (context?: LogMetadata) => DirectLogger\n}\n\nexport const toDirectLogger = (logger: Logger): DirectLogger => ({\n trace: (msg, meta) => logger.trace(msg, meta).runSyncOrThrow(),\n debug: (msg, meta) => logger.debug(msg, meta).runSyncOrThrow(),\n info: (msg, meta) => logger.info(msg, meta).runSyncOrThrow(),\n warn: (msg, meta) => logger.warn(msg, meta).runSyncOrThrow(),\n error: (msg, meta) => logger.error(msg, meta).runSyncOrThrow(),\n fatal: (msg, meta) => logger.fatal(msg, meta).runSyncOrThrow(),\n withError: (err) => toDirectLogger(logger.withError(err)),\n withContext: (ctx) => toDirectLogger(logger.withContext(ctx)),\n child: (ctx) => toDirectLogger(logger.child(ctx)),\n})\n\nexport const createDirectConsoleLogger = (options?: ConsoleLoggerOptions): DirectLogger =>\n toDirectLogger(createConsoleLogger(options))\n\nexport const directSilentLogger: DirectLogger = toDirectLogger(silentLogger)\n"],"mappings":"0HAiBA,MAAa,EAAkB,IAAkC,CAC/D,OAAQ,EAAK,IAAS,EAAO,MAAM,EAAK,CAAI,EAAE,eAAe,EAC7D,OAAQ,EAAK,IAAS,EAAO,MAAM,EAAK,CAAI,EAAE,eAAe,EAC7D,MAAO,EAAK,IAAS,EAAO,KAAK,EAAK,CAAI,EAAE,eAAe,EAC3D,MAAO,EAAK,IAAS,EAAO,KAAK,EAAK,CAAI,EAAE,eAAe,EAC3D,OAAQ,EAAK,IAAS,EAAO,MAAM,EAAK,CAAI,EAAE,eAAe,EAC7D,OAAQ,EAAK,IAAS,EAAO,MAAM,EAAK,CAAI,EAAE,eAAe,EAC7D,UAAY,GAAQ,EAAe,EAAO,UAAU,CAAG,CAAC,EACxD,YAAc,GAAQ,EAAe,EAAO,YAAY,CAAG,CAAC,EAC5D,MAAQ,GAAQ,EAAe,EAAO,MAAM,CAAG,CAAC,CAClD,GAEa,EAA6B,GACxC,EAAe,EAAoB,CAAO,CAAC,EAEhC,EAAmC,EAAe,CAAY"}
1
+ {"version":3,"file":"DirectLogger.js","names":[],"sources":["../../src/direct/DirectLogger.ts"],"sourcesContent":["import type { ConsoleLoggerOptions } from \"../layers/ConsoleLogger\"\nimport { createConsoleLogger } from \"../layers/ConsoleLogger\"\nimport { silentLogger } from \"../layers/SilentLogger\"\nimport type { Logger, LogMetadata } from \"../logger/Logger\"\n\nexport type DirectLogger = {\n readonly trace: (message: string, metadata?: LogMetadata) => void\n readonly debug: (message: string, metadata?: LogMetadata) => void\n readonly info: (message: string, metadata?: LogMetadata) => void\n readonly warn: (message: string, metadata?: LogMetadata) => void\n readonly error: (message: string, metadata?: LogMetadata) => void\n readonly fatal: (message: string, metadata?: LogMetadata) => void\n readonly withError: (error: Error) => DirectLogger\n readonly withContext: (context: LogMetadata) => DirectLogger\n readonly child: (context?: LogMetadata) => DirectLogger\n}\n\nexport const toDirectLogger = (logger: Logger): DirectLogger => ({\n trace: (msg, meta) => logger.trace(msg, meta).runSyncOrThrow(),\n debug: (msg, meta) => logger.debug(msg, meta).runSyncOrThrow(),\n info: (msg, meta) => logger.info(msg, meta).runSyncOrThrow(),\n warn: (msg, meta) => logger.warn(msg, meta).runSyncOrThrow(),\n error: (msg, meta) => logger.error(msg, meta).runSyncOrThrow(),\n fatal: (msg, meta) => logger.fatal(msg, meta).runSyncOrThrow(),\n withError: (err) => toDirectLogger(logger.withError(err)),\n withContext: (ctx) => toDirectLogger(logger.withContext(ctx)),\n child: (ctx) => toDirectLogger(logger.child(ctx)),\n})\n\nexport const createDirectConsoleLogger = (options?: ConsoleLoggerOptions): DirectLogger =>\n toDirectLogger(createConsoleLogger(options))\n\nexport const directSilentLogger: DirectLogger = toDirectLogger(silentLogger)\n"],"mappings":"0HAiBA,MAAa,EAAkB,IAAkC,CAC/D,OAAQ,EAAK,IAAS,EAAO,MAAM,EAAK,CAAI,CAAC,CAAC,eAAe,EAC7D,OAAQ,EAAK,IAAS,EAAO,MAAM,EAAK,CAAI,CAAC,CAAC,eAAe,EAC7D,MAAO,EAAK,IAAS,EAAO,KAAK,EAAK,CAAI,CAAC,CAAC,eAAe,EAC3D,MAAO,EAAK,IAAS,EAAO,KAAK,EAAK,CAAI,CAAC,CAAC,eAAe,EAC3D,OAAQ,EAAK,IAAS,EAAO,MAAM,EAAK,CAAI,CAAC,CAAC,eAAe,EAC7D,OAAQ,EAAK,IAAS,EAAO,MAAM,EAAK,CAAI,CAAC,CAAC,eAAe,EAC7D,UAAY,GAAQ,EAAe,EAAO,UAAU,CAAG,CAAC,EACxD,YAAc,GAAQ,EAAe,EAAO,YAAY,CAAG,CAAC,EAC5D,MAAQ,GAAQ,EAAe,EAAO,MAAM,CAAG,CAAC,CAClD,GAEa,EAA6B,GACxC,EAAe,EAAoB,CAAO,CAAC,EAEhC,EAAmC,EAAe,CAAY"}
@@ -1,2 +1,2 @@
1
- import { n as createDirectTestLogger, t as DirectTestLoggerHandle } from "../DirectTestLogger-CEA3uxf8.js";
1
+ import { n as createDirectTestLogger, t as DirectTestLoggerHandle } from "../DirectTestLogger-_mZeya1X.js";
2
2
  export { DirectTestLoggerHandle, createDirectTestLogger };
@@ -1 +1 @@
1
- {"version":3,"file":"DirectTestLogger.js","names":[],"sources":["../../src/direct/DirectTestLogger.ts"],"sourcesContent":["import { List } from \"functype\"\n\nimport type { LogEntry, LogLevel, LogMetadata } from \"../logger/Logger\"\nimport type { DirectLogger } from \"./DirectLogger\"\n\nexport type DirectTestLoggerHandle = {\n readonly logger: DirectLogger\n readonly entries: () => List<LogEntry>\n readonly clear: () => void\n readonly hasEntry: (level: LogLevel, messagePattern: string | RegExp) => boolean\n}\n\nconst createLoggerFromStore = (store: LogEntry[], baseContext: LogMetadata, baseError?: Error): DirectLogger => {\n const makeMethod =\n (level: LogLevel) =>\n (message: string, metadata?: LogMetadata): void => {\n store.push({\n level,\n message,\n metadata: Object.keys(baseContext).length > 0 || metadata ? { ...baseContext, ...metadata } : undefined,\n error: baseError,\n timestamp: new Date(),\n })\n }\n\n return {\n trace: makeMethod(\"trace\"),\n debug: makeMethod(\"debug\"),\n info: makeMethod(\"info\"),\n warn: makeMethod(\"warn\"),\n error: makeMethod(\"error\"),\n fatal: makeMethod(\"fatal\"),\n withError: (err: Error) => createLoggerFromStore(store, baseContext, err),\n withContext: (ctx: LogMetadata) => createLoggerFromStore(store, { ...baseContext, ...ctx }, baseError),\n child: (ctx?: LogMetadata) => createLoggerFromStore(store, { ...baseContext, ...ctx }, undefined),\n }\n}\n\nexport const createDirectTestLogger = (): DirectTestLoggerHandle => {\n const store: LogEntry[] = []\n\n return {\n logger: createLoggerFromStore(store, {}),\n entries: () => List(store),\n clear: () => {\n store.length = 0\n },\n hasEntry: (level: LogLevel, messagePattern: string | RegExp) =>\n store.some(\n (e) =>\n e.level === level &&\n (typeof messagePattern === \"string\" ? e.message.includes(messagePattern) : messagePattern.test(e.message)),\n ),\n }\n}\n"],"mappings":"gCAYA,MAAM,GAAyB,EAAmB,EAA0B,IAAoC,CAC9G,IAAM,EACH,IACA,EAAiB,IAAiC,CACjD,EAAM,KAAK,CACT,QACA,UACA,SAAU,OAAO,KAAK,CAAW,EAAE,OAAS,GAAK,EAAW,CAAE,GAAG,EAAa,GAAG,CAAS,EAAI,IAAA,GAC9F,MAAO,EACP,UAAW,IAAI,IACjB,CAAC,CACH,EAEF,MAAO,CACL,MAAO,EAAW,OAAO,EACzB,MAAO,EAAW,OAAO,EACzB,KAAM,EAAW,MAAM,EACvB,KAAM,EAAW,MAAM,EACvB,MAAO,EAAW,OAAO,EACzB,MAAO,EAAW,OAAO,EACzB,UAAY,GAAe,EAAsB,EAAO,EAAa,CAAG,EACxE,YAAc,GAAqB,EAAsB,EAAO,CAAE,GAAG,EAAa,GAAG,CAAI,EAAG,CAAS,EACrG,MAAQ,GAAsB,EAAsB,EAAO,CAAE,GAAG,EAAa,GAAG,CAAI,EAAG,IAAA,EAAS,CAClG,CACF,EAEa,MAAuD,CAClE,IAAM,EAAoB,CAAC,EAE3B,MAAO,CACL,OAAQ,EAAsB,EAAO,CAAC,CAAC,EACvC,YAAe,EAAK,CAAK,EACzB,UAAa,CACX,EAAM,OAAS,CACjB,EACA,UAAW,EAAiB,IAC1B,EAAM,KACH,GACC,EAAE,QAAU,IACX,OAAO,GAAmB,SAAW,EAAE,QAAQ,SAAS,CAAc,EAAI,EAAe,KAAK,EAAE,OAAO,EAC5G,CACJ,CACF"}
1
+ {"version":3,"file":"DirectTestLogger.js","names":[],"sources":["../../src/direct/DirectTestLogger.ts"],"sourcesContent":["import { List } from \"functype\"\n\nimport type { LogEntry, LogLevel, LogMetadata } from \"../logger/Logger\"\nimport type { DirectLogger } from \"./DirectLogger\"\n\nexport type DirectTestLoggerHandle = {\n readonly logger: DirectLogger\n readonly entries: () => List<LogEntry>\n readonly clear: () => void\n readonly hasEntry: (level: LogLevel, messagePattern: string | RegExp) => boolean\n}\n\nconst createLoggerFromStore = (store: LogEntry[], baseContext: LogMetadata, baseError?: Error): DirectLogger => {\n const makeMethod =\n (level: LogLevel) =>\n (message: string, metadata?: LogMetadata): void => {\n store.push({\n level,\n message,\n metadata: Object.keys(baseContext).length > 0 || metadata ? { ...baseContext, ...metadata } : undefined,\n error: baseError,\n timestamp: new Date(),\n })\n }\n\n return {\n trace: makeMethod(\"trace\"),\n debug: makeMethod(\"debug\"),\n info: makeMethod(\"info\"),\n warn: makeMethod(\"warn\"),\n error: makeMethod(\"error\"),\n fatal: makeMethod(\"fatal\"),\n withError: (err: Error) => createLoggerFromStore(store, baseContext, err),\n withContext: (ctx: LogMetadata) => createLoggerFromStore(store, { ...baseContext, ...ctx }, baseError),\n child: (ctx?: LogMetadata) => createLoggerFromStore(store, { ...baseContext, ...ctx }, undefined),\n }\n}\n\nexport const createDirectTestLogger = (): DirectTestLoggerHandle => {\n const store: LogEntry[] = []\n\n return {\n logger: createLoggerFromStore(store, {}),\n entries: () => List(store),\n clear: () => {\n store.length = 0\n },\n hasEntry: (level: LogLevel, messagePattern: string | RegExp) =>\n store.some(\n (e) =>\n e.level === level &&\n (typeof messagePattern === \"string\" ? e.message.includes(messagePattern) : messagePattern.test(e.message)),\n ),\n }\n}\n"],"mappings":"gCAYA,MAAM,GAAyB,EAAmB,EAA0B,IAAoC,CAC9G,IAAM,EACH,IACA,EAAiB,IAAiC,CACjD,EAAM,KAAK,CACT,QACA,UACA,SAAU,OAAO,KAAK,CAAW,CAAC,CAAC,OAAS,GAAK,EAAW,CAAE,GAAG,EAAa,GAAG,CAAS,EAAI,IAAA,GAC9F,MAAO,EACP,UAAW,IAAI,IACjB,CAAC,CACH,EAEF,MAAO,CACL,MAAO,EAAW,OAAO,EACzB,MAAO,EAAW,OAAO,EACzB,KAAM,EAAW,MAAM,EACvB,KAAM,EAAW,MAAM,EACvB,MAAO,EAAW,OAAO,EACzB,MAAO,EAAW,OAAO,EACzB,UAAY,GAAe,EAAsB,EAAO,EAAa,CAAG,EACxE,YAAc,GAAqB,EAAsB,EAAO,CAAE,GAAG,EAAa,GAAG,CAAI,EAAG,CAAS,EACrG,MAAQ,GAAsB,EAAsB,EAAO,CAAE,GAAG,EAAa,GAAG,CAAI,EAAG,IAAA,EAAS,CAClG,CACF,EAEa,MAAuD,CAClE,IAAM,EAAoB,CAAC,EAE3B,MAAO,CACL,OAAQ,EAAsB,EAAO,CAAC,CAAC,EACvC,YAAe,EAAK,CAAK,EACzB,UAAa,CACX,EAAM,OAAS,CACjB,EACA,UAAW,EAAiB,IAC1B,EAAM,KACH,GACC,EAAE,QAAU,IACX,OAAO,GAAmB,SAAW,EAAE,QAAQ,SAAS,CAAc,EAAI,EAAe,KAAK,EAAE,OAAO,EAC5G,CACJ,CACF"}
@@ -1,3 +1,3 @@
1
- import { i as toDirectLogger, n as createDirectConsoleLogger, r as directSilentLogger, t as DirectLogger } from "../DirectLogger-J-MZFwsP.js";
2
- import { n as createDirectTestLogger, t as DirectTestLoggerHandle } from "../DirectTestLogger-CEA3uxf8.js";
1
+ import { i as toDirectLogger, n as createDirectConsoleLogger, r as directSilentLogger, t as DirectLogger } from "../DirectLogger-DD-W9b5Z.js";
2
+ import { n as createDirectTestLogger, t as DirectTestLoggerHandle } from "../DirectTestLogger-_mZeya1X.js";
3
3
  export { type DirectLogger, type DirectTestLoggerHandle, createDirectConsoleLogger, createDirectTestLogger, directSilentLogger, toDirectLogger };
package/dist/index.d.ts CHANGED
@@ -1,9 +1,9 @@
1
1
  import { i as Logger, n as LogLevel, r as LogMetadata, t as LogEntry } from "./Logger-CGFuJPzn.js";
2
2
  import { t as logLayerAdapter } from "./LogLayerAdapter-DzPocLr5.js";
3
- import { n as createConsoleLogger, t as ConsoleLoggerOptions } from "./ConsoleLogger-D7C4ytKU.js";
4
- import { i as toDirectLogger, n as createDirectConsoleLogger, r as directSilentLogger, t as DirectLogger } from "./DirectLogger-J-MZFwsP.js";
5
- import { n as createDirectTestLogger, t as DirectTestLoggerHandle } from "./DirectTestLogger-CEA3uxf8.js";
6
- import { t as LoggerLive } from "./LoggerLayer-Q-W1mssb.js";
3
+ import { n as createConsoleLogger, t as ConsoleLoggerOptions } from "./ConsoleLogger-DA6_SLWt.js";
4
+ import { i as toDirectLogger, n as createDirectConsoleLogger, r as directSilentLogger, t as DirectLogger } from "./DirectLogger-DD-W9b5Z.js";
5
+ import { n as createDirectTestLogger, t as DirectTestLoggerHandle } from "./DirectTestLogger-_mZeya1X.js";
6
+ import { t as LoggerLive } from "./LoggerLayer-CbTtwJZw.js";
7
7
  import { t as silentLogger } from "./SilentLogger-C1bxLMbA.js";
8
8
  import { n as createTestLogger, t as TestLoggerHandle } from "./TestLogger-Cbmt4V6J.js";
9
9
  import { n as withLogging, t as tapLog } from "./LogMiddleware-BwTD8SyL.js";
@@ -1,2 +1,2 @@
1
- import { n as createConsoleLogger, t as ConsoleLoggerOptions } from "../ConsoleLogger-D7C4ytKU.js";
1
+ import { n as createConsoleLogger, t as ConsoleLoggerOptions } from "../ConsoleLogger-DA6_SLWt.js";
2
2
  export { ConsoleLoggerOptions, createConsoleLogger };
@@ -1,2 +1,2 @@
1
- import{logLayerAdapter as e}from"../adapter/LogLayerAdapter.js";import{ConsoleTransport as t,LogLayer as n}from"loglayer";const r=r=>e(new n({transport:new t({logger:console}),...r?.prefix?{prefix:r.prefix}:{}}));export{r as createConsoleLogger};
1
+ import{logLayerAdapter as e}from"../adapter/LogLayerAdapter.js";import{ConsoleTransport as t,LogLayer as n}from"loglayer";const r={log:(...e)=>console.error(...e),info:(...e)=>console.error(...e),debug:(...e)=>console.error(...e),trace:(...e)=>console.error(...e),warn:(...e)=>console.error(...e),error:(...e)=>console.error(...e)},i=e=>e?.console?e.console:e?.stream===`stderr`?r:console,a=r=>e(new n({transport:new t({logger:i(r)}),...r?.prefix?{prefix:r.prefix}:{}}));export{a as createConsoleLogger};
2
2
  //# sourceMappingURL=ConsoleLogger.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ConsoleLogger.js","names":[],"sources":["../../src/layers/ConsoleLogger.ts"],"sourcesContent":["import { ConsoleTransport, LogLayer } from \"loglayer\"\n\nimport { logLayerAdapter } from \"../adapter/LogLayerAdapter\"\nimport type { Logger, LogLevel } from \"../logger/Logger\"\n\nexport type ConsoleLoggerOptions = {\n readonly level?: LogLevel\n readonly prefix?: string\n}\n\nexport const createConsoleLogger = (options?: ConsoleLoggerOptions): Logger => {\n const logLayer = new LogLayer({\n transport: new ConsoleTransport({ logger: console }),\n ...(options?.prefix ? { prefix: options.prefix } : {}),\n })\n\n return logLayerAdapter(logLayer)\n}\n"],"mappings":"0HAUA,MAAa,EAAuB,GAM3B,EAAgB,IALF,EAAS,CAC5B,UAAW,IAAI,EAAiB,CAAE,OAAQ,OAAQ,CAAC,EACnD,GAAI,GAAS,OAAS,CAAE,OAAQ,EAAQ,MAAO,EAAI,CAAC,CACtD,CAE8B,CAAC"}
1
+ {"version":3,"file":"ConsoleLogger.js","names":[],"sources":["../../src/layers/ConsoleLogger.ts"],"sourcesContent":["import { ConsoleTransport, LogLayer } from \"loglayer\"\n\nimport { logLayerAdapter } from \"../adapter/LogLayerAdapter\"\nimport type { Logger, LogLevel } from \"../logger/Logger\"\n\n/**\n * Console sink shape expected by `loglayer`'s `ConsoleTransport`. Matches\n * the subset of the global `Console` interface the transport actually calls.\n */\ntype ConsoleSink = Pick<Console, \"log\" | \"info\" | \"debug\" | \"trace\" | \"warn\" | \"error\">\n\n/**\n * A console sink that routes EVERY level through `console.error` (stderr).\n *\n * Opt in via `stream: \"stderr\"`. Required for consumers where stdout is a\n * reserved data/protocol channel — most notably MCP-over-stdio, which uses\n * stdout exclusively for JSON-RPC. Also useful for CLI tools that emit\n * structured output on stdout.\n */\nconst stderrConsole: ConsoleSink = {\n log: (...args: unknown[]) => console.error(...args),\n info: (...args: unknown[]) => console.error(...args),\n debug: (...args: unknown[]) => console.error(...args),\n trace: (...args: unknown[]) => console.error(...args),\n warn: (...args: unknown[]) => console.error(...args),\n error: (...args: unknown[]) => console.error(...args),\n}\n\nexport type ConsoleLoggerOptions = {\n readonly level?: LogLevel\n readonly prefix?: string\n /**\n * Which standard stream console output is routed to.\n *\n * - `\"stdout\"` (default) — uses the global `console`. `info`/`debug` land\n * on stdout; `warn`/`error`/`trace` land on stderr (loglayer's per-level\n * routing). Matches the convention of every other Node logging library\n * (pino, winston, bunyan).\n * - `\"stderr\"` — routes ALL levels through `console.error` (stderr). Use\n * when stdout is a reserved data/protocol channel — most notably\n * MCP-over-stdio servers where stdout carries JSON-RPC and any other\n * bytes corrupt the protocol.\n */\n readonly stream?: \"stdout\" | \"stderr\"\n /**\n * Fully override the console sink. Takes precedence over `stream`. Use for\n * routing to a file stream, structured collector, or other custom sink.\n *\n * Only the methods called by loglayer's `ConsoleTransport` need to be\n * present (`log`/`info`/`debug`/`trace`/`warn`/`error`).\n */\n readonly console?: Partial<Console>\n}\n\nconst resolveSink = (options?: ConsoleLoggerOptions): Partial<Console> => {\n if (options?.console) return options.console\n if (options?.stream === \"stderr\") return stderrConsole\n return console\n}\n\nexport const createConsoleLogger = (options?: ConsoleLoggerOptions): Logger => {\n const logLayer = new LogLayer({\n transport: new ConsoleTransport({ logger: resolveSink(options) as Console }),\n ...(options?.prefix ? { prefix: options.prefix } : {}),\n })\n\n return logLayerAdapter(logLayer)\n}\n"],"mappings":"0HAmBA,MAAM,EAA6B,CACjC,KAAM,GAAG,IAAoB,QAAQ,MAAM,GAAG,CAAI,EAClD,MAAO,GAAG,IAAoB,QAAQ,MAAM,GAAG,CAAI,EACnD,OAAQ,GAAG,IAAoB,QAAQ,MAAM,GAAG,CAAI,EACpD,OAAQ,GAAG,IAAoB,QAAQ,MAAM,GAAG,CAAI,EACpD,MAAO,GAAG,IAAoB,QAAQ,MAAM,GAAG,CAAI,EACnD,OAAQ,GAAG,IAAoB,QAAQ,MAAM,GAAG,CAAI,CACtD,EA4BM,EAAe,GACf,GAAS,QAAgB,EAAQ,QACjC,GAAS,SAAW,SAAiB,EAClC,QAGI,EAAuB,GAM3B,EAAgB,IALF,EAAS,CAC5B,UAAW,IAAI,EAAiB,CAAE,OAAQ,EAAY,CAAO,CAAa,CAAC,EAC3E,GAAI,GAAS,OAAS,CAAE,OAAQ,EAAQ,MAAO,EAAI,CAAC,CACtD,CAE8B,CAAC"}
@@ -1,2 +1,2 @@
1
- import { t as LoggerLive } from "../LoggerLayer-Q-W1mssb.js";
1
+ import { t as LoggerLive } from "../LoggerLayer-CbTtwJZw.js";
2
2
  export { LoggerLive };
@@ -1,4 +1,4 @@
1
- import { n as createConsoleLogger, t as ConsoleLoggerOptions } from "../ConsoleLogger-D7C4ytKU.js";
2
- import { t as LoggerLive } from "../LoggerLayer-Q-W1mssb.js";
1
+ import { n as createConsoleLogger, t as ConsoleLoggerOptions } from "../ConsoleLogger-DA6_SLWt.js";
2
+ import { t as LoggerLive } from "../LoggerLayer-CbTtwJZw.js";
3
3
  import { t as silentLogger } from "../SilentLogger-C1bxLMbA.js";
4
4
  export { type ConsoleLoggerOptions, LoggerLive, createConsoleLogger, silentLogger };
@@ -1 +1 @@
1
- {"version":3,"file":"LogMiddleware.js","names":["IOImpl","LoggerTag"],"sources":["../../src/middleware/LogMiddleware.ts"],"sourcesContent":["import type { IO } from \"functype\"\nimport { IO as IOImpl } from \"functype\"\n\nimport type { Logger, LogLevel } from \"../logger/Logger\"\nimport { Logger as LoggerTag } from \"../logger/Logger\"\n\n/** Wrap any IO with start/complete/error logging at debug level */\nexport const withLogging = <R, E, A>(name: string, effect: IO<R, E, A>): IO<R | Logger, E, A> =>\n IOImpl.gen(function* () {\n const log = yield* IOImpl.service(LoggerTag)\n yield* log.debug(`${name}: starting`)\n const result = yield* effect\n yield* log.debug(`${name}: completed`)\n return result\n }) as unknown as IO<R | Logger, E, A>\n\n/** Create a tap function that logs at the specified level */\nexport const tapLog =\n <A>(level: LogLevel, message: string | ((a: A) => string)) =>\n <R, E>(effect: IO<R, E, A>): IO<R | Logger, E, A> =>\n IOImpl.gen(function* () {\n const result = yield* effect\n const log = yield* IOImpl.service(LoggerTag)\n const msg = typeof message === \"string\" ? message : message(result)\n yield* log[level](msg)\n return result\n }) as unknown as IO<R | Logger, E, A>\n"],"mappings":"2EAOA,MAAa,GAAwB,EAAc,IACjDA,EAAO,IAAI,WAAa,CACtB,IAAM,EAAM,MAAOA,EAAO,QAAQC,CAAS,EAC3C,MAAO,EAAI,MAAM,GAAG,EAAK,WAAW,EACpC,IAAM,EAAS,MAAO,EAEtB,OADA,MAAO,EAAI,MAAM,GAAG,EAAK,YAAY,EAC9B,CACT,CAAC,EAGU,GACP,EAAiB,IACd,GACLD,EAAO,IAAI,WAAa,CACtB,IAAM,EAAS,MAAO,EAChB,EAAM,MAAOA,EAAO,QAAQC,CAAS,EACrC,EAAM,OAAO,GAAY,SAAW,EAAU,EAAQ,CAAM,EAElE,OADA,MAAO,EAAI,GAAO,CAAG,EACd,CACT,CAAC"}
1
+ {"version":3,"file":"LogMiddleware.js","names":["IOImpl","LoggerTag"],"sources":["../../src/middleware/LogMiddleware.ts"],"sourcesContent":["import type { IO } from \"functype\"\nimport { IO as IOImpl } from \"functype\"\n\nimport type { Logger, LogLevel } from \"../logger/Logger\"\nimport { Logger as LoggerTag } from \"../logger/Logger\"\n\n/** Wrap any IO with start/complete/error logging at debug level */\nexport const withLogging = <R, E, A>(name: string, effect: IO<R, E, A>): IO<R | Logger, E, A> =>\n IOImpl.gen(function* () {\n const log = yield* IOImpl.service(LoggerTag)\n yield* log.debug(`${name}: starting`)\n const result = yield* effect\n yield* log.debug(`${name}: completed`)\n return result\n }) as unknown as IO<R | Logger, E, A>\n\n/** Create a tap function that logs at the specified level */\nexport const tapLog =\n <A>(level: LogLevel, message: string | ((a: A) => string)) =>\n <R, E>(effect: IO<R, E, A>): IO<R | Logger, E, A> =>\n IOImpl.gen(function* () {\n const result = yield* effect\n const log = yield* IOImpl.service(LoggerTag)\n const msg = typeof message === \"string\" ? message : message(result)\n yield* log[level](msg)\n return result\n }) as unknown as IO<R | Logger, E, A>\n"],"mappings":"2EAOA,MAAa,GAAwB,EAAc,IACjDA,EAAO,IAAI,WAAa,CACtB,IAAM,EAAM,MAAOA,EAAO,QAAQC,CAAS,EAC3C,MAAO,EAAI,MAAM,GAAG,EAAK,WAAW,EACpC,IAAM,EAAS,MAAO,EAEtB,OADA,MAAO,EAAI,MAAM,GAAG,EAAK,YAAY,EAC9B,CACT,CAAC,EAGU,GACP,EAAiB,IACd,GACLD,EAAO,IAAI,WAAa,CACtB,IAAM,EAAS,MAAO,EAChB,EAAM,MAAOA,EAAO,QAAQC,CAAS,EACrC,EAAM,OAAO,GAAY,SAAW,EAAU,EAAQ,CAAM,EAElE,OADA,MAAO,EAAI,EAAM,CAAC,CAAG,EACd,CACT,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"TestLogger.js","names":[],"sources":["../../src/testing/TestLogger.ts"],"sourcesContent":["import { IO, List } from \"functype\"\n\nimport type { LogEntry, Logger, LogLevel, LogMetadata } from \"../logger/Logger\"\n\nexport type TestLoggerHandle = {\n readonly logger: Logger\n readonly entries: () => List<LogEntry>\n readonly clear: () => void\n readonly hasEntry: (level: LogLevel, messagePattern: string | RegExp) => boolean\n}\n\nconst createLoggerFromStore = (store: LogEntry[], baseContext: LogMetadata, baseError?: Error): Logger => {\n const makeMethod =\n (level: LogLevel) =>\n (message: string, metadata?: LogMetadata): IO<never, never, void> =>\n IO.sync(() => {\n store.push({\n level,\n message,\n metadata: Object.keys(baseContext).length > 0 || metadata ? { ...baseContext, ...metadata } : undefined,\n error: baseError,\n timestamp: new Date(),\n })\n })\n\n return {\n trace: makeMethod(\"trace\"),\n debug: makeMethod(\"debug\"),\n info: makeMethod(\"info\"),\n warn: makeMethod(\"warn\"),\n error: makeMethod(\"error\"),\n fatal: makeMethod(\"fatal\"),\n withError: (err: Error) => createLoggerFromStore(store, baseContext, err),\n withContext: (ctx: LogMetadata) => createLoggerFromStore(store, { ...baseContext, ...ctx }, baseError),\n child: (ctx?: LogMetadata) => createLoggerFromStore(store, { ...baseContext, ...ctx }, undefined),\n }\n}\n\nexport const createTestLogger = (): TestLoggerHandle => {\n const store: LogEntry[] = []\n\n return {\n logger: createLoggerFromStore(store, {}),\n entries: () => List(store),\n clear: () => {\n store.length = 0\n },\n hasEntry: (level: LogLevel, messagePattern: string | RegExp) =>\n store.some(\n (e) =>\n e.level === level &&\n (typeof messagePattern === \"string\" ? e.message.includes(messagePattern) : messagePattern.test(e.message)),\n ),\n }\n}\n"],"mappings":"wCAWA,MAAM,GAAyB,EAAmB,EAA0B,IAA8B,CACxG,IAAM,EACH,IACA,EAAiB,IAChB,EAAG,SAAW,CACZ,EAAM,KAAK,CACT,QACA,UACA,SAAU,OAAO,KAAK,CAAW,EAAE,OAAS,GAAK,EAAW,CAAE,GAAG,EAAa,GAAG,CAAS,EAAI,IAAA,GAC9F,MAAO,EACP,UAAW,IAAI,IACjB,CAAC,CACH,CAAC,EAEL,MAAO,CACL,MAAO,EAAW,OAAO,EACzB,MAAO,EAAW,OAAO,EACzB,KAAM,EAAW,MAAM,EACvB,KAAM,EAAW,MAAM,EACvB,MAAO,EAAW,OAAO,EACzB,MAAO,EAAW,OAAO,EACzB,UAAY,GAAe,EAAsB,EAAO,EAAa,CAAG,EACxE,YAAc,GAAqB,EAAsB,EAAO,CAAE,GAAG,EAAa,GAAG,CAAI,EAAG,CAAS,EACrG,MAAQ,GAAsB,EAAsB,EAAO,CAAE,GAAG,EAAa,GAAG,CAAI,EAAG,IAAA,EAAS,CAClG,CACF,EAEa,MAA2C,CACtD,IAAM,EAAoB,CAAC,EAE3B,MAAO,CACL,OAAQ,EAAsB,EAAO,CAAC,CAAC,EACvC,YAAe,EAAK,CAAK,EACzB,UAAa,CACX,EAAM,OAAS,CACjB,EACA,UAAW,EAAiB,IAC1B,EAAM,KACH,GACC,EAAE,QAAU,IACX,OAAO,GAAmB,SAAW,EAAE,QAAQ,SAAS,CAAc,EAAI,EAAe,KAAK,EAAE,OAAO,EAC5G,CACJ,CACF"}
1
+ {"version":3,"file":"TestLogger.js","names":[],"sources":["../../src/testing/TestLogger.ts"],"sourcesContent":["import { IO, List } from \"functype\"\n\nimport type { LogEntry, Logger, LogLevel, LogMetadata } from \"../logger/Logger\"\n\nexport type TestLoggerHandle = {\n readonly logger: Logger\n readonly entries: () => List<LogEntry>\n readonly clear: () => void\n readonly hasEntry: (level: LogLevel, messagePattern: string | RegExp) => boolean\n}\n\nconst createLoggerFromStore = (store: LogEntry[], baseContext: LogMetadata, baseError?: Error): Logger => {\n const makeMethod =\n (level: LogLevel) =>\n (message: string, metadata?: LogMetadata): IO<never, never, void> =>\n IO.sync(() => {\n store.push({\n level,\n message,\n metadata: Object.keys(baseContext).length > 0 || metadata ? { ...baseContext, ...metadata } : undefined,\n error: baseError,\n timestamp: new Date(),\n })\n })\n\n return {\n trace: makeMethod(\"trace\"),\n debug: makeMethod(\"debug\"),\n info: makeMethod(\"info\"),\n warn: makeMethod(\"warn\"),\n error: makeMethod(\"error\"),\n fatal: makeMethod(\"fatal\"),\n withError: (err: Error) => createLoggerFromStore(store, baseContext, err),\n withContext: (ctx: LogMetadata) => createLoggerFromStore(store, { ...baseContext, ...ctx }, baseError),\n child: (ctx?: LogMetadata) => createLoggerFromStore(store, { ...baseContext, ...ctx }, undefined),\n }\n}\n\nexport const createTestLogger = (): TestLoggerHandle => {\n const store: LogEntry[] = []\n\n return {\n logger: createLoggerFromStore(store, {}),\n entries: () => List(store),\n clear: () => {\n store.length = 0\n },\n hasEntry: (level: LogLevel, messagePattern: string | RegExp) =>\n store.some(\n (e) =>\n e.level === level &&\n (typeof messagePattern === \"string\" ? e.message.includes(messagePattern) : messagePattern.test(e.message)),\n ),\n }\n}\n"],"mappings":"wCAWA,MAAM,GAAyB,EAAmB,EAA0B,IAA8B,CACxG,IAAM,EACH,IACA,EAAiB,IAChB,EAAG,SAAW,CACZ,EAAM,KAAK,CACT,QACA,UACA,SAAU,OAAO,KAAK,CAAW,CAAC,CAAC,OAAS,GAAK,EAAW,CAAE,GAAG,EAAa,GAAG,CAAS,EAAI,IAAA,GAC9F,MAAO,EACP,UAAW,IAAI,IACjB,CAAC,CACH,CAAC,EAEL,MAAO,CACL,MAAO,EAAW,OAAO,EACzB,MAAO,EAAW,OAAO,EACzB,KAAM,EAAW,MAAM,EACvB,KAAM,EAAW,MAAM,EACvB,MAAO,EAAW,OAAO,EACzB,MAAO,EAAW,OAAO,EACzB,UAAY,GAAe,EAAsB,EAAO,EAAa,CAAG,EACxE,YAAc,GAAqB,EAAsB,EAAO,CAAE,GAAG,EAAa,GAAG,CAAI,EAAG,CAAS,EACrG,MAAQ,GAAsB,EAAsB,EAAO,CAAE,GAAG,EAAa,GAAG,CAAI,EAAG,IAAA,EAAS,CAClG,CACF,EAEa,MAA2C,CACtD,IAAM,EAAoB,CAAC,EAE3B,MAAO,CACL,OAAQ,EAAsB,EAAO,CAAC,CAAC,EACvC,YAAe,EAAK,CAAK,EACzB,UAAa,CACX,EAAM,OAAS,CACjB,EACA,UAAW,EAAiB,IAC1B,EAAM,KACH,GACC,EAAE,QAAU,IACX,OAAO,GAAmB,SAAW,EAAE,QAAQ,SAAS,CAAc,EAAI,EAAe,KAAK,EAAE,OAAO,EAC5G,CACJ,CACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "functype-log",
3
- "version": "1.2.1",
3
+ "version": "1.3.0",
4
4
  "description": "IO-native logging for functype — wraps LogLayer with Tag/Layer DI, structured logging, and test utilities",
5
5
  "keywords": [
6
6
  "functype",
@@ -30,9 +30,9 @@
30
30
  },
31
31
  "devDependencies": {
32
32
  "@types/node": "^24.12.4",
33
- "ts-builds": "^2.8.1",
33
+ "ts-builds": "^2.8.2",
34
34
  "tsdown": "^0.22.1",
35
- "functype": "^1.2.1"
35
+ "functype": "^1.3.0"
36
36
  },
37
37
  "type": "module",
38
38
  "main": "./dist/index.js",
@@ -1,11 +0,0 @@
1
- import { i as Logger, n as LogLevel } from "./Logger-CGFuJPzn.js";
2
-
3
- //#region src/layers/ConsoleLogger.d.ts
4
- type ConsoleLoggerOptions = {
5
- readonly level?: LogLevel;
6
- readonly prefix?: string;
7
- };
8
- declare const createConsoleLogger: (options?: ConsoleLoggerOptions) => Logger;
9
- //#endregion
10
- export { createConsoleLogger as n, ConsoleLoggerOptions as t };
11
- //# sourceMappingURL=ConsoleLogger-D7C4ytKU.d.ts.map