logixia 2.0.4 → 2.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (218) hide show
  1. package/README.md +172 -2614
  2. package/dist/{async-context-B05ArHgM.mjs → async-context-2mbUKhcl.mjs} +4 -6
  3. package/dist/async-context-2mbUKhcl.mjs.map +1 -0
  4. package/dist/{async-context-DTQgi8f7.js → async-context-DUFMDYAr.js} +4 -6
  5. package/dist/async-context-DUFMDYAr.js.map +1 -0
  6. package/dist/{azure-monitor.transport-CwbOLZHB.js → azure-monitor.transport-Bu4S2I2q.js} +5 -5
  7. package/dist/azure-monitor.transport-Bu4S2I2q.js.map +1 -0
  8. package/dist/{azure-monitor.transport-DV03Z5P4.d.ts → azure-monitor.transport-Bvf7Xegt.d.ts} +2 -2
  9. package/dist/{azure-monitor.transport-DV03Z5P4.d.ts.map → azure-monitor.transport-Bvf7Xegt.d.ts.map} +1 -1
  10. package/dist/{azure-monitor.transport-BPbgjATu.mjs → azure-monitor.transport-C1RWAumT.mjs} +5 -5
  11. package/dist/azure-monitor.transport-C1RWAumT.mjs.map +1 -0
  12. package/dist/{azure-monitor.transport-C7kYyZUW.d.mts → azure-monitor.transport-CbSHOnNX.d.mts} +2 -2
  13. package/dist/{azure-monitor.transport-C7kYyZUW.d.mts.map → azure-monitor.transport-CbSHOnNX.d.mts.map} +1 -1
  14. package/dist/azure.d.mts +1 -1
  15. package/dist/azure.d.ts +1 -1
  16. package/dist/azure.js +1 -1
  17. package/dist/azure.mjs +1 -1
  18. package/dist/{batch-buffer-0fgLmIPn.mjs → batch-buffer-BvXLDPlV.mjs} +3 -3
  19. package/dist/{batch-buffer-0fgLmIPn.mjs.map → batch-buffer-BvXLDPlV.mjs.map} +1 -1
  20. package/dist/{batch-buffer-DT4gdXmf.js → batch-buffer-C7Am4Mw-.js} +3 -3
  21. package/dist/{batch-buffer-DT4gdXmf.js.map → batch-buffer-C7Am4Mw-.js.map} +1 -1
  22. package/dist/browser.d.mts +5 -5
  23. package/dist/browser.d.mts.map +1 -1
  24. package/dist/browser.d.ts +5 -5
  25. package/dist/browser.d.ts.map +1 -1
  26. package/dist/browser.js +47 -12
  27. package/dist/browser.js.map +1 -1
  28. package/dist/browser.mjs +47 -12
  29. package/dist/browser.mjs.map +1 -1
  30. package/dist/{builder-D70z6kjj.mjs → builder-DhNhvOkt.mjs} +106 -153
  31. package/dist/builder-DhNhvOkt.mjs.map +1 -0
  32. package/dist/{builder-M7NoaugM.js → builder-yFvJrz7o.js} +109 -179
  33. package/dist/builder-yFvJrz7o.js.map +1 -0
  34. package/dist/cli/index.js +157 -66
  35. package/dist/cloudwatch.d.mts +1 -1
  36. package/dist/cloudwatch.d.ts +1 -1
  37. package/dist/cloudwatch.js +1 -1
  38. package/dist/cloudwatch.mjs +1 -1
  39. package/dist/{cloudwatch.transport-Bf7L4I59.d.ts → cloudwatch.transport-CQyT6U91.d.ts} +2 -2
  40. package/dist/{cloudwatch.transport-Bf7L4I59.d.ts.map → cloudwatch.transport-CQyT6U91.d.ts.map} +1 -1
  41. package/dist/{cloudwatch.transport-B2wKQFF7.js → cloudwatch.transport-Ch1Uae-0.js} +6 -6
  42. package/dist/cloudwatch.transport-Ch1Uae-0.js.map +1 -0
  43. package/dist/{cloudwatch.transport-Rj4yTpRn.d.mts → cloudwatch.transport-CjVrI6S4.d.mts} +2 -2
  44. package/dist/{cloudwatch.transport-Rj4yTpRn.d.mts.map → cloudwatch.transport-CjVrI6S4.d.mts.map} +1 -1
  45. package/dist/{cloudwatch.transport-BTvYfLs9.mjs → cloudwatch.transport-DZqF2xZO.mjs} +6 -6
  46. package/dist/cloudwatch.transport-DZqF2xZO.mjs.map +1 -0
  47. package/dist/correlation.d.mts +4 -55
  48. package/dist/correlation.d.mts.map +1 -1
  49. package/dist/correlation.d.ts +4 -55
  50. package/dist/correlation.d.ts.map +1 -1
  51. package/dist/correlation.js +13 -13
  52. package/dist/correlation.js.map +1 -1
  53. package/dist/correlation.mjs +13 -13
  54. package/dist/correlation.mjs.map +1 -1
  55. package/dist/{entry-fields-RLd1jCoR.js → entry-fields-BSLkzw18.js} +8 -3
  56. package/dist/entry-fields-BSLkzw18.js.map +1 -0
  57. package/dist/{entry-fields-CGuvT2R0.mjs → entry-fields-J1OBi24o.mjs} +8 -3
  58. package/dist/entry-fields-J1OBi24o.mjs.map +1 -0
  59. package/dist/gcp.d.mts +1 -1
  60. package/dist/gcp.d.ts +1 -1
  61. package/dist/gcp.js +1 -1
  62. package/dist/gcp.mjs +1 -1
  63. package/dist/{gcp.transport-CFQfdAOK.d.ts → gcp.transport-BCIvdFV-.d.ts} +4 -4
  64. package/dist/{gcp.transport-CFQfdAOK.d.ts.map → gcp.transport-BCIvdFV-.d.ts.map} +1 -1
  65. package/dist/{gcp.transport-C5D72b1g.d.mts → gcp.transport-D9SdLPwP.d.mts} +4 -4
  66. package/dist/{gcp.transport-C5D72b1g.d.mts.map → gcp.transport-D9SdLPwP.d.mts.map} +1 -1
  67. package/dist/{gcp.transport-CGKopAhQ.mjs → gcp.transport-DVCmnA3b.mjs} +20 -16
  68. package/dist/gcp.transport-DVCmnA3b.mjs.map +1 -0
  69. package/dist/{gcp.transport-KZe9hCAR.js → gcp.transport-Dy2Lf8FI.js} +20 -16
  70. package/dist/gcp.transport-Dy2Lf8FI.js.map +1 -0
  71. package/dist/http-shapes-BnBkJcid.d.mts +32 -0
  72. package/dist/http-shapes-BnBkJcid.d.mts.map +1 -0
  73. package/dist/http-shapes-BnBkJcid.d.ts +32 -0
  74. package/dist/http-shapes-BnBkJcid.d.ts.map +1 -0
  75. package/dist/{index-xqaJtAZn.d.mts → index-BSTtFcQ6.d.mts} +142 -8
  76. package/dist/index-BSTtFcQ6.d.mts.map +1 -0
  77. package/dist/{index-DwozbmB4.d.ts → index-CFDGkI8n.d.ts} +142 -8
  78. package/dist/index-CFDGkI8n.d.ts.map +1 -0
  79. package/dist/index.d.mts +21 -65
  80. package/dist/index.d.mts.map +1 -1
  81. package/dist/index.d.ts +21 -65
  82. package/dist/index.d.ts.map +1 -1
  83. package/dist/index.js +26 -26
  84. package/dist/index.js.map +1 -1
  85. package/dist/index.mjs +21 -21
  86. package/dist/index.mjs.map +1 -1
  87. package/dist/{internal-log-uCSd1PMc.mjs → internal-log-Bg4V1cPg.mjs} +30 -2
  88. package/dist/internal-log-Bg4V1cPg.mjs.map +1 -0
  89. package/dist/{internal-log-b0Vp4qrB.js → internal-log-By4Govmu.js} +41 -1
  90. package/dist/internal-log-By4Govmu.js.map +1 -0
  91. package/dist/{logitron-logger-D2B75Oc7.d.ts → logitron-logger-D22Yb61K.d.mts} +13 -100
  92. package/dist/logitron-logger-D22Yb61K.d.mts.map +1 -0
  93. package/dist/{logitron-logger-oEd6wNhf.d.mts → logitron-logger-D_MYYrQt.d.ts} +13 -100
  94. package/dist/logitron-logger-D_MYYrQt.d.ts.map +1 -0
  95. package/dist/middleware.d.mts +4 -17
  96. package/dist/middleware.d.mts.map +1 -1
  97. package/dist/middleware.d.ts +4 -17
  98. package/dist/middleware.d.ts.map +1 -1
  99. package/dist/middleware.js +9 -39
  100. package/dist/middleware.js.map +1 -1
  101. package/dist/middleware.mjs +7 -37
  102. package/dist/middleware.mjs.map +1 -1
  103. package/dist/nest.d.mts +14 -7
  104. package/dist/nest.d.mts.map +1 -1
  105. package/dist/nest.d.ts +14 -7
  106. package/dist/nest.d.ts.map +1 -1
  107. package/dist/nest.js +15 -10
  108. package/dist/nest.js.map +1 -1
  109. package/dist/nest.mjs +15 -10
  110. package/dist/nest.mjs.map +1 -1
  111. package/dist/{transport.manager-eZ_EeC00.mjs → otel-Dt5riXuE.mjs} +173 -24
  112. package/dist/otel-Dt5riXuE.mjs.map +1 -0
  113. package/dist/{transport.manager-DkcEOlqV.js → otel-DyeH6DVR.js} +214 -23
  114. package/dist/otel-DyeH6DVR.js.map +1 -0
  115. package/dist/own-property-BWkibepN.js +40 -0
  116. package/dist/own-property-BWkibepN.js.map +1 -0
  117. package/dist/own-property-CjFw9qwZ.mjs +29 -0
  118. package/dist/own-property-CjFw9qwZ.mjs.map +1 -0
  119. package/dist/{request-trace-C_fvIDv4.mjs → request-trace-BgNykH9M.mjs} +1 -5
  120. package/dist/{request-trace-C_fvIDv4.mjs.map → request-trace-BgNykH9M.mjs.map} +1 -1
  121. package/dist/{request-trace-wTJdKp6-.js → request-trace-ByujsUZk.js} +1 -5
  122. package/dist/{request-trace-wTJdKp6-.js.map → request-trace-ByujsUZk.js.map} +1 -1
  123. package/dist/{safe-stringify-BMRl3EX3.mjs → safe-stringify-B5p5ktFe.mjs} +37 -12
  124. package/dist/safe-stringify-B5p5ktFe.mjs.map +1 -0
  125. package/dist/{safe-stringify-DLz1Kz3o.js → safe-stringify-J3sh-7YM.js} +37 -12
  126. package/dist/safe-stringify-J3sh-7YM.js.map +1 -0
  127. package/dist/{search-DUfWuzFP.js → search-CRjhHxe9.js} +269 -25
  128. package/dist/search-CRjhHxe9.js.map +1 -0
  129. package/dist/{search-CazwyX5Z.d.ts → search-DA3ft3X5.d.mts} +5 -2
  130. package/dist/search-DA3ft3X5.d.mts.map +1 -0
  131. package/dist/{search-CWMVYC-R.mjs → search-DAXKE-P9.mjs} +269 -25
  132. package/dist/search-DAXKE-P9.mjs.map +1 -0
  133. package/dist/{search-BH33XhuU.d.mts → search-DEl3Pe47.d.ts} +5 -2
  134. package/dist/search-DEl3Pe47.d.ts.map +1 -0
  135. package/dist/search.d.mts +1 -1
  136. package/dist/search.d.ts +1 -1
  137. package/dist/search.js +1 -1
  138. package/dist/search.mjs +1 -1
  139. package/dist/{secret-config-CBZBs0p1.js → secret-config-CmK2wVkr.js} +6 -5
  140. package/dist/secret-config-CmK2wVkr.js.map +1 -0
  141. package/dist/{secret-config-BegMLkYl.mjs → secret-config-Dhb6pqTU.mjs} +6 -5
  142. package/dist/secret-config-Dhb6pqTU.mjs.map +1 -0
  143. package/dist/{slack.transport-DxHOXlLu.d.mts → slack.transport-BDyENuR0.d.mts} +2 -2
  144. package/dist/{slack.transport-DxHOXlLu.d.mts.map → slack.transport-BDyENuR0.d.mts.map} +1 -1
  145. package/dist/{slack.transport-Ce96JBDk.mjs → slack.transport-BTEwsREY.mjs} +66 -15
  146. package/dist/slack.transport-BTEwsREY.mjs.map +1 -0
  147. package/dist/{slack.transport-DrirgDNy.d.ts → slack.transport-C6E0l4kw.d.ts} +2 -2
  148. package/dist/{slack.transport-DrirgDNy.d.ts.map → slack.transport-C6E0l4kw.d.ts.map} +1 -1
  149. package/dist/{slack.transport-Dlx3xvb7.js → slack.transport-UbYvOdKx.js} +67 -16
  150. package/dist/slack.transport-UbYvOdKx.js.map +1 -0
  151. package/dist/testing.d.mts +11 -4
  152. package/dist/testing.d.mts.map +1 -1
  153. package/dist/testing.d.ts +11 -4
  154. package/dist/testing.d.ts.map +1 -1
  155. package/dist/testing.js +38 -3
  156. package/dist/testing.js.map +1 -1
  157. package/dist/testing.mjs +38 -3
  158. package/dist/testing.mjs.map +1 -1
  159. package/dist/{transport.types-BJVL1QQl.d.ts → transport.types-CzJq4IrF.d.mts} +14 -3
  160. package/dist/transport.types-CzJq4IrF.d.mts.map +1 -0
  161. package/dist/{transport.types-BJVL1QQl.d.mts → transport.types-CzJq4IrF.d.ts} +14 -3
  162. package/dist/transport.types-CzJq4IrF.d.ts.map +1 -0
  163. package/dist/transports.d.mts +25 -13
  164. package/dist/transports.d.mts.map +1 -1
  165. package/dist/transports.d.ts +25 -13
  166. package/dist/transports.d.ts.map +1 -1
  167. package/dist/transports.js +15 -15
  168. package/dist/transports.mjs +6 -6
  169. package/dist/worker-entry.js +105 -24
  170. package/dist/worker.d.mts +1 -1
  171. package/dist/worker.d.ts +1 -1
  172. package/dist/worker.js +1 -1
  173. package/dist/worker.mjs +1 -1
  174. package/dist/{worker.transport-BuPwBi3d.d.ts → worker.transport-B9mCQSM1.d.ts} +7 -2
  175. package/dist/worker.transport-B9mCQSM1.d.ts.map +1 -0
  176. package/dist/{worker.transport-hJay1wxA.d.mts → worker.transport-Bl8lFRck.d.mts} +7 -2
  177. package/dist/worker.transport-Bl8lFRck.d.mts.map +1 -0
  178. package/dist/{worker.transport-DLVA4y2e.mjs → worker.transport-BmmOKb1-.mjs} +13 -10
  179. package/dist/worker.transport-BmmOKb1-.mjs.map +1 -0
  180. package/dist/{worker.transport-C6GNl_r2.js → worker.transport-DxxbqQCG.js} +13 -10
  181. package/dist/worker.transport-DxxbqQCG.js.map +1 -0
  182. package/package.json +33 -65
  183. package/dist/async-context-B05ArHgM.mjs.map +0 -1
  184. package/dist/async-context-DTQgi8f7.js.map +0 -1
  185. package/dist/azure-monitor.transport-BPbgjATu.mjs.map +0 -1
  186. package/dist/azure-monitor.transport-CwbOLZHB.js.map +0 -1
  187. package/dist/builder-D70z6kjj.mjs.map +0 -1
  188. package/dist/builder-M7NoaugM.js.map +0 -1
  189. package/dist/cloudwatch.transport-B2wKQFF7.js.map +0 -1
  190. package/dist/cloudwatch.transport-BTvYfLs9.mjs.map +0 -1
  191. package/dist/entry-fields-CGuvT2R0.mjs.map +0 -1
  192. package/dist/entry-fields-RLd1jCoR.js.map +0 -1
  193. package/dist/gcp.transport-CGKopAhQ.mjs.map +0 -1
  194. package/dist/gcp.transport-KZe9hCAR.js.map +0 -1
  195. package/dist/index-DwozbmB4.d.ts.map +0 -1
  196. package/dist/index-xqaJtAZn.d.mts.map +0 -1
  197. package/dist/internal-log-b0Vp4qrB.js.map +0 -1
  198. package/dist/internal-log-uCSd1PMc.mjs.map +0 -1
  199. package/dist/logitron-logger-D2B75Oc7.d.ts.map +0 -1
  200. package/dist/logitron-logger-oEd6wNhf.d.mts.map +0 -1
  201. package/dist/safe-stringify-BMRl3EX3.mjs.map +0 -1
  202. package/dist/safe-stringify-DLz1Kz3o.js.map +0 -1
  203. package/dist/search-BH33XhuU.d.mts.map +0 -1
  204. package/dist/search-CWMVYC-R.mjs.map +0 -1
  205. package/dist/search-CazwyX5Z.d.ts.map +0 -1
  206. package/dist/search-DUfWuzFP.js.map +0 -1
  207. package/dist/secret-config-BegMLkYl.mjs.map +0 -1
  208. package/dist/secret-config-CBZBs0p1.js.map +0 -1
  209. package/dist/slack.transport-Ce96JBDk.mjs.map +0 -1
  210. package/dist/slack.transport-Dlx3xvb7.js.map +0 -1
  211. package/dist/transport.manager-DkcEOlqV.js.map +0 -1
  212. package/dist/transport.manager-eZ_EeC00.mjs.map +0 -1
  213. package/dist/transport.types-BJVL1QQl.d.mts.map +0 -1
  214. package/dist/transport.types-BJVL1QQl.d.ts.map +0 -1
  215. package/dist/worker.transport-BuPwBi3d.d.ts.map +0 -1
  216. package/dist/worker.transport-C6GNl_r2.js.map +0 -1
  217. package/dist/worker.transport-DLVA4y2e.mjs.map +0 -1
  218. package/dist/worker.transport-hJay1wxA.d.mts.map +0 -1
@@ -1,4 +1,4 @@
1
- import { h as LogEntry, u as IBaseLogger } from "./index-xqaJtAZn.mjs";
1
+ import { C as LogixiaLoggerInstance, g as LogEntry } from "./index-BSTtFcQ6.mjs";
2
2
  interface MockLogCall {
3
3
  level: string;
4
4
  message: string;
@@ -10,8 +10,8 @@ interface MockLogCall {
10
10
  }
11
11
  type LogMatcher = string | RegExp | ((call: MockLogCall) => boolean) | Partial<Record<'message' | 'level' | string, unknown>>;
12
12
  interface MockLoggerInstance {
13
- /** The logger itself — pass this where an IBaseLogger is expected. */
14
- readonly logger: IBaseLogger;
13
+ /** The logger itself — pass this where an IBaseLogger or ILogger is expected. */
14
+ readonly logger: LogixiaLoggerInstance;
15
15
  /** Every call recorded across all levels, in insertion order. */
16
16
  readonly calls: MockLogCall[];
17
17
  /**
@@ -40,6 +40,11 @@ interface MockLoggerInstance {
40
40
  expectNoLog(level: string, matcher?: LogMatcher): void;
41
41
  /** Clear all recorded calls. Call between tests. */
42
42
  reset(): void;
43
+ /**
44
+ * Make `logger.healthCheck()` report healthy or unhealthy, to exercise code that
45
+ * reacts to a failing logger. Shared with child loggers.
46
+ */
47
+ setHealth(healthy: boolean, details?: Record<string, unknown>): void;
43
48
  /**
44
49
  * Silence — when true, the mock suppresses all console output from the
45
50
  * logger. Default: true.
@@ -49,15 +54,17 @@ interface MockLoggerInstance {
49
54
  /**
50
55
  * Create a mock logger for use in tests.
51
56
  *
52
- * The returned object implements `IBaseLogger` and additionally exposes `.calls`,
57
+ * The returned object implements `ILogger` and additionally exposes `.calls`,
53
58
  * `.getCalls()`, `.getLastCall()`, `.expectLog()`, `.expectNoLog()`, and `.reset()`.
54
59
  *
55
60
  * @param options.silent Suppress console output (default: true)
56
61
  * @param options.context Optional context label written into every `entry.context`
62
+ * @param options.healthy Initial `healthCheck()` result (default: true); change later with `setHealth()`
57
63
  */
58
64
  export declare function createMockLogger(options?: {
59
65
  silent?: boolean;
60
66
  context?: string;
67
+ healthy?: boolean;
61
68
  }): MockLoggerInstance;
62
69
  export type { LogMatcher, MockLogCall, MockLoggerInstance };
63
70
  //# sourceMappingURL=testing.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"testing.d.mts","names":[],"sources":["../src/testing/mock-logger.ts"],"mappings":";UAoBiB;EACf;EACA;EACA,OAAO;;EAEP,OAAO,KAAK;IAA+C,OAAO;;;KAGxD,sBAER,WACE,MAAM,2BACR,QAAQ;UAEK;;WAEN,QAAQ;;WAER,OAAO;;;;;EAKhB,SAAS,iBAAiB;;EAE1B,YAAY,iBAAiB;;;;;;;;;;;;;EAa7B,UAAU,eAAe,UAAU;;;;EAInC,YAAY,eAAe,UAAU;;EAErC;;;;;EAKA;;;;;;;;;;;wBAoDc,iBACd;EAAW;EAAkB;IAC5B"}
1
+ {"version":3,"file":"testing.d.mts","names":[],"sources":["../src/testing/mock-logger.ts"],"mappings":";UAoBiB;EACf;EACA;EACA,OAAO;;EAEP,OAAO,KAAK;IAA+C,OAAO;;;KAGxD,sBAER,WACE,MAAM,2BACR,QAAQ;UAEK;;WAEN,QAAQ;;WAER,OAAO;;;;;EAKhB,SAAS,iBAAiB;;EAE1B,YAAY,iBAAiB;;;;;;;;;;;;;EAa7B,UAAU,eAAe,UAAU;;;;EAInC,YAAY,eAAe,UAAU;;EAErC;;;;;EAKA,UAAU,kBAAkB,UAAU;;;;;EAKtC;;;;;;;;;;;;wBAqDc,iBACd;EAAW;EAAkB;EAAkB;IAC9C"}
package/dist/testing.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { h as LogEntry, u as IBaseLogger } from "./index-DwozbmB4.js";
1
+ import { C as LogixiaLoggerInstance, g as LogEntry } from "./index-CFDGkI8n.js";
2
2
  interface MockLogCall {
3
3
  level: string;
4
4
  message: string;
@@ -10,8 +10,8 @@ interface MockLogCall {
10
10
  }
11
11
  type LogMatcher = string | RegExp | ((call: MockLogCall) => boolean) | Partial<Record<'message' | 'level' | string, unknown>>;
12
12
  interface MockLoggerInstance {
13
- /** The logger itself — pass this where an IBaseLogger is expected. */
14
- readonly logger: IBaseLogger;
13
+ /** The logger itself — pass this where an IBaseLogger or ILogger is expected. */
14
+ readonly logger: LogixiaLoggerInstance;
15
15
  /** Every call recorded across all levels, in insertion order. */
16
16
  readonly calls: MockLogCall[];
17
17
  /**
@@ -40,6 +40,11 @@ interface MockLoggerInstance {
40
40
  expectNoLog(level: string, matcher?: LogMatcher): void;
41
41
  /** Clear all recorded calls. Call between tests. */
42
42
  reset(): void;
43
+ /**
44
+ * Make `logger.healthCheck()` report healthy or unhealthy, to exercise code that
45
+ * reacts to a failing logger. Shared with child loggers.
46
+ */
47
+ setHealth(healthy: boolean, details?: Record<string, unknown>): void;
43
48
  /**
44
49
  * Silence — when true, the mock suppresses all console output from the
45
50
  * logger. Default: true.
@@ -49,15 +54,17 @@ interface MockLoggerInstance {
49
54
  /**
50
55
  * Create a mock logger for use in tests.
51
56
  *
52
- * The returned object implements `IBaseLogger` and additionally exposes `.calls`,
57
+ * The returned object implements `ILogger` and additionally exposes `.calls`,
53
58
  * `.getCalls()`, `.getLastCall()`, `.expectLog()`, `.expectNoLog()`, and `.reset()`.
54
59
  *
55
60
  * @param options.silent Suppress console output (default: true)
56
61
  * @param options.context Optional context label written into every `entry.context`
62
+ * @param options.healthy Initial `healthCheck()` result (default: true); change later with `setHealth()`
57
63
  */
58
64
  export declare function createMockLogger(options?: {
59
65
  silent?: boolean;
60
66
  context?: string;
67
+ healthy?: boolean;
61
68
  }): MockLoggerInstance;
62
69
  export type { LogMatcher, MockLogCall, MockLoggerInstance };
63
70
  //# sourceMappingURL=testing.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"testing.d.ts","names":[],"sources":["../src/testing/mock-logger.ts"],"mappings":";UAoBiB;EACf;EACA;EACA,OAAO;;EAEP,OAAO,KAAK;IAA+C,OAAO;;;KAGxD,sBAER,WACE,MAAM,2BACR,QAAQ;UAEK;;WAEN,QAAQ;;WAER,OAAO;;;;;EAKhB,SAAS,iBAAiB;;EAE1B,YAAY,iBAAiB;;;;;;;;;;;;;EAa7B,UAAU,eAAe,UAAU;;;;EAInC,YAAY,eAAe,UAAU;;EAErC;;;;;EAKA;;;;;;;;;;;wBAoDc,iBACd;EAAW;EAAkB;IAC5B"}
1
+ {"version":3,"file":"testing.d.ts","names":[],"sources":["../src/testing/mock-logger.ts"],"mappings":";UAoBiB;EACf;EACA;EACA,OAAO;;EAEP,OAAO,KAAK;IAA+C,OAAO;;;KAGxD,sBAER,WACE,MAAM,2BACR,QAAQ;UAEK;;WAEN,QAAQ;;WAER,OAAO;;;;;EAKhB,SAAS,iBAAiB;;EAE1B,YAAY,iBAAiB;;;;;;;;;;;;;EAa7B,UAAU,eAAe,UAAU;;;;EAInC,YAAY,eAAe,UAAU;;EAErC;;;;;EAKA,UAAU,kBAAkB,UAAU;;;;;EAKtC;;;;;;;;;;;;wBAqDc,iBACd;EAAW;EAAkB;EAAkB;IAC9C"}
package/dist/testing.js CHANGED
@@ -31,13 +31,23 @@ function formatCalls(calls) {
31
31
  /**
32
32
  * Create a mock logger for use in tests.
33
33
  *
34
- * The returned object implements `IBaseLogger` and additionally exposes `.calls`,
34
+ * The returned object implements `ILogger` and additionally exposes `.calls`,
35
35
  * `.getCalls()`, `.getLastCall()`, `.expectLog()`, `.expectNoLog()`, and `.reset()`.
36
36
  *
37
37
  * @param options.silent Suppress console output (default: true)
38
38
  * @param options.context Optional context label written into every `entry.context`
39
+ * @param options.healthy Initial `healthCheck()` result (default: true); change later with `setHealth()`
39
40
  */
40
41
  function createMockLogger(options = {}) {
42
+ return buildMockLogger(options, {
43
+ namespaceLevels: {},
44
+ health: {
45
+ healthy: options.healthy ?? true,
46
+ details: {}
47
+ }
48
+ });
49
+ }
50
+ function buildMockLogger(options, shared) {
41
51
  const { silent = true, context } = options;
42
52
  const _calls = [];
43
53
  function record(level, messageOrError, data) {
@@ -94,6 +104,18 @@ function createMockLogger(options = {}) {
94
104
  getLevel() {
95
105
  return "info";
96
106
  },
107
+ setNamespaceLevels(levels) {
108
+ shared.namespaceLevels = { ...levels };
109
+ },
110
+ patchNamespaceLevels(levels) {
111
+ shared.namespaceLevels = {
112
+ ...shared.namespaceLevels,
113
+ ...levels
114
+ };
115
+ },
116
+ getNamespaceLevels() {
117
+ return { ...shared.namespaceLevels };
118
+ },
97
119
  setContext(_ctx) {},
98
120
  getContext() {
99
121
  return context;
@@ -116,10 +138,17 @@ function createMockLogger(options = {}) {
116
138
  return [];
117
139
  },
118
140
  child(ctx, _data) {
119
- return createMockLogger({
141
+ return buildMockLogger({
120
142
  silent,
121
143
  context: ctx
122
- }).logger;
144
+ }, shared).logger;
145
+ },
146
+ async flush() {},
147
+ async healthCheck() {
148
+ return {
149
+ healthy: shared.health.healthy,
150
+ details: { ...shared.health.details }
151
+ };
123
152
  },
124
153
  async close() {},
125
154
  use(_plugin) {
@@ -160,6 +189,12 @@ function createMockLogger(options = {}) {
160
189
  reset() {
161
190
  _calls.length = 0;
162
191
  },
192
+ setHealth(healthy, details = {}) {
193
+ shared.health = {
194
+ healthy,
195
+ details
196
+ };
197
+ },
163
198
  silent
164
199
  };
165
200
  return instance;
@@ -1 +1 @@
1
- {"version":3,"file":"testing.js","names":[],"sources":["../src/testing/mock-logger.ts"],"sourcesContent":["/**\n * logixia/testing — Zero-dependency mock logger for Vitest & Jest.\n *\n * @example\n * ```ts\n * import { createMockLogger } from 'logixia/testing';\n *\n * const mock = createMockLogger();\n * await myService.doSomething(mock.logger);\n *\n * mock.expectLog('info', { message: 'order created' });\n * mock.expectLog('error', { message: /failed/ });\n * mock.reset();\n * ```\n */\n\nimport type { IBaseLogger, LogEntry } from '../types';\n\n// ── Types ────────────────────────────────────────────────────────────────────\n\nexport interface MockLogCall {\n level: string;\n message: string;\n data?: Record<string, unknown>;\n /** Full LogEntry shape for assertions that inspect the complete record. */\n entry: Pick<LogEntry, 'level' | 'message' | 'context'> & { data?: Record<string, unknown> };\n}\n\nexport type LogMatcher =\n | string\n | RegExp\n | ((call: MockLogCall) => boolean)\n | Partial<Record<'message' | 'level' | string, unknown>>;\n\nexport interface MockLoggerInstance {\n /** The logger itself — pass this where an IBaseLogger is expected. */\n readonly logger: IBaseLogger;\n /** Every call recorded across all levels, in insertion order. */\n readonly calls: MockLogCall[];\n /**\n * Get all calls for a specific level (case-insensitive). If `level` is\n * omitted, returns all calls across every level.\n */\n getCalls(level?: string): MockLogCall[];\n /** Return the most recent call, optionally filtered by level. */\n getLastCall(level?: string): MockLogCall | undefined;\n /**\n * Assert that at least one recorded call matches `matcher`.\n *\n * - string → exact message match\n * - RegExp → message test\n * - function → receives the full MockLogCall\n * - object → every key/value must match (supports RegExp values)\n *\n * Throws an Error with a descriptive message if the assertion fails (works\n * with both Vitest `expect` and Jest matchers via `.toThrow()`, or you can\n * let it propagate directly).\n */\n expectLog(level: string, matcher?: LogMatcher): void;\n /**\n * Assert that NO recorded call matches `matcher` at the given level.\n */\n expectNoLog(level: string, matcher?: LogMatcher): void;\n /** Clear all recorded calls. Call between tests. */\n reset(): void;\n /**\n * Silence — when true, the mock suppresses all console output from the\n * logger. Default: true.\n */\n silent: boolean;\n}\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction resolveCallField(call: MockLogCall, key: string): unknown {\n if (key === 'message') return call.message;\n if (key === 'level') return call.level;\n return call.data?.[key] ?? (call.entry as Record<string, unknown>)[key];\n}\n\nfunction formatMatcherDescription(matcher: LogMatcher | undefined): string {\n if (matcher === undefined) return '(any)';\n if (matcher instanceof RegExp) return matcher.toString();\n return JSON.stringify(matcher);\n}\n\nfunction matchesCall(call: MockLogCall, matcher?: LogMatcher): boolean {\n if (matcher === undefined) return true;\n if (typeof matcher === 'string') return call.message === matcher;\n if (matcher instanceof RegExp) return matcher.test(call.message);\n if (typeof matcher === 'function') return matcher(call);\n // Object shape: every key/value must match\n for (const [key, expected] of Object.entries(matcher)) {\n const actual = resolveCallField(call, key);\n if (expected instanceof RegExp) {\n if (!expected.test(String(actual ?? ''))) return false;\n } else {\n if (actual !== expected) return false;\n }\n }\n return true;\n}\n\nfunction formatCalls(calls: MockLogCall[]): string {\n if (calls.length === 0) return ' (no calls recorded)';\n return calls\n .map((c) => ` [${c.level}] \"${c.message}\" ${c.data ? JSON.stringify(c.data) : ''}`)\n .join('\\n');\n}\n\n// ── Implementation ────────────────────────────────────────────────────────────\n\n/**\n * Create a mock logger for use in tests.\n *\n * The returned object implements `IBaseLogger` and additionally exposes `.calls`,\n * `.getCalls()`, `.getLastCall()`, `.expectLog()`, `.expectNoLog()`, and `.reset()`.\n *\n * @param options.silent Suppress console output (default: true)\n * @param options.context Optional context label written into every `entry.context`\n */\nexport function createMockLogger(\n options: { silent?: boolean; context?: string } = {}\n): MockLoggerInstance {\n const { silent = true, context } = options;\n const _calls: MockLogCall[] = [];\n\n function record(\n level: string,\n messageOrError: string | Error,\n data?: Record<string, unknown>\n ): void {\n const message = messageOrError instanceof Error ? messageOrError.message : messageOrError;\n const extraData =\n messageOrError instanceof Error\n ? { ...data, error: { message: messageOrError.message, stack: messageOrError.stack } }\n : data;\n\n _calls.push({\n level,\n message,\n ...(extraData !== undefined ? { data: extraData } : {}),\n entry: {\n level,\n message,\n ...(context !== undefined ? { context } : {}),\n ...(extraData !== undefined ? { data: extraData } : {}),\n },\n });\n }\n\n const logger: IBaseLogger = {\n async error(messageOrError, data) {\n record('error', messageOrError as string | Error, data);\n },\n async warn(message, data) {\n record('warn', message, data);\n },\n async info(message, data) {\n record('info', message, data);\n },\n async debug(message, data) {\n record('debug', message, data);\n },\n async trace(message, data) {\n record('trace', message, data);\n },\n async verbose(message, data) {\n record('verbose', message, data);\n },\n async logLevel(level, message, data) {\n record(level, message, data);\n },\n\n time(_label) {\n /* no-op in tests */\n },\n async timeEnd(_label) {\n return 0;\n },\n async timeAsync(_label, fn) {\n return fn();\n },\n\n setLevel(_level) {\n /* no-op */\n },\n getLevel() {\n return 'info';\n },\n setContext(_ctx) {\n /* no-op */\n },\n getContext() {\n return context;\n },\n\n enableField(_f) {\n /* no-op */\n },\n disableField(_f) {\n /* no-op */\n },\n isFieldEnabled(_f) {\n return true;\n },\n getFieldState() {\n return {};\n },\n resetFieldState() {\n /* no-op */\n },\n\n enableTransportLevelPrompting() {\n /* no-op */\n },\n disableTransportLevelPrompting() {\n /* no-op */\n },\n setTransportLevels(_id, _levels) {\n /* no-op */\n },\n getTransportLevels(_id): string[] | undefined {\n return undefined;\n },\n clearTransportLevelPreferences() {\n /* no-op */\n },\n getAvailableTransports() {\n return [];\n },\n\n child(ctx, _data) {\n return createMockLogger({ silent, context: ctx }).logger;\n },\n async close() {\n /* no-op */\n },\n\n // Plugin API stubs — mock logger does not run plugins\n use(_plugin) {\n return this;\n },\n unuse(_pluginName) {\n return this;\n },\n };\n\n const instance: MockLoggerInstance = {\n get logger() {\n return logger;\n },\n get calls() {\n return _calls;\n },\n\n getCalls(level?: string): MockLogCall[] {\n if (!level) return [..._calls];\n const l = level.toLowerCase();\n return _calls.filter((c) => c.level.toLowerCase() === l);\n },\n\n getLastCall(level?: string): MockLogCall | undefined {\n const filtered = level\n ? _calls.filter((c) => c.level.toLowerCase() === level.toLowerCase())\n : _calls;\n return filtered[filtered.length - 1];\n },\n\n expectLog(level: string, matcher?: LogMatcher): void {\n const levelCalls = instance.getCalls(level);\n const matched = levelCalls.some((c) => matchesCall(c, matcher));\n if (!matched) {\n const matcherDesc = formatMatcherDescription(matcher);\n throw new Error(\n `Expected at least one [${level}] log matching ${matcherDesc}.\\n` +\n `Recorded calls:\\n${formatCalls(_calls)}`\n );\n }\n },\n\n expectNoLog(level: string, matcher?: LogMatcher): void {\n const levelCalls = instance.getCalls(level);\n const matched = levelCalls.some((c) => matchesCall(c, matcher));\n if (matched) {\n const matcherDesc = formatMatcherDescription(matcher);\n throw new Error(\n `Expected NO [${level}] log matching ${matcherDesc}, but one was found.\\n` +\n `Recorded calls:\\n${formatCalls(_calls)}`\n );\n }\n },\n\n reset(): void {\n _calls.length = 0;\n },\n\n silent,\n };\n\n return instance;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"testing.js","names":[],"sources":["../src/testing/mock-logger.ts"],"sourcesContent":["/**\n * logixia/testing — Zero-dependency mock logger for Vitest & Jest.\n *\n * @example\n * ```ts\n * import { createMockLogger } from 'logixia/testing';\n *\n * const mock = createMockLogger();\n * await myService.doSomething(mock.logger);\n *\n * mock.expectLog('info', { message: 'order created' });\n * mock.expectLog('error', { message: /failed/ });\n * mock.reset();\n * ```\n */\n\nimport type { LogEntry, LogixiaLoggerInstance, NamespaceLevels } from '../types';\n\n// ── Types ────────────────────────────────────────────────────────────────────\n\nexport interface MockLogCall {\n level: string;\n message: string;\n data?: Record<string, unknown>;\n /** Full LogEntry shape for assertions that inspect the complete record. */\n entry: Pick<LogEntry, 'level' | 'message' | 'context'> & { data?: Record<string, unknown> };\n}\n\nexport type LogMatcher =\n | string\n | RegExp\n | ((call: MockLogCall) => boolean)\n | Partial<Record<'message' | 'level' | string, unknown>>;\n\nexport interface MockLoggerInstance {\n /** The logger itself — pass this where an IBaseLogger or ILogger is expected. */\n readonly logger: LogixiaLoggerInstance;\n /** Every call recorded across all levels, in insertion order. */\n readonly calls: MockLogCall[];\n /**\n * Get all calls for a specific level (case-insensitive). If `level` is\n * omitted, returns all calls across every level.\n */\n getCalls(level?: string): MockLogCall[];\n /** Return the most recent call, optionally filtered by level. */\n getLastCall(level?: string): MockLogCall | undefined;\n /**\n * Assert that at least one recorded call matches `matcher`.\n *\n * - string → exact message match\n * - RegExp → message test\n * - function → receives the full MockLogCall\n * - object → every key/value must match (supports RegExp values)\n *\n * Throws an Error with a descriptive message if the assertion fails (works\n * with both Vitest `expect` and Jest matchers via `.toThrow()`, or you can\n * let it propagate directly).\n */\n expectLog(level: string, matcher?: LogMatcher): void;\n /**\n * Assert that NO recorded call matches `matcher` at the given level.\n */\n expectNoLog(level: string, matcher?: LogMatcher): void;\n /** Clear all recorded calls. Call between tests. */\n reset(): void;\n /**\n * Make `logger.healthCheck()` report healthy or unhealthy, to exercise code that\n * reacts to a failing logger. Shared with child loggers.\n */\n setHealth(healthy: boolean, details?: Record<string, unknown>): void;\n /**\n * Silence — when true, the mock suppresses all console output from the\n * logger. Default: true.\n */\n silent: boolean;\n}\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction resolveCallField(call: MockLogCall, key: string): unknown {\n if (key === 'message') return call.message;\n if (key === 'level') return call.level;\n return call.data?.[key] ?? (call.entry as Record<string, unknown>)[key];\n}\n\nfunction formatMatcherDescription(matcher: LogMatcher | undefined): string {\n if (matcher === undefined) return '(any)';\n if (matcher instanceof RegExp) return matcher.toString();\n return JSON.stringify(matcher);\n}\n\nfunction matchesCall(call: MockLogCall, matcher?: LogMatcher): boolean {\n if (matcher === undefined) return true;\n if (typeof matcher === 'string') return call.message === matcher;\n if (matcher instanceof RegExp) return matcher.test(call.message);\n if (typeof matcher === 'function') return matcher(call);\n // Object shape: every key/value must match\n for (const [key, expected] of Object.entries(matcher)) {\n const actual = resolveCallField(call, key);\n if (expected instanceof RegExp) {\n if (!expected.test(String(actual ?? ''))) return false;\n } else {\n if (actual !== expected) return false;\n }\n }\n return true;\n}\n\nfunction formatCalls(calls: MockLogCall[]): string {\n if (calls.length === 0) return ' (no calls recorded)';\n return calls\n .map((c) => ` [${c.level}] \"${c.message}\" ${c.data ? JSON.stringify(c.data) : ''}`)\n .join('\\n');\n}\n\n// ── Implementation ────────────────────────────────────────────────────────────\n\n/**\n * Create a mock logger for use in tests.\n *\n * The returned object implements `ILogger` and additionally exposes `.calls`,\n * `.getCalls()`, `.getLastCall()`, `.expectLog()`, `.expectNoLog()`, and `.reset()`.\n *\n * @param options.silent Suppress console output (default: true)\n * @param options.context Optional context label written into every `entry.context`\n * @param options.healthy Initial `healthCheck()` result (default: true); change later with `setHealth()`\n */\nexport function createMockLogger(\n options: { silent?: boolean; context?: string; healthy?: boolean } = {}\n): MockLoggerInstance {\n return buildMockLogger(options, {\n namespaceLevels: {},\n health: { healthy: options.healthy ?? true, details: {} },\n });\n}\n\n/** State a mock logger shares with its children, like the real logger. */\ninterface SharedMockState {\n namespaceLevels: NamespaceLevels;\n health: { healthy: boolean; details: Record<string, unknown> };\n}\n\nfunction buildMockLogger(\n options: { silent?: boolean; context?: string },\n shared: SharedMockState\n): MockLoggerInstance {\n const { silent = true, context } = options;\n const _calls: MockLogCall[] = [];\n\n function record(\n level: string,\n messageOrError: string | Error,\n data?: Record<string, unknown>\n ): void {\n const message = messageOrError instanceof Error ? messageOrError.message : messageOrError;\n const extraData =\n messageOrError instanceof Error\n ? { ...data, error: { message: messageOrError.message, stack: messageOrError.stack } }\n : data;\n\n _calls.push({\n level,\n message,\n ...(extraData !== undefined ? { data: extraData } : {}),\n entry: {\n level,\n message,\n ...(context !== undefined ? { context } : {}),\n ...(extraData !== undefined ? { data: extraData } : {}),\n },\n });\n }\n\n const logger: LogixiaLoggerInstance = {\n async error(messageOrError, data) {\n record('error', messageOrError as string | Error, data);\n },\n async warn(message, data) {\n record('warn', message, data);\n },\n async info(message, data) {\n record('info', message, data);\n },\n async debug(message, data) {\n record('debug', message, data);\n },\n async trace(message, data) {\n record('trace', message, data);\n },\n async verbose(message, data) {\n record('verbose', message, data);\n },\n async logLevel(level, message, data) {\n record(level, message, data);\n },\n\n time(_label) {\n /* no-op in tests */\n },\n async timeEnd(_label) {\n return 0;\n },\n async timeAsync(_label, fn) {\n return fn();\n },\n\n setLevel(_level) {\n /* no-op */\n },\n getLevel() {\n return 'info';\n },\n setNamespaceLevels(levels) {\n shared.namespaceLevels = { ...levels };\n },\n patchNamespaceLevels(levels) {\n shared.namespaceLevels = { ...shared.namespaceLevels, ...levels };\n },\n getNamespaceLevels() {\n return { ...shared.namespaceLevels };\n },\n setContext(_ctx) {\n /* no-op */\n },\n getContext() {\n return context;\n },\n\n enableField(_f) {\n /* no-op */\n },\n disableField(_f) {\n /* no-op */\n },\n isFieldEnabled(_f) {\n return true;\n },\n getFieldState() {\n return {};\n },\n resetFieldState() {\n /* no-op */\n },\n\n enableTransportLevelPrompting() {\n /* no-op */\n },\n disableTransportLevelPrompting() {\n /* no-op */\n },\n setTransportLevels(_id, _levels) {\n /* no-op */\n },\n getTransportLevels(_id): string[] | undefined {\n return undefined;\n },\n clearTransportLevelPreferences() {\n /* no-op */\n },\n getAvailableTransports() {\n return [];\n },\n\n child(ctx, _data) {\n return buildMockLogger({ silent, context: ctx }, shared).logger;\n },\n async flush() {\n /* no-op */\n },\n async healthCheck() {\n return { healthy: shared.health.healthy, details: { ...shared.health.details } };\n },\n async close() {\n /* no-op */\n },\n\n // Plugin API stubs — mock logger does not run plugins\n use(_plugin) {\n return this;\n },\n unuse(_pluginName) {\n return this;\n },\n };\n\n const instance: MockLoggerInstance = {\n get logger() {\n return logger;\n },\n get calls() {\n return _calls;\n },\n\n getCalls(level?: string): MockLogCall[] {\n if (!level) return [..._calls];\n const l = level.toLowerCase();\n return _calls.filter((c) => c.level.toLowerCase() === l);\n },\n\n getLastCall(level?: string): MockLogCall | undefined {\n const filtered = level\n ? _calls.filter((c) => c.level.toLowerCase() === level.toLowerCase())\n : _calls;\n return filtered[filtered.length - 1];\n },\n\n expectLog(level: string, matcher?: LogMatcher): void {\n const levelCalls = instance.getCalls(level);\n const matched = levelCalls.some((c) => matchesCall(c, matcher));\n if (!matched) {\n const matcherDesc = formatMatcherDescription(matcher);\n throw new Error(\n `Expected at least one [${level}] log matching ${matcherDesc}.\\n` +\n `Recorded calls:\\n${formatCalls(_calls)}`\n );\n }\n },\n\n expectNoLog(level: string, matcher?: LogMatcher): void {\n const levelCalls = instance.getCalls(level);\n const matched = levelCalls.some((c) => matchesCall(c, matcher));\n if (matched) {\n const matcherDesc = formatMatcherDescription(matcher);\n throw new Error(\n `Expected NO [${level}] log matching ${matcherDesc}, but one was found.\\n` +\n `Recorded calls:\\n${formatCalls(_calls)}`\n );\n }\n },\n\n reset(): void {\n _calls.length = 0;\n },\n\n setHealth(healthy: boolean, details: Record<string, unknown> = {}): void {\n shared.health = { healthy, details };\n },\n\n silent,\n };\n\n return instance;\n}\n"],"mappings":"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"}
package/dist/testing.mjs CHANGED
@@ -30,13 +30,23 @@ function formatCalls(calls) {
30
30
  /**
31
31
  * Create a mock logger for use in tests.
32
32
  *
33
- * The returned object implements `IBaseLogger` and additionally exposes `.calls`,
33
+ * The returned object implements `ILogger` and additionally exposes `.calls`,
34
34
  * `.getCalls()`, `.getLastCall()`, `.expectLog()`, `.expectNoLog()`, and `.reset()`.
35
35
  *
36
36
  * @param options.silent Suppress console output (default: true)
37
37
  * @param options.context Optional context label written into every `entry.context`
38
+ * @param options.healthy Initial `healthCheck()` result (default: true); change later with `setHealth()`
38
39
  */
39
40
  function createMockLogger(options = {}) {
41
+ return buildMockLogger(options, {
42
+ namespaceLevels: {},
43
+ health: {
44
+ healthy: options.healthy ?? true,
45
+ details: {}
46
+ }
47
+ });
48
+ }
49
+ function buildMockLogger(options, shared) {
40
50
  const { silent = true, context } = options;
41
51
  const _calls = [];
42
52
  function record(level, messageOrError, data) {
@@ -93,6 +103,18 @@ function createMockLogger(options = {}) {
93
103
  getLevel() {
94
104
  return "info";
95
105
  },
106
+ setNamespaceLevels(levels) {
107
+ shared.namespaceLevels = { ...levels };
108
+ },
109
+ patchNamespaceLevels(levels) {
110
+ shared.namespaceLevels = {
111
+ ...shared.namespaceLevels,
112
+ ...levels
113
+ };
114
+ },
115
+ getNamespaceLevels() {
116
+ return { ...shared.namespaceLevels };
117
+ },
96
118
  setContext(_ctx) {},
97
119
  getContext() {
98
120
  return context;
@@ -115,10 +137,17 @@ function createMockLogger(options = {}) {
115
137
  return [];
116
138
  },
117
139
  child(ctx, _data) {
118
- return createMockLogger({
140
+ return buildMockLogger({
119
141
  silent,
120
142
  context: ctx
121
- }).logger;
143
+ }, shared).logger;
144
+ },
145
+ async flush() {},
146
+ async healthCheck() {
147
+ return {
148
+ healthy: shared.health.healthy,
149
+ details: { ...shared.health.details }
150
+ };
122
151
  },
123
152
  async close() {},
124
153
  use(_plugin) {
@@ -159,6 +188,12 @@ function createMockLogger(options = {}) {
159
188
  reset() {
160
189
  _calls.length = 0;
161
190
  },
191
+ setHealth(healthy, details = {}) {
192
+ shared.health = {
193
+ healthy,
194
+ details
195
+ };
196
+ },
162
197
  silent
163
198
  };
164
199
  return instance;
@@ -1 +1 @@
1
- {"version":3,"file":"testing.mjs","names":[],"sources":["../src/testing/mock-logger.ts"],"sourcesContent":["/**\n * logixia/testing — Zero-dependency mock logger for Vitest & Jest.\n *\n * @example\n * ```ts\n * import { createMockLogger } from 'logixia/testing';\n *\n * const mock = createMockLogger();\n * await myService.doSomething(mock.logger);\n *\n * mock.expectLog('info', { message: 'order created' });\n * mock.expectLog('error', { message: /failed/ });\n * mock.reset();\n * ```\n */\n\nimport type { IBaseLogger, LogEntry } from '../types';\n\n// ── Types ────────────────────────────────────────────────────────────────────\n\nexport interface MockLogCall {\n level: string;\n message: string;\n data?: Record<string, unknown>;\n /** Full LogEntry shape for assertions that inspect the complete record. */\n entry: Pick<LogEntry, 'level' | 'message' | 'context'> & { data?: Record<string, unknown> };\n}\n\nexport type LogMatcher =\n | string\n | RegExp\n | ((call: MockLogCall) => boolean)\n | Partial<Record<'message' | 'level' | string, unknown>>;\n\nexport interface MockLoggerInstance {\n /** The logger itself — pass this where an IBaseLogger is expected. */\n readonly logger: IBaseLogger;\n /** Every call recorded across all levels, in insertion order. */\n readonly calls: MockLogCall[];\n /**\n * Get all calls for a specific level (case-insensitive). If `level` is\n * omitted, returns all calls across every level.\n */\n getCalls(level?: string): MockLogCall[];\n /** Return the most recent call, optionally filtered by level. */\n getLastCall(level?: string): MockLogCall | undefined;\n /**\n * Assert that at least one recorded call matches `matcher`.\n *\n * - string → exact message match\n * - RegExp → message test\n * - function → receives the full MockLogCall\n * - object → every key/value must match (supports RegExp values)\n *\n * Throws an Error with a descriptive message if the assertion fails (works\n * with both Vitest `expect` and Jest matchers via `.toThrow()`, or you can\n * let it propagate directly).\n */\n expectLog(level: string, matcher?: LogMatcher): void;\n /**\n * Assert that NO recorded call matches `matcher` at the given level.\n */\n expectNoLog(level: string, matcher?: LogMatcher): void;\n /** Clear all recorded calls. Call between tests. */\n reset(): void;\n /**\n * Silence — when true, the mock suppresses all console output from the\n * logger. Default: true.\n */\n silent: boolean;\n}\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction resolveCallField(call: MockLogCall, key: string): unknown {\n if (key === 'message') return call.message;\n if (key === 'level') return call.level;\n return call.data?.[key] ?? (call.entry as Record<string, unknown>)[key];\n}\n\nfunction formatMatcherDescription(matcher: LogMatcher | undefined): string {\n if (matcher === undefined) return '(any)';\n if (matcher instanceof RegExp) return matcher.toString();\n return JSON.stringify(matcher);\n}\n\nfunction matchesCall(call: MockLogCall, matcher?: LogMatcher): boolean {\n if (matcher === undefined) return true;\n if (typeof matcher === 'string') return call.message === matcher;\n if (matcher instanceof RegExp) return matcher.test(call.message);\n if (typeof matcher === 'function') return matcher(call);\n // Object shape: every key/value must match\n for (const [key, expected] of Object.entries(matcher)) {\n const actual = resolveCallField(call, key);\n if (expected instanceof RegExp) {\n if (!expected.test(String(actual ?? ''))) return false;\n } else {\n if (actual !== expected) return false;\n }\n }\n return true;\n}\n\nfunction formatCalls(calls: MockLogCall[]): string {\n if (calls.length === 0) return ' (no calls recorded)';\n return calls\n .map((c) => ` [${c.level}] \"${c.message}\" ${c.data ? JSON.stringify(c.data) : ''}`)\n .join('\\n');\n}\n\n// ── Implementation ────────────────────────────────────────────────────────────\n\n/**\n * Create a mock logger for use in tests.\n *\n * The returned object implements `IBaseLogger` and additionally exposes `.calls`,\n * `.getCalls()`, `.getLastCall()`, `.expectLog()`, `.expectNoLog()`, and `.reset()`.\n *\n * @param options.silent Suppress console output (default: true)\n * @param options.context Optional context label written into every `entry.context`\n */\nexport function createMockLogger(\n options: { silent?: boolean; context?: string } = {}\n): MockLoggerInstance {\n const { silent = true, context } = options;\n const _calls: MockLogCall[] = [];\n\n function record(\n level: string,\n messageOrError: string | Error,\n data?: Record<string, unknown>\n ): void {\n const message = messageOrError instanceof Error ? messageOrError.message : messageOrError;\n const extraData =\n messageOrError instanceof Error\n ? { ...data, error: { message: messageOrError.message, stack: messageOrError.stack } }\n : data;\n\n _calls.push({\n level,\n message,\n ...(extraData !== undefined ? { data: extraData } : {}),\n entry: {\n level,\n message,\n ...(context !== undefined ? { context } : {}),\n ...(extraData !== undefined ? { data: extraData } : {}),\n },\n });\n }\n\n const logger: IBaseLogger = {\n async error(messageOrError, data) {\n record('error', messageOrError as string | Error, data);\n },\n async warn(message, data) {\n record('warn', message, data);\n },\n async info(message, data) {\n record('info', message, data);\n },\n async debug(message, data) {\n record('debug', message, data);\n },\n async trace(message, data) {\n record('trace', message, data);\n },\n async verbose(message, data) {\n record('verbose', message, data);\n },\n async logLevel(level, message, data) {\n record(level, message, data);\n },\n\n time(_label) {\n /* no-op in tests */\n },\n async timeEnd(_label) {\n return 0;\n },\n async timeAsync(_label, fn) {\n return fn();\n },\n\n setLevel(_level) {\n /* no-op */\n },\n getLevel() {\n return 'info';\n },\n setContext(_ctx) {\n /* no-op */\n },\n getContext() {\n return context;\n },\n\n enableField(_f) {\n /* no-op */\n },\n disableField(_f) {\n /* no-op */\n },\n isFieldEnabled(_f) {\n return true;\n },\n getFieldState() {\n return {};\n },\n resetFieldState() {\n /* no-op */\n },\n\n enableTransportLevelPrompting() {\n /* no-op */\n },\n disableTransportLevelPrompting() {\n /* no-op */\n },\n setTransportLevels(_id, _levels) {\n /* no-op */\n },\n getTransportLevels(_id): string[] | undefined {\n return undefined;\n },\n clearTransportLevelPreferences() {\n /* no-op */\n },\n getAvailableTransports() {\n return [];\n },\n\n child(ctx, _data) {\n return createMockLogger({ silent, context: ctx }).logger;\n },\n async close() {\n /* no-op */\n },\n\n // Plugin API stubs — mock logger does not run plugins\n use(_plugin) {\n return this;\n },\n unuse(_pluginName) {\n return this;\n },\n };\n\n const instance: MockLoggerInstance = {\n get logger() {\n return logger;\n },\n get calls() {\n return _calls;\n },\n\n getCalls(level?: string): MockLogCall[] {\n if (!level) return [..._calls];\n const l = level.toLowerCase();\n return _calls.filter((c) => c.level.toLowerCase() === l);\n },\n\n getLastCall(level?: string): MockLogCall | undefined {\n const filtered = level\n ? _calls.filter((c) => c.level.toLowerCase() === level.toLowerCase())\n : _calls;\n return filtered[filtered.length - 1];\n },\n\n expectLog(level: string, matcher?: LogMatcher): void {\n const levelCalls = instance.getCalls(level);\n const matched = levelCalls.some((c) => matchesCall(c, matcher));\n if (!matched) {\n const matcherDesc = formatMatcherDescription(matcher);\n throw new Error(\n `Expected at least one [${level}] log matching ${matcherDesc}.\\n` +\n `Recorded calls:\\n${formatCalls(_calls)}`\n );\n }\n },\n\n expectNoLog(level: string, matcher?: LogMatcher): void {\n const levelCalls = instance.getCalls(level);\n const matched = levelCalls.some((c) => matchesCall(c, matcher));\n if (matched) {\n const matcherDesc = formatMatcherDescription(matcher);\n throw new Error(\n `Expected NO [${level}] log matching ${matcherDesc}, but one was found.\\n` +\n `Recorded calls:\\n${formatCalls(_calls)}`\n );\n }\n },\n\n reset(): void {\n _calls.length = 0;\n },\n\n silent,\n };\n\n return instance;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"testing.mjs","names":[],"sources":["../src/testing/mock-logger.ts"],"sourcesContent":["/**\n * logixia/testing — Zero-dependency mock logger for Vitest & Jest.\n *\n * @example\n * ```ts\n * import { createMockLogger } from 'logixia/testing';\n *\n * const mock = createMockLogger();\n * await myService.doSomething(mock.logger);\n *\n * mock.expectLog('info', { message: 'order created' });\n * mock.expectLog('error', { message: /failed/ });\n * mock.reset();\n * ```\n */\n\nimport type { LogEntry, LogixiaLoggerInstance, NamespaceLevels } from '../types';\n\n// ── Types ────────────────────────────────────────────────────────────────────\n\nexport interface MockLogCall {\n level: string;\n message: string;\n data?: Record<string, unknown>;\n /** Full LogEntry shape for assertions that inspect the complete record. */\n entry: Pick<LogEntry, 'level' | 'message' | 'context'> & { data?: Record<string, unknown> };\n}\n\nexport type LogMatcher =\n | string\n | RegExp\n | ((call: MockLogCall) => boolean)\n | Partial<Record<'message' | 'level' | string, unknown>>;\n\nexport interface MockLoggerInstance {\n /** The logger itself — pass this where an IBaseLogger or ILogger is expected. */\n readonly logger: LogixiaLoggerInstance;\n /** Every call recorded across all levels, in insertion order. */\n readonly calls: MockLogCall[];\n /**\n * Get all calls for a specific level (case-insensitive). If `level` is\n * omitted, returns all calls across every level.\n */\n getCalls(level?: string): MockLogCall[];\n /** Return the most recent call, optionally filtered by level. */\n getLastCall(level?: string): MockLogCall | undefined;\n /**\n * Assert that at least one recorded call matches `matcher`.\n *\n * - string → exact message match\n * - RegExp → message test\n * - function → receives the full MockLogCall\n * - object → every key/value must match (supports RegExp values)\n *\n * Throws an Error with a descriptive message if the assertion fails (works\n * with both Vitest `expect` and Jest matchers via `.toThrow()`, or you can\n * let it propagate directly).\n */\n expectLog(level: string, matcher?: LogMatcher): void;\n /**\n * Assert that NO recorded call matches `matcher` at the given level.\n */\n expectNoLog(level: string, matcher?: LogMatcher): void;\n /** Clear all recorded calls. Call between tests. */\n reset(): void;\n /**\n * Make `logger.healthCheck()` report healthy or unhealthy, to exercise code that\n * reacts to a failing logger. Shared with child loggers.\n */\n setHealth(healthy: boolean, details?: Record<string, unknown>): void;\n /**\n * Silence — when true, the mock suppresses all console output from the\n * logger. Default: true.\n */\n silent: boolean;\n}\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction resolveCallField(call: MockLogCall, key: string): unknown {\n if (key === 'message') return call.message;\n if (key === 'level') return call.level;\n return call.data?.[key] ?? (call.entry as Record<string, unknown>)[key];\n}\n\nfunction formatMatcherDescription(matcher: LogMatcher | undefined): string {\n if (matcher === undefined) return '(any)';\n if (matcher instanceof RegExp) return matcher.toString();\n return JSON.stringify(matcher);\n}\n\nfunction matchesCall(call: MockLogCall, matcher?: LogMatcher): boolean {\n if (matcher === undefined) return true;\n if (typeof matcher === 'string') return call.message === matcher;\n if (matcher instanceof RegExp) return matcher.test(call.message);\n if (typeof matcher === 'function') return matcher(call);\n // Object shape: every key/value must match\n for (const [key, expected] of Object.entries(matcher)) {\n const actual = resolveCallField(call, key);\n if (expected instanceof RegExp) {\n if (!expected.test(String(actual ?? ''))) return false;\n } else {\n if (actual !== expected) return false;\n }\n }\n return true;\n}\n\nfunction formatCalls(calls: MockLogCall[]): string {\n if (calls.length === 0) return ' (no calls recorded)';\n return calls\n .map((c) => ` [${c.level}] \"${c.message}\" ${c.data ? JSON.stringify(c.data) : ''}`)\n .join('\\n');\n}\n\n// ── Implementation ────────────────────────────────────────────────────────────\n\n/**\n * Create a mock logger for use in tests.\n *\n * The returned object implements `ILogger` and additionally exposes `.calls`,\n * `.getCalls()`, `.getLastCall()`, `.expectLog()`, `.expectNoLog()`, and `.reset()`.\n *\n * @param options.silent Suppress console output (default: true)\n * @param options.context Optional context label written into every `entry.context`\n * @param options.healthy Initial `healthCheck()` result (default: true); change later with `setHealth()`\n */\nexport function createMockLogger(\n options: { silent?: boolean; context?: string; healthy?: boolean } = {}\n): MockLoggerInstance {\n return buildMockLogger(options, {\n namespaceLevels: {},\n health: { healthy: options.healthy ?? true, details: {} },\n });\n}\n\n/** State a mock logger shares with its children, like the real logger. */\ninterface SharedMockState {\n namespaceLevels: NamespaceLevels;\n health: { healthy: boolean; details: Record<string, unknown> };\n}\n\nfunction buildMockLogger(\n options: { silent?: boolean; context?: string },\n shared: SharedMockState\n): MockLoggerInstance {\n const { silent = true, context } = options;\n const _calls: MockLogCall[] = [];\n\n function record(\n level: string,\n messageOrError: string | Error,\n data?: Record<string, unknown>\n ): void {\n const message = messageOrError instanceof Error ? messageOrError.message : messageOrError;\n const extraData =\n messageOrError instanceof Error\n ? { ...data, error: { message: messageOrError.message, stack: messageOrError.stack } }\n : data;\n\n _calls.push({\n level,\n message,\n ...(extraData !== undefined ? { data: extraData } : {}),\n entry: {\n level,\n message,\n ...(context !== undefined ? { context } : {}),\n ...(extraData !== undefined ? { data: extraData } : {}),\n },\n });\n }\n\n const logger: LogixiaLoggerInstance = {\n async error(messageOrError, data) {\n record('error', messageOrError as string | Error, data);\n },\n async warn(message, data) {\n record('warn', message, data);\n },\n async info(message, data) {\n record('info', message, data);\n },\n async debug(message, data) {\n record('debug', message, data);\n },\n async trace(message, data) {\n record('trace', message, data);\n },\n async verbose(message, data) {\n record('verbose', message, data);\n },\n async logLevel(level, message, data) {\n record(level, message, data);\n },\n\n time(_label) {\n /* no-op in tests */\n },\n async timeEnd(_label) {\n return 0;\n },\n async timeAsync(_label, fn) {\n return fn();\n },\n\n setLevel(_level) {\n /* no-op */\n },\n getLevel() {\n return 'info';\n },\n setNamespaceLevels(levels) {\n shared.namespaceLevels = { ...levels };\n },\n patchNamespaceLevels(levels) {\n shared.namespaceLevels = { ...shared.namespaceLevels, ...levels };\n },\n getNamespaceLevels() {\n return { ...shared.namespaceLevels };\n },\n setContext(_ctx) {\n /* no-op */\n },\n getContext() {\n return context;\n },\n\n enableField(_f) {\n /* no-op */\n },\n disableField(_f) {\n /* no-op */\n },\n isFieldEnabled(_f) {\n return true;\n },\n getFieldState() {\n return {};\n },\n resetFieldState() {\n /* no-op */\n },\n\n enableTransportLevelPrompting() {\n /* no-op */\n },\n disableTransportLevelPrompting() {\n /* no-op */\n },\n setTransportLevels(_id, _levels) {\n /* no-op */\n },\n getTransportLevels(_id): string[] | undefined {\n return undefined;\n },\n clearTransportLevelPreferences() {\n /* no-op */\n },\n getAvailableTransports() {\n return [];\n },\n\n child(ctx, _data) {\n return buildMockLogger({ silent, context: ctx }, shared).logger;\n },\n async flush() {\n /* no-op */\n },\n async healthCheck() {\n return { healthy: shared.health.healthy, details: { ...shared.health.details } };\n },\n async close() {\n /* no-op */\n },\n\n // Plugin API stubs — mock logger does not run plugins\n use(_plugin) {\n return this;\n },\n unuse(_pluginName) {\n return this;\n },\n };\n\n const instance: MockLoggerInstance = {\n get logger() {\n return logger;\n },\n get calls() {\n return _calls;\n },\n\n getCalls(level?: string): MockLogCall[] {\n if (!level) return [..._calls];\n const l = level.toLowerCase();\n return _calls.filter((c) => c.level.toLowerCase() === l);\n },\n\n getLastCall(level?: string): MockLogCall | undefined {\n const filtered = level\n ? _calls.filter((c) => c.level.toLowerCase() === level.toLowerCase())\n : _calls;\n return filtered[filtered.length - 1];\n },\n\n expectLog(level: string, matcher?: LogMatcher): void {\n const levelCalls = instance.getCalls(level);\n const matched = levelCalls.some((c) => matchesCall(c, matcher));\n if (!matched) {\n const matcherDesc = formatMatcherDescription(matcher);\n throw new Error(\n `Expected at least one [${level}] log matching ${matcherDesc}.\\n` +\n `Recorded calls:\\n${formatCalls(_calls)}`\n );\n }\n },\n\n expectNoLog(level: string, matcher?: LogMatcher): void {\n const levelCalls = instance.getCalls(level);\n const matched = levelCalls.some((c) => matchesCall(c, matcher));\n if (matched) {\n const matcherDesc = formatMatcherDescription(matcher);\n throw new Error(\n `Expected NO [${level}] log matching ${matcherDesc}, but one was found.\\n` +\n `Recorded calls:\\n${formatCalls(_calls)}`\n );\n }\n },\n\n reset(): void {\n _calls.length = 0;\n },\n\n setHealth(healthy: boolean, details: Record<string, unknown> = {}): void {\n shared.health = { healthy, details };\n },\n\n silent,\n };\n\n return instance;\n}\n"],"mappings":"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"}
@@ -105,7 +105,11 @@ interface ConsoleTransportConfig {
105
105
  }
106
106
  interface AnalyticsTransportConfig {
107
107
  level?: string;
108
- apiKey: string;
108
+ /**
109
+ * @deprecated Not used by Mixpanel, Segment or Google Analytics (they use `token`,
110
+ * `writeKey` and `measurementId`/`apiSecret`). Only DataDog reads an API key.
111
+ */
112
+ apiKey?: string;
109
113
  projectId?: string;
110
114
  endpoint?: string;
111
115
  batchSize?: number;
@@ -127,6 +131,7 @@ interface MixpanelTransportConfig extends AnalyticsTransportConfig {
127
131
  superProperties?: Record<string, unknown>;
128
132
  }
129
133
  interface DataDogTransportConfig extends AnalyticsTransportConfig {
134
+ /** Datadog API key (sent as `DD-API-KEY`). Required. */
130
135
  apiKey: string;
131
136
  site?: 'datadoghq.com' | 'datadoghq.eu' | 'us3.datadoghq.com' | 'us5.datadoghq.com' | 'ap1.datadoghq.com' | 'ddog-gov.com';
132
137
  /** Gzip log request bodies (`Content-Encoding: gzip`). Default false. */
@@ -186,6 +191,12 @@ interface IAsyncTransport extends ITransport {
186
191
  flush(): Promise<void>;
187
192
  isReady?(): Promise<boolean>;
188
193
  }
194
+ interface TransportEvents {
195
+ log: (entry: TransportLogEntry) => void;
196
+ error: (error: Error, transport: string) => void;
197
+ rotate: (oldFile: string, newFile: string) => void;
198
+ flush: (transport: string, count: number) => void;
199
+ }
189
200
  interface IBatchTransport extends ITransport {
190
201
  readonly batchSize?: number;
191
202
  readonly flushInterval?: number;
@@ -201,5 +212,5 @@ interface TransportMetrics {
201
212
  lastWrite: Date;
202
213
  averageWriteTime: number;
203
214
  }
204
- export { FileTransportConfig as a, IBatchTransport as c, SegmentTransportConfig as d, TransportConfig as f, DatabaseTransportConfig as i, ITransport as l, TransportMetrics as m, ConsoleTransportConfig as n, GoogleAnalyticsTransportConfig as o, TransportLogEntry as p, DataDogTransportConfig as r, IAsyncTransport as s, AnalyticsTransportConfig as t, MixpanelTransportConfig as u };
205
- //# sourceMappingURL=transport.types-BJVL1QQl.d.ts.map
215
+ export { TransportLogEntry as _, DatabaseTransportConfig as a, TransportType as b, GoogleAnalyticsTransportConfig as c, ITransport as d, MixpanelTransportConfig as f, TransportEvents as g, TransportConfig as h, DataDogTransportConfig as i, IAsyncTransport as l, SegmentTransportConfig as m, AnalyticsTransportConfig as n, FileStats as o, RotationConfig as p, ConsoleTransportConfig as r, FileTransportConfig as s, AnalyticsConfig as t, IBatchTransport as u, TransportMetrics as v, TransportRetryConfig as y };
216
+ //# sourceMappingURL=transport.types-CzJq4IrF.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.types-CzJq4IrF.d.mts","names":[],"sources":["../src/types/transport.types.ts"],"mappings":";;;UAKiB;EACf;EACA;EACA;EACA;EACA,WAAW;EACX,eAAe,OAAO,OAAO,OAAO;;UAGrB;EACf;EACA;;;;;EAKA,UAAU,OAAO;;;;;EAKjB,MAAM,OAAO,2BAA2B;EACxC,UAAU;EACV,QAAQ;;UAGO;EACf,WAAW;EACX;EACA;EACA,OAAO;EACP;EACA;EACA;EACA;;UAGe;EACf;EACA;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;EACA;EACA;EACA;EACA;EACA,WAAW;;;;;;EAMX;;;;;;EAMA;EACA,UAAU,OAAO;;UAGF;EACf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,UAAU,OAAO;;;;;EAKjB;;UAGe;EACf;EACA;EACA;EACA;;;;;;EAMA,cAAc;EACd,UAAU,OAAO;;UAGF;EACf;;;;;EAKA;EACA;EACA;EACA;EACA;EACA;EACA;;;;;EAKA;EACA,mBAAmB;EACnB,UAAU,OAAO;;UAGF,gCAAgC;EAC/C;EACA;EACA;EACA,kBAAkB;;UAGH,+BAA+B;;EAE9C;EACA;;EAQA;EACA;EACA;EACA;EACA;EACA;;EAEA;;UAGe,uCAAuC;EACtD;EACA;EACA;EACA;EACA;;UAGe,+BAA+B;EAC9C;EACA;;EAEA;EACA;EACA;EACA;EACA;;UAGe;EACf;EACA;EACA;EACA;;EAEA,gBAAgB,qBAAqB,OAAO;;UAG7B;EACf;EACA,SAAS;EACT,UAAU;;UAGK;EACf,UAAU;EACV,OAAO,sBAAsB;EAC7B,WAAW,0BAA0B;EACrC,YAAY;EACZ,SAAS;;UAGM;EACf,WAAW,0BAA0B;EACrC,UAAU,yBAAyB;EACnC,kBAAkB,iCAAiC;EACnD,UAAU,yBAAyB;;UAGpB,wBAAwB;EACvC,SAAS;EACT,YAAY;;UAGG;EACf,MAAM,OAAO;EACb,QAAQ,OAAO,OAAO;EACtB,SAAS,iBAAiB;EAC1B,QAAQ,mBAAmB;;UAGZ,wBAAwB;WAC9B;WACA;EACT,WAAW,OAAO;EAClB,SAAS;;KAGC;UAEK;EACf;EACA,MAAM;EACN;EACA;EACA,WAAW;EACX"}
@@ -105,7 +105,11 @@ interface ConsoleTransportConfig {
105
105
  }
106
106
  interface AnalyticsTransportConfig {
107
107
  level?: string;
108
- apiKey: string;
108
+ /**
109
+ * @deprecated Not used by Mixpanel, Segment or Google Analytics (they use `token`,
110
+ * `writeKey` and `measurementId`/`apiSecret`). Only DataDog reads an API key.
111
+ */
112
+ apiKey?: string;
109
113
  projectId?: string;
110
114
  endpoint?: string;
111
115
  batchSize?: number;
@@ -127,6 +131,7 @@ interface MixpanelTransportConfig extends AnalyticsTransportConfig {
127
131
  superProperties?: Record<string, unknown>;
128
132
  }
129
133
  interface DataDogTransportConfig extends AnalyticsTransportConfig {
134
+ /** Datadog API key (sent as `DD-API-KEY`). Required. */
130
135
  apiKey: string;
131
136
  site?: 'datadoghq.com' | 'datadoghq.eu' | 'us3.datadoghq.com' | 'us5.datadoghq.com' | 'ap1.datadoghq.com' | 'ddog-gov.com';
132
137
  /** Gzip log request bodies (`Content-Encoding: gzip`). Default false. */
@@ -186,6 +191,12 @@ interface IAsyncTransport extends ITransport {
186
191
  flush(): Promise<void>;
187
192
  isReady?(): Promise<boolean>;
188
193
  }
194
+ interface TransportEvents {
195
+ log: (entry: TransportLogEntry) => void;
196
+ error: (error: Error, transport: string) => void;
197
+ rotate: (oldFile: string, newFile: string) => void;
198
+ flush: (transport: string, count: number) => void;
199
+ }
189
200
  interface IBatchTransport extends ITransport {
190
201
  readonly batchSize?: number;
191
202
  readonly flushInterval?: number;
@@ -201,5 +212,5 @@ interface TransportMetrics {
201
212
  lastWrite: Date;
202
213
  averageWriteTime: number;
203
214
  }
204
- export { FileTransportConfig as a, IBatchTransport as c, SegmentTransportConfig as d, TransportConfig as f, DatabaseTransportConfig as i, ITransport as l, TransportMetrics as m, ConsoleTransportConfig as n, GoogleAnalyticsTransportConfig as o, TransportLogEntry as p, DataDogTransportConfig as r, IAsyncTransport as s, AnalyticsTransportConfig as t, MixpanelTransportConfig as u };
205
- //# sourceMappingURL=transport.types-BJVL1QQl.d.mts.map
215
+ export { TransportLogEntry as _, DatabaseTransportConfig as a, TransportType as b, GoogleAnalyticsTransportConfig as c, ITransport as d, MixpanelTransportConfig as f, TransportEvents as g, TransportConfig as h, DataDogTransportConfig as i, IAsyncTransport as l, SegmentTransportConfig as m, AnalyticsTransportConfig as n, FileStats as o, RotationConfig as p, ConsoleTransportConfig as r, FileTransportConfig as s, AnalyticsConfig as t, IBatchTransport as u, TransportMetrics as v, TransportRetryConfig as y };
216
+ //# sourceMappingURL=transport.types-CzJq4IrF.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.types-CzJq4IrF.d.ts","names":[],"sources":["../src/types/transport.types.ts"],"mappings":";;;UAKiB;EACf;EACA;EACA;EACA;EACA,WAAW;EACX,eAAe,OAAO,OAAO,OAAO;;UAGrB;EACf;EACA;;;;;EAKA,UAAU,OAAO;;;;;EAKjB,MAAM,OAAO,2BAA2B;EACxC,UAAU;EACV,QAAQ;;UAGO;EACf,WAAW;EACX;EACA;EACA,OAAO;EACP;EACA;EACA;EACA;;UAGe;EACf;EACA;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;EACA;EACA;EACA;EACA;EACA,WAAW;;;;;;EAMX;;;;;;EAMA;EACA,UAAU,OAAO;;UAGF;EACf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,UAAU,OAAO;;;;;EAKjB;;UAGe;EACf;EACA;EACA;EACA;;;;;;EAMA,cAAc;EACd,UAAU,OAAO;;UAGF;EACf;;;;;EAKA;EACA;EACA;EACA;EACA;EACA;EACA;;;;;EAKA;EACA,mBAAmB;EACnB,UAAU,OAAO;;UAGF,gCAAgC;EAC/C;EACA;EACA;EACA,kBAAkB;;UAGH,+BAA+B;;EAE9C;EACA;;EAQA;EACA;EACA;EACA;EACA;EACA;;EAEA;;UAGe,uCAAuC;EACtD;EACA;EACA;EACA;EACA;;UAGe,+BAA+B;EAC9C;EACA;;EAEA;EACA;EACA;EACA;EACA;;UAGe;EACf;EACA;EACA;EACA;;EAEA,gBAAgB,qBAAqB,OAAO;;UAG7B;EACf;EACA,SAAS;EACT,UAAU;;UAGK;EACf,UAAU;EACV,OAAO,sBAAsB;EAC7B,WAAW,0BAA0B;EACrC,YAAY;EACZ,SAAS;;UAGM;EACf,WAAW,0BAA0B;EACrC,UAAU,yBAAyB;EACnC,kBAAkB,iCAAiC;EACnD,UAAU,yBAAyB;;UAGpB,wBAAwB;EACvC,SAAS;EACT,YAAY;;UAGG;EACf,MAAM,OAAO;EACb,QAAQ,OAAO,OAAO;EACtB,SAAS,iBAAiB;EAC1B,QAAQ,mBAAmB;;UAGZ,wBAAwB;WAC9B;WACA;EACT,WAAW,OAAO;EAClB,SAAS;;KAGC;UAEK;EACf;EACA,MAAM;EACN;EACA;EACA,WAAW;EACX"}
@@ -1,10 +1,10 @@
1
- import { a as FileTransportConfig, c as IBatchTransport, d as SegmentTransportConfig, f as TransportConfig, i as DatabaseTransportConfig, l as ITransport, m as TransportMetrics, n as ConsoleTransportConfig, o as GoogleAnalyticsTransportConfig, p as TransportLogEntry, r as DataDogTransportConfig, s as IAsyncTransport, t as AnalyticsTransportConfig, u as MixpanelTransportConfig } from "./transport.types-BJVL1QQl.mjs";
2
- import { t as AzureMonitorTransport } from "./azure-monitor.transport-C7kYyZUW.mjs";
3
- import { t as CloudWatchTransport } from "./cloudwatch.transport-Rj4yTpRn.mjs";
4
- import { n as GCPTransport } from "./gcp.transport-C5D72b1g.mjs";
5
- import { h as LogEntry } from "./index-xqaJtAZn.mjs";
6
- import { a as DiscordTransport, c as OtlpLogTransportConfig, i as DiscordEmbed, l as toOtelSeverity, n as SlackTransport, o as DiscordTransportConfig, r as SlackTransportConfig, s as OtlpLogTransport, t as SlackMessage } from "./slack.transport-DxHOXlLu.mjs";
7
- import { t as WorkerTransport } from "./worker.transport-hJay1wxA.mjs";
1
+ import { _ as TransportLogEntry, a as DatabaseTransportConfig, b as TransportType, c as GoogleAnalyticsTransportConfig, d as ITransport, f as MixpanelTransportConfig, g as TransportEvents, h as TransportConfig, i as DataDogTransportConfig, l as IAsyncTransport, m as SegmentTransportConfig, n as AnalyticsTransportConfig, o as FileStats, p as RotationConfig, r as ConsoleTransportConfig, s as FileTransportConfig, t as AnalyticsConfig, u as IBatchTransport, v as TransportMetrics, y as TransportRetryConfig } from "./transport.types-CzJq4IrF.mjs";
2
+ import { n as AzureMonitorTransportConfig, t as AzureMonitorTransport } from "./azure-monitor.transport-CbSHOnNX.mjs";
3
+ import { n as CloudWatchTransportConfig, t as CloudWatchTransport } from "./cloudwatch.transport-CjVrI6S4.mjs";
4
+ import { n as GCPTransport, r as GCPTransportConfig } from "./gcp.transport-D9SdLPwP.mjs";
5
+ import { g as LogEntry } from "./index-BSTtFcQ6.mjs";
6
+ import { a as DiscordTransport, c as OtlpLogTransportConfig, i as DiscordEmbed, l as toOtelSeverity, n as SlackTransport, o as DiscordTransportConfig, r as SlackTransportConfig, s as OtlpLogTransport, t as SlackMessage } from "./slack.transport-BDyENuR0.mjs";
7
+ import { n as WorkerTransportConfig, t as WorkerTransport } from "./worker.transport-Bl8lFRck.mjs";
8
8
  import { EventEmitter } from "node:events";
9
9
  export declare abstract class AnalyticsTransport implements ITransport, IBatchTransport {
10
10
  readonly name: string;
@@ -81,6 +81,7 @@ interface AnalyticsMetric {
81
81
  export declare class ConsoleTransport implements ITransport {
82
82
  private config;
83
83
  readonly name = "console";
84
+ readonly level?: string | undefined;
84
85
  readonly filter?: (entry: TransportLogEntry) => boolean;
85
86
  private static readonly COLORS;
86
87
  private static sanitize;
@@ -108,6 +109,7 @@ export declare class DatabaseTransport implements IAsyncTransport, IBatchTranspo
108
109
  readonly name = "database";
109
110
  readonly batchSize: number;
110
111
  readonly flushInterval: number;
112
+ readonly level?: string | undefined;
111
113
  readonly filter?: (entry: TransportLogEntry) => boolean;
112
114
  private batch;
113
115
  private flushTimer?;
@@ -179,8 +181,12 @@ export declare class DatabaseTransport implements IAsyncTransport, IBatchTranspo
179
181
  *
180
182
  * The API key is transmitted via the `DD-API-KEY` request header — never in the URL.
181
183
  *
184
+ * Metric names keep the legacy `logitron.logs.<level>` prefix (kept for
185
+ * dashboards and monitors that already query it; renaming would be a breaking
186
+ * change). Query `logitron.logs.error`, not `logixia.logs.error`.
187
+ *
182
188
  * @example
183
- * transports: { datadog: { apiKey: process.env.DD_API_KEY, service: 'api', env: 'production' } }
189
+ * analytics: { datadog: { apiKey: process.env.DD_API_KEY, service: 'api', env: 'production' } }
184
190
  */
185
191
  export declare class DataDogTransport extends AnalyticsTransport {
186
192
  private datadogConfig;
@@ -335,7 +341,7 @@ export declare class FileTransport implements ITransport, IBatchTransport {
335
341
  * Sends log entries as Google Analytics 4 Measurement Protocol events.
336
342
  *
337
343
  * @example
338
- * transports: {
344
+ * analytics: {
339
345
  * googleAnalytics: { measurementId: 'G-XXXXXXX', apiSecret: process.env.GA_API_SECRET }
340
346
  * }
341
347
  */
@@ -369,7 +375,7 @@ export declare class GoogleAnalyticsTransport extends AnalyticsTransport {
369
375
  * Sends log entries as Mixpanel events via the Track and Engage HTTP APIs.
370
376
  *
371
377
  * @example
372
- * transports: { mixpanel: { token: process.env.MIXPANEL_TOKEN } }
378
+ * analytics: { mixpanel: { token: process.env.MIXPANEL_TOKEN } }
373
379
  */
374
380
  export declare class MixpanelTransport extends AnalyticsTransport {
375
381
  private mixpanelConfig;
@@ -394,7 +400,7 @@ export declare class MixpanelTransport extends AnalyticsTransport {
394
400
  * Sends log entries as Segment track/identify events via the HTTP Tracking API.
395
401
  *
396
402
  * @example
397
- * transports: { segment: { writeKey: process.env.SEGMENT_WRITE_KEY } }
403
+ * analytics: { segment: { writeKey: process.env.SEGMENT_WRITE_KEY } }
398
404
  */
399
405
  export declare class SegmentTransport extends AnalyticsTransport {
400
406
  private segmentConfig;
@@ -428,7 +434,13 @@ export declare class TransportManager extends EventEmitter {
428
434
  private isShuttingDown;
429
435
  private transportLevelPreferences;
430
436
  private warnedPromptDeprecated;
431
- constructor(config?: TransportConfig);
437
+ private readonly levelValues;
438
+ /**
439
+ * @param config Transport configuration.
440
+ * @param levels The logger's `levelOptions.levels`; used with the built-in levels
441
+ * to compare entries against each transport's `level`.
442
+ */
443
+ constructor(config?: TransportConfig, levels?: Record<string, number>);
432
444
  private setupTransports;
433
445
  addTransport(transport: ITransport, id?: string): void;
434
446
  removeTransport(id: string): boolean;
@@ -482,5 +494,5 @@ export declare class TransportManager extends EventEmitter {
482
494
  getTransportLevels(transportId: string): string[] | undefined;
483
495
  clearTransportLevelPreferences(): void;
484
496
  }
485
- export { AzureMonitorTransport, CloudWatchTransport, type DiscordEmbed, DiscordTransport, type DiscordTransportConfig, GCPTransport, OtlpLogTransport, type OtlpLogTransportConfig, type SlackMessage, SlackTransport, type SlackTransportConfig, WorkerTransport, toOtelSeverity };
497
+ export { type AnalyticsConfig, type AnalyticsTransportConfig, AzureMonitorTransport, type AzureMonitorTransportConfig, CloudWatchTransport, type CloudWatchTransportConfig, type ConsoleTransportConfig, type DataDogTransportConfig, type DatabaseTransportConfig, type DiscordEmbed, DiscordTransport, type DiscordTransportConfig, type FileStats, type FileTransportConfig, GCPTransport, type GCPTransportConfig, type GoogleAnalyticsTransportConfig, type IAsyncTransport, type IBatchTransport, type ITransport, type MixpanelTransportConfig, OtlpLogTransport, type OtlpLogTransportConfig, type RotationConfig, type SegmentTransportConfig, type SlackMessage, SlackTransport, type SlackTransportConfig, type TransportConfig, type TransportEvents, type TransportLogEntry, type TransportMetrics, type TransportRetryConfig, type TransportType, WorkerTransport, type WorkerTransportConfig, toOtelSeverity };
486
498
  //# sourceMappingURL=transports.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"transports.d.mts","names":[],"sources":["../src/transports/analytics.transport.ts","../src/transports/console.transport.ts","../src/transports/database.transport.ts","../src/transports/datadog.transport.ts","../src/transports/file.transport.ts","../src/transports/google-analytics.transport.ts","../src/transports/mixpanel.transport.ts","../src/transports/segment.transport.ts","../src/transports/transport.manager.ts"],"mappings":"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"}
1
+ {"version":3,"file":"transports.d.mts","names":[],"sources":["../src/transports/analytics.transport.ts","../src/transports/console.transport.ts","../src/transports/database.transport.ts","../src/transports/datadog.transport.ts","../src/transports/file.transport.ts","../src/transports/google-analytics.transport.ts","../src/transports/mixpanel.transport.ts","../src/transports/segment.transport.ts","../src/transports/transport.manager.ts"],"mappings":"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"}