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,7 +1,57 @@
|
|
|
1
|
-
import { p as TransportLogEntry, s as IAsyncTransport } from "./transport.types-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import { p as TransportLogEntry, s as IAsyncTransport } from "./transport.types-BJVL1QQl.mjs";
|
|
2
|
+
interface OtlpLogTransportConfig {
|
|
3
|
+
/** OTLP/HTTP logs endpoint, e.g. `http://localhost:4318/v1/logs`. */
|
|
4
|
+
url: string;
|
|
5
|
+
/** Extra HTTP headers (auth, tenant, etc.). */
|
|
6
|
+
headers?: Record<string, string>;
|
|
7
|
+
/** `service.name` resource attribute. Default: 'logixia'. */
|
|
8
|
+
serviceName?: string;
|
|
9
|
+
/** `service.version` resource attribute. */
|
|
10
|
+
serviceVersion?: string;
|
|
11
|
+
/** `deployment.environment` resource attribute. */
|
|
12
|
+
environment?: string;
|
|
13
|
+
/** Extra resource attributes merged into the OTLP resource. */
|
|
14
|
+
resourceAttributes?: Record<string, string | number | boolean>;
|
|
15
|
+
/** Entries per batch / per POST. Default: 100. */
|
|
16
|
+
batchSize?: number;
|
|
17
|
+
/** Auto-flush interval (ms). Default: 5000. */
|
|
18
|
+
flushIntervalMs?: number;
|
|
19
|
+
/** Abort a request that has not finished after this many ms. Default: 10000. */
|
|
20
|
+
requestTimeoutMs?: number;
|
|
21
|
+
/** Max buffered entries; the oldest are dropped past this. Default: 10000. */
|
|
22
|
+
maxBufferSize?: number;
|
|
23
|
+
level?: string;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Map a logixia level name to an OTel SeverityNumber (1–24) and text.
|
|
27
|
+
* Per the OTel logs SDK spec: TRACE=1, DEBUG=5, INFO=9, WARN=13, ERROR=17,
|
|
28
|
+
* FATAL=21. Custom/unknown levels fall back to INFO (9).
|
|
29
|
+
*/
|
|
30
|
+
declare function toOtelSeverity(level: string): {
|
|
31
|
+
number: number;
|
|
32
|
+
text: string;
|
|
33
|
+
};
|
|
34
|
+
declare class OtlpLogTransport implements IAsyncTransport {
|
|
35
|
+
readonly name = "otlp";
|
|
36
|
+
readonly level: string | undefined;
|
|
37
|
+
private readonly url;
|
|
38
|
+
private readonly headers;
|
|
39
|
+
private readonly batchSize;
|
|
40
|
+
private readonly flushIntervalMs;
|
|
41
|
+
private readonly requestTimeoutMs;
|
|
42
|
+
private readonly resourceAttrs;
|
|
43
|
+
private readonly buffer;
|
|
44
|
+
private flushTimer;
|
|
45
|
+
constructor(config: OtlpLogTransportConfig);
|
|
46
|
+
write(entry: TransportLogEntry): void;
|
|
47
|
+
/** Convert one entry into an OTLP LogRecord. */
|
|
48
|
+
private toLogRecord;
|
|
49
|
+
private buildPayload;
|
|
50
|
+
flush(): Promise<void>;
|
|
51
|
+
private secretValues;
|
|
52
|
+
private send;
|
|
53
|
+
close(): Promise<void>;
|
|
54
|
+
}
|
|
5
55
|
interface DiscordEmbedField {
|
|
6
56
|
name: string;
|
|
7
57
|
value: string;
|
|
@@ -58,8 +108,6 @@ declare class DiscordTransport implements IAsyncTransport {
|
|
|
58
108
|
private fitToBudget;
|
|
59
109
|
private draftFor;
|
|
60
110
|
}
|
|
61
|
-
//#endregion
|
|
62
|
-
//#region src/transports/slack.transport.d.ts
|
|
63
111
|
/** A Slack message body as returned by a custom `formatter`. */
|
|
64
112
|
interface SlackMessage {
|
|
65
113
|
text?: string;
|
|
@@ -107,6 +155,5 @@ declare class SlackTransport implements IAsyncTransport {
|
|
|
107
155
|
private buildPayload;
|
|
108
156
|
private messageFor;
|
|
109
157
|
}
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
//# sourceMappingURL=slack.transport-CXjQYOes.d.ts.map
|
|
158
|
+
export { DiscordTransport as a, OtlpLogTransportConfig as c, DiscordEmbed as i, toOtelSeverity as l, SlackTransport as n, DiscordTransportConfig as o, SlackTransportConfig as r, OtlpLogTransport as s, SlackMessage as t };
|
|
159
|
+
//# sourceMappingURL=slack.transport-DxHOXlLu.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slack.transport-DxHOXlLu.d.mts","names":[],"sources":["../src/transports/otlp.transport.ts","../src/transports/discord.transport.ts","../src/transports/slack.transport.ts"],"mappings":";UAsCiB;;EAEf;;EAEA,UAAU;;EAEV;;EAEA;;EAEA;;EAEA,qBAAqB;;EAErB;;EAEA;;EAEA;;EAEA;EACA;;;;;;;iBAmBc,eAAe;EAAkB;EAAgB;;cA6CpD,4BAA4B;WACvB;WACA;mBAEC;mBACA;mBACA;mBACA;mBACA;mBACA;mBAEA;UACT;EAEI,YAAA,QAAQ;EA+BpB,MAAM,OAAO;;UAML;UA+BA;EAgBR,SAAS;UAID;UAIM;EA4BR,SAAS;;UCnNA;EACf;EACA;EACA;;UAGe;EACf;EACA;EACA;EACA;EACA,SAAS;GACR;;UAGc;;EAEf;;EAEA;EACA;;EAEA;;EAEA;;;;;EAKA,aAAa,OAAO,sBAAsB;EAC1C,UAAU,OAAO;;EAEjB;;EAEA;;EAEA;EACA;;cA0FW,4BAA4B;WACvB;WACA;EACT,UAAU,OAAO;mBAEP;mBACA;mBACA;mBACA;EAEL,YAAA,QAAQ;EAiCpB,MAAM,OAAO;EAMb,SAAS;EAIT,SAAS;;EAKT,UAAU;UASF;;UAoBA;UAgBA;;;UC9OO;EACf;EACA;GACC;;UAGc;;EAEf;;EAEA;EACA;EACA;;EAEA;;;;;;EAMA,aAAa,OAAO,sBAAsB;EAC1C,UAAU,OAAO;;EAEjB;;EAEA;;EAEA;EACA;;cAgBW,0BAA0B;WACrB;WACA;EACT,UAAU,OAAO;mBAEP;mBACA;mBACA;mBACA;EAEL,YAAA,QAAQ;EA4BpB,MAAM,OAAO;EAMb,SAAS;EAIT,SAAS;;EAKT,UAAU;UASF;UAiBA"}
|
package/dist/testing.d.mts
CHANGED
|
@@ -1,8 +1,4 @@
|
|
|
1
|
-
import "./
|
|
2
|
-
import { h as LogEntry, u as IBaseLogger } from "./index-3mw5gaCw.mjs";
|
|
3
|
-
|
|
4
|
-
//#region src/testing/mock-logger.d.ts
|
|
5
|
-
|
|
1
|
+
import { h as LogEntry, u as IBaseLogger } from "./index-xqaJtAZn.mjs";
|
|
6
2
|
interface MockLogCall {
|
|
7
3
|
level: string;
|
|
8
4
|
message: string;
|
|
@@ -59,10 +55,9 @@ interface MockLoggerInstance {
|
|
|
59
55
|
* @param options.silent Suppress console output (default: true)
|
|
60
56
|
* @param options.context Optional context label written into every `entry.context`
|
|
61
57
|
*/
|
|
62
|
-
declare function createMockLogger(options?: {
|
|
58
|
+
export declare function createMockLogger(options?: {
|
|
63
59
|
silent?: boolean;
|
|
64
60
|
context?: string;
|
|
65
61
|
}): MockLoggerInstance;
|
|
66
|
-
|
|
67
|
-
export { type LogMatcher, type MockLogCall, type MockLoggerInstance, createMockLogger };
|
|
62
|
+
export type { LogMatcher, MockLogCall, MockLoggerInstance };
|
|
68
63
|
//# sourceMappingURL=testing.d.mts.map
|
package/dist/testing.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testing.d.mts","names":[],"sources":["../src/testing/mock-logger.ts"],"
|
|
1
|
+
{"version":3,"file":"testing.d.mts","names":[],"sources":["../src/testing/mock-logger.ts"],"mappings":";UAoBiB;EACf;EACA;EACA,OAAO;;EAEP,OAAO,KAAK;IAA+C,OAAO;;;KAGxD,sBAER,WACE,MAAM,2BACR,QAAQ;UAEK;;WAEN,QAAQ;;WAER,OAAO;;;;;EAKhB,SAAS,iBAAiB;;EAE1B,YAAY,iBAAiB;;;;;;;;;;;;;EAa7B,UAAU,eAAe,UAAU;;;;EAInC,YAAY,eAAe,UAAU;;EAErC;;;;;EAKA;;;;;;;;;;;wBAoDc,iBACd;EAAW;EAAkB;IAC5B"}
|
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 { h as LogEntry, u as IBaseLogger } from "./index-DwozbmB4.js";
|
|
6
2
|
interface MockLogCall {
|
|
7
3
|
level: string;
|
|
8
4
|
message: string;
|
|
@@ -59,10 +55,9 @@ interface MockLoggerInstance {
|
|
|
59
55
|
* @param options.silent Suppress console output (default: true)
|
|
60
56
|
* @param options.context Optional context label written into every `entry.context`
|
|
61
57
|
*/
|
|
62
|
-
declare function createMockLogger(options?: {
|
|
58
|
+
export declare function createMockLogger(options?: {
|
|
63
59
|
silent?: boolean;
|
|
64
60
|
context?: string;
|
|
65
61
|
}): MockLoggerInstance;
|
|
66
|
-
|
|
67
|
-
export { type LogMatcher, type MockLogCall, type MockLoggerInstance, createMockLogger };
|
|
62
|
+
export type { LogMatcher, MockLogCall, MockLoggerInstance };
|
|
68
63
|
//# 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;;;;;;;;;;;wBAoDc,iBACd;EAAW;EAAkB;IAC5B"}
|
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;
|
|
@@ -164,7 +164,6 @@ function createMockLogger(options = {}) {
|
|
|
164
164
|
};
|
|
165
165
|
return instance;
|
|
166
166
|
}
|
|
167
|
-
|
|
168
|
-
//#endregion
|
|
169
167
|
exports.createMockLogger = createMockLogger;
|
|
168
|
+
|
|
170
169
|
//# 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 { 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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"}
|
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;
|
|
@@ -163,7 +163,6 @@ function createMockLogger(options = {}) {
|
|
|
163
163
|
};
|
|
164
164
|
return instance;
|
|
165
165
|
}
|
|
166
|
-
|
|
167
|
-
//#endregion
|
|
168
166
|
export { createMockLogger };
|
|
167
|
+
|
|
169
168
|
//# 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 { 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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"}
|