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.
- package/README.md +172 -2597
- package/dist/async-context-2mbUKhcl.mjs +132 -0
- package/dist/async-context-2mbUKhcl.mjs.map +1 -0
- package/dist/async-context-DUFMDYAr.js +148 -0
- package/dist/async-context-DUFMDYAr.js.map +1 -0
- package/dist/{azure-monitor.transport-CrvfHd9C.js → azure-monitor.transport-Bu4S2I2q.js} +32 -20
- package/dist/azure-monitor.transport-Bu4S2I2q.js.map +1 -0
- package/dist/{azure-monitor.transport-Cn_3Usvu.d.ts → azure-monitor.transport-Bvf7Xegt.d.ts} +3 -6
- package/dist/azure-monitor.transport-Bvf7Xegt.d.ts.map +1 -0
- package/dist/{azure-monitor.transport-CHnjVRF-.mjs → azure-monitor.transport-C1RWAumT.mjs} +27 -15
- package/dist/azure-monitor.transport-C1RWAumT.mjs.map +1 -0
- package/dist/{azure-monitor.transport-D7Da4RAb.d.mts → azure-monitor.transport-CbSHOnNX.d.mts} +3 -6
- package/dist/azure-monitor.transport-CbSHOnNX.d.mts.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-BvXLDPlV.mjs} +21 -7
- package/dist/batch-buffer-BvXLDPlV.mjs.map +1 -0
- package/dist/{batch-buffer-BY-mRWIK.js → batch-buffer-C7Am4Mw-.js} +53 -40
- package/dist/batch-buffer-C7Am4Mw-.js.map +1 -0
- package/dist/browser.d.mts +47 -27
- package/dist/browser.d.mts.map +1 -1
- package/dist/browser.d.ts +47 -27
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +464 -62
- package/dist/browser.js.map +1 -1
- package/dist/browser.mjs +465 -65
- package/dist/browser.mjs.map +1 -1
- package/dist/{builder-0gEzRopq.mjs → builder-DhNhvOkt.mjs} +307 -246
- package/dist/builder-DhNhvOkt.mjs.map +1 -0
- package/dist/{builder-D44QktIo.js → builder-yFvJrz7o.js} +435 -399
- package/dist/builder-yFvJrz7o.js.map +1 -0
- package/dist/cli/index.js +216 -125
- 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-DsEq633o.d.ts → cloudwatch.transport-CQyT6U91.d.ts} +2 -6
- package/dist/cloudwatch.transport-CQyT6U91.d.ts.map +1 -0
- package/dist/{cloudwatch.transport-BO1ahxw-.js → cloudwatch.transport-Ch1Uae-0.js} +61 -36
- package/dist/cloudwatch.transport-Ch1Uae-0.js.map +1 -0
- package/dist/{cloudwatch.transport-UlyZFWMn.d.mts → cloudwatch.transport-CjVrI6S4.d.mts} +2 -6
- package/dist/cloudwatch.transport-CjVrI6S4.d.mts.map +1 -0
- package/dist/{cloudwatch.transport-DZ6ies7g.mjs → cloudwatch.transport-DZqF2xZO.mjs} +54 -28
- package/dist/cloudwatch.transport-DZqF2xZO.mjs.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 +15 -69
- package/dist/correlation.d.mts.map +1 -1
- package/dist/correlation.d.ts +15 -69
- package/dist/correlation.d.ts.map +1 -1
- package/dist/correlation.js +69 -20
- package/dist/correlation.js.map +1 -1
- package/dist/correlation.mjs +67 -17
- package/dist/correlation.mjs.map +1 -1
- package/dist/{entry-fields-BvOLFlJ4.js → entry-fields-BSLkzw18.js} +16 -13
- package/dist/entry-fields-BSLkzw18.js.map +1 -0
- package/dist/{entry-fields-BJkuPnIg.mjs → entry-fields-J1OBi24o.mjs} +11 -7
- package/dist/entry-fields-J1OBi24o.mjs.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-BCIvdFV-.d.ts} +5 -8
- package/dist/gcp.transport-BCIvdFV-.d.ts.map +1 -0
- package/dist/{gcp.transport-GrJurKo8.d.mts → gcp.transport-D9SdLPwP.d.mts} +5 -8
- package/dist/gcp.transport-D9SdLPwP.d.mts.map +1 -0
- package/dist/{gcp.transport-DBX5TPIy.mjs → gcp.transport-DVCmnA3b.mjs} +59 -16
- package/dist/gcp.transport-DVCmnA3b.mjs.map +1 -0
- package/dist/{gcp.transport-CHV8MGgz.js → gcp.transport-Dy2Lf8FI.js} +64 -22
- package/dist/gcp.transport-Dy2Lf8FI.js.map +1 -0
- package/dist/http-shapes-BnBkJcid.d.mts +32 -0
- package/dist/http-shapes-BnBkJcid.d.mts.map +1 -0
- package/dist/http-shapes-BnBkJcid.d.ts +32 -0
- package/dist/http-shapes-BnBkJcid.d.ts.map +1 -0
- package/dist/{index-3mw5gaCw.d.mts → index-BSTtFcQ6.d.mts} +142 -13
- package/dist/index-BSTtFcQ6.d.mts.map +1 -0
- package/dist/{index-DhIoploR.d.ts → index-CFDGkI8n.d.ts} +142 -13
- package/dist/index-CFDGkI8n.d.ts.map +1 -0
- package/dist/index.d.mts +114 -217
- package/dist/index.d.mts.map +1 -1
- package/dist/index.d.ts +113 -216
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +182 -279
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +160 -256
- package/dist/index.mjs.map +1 -1
- package/dist/internal-log-Bg4V1cPg.mjs +170 -0
- package/dist/internal-log-Bg4V1cPg.mjs.map +1 -0
- package/dist/internal-log-By4Govmu.js +223 -0
- package/dist/internal-log-By4Govmu.js.map +1 -0
- package/dist/{logitron-logger-UVeN-mQm.d.ts → logitron-logger-D22Yb61K.d.mts} +121 -100
- package/dist/logitron-logger-D22Yb61K.d.mts.map +1 -0
- package/dist/{logitron-logger-BFDSO8Io.d.mts → logitron-logger-D_MYYrQt.d.ts} +121 -100
- package/dist/logitron-logger-D_MYYrQt.d.ts.map +1 -0
- package/dist/middleware.d.mts +13 -28
- package/dist/middleware.d.mts.map +1 -1
- package/dist/middleware.d.ts +13 -28
- package/dist/middleware.d.ts.map +1 -1
- package/dist/middleware.js +20 -81
- package/dist/middleware.js.map +1 -1
- package/dist/middleware.mjs +17 -79
- package/dist/middleware.mjs.map +1 -1
- package/dist/nest.d.mts +37 -48
- package/dist/nest.d.mts.map +1 -1
- package/dist/nest.d.ts +37 -48
- package/dist/nest.d.ts.map +1 -1
- package/dist/nest.js +124 -135
- package/dist/nest.js.map +1 -1
- package/dist/nest.mjs +69 -78
- package/dist/nest.mjs.map +1 -1
- package/dist/{transport.manager-BiuCAJd2.mjs → otel-Dt5riXuE.mjs} +275 -117
- package/dist/otel-Dt5riXuE.mjs.map +1 -0
- package/dist/{transport.manager-CXbKKdVE.js → otel-DyeH6DVR.js} +373 -178
- package/dist/otel-DyeH6DVR.js.map +1 -0
- package/dist/own-property-BWkibepN.js +40 -0
- package/dist/own-property-BWkibepN.js.map +1 -0
- package/dist/own-property-CjFw9qwZ.mjs +29 -0
- package/dist/own-property-CjFw9qwZ.mjs.map +1 -0
- package/dist/{trace.utils-CvXgaiQT.mjs → request-trace-BgNykH9M.mjs} +40 -9
- package/dist/request-trace-BgNykH9M.mjs.map +1 -0
- package/dist/{trace.utils-DpBOLDtq.js → request-trace-ByujsUZk.js} +117 -77
- package/dist/request-trace-ByujsUZk.js.map +1 -0
- package/dist/rolldown-runtime-D3PmRqjj.mjs +4 -0
- package/dist/{safe-stringify-DJ66tW5I.mjs → safe-stringify-B5p5ktFe.mjs} +39 -15
- package/dist/safe-stringify-B5p5ktFe.mjs.map +1 -0
- package/dist/{safe-stringify-DWo3aZp_.js → safe-stringify-J3sh-7YM.js} +59 -36
- package/dist/safe-stringify-J3sh-7YM.js.map +1 -0
- package/dist/{search-C4V0OMEn.js → search-CRjhHxe9.js} +319 -92
- package/dist/search-CRjhHxe9.js.map +1 -0
- package/dist/{search-CNh9uVwR.d.ts → search-DA3ft3X5.d.mts} +5 -22
- package/dist/search-DA3ft3X5.d.mts.map +1 -0
- package/dist/{search-BFbu_oVn.mjs → search-DAXKE-P9.mjs} +289 -62
- package/dist/search-DAXKE-P9.mjs.map +1 -0
- package/dist/{search-DXANsQ2n.d.mts → search-DEl3Pe47.d.ts} +5 -22
- package/dist/search-DEl3Pe47.d.ts.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-CmK2wVkr.js +272 -0
- package/dist/secret-config-CmK2wVkr.js.map +1 -0
- package/dist/secret-config-Dhb6pqTU.mjs +210 -0
- package/dist/secret-config-Dhb6pqTU.mjs.map +1 -0
- package/dist/{slack.transport-CXjQYOes.d.ts → slack.transport-BDyENuR0.d.mts} +56 -9
- package/dist/slack.transport-BDyENuR0.d.mts.map +1 -0
- package/dist/{slack.transport-Bzw7sucI.mjs → slack.transport-BTEwsREY.mjs} +263 -31
- package/dist/slack.transport-BTEwsREY.mjs.map +1 -0
- package/dist/{slack.transport-BZzoXDPn.d.mts → slack.transport-C6E0l4kw.d.ts} +56 -9
- package/dist/slack.transport-C6E0l4kw.d.ts.map +1 -0
- package/dist/{slack.transport-BfJRouB2.js → slack.transport-UbYvOdKx.js} +286 -42
- package/dist/slack.transport-UbYvOdKx.js.map +1 -0
- package/dist/testing.d.mts +13 -11
- package/dist/testing.d.mts.map +1 -1
- package/dist/testing.d.ts +13 -11
- package/dist/testing.d.ts.map +1 -1
- package/dist/testing.js +41 -7
- package/dist/testing.js.map +1 -1
- package/dist/testing.mjs +40 -6
- package/dist/testing.mjs.map +1 -1
- package/dist/{transport.types-CGoHpWQR.d.ts → transport.types-CzJq4IrF.d.mts} +14 -5
- package/dist/transport.types-CzJq4IrF.d.mts.map +1 -0
- package/dist/{transport.types-BMnurPcc.d.mts → transport.types-CzJq4IrF.d.ts} +14 -5
- package/dist/transport.types-CzJq4IrF.d.ts.map +1 -0
- package/dist/transports.d.mts +39 -41
- package/dist/transports.d.mts.map +1 -1
- package/dist/transports.d.ts +39 -41
- package/dist/transports.d.ts.map +1 -1
- package/dist/transports.js +19 -22
- package/dist/transports.mjs +7 -13
- package/dist/worker-entry.js +438 -107
- 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-JvGPog3C.d.mts → worker.transport-B9mCQSM1.d.ts} +7 -6
- package/dist/worker.transport-B9mCQSM1.d.ts.map +1 -0
- package/dist/{worker.transport-CdzSZJmw.d.ts → worker.transport-Bl8lFRck.d.mts} +7 -6
- package/dist/worker.transport-Bl8lFRck.d.mts.map +1 -0
- package/dist/{worker.transport-lPxO2MVL.mjs → worker.transport-BmmOKb1-.mjs} +43 -10
- package/dist/worker.transport-BmmOKb1-.mjs.map +1 -0
- package/dist/{worker.transport-BdPxu3PN.js → worker.transport-DxxbqQCG.js} +48 -15
- package/dist/worker.transport-DxxbqQCG.js.map +1 -0
- package/package.json +51 -75
- 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
package/dist/testing.d.ts
CHANGED
|
@@ -1,8 +1,4 @@
|
|
|
1
|
-
import "./
|
|
2
|
-
import { h as LogEntry, u as IBaseLogger } from "./index-DhIoploR.js";
|
|
3
|
-
|
|
4
|
-
//#region src/testing/mock-logger.d.ts
|
|
5
|
-
|
|
1
|
+
import { C as LogixiaLoggerInstance, g as LogEntry } from "./index-CFDGkI8n.js";
|
|
6
2
|
interface MockLogCall {
|
|
7
3
|
level: string;
|
|
8
4
|
message: string;
|
|
@@ -14,8 +10,8 @@ interface MockLogCall {
|
|
|
14
10
|
}
|
|
15
11
|
type LogMatcher = string | RegExp | ((call: MockLogCall) => boolean) | Partial<Record<'message' | 'level' | string, unknown>>;
|
|
16
12
|
interface MockLoggerInstance {
|
|
17
|
-
/** The logger itself — pass this where an IBaseLogger is expected. */
|
|
18
|
-
readonly logger:
|
|
13
|
+
/** The logger itself — pass this where an IBaseLogger or ILogger is expected. */
|
|
14
|
+
readonly logger: LogixiaLoggerInstance;
|
|
19
15
|
/** Every call recorded across all levels, in insertion order. */
|
|
20
16
|
readonly calls: MockLogCall[];
|
|
21
17
|
/**
|
|
@@ -44,6 +40,11 @@ interface MockLoggerInstance {
|
|
|
44
40
|
expectNoLog(level: string, matcher?: LogMatcher): void;
|
|
45
41
|
/** Clear all recorded calls. Call between tests. */
|
|
46
42
|
reset(): void;
|
|
43
|
+
/**
|
|
44
|
+
* Make `logger.healthCheck()` report healthy or unhealthy, to exercise code that
|
|
45
|
+
* reacts to a failing logger. Shared with child loggers.
|
|
46
|
+
*/
|
|
47
|
+
setHealth(healthy: boolean, details?: Record<string, unknown>): void;
|
|
47
48
|
/**
|
|
48
49
|
* Silence — when true, the mock suppresses all console output from the
|
|
49
50
|
* logger. Default: true.
|
|
@@ -53,16 +54,17 @@ interface MockLoggerInstance {
|
|
|
53
54
|
/**
|
|
54
55
|
* Create a mock logger for use in tests.
|
|
55
56
|
*
|
|
56
|
-
* The returned object implements `
|
|
57
|
+
* The returned object implements `ILogger` and additionally exposes `.calls`,
|
|
57
58
|
* `.getCalls()`, `.getLastCall()`, `.expectLog()`, `.expectNoLog()`, and `.reset()`.
|
|
58
59
|
*
|
|
59
60
|
* @param options.silent Suppress console output (default: true)
|
|
60
61
|
* @param options.context Optional context label written into every `entry.context`
|
|
62
|
+
* @param options.healthy Initial `healthCheck()` result (default: true); change later with `setHealth()`
|
|
61
63
|
*/
|
|
62
|
-
declare function createMockLogger(options?: {
|
|
64
|
+
export declare function createMockLogger(options?: {
|
|
63
65
|
silent?: boolean;
|
|
64
66
|
context?: string;
|
|
67
|
+
healthy?: boolean;
|
|
65
68
|
}): MockLoggerInstance;
|
|
66
|
-
|
|
67
|
-
export { type LogMatcher, type MockLogCall, type MockLoggerInstance, createMockLogger };
|
|
69
|
+
export type { LogMatcher, MockLogCall, MockLoggerInstance };
|
|
68
70
|
//# sourceMappingURL=testing.d.ts.map
|
package/dist/testing.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testing.d.ts","names":[],"sources":["../src/testing/mock-logger.ts"],"
|
|
1
|
+
{"version":3,"file":"testing.d.ts","names":[],"sources":["../src/testing/mock-logger.ts"],"mappings":";UAoBiB;EACf;EACA;EACA,OAAO;;EAEP,OAAO,KAAK;IAA+C,OAAO;;;KAGxD,sBAER,WACE,MAAM,2BACR,QAAQ;UAEK;;WAEN,QAAQ;;WAER,OAAO;;;;;EAKhB,SAAS,iBAAiB;;EAE1B,YAAY,iBAAiB;;;;;;;;;;;;;EAa7B,UAAU,eAAe,UAAU;;;;EAInC,YAAY,eAAe,UAAU;;EAErC;;;;;EAKA,UAAU,kBAAkB,UAAU;;;;;EAKtC;;;;;;;;;;;;wBAqDc,iBACd;EAAW;EAAkB;EAAkB;IAC9C"}
|
package/dist/testing.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
// src/testing/mock-logger.ts
|
|
3
3
|
function resolveCallField(call, key) {
|
|
4
4
|
var _call$data;
|
|
5
5
|
if (key === "message") return call.message;
|
|
@@ -31,13 +31,23 @@ function formatCalls(calls) {
|
|
|
31
31
|
/**
|
|
32
32
|
* Create a mock logger for use in tests.
|
|
33
33
|
*
|
|
34
|
-
* The returned object implements `
|
|
34
|
+
* The returned object implements `ILogger` and additionally exposes `.calls`,
|
|
35
35
|
* `.getCalls()`, `.getLastCall()`, `.expectLog()`, `.expectNoLog()`, and `.reset()`.
|
|
36
36
|
*
|
|
37
37
|
* @param options.silent Suppress console output (default: true)
|
|
38
38
|
* @param options.context Optional context label written into every `entry.context`
|
|
39
|
+
* @param options.healthy Initial `healthCheck()` result (default: true); change later with `setHealth()`
|
|
39
40
|
*/
|
|
40
41
|
function createMockLogger(options = {}) {
|
|
42
|
+
return buildMockLogger(options, {
|
|
43
|
+
namespaceLevels: {},
|
|
44
|
+
health: {
|
|
45
|
+
healthy: options.healthy ?? true,
|
|
46
|
+
details: {}
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
function buildMockLogger(options, shared) {
|
|
41
51
|
const { silent = true, context } = options;
|
|
42
52
|
const _calls = [];
|
|
43
53
|
function record(level, messageOrError, data) {
|
|
@@ -94,6 +104,18 @@ function createMockLogger(options = {}) {
|
|
|
94
104
|
getLevel() {
|
|
95
105
|
return "info";
|
|
96
106
|
},
|
|
107
|
+
setNamespaceLevels(levels) {
|
|
108
|
+
shared.namespaceLevels = { ...levels };
|
|
109
|
+
},
|
|
110
|
+
patchNamespaceLevels(levels) {
|
|
111
|
+
shared.namespaceLevels = {
|
|
112
|
+
...shared.namespaceLevels,
|
|
113
|
+
...levels
|
|
114
|
+
};
|
|
115
|
+
},
|
|
116
|
+
getNamespaceLevels() {
|
|
117
|
+
return { ...shared.namespaceLevels };
|
|
118
|
+
},
|
|
97
119
|
setContext(_ctx) {},
|
|
98
120
|
getContext() {
|
|
99
121
|
return context;
|
|
@@ -116,10 +138,17 @@ function createMockLogger(options = {}) {
|
|
|
116
138
|
return [];
|
|
117
139
|
},
|
|
118
140
|
child(ctx, _data) {
|
|
119
|
-
return
|
|
141
|
+
return buildMockLogger({
|
|
120
142
|
silent,
|
|
121
143
|
context: ctx
|
|
122
|
-
}).logger;
|
|
144
|
+
}, shared).logger;
|
|
145
|
+
},
|
|
146
|
+
async flush() {},
|
|
147
|
+
async healthCheck() {
|
|
148
|
+
return {
|
|
149
|
+
healthy: shared.health.healthy,
|
|
150
|
+
details: { ...shared.health.details }
|
|
151
|
+
};
|
|
123
152
|
},
|
|
124
153
|
async close() {},
|
|
125
154
|
use(_plugin) {
|
|
@@ -160,11 +189,16 @@ function createMockLogger(options = {}) {
|
|
|
160
189
|
reset() {
|
|
161
190
|
_calls.length = 0;
|
|
162
191
|
},
|
|
192
|
+
setHealth(healthy, details = {}) {
|
|
193
|
+
shared.health = {
|
|
194
|
+
healthy,
|
|
195
|
+
details
|
|
196
|
+
};
|
|
197
|
+
},
|
|
163
198
|
silent
|
|
164
199
|
};
|
|
165
200
|
return instance;
|
|
166
201
|
}
|
|
167
|
-
|
|
168
|
-
//#endregion
|
|
169
202
|
exports.createMockLogger = createMockLogger;
|
|
203
|
+
|
|
170
204
|
//# sourceMappingURL=testing.js.map
|
package/dist/testing.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testing.js","names":["_calls: MockLogCall[]","logger: IBaseLogger","instance: MockLoggerInstance"],"sources":["../src/testing/mock-logger.ts"],"sourcesContent":["/**\n * logixia/testing — Zero-dependency mock logger for Vitest & Jest.\n *\n * @example\n * ```ts\n * import { createMockLogger } from 'logixia/testing';\n *\n * const mock = createMockLogger();\n * await myService.doSomething(mock.logger);\n *\n * mock.expectLog('info', { message: 'order created' });\n * mock.expectLog('error', { message: /failed/ });\n * mock.reset();\n * ```\n */\n\nimport type { IBaseLogger, LogEntry } from '../types';\n\n// ── Types ────────────────────────────────────────────────────────────────────\n\nexport interface MockLogCall {\n level: string;\n message: string;\n data?: Record<string, unknown>;\n /** Full LogEntry shape for assertions that inspect the complete record. */\n entry: Pick<LogEntry, 'level' | 'message' | 'context'> & { data?: Record<string, unknown> };\n}\n\nexport type LogMatcher =\n | string\n | RegExp\n | ((call: MockLogCall) => boolean)\n | Partial<Record<'message' | 'level' | string, unknown>>;\n\nexport interface MockLoggerInstance {\n /** The logger itself — pass this where an IBaseLogger is expected. */\n readonly logger: IBaseLogger;\n /** Every call recorded across all levels, in insertion order. */\n readonly calls: MockLogCall[];\n /**\n * Get all calls for a specific level (case-insensitive). If `level` is\n * omitted, returns all calls across every level.\n */\n getCalls(level?: string): MockLogCall[];\n /** Return the most recent call, optionally filtered by level. */\n getLastCall(level?: string): MockLogCall | undefined;\n /**\n * Assert that at least one recorded call matches `matcher`.\n *\n * - string → exact message match\n * - RegExp → message test\n * - function → receives the full MockLogCall\n * - object → every key/value must match (supports RegExp values)\n *\n * Throws an Error with a descriptive message if the assertion fails (works\n * with both Vitest `expect` and Jest matchers via `.toThrow()`, or you can\n * let it propagate directly).\n */\n expectLog(level: string, matcher?: LogMatcher): void;\n /**\n * Assert that NO recorded call matches `matcher` at the given level.\n */\n expectNoLog(level: string, matcher?: LogMatcher): void;\n /** Clear all recorded calls. Call between tests. */\n reset(): void;\n /**\n * Silence — when true, the mock suppresses all console output from the\n * logger. Default: true.\n */\n silent: boolean;\n}\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction resolveCallField(call: MockLogCall, key: string): unknown {\n if (key === 'message') return call.message;\n if (key === 'level') return call.level;\n return call.data?.[key] ?? (call.entry as Record<string, unknown>)[key];\n}\n\nfunction formatMatcherDescription(matcher: LogMatcher | undefined): string {\n if (matcher === undefined) return '(any)';\n if (matcher instanceof RegExp) return matcher.toString();\n return JSON.stringify(matcher);\n}\n\nfunction matchesCall(call: MockLogCall, matcher?: LogMatcher): boolean {\n if (matcher === undefined) return true;\n if (typeof matcher === 'string') return call.message === matcher;\n if (matcher instanceof RegExp) return matcher.test(call.message);\n if (typeof matcher === 'function') return matcher(call);\n // Object shape: every key/value must match\n for (const [key, expected] of Object.entries(matcher)) {\n const actual = resolveCallField(call, key);\n if (expected instanceof RegExp) {\n if (!expected.test(String(actual ?? ''))) return false;\n } else {\n if (actual !== expected) return false;\n }\n }\n return true;\n}\n\nfunction formatCalls(calls: MockLogCall[]): string {\n if (calls.length === 0) return ' (no calls recorded)';\n return calls\n .map((c) => ` [${c.level}] \"${c.message}\" ${c.data ? JSON.stringify(c.data) : ''}`)\n .join('\\n');\n}\n\n// ── Implementation ────────────────────────────────────────────────────────────\n\n/**\n * Create a mock logger for use in tests.\n *\n * The returned object implements `IBaseLogger` and additionally exposes `.calls`,\n * `.getCalls()`, `.getLastCall()`, `.expectLog()`, `.expectNoLog()`, and `.reset()`.\n *\n * @param options.silent Suppress console output (default: true)\n * @param options.context Optional context label written into every `entry.context`\n */\nexport function createMockLogger(\n options: { silent?: boolean; context?: string } = {}\n): MockLoggerInstance {\n const { silent = true, context } = options;\n const _calls: MockLogCall[] = [];\n\n function record(\n level: string,\n messageOrError: string | Error,\n data?: Record<string, unknown>\n ): void {\n const message = messageOrError instanceof Error ? messageOrError.message : messageOrError;\n const extraData =\n messageOrError instanceof Error\n ? { ...data, error: { message: messageOrError.message, stack: messageOrError.stack } }\n : data;\n\n _calls.push({\n level,\n message,\n ...(extraData !== undefined ? { data: extraData } : {}),\n entry: {\n level,\n message,\n ...(context !== undefined ? { context } : {}),\n ...(extraData !== undefined ? { data: extraData } : {}),\n },\n });\n }\n\n const logger: IBaseLogger = {\n async error(messageOrError, data) {\n record('error', messageOrError as string | Error, data);\n },\n async warn(message, data) {\n record('warn', message, data);\n },\n async info(message, data) {\n record('info', message, data);\n },\n async debug(message, data) {\n record('debug', message, data);\n },\n async trace(message, data) {\n record('trace', message, data);\n },\n async verbose(message, data) {\n record('verbose', message, data);\n },\n async logLevel(level, message, data) {\n record(level, message, data);\n },\n\n time(_label) {\n /* no-op in tests */\n },\n async timeEnd(_label) {\n return 0;\n },\n async timeAsync(_label, fn) {\n return fn();\n },\n\n setLevel(_level) {\n /* no-op */\n },\n getLevel() {\n return 'info';\n },\n setContext(_ctx) {\n /* no-op */\n },\n getContext() {\n return context;\n },\n\n enableField(_f) {\n /* no-op */\n },\n disableField(_f) {\n /* no-op */\n },\n isFieldEnabled(_f) {\n return true;\n },\n getFieldState() {\n return {};\n },\n resetFieldState() {\n /* no-op */\n },\n\n enableTransportLevelPrompting() {\n /* no-op */\n },\n disableTransportLevelPrompting() {\n /* no-op */\n },\n setTransportLevels(_id, _levels) {\n /* no-op */\n },\n getTransportLevels(_id): string[] | undefined {\n return undefined;\n },\n clearTransportLevelPreferences() {\n /* no-op */\n },\n getAvailableTransports() {\n return [];\n },\n\n child(ctx, _data) {\n return createMockLogger({ silent, context: ctx }).logger;\n },\n async close() {\n /* no-op */\n },\n\n // Plugin API stubs — mock logger does not run plugins\n use(_plugin) {\n return this;\n },\n unuse(_pluginName) {\n return this;\n },\n };\n\n const instance: MockLoggerInstance = {\n get logger() {\n return logger;\n },\n get calls() {\n return _calls;\n },\n\n getCalls(level?: string): MockLogCall[] {\n if (!level) return [..._calls];\n const l = level.toLowerCase();\n return _calls.filter((c) => c.level.toLowerCase() === l);\n },\n\n getLastCall(level?: string): MockLogCall | undefined {\n const filtered = level\n ? _calls.filter((c) => c.level.toLowerCase() === level.toLowerCase())\n : _calls;\n return filtered[filtered.length - 1];\n },\n\n expectLog(level: string, matcher?: LogMatcher): void {\n const levelCalls = instance.getCalls(level);\n const matched = levelCalls.some((c) => matchesCall(c, matcher));\n if (!matched) {\n const matcherDesc = formatMatcherDescription(matcher);\n throw new Error(\n `Expected at least one [${level}] log matching ${matcherDesc}.\\n` +\n `Recorded calls:\\n${formatCalls(_calls)}`\n );\n }\n },\n\n expectNoLog(level: string, matcher?: LogMatcher): void {\n const levelCalls = instance.getCalls(level);\n const matched = levelCalls.some((c) => matchesCall(c, matcher));\n if (matched) {\n const matcherDesc = formatMatcherDescription(matcher);\n throw new Error(\n `Expected NO [${level}] log matching ${matcherDesc}, but one was found.\\n` +\n `Recorded calls:\\n${formatCalls(_calls)}`\n );\n }\n },\n\n reset(): void {\n _calls.length = 0;\n },\n\n silent,\n };\n\n return instance;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"testing.js","names":[],"sources":["../src/testing/mock-logger.ts"],"sourcesContent":["/**\n * logixia/testing — Zero-dependency mock logger for Vitest & Jest.\n *\n * @example\n * ```ts\n * import { createMockLogger } from 'logixia/testing';\n *\n * const mock = createMockLogger();\n * await myService.doSomething(mock.logger);\n *\n * mock.expectLog('info', { message: 'order created' });\n * mock.expectLog('error', { message: /failed/ });\n * mock.reset();\n * ```\n */\n\nimport type { LogEntry, LogixiaLoggerInstance, NamespaceLevels } from '../types';\n\n// ── Types ────────────────────────────────────────────────────────────────────\n\nexport interface MockLogCall {\n level: string;\n message: string;\n data?: Record<string, unknown>;\n /** Full LogEntry shape for assertions that inspect the complete record. */\n entry: Pick<LogEntry, 'level' | 'message' | 'context'> & { data?: Record<string, unknown> };\n}\n\nexport type LogMatcher =\n | string\n | RegExp\n | ((call: MockLogCall) => boolean)\n | Partial<Record<'message' | 'level' | string, unknown>>;\n\nexport interface MockLoggerInstance {\n /** The logger itself — pass this where an IBaseLogger or ILogger is expected. */\n readonly logger: LogixiaLoggerInstance;\n /** Every call recorded across all levels, in insertion order. */\n readonly calls: MockLogCall[];\n /**\n * Get all calls for a specific level (case-insensitive). If `level` is\n * omitted, returns all calls across every level.\n */\n getCalls(level?: string): MockLogCall[];\n /** Return the most recent call, optionally filtered by level. */\n getLastCall(level?: string): MockLogCall | undefined;\n /**\n * Assert that at least one recorded call matches `matcher`.\n *\n * - string → exact message match\n * - RegExp → message test\n * - function → receives the full MockLogCall\n * - object → every key/value must match (supports RegExp values)\n *\n * Throws an Error with a descriptive message if the assertion fails (works\n * with both Vitest `expect` and Jest matchers via `.toThrow()`, or you can\n * let it propagate directly).\n */\n expectLog(level: string, matcher?: LogMatcher): void;\n /**\n * Assert that NO recorded call matches `matcher` at the given level.\n */\n expectNoLog(level: string, matcher?: LogMatcher): void;\n /** Clear all recorded calls. Call between tests. */\n reset(): void;\n /**\n * Make `logger.healthCheck()` report healthy or unhealthy, to exercise code that\n * reacts to a failing logger. Shared with child loggers.\n */\n setHealth(healthy: boolean, details?: Record<string, unknown>): void;\n /**\n * Silence — when true, the mock suppresses all console output from the\n * logger. Default: true.\n */\n silent: boolean;\n}\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction resolveCallField(call: MockLogCall, key: string): unknown {\n if (key === 'message') return call.message;\n if (key === 'level') return call.level;\n return call.data?.[key] ?? (call.entry as Record<string, unknown>)[key];\n}\n\nfunction formatMatcherDescription(matcher: LogMatcher | undefined): string {\n if (matcher === undefined) return '(any)';\n if (matcher instanceof RegExp) return matcher.toString();\n return JSON.stringify(matcher);\n}\n\nfunction matchesCall(call: MockLogCall, matcher?: LogMatcher): boolean {\n if (matcher === undefined) return true;\n if (typeof matcher === 'string') return call.message === matcher;\n if (matcher instanceof RegExp) return matcher.test(call.message);\n if (typeof matcher === 'function') return matcher(call);\n // Object shape: every key/value must match\n for (const [key, expected] of Object.entries(matcher)) {\n const actual = resolveCallField(call, key);\n if (expected instanceof RegExp) {\n if (!expected.test(String(actual ?? ''))) return false;\n } else {\n if (actual !== expected) return false;\n }\n }\n return true;\n}\n\nfunction formatCalls(calls: MockLogCall[]): string {\n if (calls.length === 0) return ' (no calls recorded)';\n return calls\n .map((c) => ` [${c.level}] \"${c.message}\" ${c.data ? JSON.stringify(c.data) : ''}`)\n .join('\\n');\n}\n\n// ── Implementation ────────────────────────────────────────────────────────────\n\n/**\n * Create a mock logger for use in tests.\n *\n * The returned object implements `ILogger` and additionally exposes `.calls`,\n * `.getCalls()`, `.getLastCall()`, `.expectLog()`, `.expectNoLog()`, and `.reset()`.\n *\n * @param options.silent Suppress console output (default: true)\n * @param options.context Optional context label written into every `entry.context`\n * @param options.healthy Initial `healthCheck()` result (default: true); change later with `setHealth()`\n */\nexport function createMockLogger(\n options: { silent?: boolean; context?: string; healthy?: boolean } = {}\n): MockLoggerInstance {\n return buildMockLogger(options, {\n namespaceLevels: {},\n health: { healthy: options.healthy ?? true, details: {} },\n });\n}\n\n/** State a mock logger shares with its children, like the real logger. */\ninterface SharedMockState {\n namespaceLevels: NamespaceLevels;\n health: { healthy: boolean; details: Record<string, unknown> };\n}\n\nfunction buildMockLogger(\n options: { silent?: boolean; context?: string },\n shared: SharedMockState\n): MockLoggerInstance {\n const { silent = true, context } = options;\n const _calls: MockLogCall[] = [];\n\n function record(\n level: string,\n messageOrError: string | Error,\n data?: Record<string, unknown>\n ): void {\n const message = messageOrError instanceof Error ? messageOrError.message : messageOrError;\n const extraData =\n messageOrError instanceof Error\n ? { ...data, error: { message: messageOrError.message, stack: messageOrError.stack } }\n : data;\n\n _calls.push({\n level,\n message,\n ...(extraData !== undefined ? { data: extraData } : {}),\n entry: {\n level,\n message,\n ...(context !== undefined ? { context } : {}),\n ...(extraData !== undefined ? { data: extraData } : {}),\n },\n });\n }\n\n const logger: LogixiaLoggerInstance = {\n async error(messageOrError, data) {\n record('error', messageOrError as string | Error, data);\n },\n async warn(message, data) {\n record('warn', message, data);\n },\n async info(message, data) {\n record('info', message, data);\n },\n async debug(message, data) {\n record('debug', message, data);\n },\n async trace(message, data) {\n record('trace', message, data);\n },\n async verbose(message, data) {\n record('verbose', message, data);\n },\n async logLevel(level, message, data) {\n record(level, message, data);\n },\n\n time(_label) {\n /* no-op in tests */\n },\n async timeEnd(_label) {\n return 0;\n },\n async timeAsync(_label, fn) {\n return fn();\n },\n\n setLevel(_level) {\n /* no-op */\n },\n getLevel() {\n return 'info';\n },\n setNamespaceLevels(levels) {\n shared.namespaceLevels = { ...levels };\n },\n patchNamespaceLevels(levels) {\n shared.namespaceLevels = { ...shared.namespaceLevels, ...levels };\n },\n getNamespaceLevels() {\n return { ...shared.namespaceLevels };\n },\n setContext(_ctx) {\n /* no-op */\n },\n getContext() {\n return context;\n },\n\n enableField(_f) {\n /* no-op */\n },\n disableField(_f) {\n /* no-op */\n },\n isFieldEnabled(_f) {\n return true;\n },\n getFieldState() {\n return {};\n },\n resetFieldState() {\n /* no-op */\n },\n\n enableTransportLevelPrompting() {\n /* no-op */\n },\n disableTransportLevelPrompting() {\n /* no-op */\n },\n setTransportLevels(_id, _levels) {\n /* no-op */\n },\n getTransportLevels(_id): string[] | undefined {\n return undefined;\n },\n clearTransportLevelPreferences() {\n /* no-op */\n },\n getAvailableTransports() {\n return [];\n },\n\n child(ctx, _data) {\n return buildMockLogger({ silent, context: ctx }, shared).logger;\n },\n async flush() {\n /* no-op */\n },\n async healthCheck() {\n return { healthy: shared.health.healthy, details: { ...shared.health.details } };\n },\n async close() {\n /* no-op */\n },\n\n // Plugin API stubs — mock logger does not run plugins\n use(_plugin) {\n return this;\n },\n unuse(_pluginName) {\n return this;\n },\n };\n\n const instance: MockLoggerInstance = {\n get logger() {\n return logger;\n },\n get calls() {\n return _calls;\n },\n\n getCalls(level?: string): MockLogCall[] {\n if (!level) return [..._calls];\n const l = level.toLowerCase();\n return _calls.filter((c) => c.level.toLowerCase() === l);\n },\n\n getLastCall(level?: string): MockLogCall | undefined {\n const filtered = level\n ? _calls.filter((c) => c.level.toLowerCase() === level.toLowerCase())\n : _calls;\n return filtered[filtered.length - 1];\n },\n\n expectLog(level: string, matcher?: LogMatcher): void {\n const levelCalls = instance.getCalls(level);\n const matched = levelCalls.some((c) => matchesCall(c, matcher));\n if (!matched) {\n const matcherDesc = formatMatcherDescription(matcher);\n throw new Error(\n `Expected at least one [${level}] log matching ${matcherDesc}.\\n` +\n `Recorded calls:\\n${formatCalls(_calls)}`\n );\n }\n },\n\n expectNoLog(level: string, matcher?: LogMatcher): void {\n const levelCalls = instance.getCalls(level);\n const matched = levelCalls.some((c) => matchesCall(c, matcher));\n if (matched) {\n const matcherDesc = formatMatcherDescription(matcher);\n throw new Error(\n `Expected NO [${level}] log matching ${matcherDesc}, but one was found.\\n` +\n `Recorded calls:\\n${formatCalls(_calls)}`\n );\n }\n },\n\n reset(): void {\n _calls.length = 0;\n },\n\n setHealth(healthy: boolean, details: Record<string, unknown> = {}): void {\n shared.health = { healthy, details };\n },\n\n silent,\n };\n\n return instance;\n}\n"],"mappings":"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"}
|
package/dist/testing.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
// src/testing/mock-logger.ts
|
|
2
2
|
function resolveCallField(call, key) {
|
|
3
3
|
var _call$data;
|
|
4
4
|
if (key === "message") return call.message;
|
|
@@ -30,13 +30,23 @@ function formatCalls(calls) {
|
|
|
30
30
|
/**
|
|
31
31
|
* Create a mock logger for use in tests.
|
|
32
32
|
*
|
|
33
|
-
* The returned object implements `
|
|
33
|
+
* The returned object implements `ILogger` and additionally exposes `.calls`,
|
|
34
34
|
* `.getCalls()`, `.getLastCall()`, `.expectLog()`, `.expectNoLog()`, and `.reset()`.
|
|
35
35
|
*
|
|
36
36
|
* @param options.silent Suppress console output (default: true)
|
|
37
37
|
* @param options.context Optional context label written into every `entry.context`
|
|
38
|
+
* @param options.healthy Initial `healthCheck()` result (default: true); change later with `setHealth()`
|
|
38
39
|
*/
|
|
39
40
|
function createMockLogger(options = {}) {
|
|
41
|
+
return buildMockLogger(options, {
|
|
42
|
+
namespaceLevels: {},
|
|
43
|
+
health: {
|
|
44
|
+
healthy: options.healthy ?? true,
|
|
45
|
+
details: {}
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
function buildMockLogger(options, shared) {
|
|
40
50
|
const { silent = true, context } = options;
|
|
41
51
|
const _calls = [];
|
|
42
52
|
function record(level, messageOrError, data) {
|
|
@@ -93,6 +103,18 @@ function createMockLogger(options = {}) {
|
|
|
93
103
|
getLevel() {
|
|
94
104
|
return "info";
|
|
95
105
|
},
|
|
106
|
+
setNamespaceLevels(levels) {
|
|
107
|
+
shared.namespaceLevels = { ...levels };
|
|
108
|
+
},
|
|
109
|
+
patchNamespaceLevels(levels) {
|
|
110
|
+
shared.namespaceLevels = {
|
|
111
|
+
...shared.namespaceLevels,
|
|
112
|
+
...levels
|
|
113
|
+
};
|
|
114
|
+
},
|
|
115
|
+
getNamespaceLevels() {
|
|
116
|
+
return { ...shared.namespaceLevels };
|
|
117
|
+
},
|
|
96
118
|
setContext(_ctx) {},
|
|
97
119
|
getContext() {
|
|
98
120
|
return context;
|
|
@@ -115,10 +137,17 @@ function createMockLogger(options = {}) {
|
|
|
115
137
|
return [];
|
|
116
138
|
},
|
|
117
139
|
child(ctx, _data) {
|
|
118
|
-
return
|
|
140
|
+
return buildMockLogger({
|
|
119
141
|
silent,
|
|
120
142
|
context: ctx
|
|
121
|
-
}).logger;
|
|
143
|
+
}, shared).logger;
|
|
144
|
+
},
|
|
145
|
+
async flush() {},
|
|
146
|
+
async healthCheck() {
|
|
147
|
+
return {
|
|
148
|
+
healthy: shared.health.healthy,
|
|
149
|
+
details: { ...shared.health.details }
|
|
150
|
+
};
|
|
122
151
|
},
|
|
123
152
|
async close() {},
|
|
124
153
|
use(_plugin) {
|
|
@@ -159,11 +188,16 @@ function createMockLogger(options = {}) {
|
|
|
159
188
|
reset() {
|
|
160
189
|
_calls.length = 0;
|
|
161
190
|
},
|
|
191
|
+
setHealth(healthy, details = {}) {
|
|
192
|
+
shared.health = {
|
|
193
|
+
healthy,
|
|
194
|
+
details
|
|
195
|
+
};
|
|
196
|
+
},
|
|
162
197
|
silent
|
|
163
198
|
};
|
|
164
199
|
return instance;
|
|
165
200
|
}
|
|
166
|
-
|
|
167
|
-
//#endregion
|
|
168
201
|
export { createMockLogger };
|
|
202
|
+
|
|
169
203
|
//# sourceMappingURL=testing.mjs.map
|
package/dist/testing.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testing.mjs","names":["_calls: MockLogCall[]","logger: IBaseLogger","instance: MockLoggerInstance"],"sources":["../src/testing/mock-logger.ts"],"sourcesContent":["/**\n * logixia/testing — Zero-dependency mock logger for Vitest & Jest.\n *\n * @example\n * ```ts\n * import { createMockLogger } from 'logixia/testing';\n *\n * const mock = createMockLogger();\n * await myService.doSomething(mock.logger);\n *\n * mock.expectLog('info', { message: 'order created' });\n * mock.expectLog('error', { message: /failed/ });\n * mock.reset();\n * ```\n */\n\nimport type { IBaseLogger, LogEntry } from '../types';\n\n// ── Types ────────────────────────────────────────────────────────────────────\n\nexport interface MockLogCall {\n level: string;\n message: string;\n data?: Record<string, unknown>;\n /** Full LogEntry shape for assertions that inspect the complete record. */\n entry: Pick<LogEntry, 'level' | 'message' | 'context'> & { data?: Record<string, unknown> };\n}\n\nexport type LogMatcher =\n | string\n | RegExp\n | ((call: MockLogCall) => boolean)\n | Partial<Record<'message' | 'level' | string, unknown>>;\n\nexport interface MockLoggerInstance {\n /** The logger itself — pass this where an IBaseLogger is expected. */\n readonly logger: IBaseLogger;\n /** Every call recorded across all levels, in insertion order. */\n readonly calls: MockLogCall[];\n /**\n * Get all calls for a specific level (case-insensitive). If `level` is\n * omitted, returns all calls across every level.\n */\n getCalls(level?: string): MockLogCall[];\n /** Return the most recent call, optionally filtered by level. */\n getLastCall(level?: string): MockLogCall | undefined;\n /**\n * Assert that at least one recorded call matches `matcher`.\n *\n * - string → exact message match\n * - RegExp → message test\n * - function → receives the full MockLogCall\n * - object → every key/value must match (supports RegExp values)\n *\n * Throws an Error with a descriptive message if the assertion fails (works\n * with both Vitest `expect` and Jest matchers via `.toThrow()`, or you can\n * let it propagate directly).\n */\n expectLog(level: string, matcher?: LogMatcher): void;\n /**\n * Assert that NO recorded call matches `matcher` at the given level.\n */\n expectNoLog(level: string, matcher?: LogMatcher): void;\n /** Clear all recorded calls. Call between tests. */\n reset(): void;\n /**\n * Silence — when true, the mock suppresses all console output from the\n * logger. Default: true.\n */\n silent: boolean;\n}\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction resolveCallField(call: MockLogCall, key: string): unknown {\n if (key === 'message') return call.message;\n if (key === 'level') return call.level;\n return call.data?.[key] ?? (call.entry as Record<string, unknown>)[key];\n}\n\nfunction formatMatcherDescription(matcher: LogMatcher | undefined): string {\n if (matcher === undefined) return '(any)';\n if (matcher instanceof RegExp) return matcher.toString();\n return JSON.stringify(matcher);\n}\n\nfunction matchesCall(call: MockLogCall, matcher?: LogMatcher): boolean {\n if (matcher === undefined) return true;\n if (typeof matcher === 'string') return call.message === matcher;\n if (matcher instanceof RegExp) return matcher.test(call.message);\n if (typeof matcher === 'function') return matcher(call);\n // Object shape: every key/value must match\n for (const [key, expected] of Object.entries(matcher)) {\n const actual = resolveCallField(call, key);\n if (expected instanceof RegExp) {\n if (!expected.test(String(actual ?? ''))) return false;\n } else {\n if (actual !== expected) return false;\n }\n }\n return true;\n}\n\nfunction formatCalls(calls: MockLogCall[]): string {\n if (calls.length === 0) return ' (no calls recorded)';\n return calls\n .map((c) => ` [${c.level}] \"${c.message}\" ${c.data ? JSON.stringify(c.data) : ''}`)\n .join('\\n');\n}\n\n// ── Implementation ────────────────────────────────────────────────────────────\n\n/**\n * Create a mock logger for use in tests.\n *\n * The returned object implements `IBaseLogger` and additionally exposes `.calls`,\n * `.getCalls()`, `.getLastCall()`, `.expectLog()`, `.expectNoLog()`, and `.reset()`.\n *\n * @param options.silent Suppress console output (default: true)\n * @param options.context Optional context label written into every `entry.context`\n */\nexport function createMockLogger(\n options: { silent?: boolean; context?: string } = {}\n): MockLoggerInstance {\n const { silent = true, context } = options;\n const _calls: MockLogCall[] = [];\n\n function record(\n level: string,\n messageOrError: string | Error,\n data?: Record<string, unknown>\n ): void {\n const message = messageOrError instanceof Error ? messageOrError.message : messageOrError;\n const extraData =\n messageOrError instanceof Error\n ? { ...data, error: { message: messageOrError.message, stack: messageOrError.stack } }\n : data;\n\n _calls.push({\n level,\n message,\n ...(extraData !== undefined ? { data: extraData } : {}),\n entry: {\n level,\n message,\n ...(context !== undefined ? { context } : {}),\n ...(extraData !== undefined ? { data: extraData } : {}),\n },\n });\n }\n\n const logger: IBaseLogger = {\n async error(messageOrError, data) {\n record('error', messageOrError as string | Error, data);\n },\n async warn(message, data) {\n record('warn', message, data);\n },\n async info(message, data) {\n record('info', message, data);\n },\n async debug(message, data) {\n record('debug', message, data);\n },\n async trace(message, data) {\n record('trace', message, data);\n },\n async verbose(message, data) {\n record('verbose', message, data);\n },\n async logLevel(level, message, data) {\n record(level, message, data);\n },\n\n time(_label) {\n /* no-op in tests */\n },\n async timeEnd(_label) {\n return 0;\n },\n async timeAsync(_label, fn) {\n return fn();\n },\n\n setLevel(_level) {\n /* no-op */\n },\n getLevel() {\n return 'info';\n },\n setContext(_ctx) {\n /* no-op */\n },\n getContext() {\n return context;\n },\n\n enableField(_f) {\n /* no-op */\n },\n disableField(_f) {\n /* no-op */\n },\n isFieldEnabled(_f) {\n return true;\n },\n getFieldState() {\n return {};\n },\n resetFieldState() {\n /* no-op */\n },\n\n enableTransportLevelPrompting() {\n /* no-op */\n },\n disableTransportLevelPrompting() {\n /* no-op */\n },\n setTransportLevels(_id, _levels) {\n /* no-op */\n },\n getTransportLevels(_id): string[] | undefined {\n return undefined;\n },\n clearTransportLevelPreferences() {\n /* no-op */\n },\n getAvailableTransports() {\n return [];\n },\n\n child(ctx, _data) {\n return createMockLogger({ silent, context: ctx }).logger;\n },\n async close() {\n /* no-op */\n },\n\n // Plugin API stubs — mock logger does not run plugins\n use(_plugin) {\n return this;\n },\n unuse(_pluginName) {\n return this;\n },\n };\n\n const instance: MockLoggerInstance = {\n get logger() {\n return logger;\n },\n get calls() {\n return _calls;\n },\n\n getCalls(level?: string): MockLogCall[] {\n if (!level) return [..._calls];\n const l = level.toLowerCase();\n return _calls.filter((c) => c.level.toLowerCase() === l);\n },\n\n getLastCall(level?: string): MockLogCall | undefined {\n const filtered = level\n ? _calls.filter((c) => c.level.toLowerCase() === level.toLowerCase())\n : _calls;\n return filtered[filtered.length - 1];\n },\n\n expectLog(level: string, matcher?: LogMatcher): void {\n const levelCalls = instance.getCalls(level);\n const matched = levelCalls.some((c) => matchesCall(c, matcher));\n if (!matched) {\n const matcherDesc = formatMatcherDescription(matcher);\n throw new Error(\n `Expected at least one [${level}] log matching ${matcherDesc}.\\n` +\n `Recorded calls:\\n${formatCalls(_calls)}`\n );\n }\n },\n\n expectNoLog(level: string, matcher?: LogMatcher): void {\n const levelCalls = instance.getCalls(level);\n const matched = levelCalls.some((c) => matchesCall(c, matcher));\n if (matched) {\n const matcherDesc = formatMatcherDescription(matcher);\n throw new Error(\n `Expected NO [${level}] log matching ${matcherDesc}, but one was found.\\n` +\n `Recorded calls:\\n${formatCalls(_calls)}`\n );\n }\n },\n\n reset(): void {\n _calls.length = 0;\n },\n\n silent,\n };\n\n return instance;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"testing.mjs","names":[],"sources":["../src/testing/mock-logger.ts"],"sourcesContent":["/**\n * logixia/testing — Zero-dependency mock logger for Vitest & Jest.\n *\n * @example\n * ```ts\n * import { createMockLogger } from 'logixia/testing';\n *\n * const mock = createMockLogger();\n * await myService.doSomething(mock.logger);\n *\n * mock.expectLog('info', { message: 'order created' });\n * mock.expectLog('error', { message: /failed/ });\n * mock.reset();\n * ```\n */\n\nimport type { LogEntry, LogixiaLoggerInstance, NamespaceLevels } from '../types';\n\n// ── Types ────────────────────────────────────────────────────────────────────\n\nexport interface MockLogCall {\n level: string;\n message: string;\n data?: Record<string, unknown>;\n /** Full LogEntry shape for assertions that inspect the complete record. */\n entry: Pick<LogEntry, 'level' | 'message' | 'context'> & { data?: Record<string, unknown> };\n}\n\nexport type LogMatcher =\n | string\n | RegExp\n | ((call: MockLogCall) => boolean)\n | Partial<Record<'message' | 'level' | string, unknown>>;\n\nexport interface MockLoggerInstance {\n /** The logger itself — pass this where an IBaseLogger or ILogger is expected. */\n readonly logger: LogixiaLoggerInstance;\n /** Every call recorded across all levels, in insertion order. */\n readonly calls: MockLogCall[];\n /**\n * Get all calls for a specific level (case-insensitive). If `level` is\n * omitted, returns all calls across every level.\n */\n getCalls(level?: string): MockLogCall[];\n /** Return the most recent call, optionally filtered by level. */\n getLastCall(level?: string): MockLogCall | undefined;\n /**\n * Assert that at least one recorded call matches `matcher`.\n *\n * - string → exact message match\n * - RegExp → message test\n * - function → receives the full MockLogCall\n * - object → every key/value must match (supports RegExp values)\n *\n * Throws an Error with a descriptive message if the assertion fails (works\n * with both Vitest `expect` and Jest matchers via `.toThrow()`, or you can\n * let it propagate directly).\n */\n expectLog(level: string, matcher?: LogMatcher): void;\n /**\n * Assert that NO recorded call matches `matcher` at the given level.\n */\n expectNoLog(level: string, matcher?: LogMatcher): void;\n /** Clear all recorded calls. Call between tests. */\n reset(): void;\n /**\n * Make `logger.healthCheck()` report healthy or unhealthy, to exercise code that\n * reacts to a failing logger. Shared with child loggers.\n */\n setHealth(healthy: boolean, details?: Record<string, unknown>): void;\n /**\n * Silence — when true, the mock suppresses all console output from the\n * logger. Default: true.\n */\n silent: boolean;\n}\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction resolveCallField(call: MockLogCall, key: string): unknown {\n if (key === 'message') return call.message;\n if (key === 'level') return call.level;\n return call.data?.[key] ?? (call.entry as Record<string, unknown>)[key];\n}\n\nfunction formatMatcherDescription(matcher: LogMatcher | undefined): string {\n if (matcher === undefined) return '(any)';\n if (matcher instanceof RegExp) return matcher.toString();\n return JSON.stringify(matcher);\n}\n\nfunction matchesCall(call: MockLogCall, matcher?: LogMatcher): boolean {\n if (matcher === undefined) return true;\n if (typeof matcher === 'string') return call.message === matcher;\n if (matcher instanceof RegExp) return matcher.test(call.message);\n if (typeof matcher === 'function') return matcher(call);\n // Object shape: every key/value must match\n for (const [key, expected] of Object.entries(matcher)) {\n const actual = resolveCallField(call, key);\n if (expected instanceof RegExp) {\n if (!expected.test(String(actual ?? ''))) return false;\n } else {\n if (actual !== expected) return false;\n }\n }\n return true;\n}\n\nfunction formatCalls(calls: MockLogCall[]): string {\n if (calls.length === 0) return ' (no calls recorded)';\n return calls\n .map((c) => ` [${c.level}] \"${c.message}\" ${c.data ? JSON.stringify(c.data) : ''}`)\n .join('\\n');\n}\n\n// ── Implementation ────────────────────────────────────────────────────────────\n\n/**\n * Create a mock logger for use in tests.\n *\n * The returned object implements `ILogger` and additionally exposes `.calls`,\n * `.getCalls()`, `.getLastCall()`, `.expectLog()`, `.expectNoLog()`, and `.reset()`.\n *\n * @param options.silent Suppress console output (default: true)\n * @param options.context Optional context label written into every `entry.context`\n * @param options.healthy Initial `healthCheck()` result (default: true); change later with `setHealth()`\n */\nexport function createMockLogger(\n options: { silent?: boolean; context?: string; healthy?: boolean } = {}\n): MockLoggerInstance {\n return buildMockLogger(options, {\n namespaceLevels: {},\n health: { healthy: options.healthy ?? true, details: {} },\n });\n}\n\n/** State a mock logger shares with its children, like the real logger. */\ninterface SharedMockState {\n namespaceLevels: NamespaceLevels;\n health: { healthy: boolean; details: Record<string, unknown> };\n}\n\nfunction buildMockLogger(\n options: { silent?: boolean; context?: string },\n shared: SharedMockState\n): MockLoggerInstance {\n const { silent = true, context } = options;\n const _calls: MockLogCall[] = [];\n\n function record(\n level: string,\n messageOrError: string | Error,\n data?: Record<string, unknown>\n ): void {\n const message = messageOrError instanceof Error ? messageOrError.message : messageOrError;\n const extraData =\n messageOrError instanceof Error\n ? { ...data, error: { message: messageOrError.message, stack: messageOrError.stack } }\n : data;\n\n _calls.push({\n level,\n message,\n ...(extraData !== undefined ? { data: extraData } : {}),\n entry: {\n level,\n message,\n ...(context !== undefined ? { context } : {}),\n ...(extraData !== undefined ? { data: extraData } : {}),\n },\n });\n }\n\n const logger: LogixiaLoggerInstance = {\n async error(messageOrError, data) {\n record('error', messageOrError as string | Error, data);\n },\n async warn(message, data) {\n record('warn', message, data);\n },\n async info(message, data) {\n record('info', message, data);\n },\n async debug(message, data) {\n record('debug', message, data);\n },\n async trace(message, data) {\n record('trace', message, data);\n },\n async verbose(message, data) {\n record('verbose', message, data);\n },\n async logLevel(level, message, data) {\n record(level, message, data);\n },\n\n time(_label) {\n /* no-op in tests */\n },\n async timeEnd(_label) {\n return 0;\n },\n async timeAsync(_label, fn) {\n return fn();\n },\n\n setLevel(_level) {\n /* no-op */\n },\n getLevel() {\n return 'info';\n },\n setNamespaceLevels(levels) {\n shared.namespaceLevels = { ...levels };\n },\n patchNamespaceLevels(levels) {\n shared.namespaceLevels = { ...shared.namespaceLevels, ...levels };\n },\n getNamespaceLevels() {\n return { ...shared.namespaceLevels };\n },\n setContext(_ctx) {\n /* no-op */\n },\n getContext() {\n return context;\n },\n\n enableField(_f) {\n /* no-op */\n },\n disableField(_f) {\n /* no-op */\n },\n isFieldEnabled(_f) {\n return true;\n },\n getFieldState() {\n return {};\n },\n resetFieldState() {\n /* no-op */\n },\n\n enableTransportLevelPrompting() {\n /* no-op */\n },\n disableTransportLevelPrompting() {\n /* no-op */\n },\n setTransportLevels(_id, _levels) {\n /* no-op */\n },\n getTransportLevels(_id): string[] | undefined {\n return undefined;\n },\n clearTransportLevelPreferences() {\n /* no-op */\n },\n getAvailableTransports() {\n return [];\n },\n\n child(ctx, _data) {\n return buildMockLogger({ silent, context: ctx }, shared).logger;\n },\n async flush() {\n /* no-op */\n },\n async healthCheck() {\n return { healthy: shared.health.healthy, details: { ...shared.health.details } };\n },\n async close() {\n /* no-op */\n },\n\n // Plugin API stubs — mock logger does not run plugins\n use(_plugin) {\n return this;\n },\n unuse(_pluginName) {\n return this;\n },\n };\n\n const instance: MockLoggerInstance = {\n get logger() {\n return logger;\n },\n get calls() {\n return _calls;\n },\n\n getCalls(level?: string): MockLogCall[] {\n if (!level) return [..._calls];\n const l = level.toLowerCase();\n return _calls.filter((c) => c.level.toLowerCase() === l);\n },\n\n getLastCall(level?: string): MockLogCall | undefined {\n const filtered = level\n ? _calls.filter((c) => c.level.toLowerCase() === level.toLowerCase())\n : _calls;\n return filtered[filtered.length - 1];\n },\n\n expectLog(level: string, matcher?: LogMatcher): void {\n const levelCalls = instance.getCalls(level);\n const matched = levelCalls.some((c) => matchesCall(c, matcher));\n if (!matched) {\n const matcherDesc = formatMatcherDescription(matcher);\n throw new Error(\n `Expected at least one [${level}] log matching ${matcherDesc}.\\n` +\n `Recorded calls:\\n${formatCalls(_calls)}`\n );\n }\n },\n\n expectNoLog(level: string, matcher?: LogMatcher): void {\n const levelCalls = instance.getCalls(level);\n const matched = levelCalls.some((c) => matchesCall(c, matcher));\n if (matched) {\n const matcherDesc = formatMatcherDescription(matcher);\n throw new Error(\n `Expected NO [${level}] log matching ${matcherDesc}, but one was found.\\n` +\n `Recorded calls:\\n${formatCalls(_calls)}`\n );\n }\n },\n\n reset(): void {\n _calls.length = 0;\n },\n\n setHealth(healthy: boolean, details: Record<string, unknown> = {}): void {\n shared.health = { healthy, details };\n },\n\n silent,\n };\n\n return instance;\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
//#region src/types/transport.types.d.ts
|
|
2
1
|
/**
|
|
3
2
|
* Per-transport retry & failover configuration.
|
|
4
3
|
*/
|
|
@@ -106,7 +105,11 @@ interface ConsoleTransportConfig {
|
|
|
106
105
|
}
|
|
107
106
|
interface AnalyticsTransportConfig {
|
|
108
107
|
level?: string;
|
|
109
|
-
|
|
108
|
+
/**
|
|
109
|
+
* @deprecated Not used by Mixpanel, Segment or Google Analytics (they use `token`,
|
|
110
|
+
* `writeKey` and `measurementId`/`apiSecret`). Only DataDog reads an API key.
|
|
111
|
+
*/
|
|
112
|
+
apiKey?: string;
|
|
110
113
|
projectId?: string;
|
|
111
114
|
endpoint?: string;
|
|
112
115
|
batchSize?: number;
|
|
@@ -128,6 +131,7 @@ interface MixpanelTransportConfig extends AnalyticsTransportConfig {
|
|
|
128
131
|
superProperties?: Record<string, unknown>;
|
|
129
132
|
}
|
|
130
133
|
interface DataDogTransportConfig extends AnalyticsTransportConfig {
|
|
134
|
+
/** Datadog API key (sent as `DD-API-KEY`). Required. */
|
|
131
135
|
apiKey: string;
|
|
132
136
|
site?: 'datadoghq.com' | 'datadoghq.eu' | 'us3.datadoghq.com' | 'us5.datadoghq.com' | 'ap1.datadoghq.com' | 'ddog-gov.com';
|
|
133
137
|
/** Gzip log request bodies (`Content-Encoding: gzip`). Default false. */
|
|
@@ -187,6 +191,12 @@ interface IAsyncTransport extends ITransport {
|
|
|
187
191
|
flush(): Promise<void>;
|
|
188
192
|
isReady?(): Promise<boolean>;
|
|
189
193
|
}
|
|
194
|
+
interface TransportEvents {
|
|
195
|
+
log: (entry: TransportLogEntry) => void;
|
|
196
|
+
error: (error: Error, transport: string) => void;
|
|
197
|
+
rotate: (oldFile: string, newFile: string) => void;
|
|
198
|
+
flush: (transport: string, count: number) => void;
|
|
199
|
+
}
|
|
190
200
|
interface IBatchTransport extends ITransport {
|
|
191
201
|
readonly batchSize?: number;
|
|
192
202
|
readonly flushInterval?: number;
|
|
@@ -202,6 +212,5 @@ interface TransportMetrics {
|
|
|
202
212
|
lastWrite: Date;
|
|
203
213
|
averageWriteTime: number;
|
|
204
214
|
}
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
//# sourceMappingURL=transport.types-CGoHpWQR.d.ts.map
|
|
215
|
+
export { TransportLogEntry as _, DatabaseTransportConfig as a, TransportType as b, GoogleAnalyticsTransportConfig as c, ITransport as d, MixpanelTransportConfig as f, TransportEvents as g, TransportConfig as h, DataDogTransportConfig as i, IAsyncTransport as l, SegmentTransportConfig as m, AnalyticsTransportConfig as n, FileStats as o, RotationConfig as p, ConsoleTransportConfig as r, FileTransportConfig as s, AnalyticsConfig as t, IBatchTransport as u, TransportMetrics as v, TransportRetryConfig as y };
|
|
216
|
+
//# sourceMappingURL=transport.types-CzJq4IrF.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.types-CzJq4IrF.d.mts","names":[],"sources":["../src/types/transport.types.ts"],"mappings":";;;UAKiB;EACf;EACA;EACA;EACA;EACA,WAAW;EACX,eAAe,OAAO,OAAO,OAAO;;UAGrB;EACf;EACA;;;;;EAKA,UAAU,OAAO;;;;;EAKjB,MAAM,OAAO,2BAA2B;EACxC,UAAU;EACV,QAAQ;;UAGO;EACf,WAAW;EACX;EACA;EACA,OAAO;EACP;EACA;EACA;EACA;;UAGe;EACf;EACA;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;EACA;EACA;EACA;EACA;EACA,WAAW;;;;;;EAMX;;;;;;EAMA;EACA,UAAU,OAAO;;UAGF;EACf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,UAAU,OAAO;;;;;EAKjB;;UAGe;EACf;EACA;EACA;EACA;;;;;;EAMA,cAAc;EACd,UAAU,OAAO;;UAGF;EACf;;;;;EAKA;EACA;EACA;EACA;EACA;EACA;EACA;;;;;EAKA;EACA,mBAAmB;EACnB,UAAU,OAAO;;UAGF,gCAAgC;EAC/C;EACA;EACA;EACA,kBAAkB;;UAGH,+BAA+B;;EAE9C;EACA;;EAQA;EACA;EACA;EACA;EACA;EACA;;EAEA;;UAGe,uCAAuC;EACtD;EACA;EACA;EACA;EACA;;UAGe,+BAA+B;EAC9C;EACA;;EAEA;EACA;EACA;EACA;EACA;;UAGe;EACf;EACA;EACA;EACA;;EAEA,gBAAgB,qBAAqB,OAAO;;UAG7B;EACf;EACA,SAAS;EACT,UAAU;;UAGK;EACf,UAAU;EACV,OAAO,sBAAsB;EAC7B,WAAW,0BAA0B;EACrC,YAAY;EACZ,SAAS;;UAGM;EACf,WAAW,0BAA0B;EACrC,UAAU,yBAAyB;EACnC,kBAAkB,iCAAiC;EACnD,UAAU,yBAAyB;;UAGpB,wBAAwB;EACvC,SAAS;EACT,YAAY;;UAGG;EACf,MAAM,OAAO;EACb,QAAQ,OAAO,OAAO;EACtB,SAAS,iBAAiB;EAC1B,QAAQ,mBAAmB;;UAGZ,wBAAwB;WAC9B;WACA;EACT,WAAW,OAAO;EAClB,SAAS;;KAGC;UAEK;EACf;EACA,MAAM;EACN;EACA;EACA,WAAW;EACX"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
//#region src/types/transport.types.d.ts
|
|
2
1
|
/**
|
|
3
2
|
* Per-transport retry & failover configuration.
|
|
4
3
|
*/
|
|
@@ -106,7 +105,11 @@ interface ConsoleTransportConfig {
|
|
|
106
105
|
}
|
|
107
106
|
interface AnalyticsTransportConfig {
|
|
108
107
|
level?: string;
|
|
109
|
-
|
|
108
|
+
/**
|
|
109
|
+
* @deprecated Not used by Mixpanel, Segment or Google Analytics (they use `token`,
|
|
110
|
+
* `writeKey` and `measurementId`/`apiSecret`). Only DataDog reads an API key.
|
|
111
|
+
*/
|
|
112
|
+
apiKey?: string;
|
|
110
113
|
projectId?: string;
|
|
111
114
|
endpoint?: string;
|
|
112
115
|
batchSize?: number;
|
|
@@ -128,6 +131,7 @@ interface MixpanelTransportConfig extends AnalyticsTransportConfig {
|
|
|
128
131
|
superProperties?: Record<string, unknown>;
|
|
129
132
|
}
|
|
130
133
|
interface DataDogTransportConfig extends AnalyticsTransportConfig {
|
|
134
|
+
/** Datadog API key (sent as `DD-API-KEY`). Required. */
|
|
131
135
|
apiKey: string;
|
|
132
136
|
site?: 'datadoghq.com' | 'datadoghq.eu' | 'us3.datadoghq.com' | 'us5.datadoghq.com' | 'ap1.datadoghq.com' | 'ddog-gov.com';
|
|
133
137
|
/** Gzip log request bodies (`Content-Encoding: gzip`). Default false. */
|
|
@@ -187,6 +191,12 @@ interface IAsyncTransport extends ITransport {
|
|
|
187
191
|
flush(): Promise<void>;
|
|
188
192
|
isReady?(): Promise<boolean>;
|
|
189
193
|
}
|
|
194
|
+
interface TransportEvents {
|
|
195
|
+
log: (entry: TransportLogEntry) => void;
|
|
196
|
+
error: (error: Error, transport: string) => void;
|
|
197
|
+
rotate: (oldFile: string, newFile: string) => void;
|
|
198
|
+
flush: (transport: string, count: number) => void;
|
|
199
|
+
}
|
|
190
200
|
interface IBatchTransport extends ITransport {
|
|
191
201
|
readonly batchSize?: number;
|
|
192
202
|
readonly flushInterval?: number;
|
|
@@ -202,6 +212,5 @@ interface TransportMetrics {
|
|
|
202
212
|
lastWrite: Date;
|
|
203
213
|
averageWriteTime: number;
|
|
204
214
|
}
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
//# sourceMappingURL=transport.types-BMnurPcc.d.mts.map
|
|
215
|
+
export { TransportLogEntry as _, DatabaseTransportConfig as a, TransportType as b, GoogleAnalyticsTransportConfig as c, ITransport as d, MixpanelTransportConfig as f, TransportEvents as g, TransportConfig as h, DataDogTransportConfig as i, IAsyncTransport as l, SegmentTransportConfig as m, AnalyticsTransportConfig as n, FileStats as o, RotationConfig as p, ConsoleTransportConfig as r, FileTransportConfig as s, AnalyticsConfig as t, IBatchTransport as u, TransportMetrics as v, TransportRetryConfig as y };
|
|
216
|
+
//# sourceMappingURL=transport.types-CzJq4IrF.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.types-CzJq4IrF.d.ts","names":[],"sources":["../src/types/transport.types.ts"],"mappings":";;;UAKiB;EACf;EACA;EACA;EACA;EACA,WAAW;EACX,eAAe,OAAO,OAAO,OAAO;;UAGrB;EACf;EACA;;;;;EAKA,UAAU,OAAO;;;;;EAKjB,MAAM,OAAO,2BAA2B;EACxC,UAAU;EACV,QAAQ;;UAGO;EACf,WAAW;EACX;EACA;EACA,OAAO;EACP;EACA;EACA;EACA;;UAGe;EACf;EACA;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;EACA;EACA;EACA;EACA;EACA,WAAW;;;;;;EAMX;;;;;;EAMA;EACA,UAAU,OAAO;;UAGF;EACf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,UAAU,OAAO;;;;;EAKjB;;UAGe;EACf;EACA;EACA;EACA;;;;;;EAMA,cAAc;EACd,UAAU,OAAO;;UAGF;EACf;;;;;EAKA;EACA;EACA;EACA;EACA;EACA;EACA;;;;;EAKA;EACA,mBAAmB;EACnB,UAAU,OAAO;;UAGF,gCAAgC;EAC/C;EACA;EACA;EACA,kBAAkB;;UAGH,+BAA+B;;EAE9C;EACA;;EAQA;EACA;EACA;EACA;EACA;EACA;;EAEA;;UAGe,uCAAuC;EACtD;EACA;EACA;EACA;EACA;;UAGe,+BAA+B;EAC9C;EACA;;EAEA;EACA;EACA;EACA;EACA;;UAGe;EACf;EACA;EACA;EACA;;EAEA,gBAAgB,qBAAqB,OAAO;;UAG7B;EACf;EACA,SAAS;EACT,UAAU;;UAGK;EACf,UAAU;EACV,OAAO,sBAAsB;EAC7B,WAAW,0BAA0B;EACrC,YAAY;EACZ,SAAS;;UAGM;EACf,WAAW,0BAA0B;EACrC,UAAU,yBAAyB;EACnC,kBAAkB,iCAAiC;EACnD,UAAU,yBAAyB;;UAGpB,wBAAwB;EACvC,SAAS;EACT,YAAY;;UAGG;EACf,MAAM,OAAO;EACb,QAAQ,OAAO,OAAO;EACtB,SAAS,iBAAiB;EAC1B,QAAQ,mBAAmB;;UAGZ,wBAAwB;WAC9B;WACA;EACT,WAAW,OAAO;EAClB,SAAS;;KAGC;UAEK;EACf;EACA,MAAM;EACN;EACA;EACA,WAAW;EACX"}
|