logixia 2.0.0 → 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 (239) hide show
  1. package/README.md +172 -2597
  2. package/dist/async-context-2mbUKhcl.mjs +132 -0
  3. package/dist/async-context-2mbUKhcl.mjs.map +1 -0
  4. package/dist/async-context-DUFMDYAr.js +148 -0
  5. package/dist/async-context-DUFMDYAr.js.map +1 -0
  6. package/dist/{azure-monitor.transport-CrvfHd9C.js → azure-monitor.transport-Bu4S2I2q.js} +32 -20
  7. package/dist/azure-monitor.transport-Bu4S2I2q.js.map +1 -0
  8. package/dist/{azure-monitor.transport-Cn_3Usvu.d.ts → azure-monitor.transport-Bvf7Xegt.d.ts} +3 -6
  9. package/dist/azure-monitor.transport-Bvf7Xegt.d.ts.map +1 -0
  10. package/dist/{azure-monitor.transport-CHnjVRF-.mjs → azure-monitor.transport-C1RWAumT.mjs} +27 -15
  11. package/dist/azure-monitor.transport-C1RWAumT.mjs.map +1 -0
  12. package/dist/{azure-monitor.transport-D7Da4RAb.d.mts → azure-monitor.transport-CbSHOnNX.d.mts} +3 -6
  13. package/dist/azure-monitor.transport-CbSHOnNX.d.mts.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-BvXLDPlV.mjs} +21 -7
  19. package/dist/batch-buffer-BvXLDPlV.mjs.map +1 -0
  20. package/dist/{batch-buffer-BY-mRWIK.js → batch-buffer-C7Am4Mw-.js} +53 -40
  21. package/dist/batch-buffer-C7Am4Mw-.js.map +1 -0
  22. package/dist/browser.d.mts +47 -27
  23. package/dist/browser.d.mts.map +1 -1
  24. package/dist/browser.d.ts +47 -27
  25. package/dist/browser.d.ts.map +1 -1
  26. package/dist/browser.js +464 -62
  27. package/dist/browser.js.map +1 -1
  28. package/dist/browser.mjs +465 -65
  29. package/dist/browser.mjs.map +1 -1
  30. package/dist/{builder-0gEzRopq.mjs → builder-DhNhvOkt.mjs} +307 -246
  31. package/dist/builder-DhNhvOkt.mjs.map +1 -0
  32. package/dist/{builder-D44QktIo.js → builder-yFvJrz7o.js} +435 -399
  33. package/dist/builder-yFvJrz7o.js.map +1 -0
  34. package/dist/cli/index.js +216 -125
  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-DsEq633o.d.ts → cloudwatch.transport-CQyT6U91.d.ts} +2 -6
  40. package/dist/cloudwatch.transport-CQyT6U91.d.ts.map +1 -0
  41. package/dist/{cloudwatch.transport-BO1ahxw-.js → cloudwatch.transport-Ch1Uae-0.js} +61 -36
  42. package/dist/cloudwatch.transport-Ch1Uae-0.js.map +1 -0
  43. package/dist/{cloudwatch.transport-UlyZFWMn.d.mts → cloudwatch.transport-CjVrI6S4.d.mts} +2 -6
  44. package/dist/cloudwatch.transport-CjVrI6S4.d.mts.map +1 -0
  45. package/dist/{cloudwatch.transport-DZ6ies7g.mjs → cloudwatch.transport-DZqF2xZO.mjs} +54 -28
  46. package/dist/cloudwatch.transport-DZqF2xZO.mjs.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 +15 -69
  52. package/dist/correlation.d.mts.map +1 -1
  53. package/dist/correlation.d.ts +15 -69
  54. package/dist/correlation.d.ts.map +1 -1
  55. package/dist/correlation.js +69 -20
  56. package/dist/correlation.js.map +1 -1
  57. package/dist/correlation.mjs +67 -17
  58. package/dist/correlation.mjs.map +1 -1
  59. package/dist/{entry-fields-BvOLFlJ4.js → entry-fields-BSLkzw18.js} +16 -13
  60. package/dist/entry-fields-BSLkzw18.js.map +1 -0
  61. package/dist/{entry-fields-BJkuPnIg.mjs → entry-fields-J1OBi24o.mjs} +11 -7
  62. package/dist/entry-fields-J1OBi24o.mjs.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-B7oc97sG.d.ts → gcp.transport-BCIvdFV-.d.ts} +5 -8
  68. package/dist/gcp.transport-BCIvdFV-.d.ts.map +1 -0
  69. package/dist/{gcp.transport-GrJurKo8.d.mts → gcp.transport-D9SdLPwP.d.mts} +5 -8
  70. package/dist/gcp.transport-D9SdLPwP.d.mts.map +1 -0
  71. package/dist/{gcp.transport-DBX5TPIy.mjs → gcp.transport-DVCmnA3b.mjs} +59 -16
  72. package/dist/gcp.transport-DVCmnA3b.mjs.map +1 -0
  73. package/dist/{gcp.transport-CHV8MGgz.js → gcp.transport-Dy2Lf8FI.js} +64 -22
  74. package/dist/gcp.transport-Dy2Lf8FI.js.map +1 -0
  75. package/dist/http-shapes-BnBkJcid.d.mts +32 -0
  76. package/dist/http-shapes-BnBkJcid.d.mts.map +1 -0
  77. package/dist/http-shapes-BnBkJcid.d.ts +32 -0
  78. package/dist/http-shapes-BnBkJcid.d.ts.map +1 -0
  79. package/dist/{index-3mw5gaCw.d.mts → index-BSTtFcQ6.d.mts} +142 -13
  80. package/dist/index-BSTtFcQ6.d.mts.map +1 -0
  81. package/dist/{index-DhIoploR.d.ts → index-CFDGkI8n.d.ts} +142 -13
  82. package/dist/index-CFDGkI8n.d.ts.map +1 -0
  83. package/dist/index.d.mts +114 -217
  84. package/dist/index.d.mts.map +1 -1
  85. package/dist/index.d.ts +113 -216
  86. package/dist/index.d.ts.map +1 -1
  87. package/dist/index.js +182 -279
  88. package/dist/index.js.map +1 -1
  89. package/dist/index.mjs +160 -256
  90. package/dist/index.mjs.map +1 -1
  91. package/dist/internal-log-Bg4V1cPg.mjs +170 -0
  92. package/dist/internal-log-Bg4V1cPg.mjs.map +1 -0
  93. package/dist/internal-log-By4Govmu.js +223 -0
  94. package/dist/internal-log-By4Govmu.js.map +1 -0
  95. package/dist/{logitron-logger-UVeN-mQm.d.ts → logitron-logger-D22Yb61K.d.mts} +121 -100
  96. package/dist/logitron-logger-D22Yb61K.d.mts.map +1 -0
  97. package/dist/{logitron-logger-BFDSO8Io.d.mts → logitron-logger-D_MYYrQt.d.ts} +121 -100
  98. package/dist/logitron-logger-D_MYYrQt.d.ts.map +1 -0
  99. package/dist/middleware.d.mts +13 -28
  100. package/dist/middleware.d.mts.map +1 -1
  101. package/dist/middleware.d.ts +13 -28
  102. package/dist/middleware.d.ts.map +1 -1
  103. package/dist/middleware.js +20 -81
  104. package/dist/middleware.js.map +1 -1
  105. package/dist/middleware.mjs +17 -79
  106. package/dist/middleware.mjs.map +1 -1
  107. package/dist/nest.d.mts +37 -48
  108. package/dist/nest.d.mts.map +1 -1
  109. package/dist/nest.d.ts +37 -48
  110. package/dist/nest.d.ts.map +1 -1
  111. package/dist/nest.js +124 -135
  112. package/dist/nest.js.map +1 -1
  113. package/dist/nest.mjs +69 -78
  114. package/dist/nest.mjs.map +1 -1
  115. package/dist/{transport.manager-BiuCAJd2.mjs → otel-Dt5riXuE.mjs} +275 -117
  116. package/dist/otel-Dt5riXuE.mjs.map +1 -0
  117. package/dist/{transport.manager-CXbKKdVE.js → otel-DyeH6DVR.js} +373 -178
  118. package/dist/otel-DyeH6DVR.js.map +1 -0
  119. package/dist/own-property-BWkibepN.js +40 -0
  120. package/dist/own-property-BWkibepN.js.map +1 -0
  121. package/dist/own-property-CjFw9qwZ.mjs +29 -0
  122. package/dist/own-property-CjFw9qwZ.mjs.map +1 -0
  123. package/dist/{trace.utils-CvXgaiQT.mjs → request-trace-BgNykH9M.mjs} +40 -9
  124. package/dist/request-trace-BgNykH9M.mjs.map +1 -0
  125. package/dist/{trace.utils-DpBOLDtq.js → request-trace-ByujsUZk.js} +117 -77
  126. package/dist/request-trace-ByujsUZk.js.map +1 -0
  127. package/dist/rolldown-runtime-D3PmRqjj.mjs +4 -0
  128. package/dist/{safe-stringify-DJ66tW5I.mjs → safe-stringify-B5p5ktFe.mjs} +39 -15
  129. package/dist/safe-stringify-B5p5ktFe.mjs.map +1 -0
  130. package/dist/{safe-stringify-DWo3aZp_.js → safe-stringify-J3sh-7YM.js} +59 -36
  131. package/dist/safe-stringify-J3sh-7YM.js.map +1 -0
  132. package/dist/{search-C4V0OMEn.js → search-CRjhHxe9.js} +319 -92
  133. package/dist/search-CRjhHxe9.js.map +1 -0
  134. package/dist/{search-CNh9uVwR.d.ts → search-DA3ft3X5.d.mts} +5 -22
  135. package/dist/search-DA3ft3X5.d.mts.map +1 -0
  136. package/dist/{search-BFbu_oVn.mjs → search-DAXKE-P9.mjs} +289 -62
  137. package/dist/search-DAXKE-P9.mjs.map +1 -0
  138. package/dist/{search-DXANsQ2n.d.mts → search-DEl3Pe47.d.ts} +5 -22
  139. package/dist/search-DEl3Pe47.d.ts.map +1 -0
  140. package/dist/search.d.mts +2 -4
  141. package/dist/search.d.ts +2 -4
  142. package/dist/search.js +3 -4
  143. package/dist/search.mjs +1 -4
  144. package/dist/secret-config-CmK2wVkr.js +272 -0
  145. package/dist/secret-config-CmK2wVkr.js.map +1 -0
  146. package/dist/secret-config-Dhb6pqTU.mjs +210 -0
  147. package/dist/secret-config-Dhb6pqTU.mjs.map +1 -0
  148. package/dist/{slack.transport-CXjQYOes.d.ts → slack.transport-BDyENuR0.d.mts} +56 -9
  149. package/dist/slack.transport-BDyENuR0.d.mts.map +1 -0
  150. package/dist/{slack.transport-Bzw7sucI.mjs → slack.transport-BTEwsREY.mjs} +263 -31
  151. package/dist/slack.transport-BTEwsREY.mjs.map +1 -0
  152. package/dist/{slack.transport-BZzoXDPn.d.mts → slack.transport-C6E0l4kw.d.ts} +56 -9
  153. package/dist/slack.transport-C6E0l4kw.d.ts.map +1 -0
  154. package/dist/{slack.transport-BfJRouB2.js → slack.transport-UbYvOdKx.js} +286 -42
  155. package/dist/slack.transport-UbYvOdKx.js.map +1 -0
  156. package/dist/testing.d.mts +13 -11
  157. package/dist/testing.d.mts.map +1 -1
  158. package/dist/testing.d.ts +13 -11
  159. package/dist/testing.d.ts.map +1 -1
  160. package/dist/testing.js +41 -7
  161. package/dist/testing.js.map +1 -1
  162. package/dist/testing.mjs +40 -6
  163. package/dist/testing.mjs.map +1 -1
  164. package/dist/{transport.types-CGoHpWQR.d.ts → transport.types-CzJq4IrF.d.mts} +14 -5
  165. package/dist/transport.types-CzJq4IrF.d.mts.map +1 -0
  166. package/dist/{transport.types-BMnurPcc.d.mts → transport.types-CzJq4IrF.d.ts} +14 -5
  167. package/dist/transport.types-CzJq4IrF.d.ts.map +1 -0
  168. package/dist/transports.d.mts +39 -41
  169. package/dist/transports.d.mts.map +1 -1
  170. package/dist/transports.d.ts +39 -41
  171. package/dist/transports.d.ts.map +1 -1
  172. package/dist/transports.js +19 -22
  173. package/dist/transports.mjs +7 -13
  174. package/dist/worker-entry.js +438 -107
  175. package/dist/worker.d.mts +1 -2
  176. package/dist/worker.d.ts +1 -2
  177. package/dist/worker.js +3 -4
  178. package/dist/worker.mjs +1 -4
  179. package/dist/{worker.transport-JvGPog3C.d.mts → worker.transport-B9mCQSM1.d.ts} +7 -6
  180. package/dist/worker.transport-B9mCQSM1.d.ts.map +1 -0
  181. package/dist/{worker.transport-CdzSZJmw.d.ts → worker.transport-Bl8lFRck.d.mts} +7 -6
  182. package/dist/worker.transport-Bl8lFRck.d.mts.map +1 -0
  183. package/dist/{worker.transport-lPxO2MVL.mjs → worker.transport-BmmOKb1-.mjs} +43 -10
  184. package/dist/worker.transport-BmmOKb1-.mjs.map +1 -0
  185. package/dist/{worker.transport-BdPxu3PN.js → worker.transport-DxxbqQCG.js} +48 -15
  186. package/dist/worker.transport-DxxbqQCG.js.map +1 -0
  187. package/package.json +51 -75
  188. package/dist/async-context-BzJrbfQs.mjs +0 -72
  189. package/dist/async-context-BzJrbfQs.mjs.map +0 -1
  190. package/dist/async-context-DyQQYq3I.js +0 -92
  191. package/dist/async-context-DyQQYq3I.js.map +0 -1
  192. package/dist/azure-monitor.transport-CHnjVRF-.mjs.map +0 -1
  193. package/dist/azure-monitor.transport-Cn_3Usvu.d.ts.map +0 -1
  194. package/dist/azure-monitor.transport-CrvfHd9C.js.map +0 -1
  195. package/dist/azure-monitor.transport-D7Da4RAb.d.mts.map +0 -1
  196. package/dist/batch-buffer-BY-mRWIK.js.map +0 -1
  197. package/dist/batch-buffer-PGvSgbmd.mjs.map +0 -1
  198. package/dist/builder-0gEzRopq.mjs.map +0 -1
  199. package/dist/builder-D44QktIo.js.map +0 -1
  200. package/dist/chunk-DLSkYcPk.mjs +0 -7
  201. package/dist/chunk-nOFOJqeH.js +0 -30
  202. package/dist/cloudwatch.transport-BO1ahxw-.js.map +0 -1
  203. package/dist/cloudwatch.transport-DZ6ies7g.mjs.map +0 -1
  204. package/dist/cloudwatch.transport-DsEq633o.d.ts.map +0 -1
  205. package/dist/cloudwatch.transport-UlyZFWMn.d.mts.map +0 -1
  206. package/dist/entry-fields-BJkuPnIg.mjs.map +0 -1
  207. package/dist/entry-fields-BvOLFlJ4.js.map +0 -1
  208. package/dist/gcp.transport-B7oc97sG.d.ts.map +0 -1
  209. package/dist/gcp.transport-CHV8MGgz.js.map +0 -1
  210. package/dist/gcp.transport-DBX5TPIy.mjs.map +0 -1
  211. package/dist/gcp.transport-GrJurKo8.d.mts.map +0 -1
  212. package/dist/index-3mw5gaCw.d.mts.map +0 -1
  213. package/dist/index-DhIoploR.d.ts.map +0 -1
  214. package/dist/internal-log-BUJYMZbE.js +0 -70
  215. package/dist/internal-log-BUJYMZbE.js.map +0 -1
  216. package/dist/internal-log-Cm8SOWSV.mjs +0 -52
  217. package/dist/internal-log-Cm8SOWSV.mjs.map +0 -1
  218. package/dist/logitron-logger-BFDSO8Io.d.mts.map +0 -1
  219. package/dist/logitron-logger-UVeN-mQm.d.ts.map +0 -1
  220. package/dist/safe-stringify-DJ66tW5I.mjs.map +0 -1
  221. package/dist/safe-stringify-DWo3aZp_.js.map +0 -1
  222. package/dist/search-BFbu_oVn.mjs.map +0 -1
  223. package/dist/search-C4V0OMEn.js.map +0 -1
  224. package/dist/search-CNh9uVwR.d.ts.map +0 -1
  225. package/dist/search-DXANsQ2n.d.mts.map +0 -1
  226. package/dist/slack.transport-BZzoXDPn.d.mts.map +0 -1
  227. package/dist/slack.transport-BfJRouB2.js.map +0 -1
  228. package/dist/slack.transport-Bzw7sucI.mjs.map +0 -1
  229. package/dist/slack.transport-CXjQYOes.d.ts.map +0 -1
  230. package/dist/trace.utils-CvXgaiQT.mjs.map +0 -1
  231. package/dist/trace.utils-DpBOLDtq.js.map +0 -1
  232. package/dist/transport.manager-BiuCAJd2.mjs.map +0 -1
  233. package/dist/transport.manager-CXbKKdVE.js.map +0 -1
  234. package/dist/transport.types-BMnurPcc.d.mts.map +0 -1
  235. package/dist/transport.types-CGoHpWQR.d.ts.map +0 -1
  236. package/dist/worker.transport-BdPxu3PN.js.map +0 -1
  237. package/dist/worker.transport-CdzSZJmw.d.ts.map +0 -1
  238. package/dist/worker.transport-JvGPog3C.d.mts.map +0 -1
  239. package/dist/worker.transport-lPxO2MVL.mjs.map +0 -1
@@ -1,12 +1,43 @@
1
- const require_chunk = require('./chunk-nOFOJqeH.js');
2
- const require_internal_log = require('./internal-log-BUJYMZbE.js');
3
- const require_safe_stringify = require('./safe-stringify-DWo3aZp_.js');
4
- const require_batch_buffer = require('./batch-buffer-BY-mRWIK.js');
5
- const require_entry_fields = require('./entry-fields-BvOLFlJ4.js');
1
+ const require_secret_config = require("./secret-config-CmK2wVkr.js");
2
+ const require_internal_log = require("./internal-log-By4Govmu.js");
3
+ const require_safe_stringify = require("./safe-stringify-J3sh-7YM.js");
4
+ const require_entry_fields = require("./entry-fields-BSLkzw18.js");
5
+ const require_batch_buffer = require("./batch-buffer-C7Am4Mw-.js");
6
6
  let node_https = require("node:https");
7
- node_https = require_chunk.__toESM(node_https);
8
-
9
- //#region src/transports/gcp.transport.ts
7
+ node_https = require_secret_config.__toESM(node_https);
8
+ // src/transports/gcp.transport.ts
9
+ /**
10
+ * logixia — Google Cloud Logging (Stackdriver) transport
11
+ *
12
+ * Maps logixia log entries to the GCP Logging REST API format:
13
+ * - Maps `level` → `severity` (INFO, WARNING, ERROR, CRITICAL…)
14
+ * - Injects `logging.googleapis.com/trace` for Cloud Trace correlation
15
+ * - Sets `traceSampled: true` whenever a trace id is present
16
+ * (`logging.googleapis.com/spanId` and `sourceLocation` are not populated)
17
+ * - Supports structured `jsonPayload` and plain `textPayload`
18
+ *
19
+ * Auth: the metadata server on GCE/GKE/Cloud Run, or a service-account key passed
20
+ * as `credentials`. The `GOOGLE_APPLICATION_CREDENTIALS` key-file variable is not
21
+ * read; full ADC is not supported.
22
+ *
23
+ * @example
24
+ * ```ts
25
+ * import { createLogger } from 'logixia';
26
+ * import { GCPTransport } from 'logixia/gcp';
27
+ *
28
+ * const logger = createLogger({
29
+ * transports: {
30
+ * custom: [
31
+ * new GCPTransport({
32
+ * projectId: process.env.GOOGLE_CLOUD_PROJECT,
33
+ * logName: 'projects/my-project/logs/api',
34
+ * resource: { type: 'gce_instance', labels: { instance_id: '123' } },
35
+ * }),
36
+ * ],
37
+ * },
38
+ * });
39
+ * ```
40
+ */
10
41
  function toGcpSeverity(level) {
11
42
  switch (level.toLowerCase()) {
12
43
  case "trace":
@@ -31,6 +62,7 @@ var GCPTransport = class {
31
62
  this.flushTimer = null;
32
63
  this.accessToken = null;
33
64
  this.tokenExpiry = 0;
65
+ require_secret_config.protectSecrets(this, ["credentials", "accessToken"]);
34
66
  this.projectId = config.projectId ?? process.env["GOOGLE_CLOUD_PROJECT"] ?? process.env["GCLOUD_PROJECT"] ?? "unknown-project";
35
67
  this.logName = config.logName ?? `projects/${this.projectId}/logs/logixia`;
36
68
  this.resource = config.resource ?? { type: "global" };
@@ -38,12 +70,13 @@ var GCPTransport = class {
38
70
  this.batchSize = config.batchSize ?? 200;
39
71
  this.flushInterval = config.flushIntervalMs ?? 5e3;
40
72
  this.level = config.level;
41
- this.requestTimeoutMs = config.requestTimeoutMs ?? require_batch_buffer.DEFAULT_REQUEST_TIMEOUT_MS;
73
+ this.requestTimeoutMs = config.requestTimeoutMs ?? 1e4;
42
74
  this.buffer = new require_batch_buffer.BatchBuffer({
43
75
  name: "GCPTransport",
44
76
  batchSize: this.batchSize,
45
- maxBufferSize: config.maxBufferSize ?? require_batch_buffer.DEFAULT_MAX_BUFFER_SIZE,
46
- send: (entries) => this.writeEntries(entries)
77
+ maxBufferSize: config.maxBufferSize ?? 1e4,
78
+ send: (entries) => this.writeEntries(entries),
79
+ secrets: () => this.secretValues()
47
80
  });
48
81
  this.flushTimer = setInterval(() => {
49
82
  this.flush().catch(() => {});
@@ -93,7 +126,7 @@ var GCPTransport = class {
93
126
  const token = await this.fetchFromMetadataServer();
94
127
  if (token) {
95
128
  this.accessToken = token;
96
- this.tokenExpiry = Date.now() + 3300 * 1e3;
129
+ this.tokenExpiry = Date.now() + 33e5;
97
130
  return this.accessToken;
98
131
  }
99
132
  } catch {}
@@ -101,7 +134,7 @@ var GCPTransport = class {
101
134
  const token = await this.fetchServiceAccountToken();
102
135
  if (token) {
103
136
  this.accessToken = token;
104
- this.tokenExpiry = Date.now() + 3300 * 1e3;
137
+ this.tokenExpiry = Date.now() + 33e5;
105
138
  return this.accessToken;
106
139
  }
107
140
  } catch (err) {
@@ -167,6 +200,15 @@ var GCPTransport = class {
167
200
  label: "GCP token request"
168
201
  }).then((res) => JSON.parse(res.body).access_token ?? null, () => null);
169
202
  }
203
+ secretValues(token) {
204
+ var _this$credentials, _this$credentials2;
205
+ return [
206
+ ...((_this$credentials = this.credentials) === null || _this$credentials === void 0 ? void 0 : _this$credentials.private_key.split("\n")) ?? [],
207
+ (_this$credentials2 = this.credentials) === null || _this$credentials2 === void 0 ? void 0 : _this$credentials2.private_key,
208
+ this.accessToken ?? void 0,
209
+ token
210
+ ];
211
+ }
170
212
  async writeEntries(entries) {
171
213
  const token = await this.getAccessToken();
172
214
  if (!token) throw new Error("GCPTransport: no access token available");
@@ -183,16 +225,16 @@ var GCPTransport = class {
183
225
  },
184
226
  body,
185
227
  timeoutMs: this.requestTimeoutMs,
186
- label: "GCP Logging API"
228
+ label: "GCP Logging API",
229
+ secrets: () => this.secretValues(token)
187
230
  });
188
231
  }
189
232
  };
190
-
191
- //#endregion
192
- Object.defineProperty(exports, 'GCPTransport', {
193
- enumerable: true,
194
- get: function () {
195
- return GCPTransport;
196
- }
233
+ Object.defineProperty(exports, "GCPTransport", {
234
+ enumerable: true,
235
+ get: function() {
236
+ return GCPTransport;
237
+ }
197
238
  });
198
- //# sourceMappingURL=gcp.transport-CHV8MGgz.js.map
239
+
240
+ //# sourceMappingURL=gcp.transport-Dy2Lf8FI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gcp.transport-Dy2Lf8FI.js","names":["BatchBuffer","mergeCoreFields","https","httpRequest","stringifyForLog"],"sources":["../src/transports/gcp.transport.ts"],"sourcesContent":["/**\n * logixia — Google Cloud Logging (Stackdriver) transport\n *\n * Maps logixia log entries to the GCP Logging REST API format:\n * - Maps `level` → `severity` (INFO, WARNING, ERROR, CRITICAL…)\n * - Injects `logging.googleapis.com/trace` for Cloud Trace correlation\n * - Sets `traceSampled: true` whenever a trace id is present\n * (`logging.googleapis.com/spanId` and `sourceLocation` are not populated)\n * - Supports structured `jsonPayload` and plain `textPayload`\n *\n * Auth: the metadata server on GCE/GKE/Cloud Run, or a service-account key passed\n * as `credentials`. The `GOOGLE_APPLICATION_CREDENTIALS` key-file variable is not\n * read; full ADC is not supported.\n *\n * @example\n * ```ts\n * import { createLogger } from 'logixia';\n * import { GCPTransport } from 'logixia/gcp';\n *\n * const logger = createLogger({\n * transports: {\n * custom: [\n * new GCPTransport({\n * projectId: process.env.GOOGLE_CLOUD_PROJECT,\n * logName: 'projects/my-project/logs/api',\n * resource: { type: 'gce_instance', labels: { instance_id: '123' } },\n * }),\n * ],\n * },\n * });\n * ```\n */\n\nimport * as https from 'node:https';\n\nimport type { IAsyncTransport, TransportLogEntry } from '../types/transport.types';\nimport { internalError } from '../utils/internal-log';\nimport { stringifyForLog } from '../utils/safe-stringify';\nimport {\n BatchBuffer,\n DEFAULT_MAX_BUFFER_SIZE,\n DEFAULT_REQUEST_TIMEOUT_MS,\n httpRequest,\n} from './batch-buffer';\nimport { mergeCoreFields } from './entry-fields';\nimport { protectSecrets } from './secret-config';\n\nexport interface GCPMonitoredResource {\n type: string;\n labels?: Record<string, string>;\n}\n\nexport interface GCPTransportConfig {\n /** GCP project ID. Falls back to `GOOGLE_CLOUD_PROJECT` or `GCLOUD_PROJECT` env vars. */\n projectId?: string;\n /**\n * Full log name, e.g. `'projects/my-project/logs/api'`.\n * If omitted, defaults to `projects/{projectId}/logs/logixia`.\n */\n logName?: string;\n /** Monitored resource descriptor. Defaults to `global`. */\n resource?: GCPMonitoredResource;\n /**\n * Service account key JSON (parsed). If omitted, only the metadata server\n * (GCE/GKE/Cloud Run) is tried; the key-file env var is not read.\n */\n credentials?: {\n client_email: string;\n private_key: string;\n };\n /** Number of entries to batch. @default 200 */\n batchSize?: number;\n /** Flush interval in ms. @default 5000 */\n flushIntervalMs?: number;\n /** Abort a request that has not finished after this many ms. @default 10000 */\n requestTimeoutMs?: number;\n /** Max buffered entries; the oldest are dropped past this. @default 10000 */\n maxBufferSize?: number;\n level?: string;\n}\n\ntype GcpSeverity =\n | 'DEFAULT'\n | 'DEBUG'\n | 'INFO'\n | 'NOTICE'\n | 'WARNING'\n | 'ERROR'\n | 'CRITICAL'\n | 'ALERT'\n | 'EMERGENCY';\n\nfunction toGcpSeverity(level: string): GcpSeverity {\n switch (level.toLowerCase()) {\n case 'trace':\n case 'verbose':\n case 'debug':\n return 'DEBUG';\n case 'info':\n case 'log':\n return 'INFO';\n case 'warn':\n case 'warning':\n return 'WARNING';\n case 'error':\n return 'ERROR';\n case 'critical':\n case 'fatal':\n return 'CRITICAL';\n default:\n return 'DEFAULT';\n }\n}\n\n/**\n * Google Cloud Logging transport with trace correlation and GCP severity mapping.\n */\nexport class GCPTransport implements IAsyncTransport {\n public readonly name = 'gcp';\n public readonly batchSize: number;\n public readonly flushInterval: number;\n public readonly level: string | undefined;\n\n private readonly buffer: BatchBuffer<TransportLogEntry>;\n private readonly requestTimeoutMs: number;\n private flushTimer: NodeJS.Timeout | null = null;\n private accessToken: string | null = null;\n private tokenExpiry = 0;\n\n private readonly projectId: string;\n private readonly logName: string;\n private readonly resource: GCPMonitoredResource;\n private readonly credentials: { client_email: string; private_key: string } | undefined;\n\n constructor(config: GCPTransportConfig) {\n protectSecrets(this, ['credentials', 'accessToken']);\n this.projectId =\n config.projectId ??\n process.env['GOOGLE_CLOUD_PROJECT'] ??\n process.env['GCLOUD_PROJECT'] ??\n 'unknown-project';\n this.logName = config.logName ?? `projects/${this.projectId}/logs/logixia`;\n this.resource = config.resource ?? { type: 'global' };\n this.credentials = config.credentials;\n this.batchSize = config.batchSize ?? 200;\n this.flushInterval = config.flushIntervalMs ?? 5000;\n this.level = config.level;\n this.requestTimeoutMs = config.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS;\n this.buffer = new BatchBuffer<TransportLogEntry>({\n name: 'GCPTransport',\n batchSize: this.batchSize,\n maxBufferSize: config.maxBufferSize ?? DEFAULT_MAX_BUFFER_SIZE,\n send: (entries) => this.writeEntries(entries),\n secrets: () => this.secretValues(),\n });\n\n this.flushTimer = setInterval(() => {\n this.flush().catch(() => {});\n }, this.flushInterval);\n if (this.flushTimer.unref) this.flushTimer.unref();\n }\n\n write(entry: TransportLogEntry): void {\n this.buffer.push(entry);\n this.buffer.flushIfFull();\n }\n\n flush(): Promise<void> {\n return this.buffer.flush();\n }\n\n /**\n * Flush remaining entries and stop the interval timer on shutdown. Without\n * this the manager's close() skipped the transport (close was undefined) and\n * buffered entries were lost on deploy. Waits for any in-flight send first.\n */\n async close(): Promise<void> {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n await this.buffer.close();\n }\n\n private buildLogEntry(entry: TransportLogEntry): Record<string, unknown> {\n const gcpEntry: Record<string, unknown> = {\n logName: this.logName,\n resource: this.resource,\n severity: toGcpSeverity(entry.level),\n timestamp: entry.timestamp ?? new Date().toISOString(),\n jsonPayload: mergeCoreFields(\n { message: entry.message, appName: entry.appName, context: entry.context },\n entry.data\n ),\n };\n\n // GCP Cloud Trace correlation\n if (entry.traceId) {\n gcpEntry['trace'] = `projects/${this.projectId}/traces/${entry.traceId}`;\n gcpEntry['traceSampled'] = true;\n }\n\n return gcpEntry;\n }\n\n private async getAccessToken(): Promise<string | null> {\n if (this.accessToken && Date.now() < this.tokenExpiry) return this.accessToken;\n\n // Try ADC metadata server (GCE/GKE/Cloud Run)\n try {\n const token = await this.fetchFromMetadataServer();\n if (token) {\n this.accessToken = token;\n this.tokenExpiry = Date.now() + 55 * 60 * 1000; // 55 minutes\n return this.accessToken;\n }\n } catch {\n /* fall through to service account */\n }\n\n // Try service account key\n if (this.credentials) {\n try {\n const token = await this.fetchServiceAccountToken();\n if (token) {\n this.accessToken = token;\n this.tokenExpiry = Date.now() + 55 * 60 * 1000;\n return this.accessToken;\n }\n } catch (err) {\n internalError('GCPTransport service account token error', err);\n }\n }\n\n return null;\n }\n\n private fetchFromMetadataServer(): Promise<string | null> {\n return new Promise((resolve, reject) => {\n const req = https.request(\n {\n hostname: 'metadata.google.internal',\n path: '/computeMetadata/v1/instance/service-accounts/default/token',\n headers: { 'Metadata-Flavor': 'Google' },\n timeout: 3000,\n },\n (res) => {\n let raw = '';\n res.on('data', (c: Buffer) => (raw += c.toString()));\n res.on('end', () => {\n if (res.statusCode === 200) {\n try {\n const parsed = JSON.parse(raw) as { access_token?: string };\n resolve(parsed.access_token ?? null);\n } catch {\n resolve(null);\n }\n } else {\n resolve(null);\n }\n });\n }\n );\n req.on('error', reject);\n req.on('timeout', () => {\n req.destroy();\n reject(new Error('metadata timeout'));\n });\n req.end();\n });\n }\n\n private fetchServiceAccountToken(): Promise<string | null> {\n // Minimal JWT creation for service account — only for environments without\n // the full Google Auth Library. For production workloads, prefer ADC.\n if (!this.credentials) return Promise.resolve(null);\n\n const iat = Math.floor(Date.now() / 1000);\n const exp = iat + 3600;\n const scope = 'https://www.googleapis.com/auth/logging.write';\n\n const header = Buffer.from(JSON.stringify({ alg: 'RS256', typ: 'JWT' })).toString('base64url');\n const payload = Buffer.from(\n JSON.stringify({\n iss: this.credentials.client_email,\n scope,\n aud: 'https://oauth2.googleapis.com/token',\n exp,\n iat,\n })\n ).toString('base64url');\n\n const signingInput = `${header}.${payload}`;\n\n let signature: string;\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const sign = require('node:crypto').createSign('RSA-SHA256');\n sign.update(signingInput);\n signature = sign.sign(this.credentials.private_key, 'base64url') as string;\n } catch {\n return Promise.resolve(null);\n }\n\n const jwt = `${signingInput}.${signature}`;\n const body = `grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&assertion=${jwt}`;\n\n return httpRequest({\n url: new URL('https://oauth2.googleapis.com/token'),\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body,\n timeoutMs: this.requestTimeoutMs,\n label: 'GCP token request',\n }).then(\n (res) => (JSON.parse(res.body) as { access_token?: string }).access_token ?? null,\n () => null\n );\n }\n\n private secretValues(token?: string): (string | undefined)[] {\n return [\n ...(this.credentials?.private_key.split('\\n') ?? []),\n this.credentials?.private_key,\n this.accessToken ?? undefined,\n token,\n ];\n }\n\n private async writeEntries(entries: TransportLogEntry[]): Promise<void> {\n const token = await this.getAccessToken();\n if (!token) {\n throw new Error('GCPTransport: no access token available');\n }\n\n const body = stringifyForLog({\n logName: this.logName,\n resource: this.resource,\n entries: entries.map((e) => this.buildLogEntry(e)),\n });\n\n await httpRequest({\n url: new URL('https://logging.googleapis.com/v2/entries:write'),\n headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' },\n body,\n timeoutMs: this.requestTimeoutMs,\n label: 'GCP Logging API',\n secrets: () => this.secretValues(token),\n });\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4FA,SAAS,cAAc,OAA4B;CACjD,QAAQ,MAAM,YAAY,GAA1B;EACE,KAAK;EACL,KAAK;EACL,KAAK,SACH,OAAO;EACT,KAAK;EACL,KAAK,OACH,OAAO;EACT,KAAK;EACL,KAAK,WACH,OAAO;EACT,KAAK,SACH,OAAO;EACT,KAAK;EACL,KAAK,SACH,OAAO;EACT,SACE,OAAO;CACX;AACF;;;;AAKA,IAAa,eAAb,MAAqD;CAiBnD,YAAY,QAA4B;EAhBjB,KAAA,OAAA;EAOqB,KAAA,aAAA;EACP,KAAA,cAAA;EACf,KAAA,cAAA;EAQpB,sBAAA,eAAe,MAAM,CAAC,eAAe,aAAa,CAAC;EACnD,KAAK,YACH,OAAO,aACP,QAAQ,IAAI,2BACZ,QAAQ,IAAI,qBACZ;EACF,KAAK,UAAU,OAAO,WAAW,YAAY,KAAK,UAAU;EAC5D,KAAK,WAAW,OAAO,YAAY,EAAE,MAAM,SAAS;EACpD,KAAK,cAAc,OAAO;EAC1B,KAAK,YAAY,OAAO,aAAa;EACrC,KAAK,gBAAgB,OAAO,mBAAmB;EAC/C,KAAK,QAAQ,OAAO;EACpB,KAAK,mBAAmB,OAAO,oBAAA;EAC/B,KAAK,SAAS,IAAIA,qBAAAA,YAA+B;GAC/C,MAAM;GACN,WAAW,KAAK;GAChB,eAAe,OAAO,iBAAA;GACtB,OAAO,YAAY,KAAK,aAAa,OAAO;GAC5C,eAAe,KAAK,aAAa;EACnC,CAAC;EAED,KAAK,aAAa,kBAAkB;GAClC,KAAK,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;EAC7B,GAAG,KAAK,aAAa;EACrB,IAAI,KAAK,WAAW,OAAO,KAAK,WAAW,MAAM;CACnD;CAEA,MAAM,OAAgC;EACpC,KAAK,OAAO,KAAK,KAAK;EACtB,KAAK,OAAO,YAAY;CAC1B;CAEA,QAAuB;EACrB,OAAO,KAAK,OAAO,MAAM;CAC3B;;;;;;CAOA,MAAM,QAAuB;EAC3B,IAAI,KAAK,YAAY;GACnB,cAAc,KAAK,UAAU;GAC7B,KAAK,aAAa;EACpB;EACA,MAAM,KAAK,OAAO,MAAM;CAC1B;CAEA,cAAsB,OAAmD;EACvE,MAAM,WAAoC;GACxC,SAAS,KAAK;GACd,UAAU,KAAK;GACf,UAAU,cAAc,MAAM,KAAK;GACnC,WAAW,MAAM,8BAAa,IAAI,KAAK,EAAA,CAAE,YAAY;GACrD,aAAaC,qBAAAA,gBACX;IAAE,SAAS,MAAM;IAAS,SAAS,MAAM;IAAS,SAAS,MAAM;GAAQ,GACzE,MAAM,IACR;EACF;EAGA,IAAI,MAAM,SAAS;GACjB,SAAS,WAAW,YAAY,KAAK,UAAU,UAAU,MAAM;GAC/D,SAAS,kBAAkB;EAC7B;EAEA,OAAO;CACT;CAEA,MAAc,iBAAyC;EACrD,IAAI,KAAK,eAAe,KAAK,IAAI,IAAI,KAAK,aAAa,OAAO,KAAK;EAGnE,IAAI;GACF,MAAM,QAAQ,MAAM,KAAK,wBAAwB;GACjD,IAAI,OAAO;IACT,KAAK,cAAc;IACnB,KAAK,cAAc,KAAK,IAAI,IAAI;IAChC,OAAO,KAAK;GACd;EACF,QAAQ,CAER;EAGA,IAAI,KAAK,aACP,IAAI;GACF,MAAM,QAAQ,MAAM,KAAK,yBAAyB;GAClD,IAAI,OAAO;IACT,KAAK,cAAc;IACnB,KAAK,cAAc,KAAK,IAAI,IAAI;IAChC,OAAO,KAAK;GACd;EACF,SAAS,KAAK;GACZ,qBAAA,cAAc,4CAA4C,GAAG;EAC/D;EAGF,OAAO;CACT;CAEA,0BAA0D;EACxD,OAAO,IAAI,SAAS,SAAS,WAAW;GACtC,MAAM,MAAMC,WAAM,QAChB;IACE,UAAU;IACV,MAAM;IACN,SAAS,EAAE,mBAAmB,SAAS;IACvC,SAAS;GACX,IACC,QAAQ;IACP,IAAI,MAAM;IACV,IAAI,GAAG,SAAS,MAAe,OAAO,EAAE,SAAS,CAAE;IACnD,IAAI,GAAG,aAAa;KAClB,IAAI,IAAI,eAAe,KACrB,IAAI;MAEF,QADe,KAAK,MAAM,GACb,CAAC,CAAC,gBAAgB,IAAI;KACrC,QAAQ;MACN,QAAQ,IAAI;KACd;UAEA,QAAQ,IAAI;IAEhB,CAAC;GACH,CACF;GACA,IAAI,GAAG,SAAS,MAAM;GACtB,IAAI,GAAG,iBAAiB;IACtB,IAAI,QAAQ;IACZ,uBAAO,IAAI,MAAM,kBAAkB,CAAC;GACtC,CAAC;GACD,IAAI,IAAI;EACV,CAAC;CACH;CAEA,2BAA2D;EAGzD,IAAI,CAAC,KAAK,aAAa,OAAO,QAAQ,QAAQ,IAAI;EAElD,MAAM,MAAM,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI;EACxC,MAAM,MAAM,MAAM;EAclB,MAAM,eAAe,GAXN,OAAO,KAAK,KAAK,UAAU;GAAE,KAAK;GAAS,KAAK;EAAM,CAAC,CAAC,CAAC,CAAC,SAAS,WAWrD,EAAE,GAVf,OAAO,KACrB,KAAK,UAAU;GACb,KAAK,KAAK,YAAY;GACtB,OAAA;GACA,KAAK;GACL;GACA;EACF,CAAC,CACH,CAAC,CAAC,SAAS,WAE6B;EAExC,IAAI;EACJ,IAAI;GAEF,MAAM,OAAO,QAAQ,aAAa,CAAC,CAAC,WAAW,YAAY;GAC3D,KAAK,OAAO,YAAY;GACxB,YAAY,KAAK,KAAK,KAAK,YAAY,aAAa,WAAW;EACjE,QAAQ;GACN,OAAO,QAAQ,QAAQ,IAAI;EAC7B;EAGA,MAAM,OAAO,8EAA8E,GAD5E,aAAa,GAAG;EAG/B,OAAOC,qBAAAA,YAAY;GACjB,KAAK,IAAI,IAAI,qCAAqC;GAClD,SAAS,EAAE,gBAAgB,oCAAoC;GAC/D;GACA,WAAW,KAAK;GAChB,OAAO;EACT,CAAC,CAAC,CAAC,MACA,QAAS,KAAK,MAAM,IAAI,IAAI,CAAC,CAA+B,gBAAgB,YACvE,IACR;CACF;CAEA,aAAqB,OAAwC;;EAC3D,OAAO;GACL,KAAA,oBAAI,KAAK,iBAAA,QAAA,sBAAA,KAAA,IAAA,KAAA,IAAA,kBAAa,YAAY,MAAM,IAAI,MAAK,CAAC;IAClD,qBAAA,KAAK,iBAAA,QAAA,uBAAA,KAAA,IAAA,KAAA,IAAA,mBAAa;GAClB,KAAK,eAAe,KAAA;GACpB;EACF;CACF;CAEA,MAAc,aAAa,SAA6C;EACtE,MAAM,QAAQ,MAAM,KAAK,eAAe;EACxC,IAAI,CAAC,OACH,MAAM,IAAI,MAAM,yCAAyC;EAG3D,MAAM,OAAOC,uBAAAA,gBAAgB;GAC3B,SAAS,KAAK;GACd,UAAU,KAAK;GACf,SAAS,QAAQ,KAAK,MAAM,KAAK,cAAc,CAAC,CAAC;EACnD,CAAC;EAED,MAAMD,qBAAAA,YAAY;GAChB,KAAK,IAAI,IAAI,iDAAiD;GAC9D,SAAS;IAAE,eAAe,UAAU;IAAS,gBAAgB;GAAmB;GAChF;GACA,WAAW,KAAK;GAChB,OAAO;GACP,eAAe,KAAK,aAAa,KAAK;EACxC,CAAC;CACH;AACF"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Structural request/response shapes shared by every framework helper, so Express,
3
+ * Fastify and Node `http` objects are accepted without importing their types. Every
4
+ * optional member also accepts `undefined`, which keeps `exactOptionalPropertyTypes`
5
+ * consumers compiling against real framework types.
6
+ */
7
+ /** Minimal request shape that Express, Fastify and Node `IncomingMessage` satisfy. */
8
+ interface HttpRequestShape {
9
+ method?: string | undefined;
10
+ url?: string | undefined;
11
+ originalUrl?: string | undefined;
12
+ headers?: Record<string, string | string[] | undefined> | undefined;
13
+ body?: unknown;
14
+ ip?: string | undefined;
15
+ id?: unknown;
16
+ socket?: {
17
+ remoteAddress?: string | undefined;
18
+ } | undefined;
19
+ }
20
+ /** Minimal response shape that Express, Fastify replies and Node `ServerResponse` satisfy. */
21
+ interface HttpResponseShape {
22
+ statusCode?: number | undefined;
23
+ on?: ((event: string, cb: () => void) => void) | undefined;
24
+ once?: ((event: string, cb: () => void) => void) | undefined;
25
+ getHeader?: ((name: string) => string | number | string[] | undefined) | undefined;
26
+ /** Express / Node `res.setHeader`. */
27
+ setHeader?: ((name: string, value: string) => unknown) | undefined;
28
+ /** Fastify `reply.header`. */
29
+ header?: ((name: string, value: string) => unknown) | undefined;
30
+ }
31
+ export { HttpResponseShape as n, HttpRequestShape as t };
32
+ //# sourceMappingURL=http-shapes-BnBkJcid.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-shapes-BnBkJcid.d.mts","names":[],"sources":["../src/types/http-shapes.ts"],"mappings":";;;;;;;UAQiB;EACf;EACA;EACA;EACA,UAAU;EACV;EACA;EACA;EACA;IAAW;;;;UAII;EACf;EACA,OAAO,eAAe;EACtB,SAAS,eAAe;EACxB,cAAc;;EAEd,cAAc,cAAc;;EAE5B,WAAW,cAAc"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Structural request/response shapes shared by every framework helper, so Express,
3
+ * Fastify and Node `http` objects are accepted without importing their types. Every
4
+ * optional member also accepts `undefined`, which keeps `exactOptionalPropertyTypes`
5
+ * consumers compiling against real framework types.
6
+ */
7
+ /** Minimal request shape that Express, Fastify and Node `IncomingMessage` satisfy. */
8
+ interface HttpRequestShape {
9
+ method?: string | undefined;
10
+ url?: string | undefined;
11
+ originalUrl?: string | undefined;
12
+ headers?: Record<string, string | string[] | undefined> | undefined;
13
+ body?: unknown;
14
+ ip?: string | undefined;
15
+ id?: unknown;
16
+ socket?: {
17
+ remoteAddress?: string | undefined;
18
+ } | undefined;
19
+ }
20
+ /** Minimal response shape that Express, Fastify replies and Node `ServerResponse` satisfy. */
21
+ interface HttpResponseShape {
22
+ statusCode?: number | undefined;
23
+ on?: ((event: string, cb: () => void) => void) | undefined;
24
+ once?: ((event: string, cb: () => void) => void) | undefined;
25
+ getHeader?: ((name: string) => string | number | string[] | undefined) | undefined;
26
+ /** Express / Node `res.setHeader`. */
27
+ setHeader?: ((name: string, value: string) => unknown) | undefined;
28
+ /** Fastify `reply.header`. */
29
+ header?: ((name: string, value: string) => unknown) | undefined;
30
+ }
31
+ export { HttpResponseShape as n, HttpRequestShape as t };
32
+ //# sourceMappingURL=http-shapes-BnBkJcid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-shapes-BnBkJcid.d.ts","names":[],"sources":["../src/types/http-shapes.ts"],"mappings":";;;;;;;UAQiB;EACf;EACA;EACA;EACA,UAAU;EACV;EACA;EACA;EACA;IAAW;;;;UAII;EACf;EACA,OAAO,eAAe;EACtB,SAAS,eAAe;EACxB,cAAc;;EAEd,cAAc,cAAc;;EAE5B,WAAW,cAAc"}
@@ -1,6 +1,100 @@
1
- import { f as TransportConfig } from "./transport.types-BMnurPcc.mjs";
2
-
3
- //#region src/types/http.types.d.ts
1
+ import { h as TransportConfig } from "./transport.types-CzJq4IrF.mjs";
2
+ interface LogixiaPlugin {
3
+ /**
4
+ * Unique plugin name.
5
+ * logixia uses this to prevent duplicate registration of the same plugin
6
+ * on the same logger instance.
7
+ */
8
+ name: string;
9
+ /**
10
+ * Called once immediately after `logger.use(plugin)` is called.
11
+ * Use for one-time setup (open connections, allocate buffers, etc.).
12
+ * Async `onInit` errors are silently swallowed to avoid blocking the logger.
13
+ */
14
+ onInit?(): void | Promise<void>;
15
+ /**
16
+ * Called for every log entry **after** PII redaction and **before** transport
17
+ * dispatch. Plugins run in registration order; each receives the (possibly
18
+ * modified) output of the previous plugin.
19
+ *
20
+ * - Return the entry (modified or unchanged) to continue processing.
21
+ * - Return `null` to **drop** the entry — no transport will receive it.
22
+ *
23
+ * Errors thrown inside `onLog` are swallowed so a buggy plugin cannot crash
24
+ * logging; the chain continues with the previous (un-transformed) entry.
25
+ */
26
+ onLog?(entry: LogEntry): LogEntry | null | Promise<LogEntry | null>;
27
+ /**
28
+ * Called when a transport write fails (after any configured retries).
29
+ * Useful for routing transport errors to an alerting or metrics system.
30
+ * Errors thrown inside `onError` are silently swallowed.
31
+ */
32
+ onError?(error: Error, entry?: LogEntry): void | Promise<void>;
33
+ /**
34
+ * Called when the logger is closed via `logger.close()` or the process
35
+ * receives a shutdown signal (when `gracefulShutdown` is enabled).
36
+ * Errors thrown inside `onShutdown` are silently swallowed.
37
+ */
38
+ onShutdown?(): void | Promise<void>;
39
+ }
40
+ /**
41
+ * Holds an ordered list of `LogixiaPlugin` instances and dispatches lifecycle
42
+ * events to them. One registry is created per logger instance; a global
43
+ * singleton is also exported for process-wide registration.
44
+ */
45
+ declare class PluginRegistry {
46
+ private readonly _plugins;
47
+ /**
48
+ * Register a plugin. Silently skips if a plugin with the same `name` is
49
+ * already registered on this registry.
50
+ */
51
+ register(plugin: LogixiaPlugin): void;
52
+ /** Remove a previously registered plugin by name. No-op if not found. */
53
+ unregister(name: string): void;
54
+ /** Returns `true` if a plugin with the given name is registered. */
55
+ has(name: string): boolean;
56
+ /** Number of currently registered plugins. */
57
+ get size(): number;
58
+ /**
59
+ * Run all `onLog` hooks in order.
60
+ * Returns `null` if any plugin cancels the entry; otherwise returns the
61
+ * (possibly transformed) entry.
62
+ */
63
+ runOnLog(entry: LogEntry): Promise<LogEntry | null>;
64
+ /**
65
+ * Notify all `onError` hooks.
66
+ * Errors thrown inside hooks are swallowed to prevent error cascades.
67
+ */
68
+ runOnError(error: Error, entry?: LogEntry): Promise<void>;
69
+ /** Run all `onShutdown` hooks concurrently. Hook errors are swallowed. */
70
+ runOnShutdown(): Promise<void>;
71
+ }
72
+ /**
73
+ * Module-level singleton registry.
74
+ *
75
+ * Plugins registered here are automatically copied into every **new** logger
76
+ * instance created after the registration. Already-created loggers are not
77
+ * retroactively affected — use `logger.use(plugin)` for per-instance control.
78
+ */
79
+ declare const globalPluginRegistry: PluginRegistry;
80
+ /**
81
+ * Register a plugin in the global registry so it applies to every future
82
+ * logger instance.
83
+ *
84
+ * @example
85
+ * ```ts
86
+ * import { usePlugin } from 'logixia';
87
+ *
88
+ * usePlugin({
89
+ * name: 'audit-sink',
90
+ * onLog(entry) {
91
+ * if (entry.level === 'error') auditQueue.push(entry);
92
+ * return entry;
93
+ * },
94
+ * });
95
+ * ```
96
+ */
97
+ declare function usePlugin(plugin: LogixiaPlugin): void;
4
98
  /**
5
99
  * HTTP-related type definitions for Logixia
6
100
  */
@@ -50,8 +144,6 @@ interface RequestMetrics {
50
144
  ip?: string;
51
145
  timestamp: number;
52
146
  }
53
- //#endregion
54
- //#region src/types/index.d.ts
55
147
  declare const LogLevel: {
56
148
  readonly ERROR: "error";
57
149
  readonly WARN: "warn";
@@ -296,7 +388,9 @@ interface IBaseLogger {
296
388
  time(label: string): void;
297
389
  timeEnd(label: string): Promise<number | undefined>;
298
390
  timeAsync<T>(label: string, fn: () => Promise<T>): Promise<T>;
391
+ /** Set the minimum log level at runtime. Unknown levels are ignored with a warning. */
299
392
  setLevel(level: LogLevel | string): void;
393
+ /** Return the configured minimum log level (not the per-namespace effective one). */
300
394
  getLevel(): string;
301
395
  setContext(context: string): void;
302
396
  getContext(): string | undefined;
@@ -315,17 +409,53 @@ interface IBaseLogger {
315
409
  getAvailableTransports(): string[];
316
410
  child(context: string, data?: Record<string, unknown>): ILogger;
317
411
  close(): Promise<void>;
318
- use(plugin: {
319
- name: string;
320
- }): this;
412
+ use(plugin: LogixiaPlugin): this;
321
413
  unuse(pluginName: string): this;
322
414
  }
323
- type CustomLevelMethods<T extends Record<string, number>> = { [K in keyof T]: (message: string, data?: Record<string, unknown>) => Promise<void> };
415
+ /**
416
+ * Runtime controls implemented by loggers returned from `createLogger`.
417
+ * Kept separate from {@link IBaseLogger} and {@link ILogger}, so existing
418
+ * implementations of those (mocks, adapters) keep compiling.
419
+ */
420
+ interface ILoggerRuntimeControls {
421
+ /**
422
+ * Replace the per-namespace level map at runtime.
423
+ * @example logger.setNamespaceLevels({ 'db.*': 'debug', '*': 'info' });
424
+ */
425
+ setNamespaceLevels(levels: NamespaceLevels): void;
426
+ /** Merge entries into the existing per-namespace level map at runtime. */
427
+ patchNamespaceLevels(levels: NamespaceLevels): void;
428
+ /** Return a copy of the current per-namespace level map. */
429
+ getNamespaceLevels(): NamespaceLevels;
430
+ /** Flush buffered entries in all transports without closing them. */
431
+ flush(): Promise<void>;
432
+ /** Report whether the transports are healthy. */
433
+ healthCheck(): Promise<{
434
+ healthy: boolean;
435
+ details: Record<string, unknown>;
436
+ }>;
437
+ }
438
+ /**
439
+ * Logger member names a custom level must not use: a level with one of these
440
+ * names would shadow, or be shadowed by, a built-in logger method. The built-in
441
+ * level methods (`error`, `warn`, `info`, `debug`, `trace`, `verbose`) are valid level names.
442
+ */
443
+ type ReservedLevelName = Exclude<keyof IBaseLogger | keyof ILoggerRuntimeControls, 'error' | 'warn' | 'info' | 'debug' | 'trace' | 'verbose'>;
444
+ type CustomLevelMethods<T extends Record<string, number>> = { [K in keyof T as K extends ReservedLevelName ? never : K]: (message: string, data?: Record<string, unknown>) => Promise<void>; };
324
445
  type ILogger<TLevels extends Record<string, number> = {}> = IBaseLogger & CustomLevelMethods<TLevels>;
325
446
  interface ILoggerDefault extends IBaseLogger {}
447
+ /** What `createLogger` returns for a config with custom levels: the logger plus its runtime controls. */
448
+ type LogixiaLoggerInstance<TLevels extends Record<string, number> = {}> = {
449
+ /** Child loggers carry the runtime controls too. */
450
+ child(context: string, data?: Record<string, unknown>): LogixiaLoggerInstance<TLevels>;
451
+ } & ILogger<TLevels> & ILoggerRuntimeControls;
452
+ /** What `createLogger` returns for a config without custom levels. */
453
+ interface LogixiaLoggerDefault extends ILoggerDefault, ILoggerRuntimeControls {
454
+ child(context: string, data?: Record<string, unknown>): LogixiaLoggerDefault;
455
+ }
326
456
  type LoggerWithLevels<T extends LoggerConfig<any>> = T['levelOptions'] extends {
327
457
  levels: infer L;
328
- } ? L extends Record<string, number> ? ILogger<L> : ILoggerDefault : ILoggerDefault;
458
+ } ? L extends Record<string, number> ? LogixiaLoggerInstance<L> : LogixiaLoggerDefault : LogixiaLoggerDefault;
329
459
  type ExtractLevels<T> = T extends LoggerConfig<infer L> ? L : Record<string, number>;
330
460
  interface LogEntry {
331
461
  timestamp: string;
@@ -384,6 +514,5 @@ declare const DEFAULT_LOG_COLORS: {
384
514
  trace: string;
385
515
  verbose: string;
386
516
  };
387
- //#endregion
388
- export { HttpResponse as A, RequestContext as C, TraceIdExtractorConfig as D, TraceIdConfig as E, RequestTiming as M, HttpError as O, RedactConfig as S, TimingEntry as T, LogLevel as _, DEFAULT_LOG_LEVELS as a, LoggerWithLevels as b, ExtractLevels as c, ILogFormatter as d, ILogger as f, LogFieldKey as g, LogEntry as h, DEFAULT_LOG_COLORS as i, RequestMetrics as j, HttpRequest as k, GracefulShutdownConfig as l, LogColor as m, ContextData as n, Environment as o, ILoggerDefault as p, CustomLevelMethods as r, ErrorSerializationOptions as s, AdaptiveSamplingConfig as t, IBaseLogger as u, LogLevelString as v, SamplingConfig as w, NamespaceLevels as x, LoggerConfig as y };
389
- //# sourceMappingURL=index-3mw5gaCw.d.mts.map
517
+ export { TraceIdConfig as A, usePlugin as B, LogixiaLoggerInstance as C, ReservedLevelName as D, RequestContext as E, RequestMetrics as F, RequestTiming as I, LogixiaPlugin as L, HttpError as M, HttpRequest as N, SamplingConfig as O, HttpResponse as P, PluginRegistry as R, LogixiaLoggerDefault as S, RedactConfig as T, LogFieldKey as _, DEFAULT_LOG_LEVELS as a, LoggerConfig as b, ExtractLevels as c, ILogFormatter as d, ILogger as f, LogEntry as g, LogColor as h, DEFAULT_LOG_COLORS as i, TraceIdExtractorConfig as j, TimingEntry as k, GracefulShutdownConfig as l, ILoggerRuntimeControls as m, ContextData as n, Environment as o, ILoggerDefault as p, CustomLevelMethods as r, ErrorSerializationOptions as s, AdaptiveSamplingConfig as t, IBaseLogger as u, LogLevel as v, NamespaceLevels as w, LoggerWithLevels as x, LogLevelString as y, globalPluginRegistry as z };
518
+ //# sourceMappingURL=index-BSTtFcQ6.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-BSTtFcQ6.d.mts","names":[],"sources":["../src/plugin.ts","../src/types/http.types.ts","../src/types/index.ts"],"mappings":"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"}
@@ -1,6 +1,100 @@
1
- import { f as TransportConfig } from "./transport.types-CGoHpWQR.js";
2
-
3
- //#region src/types/http.types.d.ts
1
+ import { h as TransportConfig } from "./transport.types-CzJq4IrF.js";
2
+ interface LogixiaPlugin {
3
+ /**
4
+ * Unique plugin name.
5
+ * logixia uses this to prevent duplicate registration of the same plugin
6
+ * on the same logger instance.
7
+ */
8
+ name: string;
9
+ /**
10
+ * Called once immediately after `logger.use(plugin)` is called.
11
+ * Use for one-time setup (open connections, allocate buffers, etc.).
12
+ * Async `onInit` errors are silently swallowed to avoid blocking the logger.
13
+ */
14
+ onInit?(): void | Promise<void>;
15
+ /**
16
+ * Called for every log entry **after** PII redaction and **before** transport
17
+ * dispatch. Plugins run in registration order; each receives the (possibly
18
+ * modified) output of the previous plugin.
19
+ *
20
+ * - Return the entry (modified or unchanged) to continue processing.
21
+ * - Return `null` to **drop** the entry — no transport will receive it.
22
+ *
23
+ * Errors thrown inside `onLog` are swallowed so a buggy plugin cannot crash
24
+ * logging; the chain continues with the previous (un-transformed) entry.
25
+ */
26
+ onLog?(entry: LogEntry): LogEntry | null | Promise<LogEntry | null>;
27
+ /**
28
+ * Called when a transport write fails (after any configured retries).
29
+ * Useful for routing transport errors to an alerting or metrics system.
30
+ * Errors thrown inside `onError` are silently swallowed.
31
+ */
32
+ onError?(error: Error, entry?: LogEntry): void | Promise<void>;
33
+ /**
34
+ * Called when the logger is closed via `logger.close()` or the process
35
+ * receives a shutdown signal (when `gracefulShutdown` is enabled).
36
+ * Errors thrown inside `onShutdown` are silently swallowed.
37
+ */
38
+ onShutdown?(): void | Promise<void>;
39
+ }
40
+ /**
41
+ * Holds an ordered list of `LogixiaPlugin` instances and dispatches lifecycle
42
+ * events to them. One registry is created per logger instance; a global
43
+ * singleton is also exported for process-wide registration.
44
+ */
45
+ declare class PluginRegistry {
46
+ private readonly _plugins;
47
+ /**
48
+ * Register a plugin. Silently skips if a plugin with the same `name` is
49
+ * already registered on this registry.
50
+ */
51
+ register(plugin: LogixiaPlugin): void;
52
+ /** Remove a previously registered plugin by name. No-op if not found. */
53
+ unregister(name: string): void;
54
+ /** Returns `true` if a plugin with the given name is registered. */
55
+ has(name: string): boolean;
56
+ /** Number of currently registered plugins. */
57
+ get size(): number;
58
+ /**
59
+ * Run all `onLog` hooks in order.
60
+ * Returns `null` if any plugin cancels the entry; otherwise returns the
61
+ * (possibly transformed) entry.
62
+ */
63
+ runOnLog(entry: LogEntry): Promise<LogEntry | null>;
64
+ /**
65
+ * Notify all `onError` hooks.
66
+ * Errors thrown inside hooks are swallowed to prevent error cascades.
67
+ */
68
+ runOnError(error: Error, entry?: LogEntry): Promise<void>;
69
+ /** Run all `onShutdown` hooks concurrently. Hook errors are swallowed. */
70
+ runOnShutdown(): Promise<void>;
71
+ }
72
+ /**
73
+ * Module-level singleton registry.
74
+ *
75
+ * Plugins registered here are automatically copied into every **new** logger
76
+ * instance created after the registration. Already-created loggers are not
77
+ * retroactively affected — use `logger.use(plugin)` for per-instance control.
78
+ */
79
+ declare const globalPluginRegistry: PluginRegistry;
80
+ /**
81
+ * Register a plugin in the global registry so it applies to every future
82
+ * logger instance.
83
+ *
84
+ * @example
85
+ * ```ts
86
+ * import { usePlugin } from 'logixia';
87
+ *
88
+ * usePlugin({
89
+ * name: 'audit-sink',
90
+ * onLog(entry) {
91
+ * if (entry.level === 'error') auditQueue.push(entry);
92
+ * return entry;
93
+ * },
94
+ * });
95
+ * ```
96
+ */
97
+ declare function usePlugin(plugin: LogixiaPlugin): void;
4
98
  /**
5
99
  * HTTP-related type definitions for Logixia
6
100
  */
@@ -50,8 +144,6 @@ interface RequestMetrics {
50
144
  ip?: string;
51
145
  timestamp: number;
52
146
  }
53
- //#endregion
54
- //#region src/types/index.d.ts
55
147
  declare const LogLevel: {
56
148
  readonly ERROR: "error";
57
149
  readonly WARN: "warn";
@@ -296,7 +388,9 @@ interface IBaseLogger {
296
388
  time(label: string): void;
297
389
  timeEnd(label: string): Promise<number | undefined>;
298
390
  timeAsync<T>(label: string, fn: () => Promise<T>): Promise<T>;
391
+ /** Set the minimum log level at runtime. Unknown levels are ignored with a warning. */
299
392
  setLevel(level: LogLevel | string): void;
393
+ /** Return the configured minimum log level (not the per-namespace effective one). */
300
394
  getLevel(): string;
301
395
  setContext(context: string): void;
302
396
  getContext(): string | undefined;
@@ -315,17 +409,53 @@ interface IBaseLogger {
315
409
  getAvailableTransports(): string[];
316
410
  child(context: string, data?: Record<string, unknown>): ILogger;
317
411
  close(): Promise<void>;
318
- use(plugin: {
319
- name: string;
320
- }): this;
412
+ use(plugin: LogixiaPlugin): this;
321
413
  unuse(pluginName: string): this;
322
414
  }
323
- type CustomLevelMethods<T extends Record<string, number>> = { [K in keyof T]: (message: string, data?: Record<string, unknown>) => Promise<void> };
415
+ /**
416
+ * Runtime controls implemented by loggers returned from `createLogger`.
417
+ * Kept separate from {@link IBaseLogger} and {@link ILogger}, so existing
418
+ * implementations of those (mocks, adapters) keep compiling.
419
+ */
420
+ interface ILoggerRuntimeControls {
421
+ /**
422
+ * Replace the per-namespace level map at runtime.
423
+ * @example logger.setNamespaceLevels({ 'db.*': 'debug', '*': 'info' });
424
+ */
425
+ setNamespaceLevels(levels: NamespaceLevels): void;
426
+ /** Merge entries into the existing per-namespace level map at runtime. */
427
+ patchNamespaceLevels(levels: NamespaceLevels): void;
428
+ /** Return a copy of the current per-namespace level map. */
429
+ getNamespaceLevels(): NamespaceLevels;
430
+ /** Flush buffered entries in all transports without closing them. */
431
+ flush(): Promise<void>;
432
+ /** Report whether the transports are healthy. */
433
+ healthCheck(): Promise<{
434
+ healthy: boolean;
435
+ details: Record<string, unknown>;
436
+ }>;
437
+ }
438
+ /**
439
+ * Logger member names a custom level must not use: a level with one of these
440
+ * names would shadow, or be shadowed by, a built-in logger method. The built-in
441
+ * level methods (`error`, `warn`, `info`, `debug`, `trace`, `verbose`) are valid level names.
442
+ */
443
+ type ReservedLevelName = Exclude<keyof IBaseLogger | keyof ILoggerRuntimeControls, 'error' | 'warn' | 'info' | 'debug' | 'trace' | 'verbose'>;
444
+ type CustomLevelMethods<T extends Record<string, number>> = { [K in keyof T as K extends ReservedLevelName ? never : K]: (message: string, data?: Record<string, unknown>) => Promise<void>; };
324
445
  type ILogger<TLevels extends Record<string, number> = {}> = IBaseLogger & CustomLevelMethods<TLevels>;
325
446
  interface ILoggerDefault extends IBaseLogger {}
447
+ /** What `createLogger` returns for a config with custom levels: the logger plus its runtime controls. */
448
+ type LogixiaLoggerInstance<TLevels extends Record<string, number> = {}> = {
449
+ /** Child loggers carry the runtime controls too. */
450
+ child(context: string, data?: Record<string, unknown>): LogixiaLoggerInstance<TLevels>;
451
+ } & ILogger<TLevels> & ILoggerRuntimeControls;
452
+ /** What `createLogger` returns for a config without custom levels. */
453
+ interface LogixiaLoggerDefault extends ILoggerDefault, ILoggerRuntimeControls {
454
+ child(context: string, data?: Record<string, unknown>): LogixiaLoggerDefault;
455
+ }
326
456
  type LoggerWithLevels<T extends LoggerConfig<any>> = T['levelOptions'] extends {
327
457
  levels: infer L;
328
- } ? L extends Record<string, number> ? ILogger<L> : ILoggerDefault : ILoggerDefault;
458
+ } ? L extends Record<string, number> ? LogixiaLoggerInstance<L> : LogixiaLoggerDefault : LogixiaLoggerDefault;
329
459
  type ExtractLevels<T> = T extends LoggerConfig<infer L> ? L : Record<string, number>;
330
460
  interface LogEntry {
331
461
  timestamp: string;
@@ -384,6 +514,5 @@ declare const DEFAULT_LOG_COLORS: {
384
514
  trace: string;
385
515
  verbose: string;
386
516
  };
387
- //#endregion
388
- export { HttpResponse as A, RequestContext as C, TraceIdExtractorConfig as D, TraceIdConfig as E, RequestTiming as M, HttpError as O, RedactConfig as S, TimingEntry as T, LogLevel as _, DEFAULT_LOG_LEVELS as a, LoggerWithLevels as b, ExtractLevels as c, ILogFormatter as d, ILogger as f, LogFieldKey as g, LogEntry as h, DEFAULT_LOG_COLORS as i, RequestMetrics as j, HttpRequest as k, GracefulShutdownConfig as l, LogColor as m, ContextData as n, Environment as o, ILoggerDefault as p, CustomLevelMethods as r, ErrorSerializationOptions as s, AdaptiveSamplingConfig as t, IBaseLogger as u, LogLevelString as v, SamplingConfig as w, NamespaceLevels as x, LoggerConfig as y };
389
- //# sourceMappingURL=index-DhIoploR.d.ts.map
517
+ export { TraceIdConfig as A, usePlugin as B, LogixiaLoggerInstance as C, ReservedLevelName as D, RequestContext as E, RequestMetrics as F, RequestTiming as I, LogixiaPlugin as L, HttpError as M, HttpRequest as N, SamplingConfig as O, HttpResponse as P, PluginRegistry as R, LogixiaLoggerDefault as S, RedactConfig as T, LogFieldKey as _, DEFAULT_LOG_LEVELS as a, LoggerConfig as b, ExtractLevels as c, ILogFormatter as d, ILogger as f, LogEntry as g, LogColor as h, DEFAULT_LOG_COLORS as i, TraceIdExtractorConfig as j, TimingEntry as k, GracefulShutdownConfig as l, ILoggerRuntimeControls as m, ContextData as n, Environment as o, ILoggerDefault as p, CustomLevelMethods as r, ErrorSerializationOptions as s, AdaptiveSamplingConfig as t, IBaseLogger as u, LogLevel as v, NamespaceLevels as w, LoggerWithLevels as x, LogLevelString as y, globalPluginRegistry as z };
518
+ //# sourceMappingURL=index-CFDGkI8n.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-CFDGkI8n.d.ts","names":[],"sources":["../src/plugin.ts","../src/types/http.types.ts","../src/types/index.ts"],"mappings":";UAkCiB;;;;;;EAMf;;;;;;EAOA,kBAAkB;;;;;;;;;;;;EAalB,OAAO,OAAO,WAAW,kBAAkB,QAAQ;;;;;;EAOnD,SAAS,OAAO,OAAO,QAAQ,kBAAkB;;;;;;EAOjD,sBAAsB;;;;;;;cAUX;mBACM;;;;;EAMjB,SAAS,QAAQ;;EAiBjB,WAAW;;EAMX,IAAI;;MAKA;;;;;;EASE,SAAS,OAAO,WAAW,QAAQ;;;;;EAsBnC,WAAW,OAAO,OAAO,QAAQ,WAAW;;EAiB5C,iBAAiB;;;;;;;;;cA2BZ,sBAAoB;;;;;;;;;;;;;;;;;;iBAmBjB,UAAU,QAAQ;;;;UCjNjB;EACf;EACA;EACA,SAAS;EACT,QAAQ;EACR,SAAS;EACT;EACA;EACA;EACA;;UAGe;EACf;EACA,SAAS;EACT;EACA;EACA;;UAGe,kBAAkB;EACjC;EACA;EACA,UAAU;;UAGK;EACf;EACA;EACA;EACA;IACE;IACA;IACA;IACA;IACA;;;UAIa;EACf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;cC3CW;;;;;;;;KASD,mBAAmB,uBAAuB;KAC1C,iBAAiB;KAGjB;KAoBA;KAeA;UAGK;EACf;EACA;EACA;EACA;;UAGe;EACf;EACA;EACA;EACA,YAAY;;;;;;;;;;;EAWZ;;UAIe;;;;;EAKf;;;;;;;;;;;;;;EAcA;;;;;EAKA,WAAW;;EAEX;;;;;;;;;;;;;;;;;;EAkBA;;;;;;;;;;;;;;;UAiBe;;;;;EAKf;;;;;;;EAOA,WAAW,QAAQ;;;;;;;EAOnB;;;;;;;;EAQA;;;;;;EAMA;;;;;;;;;;EAUA,WAAW;;UAGI;;;;;;EAMf;;;;;EAKA;;EAEA;;;;;EAKA;;;;;;;;;;;;;;;;KAkBU,kBAAkB,eAAe;UAG5B;;EAEf;;EAEA;;EAEA,UAAU,OAAO;;;;;;EAMjB;;UAGe,aAAa,gBAAgB,yBAAyB;EACrE;EACA,cAAc;EACd,oBAAoB;EACpB;IACE;IACA;IACA;;EAEF;EACA;IAEM,cAAc,UAAU;IACxB,SAAS;IACT,SAAS,QAAQ,aAAa,UAAU,UAAU;;EAGxD,SAAS,QAAQ,OAAO;;;;;EAKxB,SAAS;;;;;;EAMT,kBAAkB;;;;;;EAMlB,6BAA6B;;;;;;EAM7B,WAAW;;EAEX,aAAa;GACZ;;UAIc;EACf,MAAM,iBAAiB,OAAO,0BAA0B;EACxD,MAAM,OAAO,OAAO,OAAO,0BAA0B;EACrD,KAAK,iBAAiB,OAAO,0BAA0B;EACvD,KAAK,iBAAiB,OAAO,0BAA0B;EACvD,MAAM,iBAAiB,OAAO,0BAA0B;EACxD,MAAM,iBAAiB,OAAO,0BAA0B;EACxD,QAAQ,iBAAiB,OAAO,0BAA0B;EAC1D,SAAS,eAAe,iBAAiB,OAAO,0BAA0B;EAE1E,KAAK;EACL,QAAQ,gBAAgB;EACxB,UAAU,GAAG,eAAe,UAAU,QAAQ,KAAK,QAAQ;;EAG3D,SAAS,OAAO;;EAEhB;EACA,WAAW;EACX;EAGA,YAAY;EACZ,aAAa;EACb,eAAe;EACf,iBAAiB;EACjB;;EAIA;;EAEA;EACA,mBAAmB,qBAAqB;EACxC,mBAAmB;EACnB;EACA;EAEA,MAAM,iBAAiB,OAAO,0BAA0B;EACxD,SAAS;EAIT,IAAI,QAAQ;EACZ,MAAM;;;;;;;UAQS;;;;;EAKf,mBAAmB,QAAQ;;EAE3B,qBAAqB,QAAQ;;EAE7B,sBAAsB;;EAEtB,SAAS;;EAET,eAAe;IAAU;IAAkB,SAAS;;;;;;;;KAQ1C,oBAAoB,cACxB,oBAAoB;KAKhB,mBAAmB,UAAU,6BACtC,WAAW,KAAK,UAAU,4BAA4B,KACrD,iBACA,OAAO,4BACJ;KAKK,QAAQ,gBAAgB,+BAA+B,cACjE,mBAAmB;UAIJ,uBAAuB;;KAI5B,sBAAsB,gBAAgB;;EAEhD,MAAM,iBAAiB,OAAO,0BAA0B,sBAAsB;IAC5E,QAAQ,WACV;;UAGe,6BAA6B,gBAAgB;EAC5D,MAAM,iBAAiB,OAAO,0BAA0B;;KAK9C,iBAAiB,UAAU,qBAAqB;EAC1D,cAAc;IAEZ,UAAU,yBACR,sBAAsB,KACtB,uBACF;KAGQ,cAAc,KAAK,UAAU,mBAAmB,KAAK,IAAI;UAGpD;EACf;EACA;EACA;EACA;EACA;EACA;EACA,UAAU;EACV;EACA,QAAQ;;UAIO;EACf;EACA;EACA;;UAIe;EACf;EACA;EACA;EACA;;UAIe;GACd;;UAIc;EACf,OAAO,OAAO;;UAIC;EACf;EACA;EACA;EACA;EACA,SAAS;EACT,WAAW;EACX,QAAQ;EACR;EACA;EACA;EACA;;cAIW;;;;;;;;cASA"}