logixia 2.0.0 → 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.
- package/README.md +46 -29
- package/dist/async-context-B05ArHgM.mjs +134 -0
- package/dist/async-context-B05ArHgM.mjs.map +1 -0
- package/dist/async-context-DTQgi8f7.js +150 -0
- package/dist/async-context-DTQgi8f7.js.map +1 -0
- package/dist/{azure-monitor.transport-CHnjVRF-.mjs → azure-monitor.transport-BPbgjATu.mjs} +27 -15
- package/dist/azure-monitor.transport-BPbgjATu.mjs.map +1 -0
- package/dist/{azure-monitor.transport-Cn_3Usvu.d.ts → azure-monitor.transport-C7kYyZUW.d.mts} +3 -6
- package/dist/azure-monitor.transport-C7kYyZUW.d.mts.map +1 -0
- package/dist/{azure-monitor.transport-CrvfHd9C.js → azure-monitor.transport-CwbOLZHB.js} +32 -20
- package/dist/azure-monitor.transport-CwbOLZHB.js.map +1 -0
- package/dist/{azure-monitor.transport-D7Da4RAb.d.mts → azure-monitor.transport-DV03Z5P4.d.ts} +3 -6
- package/dist/azure-monitor.transport-DV03Z5P4.d.ts.map +1 -0
- package/dist/azure.d.mts +1 -2
- package/dist/azure.d.ts +1 -2
- package/dist/azure.js +3 -6
- package/dist/azure.mjs +1 -6
- package/dist/{batch-buffer-PGvSgbmd.mjs → batch-buffer-0fgLmIPn.mjs} +21 -7
- package/dist/batch-buffer-0fgLmIPn.mjs.map +1 -0
- package/dist/{batch-buffer-BY-mRWIK.js → batch-buffer-DT4gdXmf.js} +53 -40
- package/dist/batch-buffer-DT4gdXmf.js.map +1 -0
- package/dist/browser.d.mts +45 -25
- package/dist/browser.d.mts.map +1 -1
- package/dist/browser.d.ts +45 -25
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +420 -53
- package/dist/browser.js.map +1 -1
- package/dist/browser.mjs +421 -56
- package/dist/browser.mjs.map +1 -1
- package/dist/{builder-0gEzRopq.mjs → builder-D70z6kjj.mjs} +212 -104
- package/dist/builder-D70z6kjj.mjs.map +1 -0
- package/dist/{builder-D44QktIo.js → builder-M7NoaugM.js} +355 -249
- package/dist/builder-M7NoaugM.js.map +1 -0
- package/dist/cli/index.js +59 -59
- package/dist/cloudwatch.d.mts +1 -2
- package/dist/cloudwatch.d.ts +1 -2
- package/dist/cloudwatch.js +3 -7
- package/dist/cloudwatch.mjs +1 -7
- package/dist/{cloudwatch.transport-BO1ahxw-.js → cloudwatch.transport-B2wKQFF7.js} +61 -36
- package/dist/cloudwatch.transport-B2wKQFF7.js.map +1 -0
- package/dist/{cloudwatch.transport-DZ6ies7g.mjs → cloudwatch.transport-BTvYfLs9.mjs} +54 -28
- package/dist/cloudwatch.transport-BTvYfLs9.mjs.map +1 -0
- package/dist/{cloudwatch.transport-DsEq633o.d.ts → cloudwatch.transport-Bf7L4I59.d.ts} +2 -6
- package/dist/cloudwatch.transport-Bf7L4I59.d.ts.map +1 -0
- package/dist/{cloudwatch.transport-UlyZFWMn.d.mts → cloudwatch.transport-Rj4yTpRn.d.mts} +2 -6
- package/dist/cloudwatch.transport-Rj4yTpRn.d.mts.map +1 -0
- package/dist/{coerce.utils-Cu6IUTgX.mjs → coerce.utils-B_rEudCn.mjs} +3 -4
- package/dist/{coerce.utils-Cu6IUTgX.mjs.map → coerce.utils-B_rEudCn.mjs.map} +1 -1
- package/dist/{coerce.utils-B-LilukN.js → coerce.utils-C1C5sIX0.js} +8 -10
- package/dist/{coerce.utils-B-LilukN.js.map → coerce.utils-C1C5sIX0.js.map} +1 -1
- package/dist/correlation.d.mts +13 -16
- package/dist/correlation.d.mts.map +1 -1
- package/dist/correlation.d.ts +13 -16
- package/dist/correlation.d.ts.map +1 -1
- package/dist/correlation.js +58 -9
- package/dist/correlation.js.map +1 -1
- package/dist/correlation.mjs +56 -6
- package/dist/correlation.mjs.map +1 -1
- package/dist/{entry-fields-BJkuPnIg.mjs → entry-fields-CGuvT2R0.mjs} +5 -6
- package/dist/entry-fields-CGuvT2R0.mjs.map +1 -0
- package/dist/{entry-fields-BvOLFlJ4.js → entry-fields-RLd1jCoR.js} +10 -12
- package/dist/entry-fields-RLd1jCoR.js.map +1 -0
- package/dist/gcp.d.mts +1 -2
- package/dist/gcp.d.ts +1 -2
- package/dist/gcp.js +3 -7
- package/dist/gcp.mjs +1 -7
- package/dist/{gcp.transport-B7oc97sG.d.ts → gcp.transport-C5D72b1g.d.mts} +3 -6
- package/dist/gcp.transport-C5D72b1g.d.mts.map +1 -0
- package/dist/{gcp.transport-GrJurKo8.d.mts → gcp.transport-CFQfdAOK.d.ts} +3 -6
- package/dist/gcp.transport-CFQfdAOK.d.ts.map +1 -0
- package/dist/{gcp.transport-DBX5TPIy.mjs → gcp.transport-CGKopAhQ.mjs} +55 -16
- package/dist/gcp.transport-CGKopAhQ.mjs.map +1 -0
- package/dist/{gcp.transport-CHV8MGgz.js → gcp.transport-KZe9hCAR.js} +60 -22
- package/dist/gcp.transport-KZe9hCAR.js.map +1 -0
- package/dist/{index-DhIoploR.d.ts → index-DwozbmB4.d.ts} +3 -8
- package/dist/index-DwozbmB4.d.ts.map +1 -0
- package/dist/{index-3mw5gaCw.d.mts → index-xqaJtAZn.d.mts} +3 -8
- package/dist/index-xqaJtAZn.d.mts.map +1 -0
- package/dist/index.d.mts +106 -165
- package/dist/index.d.mts.map +1 -1
- package/dist/index.d.ts +105 -164
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +164 -261
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +147 -243
- package/dist/index.mjs.map +1 -1
- package/dist/internal-log-b0Vp4qrB.js +183 -0
- package/dist/internal-log-b0Vp4qrB.js.map +1 -0
- package/dist/internal-log-uCSd1PMc.mjs +142 -0
- package/dist/internal-log-uCSd1PMc.mjs.map +1 -0
- package/dist/{logitron-logger-UVeN-mQm.d.ts → logitron-logger-D2B75Oc7.d.ts} +116 -8
- package/dist/logitron-logger-D2B75Oc7.d.ts.map +1 -0
- package/dist/{logitron-logger-BFDSO8Io.d.mts → logitron-logger-oEd6wNhf.d.mts} +116 -8
- package/dist/logitron-logger-oEd6wNhf.d.mts.map +1 -0
- package/dist/middleware.d.mts +10 -12
- package/dist/middleware.d.mts.map +1 -1
- package/dist/middleware.d.ts +10 -12
- package/dist/middleware.d.ts.map +1 -1
- package/dist/middleware.js +16 -47
- package/dist/middleware.js.map +1 -1
- package/dist/middleware.mjs +13 -45
- package/dist/middleware.mjs.map +1 -1
- package/dist/nest.d.mts +26 -44
- package/dist/nest.d.mts.map +1 -1
- package/dist/nest.d.ts +26 -44
- package/dist/nest.d.ts.map +1 -1
- package/dist/nest.js +116 -132
- package/dist/nest.js.map +1 -1
- package/dist/nest.mjs +59 -73
- package/dist/nest.mjs.map +1 -1
- package/dist/{trace.utils-CvXgaiQT.mjs → request-trace-C_fvIDv4.mjs} +44 -9
- package/dist/request-trace-C_fvIDv4.mjs.map +1 -0
- package/dist/{trace.utils-DpBOLDtq.js → request-trace-wTJdKp6-.js} +121 -77
- package/dist/request-trace-wTJdKp6-.js.map +1 -0
- package/dist/rolldown-runtime-D3PmRqjj.mjs +4 -0
- package/dist/{safe-stringify-DJ66tW5I.mjs → safe-stringify-BMRl3EX3.mjs} +3 -4
- package/dist/safe-stringify-BMRl3EX3.mjs.map +1 -0
- package/dist/{safe-stringify-DWo3aZp_.js → safe-stringify-DLz1Kz3o.js} +23 -25
- package/dist/safe-stringify-DLz1Kz3o.js.map +1 -0
- package/dist/{search-CNh9uVwR.d.ts → search-BH33XhuU.d.mts} +2 -22
- package/dist/search-BH33XhuU.d.mts.map +1 -0
- package/dist/{search-BFbu_oVn.mjs → search-CWMVYC-R.mjs} +22 -39
- package/dist/search-CWMVYC-R.mjs.map +1 -0
- package/dist/{search-DXANsQ2n.d.mts → search-CazwyX5Z.d.ts} +2 -22
- package/dist/search-CazwyX5Z.d.ts.map +1 -0
- package/dist/{search-C4V0OMEn.js → search-DUfWuzFP.js} +52 -69
- package/dist/search-DUfWuzFP.js.map +1 -0
- package/dist/search.d.mts +2 -4
- package/dist/search.d.ts +2 -4
- package/dist/search.js +3 -4
- package/dist/search.mjs +1 -4
- package/dist/secret-config-BegMLkYl.mjs +209 -0
- package/dist/secret-config-BegMLkYl.mjs.map +1 -0
- package/dist/secret-config-CBZBs0p1.js +271 -0
- package/dist/secret-config-CBZBs0p1.js.map +1 -0
- package/dist/{slack.transport-Bzw7sucI.mjs → slack.transport-Ce96JBDk.mjs} +212 -31
- package/dist/slack.transport-Ce96JBDk.mjs.map +1 -0
- package/dist/{slack.transport-BfJRouB2.js → slack.transport-Dlx3xvb7.js} +234 -41
- package/dist/slack.transport-Dlx3xvb7.js.map +1 -0
- package/dist/{slack.transport-BZzoXDPn.d.mts → slack.transport-DrirgDNy.d.ts} +56 -9
- package/dist/slack.transport-DrirgDNy.d.ts.map +1 -0
- package/dist/{slack.transport-CXjQYOes.d.ts → slack.transport-DxHOXlLu.d.mts} +56 -9
- package/dist/slack.transport-DxHOXlLu.d.mts.map +1 -0
- package/dist/testing.d.mts +3 -8
- package/dist/testing.d.mts.map +1 -1
- package/dist/testing.d.ts +3 -8
- package/dist/testing.d.ts.map +1 -1
- package/dist/testing.js +3 -4
- package/dist/testing.js.map +1 -1
- package/dist/testing.mjs +2 -3
- package/dist/testing.mjs.map +1 -1
- package/dist/{transport.manager-CXbKKdVE.js → transport.manager-DkcEOlqV.js} +164 -160
- package/dist/transport.manager-DkcEOlqV.js.map +1 -0
- package/dist/{transport.manager-BiuCAJd2.mjs → transport.manager-eZ_EeC00.mjs} +108 -99
- package/dist/transport.manager-eZ_EeC00.mjs.map +1 -0
- package/dist/{transport.types-CGoHpWQR.d.ts → transport.types-BJVL1QQl.d.mts} +1 -3
- package/dist/transport.types-BJVL1QQl.d.mts.map +1 -0
- package/dist/{transport.types-BMnurPcc.d.mts → transport.types-BJVL1QQl.d.ts} +1 -3
- package/dist/transport.types-BJVL1QQl.d.ts.map +1 -0
- package/dist/transports.d.mts +22 -36
- package/dist/transports.d.mts.map +1 -1
- package/dist/transports.d.ts +22 -36
- package/dist/transports.d.ts.map +1 -1
- package/dist/transports.js +10 -13
- package/dist/transports.mjs +7 -13
- package/dist/worker-entry.js +337 -87
- package/dist/worker.d.mts +1 -2
- package/dist/worker.d.ts +1 -2
- package/dist/worker.js +3 -4
- package/dist/worker.mjs +1 -4
- package/dist/{worker.transport-CdzSZJmw.d.ts → worker.transport-BuPwBi3d.d.ts} +2 -6
- package/dist/worker.transport-BuPwBi3d.d.ts.map +1 -0
- package/dist/{worker.transport-BdPxu3PN.js → worker.transport-C6GNl_r2.js} +44 -14
- package/dist/worker.transport-C6GNl_r2.js.map +1 -0
- package/dist/{worker.transport-lPxO2MVL.mjs → worker.transport-DLVA4y2e.mjs} +39 -9
- package/dist/worker.transport-DLVA4y2e.mjs.map +1 -0
- package/dist/{worker.transport-JvGPog3C.d.mts → worker.transport-hJay1wxA.d.mts} +2 -6
- package/dist/worker.transport-hJay1wxA.d.mts.map +1 -0
- package/package.json +19 -11
- package/dist/async-context-BzJrbfQs.mjs +0 -72
- package/dist/async-context-BzJrbfQs.mjs.map +0 -1
- package/dist/async-context-DyQQYq3I.js +0 -92
- package/dist/async-context-DyQQYq3I.js.map +0 -1
- package/dist/azure-monitor.transport-CHnjVRF-.mjs.map +0 -1
- package/dist/azure-monitor.transport-Cn_3Usvu.d.ts.map +0 -1
- package/dist/azure-monitor.transport-CrvfHd9C.js.map +0 -1
- package/dist/azure-monitor.transport-D7Da4RAb.d.mts.map +0 -1
- package/dist/batch-buffer-BY-mRWIK.js.map +0 -1
- package/dist/batch-buffer-PGvSgbmd.mjs.map +0 -1
- package/dist/builder-0gEzRopq.mjs.map +0 -1
- package/dist/builder-D44QktIo.js.map +0 -1
- package/dist/chunk-DLSkYcPk.mjs +0 -7
- package/dist/chunk-nOFOJqeH.js +0 -30
- package/dist/cloudwatch.transport-BO1ahxw-.js.map +0 -1
- package/dist/cloudwatch.transport-DZ6ies7g.mjs.map +0 -1
- package/dist/cloudwatch.transport-DsEq633o.d.ts.map +0 -1
- package/dist/cloudwatch.transport-UlyZFWMn.d.mts.map +0 -1
- package/dist/entry-fields-BJkuPnIg.mjs.map +0 -1
- package/dist/entry-fields-BvOLFlJ4.js.map +0 -1
- package/dist/gcp.transport-B7oc97sG.d.ts.map +0 -1
- package/dist/gcp.transport-CHV8MGgz.js.map +0 -1
- package/dist/gcp.transport-DBX5TPIy.mjs.map +0 -1
- package/dist/gcp.transport-GrJurKo8.d.mts.map +0 -1
- package/dist/index-3mw5gaCw.d.mts.map +0 -1
- package/dist/index-DhIoploR.d.ts.map +0 -1
- package/dist/internal-log-BUJYMZbE.js +0 -70
- package/dist/internal-log-BUJYMZbE.js.map +0 -1
- package/dist/internal-log-Cm8SOWSV.mjs +0 -52
- package/dist/internal-log-Cm8SOWSV.mjs.map +0 -1
- package/dist/logitron-logger-BFDSO8Io.d.mts.map +0 -1
- package/dist/logitron-logger-UVeN-mQm.d.ts.map +0 -1
- package/dist/safe-stringify-DJ66tW5I.mjs.map +0 -1
- package/dist/safe-stringify-DWo3aZp_.js.map +0 -1
- package/dist/search-BFbu_oVn.mjs.map +0 -1
- package/dist/search-C4V0OMEn.js.map +0 -1
- package/dist/search-CNh9uVwR.d.ts.map +0 -1
- package/dist/search-DXANsQ2n.d.mts.map +0 -1
- package/dist/slack.transport-BZzoXDPn.d.mts.map +0 -1
- package/dist/slack.transport-BfJRouB2.js.map +0 -1
- package/dist/slack.transport-Bzw7sucI.mjs.map +0 -1
- package/dist/slack.transport-CXjQYOes.d.ts.map +0 -1
- package/dist/trace.utils-CvXgaiQT.mjs.map +0 -1
- package/dist/trace.utils-DpBOLDtq.js.map +0 -1
- package/dist/transport.manager-BiuCAJd2.mjs.map +0 -1
- package/dist/transport.manager-CXbKKdVE.js.map +0 -1
- package/dist/transport.types-BMnurPcc.d.mts.map +0 -1
- package/dist/transport.types-CGoHpWQR.d.ts.map +0 -1
- package/dist/worker.transport-BdPxu3PN.js.map +0 -1
- package/dist/worker.transport-CdzSZJmw.d.ts.map +0 -1
- package/dist/worker.transport-JvGPog3C.d.mts.map +0 -1
- package/dist/worker.transport-lPxO2MVL.mjs.map +0 -1
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
const require_chunk = require('./chunk-nOFOJqeH.js');
|
|
2
|
-
let node_crypto = require("node:crypto");
|
|
3
|
-
node_crypto = require_chunk.__toESM(node_crypto);
|
|
4
1
|
let node_async_hooks = require("node:async_hooks");
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
2
|
+
let node_crypto = require("node:crypto");
|
|
3
|
+
// src/utils/trace.utils.ts
|
|
4
|
+
/**
|
|
5
|
+
* Trace ID utilities for Logitron
|
|
6
|
+
*/
|
|
8
7
|
/** Default key used to store the trace ID in AsyncLocalStorage. */
|
|
9
8
|
const TRACE_CONTEXT_KEY = "traceId";
|
|
10
9
|
/**
|
|
@@ -23,7 +22,6 @@ const TRACE_CONTEXT_KEY = "traceId";
|
|
|
23
22
|
* TraceContext.instance.getCurrentTraceId() // same as standalone fn
|
|
24
23
|
*/
|
|
25
24
|
var TraceContext = class TraceContext {
|
|
26
|
-
static #_ = this._instance = null;
|
|
27
25
|
constructor() {
|
|
28
26
|
this.storage = new node_async_hooks.AsyncLocalStorage();
|
|
29
27
|
this._contextKey = TRACE_CONTEXT_KEY;
|
|
@@ -86,6 +84,7 @@ var TraceContext = class TraceContext {
|
|
|
86
84
|
...data
|
|
87
85
|
}, fn);
|
|
88
86
|
}
|
|
87
|
+
static #_ = () => this._instance = null;
|
|
89
88
|
};
|
|
90
89
|
/**
|
|
91
90
|
* The shared AsyncLocalStorage instance.
|
|
@@ -183,7 +182,7 @@ const SAFE_INCOMING_ID = /^[A-Za-z0-9._:-]{1,128}$/;
|
|
|
183
182
|
*/
|
|
184
183
|
function sanitizeIncomingId(value) {
|
|
185
184
|
const first = Array.isArray(value) ? value[0] : value;
|
|
186
|
-
if (typeof first !== "string" || first.length >
|
|
185
|
+
if (typeof first !== "string" || first.length > 256) return void 0;
|
|
187
186
|
const trimmed = first.trim();
|
|
188
187
|
return SAFE_INCOMING_ID.test(trimmed) ? trimmed : void 0;
|
|
189
188
|
}
|
|
@@ -261,7 +260,7 @@ function createTraceMiddleware(config) {
|
|
|
261
260
|
...config.extractor
|
|
262
261
|
} : defaultExtractor
|
|
263
262
|
};
|
|
264
|
-
_setActiveContextKey(resolvedConfig.contextKey ??
|
|
263
|
+
_setActiveContextKey(resolvedConfig.contextKey ?? "traceId");
|
|
265
264
|
return (req, res, next) => {
|
|
266
265
|
let traceId;
|
|
267
266
|
if (resolvedConfig.extractor) traceId = extractTraceId(req, resolvedConfig.extractor);
|
|
@@ -275,84 +274,129 @@ function createTraceMiddleware(config) {
|
|
|
275
274
|
runWithTraceId(traceId, () => next());
|
|
276
275
|
};
|
|
277
276
|
}
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
277
|
+
// src/utils/request-trace.ts
|
|
278
|
+
/**
|
|
279
|
+
* Per-request trace ID resolution shared by the HTTP logger middleware and the
|
|
280
|
+
* context helpers. Internal: not re-exported from the package entry points.
|
|
281
|
+
*/
|
|
282
|
+
/** Fastify's default `genReqId` output (`req-` + base36 counter), unique only per process. */
|
|
283
|
+
const FASTIFY_COUNTER_ID = /^req-[\da-z]+$/;
|
|
284
|
+
const FALLBACK_KEY = "_logixiaFallbackId";
|
|
285
|
+
/** Header names to read a trace ID from, defaulting to the library-wide list. */
|
|
286
|
+
function resolveTraceHeaders(option) {
|
|
287
|
+
if (option === void 0) return DEFAULT_TRACE_HEADERS;
|
|
288
|
+
return typeof option === "string" ? [option] : option;
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Resolve the trace ID for a request: a sanitised incoming header (honouring
|
|
292
|
+
* `traceparent`), then a non-counter `request.id`, then a generated ID. Header
|
|
293
|
+
* and `request.id` are recomputed per call so each caller's own header list is
|
|
294
|
+
* honoured; only the generated fallback is stored on the request so every helper
|
|
295
|
+
* agrees when no ID was sent.
|
|
296
|
+
*/
|
|
297
|
+
function resolveRequestTraceId(req, headers) {
|
|
298
|
+
const fromHeader = extractTraceId(req, { header: [...headers] });
|
|
299
|
+
if (fromHeader !== void 0) return fromHeader;
|
|
300
|
+
const fromId = sanitizeIncomingId(req.id);
|
|
301
|
+
if (fromId !== void 0 && !FASTIFY_COUNTER_ID.test(fromId)) return fromId;
|
|
302
|
+
const holder = req;
|
|
303
|
+
const cached = holder[FALLBACK_KEY];
|
|
304
|
+
if (typeof cached === "string") return cached;
|
|
305
|
+
const generated = generateTraceId();
|
|
306
|
+
try {
|
|
307
|
+
holder[FALLBACK_KEY] = generated;
|
|
308
|
+
} catch {}
|
|
309
|
+
return generated;
|
|
310
|
+
}
|
|
311
|
+
Object.defineProperty(exports, "DEFAULT_TRACE_HEADERS", {
|
|
312
|
+
enumerable: true,
|
|
313
|
+
get: function() {
|
|
314
|
+
return DEFAULT_TRACE_HEADERS;
|
|
315
|
+
}
|
|
316
|
+
});
|
|
317
|
+
Object.defineProperty(exports, "MAX_INCOMING_ID_LENGTH", {
|
|
318
|
+
enumerable: true,
|
|
319
|
+
get: function() {
|
|
320
|
+
return MAX_INCOMING_ID_LENGTH;
|
|
321
|
+
}
|
|
285
322
|
});
|
|
286
|
-
Object.defineProperty(exports,
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
323
|
+
Object.defineProperty(exports, "TRACE_CONTEXT_KEY", {
|
|
324
|
+
enumerable: true,
|
|
325
|
+
get: function() {
|
|
326
|
+
return TRACE_CONTEXT_KEY;
|
|
327
|
+
}
|
|
291
328
|
});
|
|
292
|
-
Object.defineProperty(exports,
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
329
|
+
Object.defineProperty(exports, "TraceContext", {
|
|
330
|
+
enumerable: true,
|
|
331
|
+
get: function() {
|
|
332
|
+
return TraceContext;
|
|
333
|
+
}
|
|
297
334
|
});
|
|
298
|
-
Object.defineProperty(exports,
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
335
|
+
Object.defineProperty(exports, "_setActiveContextKey", {
|
|
336
|
+
enumerable: true,
|
|
337
|
+
get: function() {
|
|
338
|
+
return _setActiveContextKey;
|
|
339
|
+
}
|
|
303
340
|
});
|
|
304
|
-
Object.defineProperty(exports,
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
341
|
+
Object.defineProperty(exports, "createTraceMiddleware", {
|
|
342
|
+
enumerable: true,
|
|
343
|
+
get: function() {
|
|
344
|
+
return createTraceMiddleware;
|
|
345
|
+
}
|
|
309
346
|
});
|
|
310
|
-
Object.defineProperty(exports,
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
347
|
+
Object.defineProperty(exports, "extractTraceId", {
|
|
348
|
+
enumerable: true,
|
|
349
|
+
get: function() {
|
|
350
|
+
return extractTraceId;
|
|
351
|
+
}
|
|
315
352
|
});
|
|
316
|
-
Object.defineProperty(exports,
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
353
|
+
Object.defineProperty(exports, "getCurrentTraceId", {
|
|
354
|
+
enumerable: true,
|
|
355
|
+
get: function() {
|
|
356
|
+
return getCurrentTraceId;
|
|
357
|
+
}
|
|
321
358
|
});
|
|
322
|
-
Object.defineProperty(exports,
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
359
|
+
Object.defineProperty(exports, "getTraceContextKey", {
|
|
360
|
+
enumerable: true,
|
|
361
|
+
get: function() {
|
|
362
|
+
return getTraceContextKey;
|
|
363
|
+
}
|
|
327
364
|
});
|
|
328
|
-
Object.defineProperty(exports,
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
365
|
+
Object.defineProperty(exports, "resolveRequestTraceId", {
|
|
366
|
+
enumerable: true,
|
|
367
|
+
get: function() {
|
|
368
|
+
return resolveRequestTraceId;
|
|
369
|
+
}
|
|
333
370
|
});
|
|
334
|
-
Object.defineProperty(exports,
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
371
|
+
Object.defineProperty(exports, "resolveTraceHeaders", {
|
|
372
|
+
enumerable: true,
|
|
373
|
+
get: function() {
|
|
374
|
+
return resolveTraceHeaders;
|
|
375
|
+
}
|
|
339
376
|
});
|
|
340
|
-
Object.defineProperty(exports,
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
377
|
+
Object.defineProperty(exports, "runWithTraceId", {
|
|
378
|
+
enumerable: true,
|
|
379
|
+
get: function() {
|
|
380
|
+
return runWithTraceId;
|
|
381
|
+
}
|
|
345
382
|
});
|
|
346
|
-
Object.defineProperty(exports,
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
383
|
+
Object.defineProperty(exports, "sanitizeIncomingId", {
|
|
384
|
+
enumerable: true,
|
|
385
|
+
get: function() {
|
|
386
|
+
return sanitizeIncomingId;
|
|
387
|
+
}
|
|
351
388
|
});
|
|
352
|
-
Object.defineProperty(exports,
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
389
|
+
Object.defineProperty(exports, "setTraceId", {
|
|
390
|
+
enumerable: true,
|
|
391
|
+
get: function() {
|
|
392
|
+
return setTraceId;
|
|
393
|
+
}
|
|
357
394
|
});
|
|
358
|
-
|
|
395
|
+
Object.defineProperty(exports, "traceStorage", {
|
|
396
|
+
enumerable: true,
|
|
397
|
+
get: function() {
|
|
398
|
+
return traceStorage;
|
|
399
|
+
}
|
|
400
|
+
});
|
|
401
|
+
|
|
402
|
+
//# sourceMappingURL=request-trace-wTJdKp6-.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-trace-wTJdKp6-.js","names":["AsyncLocalStorage","randomUUID"],"sources":["../src/utils/trace.utils.ts","../src/utils/request-trace.ts"],"sourcesContent":["/**\n * Trace ID utilities for Logitron\n */\n\nimport { AsyncLocalStorage } from 'node:async_hooks';\nimport { randomUUID } from 'node:crypto';\n\nimport type { TraceIdConfig, TraceIdExtractorConfig } from '../types';\n\n/** Default key used to store the trace ID in AsyncLocalStorage. */\nexport const TRACE_CONTEXT_KEY = 'traceId' as const;\n\n// ── TraceContext class ────────────────────────────────────────────────────────\n\n/**\n * Singleton that owns the AsyncLocalStorage and the active contextKey.\n *\n * Why a class instead of bare module-level variables?\n * - The contextKey is user-configurable; encapsulating it here means there is\n * exactly one place that reads and writes it.\n * - All helpers (getCurrentTraceId, runWithTraceId, etc.) delegate to this\n * instance, so the key is always in sync without hidden global state.\n * - Easier to test: you can reset the singleton between test cases.\n *\n * Usage (advanced):\n * import { TraceContext } from 'logixia';\n * TraceContext.instance.contextKey // → 'traceId' (or custom)\n * TraceContext.instance.getCurrentTraceId() // same as standalone fn\n */\nexport class TraceContext {\n private static _instance: TraceContext | null = null;\n\n readonly storage = new AsyncLocalStorage<Record<string, unknown>>();\n private _contextKey: string = TRACE_CONTEXT_KEY;\n\n private constructor() {}\n\n /** The process-wide singleton. */\n static get instance(): TraceContext {\n if (!TraceContext._instance) {\n TraceContext._instance = new TraceContext();\n }\n return TraceContext._instance;\n }\n\n /** @internal Reset the singleton (useful in tests). */\n static _reset(): void {\n TraceContext._instance = null;\n }\n\n // ── Key management ──────────────────────────────────────────────────────────\n\n /** The AsyncLocalStorage key that holds the trace ID value. */\n get contextKey(): string {\n return this._contextKey;\n }\n\n /** @internal Called by TraceMiddleware when it boots to register the user's key. */\n setContextKey(key: string): void {\n this._contextKey = key;\n }\n\n // ── Core operations ─────────────────────────────────────────────────────────\n\n /** UUID v4 generator (default). */\n generate(): string {\n return randomUUID();\n }\n\n /** Read the trace ID from the current async context. */\n getCurrentTraceId(): string | undefined {\n return this.storage.getStore()?.[this._contextKey] as string | undefined;\n }\n\n /**\n * Mutate the CURRENT async context in-place.\n *\n * ⚠️ DEPRECATED — unsafe for concurrent requests.\n *\n * Uses `AsyncLocalStorage.enterWith()`, which mutates the current async\n * execution context and every Promise chain spawned from it. In a server\n * processing overlapping requests this can cause a trace ID set for one\n * request to bleed into *other* in-flight requests that share the same\n * async parent (e.g. a module-level setup function or a cached handler).\n *\n * Use {@link run} instead — it scopes the context to a callback so there\n * is no risk of cross-request leakage.\n *\n * @deprecated Use `TraceContext.instance.run(traceId, fn)` — do not call\n * `setTraceId` from request-handling code.\n */\n setTraceId(traceId: string, data?: Record<string, unknown>): void {\n const current = this.storage.getStore() ?? {};\n this.storage.enterWith({ ...current, [this._contextKey]: traceId, ...data });\n }\n\n /** Run `fn` inside a new async context that carries `traceId`. */\n run<T>(traceId: string, fn: () => T, data?: Record<string, unknown>): T {\n return this.storage.run({ [this._contextKey]: traceId, ...data }, fn);\n }\n}\n\n// ── Module-level aliases (backwards-compatible public API) ────────────────────\n\n/**\n * The shared AsyncLocalStorage instance.\n * @deprecated Prefer `TraceContext.instance.storage` for new code.\n */\nexport const traceStorage = TraceContext.instance.storage;\n\n/** Returns the key currently used to store the trace ID in AsyncLocalStorage. */\nexport function getTraceContextKey(): string {\n return TraceContext.instance.contextKey;\n}\n\n/** @internal Called by TraceMiddleware / traceMiddleware() when they boot. */\nexport function _setActiveContextKey(key: string): void {\n TraceContext.instance.setContextKey(key);\n}\n\n/** Generate a UUID v4 trace ID. */\nexport function generateTraceId(): string {\n return TraceContext.instance.generate();\n}\n\n/**\n * Get the current trace ID from async context.\n * Returns `undefined` when called outside a traced request.\n */\nexport function getCurrentTraceId(): string | undefined {\n return TraceContext.instance.getCurrentTraceId();\n}\n\n/**\n * Set trace ID in the CURRENT async context without starting a new one.\n *\n * ⚠️ DEPRECATED — unsafe for concurrent requests.\n *\n * Uses `AsyncLocalStorage.enterWith()`, which mutates the current async\n * execution context and every Promise chain spawned from it. Under load this\n * can cause a trace ID from one request to bleed into others sharing the same\n * async parent.\n *\n * Use {@link runWithTraceId} instead. Migration patterns:\n *\n * **Express / Fastify middleware — before:**\n * ```ts\n * app.use((req, _res, next) => {\n * setTraceId(req.headers['x-trace-id'] ?? generateTraceId());\n * next();\n * });\n * ```\n * **after:**\n * ```ts\n * app.use((req, _res, next) => {\n * runWithTraceId(req.headers['x-trace-id'] ?? generateTraceId(), () => next());\n * });\n * ```\n *\n * **Kafka / queue consumer — before:**\n * ```ts\n * async function handle(msg) {\n * setTraceId(msg.headers['x-trace-id']);\n * await processMessage(msg);\n * }\n * ```\n * **after:**\n * ```ts\n * async function handle(msg) {\n * await runWithTraceId(msg.headers['x-trace-id'], () => processMessage(msg));\n * }\n * ```\n *\n * **Background job — before:**\n * ```ts\n * setTraceId(generateTraceId(), { jobId: job.id });\n * await job.run();\n * ```\n * **after:**\n * ```ts\n * await runWithTraceId(generateTraceId(), () => job.run(), { jobId: job.id });\n * ```\n *\n * @deprecated Use `runWithTraceId(traceId, fn)` — do not call `setTraceId`\n * from request-handling code.\n */\nexport function setTraceId(traceId: string, data?: Record<string, unknown>): void {\n TraceContext.instance.setTraceId(traceId, data);\n}\n\n/** Run `fn` inside a new async context carrying `traceId`. */\nexport function runWithTraceId<T>(traceId: string, fn: () => T, data?: Record<string, unknown>): T {\n return TraceContext.instance.run(traceId, fn, data);\n}\n\n// ── Request extraction ────────────────────────────────────────────────────────\n\ntype HeaderValue = string | string[] | undefined;\n\n/** Shape that extractTraceId accepts (Express-compatible) */\ninterface RequestLike {\n headers?: Record<string, HeaderValue>;\n query?: Record<string, HeaderValue>;\n body?: Record<string, string | undefined>;\n params?: Record<string, string | undefined>;\n}\n\n/** Maximum accepted length for an incoming trace / correlation / request ID. */\nexport const MAX_INCOMING_ID_LENGTH = 128;\n\nconst SAFE_INCOMING_ID = /^[A-Za-z0-9._:-]{1,128}$/;\n\n/**\n * Validate an externally supplied identifier (trace ID, correlation ID, origin\n * service name, message-queue ID). Accepts only 1-128 characters from\n * `[A-Za-z0-9._:-]`; surrounding whitespace is trimmed first. Arrays use their\n * first element. Returns the cleaned value, or `undefined` when it is unusable\n * so callers can generate a fresh ID instead of passing client text through.\n */\nexport function sanitizeIncomingId(value: unknown): string | undefined {\n const first = Array.isArray(value) ? value[0] : value;\n if (typeof first !== 'string' || first.length > MAX_INCOMING_ID_LENGTH * 2) return undefined;\n const trimmed = first.trim();\n return SAFE_INCOMING_ID.test(trimmed) ? trimmed : undefined;\n}\n\n/** W3C trace-context: `version-traceId(32hex)-spanId(16hex)-flags(2hex)`. */\nconst W3C_TRACEPARENT_RE = /^[\\da-f]{2}-([\\da-f]{32})-[\\da-f]{16}-[\\da-f]{2}$/i;\n\n/**\n * Extract the 32-hex trace-id segment from a W3C `traceparent` header value.\n * Returns the parsed trace ID, or the original value unchanged when it is not a\n * well-formed traceparent (so non-W3C propagation still works).\n */\nfunction parseTraceparent(value: string): string {\n const m = W3C_TRACEPARENT_RE.exec(value);\n return m ? m[1]! : value;\n}\n\n/** Extract trace ID from request using configuration (header → query → body → params). */\nexport function extractTraceId(\n request: unknown,\n config: TraceIdExtractorConfig\n): string | undefined {\n const req = request as RequestLike;\n\n if (config.header) {\n const headers = Array.isArray(config.header) ? config.header : [config.header];\n for (const header of headers) {\n const lower = header.toLowerCase();\n const value = sanitizeIncomingId(req.headers?.[lower]);\n if (value) return lower === 'traceparent' ? parseTraceparent(value) : value;\n }\n }\n\n if (config.query) {\n const queries = Array.isArray(config.query) ? config.query : [config.query];\n for (const query of queries) {\n const value = sanitizeIncomingId(req.query?.[query]);\n if (value) return value;\n }\n }\n\n if (config.body) {\n const bodyFields = Array.isArray(config.body) ? config.body : [config.body];\n for (const field of bodyFields) {\n const value = sanitizeIncomingId(req.body?.[field]);\n if (value) return value;\n }\n }\n\n if (config.params) {\n const paramFields = Array.isArray(config.params) ? config.params : [config.params];\n for (const param of paramFields) {\n const value = sanitizeIncomingId(req.params?.[param]);\n if (value) return value;\n }\n }\n\n return undefined;\n}\n\n/**\n * Default headers checked for incoming trace ID propagation, in priority order:\n * traceparent (W3C/OTel) → x-trace-id → x-request-id → x-correlation-id → trace-id\n */\nexport const DEFAULT_TRACE_HEADERS = [\n 'traceparent',\n 'x-trace-id',\n 'x-request-id',\n 'x-correlation-id',\n 'trace-id',\n];\n\n/**\n * Create trace ID middleware for Express/NestJS\n */\nexport function createTraceMiddleware(config: TraceIdConfig) {\n const defaultExtractor = {\n header: DEFAULT_TRACE_HEADERS,\n query: ['traceId', 'trace_id'],\n };\n const resolvedConfig: TraceIdConfig = {\n ...config,\n extractor: config?.extractor ? { ...defaultExtractor, ...config.extractor } : defaultExtractor,\n };\n\n _setActiveContextKey(resolvedConfig.contextKey ?? TRACE_CONTEXT_KEY);\n\n return (req: unknown, res: unknown, next: () => void) => {\n let traceId: string | undefined;\n\n if (resolvedConfig.extractor) {\n traceId = extractTraceId(req, resolvedConfig.extractor);\n }\n\n if (!traceId) {\n traceId = resolvedConfig.generator ? resolvedConfig.generator() : generateTraceId();\n }\n\n (req as Record<string, unknown>).traceId = traceId;\n // Echo the trace ID back on the response, tolerating different response APIs:\n // Express/Node use res.setHeader(), Fastify replies use reply.header(). Guard\n // both and never let a missing/!function method (or already-sent headers)\n // crash the request — the trace ID is still propagated via async context.\n const resObj = res as {\n setHeader?: (k: string, v: string) => void;\n header?: (k: string, v: string) => void;\n headersSent?: boolean;\n };\n if (!resObj.headersSent) {\n try {\n if (typeof resObj.setHeader === 'function') {\n resObj.setHeader('X-Trace-Id', traceId);\n } else if (typeof resObj.header === 'function') {\n resObj.header('X-Trace-Id', traceId);\n }\n } catch {\n /* response not in a header-settable state — context propagation still works */\n }\n }\n\n runWithTraceId(traceId, () => next());\n };\n}\n","/**\n * Per-request trace ID resolution shared by the HTTP logger middleware and the\n * context helpers. Internal: not re-exported from the package entry points.\n */\n\nimport {\n DEFAULT_TRACE_HEADERS,\n extractTraceId,\n generateTraceId,\n sanitizeIncomingId,\n} from './trace.utils';\n\nexport type TraceHeaderOption = string | readonly string[];\n\n/** Minimal structural request shape; Express and Fastify requests satisfy it. */\nexport interface ContextRequestLike {\n headers?: Record<string, string | string[] | undefined>;\n id?: unknown;\n}\n\n/** Fastify's default `genReqId` output (`req-` + base36 counter), unique only per process. */\nconst FASTIFY_COUNTER_ID = /^req-[\\da-z]+$/;\n\nconst FALLBACK_KEY = '_logixiaFallbackId';\n\n/** Header names to read a trace ID from, defaulting to the library-wide list. */\nexport function resolveTraceHeaders(option: TraceHeaderOption | undefined): readonly string[] {\n if (option === undefined) return DEFAULT_TRACE_HEADERS;\n return typeof option === 'string' ? [option] : option;\n}\n\n/**\n * Resolve the trace ID for a request: a sanitised incoming header (honouring\n * `traceparent`), then a non-counter `request.id`, then a generated ID. Header\n * and `request.id` are recomputed per call so each caller's own header list is\n * honoured; only the generated fallback is stored on the request so every helper\n * agrees when no ID was sent.\n */\nexport function resolveRequestTraceId(req: ContextRequestLike, headers: readonly string[]): string {\n const fromHeader = extractTraceId(req, { header: [...headers] });\n if (fromHeader !== undefined) return fromHeader;\n\n const fromId = sanitizeIncomingId(req.id);\n if (fromId !== undefined && !FASTIFY_COUNTER_ID.test(fromId)) return fromId;\n\n const holder = req as Record<string, unknown>;\n const cached = holder[FALLBACK_KEY];\n if (typeof cached === 'string') return cached;\n const generated = generateTraceId();\n try {\n holder[FALLBACK_KEY] = generated;\n } catch {\n // frozen request object: each caller generates its own\n }\n return generated;\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
// src/utils/safe-stringify.ts
|
|
2
2
|
/** Build a JSONPath like `$["a"][0]["b"]` for a decycle pointer. */
|
|
3
3
|
function jsonPath(parts) {
|
|
4
4
|
let path = "$";
|
|
@@ -112,7 +112,6 @@ function stringifyForLog(value) {
|
|
|
112
112
|
}
|
|
113
113
|
}
|
|
114
114
|
}
|
|
115
|
-
|
|
116
|
-
//#endregion
|
|
117
115
|
export { stringifyForLog as i, retrocycle as n, safeStringify as r, decycleValue as t };
|
|
118
|
-
|
|
116
|
+
|
|
117
|
+
//# sourceMappingURL=safe-stringify-BMRl3EX3.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safe-stringify-BMRl3EX3.mjs","names":[],"sources":["../src/utils/safe-stringify.ts"],"sourcesContent":["/**\n * logixia — robust JSON serialization for log payloads.\n *\n * Modern Winston/Pino already neutralize circular refs to `[Circular]` (via\n * safe-stable-stringify / fast-safe-stringify), so merely \"surviving cycles\" is\n * not a differentiator. This goes one notch further:\n *\n * - **BigInt** → serialized (as a string by default; JSON.stringify throws on\n * BigInt, which silently breaks logging of e.g. DB bigint ids).\n * - **Deterministic key order** (optional) so identical objects hash/diff equal.\n * - **True decycle** (optional) — replace repeated references with JSONPath\n * `$ref` pointers that round-trip back to the original object graph, instead\n * of the lossy `[Circular]` tag. Useful when you need to reconstruct shared\n * structure downstream.\n *\n * @example\n * ```ts\n * safeStringify({ id: 10n, self: obj }); // → BigInt + cycle safe\n * safeStringify(graph, { decycle: true }); // → round-trippable $ref pointers\n * const back = retrocycle(JSON.parse(json)); // → reconstruct shared refs\n * ```\n */\n\nexport interface SafeStringifyOptions {\n /** Indentation passed to JSON.stringify (number of spaces or a string). */\n indent?: number | string;\n /** Sort object keys for deterministic output. Default: false. */\n deterministic?: boolean;\n /**\n * Use round-trippable `$ref` JSONPath pointers for repeated references instead\n * of the lossy \"[Circular]\" tag. Default: false.\n */\n decycle?: boolean;\n /** How to render BigInt: 'string' (default) or 'number' (may lose precision). */\n bigint?: 'string' | 'number';\n}\n\n/** Build a JSONPath like `$[\"a\"][0][\"b\"]` for a decycle pointer. */\nfunction jsonPath(parts: Array<string | number>): string {\n let path = '$';\n for (const p of parts) {\n path += typeof p === 'number' ? `[${p}]` : `[${JSON.stringify(p)}]`;\n }\n return path;\n}\n\n/**\n * Serialize any value to JSON without throwing on circular references or BigInt.\n * Circular refs become `\"[Circular]\"` (or `{ $ref }` pointers when `decycle`).\n */\nexport function safeStringify(value: unknown, options: SafeStringifyOptions = {}): string {\n const { indent, deterministic = false, decycle = false, bigint = 'string' } = options;\n\n if (decycle) {\n return JSON.stringify(decycleValue(value, bigint), undefined, indent);\n }\n\n const seen = new WeakSet<object>();\n\n const transform = (val: unknown): unknown => {\n if (typeof val === 'bigint') return bigint === 'number' ? Number(val) : val.toString();\n if (typeof val === 'function') return `[Function: ${val.name || 'anonymous'}]`;\n if (typeof val === 'symbol') return val.toString();\n if (val === null || typeof val !== 'object') return val;\n\n if (seen.has(val)) return '[Circular]';\n seen.add(val);\n\n let out: unknown;\n const toJSON = (val as { toJSON?: unknown }).toJSON;\n if (Array.isArray(val)) {\n out = val.map((item) => transform(item));\n } else if (typeof toJSON === 'function') {\n // Dates, URLs, Buffers and classes with their own toJSON print the way\n // JSON.stringify would; a toJSON that returns `this` hits the cycle check.\n out = transform(toJSON.call(val));\n } else {\n const rec = val as Record<string, unknown>;\n const keys = deterministic ? Object.keys(rec).sort() : Object.keys(rec);\n const obj: Record<string, unknown> = {};\n for (const k of keys) {\n if (k === '__proto__' || k === 'constructor' || k === 'prototype') continue;\n obj[k] = transform(rec[k]);\n }\n out = obj;\n }\n // Allow the same object to appear in sibling branches (not a true cycle):\n // remove from `seen` after we finish its subtree.\n seen.delete(val);\n return out;\n };\n\n return JSON.stringify(transform(value), undefined, indent);\n}\n\n/**\n * Replace repeated object references with round-trippable `{ \"$ref\": \"$...\" }`\n * JSONPath pointers (the classic Crockford decycle). Pair with {@link retrocycle}\n * to reconstruct the original shared/circular graph.\n */\nexport function decycleValue(value: unknown, bigint: 'string' | 'number' = 'string'): unknown {\n const paths = new WeakMap<object, string>();\n\n const walk = (val: unknown, path: Array<string | number>): unknown => {\n if (typeof val === 'bigint') return bigint === 'number' ? Number(val) : val.toString();\n if (val === null || typeof val !== 'object') return val;\n if (val instanceof Date) return val.toISOString();\n\n const existing = paths.get(val);\n if (existing !== undefined) return { $ref: existing };\n paths.set(val, jsonPath(path));\n\n if (Array.isArray(val)) {\n return val.map((item, i) => walk(item, [...path, i]));\n }\n const rec = val as Record<string, unknown>;\n const obj: Record<string, unknown> = {};\n for (const k of Object.keys(rec)) {\n if (k === '__proto__' || k === 'constructor' || k === 'prototype') continue;\n obj[k] = walk(rec[k], [...path, k]);\n }\n return obj;\n };\n\n return walk(value, []);\n}\n\n/**\n * Inverse of {@link decycleValue}: resolve `{ \"$ref\": \"$...\" }` pointers back\n * into the live object graph (mutates and returns the parsed input).\n */\nexport function retrocycle<T>(root: T): T {\n const refRe = /^\\$(?:\\[(?:\\d+|\"(?:[^\"\\\\]|\\\\.)*\")\\])*$/;\n\n const resolve = (path: string): unknown => {\n // Parse the JSONPath segments back out.\n const segs: Array<string | number> = [];\n const partRe = /\\[(\\d+|\"(?:[^\"\\\\]|\\\\.)*\")\\]/g;\n let m: RegExpExecArray | null;\n while ((m = partRe.exec(path)) !== null) {\n const raw = m[1]!;\n segs.push(raw.startsWith('\"') ? (JSON.parse(raw) as string) : Number(raw));\n }\n let node: unknown = root;\n for (const s of segs) {\n node = (node as Record<string | number, unknown>)[s];\n }\n return node;\n };\n\n const walk = (val: unknown): void => {\n if (val === null || typeof val !== 'object') return;\n const rec = val as Record<string, unknown>;\n for (const k of Object.keys(rec)) {\n const child = rec[k];\n if (\n child !== null &&\n typeof child === 'object' &&\n typeof (child as { $ref?: unknown }).$ref === 'string' &&\n refRe.test((child as { $ref: string }).$ref)\n ) {\n rec[k] = resolve((child as { $ref: string }).$ref);\n } else {\n walk(child);\n }\n }\n };\n\n walk(root);\n return root;\n}\n\n/**\n * `JSON.stringify` for log output. Takes the plain fast path first and only\n * falls back to {@link safeStringify} when that throws (a cycle, a BigInt, a\n * throwing `toJSON`), so a bad payload costs nothing until it shows up.\n * Never throws: if even the safe walk fails, the value is replaced by a marker.\n */\nexport function stringifyForLog(value: unknown): string {\n try {\n return JSON.stringify(value);\n } catch {\n try {\n return safeStringify(value);\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n return JSON.stringify(`[Unserializable: ${reason}]`);\n }\n }\n}\n"],"mappings":";;AAsCA,SAAS,SAAS,OAAuC;CACvD,IAAI,OAAO;CACX,KAAK,MAAM,KAAK,OACd,QAAQ,OAAO,MAAM,WAAW,IAAI,EAAE,KAAK,IAAI,KAAK,UAAU,CAAC,EAAE;CAEnE,OAAO;AACT;;;;;AAMA,SAAgB,cAAc,OAAgB,UAAgC,CAAC,GAAW;CACxF,MAAM,EAAE,QAAQ,gBAAgB,OAAO,UAAU,OAAO,SAAS,aAAa;CAE9E,IAAI,SACF,OAAO,KAAK,UAAU,aAAa,OAAO,MAAM,GAAG,KAAA,GAAW,MAAM;CAGtE,MAAM,uBAAO,IAAI,QAAgB;CAEjC,MAAM,aAAa,QAA0B;EAC3C,IAAI,OAAO,QAAQ,UAAU,OAAO,WAAW,WAAW,OAAO,GAAG,IAAI,IAAI,SAAS;EACrF,IAAI,OAAO,QAAQ,YAAY,OAAO,cAAc,IAAI,QAAQ,YAAY;EAC5E,IAAI,OAAO,QAAQ,UAAU,OAAO,IAAI,SAAS;EACjD,IAAI,QAAQ,QAAQ,OAAO,QAAQ,UAAU,OAAO;EAEpD,IAAI,KAAK,IAAI,GAAG,GAAG,OAAO;EAC1B,KAAK,IAAI,GAAG;EAEZ,IAAI;EACJ,MAAM,SAAU,IAA6B;EAC7C,IAAI,MAAM,QAAQ,GAAG,GACnB,MAAM,IAAI,KAAK,SAAS,UAAU,IAAI,CAAC;OAClC,IAAI,OAAO,WAAW,YAG3B,MAAM,UAAU,OAAO,KAAK,GAAG,CAAC;OAC3B;GACL,MAAM,MAAM;GACZ,MAAM,OAAO,gBAAgB,OAAO,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,OAAO,KAAK,GAAG;GACtE,MAAM,MAA+B,CAAC;GACtC,KAAK,MAAM,KAAK,MAAM;IACpB,IAAI,MAAM,eAAe,MAAM,iBAAiB,MAAM,aAAa;IACnE,IAAI,KAAK,UAAU,IAAI,EAAE;GAC3B;GACA,MAAM;EACR;EAGA,KAAK,OAAO,GAAG;EACf,OAAO;CACT;CAEA,OAAO,KAAK,UAAU,UAAU,KAAK,GAAG,KAAA,GAAW,MAAM;AAC3D;;;;;;AAOA,SAAgB,aAAa,OAAgB,SAA8B,UAAmB;CAC5F,MAAM,wBAAQ,IAAI,QAAwB;CAE1C,MAAM,QAAQ,KAAc,SAA0C;EACpE,IAAI,OAAO,QAAQ,UAAU,OAAO,WAAW,WAAW,OAAO,GAAG,IAAI,IAAI,SAAS;EACrF,IAAI,QAAQ,QAAQ,OAAO,QAAQ,UAAU,OAAO;EACpD,IAAI,eAAe,MAAM,OAAO,IAAI,YAAY;EAEhD,MAAM,WAAW,MAAM,IAAI,GAAG;EAC9B,IAAI,aAAa,KAAA,GAAW,OAAO,EAAE,MAAM,SAAS;EACpD,MAAM,IAAI,KAAK,SAAS,IAAI,CAAC;EAE7B,IAAI,MAAM,QAAQ,GAAG,GACnB,OAAO,IAAI,KAAK,MAAM,MAAM,KAAK,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;EAEtD,MAAM,MAAM;EACZ,MAAM,MAA+B,CAAC;EACtC,KAAK,MAAM,KAAK,OAAO,KAAK,GAAG,GAAG;GAChC,IAAI,MAAM,eAAe,MAAM,iBAAiB,MAAM,aAAa;GACnE,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC;EACpC;EACA,OAAO;CACT;CAEA,OAAO,KAAK,OAAO,CAAC,CAAC;AACvB;;;;;AAMA,SAAgB,WAAc,MAAY;CACxC,MAAM,QAAQ;CAEd,MAAM,WAAW,SAA0B;EAEzC,MAAM,OAA+B,CAAC;EACtC,MAAM,SAAS;EACf,IAAI;EACJ,QAAQ,IAAI,OAAO,KAAK,IAAI,OAAO,MAAM;GACvC,MAAM,MAAM,EAAE;GACd,KAAK,KAAK,IAAI,WAAW,IAAG,IAAK,KAAK,MAAM,GAAG,IAAe,OAAO,GAAG,CAAC;EAC3E;EACA,IAAI,OAAgB;EACpB,KAAK,MAAM,KAAK,MACd,OAAQ,KAA0C;EAEpD,OAAO;CACT;CAEA,MAAM,QAAQ,QAAuB;EACnC,IAAI,QAAQ,QAAQ,OAAO,QAAQ,UAAU;EAC7C,MAAM,MAAM;EACZ,KAAK,MAAM,KAAK,OAAO,KAAK,GAAG,GAAG;GAChC,MAAM,QAAQ,IAAI;GAClB,IACE,UAAU,QACV,OAAO,UAAU,YACjB,OAAQ,MAA6B,SAAS,YAC9C,MAAM,KAAM,MAA2B,IAAI,GAE3C,IAAI,KAAK,QAAS,MAA2B,IAAI;QAEjD,KAAK,KAAK;EAEd;CACF;CAEA,KAAK,IAAI;CACT,OAAO;AACT;;;;;;;AAQA,SAAgB,gBAAgB,OAAwB;CACtD,IAAI;EACF,OAAO,KAAK,UAAU,KAAK;CAC7B,QAAQ;EACN,IAAI;GACF,OAAO,cAAc,KAAK;EAC5B,SAAS,OAAO;GACd,MAAM,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;GACpE,OAAO,KAAK,UAAU,oBAAoB,OAAO,EAAE;EACrD;CACF;AACF"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
//#region src/utils/safe-stringify.ts
|
|
1
|
+
// src/utils/safe-stringify.ts
|
|
3
2
|
/** Build a JSONPath like `$["a"][0]["b"]` for a decycle pointer. */
|
|
4
3
|
function jsonPath(parts) {
|
|
5
4
|
let path = "$";
|
|
@@ -113,30 +112,29 @@ function stringifyForLog(value) {
|
|
|
113
112
|
}
|
|
114
113
|
}
|
|
115
114
|
}
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
return decycleValue;
|
|
122
|
-
}
|
|
115
|
+
Object.defineProperty(exports, "decycleValue", {
|
|
116
|
+
enumerable: true,
|
|
117
|
+
get: function() {
|
|
118
|
+
return decycleValue;
|
|
119
|
+
}
|
|
123
120
|
});
|
|
124
|
-
Object.defineProperty(exports,
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
121
|
+
Object.defineProperty(exports, "retrocycle", {
|
|
122
|
+
enumerable: true,
|
|
123
|
+
get: function() {
|
|
124
|
+
return retrocycle;
|
|
125
|
+
}
|
|
129
126
|
});
|
|
130
|
-
Object.defineProperty(exports,
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
127
|
+
Object.defineProperty(exports, "safeStringify", {
|
|
128
|
+
enumerable: true,
|
|
129
|
+
get: function() {
|
|
130
|
+
return safeStringify;
|
|
131
|
+
}
|
|
135
132
|
});
|
|
136
|
-
Object.defineProperty(exports,
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
133
|
+
Object.defineProperty(exports, "stringifyForLog", {
|
|
134
|
+
enumerable: true,
|
|
135
|
+
get: function() {
|
|
136
|
+
return stringifyForLog;
|
|
137
|
+
}
|
|
141
138
|
});
|
|
142
|
-
|
|
139
|
+
|
|
140
|
+
//# sourceMappingURL=safe-stringify-DLz1Kz3o.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safe-stringify-DLz1Kz3o.js","names":[],"sources":["../src/utils/safe-stringify.ts"],"sourcesContent":["/**\n * logixia — robust JSON serialization for log payloads.\n *\n * Modern Winston/Pino already neutralize circular refs to `[Circular]` (via\n * safe-stable-stringify / fast-safe-stringify), so merely \"surviving cycles\" is\n * not a differentiator. This goes one notch further:\n *\n * - **BigInt** → serialized (as a string by default; JSON.stringify throws on\n * BigInt, which silently breaks logging of e.g. DB bigint ids).\n * - **Deterministic key order** (optional) so identical objects hash/diff equal.\n * - **True decycle** (optional) — replace repeated references with JSONPath\n * `$ref` pointers that round-trip back to the original object graph, instead\n * of the lossy `[Circular]` tag. Useful when you need to reconstruct shared\n * structure downstream.\n *\n * @example\n * ```ts\n * safeStringify({ id: 10n, self: obj }); // → BigInt + cycle safe\n * safeStringify(graph, { decycle: true }); // → round-trippable $ref pointers\n * const back = retrocycle(JSON.parse(json)); // → reconstruct shared refs\n * ```\n */\n\nexport interface SafeStringifyOptions {\n /** Indentation passed to JSON.stringify (number of spaces or a string). */\n indent?: number | string;\n /** Sort object keys for deterministic output. Default: false. */\n deterministic?: boolean;\n /**\n * Use round-trippable `$ref` JSONPath pointers for repeated references instead\n * of the lossy \"[Circular]\" tag. Default: false.\n */\n decycle?: boolean;\n /** How to render BigInt: 'string' (default) or 'number' (may lose precision). */\n bigint?: 'string' | 'number';\n}\n\n/** Build a JSONPath like `$[\"a\"][0][\"b\"]` for a decycle pointer. */\nfunction jsonPath(parts: Array<string | number>): string {\n let path = '$';\n for (const p of parts) {\n path += typeof p === 'number' ? `[${p}]` : `[${JSON.stringify(p)}]`;\n }\n return path;\n}\n\n/**\n * Serialize any value to JSON without throwing on circular references or BigInt.\n * Circular refs become `\"[Circular]\"` (or `{ $ref }` pointers when `decycle`).\n */\nexport function safeStringify(value: unknown, options: SafeStringifyOptions = {}): string {\n const { indent, deterministic = false, decycle = false, bigint = 'string' } = options;\n\n if (decycle) {\n return JSON.stringify(decycleValue(value, bigint), undefined, indent);\n }\n\n const seen = new WeakSet<object>();\n\n const transform = (val: unknown): unknown => {\n if (typeof val === 'bigint') return bigint === 'number' ? Number(val) : val.toString();\n if (typeof val === 'function') return `[Function: ${val.name || 'anonymous'}]`;\n if (typeof val === 'symbol') return val.toString();\n if (val === null || typeof val !== 'object') return val;\n\n if (seen.has(val)) return '[Circular]';\n seen.add(val);\n\n let out: unknown;\n const toJSON = (val as { toJSON?: unknown }).toJSON;\n if (Array.isArray(val)) {\n out = val.map((item) => transform(item));\n } else if (typeof toJSON === 'function') {\n // Dates, URLs, Buffers and classes with their own toJSON print the way\n // JSON.stringify would; a toJSON that returns `this` hits the cycle check.\n out = transform(toJSON.call(val));\n } else {\n const rec = val as Record<string, unknown>;\n const keys = deterministic ? Object.keys(rec).sort() : Object.keys(rec);\n const obj: Record<string, unknown> = {};\n for (const k of keys) {\n if (k === '__proto__' || k === 'constructor' || k === 'prototype') continue;\n obj[k] = transform(rec[k]);\n }\n out = obj;\n }\n // Allow the same object to appear in sibling branches (not a true cycle):\n // remove from `seen` after we finish its subtree.\n seen.delete(val);\n return out;\n };\n\n return JSON.stringify(transform(value), undefined, indent);\n}\n\n/**\n * Replace repeated object references with round-trippable `{ \"$ref\": \"$...\" }`\n * JSONPath pointers (the classic Crockford decycle). Pair with {@link retrocycle}\n * to reconstruct the original shared/circular graph.\n */\nexport function decycleValue(value: unknown, bigint: 'string' | 'number' = 'string'): unknown {\n const paths = new WeakMap<object, string>();\n\n const walk = (val: unknown, path: Array<string | number>): unknown => {\n if (typeof val === 'bigint') return bigint === 'number' ? Number(val) : val.toString();\n if (val === null || typeof val !== 'object') return val;\n if (val instanceof Date) return val.toISOString();\n\n const existing = paths.get(val);\n if (existing !== undefined) return { $ref: existing };\n paths.set(val, jsonPath(path));\n\n if (Array.isArray(val)) {\n return val.map((item, i) => walk(item, [...path, i]));\n }\n const rec = val as Record<string, unknown>;\n const obj: Record<string, unknown> = {};\n for (const k of Object.keys(rec)) {\n if (k === '__proto__' || k === 'constructor' || k === 'prototype') continue;\n obj[k] = walk(rec[k], [...path, k]);\n }\n return obj;\n };\n\n return walk(value, []);\n}\n\n/**\n * Inverse of {@link decycleValue}: resolve `{ \"$ref\": \"$...\" }` pointers back\n * into the live object graph (mutates and returns the parsed input).\n */\nexport function retrocycle<T>(root: T): T {\n const refRe = /^\\$(?:\\[(?:\\d+|\"(?:[^\"\\\\]|\\\\.)*\")\\])*$/;\n\n const resolve = (path: string): unknown => {\n // Parse the JSONPath segments back out.\n const segs: Array<string | number> = [];\n const partRe = /\\[(\\d+|\"(?:[^\"\\\\]|\\\\.)*\")\\]/g;\n let m: RegExpExecArray | null;\n while ((m = partRe.exec(path)) !== null) {\n const raw = m[1]!;\n segs.push(raw.startsWith('\"') ? (JSON.parse(raw) as string) : Number(raw));\n }\n let node: unknown = root;\n for (const s of segs) {\n node = (node as Record<string | number, unknown>)[s];\n }\n return node;\n };\n\n const walk = (val: unknown): void => {\n if (val === null || typeof val !== 'object') return;\n const rec = val as Record<string, unknown>;\n for (const k of Object.keys(rec)) {\n const child = rec[k];\n if (\n child !== null &&\n typeof child === 'object' &&\n typeof (child as { $ref?: unknown }).$ref === 'string' &&\n refRe.test((child as { $ref: string }).$ref)\n ) {\n rec[k] = resolve((child as { $ref: string }).$ref);\n } else {\n walk(child);\n }\n }\n };\n\n walk(root);\n return root;\n}\n\n/**\n * `JSON.stringify` for log output. Takes the plain fast path first and only\n * falls back to {@link safeStringify} when that throws (a cycle, a BigInt, a\n * throwing `toJSON`), so a bad payload costs nothing until it shows up.\n * Never throws: if even the safe walk fails, the value is replaced by a marker.\n */\nexport function stringifyForLog(value: unknown): string {\n try {\n return JSON.stringify(value);\n } catch {\n try {\n return safeStringify(value);\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n return JSON.stringify(`[Unserializable: ${reason}]`);\n }\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
import { h as LogEntry } from "./index-
|
|
2
|
-
|
|
3
|
-
//#region src/search/types/search.types.d.ts
|
|
4
|
-
|
|
1
|
+
import { h as LogEntry } from "./index-xqaJtAZn.mjs";
|
|
5
2
|
/**
|
|
6
3
|
* Search filter options
|
|
7
4
|
*/
|
|
@@ -261,8 +258,6 @@ interface ExportOptions {
|
|
|
261
258
|
filename?: string;
|
|
262
259
|
fields?: string[];
|
|
263
260
|
}
|
|
264
|
-
//#endregion
|
|
265
|
-
//#region src/search/search-manager.d.ts
|
|
266
261
|
/**
|
|
267
262
|
* Configuration for search manager
|
|
268
263
|
*/
|
|
@@ -395,8 +390,6 @@ declare class SearchManager {
|
|
|
395
390
|
private filterFields;
|
|
396
391
|
private getNestedValue;
|
|
397
392
|
}
|
|
398
|
-
//#endregion
|
|
399
|
-
//#region src/search/core/log-indexer.interface.d.ts
|
|
400
393
|
/**
|
|
401
394
|
* Log indexer interface
|
|
402
395
|
*/
|
|
@@ -446,8 +439,6 @@ interface ILogIndexer {
|
|
|
446
439
|
*/
|
|
447
440
|
removeOldLogs(olderThan: Date): Promise<number>;
|
|
448
441
|
}
|
|
449
|
-
//#endregion
|
|
450
|
-
//#region src/search/core/basic-log-indexer.d.ts
|
|
451
442
|
/**
|
|
452
443
|
* Basic log indexer implementation
|
|
453
444
|
*/
|
|
@@ -528,8 +519,6 @@ declare class BasicLogIndexer implements ILogIndexer {
|
|
|
528
519
|
private removeOldestLogs;
|
|
529
520
|
private clusterLogs;
|
|
530
521
|
}
|
|
531
|
-
//#endregion
|
|
532
|
-
//#region src/search/core/search-engine.interface.d.ts
|
|
533
522
|
/**
|
|
534
523
|
* Main search engine interface
|
|
535
524
|
*/
|
|
@@ -597,8 +586,6 @@ interface ILogSearchEngine {
|
|
|
597
586
|
*/
|
|
598
587
|
deletePreset(presetId: string): Promise<void>;
|
|
599
588
|
}
|
|
600
|
-
//#endregion
|
|
601
|
-
//#region src/search/core/basic-search-engine.d.ts
|
|
602
589
|
/**
|
|
603
590
|
* Basic search engine implementation
|
|
604
591
|
*/
|
|
@@ -687,8 +674,6 @@ declare class BasicSearchEngine implements ILogSearchEngine {
|
|
|
687
674
|
private getTopTerms;
|
|
688
675
|
private generateId;
|
|
689
676
|
}
|
|
690
|
-
//#endregion
|
|
691
|
-
//#region src/search/engines/correlation-engine.d.ts
|
|
692
677
|
/**
|
|
693
678
|
* Correlation engine for log analysis
|
|
694
679
|
*/
|
|
@@ -740,8 +725,6 @@ declare class CorrelationEngine {
|
|
|
740
725
|
private convertToCorrelatedLogs;
|
|
741
726
|
private generateSummary;
|
|
742
727
|
}
|
|
743
|
-
//#endregion
|
|
744
|
-
//#region src/search/engines/nlp-search-engine.d.ts
|
|
745
728
|
/**
|
|
746
729
|
* NLP-enhanced search engine
|
|
747
730
|
*/
|
|
@@ -766,8 +749,6 @@ declare class NLPSearchEngine extends BasicSearchEngine {
|
|
|
766
749
|
private getOptionsForIntent;
|
|
767
750
|
private extractCleanQuery;
|
|
768
751
|
}
|
|
769
|
-
//#endregion
|
|
770
|
-
//#region src/search/engines/pattern-recognition-engine.d.ts
|
|
771
752
|
/**
|
|
772
753
|
* Pattern recognition engine for log analysis
|
|
773
754
|
*/
|
|
@@ -810,6 +791,5 @@ declare class PatternRecognitionEngine {
|
|
|
810
791
|
private findDeviations;
|
|
811
792
|
private doesLogMatchPattern;
|
|
812
793
|
}
|
|
813
|
-
//#endregion
|
|
814
794
|
export { SearchStats as A, SearchFilters as C, SearchPreset as D, SearchOptions as E, SuggestionType as F, TimeRange as I, TimelineEvent as L, SemanticIndex as M, SimilarLog as N, SearchQuery as O, SortField as P, RelativeTime as S, SearchMatch as T, ParsedNLQuery as _, ILogSearchEngine as a, RelatedLog as b, SearchManager as c, CorrelatedLogs as d, EntityType as f, LogPattern as g, LogCorrelationSummary as h, BasicSearchEngine as i, SearchSuggestion as j, SearchResult as k, SearchManagerConfig as l, LogCluster as m, NLPSearchEngine as n, BasicLogIndexer as o, ExportOptions as p, CorrelationEngine as r, ILogIndexer as s, PatternRecognitionEngine as t, AnomalyDetection as u, QueryEntity as v, SearchHighlight as w, RelationshipType as x, QueryIntent as y };
|
|
815
|
-
//# sourceMappingURL=search-
|
|
795
|
+
//# sourceMappingURL=search-BH33XhuU.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-BH33XhuU.d.mts","names":[],"sources":["../src/search/types/search.types.ts","../src/search/search-manager.ts","../src/search/core/log-indexer.interface.ts","../src/search/core/basic-log-indexer.ts","../src/search/core/search-engine.interface.ts","../src/search/core/basic-search-engine.ts","../src/search/engines/correlation-engine.ts","../src/search/engines/nlp-search-engine.ts","../src/search/engines/pattern-recognition-engine.ts"],"mappings":";;;;UASiB;EACf;EACA;EACA;EACA,YAAY;EACZ;EACA;EACA;EACA;EACA;EACA;EACA,eAAe;;;;;UAMA;EACf,OAAO;EACP,MAAM;EACN,WAAW;;;;;UAMI;EACf;EACA;;;;;UAMe;EACf,KAAK;EACL;EACA,aAAa;EACb,UAAU;EACV,UAAU;EACV,cAAc;;;;;UAMC;EACf;EACA;EACA;;;;;UAMe;EACf;EACA;EACA;EACA;;;;;UAMe;EACf,KAAK;EACL,cAAc;EACd;;;;;KAMU;;;;UAWK;EACf;EACA;EACA,MAAM;EACN,UAAU;EACV,UAAU;;;;;UAMK;EACf,WAAW;EACX,KAAK;EACL;EACA;;;;;UAMe;EACf;EACA;EACA;EACA;EACA;EACA,eAAe;;;;;UAMA;EACf,KAAK;EACL;EACA;EACA;;;;;UAMe;EACf;EACA,UAAU;EACV,UAAU;EACV,WAAW;EACX;;;;;UAMe;EACf;EACA;EACA,SAAS;EACT;EACA;EACA;EACA;EACA;EACA;EACA;;;;;KAMU;;;;UAKK;EACf;EACA,MAAM;EACN;EACA;EACA,WAAW;;;;;KAMD;;;;UAMK;EACf;EACA;EACA;EACA;EACA;;;;;UAMe;EACf;EACA;EACA,aAAa;EACb,aAAa;EACb,WAAW;;;;;UAMI;EACf;EACA;EACA,MAAM;EACN;EACA;EACA;;;;;UAMe;EACf;EACA;EACA,QAAQ;EACR,UAAU;EACV;EACA,UAAU;EACV;EACA;;;;;UAMe;EACf,KAAK;EACL;EACA;EACA;EACA;;;;;UAMe;EACf;EACA,QAAQ;EACR,UAAU;EACV,SAAS;EACT,YAAY;EACZ;;;;;KAMU;;;;UAaK;EACf,MAAM;EACN;EACA;EACA;;;;;KAMU;;;;UAMK;EACf;EACA;EACA;EACA;EACA,SAAS;EACT,SAAS;EACT,WAAW;EACX,WAAW;EACX;EACA;;;;;UAMe;EACf;EACA;EACA;EACA;;;;;UCpRe;EACf;EACA;EACA;EACA;EACA;;;;;cAMW;UACH;UACA;UACA;UACA;UACA;EAEI,YAAA,SAAS;;;;EA8Bf,UAAU,MAAM,aAAa;;;;EAa7B,SAAS,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"}
|