vestig 0.11.4 → 0.13.0
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 +95 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +4 -0
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts +9 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/logger.d.ts +85 -0
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +209 -2
- package/dist/logger.js.map +1 -1
- package/dist/metrics/index.d.ts +2 -0
- package/dist/metrics/index.d.ts.map +1 -0
- package/dist/metrics/index.js +2 -0
- package/dist/metrics/index.js.map +1 -0
- package/dist/metrics/prometheus.d.ts +109 -0
- package/dist/metrics/prometheus.d.ts.map +1 -0
- package/dist/metrics/prometheus.js +162 -0
- package/dist/metrics/prometheus.js.map +1 -0
- package/dist/sampling/index.d.ts +2 -0
- package/dist/sampling/index.d.ts.map +1 -1
- package/dist/sampling/index.js +2 -0
- package/dist/sampling/index.js.map +1 -1
- package/dist/sampling/tail.d.ts +76 -0
- package/dist/sampling/tail.d.ts.map +1 -0
- package/dist/sampling/tail.js +138 -0
- package/dist/sampling/tail.js.map +1 -0
- package/dist/transports/batch.d.ts +2 -0
- package/dist/transports/batch.d.ts.map +1 -1
- package/dist/transports/batch.js +13 -3
- package/dist/transports/batch.js.map +1 -1
- package/dist/transports/file.d.ts +14 -1
- package/dist/transports/file.d.ts.map +1 -1
- package/dist/transports/file.js +59 -4
- package/dist/transports/file.js.map +1 -1
- package/dist/transports/http.d.ts +29 -1
- package/dist/transports/http.d.ts.map +1 -1
- package/dist/transports/http.js +63 -6
- package/dist/transports/http.js.map +1 -1
- package/dist/transports/sentry.d.ts +83 -0
- package/dist/transports/sentry.d.ts.map +1 -0
- package/dist/transports/sentry.js +283 -0
- package/dist/transports/sentry.js.map +1 -0
- package/dist/types.d.ts +149 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/buffer.d.ts +33 -1
- package/dist/utils/buffer.d.ts.map +1 -1
- package/dist/utils/buffer.js +40 -2
- package/dist/utils/buffer.js.map +1 -1
- package/dist/utils/dedupe.d.ts +80 -0
- package/dist/utils/dedupe.d.ts.map +1 -0
- package/dist/utils/dedupe.js +173 -0
- package/dist/utils/dedupe.js.map +1 -0
- package/dist/utils/sanitize.d.ts +23 -1
- package/dist/utils/sanitize.d.ts.map +1 -1
- package/dist/utils/sanitize.js +113 -8
- package/dist/utils/sanitize.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/wide-events/builder.d.ts +51 -0
- package/dist/wide-events/builder.d.ts.map +1 -0
- package/dist/wide-events/builder.js +177 -0
- package/dist/wide-events/builder.js.map +1 -0
- package/dist/wide-events/context.d.ts +57 -0
- package/dist/wide-events/context.d.ts.map +1 -0
- package/dist/wide-events/context.js +148 -0
- package/dist/wide-events/context.js.map +1 -0
- package/dist/wide-events/index.d.ts +6 -0
- package/dist/wide-events/index.d.ts.map +1 -0
- package/dist/wide-events/index.js +7 -0
- package/dist/wide-events/index.js.map +1 -0
- package/dist/wide-events/schemas/http.d.ts +179 -0
- package/dist/wide-events/schemas/http.d.ts.map +1 -0
- package/dist/wide-events/schemas/http.js +25 -0
- package/dist/wide-events/schemas/http.js.map +1 -0
- package/dist/wide-events/schemas/index.d.ts +5 -0
- package/dist/wide-events/schemas/index.d.ts.map +1 -0
- package/dist/wide-events/schemas/index.js +5 -0
- package/dist/wide-events/schemas/index.js.map +1 -0
- package/dist/wide-events/schemas/job.d.ts +130 -0
- package/dist/wide-events/schemas/job.d.ts.map +1 -0
- package/dist/wide-events/schemas/job.js +27 -0
- package/dist/wide-events/schemas/job.js.map +1 -0
- package/dist/wide-events/types.d.ts +216 -0
- package/dist/wide-events/types.d.ts.map +1 -0
- package/dist/wide-events/types.js +2 -0
- package/dist/wide-events/types.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import type { DedupeConfig, LogLevel } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Result of checking if a log should be suppressed
|
|
4
|
+
*/
|
|
5
|
+
export interface DedupeResult {
|
|
6
|
+
/** Whether this log should be suppressed */
|
|
7
|
+
suppressed: boolean;
|
|
8
|
+
/** If not suppressed and is a summary, how many were suppressed */
|
|
9
|
+
suppressedCount?: number;
|
|
10
|
+
/** If this is a summary log, the original key */
|
|
11
|
+
isFlush?: boolean;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Deduplicator for suppressing repeated identical log messages
|
|
15
|
+
*
|
|
16
|
+
* Uses an LRU-like eviction strategy to bound memory usage while
|
|
17
|
+
* tracking duplicate logs within a time window.
|
|
18
|
+
*/
|
|
19
|
+
export declare class Deduplicator {
|
|
20
|
+
private readonly config;
|
|
21
|
+
private readonly tracked;
|
|
22
|
+
private cleanupTimer;
|
|
23
|
+
constructor(config?: DedupeConfig);
|
|
24
|
+
/**
|
|
25
|
+
* Check if a log should be suppressed
|
|
26
|
+
*
|
|
27
|
+
* @param message - The log message
|
|
28
|
+
* @param level - The log level
|
|
29
|
+
* @param namespace - Optional namespace
|
|
30
|
+
* @returns Whether the log should be suppressed
|
|
31
|
+
*/
|
|
32
|
+
shouldSuppress(message: string, level: LogLevel, namespace?: string): DedupeResult;
|
|
33
|
+
/**
|
|
34
|
+
* Get counts of all currently tracked logs that were suppressed
|
|
35
|
+
*
|
|
36
|
+
* Useful for flushing all pending summaries on shutdown.
|
|
37
|
+
*/
|
|
38
|
+
getPendingSummaries(): Array<{
|
|
39
|
+
key: string;
|
|
40
|
+
count: number;
|
|
41
|
+
level: LogLevel;
|
|
42
|
+
}>;
|
|
43
|
+
/**
|
|
44
|
+
* Clear all tracked entries
|
|
45
|
+
*/
|
|
46
|
+
clear(): void;
|
|
47
|
+
/**
|
|
48
|
+
* Stop the cleanup timer
|
|
49
|
+
*/
|
|
50
|
+
destroy(): void;
|
|
51
|
+
/**
|
|
52
|
+
* Create a deduplication key from message and optional context
|
|
53
|
+
*/
|
|
54
|
+
private createKey;
|
|
55
|
+
/**
|
|
56
|
+
* Track a new log entry
|
|
57
|
+
*/
|
|
58
|
+
private track;
|
|
59
|
+
/**
|
|
60
|
+
* Evict the oldest entry (LRU-style)
|
|
61
|
+
*/
|
|
62
|
+
private evictOldest;
|
|
63
|
+
/**
|
|
64
|
+
* Start periodic cleanup of expired entries
|
|
65
|
+
*
|
|
66
|
+
* Only cleans up entries that have count=1 (no pending summary).
|
|
67
|
+
* Entries with pending summaries are kept until the next log of the same
|
|
68
|
+
* type, which will emit the summary and reset tracking.
|
|
69
|
+
*/
|
|
70
|
+
private startCleanup;
|
|
71
|
+
/**
|
|
72
|
+
* Get statistics about the deduplicator
|
|
73
|
+
*/
|
|
74
|
+
getStats(): {
|
|
75
|
+
tracked: number;
|
|
76
|
+
maxSize: number;
|
|
77
|
+
windowMs: number;
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=dedupe.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dedupe.d.ts","sourceRoot":"","sources":["../../src/utils/dedupe.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAyBtD;;GAEG;AACH,MAAM,WAAW,YAAY;IAC5B,4CAA4C;IAC5C,UAAU,EAAE,OAAO,CAAA;IACnB,mEAAmE;IACnE,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,iDAAiD;IACjD,OAAO,CAAC,EAAE,OAAO,CAAA;CACjB;AAED;;;;;GAKG;AACH,qBAAa,YAAY;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwB;IAC/C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqC;IAC7D,OAAO,CAAC,YAAY,CAA8C;gBAEtD,MAAM,CAAC,EAAE,YAAY;IAajC;;;;;;;OAOG;IACH,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,YAAY;IAkClF;;;;OAIG;IACH,mBAAmB,IAAI,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,QAAQ,CAAA;KAAE,CAAC;IAgB7E;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,OAAO,IAAI,IAAI;IAQf;;OAEG;IACH,OAAO,CAAC,SAAS;IAcjB;;OAEG;IACH,OAAO,CAAC,KAAK;IAab;;OAEG;IACH,OAAO,CAAC,WAAW;IAQnB;;;;;;OAMG;IACH,OAAO,CAAC,YAAY;IAoBpB;;OAEG;IACH,QAAQ,IAAI;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE;CAOlE"}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default dedupe configuration
|
|
3
|
+
*/
|
|
4
|
+
const DEFAULTS = {
|
|
5
|
+
enabled: true,
|
|
6
|
+
windowMs: 1000,
|
|
7
|
+
maxSize: 1000,
|
|
8
|
+
includeLevel: true,
|
|
9
|
+
includeNamespace: true,
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Deduplicator for suppressing repeated identical log messages
|
|
13
|
+
*
|
|
14
|
+
* Uses an LRU-like eviction strategy to bound memory usage while
|
|
15
|
+
* tracking duplicate logs within a time window.
|
|
16
|
+
*/
|
|
17
|
+
export class Deduplicator {
|
|
18
|
+
config;
|
|
19
|
+
tracked = new Map();
|
|
20
|
+
cleanupTimer = null;
|
|
21
|
+
constructor(config) {
|
|
22
|
+
this.config = {
|
|
23
|
+
...DEFAULTS,
|
|
24
|
+
...config,
|
|
25
|
+
enabled: config?.enabled ?? DEFAULTS.enabled,
|
|
26
|
+
};
|
|
27
|
+
// Start cleanup timer
|
|
28
|
+
if (this.config.enabled) {
|
|
29
|
+
this.startCleanup();
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Check if a log should be suppressed
|
|
34
|
+
*
|
|
35
|
+
* @param message - The log message
|
|
36
|
+
* @param level - The log level
|
|
37
|
+
* @param namespace - Optional namespace
|
|
38
|
+
* @returns Whether the log should be suppressed
|
|
39
|
+
*/
|
|
40
|
+
shouldSuppress(message, level, namespace) {
|
|
41
|
+
if (!this.config.enabled) {
|
|
42
|
+
return { suppressed: false };
|
|
43
|
+
}
|
|
44
|
+
const key = this.createKey(message, level, namespace);
|
|
45
|
+
const now = Date.now();
|
|
46
|
+
const existing = this.tracked.get(key);
|
|
47
|
+
if (existing) {
|
|
48
|
+
// Check if still within window
|
|
49
|
+
if (now - existing.firstSeen < this.config.windowMs) {
|
|
50
|
+
existing.count++;
|
|
51
|
+
return { suppressed: true };
|
|
52
|
+
}
|
|
53
|
+
// Window expired - emit summary and reset
|
|
54
|
+
const suppressedCount = existing.count - 1; // Exclude the first one
|
|
55
|
+
this.tracked.delete(key);
|
|
56
|
+
// Start tracking this new occurrence
|
|
57
|
+
this.track(key, now, level);
|
|
58
|
+
if (suppressedCount > 0) {
|
|
59
|
+
return { suppressed: false, suppressedCount, isFlush: true };
|
|
60
|
+
}
|
|
61
|
+
return { suppressed: false };
|
|
62
|
+
}
|
|
63
|
+
// First occurrence - track it
|
|
64
|
+
this.track(key, now, level);
|
|
65
|
+
return { suppressed: false };
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Get counts of all currently tracked logs that were suppressed
|
|
69
|
+
*
|
|
70
|
+
* Useful for flushing all pending summaries on shutdown.
|
|
71
|
+
*/
|
|
72
|
+
getPendingSummaries() {
|
|
73
|
+
const summaries = [];
|
|
74
|
+
for (const [key, entry] of this.tracked) {
|
|
75
|
+
if (entry.count > 1) {
|
|
76
|
+
summaries.push({
|
|
77
|
+
key,
|
|
78
|
+
count: entry.count - 1, // Exclude the first logged one
|
|
79
|
+
level: entry.level,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return summaries;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Clear all tracked entries
|
|
87
|
+
*/
|
|
88
|
+
clear() {
|
|
89
|
+
this.tracked.clear();
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Stop the cleanup timer
|
|
93
|
+
*/
|
|
94
|
+
destroy() {
|
|
95
|
+
if (this.cleanupTimer) {
|
|
96
|
+
clearInterval(this.cleanupTimer);
|
|
97
|
+
this.cleanupTimer = null;
|
|
98
|
+
}
|
|
99
|
+
this.tracked.clear();
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Create a deduplication key from message and optional context
|
|
103
|
+
*/
|
|
104
|
+
createKey(message, level, namespace) {
|
|
105
|
+
const parts = [message];
|
|
106
|
+
if (this.config.includeLevel) {
|
|
107
|
+
parts.unshift(level);
|
|
108
|
+
}
|
|
109
|
+
if (this.config.includeNamespace && namespace) {
|
|
110
|
+
parts.unshift(namespace);
|
|
111
|
+
}
|
|
112
|
+
return parts.join('|');
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Track a new log entry
|
|
116
|
+
*/
|
|
117
|
+
track(key, timestamp, level) {
|
|
118
|
+
// Evict oldest if at capacity
|
|
119
|
+
if (this.tracked.size >= this.config.maxSize) {
|
|
120
|
+
this.evictOldest();
|
|
121
|
+
}
|
|
122
|
+
this.tracked.set(key, {
|
|
123
|
+
firstSeen: timestamp,
|
|
124
|
+
count: 1,
|
|
125
|
+
level,
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Evict the oldest entry (LRU-style)
|
|
130
|
+
*/
|
|
131
|
+
evictOldest() {
|
|
132
|
+
// Map maintains insertion order, so first key is oldest
|
|
133
|
+
const firstKey = this.tracked.keys().next().value;
|
|
134
|
+
if (firstKey !== undefined) {
|
|
135
|
+
this.tracked.delete(firstKey);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Start periodic cleanup of expired entries
|
|
140
|
+
*
|
|
141
|
+
* Only cleans up entries that have count=1 (no pending summary).
|
|
142
|
+
* Entries with pending summaries are kept until the next log of the same
|
|
143
|
+
* type, which will emit the summary and reset tracking.
|
|
144
|
+
*/
|
|
145
|
+
startCleanup() {
|
|
146
|
+
// Clean up every windowMs (but wait 2x windowMs for first run to avoid edge cases)
|
|
147
|
+
this.cleanupTimer = setInterval(() => {
|
|
148
|
+
const now = Date.now();
|
|
149
|
+
const expireTime = now - this.config.windowMs;
|
|
150
|
+
for (const [key, entry] of this.tracked) {
|
|
151
|
+
// Only clean up if expired AND no pending summary
|
|
152
|
+
if (entry.firstSeen < expireTime && entry.count === 1) {
|
|
153
|
+
this.tracked.delete(key);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}, this.config.windowMs * 2); // Run less frequently to reduce timing issues
|
|
157
|
+
// Unref so it doesn't keep the process alive
|
|
158
|
+
if (typeof this.cleanupTimer === 'object' && 'unref' in this.cleanupTimer) {
|
|
159
|
+
this.cleanupTimer.unref();
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Get statistics about the deduplicator
|
|
164
|
+
*/
|
|
165
|
+
getStats() {
|
|
166
|
+
return {
|
|
167
|
+
tracked: this.tracked.size,
|
|
168
|
+
maxSize: this.config.maxSize,
|
|
169
|
+
windowMs: this.config.windowMs,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=dedupe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dedupe.js","sourceRoot":"","sources":["../../src/utils/dedupe.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/sanitize.d.ts
CHANGED
|
@@ -41,9 +41,27 @@ export declare class Sanitizer {
|
|
|
41
41
|
*/
|
|
42
42
|
addPattern(pattern: SanitizePattern): void;
|
|
43
43
|
/**
|
|
44
|
-
* Check if a field name should be sanitized
|
|
44
|
+
* Check if a field name or path should be sanitized
|
|
45
|
+
*
|
|
46
|
+
* Supports:
|
|
47
|
+
* - Simple field names: 'password' matches any field named 'password'
|
|
48
|
+
* - Dot notation paths: 'user.password' matches password under user
|
|
49
|
+
* - Glob patterns: '**.password' matches password at any depth
|
|
50
|
+
* - Wildcard: 'config.*' matches any direct child of config
|
|
45
51
|
*/
|
|
46
52
|
private isSensitiveField;
|
|
53
|
+
/**
|
|
54
|
+
* Match a field path against a FieldMatcher with glob support
|
|
55
|
+
*/
|
|
56
|
+
private matchFieldPath;
|
|
57
|
+
/**
|
|
58
|
+
* Match a path against a glob pattern
|
|
59
|
+
*
|
|
60
|
+
* Supports:
|
|
61
|
+
* - ** matches any number of path segments (including zero)
|
|
62
|
+
* - * matches exactly one path segment
|
|
63
|
+
*/
|
|
64
|
+
private matchGlobPattern;
|
|
47
65
|
/**
|
|
48
66
|
* Match a field against a FieldMatcher
|
|
49
67
|
*/
|
|
@@ -54,6 +72,10 @@ export declare class Sanitizer {
|
|
|
54
72
|
private sanitizeString;
|
|
55
73
|
/**
|
|
56
74
|
* Recursively sanitize a value
|
|
75
|
+
*
|
|
76
|
+
* @param value - The value to sanitize
|
|
77
|
+
* @param depth - Current recursion depth
|
|
78
|
+
* @param path - Dot-notation path to current position (e.g., 'user.credentials')
|
|
57
79
|
*/
|
|
58
80
|
private sanitizeValue;
|
|
59
81
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../../src/utils/sanitize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAa7F;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,SAAS;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA0B;IACjD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAa;IACtC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;gBAElC,MAAM,GAAE,cAAmB;IAsBvC;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,cAAc,GAAG,SAAS;IAIpD;;OAEG;IACH,MAAM,CAAC,uBAAuB,CAC7B,MAAM,EAAE,cAAc,EACtB,SAAS,EAAE,OAAO,CAAC,cAAc,CAAC,GAChC,SAAS;IAIZ;;OAEG;IACH,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC;IAKxB;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAS5C;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI;IAI1C;;OAEG;IACH,OAAO,CAAC,gBAAgB;
|
|
1
|
+
{"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../../src/utils/sanitize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAa7F;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,SAAS;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA0B;IACjD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAa;IACtC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;gBAElC,MAAM,GAAE,cAAmB;IAsBvC;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,cAAc,GAAG,SAAS;IAIpD;;OAEG;IACH,MAAM,CAAC,uBAAuB,CAC7B,MAAM,EAAE,cAAc,EACtB,SAAS,EAAE,OAAO,CAAC,cAAc,CAAC,GAChC,SAAS;IAIZ;;OAEG;IACH,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC;IAKxB;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAS5C;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI;IAI1C;;;;;;;;OAQG;IACH,OAAO,CAAC,gBAAgB;IAoBxB;;OAEG;IACH,OAAO,CAAC,cAAc;IA0BtB;;;;;;OAMG;IACH,OAAO,CAAC,gBAAgB;IAkDxB;;OAEG;IACH,OAAO,CAAC,UAAU;IAoBlB;;OAEG;IACH,OAAO,CAAC,cAAc;IAetB;;;;;;OAMG;IACH,OAAO,CAAC,aAAa;IAoCrB;;OAEG;IACH,SAAS,IAAI,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;CAG/C;AAKD;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,gBAAgB,GAAE,MAAM,EAAO,EAAE,KAAK,SAAI,GAAG,OAAO,CAa5F;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,gBAAgB,GAAE,MAAM,EAAO,GAAG,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAS5F;AAGD,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA"}
|
package/dist/utils/sanitize.js
CHANGED
|
@@ -65,7 +65,7 @@ export class Sanitizer {
|
|
|
65
65
|
sanitize(value) {
|
|
66
66
|
if (!this.config.enabled)
|
|
67
67
|
return value;
|
|
68
|
-
return this.sanitizeValue(value, 0);
|
|
68
|
+
return this.sanitizeValue(value, 0, '');
|
|
69
69
|
}
|
|
70
70
|
/**
|
|
71
71
|
* Add a field to sanitize
|
|
@@ -86,20 +86,120 @@ export class Sanitizer {
|
|
|
86
86
|
this.config.patterns.push(pattern);
|
|
87
87
|
}
|
|
88
88
|
/**
|
|
89
|
-
* Check if a field name should be sanitized
|
|
89
|
+
* Check if a field name or path should be sanitized
|
|
90
|
+
*
|
|
91
|
+
* Supports:
|
|
92
|
+
* - Simple field names: 'password' matches any field named 'password'
|
|
93
|
+
* - Dot notation paths: 'user.password' matches password under user
|
|
94
|
+
* - Glob patterns: '**.password' matches password at any depth
|
|
95
|
+
* - Wildcard: 'config.*' matches any direct child of config
|
|
90
96
|
*/
|
|
91
|
-
isSensitiveField(fieldName) {
|
|
97
|
+
isSensitiveField(fieldName, path) {
|
|
92
98
|
const lower = fieldName.toLowerCase();
|
|
93
|
-
|
|
99
|
+
const fullPath = path ? `${path}.${fieldName}` : fieldName;
|
|
100
|
+
const fullPathLower = fullPath.toLowerCase();
|
|
101
|
+
// Check simple field set (matches by key name or full path)
|
|
94
102
|
if (this.fieldSet.has(lower))
|
|
95
103
|
return true;
|
|
104
|
+
if (this.fieldSet.has(fullPathLower))
|
|
105
|
+
return true;
|
|
96
106
|
// Check field matchers
|
|
97
107
|
for (const matcher of this.fieldMatchers) {
|
|
108
|
+
// Check against key name
|
|
98
109
|
if (this.matchField(lower, matcher))
|
|
99
110
|
return true;
|
|
111
|
+
// Check against full path
|
|
112
|
+
if (this.matchFieldPath(fullPathLower, matcher))
|
|
113
|
+
return true;
|
|
100
114
|
}
|
|
101
115
|
return false;
|
|
102
116
|
}
|
|
117
|
+
/**
|
|
118
|
+
* Match a field path against a FieldMatcher with glob support
|
|
119
|
+
*/
|
|
120
|
+
matchFieldPath(path, matcher) {
|
|
121
|
+
const value = matcher.caseSensitive ? matcher.value : matcher.value.toLowerCase();
|
|
122
|
+
const targetPath = matcher.caseSensitive ? path : path.toLowerCase();
|
|
123
|
+
// Handle glob patterns
|
|
124
|
+
if (value.includes('**') || value.includes('*')) {
|
|
125
|
+
return this.matchGlobPattern(targetPath, value);
|
|
126
|
+
}
|
|
127
|
+
// For non-glob patterns, check if the pattern matches the full path
|
|
128
|
+
switch (matcher.type) {
|
|
129
|
+
case 'exact':
|
|
130
|
+
return targetPath === value;
|
|
131
|
+
case 'prefix':
|
|
132
|
+
return targetPath.startsWith(value);
|
|
133
|
+
case 'suffix':
|
|
134
|
+
return targetPath.endsWith(value);
|
|
135
|
+
case 'contains':
|
|
136
|
+
return targetPath.includes(value);
|
|
137
|
+
case 'regex':
|
|
138
|
+
return new RegExp(matcher.value, matcher.caseSensitive ? '' : 'i').test(path);
|
|
139
|
+
default:
|
|
140
|
+
return false;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Match a path against a glob pattern
|
|
145
|
+
*
|
|
146
|
+
* Supports:
|
|
147
|
+
* - ** matches any number of path segments (including zero)
|
|
148
|
+
* - * matches exactly one path segment
|
|
149
|
+
*/
|
|
150
|
+
matchGlobPattern(path, pattern) {
|
|
151
|
+
const segments = pattern.split('.');
|
|
152
|
+
const regexParts = [];
|
|
153
|
+
let addDotPrefix = false; // Track if next segment needs a dot prefix
|
|
154
|
+
for (let i = 0; i < segments.length; i++) {
|
|
155
|
+
const segment = segments[i]; // Always defined within loop bounds
|
|
156
|
+
const isLast = i === segments.length - 1;
|
|
157
|
+
if (segment === '**') {
|
|
158
|
+
// ** matches any number of segments (including zero)
|
|
159
|
+
if (i === 0 && isLast) {
|
|
160
|
+
// Just "**" matches everything
|
|
161
|
+
regexParts.push('.*');
|
|
162
|
+
}
|
|
163
|
+
else if (i === 0) {
|
|
164
|
+
// "**.foo" - optional prefix with dot included
|
|
165
|
+
regexParts.push('(?:.*\\.)?');
|
|
166
|
+
// Don't add dot prefix to next segment - it's included in (?:.*\.)?
|
|
167
|
+
}
|
|
168
|
+
else if (isLast) {
|
|
169
|
+
// "foo.**" - match foo followed by anything
|
|
170
|
+
regexParts.push('(?:\\..*)?');
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
// "foo.**.bar" - match zero or more segments in between
|
|
174
|
+
regexParts.push('(?:\\.[^.]+)*');
|
|
175
|
+
addDotPrefix = true;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
else if (segment === '*') {
|
|
179
|
+
// * matches exactly one segment
|
|
180
|
+
if (addDotPrefix) {
|
|
181
|
+
regexParts.push('\\.[^.]+');
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
regexParts.push('[^.]+');
|
|
185
|
+
}
|
|
186
|
+
addDotPrefix = true;
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
// Literal segment
|
|
190
|
+
const escaped = segment.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
191
|
+
if (addDotPrefix) {
|
|
192
|
+
regexParts.push(`\\.${escaped}`);
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
regexParts.push(escaped);
|
|
196
|
+
}
|
|
197
|
+
addDotPrefix = true;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
const regexPattern = regexParts.join('');
|
|
201
|
+
return new RegExp(`^${regexPattern}$`, 'i').test(path);
|
|
202
|
+
}
|
|
103
203
|
/**
|
|
104
204
|
* Match a field against a FieldMatcher
|
|
105
205
|
*/
|
|
@@ -139,8 +239,12 @@ export class Sanitizer {
|
|
|
139
239
|
}
|
|
140
240
|
/**
|
|
141
241
|
* Recursively sanitize a value
|
|
242
|
+
*
|
|
243
|
+
* @param value - The value to sanitize
|
|
244
|
+
* @param depth - Current recursion depth
|
|
245
|
+
* @param path - Dot-notation path to current position (e.g., 'user.credentials')
|
|
142
246
|
*/
|
|
143
|
-
sanitizeValue(value, depth) {
|
|
247
|
+
sanitizeValue(value, depth, path) {
|
|
144
248
|
if (depth > this.config.depth)
|
|
145
249
|
return value;
|
|
146
250
|
// Handle null/undefined
|
|
@@ -152,17 +256,18 @@ export class Sanitizer {
|
|
|
152
256
|
}
|
|
153
257
|
// Handle arrays
|
|
154
258
|
if (Array.isArray(value)) {
|
|
155
|
-
return value.map((item) => this.sanitizeValue(item, depth + 1));
|
|
259
|
+
return value.map((item, index) => this.sanitizeValue(item, depth + 1, path ? `${path}[${index}]` : `[${index}]`));
|
|
156
260
|
}
|
|
157
261
|
// Handle objects
|
|
158
262
|
if (typeof value === 'object') {
|
|
159
263
|
const result = {};
|
|
160
264
|
for (const [key, val] of Object.entries(value)) {
|
|
161
|
-
if (this.isSensitiveField(key)) {
|
|
265
|
+
if (this.isSensitiveField(key, path)) {
|
|
162
266
|
result[key] = this.config.replacement;
|
|
163
267
|
}
|
|
164
268
|
else {
|
|
165
|
-
|
|
269
|
+
const newPath = path ? `${path}.${key}` : key;
|
|
270
|
+
result[key] = this.sanitizeValue(val, depth + 1, newPath);
|
|
166
271
|
}
|
|
167
272
|
}
|
|
168
273
|
return result;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sanitize.js","sourceRoot":"","sources":["../../src/utils/sanitize.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAE7E;;GAEG;AACH,MAAM,mBAAmB,GAAG,YAAY,CAAA;AAExC;;GAEG;AACH,MAAM,iBAAiB,GAAG,EAAE,CAAA;AAE5B;;;;;;;;;;;;;;;GAeG;AACH,MAAM,OAAO,SAAS;IACJ,MAAM,CAA0B;IAChC,QAAQ,CAAa;IACrB,aAAa,CAAgB;IAE9C,YAAY,SAAyB,EAAE;QACtC,IAAI,CAAC,MAAM,GAAG;YACb,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,IAAI;YAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,EAAE;YAC3B,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,EAAE;YAC/B,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,mBAAmB;YACtD,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,iBAAiB;SACxC,CAAA;QAED,yDAAyD;QACzD,IAAI,CAAC,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAA;QACjC,IAAI,CAAC,aAAa,GAAG,EAAE,CAAA;QAEvB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACxC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC/B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAA;YACvC,CAAC;iBAAM,CAAC;gBACP,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAC/B,CAAC;QACF,CAAC;IACF,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,MAAsB;QACvC,OAAO,IAAI,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAA;IACxC,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,uBAAuB,CAC7B,MAAsB,EACtB,SAAkC;QAElC,OAAO,IAAI,SAAS,CAAC,YAAY,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC,CAAC,CAAA;IACjE,CAAC;IAED;;OAEG;IACH,QAAQ,CAAI,KAAQ;QACnB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,OAAO,KAAK,CAAA;QACtC,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC,CAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"sanitize.js","sourceRoot":"","sources":["../../src/utils/sanitize.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAE7E;;GAEG;AACH,MAAM,mBAAmB,GAAG,YAAY,CAAA;AAExC;;GAEG;AACH,MAAM,iBAAiB,GAAG,EAAE,CAAA;AAE5B;;;;;;;;;;;;;;;GAeG;AACH,MAAM,OAAO,SAAS;IACJ,MAAM,CAA0B;IAChC,QAAQ,CAAa;IACrB,aAAa,CAAgB;IAE9C,YAAY,SAAyB,EAAE;QACtC,IAAI,CAAC,MAAM,GAAG;YACb,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,IAAI;YAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,EAAE;YAC3B,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,EAAE;YAC/B,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,mBAAmB;YACtD,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,iBAAiB;SACxC,CAAA;QAED,yDAAyD;QACzD,IAAI,CAAC,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAA;QACjC,IAAI,CAAC,aAAa,GAAG,EAAE,CAAA;QAEvB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACxC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC/B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAA;YACvC,CAAC;iBAAM,CAAC;gBACP,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAC/B,CAAC;QACF,CAAC;IACF,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,MAAsB;QACvC,OAAO,IAAI,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAA;IACxC,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,uBAAuB,CAC7B,MAAsB,EACtB,SAAkC;QAElC,OAAO,IAAI,SAAS,CAAC,YAAY,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC,CAAC,CAAA;IACjE,CAAC;IAED;;OAEG;IACH,QAAQ,CAAI,KAAQ;QACnB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,OAAO,KAAK,CAAA;QACtC,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAM,CAAA;IAC7C,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,KAA4B;QACpC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC9B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC/B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAA;QACvC,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC/B,CAAC;IACF,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,OAAwB;QAClC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACnC,CAAC;IAED;;;;;;;;OAQG;IACK,gBAAgB,CAAC,SAAiB,EAAE,IAAY;QACvD,MAAM,KAAK,GAAG,SAAS,CAAC,WAAW,EAAE,CAAA;QACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC,SAAS,CAAA;QAC1D,MAAM,aAAa,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAA;QAE5C,4DAA4D;QAC5D,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAA;QACzC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC;YAAE,OAAO,IAAI,CAAA;QAEjD,uBAAuB;QACvB,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YAC1C,yBAAyB;YACzB,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC;gBAAE,OAAO,IAAI,CAAA;YAChD,0BAA0B;YAC1B,IAAI,IAAI,CAAC,cAAc,CAAC,aAAa,EAAE,OAAO,CAAC;gBAAE,OAAO,IAAI,CAAA;QAC7D,CAAC;QAED,OAAO,KAAK,CAAA;IACb,CAAC;IAED;;OAEG;IACK,cAAc,CAAC,IAAY,EAAE,OAAqB;QACzD,MAAM,KAAK,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,CAAA;QACjF,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAA;QAEpE,uBAAuB;QACvB,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACjD,OAAO,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE,KAAK,CAAC,CAAA;QAChD,CAAC;QAED,oEAAoE;QACpE,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;YACtB,KAAK,OAAO;gBACX,OAAO,UAAU,KAAK,KAAK,CAAA;YAC5B,KAAK,QAAQ;gBACZ,OAAO,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;YACpC,KAAK,QAAQ;gBACZ,OAAO,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;YAClC,KAAK,UAAU;gBACd,OAAO,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;YAClC,KAAK,OAAO;gBACX,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAC9E;gBACC,OAAO,KAAK,CAAA;QACd,CAAC;IACF,CAAC;IAED;;;;;;OAMG;IACK,gBAAgB,CAAC,IAAY,EAAE,OAAe;QACrD,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACnC,MAAM,UAAU,GAAa,EAAE,CAAA;QAC/B,IAAI,YAAY,GAAG,KAAK,CAAA,CAAC,2CAA2C;QAEpE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1C,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAW,CAAA,CAAC,oCAAoC;YAC1E,MAAM,MAAM,GAAG,CAAC,KAAK,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAA;YAExC,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;gBACtB,qDAAqD;gBACrD,IAAI,CAAC,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;oBACvB,+BAA+B;oBAC/B,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBACtB,CAAC;qBAAM,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;oBACpB,+CAA+C;oBAC/C,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;oBAC7B,oEAAoE;gBACrE,CAAC;qBAAM,IAAI,MAAM,EAAE,CAAC;oBACnB,4CAA4C;oBAC5C,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;gBAC9B,CAAC;qBAAM,CAAC;oBACP,wDAAwD;oBACxD,UAAU,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;oBAChC,YAAY,GAAG,IAAI,CAAA;gBACpB,CAAC;YACF,CAAC;iBAAM,IAAI,OAAO,KAAK,GAAG,EAAE,CAAC;gBAC5B,gCAAgC;gBAChC,IAAI,YAAY,EAAE,CAAC;oBAClB,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;gBAC5B,CAAC;qBAAM,CAAC;oBACP,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;gBACzB,CAAC;gBACD,YAAY,GAAG,IAAI,CAAA;YACpB,CAAC;iBAAM,CAAC;gBACP,kBAAkB;gBAClB,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAA;gBAC9D,IAAI,YAAY,EAAE,CAAC;oBAClB,UAAU,CAAC,IAAI,CAAC,MAAM,OAAO,EAAE,CAAC,CAAA;gBACjC,CAAC;qBAAM,CAAC;oBACP,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;gBACzB,CAAC;gBACD,YAAY,GAAG,IAAI,CAAA;YACpB,CAAC;QACF,CAAC;QAED,MAAM,YAAY,GAAG,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACxC,OAAO,IAAI,MAAM,CAAC,IAAI,YAAY,GAAG,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACvD,CAAC;IAED;;OAEG;IACK,UAAU,CAAC,SAAiB,EAAE,OAAqB;QAC1D,MAAM,KAAK,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,CAAA;QACjF,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,EAAE,CAAA;QAExE,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;YACtB,KAAK,OAAO;gBACX,OAAO,IAAI,KAAK,KAAK,CAAA;YACtB,KAAK,QAAQ;gBACZ,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;YAC9B,KAAK,QAAQ;gBACZ,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;YAC5B,KAAK,UAAU;gBACd,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;YAC5B,KAAK,OAAO;gBACX,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;YACnF;gBACC,OAAO,KAAK,CAAA;QACd,CAAC;IACF,CAAC;IAED;;OAEG;IACK,cAAc,CAAC,KAAa;QACnC,IAAI,MAAM,GAAG,KAAK,CAAA;QAElB,KAAK,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YAC7D,MAAM,GAAG,GAAG,WAAW,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,CAAA;YAClD,IAAI,OAAO,GAAG,KAAK,UAAU,EAAE,CAAC;gBAC/B,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;YACtC,CAAC;iBAAM,CAAC;gBACP,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;YACtC,CAAC;QACF,CAAC;QAED,OAAO,MAAM,CAAA;IACd,CAAC;IAED;;;;;;OAMG;IACK,aAAa,CAAC,KAAc,EAAE,KAAa,EAAE,IAAY;QAChE,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK;YAAE,OAAO,KAAK,CAAA;QAE3C,wBAAwB;QACxB,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,KAAK,CAAA;QAEvD,iBAAiB;QACjB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC/B,OAAO,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAA;QAClC,CAAC;QAED,gBAAgB;QAChB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAChC,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,CAC9E,CAAA;QACF,CAAC;QAED,iBAAiB;QACjB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC/B,MAAM,MAAM,GAA4B,EAAE,CAAA;YAC1C,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBAChD,IAAI,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC;oBACtC,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAA;gBACtC,CAAC;qBAAM,CAAC;oBACP,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAA;oBAC7C,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,KAAK,GAAG,CAAC,EAAE,OAAO,CAAC,CAAA;gBAC1D,CAAC;YACF,CAAC;YACD,OAAO,MAAM,CAAA;QACd,CAAC;QAED,0BAA0B;QAC1B,OAAO,KAAK,CAAA;IACb,CAAC;IAED;;OAEG;IACH,SAAS;QACR,OAAO,IAAI,CAAC,MAAM,CAAA;IACnB,CAAC;CACD;AAED,oDAAoD;AACpD,MAAM,gBAAgB,GAAG,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,CAAA;AAExD;;;GAGG;AACH,MAAM,UAAU,QAAQ,CAAC,KAAc,EAAE,mBAA6B,EAAE,EAAE,KAAK,GAAG,CAAC;IAClF,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjC,iDAAiD;QACjD,oFAAoF;QACpF,MAAM,SAAS,GAAG,SAAS,CAAC,uBAAuB,CAAC,SAAS,EAAE;YAC9D,MAAM,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBACxC,IAAI,EAAE,UAAmB;gBACzB,KAAK,EAAE,KAAK;aACZ,CAAC,CAAC;SACH,CAAC,CAAA;QACF,OAAO,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IACjC,CAAC;IACD,OAAO,gBAAgB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;AACxC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,mBAA6B,EAAE;IAC9D,MAAM,SAAS,GAAG,SAAS,CAAC,uBAAuB,CAAC,SAAS,EAAE;QAC9D,qDAAqD;QACrD,MAAM,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACxC,IAAI,EAAE,UAAmB;YACzB,KAAK,EAAE,KAAK;SACZ,CAAC,CAAC;KACH,CAAC,CAAA;IACF,OAAO,CAAC,KAAc,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;AACrD,CAAC;AAED,iDAAiD;AACjD,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA"}
|
package/dist/version.d.ts
CHANGED
package/dist/version.js
CHANGED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { LogMetadata } from '../types';
|
|
2
|
+
import type { WideEvent, WideEventBuilder, WideEventConfig, WideEventContext, WideEventEndOptions, WideEventFields } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Implementation of WideEventBuilder.
|
|
5
|
+
*
|
|
6
|
+
* Accumulates context throughout a request lifecycle and
|
|
7
|
+
* produces a single comprehensive event at the end.
|
|
8
|
+
*/
|
|
9
|
+
export declare class WideEventBuilderImpl implements WideEventBuilder {
|
|
10
|
+
private readonly _type;
|
|
11
|
+
private readonly _startTime;
|
|
12
|
+
private readonly _startedAt;
|
|
13
|
+
private _context;
|
|
14
|
+
private _fields;
|
|
15
|
+
private _ended;
|
|
16
|
+
constructor(config: WideEventConfig);
|
|
17
|
+
get type(): string;
|
|
18
|
+
get startTime(): number;
|
|
19
|
+
get ended(): boolean;
|
|
20
|
+
set(category: string, key: string, value: unknown): this;
|
|
21
|
+
get(category: string, key: string): unknown;
|
|
22
|
+
merge(category: string, fields: Record<string, unknown>): this;
|
|
23
|
+
mergeAll(fields: WideEventFields): this;
|
|
24
|
+
setContext(context: Partial<WideEventContext>): this;
|
|
25
|
+
getContext(): WideEventContext;
|
|
26
|
+
getFields(): Readonly<WideEventFields>;
|
|
27
|
+
end(options?: WideEventEndOptions): WideEvent;
|
|
28
|
+
toMetadata(): LogMetadata;
|
|
29
|
+
private _assertNotEnded;
|
|
30
|
+
private _deepClone;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Create a new wide event builder.
|
|
34
|
+
*
|
|
35
|
+
* @param config - Event configuration (type is required)
|
|
36
|
+
* @returns A new WideEventBuilder instance
|
|
37
|
+
*
|
|
38
|
+
* @example
|
|
39
|
+
* ```typescript
|
|
40
|
+
* const event = createWideEvent({ type: 'http.request' });
|
|
41
|
+
*
|
|
42
|
+
* event.set('http', 'method', 'POST');
|
|
43
|
+
* event.set('http', 'path', '/api/checkout');
|
|
44
|
+
* event.set('user', 'id', userId);
|
|
45
|
+
*
|
|
46
|
+
* const wideEvent = event.end({ status: 'success' });
|
|
47
|
+
* logger.info('Request completed', wideEvent);
|
|
48
|
+
* ```
|
|
49
|
+
*/
|
|
50
|
+
export declare function createWideEvent(config: WideEventConfig): WideEventBuilder;
|
|
51
|
+
//# sourceMappingURL=builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/wide-events/builder.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAmB,MAAM,UAAU,CAAA;AAE5D,OAAO,KAAK,EACX,SAAS,EACT,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,EAEf,MAAM,SAAS,CAAA;AAYhB;;;;;GAKG;AACH,qBAAa,oBAAqB,YAAW,gBAAgB;IAC5D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAC9B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAQ;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAM;IACjC,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,MAAM,CAAQ;gBAEV,MAAM,EAAE,eAAe;IAQnC,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,IAAI,KAAK,IAAI,OAAO,CAEnB;IAED,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IASxD,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO;IAI3C,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAS9D,QAAQ,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI;IAQvC,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,IAAI;IAMpD,UAAU,IAAI,gBAAgB;IAI9B,SAAS,IAAI,QAAQ,CAAC,eAAe,CAAC;IAItC,GAAG,CAAC,OAAO,GAAE,mBAAwB,GAAG,SAAS;IAgDjD,UAAU,IAAI,WAAW;IAwBzB,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,UAAU;CAWlB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe,GAAG,gBAAgB,CAEzE"}
|