logixia 1.13.3 → 2.0.4

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 (229) hide show
  1. package/README.md +117 -44
  2. package/dist/async-context-B05ArHgM.mjs +134 -0
  3. package/dist/async-context-B05ArHgM.mjs.map +1 -0
  4. package/dist/async-context-DTQgi8f7.js +150 -0
  5. package/dist/async-context-DTQgi8f7.js.map +1 -0
  6. package/dist/{azure-monitor.transport-CHnjVRF-.mjs → azure-monitor.transport-BPbgjATu.mjs} +27 -15
  7. package/dist/azure-monitor.transport-BPbgjATu.mjs.map +1 -0
  8. package/dist/{azure-monitor.transport-BDFO4F-i.d.ts → azure-monitor.transport-C7kYyZUW.d.mts} +3 -6
  9. package/dist/azure-monitor.transport-C7kYyZUW.d.mts.map +1 -0
  10. package/dist/{azure-monitor.transport-CrvfHd9C.js → azure-monitor.transport-CwbOLZHB.js} +32 -20
  11. package/dist/azure-monitor.transport-CwbOLZHB.js.map +1 -0
  12. package/dist/{azure-monitor.transport-D5wQEH04.d.mts → azure-monitor.transport-DV03Z5P4.d.ts} +3 -6
  13. package/dist/azure-monitor.transport-DV03Z5P4.d.ts.map +1 -0
  14. package/dist/azure.d.mts +1 -2
  15. package/dist/azure.d.ts +1 -2
  16. package/dist/azure.js +3 -6
  17. package/dist/azure.mjs +1 -6
  18. package/dist/{batch-buffer-PGvSgbmd.mjs → batch-buffer-0fgLmIPn.mjs} +21 -7
  19. package/dist/batch-buffer-0fgLmIPn.mjs.map +1 -0
  20. package/dist/{batch-buffer-BY-mRWIK.js → batch-buffer-DT4gdXmf.js} +53 -40
  21. package/dist/batch-buffer-DT4gdXmf.js.map +1 -0
  22. package/dist/browser.d.mts +52 -23
  23. package/dist/browser.d.mts.map +1 -1
  24. package/dist/browser.d.ts +52 -23
  25. package/dist/browser.d.ts.map +1 -1
  26. package/dist/browser.js +460 -62
  27. package/dist/browser.js.map +1 -1
  28. package/dist/browser.mjs +461 -65
  29. package/dist/browser.mjs.map +1 -1
  30. package/dist/{nestjs-extras-ImbuDhs1.mjs → builder-D70z6kjj.mjs} +279 -965
  31. package/dist/builder-D70z6kjj.mjs.map +1 -0
  32. package/dist/{nestjs-extras-DnJ6vrIC.js → builder-M7NoaugM.js} +421 -1177
  33. package/dist/builder-M7NoaugM.js.map +1 -0
  34. package/dist/cli/index.js +86 -67
  35. package/dist/cloudwatch.d.mts +1 -2
  36. package/dist/cloudwatch.d.ts +1 -2
  37. package/dist/cloudwatch.js +3 -7
  38. package/dist/cloudwatch.mjs +1 -7
  39. package/dist/{cloudwatch.transport-BO1ahxw-.js → cloudwatch.transport-B2wKQFF7.js} +61 -36
  40. package/dist/cloudwatch.transport-B2wKQFF7.js.map +1 -0
  41. package/dist/{cloudwatch.transport-DZ6ies7g.mjs → cloudwatch.transport-BTvYfLs9.mjs} +54 -28
  42. package/dist/cloudwatch.transport-BTvYfLs9.mjs.map +1 -0
  43. package/dist/{cloudwatch.transport-B00st6Xv.d.ts → cloudwatch.transport-Bf7L4I59.d.ts} +2 -6
  44. package/dist/cloudwatch.transport-Bf7L4I59.d.ts.map +1 -0
  45. package/dist/{cloudwatch.transport-Blc7Gtxt.d.mts → cloudwatch.transport-Rj4yTpRn.d.mts} +2 -6
  46. package/dist/cloudwatch.transport-Rj4yTpRn.d.mts.map +1 -0
  47. package/dist/{coerce.utils-Cu6IUTgX.mjs → coerce.utils-B_rEudCn.mjs} +3 -4
  48. package/dist/{coerce.utils-Cu6IUTgX.mjs.map → coerce.utils-B_rEudCn.mjs.map} +1 -1
  49. package/dist/{coerce.utils-B-LilukN.js → coerce.utils-C1C5sIX0.js} +8 -10
  50. package/dist/{coerce.utils-B-LilukN.js.map → coerce.utils-C1C5sIX0.js.map} +1 -1
  51. package/dist/correlation.d.mts +13 -16
  52. package/dist/correlation.d.mts.map +1 -1
  53. package/dist/correlation.d.ts +13 -16
  54. package/dist/correlation.d.ts.map +1 -1
  55. package/dist/correlation.js +58 -9
  56. package/dist/correlation.js.map +1 -1
  57. package/dist/correlation.mjs +56 -6
  58. package/dist/correlation.mjs.map +1 -1
  59. package/dist/{entry-fields-BJkuPnIg.mjs → entry-fields-CGuvT2R0.mjs} +5 -6
  60. package/dist/entry-fields-CGuvT2R0.mjs.map +1 -0
  61. package/dist/{entry-fields-BvOLFlJ4.js → entry-fields-RLd1jCoR.js} +10 -12
  62. package/dist/entry-fields-RLd1jCoR.js.map +1 -0
  63. package/dist/gcp.d.mts +1 -2
  64. package/dist/gcp.d.ts +1 -2
  65. package/dist/gcp.js +3 -7
  66. package/dist/gcp.mjs +1 -7
  67. package/dist/{gcp.transport-m4fVw0b1.d.ts → gcp.transport-C5D72b1g.d.mts} +3 -6
  68. package/dist/gcp.transport-C5D72b1g.d.mts.map +1 -0
  69. package/dist/{gcp.transport-zzNyIoih.d.mts → gcp.transport-CFQfdAOK.d.ts} +3 -6
  70. package/dist/gcp.transport-CFQfdAOK.d.ts.map +1 -0
  71. package/dist/{gcp.transport-DBX5TPIy.mjs → gcp.transport-CGKopAhQ.mjs} +55 -16
  72. package/dist/gcp.transport-CGKopAhQ.mjs.map +1 -0
  73. package/dist/{gcp.transport-CHV8MGgz.js → gcp.transport-KZe9hCAR.js} +60 -22
  74. package/dist/gcp.transport-KZe9hCAR.js.map +1 -0
  75. package/dist/{index-nZEeCr3X.d.ts → index-DwozbmB4.d.ts} +3 -8
  76. package/dist/index-DwozbmB4.d.ts.map +1 -0
  77. package/dist/{index-BPwEisy4.d.mts → index-xqaJtAZn.d.mts} +3 -8
  78. package/dist/index-xqaJtAZn.d.mts.map +1 -0
  79. package/dist/index.d.mts +141 -203
  80. package/dist/index.d.mts.map +1 -1
  81. package/dist/index.d.ts +140 -202
  82. package/dist/index.d.ts.map +1 -1
  83. package/dist/index.js +196 -381
  84. package/dist/index.js.map +1 -1
  85. package/dist/index.mjs +145 -294
  86. package/dist/index.mjs.map +1 -1
  87. package/dist/internal-log-b0Vp4qrB.js +183 -0
  88. package/dist/internal-log-b0Vp4qrB.js.map +1 -0
  89. package/dist/internal-log-uCSd1PMc.mjs +142 -0
  90. package/dist/internal-log-uCSd1PMc.mjs.map +1 -0
  91. package/dist/logitron-logger-D2B75Oc7.d.ts +365 -0
  92. package/dist/logitron-logger-D2B75Oc7.d.ts.map +1 -0
  93. package/dist/logitron-logger-oEd6wNhf.d.mts +365 -0
  94. package/dist/logitron-logger-oEd6wNhf.d.mts.map +1 -0
  95. package/dist/middleware.d.mts +10 -12
  96. package/dist/middleware.d.mts.map +1 -1
  97. package/dist/middleware.d.ts +10 -12
  98. package/dist/middleware.d.ts.map +1 -1
  99. package/dist/middleware.js +16 -47
  100. package/dist/middleware.js.map +1 -1
  101. package/dist/middleware.mjs +13 -45
  102. package/dist/middleware.mjs.map +1 -1
  103. package/dist/nest.d.mts +467 -10
  104. package/dist/nest.d.mts.map +1 -1
  105. package/dist/nest.d.ts +467 -10
  106. package/dist/nest.d.ts.map +1 -1
  107. package/dist/nest.js +889 -43
  108. package/dist/nest.js.map +1 -0
  109. package/dist/nest.mjs +850 -9
  110. package/dist/nest.mjs.map +1 -0
  111. package/dist/{trace.utils-CvXgaiQT.mjs → request-trace-C_fvIDv4.mjs} +44 -9
  112. package/dist/request-trace-C_fvIDv4.mjs.map +1 -0
  113. package/dist/{trace.utils-DpBOLDtq.js → request-trace-wTJdKp6-.js} +121 -77
  114. package/dist/request-trace-wTJdKp6-.js.map +1 -0
  115. package/dist/rolldown-runtime-D3PmRqjj.mjs +4 -0
  116. package/dist/{safe-stringify-DJ66tW5I.mjs → safe-stringify-BMRl3EX3.mjs} +3 -4
  117. package/dist/safe-stringify-BMRl3EX3.mjs.map +1 -0
  118. package/dist/{safe-stringify-DWo3aZp_.js → safe-stringify-DLz1Kz3o.js} +23 -25
  119. package/dist/safe-stringify-DLz1Kz3o.js.map +1 -0
  120. package/dist/{search-CHUZPl0h.d.ts → search-BH33XhuU.d.mts} +2 -22
  121. package/dist/search-BH33XhuU.d.mts.map +1 -0
  122. package/dist/{search-DjXSn6v5.mjs → search-CWMVYC-R.mjs} +34 -41
  123. package/dist/search-CWMVYC-R.mjs.map +1 -0
  124. package/dist/{search-BfBzDIT9.d.mts → search-CazwyX5Z.d.ts} +2 -22
  125. package/dist/search-CazwyX5Z.d.ts.map +1 -0
  126. package/dist/{search-B0MH1SJJ.js → search-DUfWuzFP.js} +64 -71
  127. package/dist/search-DUfWuzFP.js.map +1 -0
  128. package/dist/search.d.mts +2 -4
  129. package/dist/search.d.ts +2 -4
  130. package/dist/search.js +3 -4
  131. package/dist/search.mjs +1 -4
  132. package/dist/secret-config-BegMLkYl.mjs +209 -0
  133. package/dist/secret-config-BegMLkYl.mjs.map +1 -0
  134. package/dist/secret-config-CBZBs0p1.js +271 -0
  135. package/dist/secret-config-CBZBs0p1.js.map +1 -0
  136. package/dist/slack.transport-Ce96JBDk.mjs +824 -0
  137. package/dist/slack.transport-Ce96JBDk.mjs.map +1 -0
  138. package/dist/slack.transport-Dlx3xvb7.js +847 -0
  139. package/dist/slack.transport-Dlx3xvb7.js.map +1 -0
  140. package/dist/slack.transport-DrirgDNy.d.ts +159 -0
  141. package/dist/slack.transport-DrirgDNy.d.ts.map +1 -0
  142. package/dist/slack.transport-DxHOXlLu.d.mts +159 -0
  143. package/dist/slack.transport-DxHOXlLu.d.mts.map +1 -0
  144. package/dist/testing.d.mts +3 -8
  145. package/dist/testing.d.mts.map +1 -1
  146. package/dist/testing.d.ts +3 -8
  147. package/dist/testing.d.ts.map +1 -1
  148. package/dist/testing.js +3 -4
  149. package/dist/testing.js.map +1 -1
  150. package/dist/testing.mjs +2 -3
  151. package/dist/testing.mjs.map +1 -1
  152. package/dist/{transport.manager-Crau3Rle.js → transport.manager-DkcEOlqV.js} +331 -234
  153. package/dist/transport.manager-DkcEOlqV.js.map +1 -0
  154. package/dist/{transport.manager-CpdVHEGP.mjs → transport.manager-eZ_EeC00.mjs} +274 -178
  155. package/dist/transport.manager-eZ_EeC00.mjs.map +1 -0
  156. package/dist/{transport.types-CtNr3D7S.d.mts → transport.types-BJVL1QQl.d.mts} +5 -4
  157. package/dist/transport.types-BJVL1QQl.d.mts.map +1 -0
  158. package/dist/{transport.types-DqVLZTyf.d.ts → transport.types-BJVL1QQl.d.ts} +5 -4
  159. package/dist/transport.types-BJVL1QQl.d.ts.map +1 -0
  160. package/dist/transports.d.mts +32 -41
  161. package/dist/transports.d.mts.map +1 -1
  162. package/dist/transports.d.ts +32 -41
  163. package/dist/transports.d.ts.map +1 -1
  164. package/dist/transports.js +12 -12
  165. package/dist/transports.mjs +7 -12
  166. package/dist/worker-entry.js +337 -87
  167. package/dist/worker.d.mts +1 -2
  168. package/dist/worker.d.ts +1 -2
  169. package/dist/worker.js +3 -4
  170. package/dist/worker.mjs +1 -4
  171. package/dist/{worker.transport-Bj-i0P9V.d.ts → worker.transport-BuPwBi3d.d.ts} +2 -6
  172. package/dist/worker.transport-BuPwBi3d.d.ts.map +1 -0
  173. package/dist/{worker.transport-JP8YHBuU.js → worker.transport-C6GNl_r2.js} +44 -14
  174. package/dist/worker.transport-C6GNl_r2.js.map +1 -0
  175. package/dist/{worker.transport-otwhJ_Et.mjs → worker.transport-DLVA4y2e.mjs} +39 -9
  176. package/dist/worker.transport-DLVA4y2e.mjs.map +1 -0
  177. package/dist/{worker.transport-Bgv9heDI.d.mts → worker.transport-hJay1wxA.d.mts} +2 -6
  178. package/dist/worker.transport-hJay1wxA.d.mts.map +1 -0
  179. package/package.json +36 -19
  180. package/dist/async-context-BzJrbfQs.mjs +0 -72
  181. package/dist/async-context-BzJrbfQs.mjs.map +0 -1
  182. package/dist/async-context-DyQQYq3I.js +0 -92
  183. package/dist/async-context-DyQQYq3I.js.map +0 -1
  184. package/dist/azure-monitor.transport-BDFO4F-i.d.ts.map +0 -1
  185. package/dist/azure-monitor.transport-CHnjVRF-.mjs.map +0 -1
  186. package/dist/azure-monitor.transport-CrvfHd9C.js.map +0 -1
  187. package/dist/azure-monitor.transport-D5wQEH04.d.mts.map +0 -1
  188. package/dist/batch-buffer-BY-mRWIK.js.map +0 -1
  189. package/dist/batch-buffer-PGvSgbmd.mjs.map +0 -1
  190. package/dist/chunk-DLSkYcPk.mjs +0 -7
  191. package/dist/chunk-nOFOJqeH.js +0 -30
  192. package/dist/cloudwatch.transport-B00st6Xv.d.ts.map +0 -1
  193. package/dist/cloudwatch.transport-BO1ahxw-.js.map +0 -1
  194. package/dist/cloudwatch.transport-Blc7Gtxt.d.mts.map +0 -1
  195. package/dist/cloudwatch.transport-DZ6ies7g.mjs.map +0 -1
  196. package/dist/entry-fields-BJkuPnIg.mjs.map +0 -1
  197. package/dist/entry-fields-BvOLFlJ4.js.map +0 -1
  198. package/dist/gcp.transport-CHV8MGgz.js.map +0 -1
  199. package/dist/gcp.transport-DBX5TPIy.mjs.map +0 -1
  200. package/dist/gcp.transport-m4fVw0b1.d.ts.map +0 -1
  201. package/dist/gcp.transport-zzNyIoih.d.mts.map +0 -1
  202. package/dist/index-BPwEisy4.d.mts.map +0 -1
  203. package/dist/index-nZEeCr3X.d.ts.map +0 -1
  204. package/dist/internal-log-BUJYMZbE.js +0 -70
  205. package/dist/internal-log-BUJYMZbE.js.map +0 -1
  206. package/dist/internal-log-Cm8SOWSV.mjs +0 -52
  207. package/dist/internal-log-Cm8SOWSV.mjs.map +0 -1
  208. package/dist/nestjs-extras-DnJ6vrIC.js.map +0 -1
  209. package/dist/nestjs-extras-ImbuDhs1.mjs.map +0 -1
  210. package/dist/nestjs-extras-OkC796py.d.mts +0 -725
  211. package/dist/nestjs-extras-OkC796py.d.mts.map +0 -1
  212. package/dist/nestjs-extras-mKrHE9S6.d.ts +0 -725
  213. package/dist/nestjs-extras-mKrHE9S6.d.ts.map +0 -1
  214. package/dist/safe-stringify-DJ66tW5I.mjs.map +0 -1
  215. package/dist/safe-stringify-DWo3aZp_.js.map +0 -1
  216. package/dist/search-B0MH1SJJ.js.map +0 -1
  217. package/dist/search-BfBzDIT9.d.mts.map +0 -1
  218. package/dist/search-CHUZPl0h.d.ts.map +0 -1
  219. package/dist/search-DjXSn6v5.mjs.map +0 -1
  220. package/dist/trace.utils-CvXgaiQT.mjs.map +0 -1
  221. package/dist/trace.utils-DpBOLDtq.js.map +0 -1
  222. package/dist/transport.manager-CpdVHEGP.mjs.map +0 -1
  223. package/dist/transport.manager-Crau3Rle.js.map +0 -1
  224. package/dist/transport.types-CtNr3D7S.d.mts.map +0 -1
  225. package/dist/transport.types-DqVLZTyf.d.ts.map +0 -1
  226. package/dist/worker.transport-Bgv9heDI.d.mts.map +0 -1
  227. package/dist/worker.transport-Bj-i0P9V.d.ts.map +0 -1
  228. package/dist/worker.transport-JP8YHBuU.js.map +0 -1
  229. package/dist/worker.transport-otwhJ_Et.mjs.map +0 -1
package/dist/nest.d.mts CHANGED
@@ -1,11 +1,463 @@
1
- import "./transport.types-CtNr3D7S.mjs";
2
- import { E as TraceIdConfig } from "./index-BPwEisy4.mjs";
3
- import { _ as LogixiaServiceWithLevels, a as LogixiaExceptionFilter, c as LOGIXIA_LOGGER_PREFIX, d as LogixiaLoggerModule, f as LogixiaOptionsFactory, g as LogixiaServiceWith, h as LogixiaLoggerService, m as KafkaTraceInterceptor, n as LOGIXIA_EXCEPTION_FILTER_OPTIONS, o as LogixiaExceptionFilterOptions, p as WebSocketTraceInterceptor, s as LOGIXIA_LOGGER_CONFIG, u as LogixiaAsyncOptions } from "./nestjs-extras-OkC796py.mjs";
4
- import { NestMiddleware } from "@nestjs/common";
1
+ import { E as TraceIdConfig, v as LogLevelString, y as LoggerConfig } from "./index-xqaJtAZn.mjs";
2
+ import { t as LogixiaLogger } from "./logitron-logger-oEd6wNhf.mjs";
3
+ import { ArgumentsHost, CallHandler, ExceptionFilter, ExecutionContext, InjectionToken, LoggerService, MiddlewareConsumer, ModuleMetadata, NestInterceptor, NestMiddleware, NestModule, OptionalFactoryDependency, Type } from "@nestjs/common";
4
+ import { Observable } from "rxjs";
5
5
  import { NextFunction, Request, Response } from "express";
6
-
7
- //#region src/core/trace.middleware.d.ts
8
-
6
+ /**
7
+ * Level names that already have proper typed implementations on LogixiaLoggerService.
8
+ * These are excluded from the auto-generated method type so we don't produce
9
+ * duplicate / conflicting signatures.
10
+ */
11
+ type _ServiceBuiltinLevels = 'error' | 'warn' | 'info' | 'debug' | 'verbose' | 'trace' | 'log' | 'logLevel';
12
+ /**
13
+ * Mapped type that adds one method per *custom* level (i.e. every key in TLevels
14
+ * that is not already a built-in method on LogixiaLoggerService).
15
+ *
16
+ * @example
17
+ * ServiceCustomLevelMethods<{ kafka: 3; mysql: 4; payment: 5 }>
18
+ * // → { kafka(msg, data?): Promise<void>; mysql(...): …; payment(...): … }
19
+ */
20
+ type ServiceCustomLevelMethods<TLevels extends Record<string, number>> = { readonly [K in keyof TLevels as K extends _ServiceBuiltinLevels ? never : K & string]: (message: string, data?: Record<string, unknown>) => Promise<void>; };
21
+ /**
22
+ * The return type of `LogixiaLoggerService.create<T>(config)`.
23
+ *
24
+ * When `T` carries `levelOptions.levels`, this type intersects
25
+ * `LogixiaLoggerService` with a method for every *custom* level so the IDE
26
+ * suggests `service.kafka(...)`, `service.payment(...)`, etc.
27
+ */
28
+ export type LogixiaServiceWithLevels<T extends LoggerConfig<Record<string, number>>> = T['levelOptions'] extends {
29
+ levels: infer L;
30
+ } ? L extends Record<string, number> ? LogixiaLoggerService & ServiceCustomLevelMethods<L> : LogixiaLoggerService : LogixiaLoggerService;
31
+ /**
32
+ * Helper — extracts custom level names from a config object's `levelOptions.levels`.
33
+ */
34
+ type _ExtractCustomLevelNames<T> = T extends {
35
+ levelOptions?: {
36
+ levels?: infer L;
37
+ };
38
+ } ? L extends Record<string, number> ? Exclude<keyof L & string, _ServiceBuiltinLevels> : never : never;
39
+ /**
40
+ * Typed `LogixiaLoggerService` with autocomplete for custom levels.
41
+ *
42
+ * Accepts either:
43
+ * - **string union** of custom level names: `LogixiaServiceWith<'kafka' | 'payment'>`
44
+ * - **config object type** (via `typeof`): `LogixiaServiceWith<typeof logixiaConfig>`
45
+ *
46
+ * Define your config with `as const` once, derive the type everywhere:
47
+ *
48
+ * @example
49
+ * ```ts
50
+ * // logger.config.ts — define once
51
+ * export const logixiaConfig = {
52
+ * levelOptions: {
53
+ * levels: { error: 0, warn: 1, info: 2, debug: 3, verbose: 4, kafka: 5, payment: 6 },
54
+ * },
55
+ * } as const;
56
+ * export type AppLogger = LogixiaServiceWith<typeof logixiaConfig>;
57
+ *
58
+ * // any.controller.ts — use everywhere, no casting
59
+ * constructor(private readonly logger: AppLogger) {}
60
+ * // this.logger.kafka('msg') ← fully typed
61
+ * // this.logger.payment('msg') ← fully typed
62
+ * ```
63
+ *
64
+ * @example
65
+ * ```ts
66
+ * // Or use string union directly:
67
+ * type AppLogger = LogixiaServiceWith<'kafka' | 'payment'>;
68
+ * ```
69
+ */
70
+ export type LogixiaServiceWith<T extends string | Record<string, unknown>> = LogixiaLoggerService & { readonly [K in T extends string ? Exclude<T, _ServiceBuiltinLevels> : _ExtractCustomLevelNames<T>]: (message: string, data?: Record<string, unknown>) => Promise<void>; };
71
+ export declare class LogixiaLoggerService implements LoggerService {
72
+ [K: string]: any;
73
+ private logger;
74
+ private context?;
75
+ private _mergedConfig;
76
+ constructor(config?: LoggerConfig);
77
+ private _createCustomLevelMethods;
78
+ /**
79
+ * NestJS `LoggerService.log` — void, string context.
80
+ * Maps internally to `info`.
81
+ *
82
+ * @example `logger.log('User signed up', 'AuthService')`
83
+ */
84
+ log(message: unknown, context?: string): void;
85
+ /**
86
+ * Native async `info` — structured data, returns `Promise<void>`.
87
+ *
88
+ * @example `await logger.info('User signed up', { userId: 'u_abc' })`
89
+ */
90
+ info(message: string, data?: Record<string, unknown>): Promise<void>;
91
+ /**
92
+ * Native async overload — structured metadata, returns `Promise<void>`.
93
+ *
94
+ * @example `await logger.error(new Error('DB timeout'), { requestId: 'req_abc' })`
95
+ * @example `await logger.error('Login failed', { userId: 'u_abc' })`
96
+ */
97
+ error(message: string | Error, data: Record<string, unknown>): Promise<void>;
98
+ /**
99
+ * NestJS compat overload — string trace + optional context, returns `void`.
100
+ *
101
+ * @example `logger.error('Something failed', err.stack, 'AuthService')`
102
+ */
103
+ error(message: unknown, trace?: string, context?: string): void;
104
+ /**
105
+ * Native async overload — structured metadata, returns `Promise<void>`.
106
+ *
107
+ * @example `await logger.warn('Rate limit approaching', { userId: 'u_abc', count: 90 })`
108
+ */
109
+ warn(message: string, data: Record<string, unknown>): Promise<void>;
110
+ /**
111
+ * NestJS compat overload — optional context string, returns `void`.
112
+ *
113
+ * @example `logger.warn('Deprecated API used', 'PaymentService')`
114
+ */
115
+ warn(message: unknown, context?: string): void;
116
+ /**
117
+ * Native async overload — structured metadata, returns `Promise<void>`.
118
+ *
119
+ * @example `await logger.debug('Cache miss', { key: 'user:abc', ttl: 300 })`
120
+ */
121
+ debug(message: string, data: Record<string, unknown>): Promise<void>;
122
+ /**
123
+ * NestJS compat overload — optional context string, returns `void`.
124
+ *
125
+ * @example `logger.debug('Processing request', 'OrderService')`
126
+ */
127
+ debug(message: unknown, context?: string): void;
128
+ /**
129
+ * Native async overload — structured metadata, returns `Promise<void>`.
130
+ * Maps to `trace` level internally.
131
+ *
132
+ * @example `await logger.verbose('Socket message received', { event: 'ping', size: 42 })`
133
+ */
134
+ verbose(message: string, data: Record<string, unknown>): Promise<void>;
135
+ /**
136
+ * NestJS compat overload — optional context string, returns `void`.
137
+ *
138
+ * @example `logger.verbose('Connection established', 'WebSocketGateway')`
139
+ */
140
+ verbose(message: unknown, context?: string): void;
141
+ /**
142
+ * Native async `trace` — lowest verbosity level, structured data.
143
+ */
144
+ trace(message: string, data?: Record<string, unknown>): Promise<void>;
145
+ /**
146
+ * Log at any named level with structured data.
147
+ */
148
+ logLevel(level: string, message: string, data?: Record<string, unknown>): Promise<void>;
149
+ time(label: string): void;
150
+ timeEnd(label: string): Promise<number | undefined>;
151
+ timeAsync<T>(label: string, fn: () => Promise<T>): Promise<T>;
152
+ setContext(context: string): void;
153
+ getContext(): string | undefined;
154
+ setLevel(level: LogLevelString): void;
155
+ getLevel(): LogLevelString;
156
+ child(context: string, data?: Record<string, unknown>): LogixiaLoggerService;
157
+ getCurrentTraceId(): string | undefined;
158
+ /** Returns the AsyncLocalStorage key currently used to store the trace ID. */
159
+ get traceContextKey(): string;
160
+ close(): Promise<void>;
161
+ static create<T extends LoggerConfig<Record<string, number>>>(config?: T): LogixiaServiceWithLevels<T>;
162
+ getLogger(): LogixiaLogger;
163
+ private setContextIfProvided;
164
+ private formatMessage;
165
+ }
166
+ /**
167
+ * Observable counters exposed for monitoring Kafka consumer trace hygiene.
168
+ *
169
+ * Usage:
170
+ * import { KafkaTraceInterceptor } from 'logixia/nest';
171
+ * setInterval(() => {
172
+ * myMetrics.gauge('kafka.trace.dropped', KafkaTraceInterceptor.metrics.dropped);
173
+ * }, 10_000);
174
+ */
175
+ interface KafkaTraceMetrics {
176
+ /** Messages processed where a traceId was successfully resolved (body/header/ALS). */
177
+ accepted: number;
178
+ /** Messages handled without any traceId — `requireTraceId: false`. */
179
+ acceptedWithoutTrace: number;
180
+ /** Messages dropped because `requireTraceId: true` and no traceId was found. */
181
+ dropped: number;
182
+ }
183
+ export declare class KafkaTraceInterceptor implements NestInterceptor {
184
+ private readonly requireTraceId;
185
+ /**
186
+ * Process-wide counters. Readable from anywhere — scrape into your metrics
187
+ * system (Prometheus, Datadog, CloudWatch) on an interval.
188
+ */
189
+ static readonly metrics: KafkaTraceMetrics;
190
+ /** Reset counters (tests). */
191
+ static resetMetrics(): void;
192
+ private readonly ctx;
193
+ private readonly config;
194
+ /**
195
+ * @param config - TraceIdConfig options (extractor keys, contextKey, etc.)
196
+ * @param requireTraceId - When true, messages with no traceId are silently skipped
197
+ * (EMPTY Observable — message is ack'd, consumer stays alive).
198
+ * A WARN is logged AND `KafkaTraceInterceptor.metrics.dropped`
199
+ * increments so the missing traceId is observable end-to-end.
200
+ * Default: false (handler runs without trace context).
201
+ */
202
+ constructor(config?: TraceIdConfig, requireTraceId?: boolean);
203
+ intercept(context: ExecutionContext, next: CallHandler): Observable<any>;
204
+ }
205
+ export declare class WebSocketTraceInterceptor implements NestInterceptor {
206
+ private readonly ctx;
207
+ private readonly config;
208
+ constructor(config?: TraceIdConfig);
209
+ intercept(context: ExecutionContext, next: CallHandler): Observable<any>;
210
+ }
211
+ export declare const LOGIXIA_LOGGER_CONFIG = "LOGIXIA_LOGGER_CONFIG";
212
+ export declare const LOGIXIA_TRACE_CONFIG = "TRACE_CONFIG";
213
+ export declare const LOGIXIA_LOGGER_PREFIX = "LOGIXIA_LOGGER_";
214
+ export interface LogixiaAsyncOptions extends Pick<ModuleMetadata, 'imports'> {
215
+ useExisting?: Type<LogixiaOptionsFactory>;
216
+ useClass?: Type<LogixiaOptionsFactory>;
217
+ useFactory?: (...args: unknown[]) => Promise<Partial<LoggerConfig>> | Partial<LoggerConfig>;
218
+ inject?: Array<InjectionToken | OptionalFactoryDependency>;
219
+ }
220
+ export interface LogixiaOptionsFactory {
221
+ createLogixiaOptions(): Promise<Partial<LoggerConfig>> | Partial<LoggerConfig>;
222
+ }
223
+ /**
224
+ * Logixia Logger Module for NestJS dependency injection
225
+ */
226
+ export declare class LogixiaLoggerModule implements NestModule {
227
+ private config;
228
+ private static loggerConfig;
229
+ /**
230
+ * @internal Backing field for the global logger. Do not read or write
231
+ * directly — use {@link getGlobalLogger} / {@link _setGlobalLogger} which
232
+ * enforce single-init semantics.
233
+ */
234
+ static _globalLogger: LogixiaLoggerService | null;
235
+ /**
236
+ * @internal Set the global logger exactly once.
237
+ *
238
+ * Called from the module's forRoot / forRootAsync factory. If the module is
239
+ * initialised more than once in the same process (nested DI context, test
240
+ * harness creating multiple apps, hot reload, etc.) a warning is written to
241
+ * stderr and the first logger wins — silently overwriting would allow the
242
+ * newer instance's transport config to replace the live one while the old
243
+ * one is still being used by registered shutdown hooks, decorators, etc.
244
+ *
245
+ * Use {@link _resetGlobalLogger} in tests to reset between runs.
246
+ */
247
+ static _setGlobalLogger(service: LogixiaLoggerService): void;
248
+ /** @internal Clear the global logger. Tests only. */
249
+ static _resetGlobalLogger(): void;
250
+ /**
251
+ * Returns the global LogixiaLoggerService instance that was created when the
252
+ * module booted. Useful for logging outside of NestJS DI — utility functions,
253
+ * plain scripts, decorators — without injecting the service everywhere.
254
+ *
255
+ * Returns `null` if called before `LogixiaLoggerModule.forRoot[Async]()` has
256
+ * been initialised (i.e. before the NestJS app has started).
257
+ *
258
+ * @example
259
+ * ```ts
260
+ * // some-util.ts
261
+ * import { LogixiaLoggerModule } from 'logixia/nest';
262
+ *
263
+ * export function doSomething() {
264
+ * LogixiaLoggerModule.getGlobalLogger()?.info('doing something');
265
+ * }
266
+ * ```
267
+ */
268
+ static getGlobalLogger(): LogixiaLoggerService | null;
269
+ configure(consumer: MiddlewareConsumer): void;
270
+ /**
271
+ * Configure the module with synchronous options
272
+ */
273
+ static forRoot(config?: Partial<LoggerConfig>): {
274
+ module: typeof LogixiaLoggerModule;
275
+ providers: ({
276
+ provide: string;
277
+ useValue: Partial<LoggerConfig<Record<string, number>>>;
278
+ useFactory?: never;
279
+ inject?: never;
280
+ } | {
281
+ provide: string;
282
+ useValue: TraceIdConfig;
283
+ useFactory?: never;
284
+ inject?: never;
285
+ } | {
286
+ provide: typeof LogixiaLoggerService;
287
+ useFactory: (loggerConfig: Partial<LoggerConfig>) => LogixiaLoggerService;
288
+ inject: string[];
289
+ useValue?: never;
290
+ } | {
291
+ provide: typeof KafkaTraceInterceptor;
292
+ useFactory: (traceConfig: TraceIdConfig | undefined) => KafkaTraceInterceptor;
293
+ inject: string[];
294
+ useValue?: never;
295
+ } | {
296
+ provide: typeof WebSocketTraceInterceptor;
297
+ useFactory: (traceConfig: TraceIdConfig | undefined) => WebSocketTraceInterceptor;
298
+ inject: string[];
299
+ useValue?: never;
300
+ })[];
301
+ exports: (string | typeof LogixiaLoggerService | typeof KafkaTraceInterceptor | typeof WebSocketTraceInterceptor)[];
302
+ global: boolean;
303
+ };
304
+ /**
305
+ * Configure the module with asynchronous options
306
+ */
307
+ static forRootAsync(options: LogixiaAsyncOptions): {
308
+ module: typeof LogixiaLoggerModule;
309
+ imports: (Type<any> | import("@nestjs/common").DynamicModule | Promise<import("@nestjs/common").DynamicModule> | import("@nestjs/common").ForwardReference<any>)[];
310
+ providers: ({
311
+ provide: string;
312
+ useFactory: (...args: unknown[]) => Promise<Partial<LoggerConfig>> | Partial<LoggerConfig>;
313
+ inject: (InjectionToken | OptionalFactoryDependency)[];
314
+ } | {
315
+ provide: string;
316
+ useFactory: (optionsFactory: LogixiaOptionsFactory) => Promise<Partial<LoggerConfig<Record<string, number>>>>;
317
+ inject: Type<LogixiaOptionsFactory>[];
318
+ } | {
319
+ provide: Type<LogixiaOptionsFactory>;
320
+ useClass: Type<LogixiaOptionsFactory>;
321
+ } | {
322
+ provide: string;
323
+ useFactory: (loggerConfig: Partial<LoggerConfig>) => TraceIdConfig;
324
+ inject: string[];
325
+ } | {
326
+ provide: typeof LogixiaLoggerService;
327
+ useFactory: (loggerConfig: Partial<LoggerConfig>) => LogixiaLoggerService;
328
+ inject: string[];
329
+ } | {
330
+ provide: typeof KafkaTraceInterceptor;
331
+ useFactory: (traceConfig: TraceIdConfig | undefined) => KafkaTraceInterceptor;
332
+ inject: string[];
333
+ } | {
334
+ provide: typeof WebSocketTraceInterceptor;
335
+ useFactory: (traceConfig: TraceIdConfig | undefined) => WebSocketTraceInterceptor;
336
+ inject: string[];
337
+ })[];
338
+ exports: (string | typeof LogixiaLoggerService | typeof KafkaTraceInterceptor | typeof WebSocketTraceInterceptor)[];
339
+ global: boolean;
340
+ };
341
+ /**
342
+ * Create feature-specific logger instances
343
+ */
344
+ static forFeature(context: string): {
345
+ module: typeof LogixiaLoggerModule;
346
+ providers: {
347
+ provide: string;
348
+ useFactory: (baseLogger: LogixiaLoggerService) => LogixiaLoggerService;
349
+ inject: (typeof LogixiaLoggerService)[];
350
+ }[];
351
+ exports: string[];
352
+ };
353
+ private static createAsyncProviders;
354
+ private static createAsyncOptionsProvider;
355
+ }
356
+ /**
357
+ * Inject the Logixia logger registered in the current NestJS DI container.
358
+ *
359
+ * Equivalent to `@Inject(LOGIXIA_LOGGER_TOKEN)` but without needing to import
360
+ * the internal token constant yourself.
361
+ *
362
+ * @example
363
+ * ```ts
364
+ * constructor(@InjectLogger() private readonly logger: LogixiaLoggerService) {}
365
+ * ```
366
+ */
367
+ export declare const InjectLogger: () => ParameterDecorator;
368
+ interface LogMethodOptions {
369
+ /**
370
+ * Log level to use for entry / exit messages.
371
+ * @default 'debug'
372
+ */
373
+ level?: LogLevelString;
374
+ /**
375
+ * Whether to log the arguments passed to the method.
376
+ * Disable for high-throughput hot paths.
377
+ * @default true
378
+ */
379
+ logArgs?: boolean;
380
+ /**
381
+ * Whether to log the return value of the method.
382
+ * @default false
383
+ */
384
+ logResult?: boolean;
385
+ /**
386
+ * Whether to log error stack traces for thrown errors.
387
+ * @default true
388
+ */
389
+ logErrors?: boolean;
390
+ /**
391
+ * Custom label used in log messages instead of the auto-detected class.method name.
392
+ */
393
+ label?: string;
394
+ }
395
+ /**
396
+ * Method decorator that auto-logs entry, exit, duration, and errors.
397
+ *
398
+ * Preserves the original method's sync/async contract: a synchronous method
399
+ * stays synchronous (returns its value directly, with logs emitted
400
+ * fire-and-forget), and an async method is awaited so exit/error logs reflect
401
+ * the resolved result. Attaches to the logger found on the class instance via a
402
+ * `logger` property (the conventional NestJS name).
403
+ *
404
+ * @example
405
+ * ```ts
406
+ * @LogMethod({ level: 'info', logArgs: true })
407
+ * async processPayment(orderId: string): Promise<void> { … }
408
+ * ```
409
+ */
410
+ export declare function LogMethod(options?: LogMethodOptions): MethodDecorator;
411
+ /**
412
+ * Global NestJS exception filter that converts any exception into the standard
413
+ * `LogixiaErrorResponse` wire format and logs it with full request context.
414
+ *
415
+ * Handles three exception types in priority order:
416
+ * 1. `LogixiaException` — typed fields used directly
417
+ * 2. NestJS `HttpException` — status + message extracted
418
+ * 3. Unknown / plain Error — falls back to 500 `server_error`
419
+ *
420
+ * **Debug block (off by default):**
421
+ * Responses never include the `debug` block (stack trace, service, duration)
422
+ * unless `exposeDebug: true` is passed in the filter options. The underlying
423
+ * `cause` is only added when `exposeCause: true` is also set. Enable explicitly
424
+ * for local development only, e.g.
425
+ * `new LogixiaExceptionFilter(logger, undefined, { exposeDebug: process.env.NODE_ENV === 'development' })`.
426
+ *
427
+ * **Trace ID headers:**
428
+ * `X-Trace-ID` and `X-Request-ID` are echoed back on every error response so
429
+ * clients can correlate with server logs.
430
+ *
431
+ * **Retry-After header:**
432
+ * Automatically added for `429` responses (`Retry-After: 60`).
433
+ *
434
+ * Register in `main.ts`:
435
+ * ```ts
436
+ * const logger = app.get(LogixiaLoggerService);
437
+ * app.useGlobalFilters(new LogixiaExceptionFilter(logger));
438
+ * ```
439
+ */
440
+ interface LogixiaExceptionFilterOptions {
441
+ /**
442
+ * Include the `debug` block (stack trace, service, duration) in error responses.
443
+ * @default false
444
+ */
445
+ exposeDebug?: boolean;
446
+ /**
447
+ * Include `debug.cause` as well. Requires `exposeDebug`.
448
+ * @default false
449
+ */
450
+ exposeCause?: boolean;
451
+ }
452
+ /** Injection token for {@link LogixiaExceptionFilterOptions}. */
453
+ export declare const LOGIXIA_EXCEPTION_FILTER_OPTIONS = "LOGIXIA_EXCEPTION_FILTER_OPTIONS";
454
+ export declare class LogixiaExceptionFilter implements ExceptionFilter {
455
+ private readonly _logger;
456
+ private readonly _traceConfig;
457
+ private readonly _options;
458
+ constructor(logger?: LogixiaLoggerService, loggerConfig?: Partial<LoggerConfig>, options?: LogixiaExceptionFilterOptions);
459
+ catch(exception: unknown, host: ArgumentsHost): void;
460
+ }
9
461
  declare global {
10
462
  namespace Express {
11
463
  interface Request {
@@ -13,12 +465,17 @@ declare global {
13
465
  }
14
466
  }
15
467
  }
16
- declare class TraceMiddleware implements NestMiddleware {
468
+ export declare class TraceMiddleware implements NestMiddleware {
17
469
  private readonly config?;
18
470
  private readonly ctx;
19
471
  constructor(config?: TraceIdConfig | undefined);
20
472
  use(req: Request, res: Response, next: NextFunction): void;
21
473
  }
22
- //#endregion
23
- export { KafkaTraceInterceptor, LOGIXIA_EXCEPTION_FILTER_OPTIONS, LOGIXIA_LOGGER_CONFIG, LOGIXIA_LOGGER_PREFIX, type LogixiaAsyncOptions, LogixiaExceptionFilter, type LogixiaExceptionFilterOptions, LogixiaLoggerModule, LogixiaLoggerService, type LogixiaOptionsFactory, type LogixiaServiceWith, type LogixiaServiceWithLevels, TraceMiddleware, WebSocketTraceInterceptor };
474
+ /**
475
+ * Create a new Logixia logger service for NestJS
476
+ * @param config - Logger configuration
477
+ * @returns LogixiaLoggerService instance
478
+ */
479
+ export declare function createLoggerService(config?: Partial<LoggerConfig>): LogixiaLoggerService;
480
+ export type { LogMethodOptions, LogixiaExceptionFilterOptions };
24
481
  //# sourceMappingURL=nest.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"nest.d.mts","names":[],"sources":["../src/core/trace.middleware.ts"],"sourcesContent":[],"mappings":";;;;;;;;QAmFyB,MAAA,CAAA;EAAgB,UAAA,OAAA,CAAA;IAxBD,UAAA,OAAA,CAAA;MAAc,OAAA,CAAA,EAAA,MAAA;;;;cAAzC,eAAA,YAA2B;;;uBAGY;WAqBzC,cAAc,gBAAgB"}
1
+ {"version":3,"file":"nest.d.mts","names":[],"sources":["../src/core/logitron-nestjs.service.ts","../src/core/kafka-trace.interceptor.ts","../src/core/websocket-trace.interceptor.ts","../src/core/logitron-logger.module.ts","../src/core/nestjs-extras.ts","../src/core/trace.middleware.ts","../src/nest.ts"],"mappings":";;;;;;;;;;KAiCK;;;;;;;;;KAWA,0BAA0B,gBAAgB,sCACnC,WAAW,WAAW,UAAU,gCAAgC,cACxE,iBACA,OAAO,4BACJ;;;;;;;;YAUK,yBAAyB,UAAU,aAAa,2BAC1D;EAA4B,cAAc;IACtC,UAAU,yBACR,uBAAuB,0BAA0B,KACjD,uBACF;;;;KAKD,yBAAyB,KAAK;EAAY;IAAiB,eAAe;;IAC3E,UAAU,yBACR,cAAc,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YAmCpB,mBAAmB,mBAAmB,2BAChD,mCAEI,KAAK,mBAAmB,QAAQ,GAAG,yBAAyB,yBAAyB,MACnF,iBAAiB,OAAO,4BAA4B;qBAS/C,gCAAgC;GAE1C;UAEO;UACA;UACA;EAEI,YAAA,SAAS;UA+Cb;;;;;;;EAyBR,IAAI,kBAAkB;;;;;;EAYhB,KAAK,iBAAiB,OAAO,0BAA0B;;;;;;;EAY7D,MAAM,kBAAkB,OAAO,MAAM,0BAA0B;;;;;;EAO/D,MAAM,kBAAkB,gBAAgB;;;;;;EAoCxC,KAAK,iBAAiB,MAAM,0BAA0B;;;;;;EAOtD,KAAK,kBAAkB;;;;;;EAmBvB,MAAM,iBAAiB,MAAM,0BAA0B;;;;;;EAOvD,MAAM,kBAAkB;;;;;;;EAoBxB,QAAQ,iBAAiB,MAAM,0BAA0B;;;;;;EAOzD,QAAQ,kBAAkB;;;;EAoBpB,MAAM,iBAAiB,OAAO,0BAA0B;;;;EAO9D,SAAS,eAAe,iBAAiB,OAAO,0BAA0B;EAM1E,KAAK;EAIC,QAAQ,gBAAgB;EAIxB,UAAU,GAAG,eAAe,UAAU,QAAQ,KAAK,QAAQ;EAMjE,WAAW;EAMX;EAIA,SAAS,OAAO;EAIhB,YAAY;EAMZ,MAAM,iBAAiB,OAAO,0BAA0B;EASxD;;MAKI;EAIE,SAAS;SAIR,OAAO,UAAU,aAAa,yBACnC,SAAS,IACR,yBAAyB;EAI5B,aAAa;UAML;UAUA;;;;;;;;;;;UCjaO;;EAEf;;EAEA;;EAEA;;qBAIW,iCAAiC;mBA+BzB;;;;;kBA1BH,SAAS;;SAOlB;mBAMU;mBACA;;;;;;;;;EAWf,YAAA,SAAS,eACQ;EAcnB,UAAU,SAAS,kBAAkB,MAAM,cAAc;;qBChE9C,qCAAqC;mBAC/B;mBACA;EAEL,YAAA,SAAS;EAcrB,UAAU,SAAS,kBAAkB,MAAM,cAAc;;qBCL9C;qBACA;qBACA;iBAcI,4BAA4B,KAAK;EAChD,cAAc,KAAK;EACnB,WAAW,KAAK;EAChB,iBAAiB,oBAAoB,QAAQ,QAAQ,iBAAiB,QAAQ;EAC9E,SAAS,MAAM,iBAAiB;;iBAIjB;EACf,wBAAwB,QAAQ,QAAQ,iBAAiB,QAAQ;;;;;qBAOtD,+BAA+B;UAClC;iBACO;;;;;;SAWR,eAAe;;;;;;;;;;;;;SAcf,iBAAiB,SAAS;;SAY1B;;;;;;;;;;;;;;;;;;;SAsBA,mBAAmB;EAI1B,UAAU,UAAU;;;;SAkCb,QAAQ,SAAS,QAAQ;;;;;;;;;;;;;;MAsBG,aAAA,cAAA,QAAQ,kBAAa;;;;;MAmCtB,aAAA,aAAA,8BAAyB;;;;;MAMzB,aAAA,aAAA,8BAAyB;;;;;;;;;;SAkBpD,aAAa,SAAS;;;;;MAjMN,gBAAA,oBAAc,QAAQ,QAAQ,iBAAiB,QAAQ;;;;MAuTvC,aAAA,gBAAA,0BAAqB,QAAA,QAAA,aAAA;;;;;;;MA9GzB,aAAA,cAAA,QAAQ,kBAAa;;;;MASrB,aAAA,cAAA,QAAQ,kBAAa;;;;MAqCtB,aAAA,aAAA,8BAAyB;;;;MAMzB,aAAA,aAAA,8BAAyB;;;;;;;;;SAkBpD,WAAW;;;;MAOe,aAAA,YAAA,yBAAoB;;;;;iBAUtC;iBAaA;;;;;;;;;;;;;qBCxRJ,oBAAmB;UAIf;;;;;EAKf,QAAQ;;;;;;EAMR;;;;;EAKA;;;;;EAKA;;;;EAIA;;;;;;;;;;;;;;;;;wBAkBc,UAAU,UAAS,mBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAgJ1C;;;;;EAKf;;;;;EAKA;;;qBAIW;qBAGA,kCAAkC;mBAC5B;mBACA;mBACA;EAKf,YAAA,SAAS,sBAGT,eAAe,QAAQ,eAGvB,UAAU;EAaZ,MAAM,oBAAoB,MAAM;;QCzP1B;YACI;cACE;MACR;;;;qBAOO,2BAA2B;mBAGG;mBAFxB;EAEwB,YAAA,SAAS;EAqBlD,IAAI,KAAK,SAAS,KAAK,UAAU,MAAM;;;;;;;wBCjDzB,oBAAoB,SAAS,QAAQ,gBAAgB"}