@decaf-ts/logging 0.3.12 → 0.3.14
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/dist/logging.cjs +542 -99
- package/dist/logging.esm.cjs +539 -100
- package/lib/LoggedClass.cjs +9 -12
- package/lib/LoggedClass.d.ts +6 -10
- package/lib/constants.cjs +40 -8
- package/lib/constants.d.ts +35 -7
- package/lib/decorators.cjs +114 -50
- package/lib/decorators.d.ts +58 -43
- package/lib/environment.cjs +73 -22
- package/lib/environment.d.ts +46 -29
- package/lib/esm/LoggedClass.d.ts +6 -10
- package/lib/esm/LoggedClass.js +9 -12
- package/lib/esm/constants.d.ts +35 -7
- package/lib/esm/constants.js +40 -8
- package/lib/esm/decorators.d.ts +58 -43
- package/lib/esm/decorators.js +113 -50
- package/lib/esm/environment.d.ts +46 -29
- package/lib/esm/environment.js +73 -22
- package/lib/esm/filters/LogFilter.d.ts +37 -0
- package/lib/esm/filters/LogFilter.js +30 -1
- package/lib/esm/filters/PatternFilter.d.ts +46 -0
- package/lib/esm/filters/PatternFilter.js +41 -1
- package/lib/esm/index.d.ts +7 -10
- package/lib/esm/index.js +8 -11
- package/lib/esm/logging.d.ts +14 -0
- package/lib/esm/logging.js +22 -1
- package/lib/esm/time.d.ts +149 -0
- package/lib/esm/time.js +212 -0
- package/lib/esm/types.d.ts +89 -51
- package/lib/esm/types.js +1 -1
- package/lib/filters/LogFilter.cjs +30 -1
- package/lib/filters/LogFilter.d.ts +37 -0
- package/lib/filters/PatternFilter.cjs +41 -1
- package/lib/filters/PatternFilter.d.ts +46 -0
- package/lib/index.cjs +8 -11
- package/lib/index.d.ts +7 -10
- package/lib/logging.cjs +22 -1
- package/lib/logging.d.ts +14 -0
- package/lib/time.cjs +217 -0
- package/lib/time.d.ts +149 -0
- package/lib/types.cjs +1 -1
- package/lib/types.d.ts +89 -51
- package/package.json +2 -2
package/lib/esm/types.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { styles } from "styled-string-builder";
|
|
2
2
|
import { LoggingMode, LogLevel } from "./constants";
|
|
3
3
|
/**
|
|
4
|
-
* @description
|
|
5
|
-
* @summary Represents either a string or an object
|
|
4
|
+
* @description String-compatible value accepted by the logging APIs.
|
|
5
|
+
* @summary Represents either a literal string or an object exposing a `toString()` method, allowing lazy stringification of complex payloads.
|
|
6
6
|
* @typedef {(string|Object)} StringLike
|
|
7
7
|
* @memberOf module:Logging
|
|
8
8
|
*/
|
|
@@ -10,37 +10,51 @@ export type StringLike = string | {
|
|
|
10
10
|
toString: () => string;
|
|
11
11
|
};
|
|
12
12
|
/**
|
|
13
|
-
* @description
|
|
14
|
-
* @summary
|
|
15
|
-
*
|
|
16
|
-
* @typedef {Function} AnyFunction
|
|
13
|
+
* @description Generic function signature for loosely typed callbacks.
|
|
14
|
+
* @summary Covers variadic functions whose arguments and return types are not constrained, enabling the logging layer to accept any callable.
|
|
15
|
+
* @typedef {function(any[]): any} AnyFunction
|
|
17
16
|
* @memberOf module:Logging
|
|
18
17
|
*/
|
|
19
18
|
export type AnyFunction = (...args: any[]) => any;
|
|
20
19
|
/**
|
|
21
|
-
* @description
|
|
22
|
-
* @summary Describes a
|
|
23
|
-
* passing class references around (e.g., for context or dependency injection).
|
|
20
|
+
* @description Constructable class type.
|
|
21
|
+
* @summary Describes a constructor that produces instances of type `T`, allowing APIs to accept class references for context-aware logging.
|
|
24
22
|
* @template T
|
|
25
|
-
* @typedef {
|
|
23
|
+
* @typedef {any} Class
|
|
26
24
|
* @memberOf module:Logging
|
|
27
25
|
*/
|
|
28
26
|
export type Class<T> = {
|
|
29
27
|
new (...args: any[]): T;
|
|
30
28
|
};
|
|
31
29
|
/**
|
|
32
|
-
* @description
|
|
33
|
-
* @summary
|
|
30
|
+
* @description Context descriptor accepted when requesting a logger instance.
|
|
31
|
+
* @summary Allows the logging system to resolve context names from strings, constructors, or functions.
|
|
34
32
|
* @typedef {(string|Function|Object)} LoggingContext
|
|
35
33
|
* @memberOf module:Logging
|
|
36
34
|
*/
|
|
37
35
|
export type LoggingContext = string | Class<any> | AnyFunction;
|
|
36
|
+
/**
|
|
37
|
+
* @description Interface for factories that create contextual clones of the receiver.
|
|
38
|
+
* @summary Declares a `for` method that returns another instance of `THIS` using the provided arguments, enabling chained logger customization.
|
|
39
|
+
* @template THIS
|
|
40
|
+
* @template ARGS
|
|
41
|
+
* @interface Impersonatable
|
|
42
|
+
* @memberOf module:Logging
|
|
43
|
+
*/
|
|
38
44
|
export interface Impersonatable<THIS, ARGS extends any[] = any[]> {
|
|
45
|
+
/**
|
|
46
|
+
* @description Produce a copy of the current instance with altered context.
|
|
47
|
+
* @summary Called by logging utilities to derive child objects with supplemental configuration and context metadata.
|
|
48
|
+
* @template THIS
|
|
49
|
+
* @template ARGS
|
|
50
|
+
* @param {ARGS} args - Arguments forwarded to the impersonation strategy.
|
|
51
|
+
* @return {THIS} Derived instance using the provided arguments.
|
|
52
|
+
*/
|
|
39
53
|
for(...args: ARGS): THIS;
|
|
40
54
|
}
|
|
41
55
|
/**
|
|
42
|
-
* @description Interface for
|
|
43
|
-
* @summary
|
|
56
|
+
* @description Interface for loggers that support multiple verbosity levels.
|
|
57
|
+
* @summary Declares severity-specific log methods, configuration overrides, and factory helpers used throughout the logging toolkit.
|
|
44
58
|
* @interface Logger
|
|
45
59
|
* @memberOf module:Logging
|
|
46
60
|
*/
|
|
@@ -51,52 +65,84 @@ export interface Logger extends Impersonatable<Logger, [
|
|
|
51
65
|
Partial<LoggingConfig>,
|
|
52
66
|
...any[]
|
|
53
67
|
]> {
|
|
68
|
+
/**
|
|
69
|
+
* @description Logs a benchmark message.
|
|
70
|
+
* @summary Emits high-frequency performance metrics at the `benchmark` log level.
|
|
71
|
+
* @param {StringLike} msg - Message or payload to emit.
|
|
72
|
+
* @return {void}
|
|
73
|
+
*/
|
|
74
|
+
benchmark(msg: StringLike): void;
|
|
54
75
|
/**
|
|
55
76
|
* @description Logs a `way too verbose` or a silly message.
|
|
56
|
-
* @
|
|
77
|
+
* @summary Emits playful or extremely verbose details at the `silly` log level.
|
|
78
|
+
* @param {StringLike} msg - Message or payload to emit.
|
|
79
|
+
* @return {void}
|
|
57
80
|
*/
|
|
58
81
|
silly(msg: StringLike): void;
|
|
59
82
|
/**
|
|
60
83
|
* @description Logs a verbose message.
|
|
61
|
-
* @
|
|
62
|
-
* @param {
|
|
84
|
+
* @summary Writes diagnostic output governed by the configured verbosity threshold.
|
|
85
|
+
* @param {StringLike} msg - Message or payload to emit.
|
|
86
|
+
* @param {number} [verbosity] - Verbosity level required for the message to pass through.
|
|
87
|
+
* @return {void}
|
|
63
88
|
*/
|
|
64
89
|
verbose(msg: StringLike, verbosity?: number): void;
|
|
65
90
|
/**
|
|
66
91
|
* @description Logs an info message.
|
|
67
|
-
* @
|
|
92
|
+
* @summary Emits general informational events that describe application progress.
|
|
93
|
+
* @param {StringLike} msg - Message or payload to emit.
|
|
94
|
+
* @return {void}
|
|
68
95
|
*/
|
|
69
96
|
info(msg: StringLike): void;
|
|
70
97
|
/**
|
|
71
98
|
* @description Logs an error message.
|
|
72
|
-
* @
|
|
73
|
-
* @param
|
|
99
|
+
* @summary Records errors and exceptions, including optional stack traces.
|
|
100
|
+
* @param {StringLike|Error} msg - Message or {@link Error} instance to log.
|
|
101
|
+
* @param {Error} [e] - Optional secondary error or cause.
|
|
102
|
+
* @return {void}
|
|
74
103
|
*/
|
|
75
104
|
error(msg: StringLike | Error, e?: Error): void;
|
|
76
105
|
/**
|
|
77
106
|
* @description Logs a debug message.
|
|
78
|
-
* @
|
|
107
|
+
* @summary Emits fine-grained diagnostic details useful during development and troubleshooting.
|
|
108
|
+
* @param {StringLike} msg - Message or payload to emit.
|
|
109
|
+
* @return {void}
|
|
79
110
|
*/
|
|
80
111
|
debug(msg: StringLike): void;
|
|
81
112
|
/**
|
|
82
|
-
* @description Creates a new logger for a specific method or context
|
|
83
|
-
* @summary
|
|
84
|
-
* @param {
|
|
85
|
-
* @param {Partial<LoggingConfig>} [config] - Optional configuration for the
|
|
86
|
-
* @param args
|
|
87
|
-
* @return {Logger}
|
|
113
|
+
* @description Creates a new logger for a specific method or context.
|
|
114
|
+
* @summary Produces a scoped logger that formats entries using the derived context and overrides supplied configuration.
|
|
115
|
+
* @param {any} method - Method name, callback, constructor, or partial configuration used to seed the child logger.
|
|
116
|
+
* @param {Partial<LoggingConfig>} [config] - Optional configuration overrides for the child logger.
|
|
117
|
+
* @param {...any[]} args - Extra arguments forwarded to factory implementations.
|
|
118
|
+
* @return {Logger} Logger instance tailored to the supplied context.
|
|
88
119
|
*/
|
|
89
120
|
for(method: string | {
|
|
90
121
|
new (...args: any[]): any;
|
|
91
122
|
} | AnyFunction | Partial<LoggingConfig>, config?: Partial<LoggingConfig>, ...args: any[]): Logger;
|
|
92
123
|
/**
|
|
93
|
-
* @description Updates the logger configuration
|
|
94
|
-
* @summary
|
|
95
|
-
* @param {Partial<LoggingConfig>} config -
|
|
124
|
+
* @description Updates the logger configuration.
|
|
125
|
+
* @summary Merges the given options into the logger's existing configuration.
|
|
126
|
+
* @param {Partial<LoggingConfig>} config - Configuration overrides to apply.
|
|
127
|
+
* @return {void}
|
|
96
128
|
*/
|
|
97
129
|
setConfig(config: Partial<LoggingConfig>): void;
|
|
98
130
|
}
|
|
131
|
+
/**
|
|
132
|
+
* @description Interface for filters that mutate or reject log messages.
|
|
133
|
+
* @summary Allows custom pre-processing of log entries before they are formatted or emitted.
|
|
134
|
+
* @interface LoggingFilter
|
|
135
|
+
* @memberOf module:Logging
|
|
136
|
+
*/
|
|
99
137
|
export interface LoggingFilter {
|
|
138
|
+
/**
|
|
139
|
+
* @description Apply filtering logic to an incoming message.
|
|
140
|
+
* @summary Receives the active configuration, original message, and context stack to produce the final message string.
|
|
141
|
+
* @param {LoggingConfig} config - Active logging configuration.
|
|
142
|
+
* @param {string} message - Message submitted for logging.
|
|
143
|
+
* @param {string[]} context - Context identifiers associated with the message.
|
|
144
|
+
* @return {string} Filtered message string.
|
|
145
|
+
*/
|
|
100
146
|
filter(config: LoggingConfig, message: string, context: string[]): string;
|
|
101
147
|
}
|
|
102
148
|
/**
|
|
@@ -136,21 +182,16 @@ export type LoggingConfig = {
|
|
|
136
182
|
filters?: string[] | LoggingFilter[];
|
|
137
183
|
};
|
|
138
184
|
/**
|
|
139
|
-
* @description
|
|
140
|
-
* @summary
|
|
185
|
+
* @description Factory signature for creating logger instances.
|
|
186
|
+
* @summary Allows consumers to override logger construction with custom implementations.
|
|
141
187
|
* @template L - The logger type, extending the base Logger interface
|
|
142
|
-
* @typedef {
|
|
143
|
-
* @param {string} object - The object or context name for the logger
|
|
144
|
-
* @param {Partial<LoggingConfig>} [config] - Optional configuration for the logger
|
|
145
|
-
* @return {L} A logger instance
|
|
188
|
+
* @typedef {function(string, Partial<LoggingConfig>, any[]): L} LoggerFactory
|
|
146
189
|
* @memberOf module:Logging
|
|
147
190
|
*/
|
|
148
191
|
export type LoggerFactory<L extends Logger = Logger> = (object: string, config?: Partial<LoggingConfig>, ...args: any[]) => L;
|
|
149
192
|
/**
|
|
150
|
-
* @description
|
|
151
|
-
* @summary
|
|
152
|
-
* It allows for customization of foreground color, background color, and additional styles.
|
|
153
|
-
* Colors can be specified as a single number, an RGB array, or left undefined for default.
|
|
193
|
+
* @description Theme option applied to a specific log element.
|
|
194
|
+
* @summary Configures foreground and background colors as well as additional style directives for styled console output.
|
|
154
195
|
* @interface ThemeOption
|
|
155
196
|
* @memberOf module:Logging
|
|
156
197
|
*/
|
|
@@ -160,28 +201,25 @@ export interface ThemeOption {
|
|
|
160
201
|
style?: number[] | [keyof typeof styles];
|
|
161
202
|
}
|
|
162
203
|
/**
|
|
163
|
-
* @description
|
|
164
|
-
* @summary
|
|
204
|
+
* @description Mapping between log levels and theme overrides.
|
|
205
|
+
* @summary Enables level-specific styling by associating each {@link LogLevel} with a {@link ThemeOption} configuration.
|
|
165
206
|
* @typedef {Object} ThemeOptionByLogLevel
|
|
166
207
|
* @memberOf module:Logging
|
|
167
208
|
*/
|
|
168
209
|
export type ThemeOptionByLogLevel = Partial<Record<LogLevel, ThemeOption>>;
|
|
169
210
|
/**
|
|
170
|
-
* @description
|
|
171
|
-
* @summary
|
|
172
|
-
* including styling for different log levels and components. It uses ThemeOption to
|
|
173
|
-
* define the styling for each element, allowing for customization of colors and styles
|
|
174
|
-
* for different parts of the log output.
|
|
211
|
+
* @description Theme definition applied to console output.
|
|
212
|
+
* @summary Specifies styling for each console log element and supports overrides based on {@link LogLevel} values.
|
|
175
213
|
* @interface Theme
|
|
176
214
|
* @memberOf module:Logging
|
|
177
215
|
*/
|
|
178
216
|
export interface Theme {
|
|
179
217
|
/**
|
|
180
|
-
* @description Styling for
|
|
218
|
+
* @description Styling for application identifiers in the output.
|
|
181
219
|
*/
|
|
182
220
|
app: ThemeOption | ThemeOptionByLogLevel;
|
|
183
221
|
/**
|
|
184
|
-
* @description Styling for
|
|
222
|
+
* @description Styling for separators inserted between log sections.
|
|
185
223
|
*/
|
|
186
224
|
separator: ThemeOption | ThemeOptionByLogLevel;
|
|
187
225
|
/**
|
|
@@ -205,11 +243,11 @@ export interface Theme {
|
|
|
205
243
|
*/
|
|
206
244
|
id: ThemeOption | ThemeOptionByLogLevel;
|
|
207
245
|
/**
|
|
208
|
-
* @description Styling for
|
|
246
|
+
* @description Styling for stack trace blocks in the output.
|
|
209
247
|
*/
|
|
210
248
|
stack: ThemeOption;
|
|
211
249
|
/**
|
|
212
|
-
* @description Styling
|
|
250
|
+
* @description Styling overrides keyed by {@link LogLevel}.
|
|
213
251
|
*/
|
|
214
252
|
logLevel: ThemeOptionByLogLevel;
|
|
215
253
|
}
|
package/lib/esm/types.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export {};
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHN0eWxlcyB9IGZyb20gXCJzdHlsZWQtc3RyaW5nLWJ1aWxkZXJcIjtcbmltcG9ydCB7IExvZ2dpbmdNb2RlLCBMb2dMZXZlbCB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuLyoqXG4gKiBAZGVzY3JpcHRpb24gQSB0eXBlIHJlcHJlc2VudGluZyBzdHJpbmctbGlrZSB2YWx1ZXNcbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgZWl0aGVyIGEgc3RyaW5nIG9yIGFuIG9iamVjdCB3aXRoIGEgdG9TdHJpbmcgbWV0aG9kIHRoYXQgcmV0dXJucyBhIHN0cmluZ1xuICogQHR5cGVkZWYgeyhzdHJpbmd8T2JqZWN0KX0gU3RyaW5nTGlrZVxuICogQG1lbWJlck9mIG1vZHVsZTpMb2dnaW5nXG4gKi9cbmV4cG9ydCB0eXBlIFN0cmluZ0xpa2UgPSBzdHJpbmcgfCB7IHRvU3RyaW5nOiAoKSA9PiBzdHJpbmcgfTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQSBnZW5lcmljIGZ1bmN0aW9uIHR5cGUgd2l0aCBhbnkgYXJndW1lbnRzIGFuZCByZXR1cm5cbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYW55IGNhbGxhYmxlIHNpZ25hdHVyZSwgdXNlZnVsIGZvciBhbm5vdGF0aW5nIGhpZ2hlci1vcmRlciB1dGlsaXRpZXNcbiAqIGFuZCBkeW5hbWljIG1ldGhvZCByZWZlcmVuY2VzIHdoZXJlIGFyZ3VtZW50IGFuZCByZXR1cm4gdHlwZXMgYXJlIG5vdCBjb25zdHJhaW5lZC5cbiAqIEB0eXBlZGVmIHtGdW5jdGlvbn0gQW55RnVuY3Rpb25cbiAqIEBtZW1iZXJPZiBtb2R1bGU6TG9nZ2luZ1xuICovXG5leHBvcnQgdHlwZSBBbnlGdW5jdGlvbiA9ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBIGNvbnN0cnVjdGFibGUgY2xhc3MgdHlwZVxuICogQHN1bW1hcnkgRGVzY3JpYmVzIGEgY2xhc3MgY29uc3RydWN0b3IgdGhhdCBwcm9kdWNlcyBpbnN0YW5jZXMgb2YgdHlwZSBULiBVc2VmdWwgd2hlblxuICogcGFzc2luZyBjbGFzcyByZWZlcmVuY2VzIGFyb3VuZCAoZS5nLiwgZm9yIGNvbnRleHQgb3IgZGVwZW5kZW5jeSBpbmplY3Rpb24pLlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtmdW5jdGlvbihhbnlbXSk6IFR9IENsYXNzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOkxvZ2dpbmdcbiAqL1xuZXhwb3J0IHR5cGUgQ2xhc3M8VD4gPSB7XG4gIG5ldyAoLi4uYXJnczogYW55W10pOiBUO1xufTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQSB0eXBlIHJlcHJlc2VudGluZyBsb2dnaW5nIGNvbnRleHRcbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYSBjb250ZXh0IGZvciBsb2dnaW5nLCB3aGljaCBjYW4gYmUgYSBzdHJpbmcsIGEgY2xhc3MgY29uc3RydWN0b3IsIG9yIGEgZnVuY3Rpb25cbiAqIEB0eXBlZGVmIHsoc3RyaW5nfEZ1bmN0aW9ufE9iamVjdCl9IExvZ2dpbmdDb250ZXh0XG4gKiBAbWVtYmVyT2YgbW9kdWxlOkxvZ2dpbmdcbiAqL1xuZXhwb3J0IHR5cGUgTG9nZ2luZ0NvbnRleHQgPSBzdHJpbmcgfCBDbGFzczxhbnk+IHwgQW55RnVuY3Rpb247XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW1wZXJzb25hdGFibGU8VEhJUywgQVJHUyBleHRlbmRzIGFueVtdID0gYW55W10+IHtcbiAgZm9yKC4uLmFyZ3M6IEFSR1MpOiBUSElTO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBJbnRlcmZhY2UgZm9yIGEgbG9nZ2VyIHdpdGggdmVyYm9zaXR5IGxldmVscy5cbiAqIEBzdW1tYXJ5IERlZmluZXMgbWV0aG9kcyBmb3IgbG9nZ2luZyBhdCBkaWZmZXJlbnQgdmVyYm9zaXR5IGxldmVscy5cbiAqIEBpbnRlcmZhY2UgTG9nZ2VyXG4gKiBAbWVtYmVyT2YgbW9kdWxlOkxvZ2dpbmdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2dnZXJcbiAgZXh0ZW5kcyBJbXBlcnNvbmF0YWJsZTxcbiAgICBMb2dnZXIsXG4gICAgW1xuICAgICAgKFxuICAgICAgICB8IHN0cmluZ1xuICAgICAgICB8IHsgbmV3ICguLi5hcmdzOiBhbnlbXSk6IGFueSB9XG4gICAgICAgIHwgQW55RnVuY3Rpb25cbiAgICAgICAgfCBQYXJ0aWFsPExvZ2dpbmdDb25maWc+XG4gICAgICApLFxuICAgICAgUGFydGlhbDxMb2dnaW5nQ29uZmlnPixcbiAgICAgIC4uLmFueVtdLFxuICAgIF1cbiAgPiB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTG9ncyBhIGB3YXkgdG9vIHZlcmJvc2VgIG9yIGEgc2lsbHkgbWVzc2FnZS5cbiAgICogQHBhcmFtIHtTdHJpbmdMaWtlfSBtc2cgLSBUaGUgbWVzc2FnZSB0byBsb2cuXG4gICAqL1xuICBzaWxseShtc2c6IFN0cmluZ0xpa2UpOiB2b2lkO1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvZ3MgYSB2ZXJib3NlIG1lc3NhZ2UuXG4gICAqIEBwYXJhbSB7U3RyaW5nTGlrZX0gbXNnIC0gVGhlIG1lc3NhZ2UgdG8gbG9nLlxuICAgKiBAcGFyYW0ge251bWJlcn0gdmVyYm9zaXR5IC0gVGhlIHZlcmJvc2l0eSBsZXZlbCBvZiB0aGUgbWVzc2FnZS5cbiAgICovXG4gIHZlcmJvc2UobXNnOiBTdHJpbmdMaWtlLCB2ZXJib3NpdHk/OiBudW1iZXIpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTG9ncyBhbiBpbmZvIG1lc3NhZ2UuXG4gICAqIEBwYXJhbSB7U3RyaW5nTGlrZX0gbXNnIC0gVGhlIG1lc3NhZ2UgdG8gbG9nLlxuICAgKi9cbiAgaW5mbyhtc2c6IFN0cmluZ0xpa2UpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTG9ncyBhbiBlcnJvciBtZXNzYWdlLlxuICAgKiBAcGFyYW0ge1N0cmluZ0xpa2UgfCBFcnJvcn0gbXNnIC0gVGhlIG1lc3NhZ2UgdG8gbG9nLlxuICAgKiBAcGFyYW0gZVxuICAgKi9cbiAgZXJyb3IobXNnOiBTdHJpbmdMaWtlIHwgRXJyb3IsIGU/OiBFcnJvcik6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2dzIGEgZGVidWcgbWVzc2FnZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1zZyAtIFRoZSBtZXNzYWdlIHRvIGxvZy5cbiAgICovXG4gIGRlYnVnKG1zZzogU3RyaW5nTGlrZSk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IGxvZ2dlciBmb3IgYSBzcGVjaWZpYyBtZXRob2Qgb3IgY29udGV4dFxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIGEgbmV3IGxvZ2dlciBpbnN0YW5jZSB0aGF0IGluY2x1ZGVzIHRoZSBzcGVjaWZpZWQgbWV0aG9kIG9yIGNvbnRleHQgaW4gaXRzIGxvZ3NcbiAgICogQHBhcmFtIHtzdHJpbmd8RnVuY3Rpb259IFttZXRob2RdIC0gVGhlIG1ldGhvZCBuYW1lIG9yIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIGxvZ2dlciBmb3JcbiAgICogQHBhcmFtIHtQYXJ0aWFsPExvZ2dpbmdDb25maWc+fSBbY29uZmlnXSAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBuZXcgbG9nZ2VyXG4gICAqIEBwYXJhbSBhcmdzXG4gICAqIEByZXR1cm4ge0xvZ2dlcn0gQSBuZXcgbG9nZ2VyIGluc3RhbmNlXG4gICAqL1xuICBmb3IoXG4gICAgbWV0aG9kOlxuICAgICAgfCBzdHJpbmdcbiAgICAgIHwgeyBuZXcgKC4uLmFyZ3M6IGFueVtdKTogYW55IH1cbiAgICAgIHwgQW55RnVuY3Rpb25cbiAgICAgIHwgUGFydGlhbDxMb2dnaW5nQ29uZmlnPixcbiAgICBjb25maWc/OiBQYXJ0aWFsPExvZ2dpbmdDb25maWc+LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IExvZ2dlcjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgdGhlIGxvZ2dlciBjb25maWd1cmF0aW9uXG4gICAqIEBzdW1tYXJ5IFNldHMgb3IgdXBkYXRlcyB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGlzIGxvZ2dlciBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge1BhcnRpYWw8TG9nZ2luZ0NvbmZpZz59IGNvbmZpZyAtIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gYXBwbHlcbiAgICovXG4gIHNldENvbmZpZyhjb25maWc6IFBhcnRpYWw8TG9nZ2luZ0NvbmZpZz4pOiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExvZ2dpbmdGaWx0ZXIge1xuICBmaWx0ZXIoY29uZmlnOiBMb2dnaW5nQ29uZmlnLCBtZXNzYWdlOiBzdHJpbmcsIGNvbnRleHQ6IHN0cmluZ1tdKTogc3RyaW5nO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb25maWd1cmF0aW9uIGZvciBsb2dnaW5nLlxuICogQHN1bW1hcnkgRGVmaW5lcyB0aGUgbG9nIGxldmVsIGFuZCB2ZXJib3NpdHkgZm9yIGxvZ2dpbmcuXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBMb2dnaW5nQ29uZmlnXG4gKiBAcHJvcGVydHkge0xvZ0xldmVsfSBsZXZlbCAtIFRoZSBsb2dnaW5nIGxldmVsLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbbG9nTGV2ZWxdIC0gV2hldGhlciB0byBkaXNwbGF5IGxvZyBsZXZlbCBpbiBvdXRwdXQuXG4gKiBAcHJvcGVydHkge251bWJlcn0gdmVyYm9zZSAtIFRoZSB2ZXJib3NpdHkgbGV2ZWwuXG4gKiBAcHJvcGVydHkge0xvZ2dpbmdNb2RlfSBbbW9kZV0gLSBPdXRwdXQgZm9ybWF0IG1vZGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY29udGV4dFNlcGFyYXRvciAtIFNlcGFyYXRvciBiZXR3ZWVuIGNvbnRleHQgZW50cmllcy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzZXBhcmF0b3IgLSBTZXBhcmF0b3IgYmV0d2VlbiBsb2cgY29tcG9uZW50cy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3N0eWxlXSAtIFdoZXRoZXIgdG8gYXBwbHkgc3R5bGluZyB0byBsb2cgb3V0cHV0LlxuICogQHByb3BlcnR5IHtib29sZWFufSBbdGltZXN0YW1wXSAtIFdoZXRoZXIgdG8gaW5jbHVkZSB0aW1lc3RhbXBzIGluIGxvZyBtZXNzYWdlcy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGltZXN0YW1wRm9ybWF0XSAtIEZvcm1hdCBmb3IgdGltZXN0YW1wcy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NvbnRleHRdIC0gV2hldGhlciB0byBpbmNsdWRlIGNvbnRleHQgaW5mb3JtYXRpb24gaW4gbG9nIG1lc3NhZ2VzLlxuICogQHByb3BlcnR5IHtUaGVtZX0gW3RoZW1lXSAtIFRoZSB0aGVtZSB0byB1c2UgZm9yIHN0eWxpbmcgbG9nIG1lc3NhZ2VzLlxuICogQHByb3BlcnR5IHtzdHJpbmd8bnVtYmVyfSBbY29ycmVsYXRpb25JZF0gLSBDb3JyZWxhdGlvbiBJRCBmb3IgdHJhY2tpbmcgcmVsYXRlZCBsb2cgbWVzc2FnZXMuXG4gKiBAbWVtYmVyT2YgbW9kdWxlOkxvZ2dpbmdcbiAqL1xuZXhwb3J0IHR5cGUgTG9nZ2luZ0NvbmZpZyA9IHtcbiAgYXBwPzogc3RyaW5nO1xuICBlbnY6IFwiZGV2ZWxvcG1lbnRcIiB8IFwicHJvZHVjdGlvblwiIHwgXCJ0ZXN0XCIgfCBcInN0YWdpbmdcIiB8IHN0cmluZztcbiAgbGV2ZWw6IExvZ0xldmVsO1xuICBsb2dMZXZlbD86IGJvb2xlYW47XG4gIHZlcmJvc2U6IG51bWJlcjtcbiAgY29udGV4dFNlcGFyYXRvcjogc3RyaW5nO1xuICBzZXBhcmF0b3I6IHN0cmluZztcbiAgc3R5bGU/OiBib29sZWFuO1xuICB0aW1lc3RhbXA/OiBib29sZWFuO1xuICB0aW1lc3RhbXBGb3JtYXQ/OiBzdHJpbmc7XG4gIGNvbnRleHQ/OiBib29sZWFuO1xuICB0aGVtZT86IFRoZW1lO1xuICBmb3JtYXQ6IExvZ2dpbmdNb2RlO1xuICBwYXR0ZXJuOiBzdHJpbmc7XG4gIGNvcnJlbGF0aW9uSWQ/OiBzdHJpbmcgfCBudW1iZXI7XG4gIGZpbHRlcnM/OiBzdHJpbmdbXSB8IExvZ2dpbmdGaWx0ZXJbXTtcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEEgZmFjdG9yeSBmdW5jdGlvbiB0eXBlIGZvciBjcmVhdGluZyBsb2dnZXJzXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgZnVuY3Rpb24gdHlwZSB0aGF0IGNyZWF0ZXMgYW5kIHJldHVybnMgYSBsb2dnZXIgaW5zdGFuY2UgZm9yIGEgZ2l2ZW4gb2JqZWN0XG4gKiBAdGVtcGxhdGUgTCAtIFRoZSBsb2dnZXIgdHlwZSwgZXh0ZW5kaW5nIHRoZSBiYXNlIExvZ2dlciBpbnRlcmZhY2VcbiAqIEB0eXBlZGVmIHtGdW5jdGlvbn0gTG9nZ2VyRmFjdG9yeVxuICogQHBhcmFtIHtzdHJpbmd9IG9iamVjdCAtIFRoZSBvYmplY3Qgb3IgY29udGV4dCBuYW1lIGZvciB0aGUgbG9nZ2VyXG4gKiBAcGFyYW0ge1BhcnRpYWw8TG9nZ2luZ0NvbmZpZz59IFtjb25maWddIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbiBmb3IgdGhlIGxvZ2dlclxuICogQHJldHVybiB7TH0gQSBsb2dnZXIgaW5zdGFuY2VcbiAqIEBtZW1iZXJPZiBtb2R1bGU6TG9nZ2luZ1xuICovXG5leHBvcnQgdHlwZSBMb2dnZXJGYWN0b3J5PEwgZXh0ZW5kcyBMb2dnZXIgPSBMb2dnZXI+ID0gKFxuICBvYmplY3Q6IHN0cmluZyxcbiAgY29uZmlnPzogUGFydGlhbDxMb2dnaW5nQ29uZmlnPixcbiAgLi4uYXJnczogYW55W11cbikgPT4gTDtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVwcmVzZW50cyBhIHRoZW1lIG9wdGlvbiBmb3IgY29uc29sZSBvdXRwdXQgc3R5bGluZy5cbiAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIHN0cnVjdHVyZSBmb3Igc3R5bGluZyBhIHNwZWNpZmljIGVsZW1lbnQgaW4gdGhlIGNvbnNvbGUgb3V0cHV0LlxuICogSXQgYWxsb3dzIGZvciBjdXN0b21pemF0aW9uIG9mIGZvcmVncm91bmQgY29sb3IsIGJhY2tncm91bmQgY29sb3IsIGFuZCBhZGRpdGlvbmFsIHN0eWxlcy5cbiAqIENvbG9ycyBjYW4gYmUgc3BlY2lmaWVkIGFzIGEgc2luZ2xlIG51bWJlciwgYW4gUkdCIGFycmF5LCBvciBsZWZ0IHVuZGVmaW5lZCBmb3IgZGVmYXVsdC5cbiAqIEBpbnRlcmZhY2UgVGhlbWVPcHRpb25cbiAqIEBtZW1iZXJPZiBtb2R1bGU6TG9nZ2luZ1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFRoZW1lT3B0aW9uIHtcbiAgZmc/OiBudW1iZXIgfCBbbnVtYmVyXSB8IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcblxuICBiZz86IG51bWJlciB8IFtudW1iZXJdIHwgW251bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuXG4gIHN0eWxlPzogbnVtYmVyW10gfCBba2V5b2YgdHlwZW9mIHN0eWxlc107XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEEgdHlwZSBmb3IgdGhlbWUgb3B0aW9ucyBvcmdhbml6ZWQgYnkgbG9nIGxldmVsXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgcGFydGlhbCByZWNvcmQgbWFwcGluZyBsb2cgbGV2ZWxzIHRvIHRoZW1lIG9wdGlvbnMsIGFsbG93aW5nIGRpZmZlcmVudCBzdHlsaW5nIGZvciBkaWZmZXJlbnQgbG9nIGxldmVsc1xuICogQHR5cGVkZWYge09iamVjdH0gVGhlbWVPcHRpb25CeUxvZ0xldmVsXG4gKiBAbWVtYmVyT2YgbW9kdWxlOkxvZ2dpbmdcbiAqL1xuZXhwb3J0IHR5cGUgVGhlbWVPcHRpb25CeUxvZ0xldmVsID0gUGFydGlhbDxSZWNvcmQ8TG9nTGV2ZWwsIFRoZW1lT3B0aW9uPj47XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlZmluZXMgdGhlIGNvbG9yIHRoZW1lIGZvciBjb25zb2xlIG91dHB1dC5cbiAqIEBzdW1tYXJ5IFRoaXMgaW50ZXJmYWNlIHNwZWNpZmllcyB0aGUgY29sb3Igc2NoZW1lIGZvciB2YXJpb3VzIGVsZW1lbnRzIG9mIGNvbnNvbGUgb3V0cHV0LFxuICogaW5jbHVkaW5nIHN0eWxpbmcgZm9yIGRpZmZlcmVudCBsb2cgbGV2ZWxzIGFuZCBjb21wb25lbnRzLiBJdCB1c2VzIFRoZW1lT3B0aW9uIHRvXG4gKiBkZWZpbmUgdGhlIHN0eWxpbmcgZm9yIGVhY2ggZWxlbWVudCwgYWxsb3dpbmcgZm9yIGN1c3RvbWl6YXRpb24gb2YgY29sb3JzIGFuZCBzdHlsZXNcbiAqIGZvciBkaWZmZXJlbnQgcGFydHMgb2YgdGhlIGxvZyBvdXRwdXQuXG4gKiBAaW50ZXJmYWNlIFRoZW1lXG4gKiBAbWVtYmVyT2YgbW9kdWxlOkxvZ2dpbmdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUaGVtZSB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3R5bGluZyBmb3IgY2xhc3MgbmFtZXMgaW4gdGhlIG91dHB1dC5cbiAgICovXG4gIGFwcDogVGhlbWVPcHRpb24gfCBUaGVtZU9wdGlvbkJ5TG9nTGV2ZWw7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3R5bGluZyBmb3IgY2xhc3MgbmFtZXMgaW4gdGhlIG91dHB1dC5cbiAgICovXG4gIHNlcGFyYXRvcjogVGhlbWVPcHRpb24gfCBUaGVtZU9wdGlvbkJ5TG9nTGV2ZWw7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3R5bGluZyBmb3IgY2xhc3MgbmFtZXMgaW4gdGhlIG91dHB1dC5cbiAgICovXG4gIGNsYXNzOiBUaGVtZU9wdGlvbiB8IFRoZW1lT3B0aW9uQnlMb2dMZXZlbDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFN0eWxpbmcgZm9yIHRpbWVzdGFtcHMgaW4gdGhlIG91dHB1dC5cbiAgICovXG4gIHRpbWVzdGFtcDogVGhlbWVPcHRpb24gfCBUaGVtZU9wdGlvbkJ5TG9nTGV2ZWw7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTdHlsaW5nIGZvciB0aGUgbWFpbiBtZXNzYWdlIHRleHQgaW4gdGhlIG91dHB1dC5cbiAgICovXG4gIG1lc3NhZ2U6IFRoZW1lT3B0aW9uIHwgVGhlbWVPcHRpb25CeUxvZ0xldmVsO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3R5bGluZyBmb3IgbWV0aG9kIG5hbWVzIGluIHRoZSBvdXRwdXQuXG4gICAqL1xuICBtZXRob2Q6IFRoZW1lT3B0aW9uIHwgVGhlbWVPcHRpb25CeUxvZ0xldmVsO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3R5bGluZyBmb3IgaWRlbnRpZmllciBlbGVtZW50cyBpbiB0aGUgb3V0cHV0LlxuICAgKi9cbiAgaWQ6IFRoZW1lT3B0aW9uIHwgVGhlbWVPcHRpb25CeUxvZ0xldmVsO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3R5bGluZyBmb3IgaWRlbnRpZmllciBlbGVtZW50cyBpbiB0aGUgb3V0cHV0LlxuICAgKi9cbiAgc3RhY2s6IFRoZW1lT3B0aW9uO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3R5bGluZyBmb3IgZGlmZmVyZW50IGxvZyBsZXZlbHMgaW4gdGhlIG91dHB1dC5cbiAgICovXG4gIGxvZ0xldmVsOiBUaGVtZU9wdGlvbkJ5TG9nTGV2ZWw7XG59XG4iXX0=
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHN0eWxlcyB9IGZyb20gXCJzdHlsZWQtc3RyaW5nLWJ1aWxkZXJcIjtcbmltcG9ydCB7IExvZ2dpbmdNb2RlLCBMb2dMZXZlbCB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuLyoqXG4gKiBAZGVzY3JpcHRpb24gU3RyaW5nLWNvbXBhdGlibGUgdmFsdWUgYWNjZXB0ZWQgYnkgdGhlIGxvZ2dpbmcgQVBJcy5cbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgZWl0aGVyIGEgbGl0ZXJhbCBzdHJpbmcgb3IgYW4gb2JqZWN0IGV4cG9zaW5nIGEgYHRvU3RyaW5nKClgIG1ldGhvZCwgYWxsb3dpbmcgbGF6eSBzdHJpbmdpZmljYXRpb24gb2YgY29tcGxleCBwYXlsb2Fkcy5cbiAqIEB0eXBlZGVmIHsoc3RyaW5nfE9iamVjdCl9IFN0cmluZ0xpa2VcbiAqIEBtZW1iZXJPZiBtb2R1bGU6TG9nZ2luZ1xuICovXG5leHBvcnQgdHlwZSBTdHJpbmdMaWtlID0gc3RyaW5nIHwgeyB0b1N0cmluZzogKCkgPT4gc3RyaW5nIH07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEdlbmVyaWMgZnVuY3Rpb24gc2lnbmF0dXJlIGZvciBsb29zZWx5IHR5cGVkIGNhbGxiYWNrcy5cbiAqIEBzdW1tYXJ5IENvdmVycyB2YXJpYWRpYyBmdW5jdGlvbnMgd2hvc2UgYXJndW1lbnRzIGFuZCByZXR1cm4gdHlwZXMgYXJlIG5vdCBjb25zdHJhaW5lZCwgZW5hYmxpbmcgdGhlIGxvZ2dpbmcgbGF5ZXIgdG8gYWNjZXB0IGFueSBjYWxsYWJsZS5cbiAqIEB0eXBlZGVmIHtmdW5jdGlvbihhbnlbXSk6IGFueX0gQW55RnVuY3Rpb25cbiAqIEBtZW1iZXJPZiBtb2R1bGU6TG9nZ2luZ1xuICovXG5leHBvcnQgdHlwZSBBbnlGdW5jdGlvbiA9ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb25zdHJ1Y3RhYmxlIGNsYXNzIHR5cGUuXG4gKiBAc3VtbWFyeSBEZXNjcmliZXMgYSBjb25zdHJ1Y3RvciB0aGF0IHByb2R1Y2VzIGluc3RhbmNlcyBvZiB0eXBlIGBUYCwgYWxsb3dpbmcgQVBJcyB0byBhY2NlcHQgY2xhc3MgcmVmZXJlbmNlcyBmb3IgY29udGV4dC1hd2FyZSBsb2dnaW5nLlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHthbnl9IENsYXNzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOkxvZ2dpbmdcbiAqL1xuZXhwb3J0IHR5cGUgQ2xhc3M8VD4gPSB7XG4gIG5ldyAoLi4uYXJnczogYW55W10pOiBUO1xufTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29udGV4dCBkZXNjcmlwdG9yIGFjY2VwdGVkIHdoZW4gcmVxdWVzdGluZyBhIGxvZ2dlciBpbnN0YW5jZS5cbiAqIEBzdW1tYXJ5IEFsbG93cyB0aGUgbG9nZ2luZyBzeXN0ZW0gdG8gcmVzb2x2ZSBjb250ZXh0IG5hbWVzIGZyb20gc3RyaW5ncywgY29uc3RydWN0b3JzLCBvciBmdW5jdGlvbnMuXG4gKiBAdHlwZWRlZiB7KHN0cmluZ3xGdW5jdGlvbnxPYmplY3QpfSBMb2dnaW5nQ29udGV4dFxuICogQG1lbWJlck9mIG1vZHVsZTpMb2dnaW5nXG4gKi9cbmV4cG9ydCB0eXBlIExvZ2dpbmdDb250ZXh0ID0gc3RyaW5nIHwgQ2xhc3M8YW55PiB8IEFueUZ1bmN0aW9uO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBJbnRlcmZhY2UgZm9yIGZhY3RvcmllcyB0aGF0IGNyZWF0ZSBjb250ZXh0dWFsIGNsb25lcyBvZiB0aGUgcmVjZWl2ZXIuXG4gKiBAc3VtbWFyeSBEZWNsYXJlcyBhIGBmb3JgIG1ldGhvZCB0aGF0IHJldHVybnMgYW5vdGhlciBpbnN0YW5jZSBvZiBgVEhJU2AgdXNpbmcgdGhlIHByb3ZpZGVkIGFyZ3VtZW50cywgZW5hYmxpbmcgY2hhaW5lZCBsb2dnZXIgY3VzdG9taXphdGlvbi5cbiAqIEB0ZW1wbGF0ZSBUSElTXG4gKiBAdGVtcGxhdGUgQVJHU1xuICogQGludGVyZmFjZSBJbXBlcnNvbmF0YWJsZVxuICogQG1lbWJlck9mIG1vZHVsZTpMb2dnaW5nXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW1wZXJzb25hdGFibGU8VEhJUywgQVJHUyBleHRlbmRzIGFueVtdID0gYW55W10+IHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcm9kdWNlIGEgY29weSBvZiB0aGUgY3VycmVudCBpbnN0YW5jZSB3aXRoIGFsdGVyZWQgY29udGV4dC5cbiAgICogQHN1bW1hcnkgQ2FsbGVkIGJ5IGxvZ2dpbmcgdXRpbGl0aWVzIHRvIGRlcml2ZSBjaGlsZCBvYmplY3RzIHdpdGggc3VwcGxlbWVudGFsIGNvbmZpZ3VyYXRpb24gYW5kIGNvbnRleHQgbWV0YWRhdGEuXG4gICAqIEB0ZW1wbGF0ZSBUSElTXG4gICAqIEB0ZW1wbGF0ZSBBUkdTXG4gICAqIEBwYXJhbSB7QVJHU30gYXJncyAtIEFyZ3VtZW50cyBmb3J3YXJkZWQgdG8gdGhlIGltcGVyc29uYXRpb24gc3RyYXRlZ3kuXG4gICAqIEByZXR1cm4ge1RISVN9IERlcml2ZWQgaW5zdGFuY2UgdXNpbmcgdGhlIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAgICovXG4gIGZvciguLi5hcmdzOiBBUkdTKTogVEhJUztcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSW50ZXJmYWNlIGZvciBsb2dnZXJzIHRoYXQgc3VwcG9ydCBtdWx0aXBsZSB2ZXJib3NpdHkgbGV2ZWxzLlxuICogQHN1bW1hcnkgRGVjbGFyZXMgc2V2ZXJpdHktc3BlY2lmaWMgbG9nIG1ldGhvZHMsIGNvbmZpZ3VyYXRpb24gb3ZlcnJpZGVzLCBhbmQgZmFjdG9yeSBoZWxwZXJzIHVzZWQgdGhyb3VnaG91dCB0aGUgbG9nZ2luZyB0b29sa2l0LlxuICogQGludGVyZmFjZSBMb2dnZXJcbiAqIEBtZW1iZXJPZiBtb2R1bGU6TG9nZ2luZ1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExvZ2dlclxuICBleHRlbmRzIEltcGVyc29uYXRhYmxlPFxuICAgIExvZ2dlcixcbiAgICBbXG4gICAgICAoXG4gICAgICAgIHwgc3RyaW5nXG4gICAgICAgIHwgeyBuZXcgKC4uLmFyZ3M6IGFueVtdKTogYW55IH1cbiAgICAgICAgfCBBbnlGdW5jdGlvblxuICAgICAgICB8IFBhcnRpYWw8TG9nZ2luZ0NvbmZpZz5cbiAgICAgICksXG4gICAgICBQYXJ0aWFsPExvZ2dpbmdDb25maWc+LFxuICAgICAgLi4uYW55W10sXG4gICAgXVxuICA+IHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2dzIGEgYmVuY2htYXJrIG1lc3NhZ2UuXG4gICAqIEBzdW1tYXJ5IEVtaXRzIGhpZ2gtZnJlcXVlbmN5IHBlcmZvcm1hbmNlIG1ldHJpY3MgYXQgdGhlIGBiZW5jaG1hcmtgIGxvZyBsZXZlbC5cbiAgICogQHBhcmFtIHtTdHJpbmdMaWtlfSBtc2cgLSBNZXNzYWdlIG9yIHBheWxvYWQgdG8gZW1pdC5cbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIGJlbmNobWFyayhtc2c6IFN0cmluZ0xpa2UpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTG9ncyBhIGB3YXkgdG9vIHZlcmJvc2VgIG9yIGEgc2lsbHkgbWVzc2FnZS5cbiAgICogQHN1bW1hcnkgRW1pdHMgcGxheWZ1bCBvciBleHRyZW1lbHkgdmVyYm9zZSBkZXRhaWxzIGF0IHRoZSBgc2lsbHlgIGxvZyBsZXZlbC5cbiAgICogQHBhcmFtIHtTdHJpbmdMaWtlfSBtc2cgLSBNZXNzYWdlIG9yIHBheWxvYWQgdG8gZW1pdC5cbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIHNpbGx5KG1zZzogU3RyaW5nTGlrZSk6IHZvaWQ7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTG9ncyBhIHZlcmJvc2UgbWVzc2FnZS5cbiAgICogQHN1bW1hcnkgV3JpdGVzIGRpYWdub3N0aWMgb3V0cHV0IGdvdmVybmVkIGJ5IHRoZSBjb25maWd1cmVkIHZlcmJvc2l0eSB0aHJlc2hvbGQuXG4gICAqIEBwYXJhbSB7U3RyaW5nTGlrZX0gbXNnIC0gTWVzc2FnZSBvciBwYXlsb2FkIHRvIGVtaXQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbdmVyYm9zaXR5XSAtIFZlcmJvc2l0eSBsZXZlbCByZXF1aXJlZCBmb3IgdGhlIG1lc3NhZ2UgdG8gcGFzcyB0aHJvdWdoLlxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgdmVyYm9zZShtc2c6IFN0cmluZ0xpa2UsIHZlcmJvc2l0eT86IG51bWJlcik6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2dzIGFuIGluZm8gbWVzc2FnZS5cbiAgICogQHN1bW1hcnkgRW1pdHMgZ2VuZXJhbCBpbmZvcm1hdGlvbmFsIGV2ZW50cyB0aGF0IGRlc2NyaWJlIGFwcGxpY2F0aW9uIHByb2dyZXNzLlxuICAgKiBAcGFyYW0ge1N0cmluZ0xpa2V9IG1zZyAtIE1lc3NhZ2Ugb3IgcGF5bG9hZCB0byBlbWl0LlxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgaW5mbyhtc2c6IFN0cmluZ0xpa2UpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTG9ncyBhbiBlcnJvciBtZXNzYWdlLlxuICAgKiBAc3VtbWFyeSBSZWNvcmRzIGVycm9ycyBhbmQgZXhjZXB0aW9ucywgaW5jbHVkaW5nIG9wdGlvbmFsIHN0YWNrIHRyYWNlcy5cbiAgICogQHBhcmFtIHtTdHJpbmdMaWtlfEVycm9yfSBtc2cgLSBNZXNzYWdlIG9yIHtAbGluayBFcnJvcn0gaW5zdGFuY2UgdG8gbG9nLlxuICAgKiBAcGFyYW0ge0Vycm9yfSBbZV0gLSBPcHRpb25hbCBzZWNvbmRhcnkgZXJyb3Igb3IgY2F1c2UuXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBlcnJvcihtc2c6IFN0cmluZ0xpa2UgfCBFcnJvciwgZT86IEVycm9yKTogdm9pZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvZ3MgYSBkZWJ1ZyBtZXNzYWdlLlxuICAgKiBAc3VtbWFyeSBFbWl0cyBmaW5lLWdyYWluZWQgZGlhZ25vc3RpYyBkZXRhaWxzIHVzZWZ1bCBkdXJpbmcgZGV2ZWxvcG1lbnQgYW5kIHRyb3VibGVzaG9vdGluZy5cbiAgICogQHBhcmFtIHtTdHJpbmdMaWtlfSBtc2cgLSBNZXNzYWdlIG9yIHBheWxvYWQgdG8gZW1pdC5cbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIGRlYnVnKG1zZzogU3RyaW5nTGlrZSk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IGxvZ2dlciBmb3IgYSBzcGVjaWZpYyBtZXRob2Qgb3IgY29udGV4dC5cbiAgICogQHN1bW1hcnkgUHJvZHVjZXMgYSBzY29wZWQgbG9nZ2VyIHRoYXQgZm9ybWF0cyBlbnRyaWVzIHVzaW5nIHRoZSBkZXJpdmVkIGNvbnRleHQgYW5kIG92ZXJyaWRlcyBzdXBwbGllZCBjb25maWd1cmF0aW9uLlxuICAgKiBAcGFyYW0ge2FueX0gbWV0aG9kIC0gTWV0aG9kIG5hbWUsIGNhbGxiYWNrLCBjb25zdHJ1Y3Rvciwgb3IgcGFydGlhbCBjb25maWd1cmF0aW9uIHVzZWQgdG8gc2VlZCB0aGUgY2hpbGQgbG9nZ2VyLlxuICAgKiBAcGFyYW0ge1BhcnRpYWw8TG9nZ2luZ0NvbmZpZz59IFtjb25maWddIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbiBvdmVycmlkZXMgZm9yIHRoZSBjaGlsZCBsb2dnZXIuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBFeHRyYSBhcmd1bWVudHMgZm9yd2FyZGVkIHRvIGZhY3RvcnkgaW1wbGVtZW50YXRpb25zLlxuICAgKiBAcmV0dXJuIHtMb2dnZXJ9IExvZ2dlciBpbnN0YW5jZSB0YWlsb3JlZCB0byB0aGUgc3VwcGxpZWQgY29udGV4dC5cbiAgICovXG4gIGZvcihcbiAgICBtZXRob2Q6XG4gICAgICB8IHN0cmluZ1xuICAgICAgfCB7IG5ldyAoLi4uYXJnczogYW55W10pOiBhbnkgfVxuICAgICAgfCBBbnlGdW5jdGlvblxuICAgICAgfCBQYXJ0aWFsPExvZ2dpbmdDb25maWc+LFxuICAgIGNvbmZpZz86IFBhcnRpYWw8TG9nZ2luZ0NvbmZpZz4sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogTG9nZ2VyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlcyB0aGUgbG9nZ2VyIGNvbmZpZ3VyYXRpb24uXG4gICAqIEBzdW1tYXJ5IE1lcmdlcyB0aGUgZ2l2ZW4gb3B0aW9ucyBpbnRvIHRoZSBsb2dnZXIncyBleGlzdGluZyBjb25maWd1cmF0aW9uLlxuICAgKiBAcGFyYW0ge1BhcnRpYWw8TG9nZ2luZ0NvbmZpZz59IGNvbmZpZyAtIENvbmZpZ3VyYXRpb24gb3ZlcnJpZGVzIHRvIGFwcGx5LlxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgc2V0Q29uZmlnKGNvbmZpZzogUGFydGlhbDxMb2dnaW5nQ29uZmlnPik6IHZvaWQ7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEludGVyZmFjZSBmb3IgZmlsdGVycyB0aGF0IG11dGF0ZSBvciByZWplY3QgbG9nIG1lc3NhZ2VzLlxuICogQHN1bW1hcnkgQWxsb3dzIGN1c3RvbSBwcmUtcHJvY2Vzc2luZyBvZiBsb2cgZW50cmllcyBiZWZvcmUgdGhleSBhcmUgZm9ybWF0dGVkIG9yIGVtaXR0ZWQuXG4gKiBAaW50ZXJmYWNlIExvZ2dpbmdGaWx0ZXJcbiAqIEBtZW1iZXJPZiBtb2R1bGU6TG9nZ2luZ1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExvZ2dpbmdGaWx0ZXIge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFwcGx5IGZpbHRlcmluZyBsb2dpYyB0byBhbiBpbmNvbWluZyBtZXNzYWdlLlxuICAgKiBAc3VtbWFyeSBSZWNlaXZlcyB0aGUgYWN0aXZlIGNvbmZpZ3VyYXRpb24sIG9yaWdpbmFsIG1lc3NhZ2UsIGFuZCBjb250ZXh0IHN0YWNrIHRvIHByb2R1Y2UgdGhlIGZpbmFsIG1lc3NhZ2Ugc3RyaW5nLlxuICAgKiBAcGFyYW0ge0xvZ2dpbmdDb25maWd9IGNvbmZpZyAtIEFjdGl2ZSBsb2dnaW5nIGNvbmZpZ3VyYXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIC0gTWVzc2FnZSBzdWJtaXR0ZWQgZm9yIGxvZ2dpbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IGNvbnRleHQgLSBDb250ZXh0IGlkZW50aWZpZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWVzc2FnZS5cbiAgICogQHJldHVybiB7c3RyaW5nfSBGaWx0ZXJlZCBtZXNzYWdlIHN0cmluZy5cbiAgICovXG4gIGZpbHRlcihjb25maWc6IExvZ2dpbmdDb25maWcsIG1lc3NhZ2U6IHN0cmluZywgY29udGV4dDogc3RyaW5nW10pOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbmZpZ3VyYXRpb24gZm9yIGxvZ2dpbmcuXG4gKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBsb2cgbGV2ZWwgYW5kIHZlcmJvc2l0eSBmb3IgbG9nZ2luZy5cbiAqIEB0eXBlZGVmIHtPYmplY3R9IExvZ2dpbmdDb25maWdcbiAqIEBwcm9wZXJ0eSB7TG9nTGV2ZWx9IGxldmVsIC0gVGhlIGxvZ2dpbmcgbGV2ZWwuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtsb2dMZXZlbF0gLSBXaGV0aGVyIHRvIGRpc3BsYXkgbG9nIGxldmVsIGluIG91dHB1dC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB2ZXJib3NlIC0gVGhlIHZlcmJvc2l0eSBsZXZlbC5cbiAqIEBwcm9wZXJ0eSB7TG9nZ2luZ01vZGV9IFttb2RlXSAtIE91dHB1dCBmb3JtYXQgbW9kZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjb250ZXh0U2VwYXJhdG9yIC0gU2VwYXJhdG9yIGJldHdlZW4gY29udGV4dCBlbnRyaWVzLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNlcGFyYXRvciAtIFNlcGFyYXRvciBiZXR3ZWVuIGxvZyBjb21wb25lbnRzLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbc3R5bGVdIC0gV2hldGhlciB0byBhcHBseSBzdHlsaW5nIHRvIGxvZyBvdXRwdXQuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFt0aW1lc3RhbXBdIC0gV2hldGhlciB0byBpbmNsdWRlIHRpbWVzdGFtcHMgaW4gbG9nIG1lc3NhZ2VzLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0aW1lc3RhbXBGb3JtYXRdIC0gRm9ybWF0IGZvciB0aW1lc3RhbXBzLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbY29udGV4dF0gLSBXaGV0aGVyIHRvIGluY2x1ZGUgY29udGV4dCBpbmZvcm1hdGlvbiBpbiBsb2cgbWVzc2FnZXMuXG4gKiBAcHJvcGVydHkge1RoZW1lfSBbdGhlbWVdIC0gVGhlIHRoZW1lIHRvIHVzZSBmb3Igc3R5bGluZyBsb2cgbWVzc2FnZXMuXG4gKiBAcHJvcGVydHkge3N0cmluZ3xudW1iZXJ9IFtjb3JyZWxhdGlvbklkXSAtIENvcnJlbGF0aW9uIElEIGZvciB0cmFja2luZyByZWxhdGVkIGxvZyBtZXNzYWdlcy5cbiAqIEBtZW1iZXJPZiBtb2R1bGU6TG9nZ2luZ1xuICovXG5leHBvcnQgdHlwZSBMb2dnaW5nQ29uZmlnID0ge1xuICBhcHA/OiBzdHJpbmc7XG4gIGVudjogXCJkZXZlbG9wbWVudFwiIHwgXCJwcm9kdWN0aW9uXCIgfCBcInRlc3RcIiB8IFwic3RhZ2luZ1wiIHwgc3RyaW5nO1xuICBsZXZlbDogTG9nTGV2ZWw7XG4gIGxvZ0xldmVsPzogYm9vbGVhbjtcbiAgdmVyYm9zZTogbnVtYmVyO1xuICBjb250ZXh0U2VwYXJhdG9yOiBzdHJpbmc7XG4gIHNlcGFyYXRvcjogc3RyaW5nO1xuICBzdHlsZT86IGJvb2xlYW47XG4gIHRpbWVzdGFtcD86IGJvb2xlYW47XG4gIHRpbWVzdGFtcEZvcm1hdD86IHN0cmluZztcbiAgY29udGV4dD86IGJvb2xlYW47XG4gIHRoZW1lPzogVGhlbWU7XG4gIGZvcm1hdDogTG9nZ2luZ01vZGU7XG4gIHBhdHRlcm46IHN0cmluZztcbiAgY29ycmVsYXRpb25JZD86IHN0cmluZyB8IG51bWJlcjtcbiAgZmlsdGVycz86IHN0cmluZ1tdIHwgTG9nZ2luZ0ZpbHRlcltdO1xufTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRmFjdG9yeSBzaWduYXR1cmUgZm9yIGNyZWF0aW5nIGxvZ2dlciBpbnN0YW5jZXMuXG4gKiBAc3VtbWFyeSBBbGxvd3MgY29uc3VtZXJzIHRvIG92ZXJyaWRlIGxvZ2dlciBjb25zdHJ1Y3Rpb24gd2l0aCBjdXN0b20gaW1wbGVtZW50YXRpb25zLlxuICogQHRlbXBsYXRlIEwgLSBUaGUgbG9nZ2VyIHR5cGUsIGV4dGVuZGluZyB0aGUgYmFzZSBMb2dnZXIgaW50ZXJmYWNlXG4gKiBAdHlwZWRlZiB7ZnVuY3Rpb24oc3RyaW5nLCBQYXJ0aWFsPExvZ2dpbmdDb25maWc+LCBhbnlbXSk6IEx9IExvZ2dlckZhY3RvcnlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6TG9nZ2luZ1xuICovXG5leHBvcnQgdHlwZSBMb2dnZXJGYWN0b3J5PEwgZXh0ZW5kcyBMb2dnZXIgPSBMb2dnZXI+ID0gKFxuICBvYmplY3Q6IHN0cmluZyxcbiAgY29uZmlnPzogUGFydGlhbDxMb2dnaW5nQ29uZmlnPixcbiAgLi4uYXJnczogYW55W11cbikgPT4gTDtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVGhlbWUgb3B0aW9uIGFwcGxpZWQgdG8gYSBzcGVjaWZpYyBsb2cgZWxlbWVudC5cbiAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgZm9yZWdyb3VuZCBhbmQgYmFja2dyb3VuZCBjb2xvcnMgYXMgd2VsbCBhcyBhZGRpdGlvbmFsIHN0eWxlIGRpcmVjdGl2ZXMgZm9yIHN0eWxlZCBjb25zb2xlIG91dHB1dC5cbiAqIEBpbnRlcmZhY2UgVGhlbWVPcHRpb25cbiAqIEBtZW1iZXJPZiBtb2R1bGU6TG9nZ2luZ1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFRoZW1lT3B0aW9uIHtcbiAgZmc/OiBudW1iZXIgfCBbbnVtYmVyXSB8IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbiAgYmc/OiBudW1iZXIgfCBbbnVtYmVyXSB8IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbiAgc3R5bGU/OiBudW1iZXJbXSB8IFtrZXlvZiB0eXBlb2Ygc3R5bGVzXTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTWFwcGluZyBiZXR3ZWVuIGxvZyBsZXZlbHMgYW5kIHRoZW1lIG92ZXJyaWRlcy5cbiAqIEBzdW1tYXJ5IEVuYWJsZXMgbGV2ZWwtc3BlY2lmaWMgc3R5bGluZyBieSBhc3NvY2lhdGluZyBlYWNoIHtAbGluayBMb2dMZXZlbH0gd2l0aCBhIHtAbGluayBUaGVtZU9wdGlvbn0gY29uZmlndXJhdGlvbi5cbiAqIEB0eXBlZGVmIHtPYmplY3R9IFRoZW1lT3B0aW9uQnlMb2dMZXZlbFxuICogQG1lbWJlck9mIG1vZHVsZTpMb2dnaW5nXG4gKi9cbmV4cG9ydCB0eXBlIFRoZW1lT3B0aW9uQnlMb2dMZXZlbCA9IFBhcnRpYWw8UmVjb3JkPExvZ0xldmVsLCBUaGVtZU9wdGlvbj4+O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBUaGVtZSBkZWZpbml0aW9uIGFwcGxpZWQgdG8gY29uc29sZSBvdXRwdXQuXG4gKiBAc3VtbWFyeSBTcGVjaWZpZXMgc3R5bGluZyBmb3IgZWFjaCBjb25zb2xlIGxvZyBlbGVtZW50IGFuZCBzdXBwb3J0cyBvdmVycmlkZXMgYmFzZWQgb24ge0BsaW5rIExvZ0xldmVsfSB2YWx1ZXMuXG4gKiBAaW50ZXJmYWNlIFRoZW1lXG4gKiBAbWVtYmVyT2YgbW9kdWxlOkxvZ2dpbmdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUaGVtZSB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3R5bGluZyBmb3IgYXBwbGljYXRpb24gaWRlbnRpZmllcnMgaW4gdGhlIG91dHB1dC5cbiAgICovXG4gIGFwcDogVGhlbWVPcHRpb24gfCBUaGVtZU9wdGlvbkJ5TG9nTGV2ZWw7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3R5bGluZyBmb3Igc2VwYXJhdG9ycyBpbnNlcnRlZCBiZXR3ZWVuIGxvZyBzZWN0aW9ucy5cbiAgICovXG4gIHNlcGFyYXRvcjogVGhlbWVPcHRpb24gfCBUaGVtZU9wdGlvbkJ5TG9nTGV2ZWw7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3R5bGluZyBmb3IgY2xhc3MgbmFtZXMgaW4gdGhlIG91dHB1dC5cbiAgICovXG4gIGNsYXNzOiBUaGVtZU9wdGlvbiB8IFRoZW1lT3B0aW9uQnlMb2dMZXZlbDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFN0eWxpbmcgZm9yIHRpbWVzdGFtcHMgaW4gdGhlIG91dHB1dC5cbiAgICovXG4gIHRpbWVzdGFtcDogVGhlbWVPcHRpb24gfCBUaGVtZU9wdGlvbkJ5TG9nTGV2ZWw7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTdHlsaW5nIGZvciB0aGUgbWFpbiBtZXNzYWdlIHRleHQgaW4gdGhlIG91dHB1dC5cbiAgICovXG4gIG1lc3NhZ2U6IFRoZW1lT3B0aW9uIHwgVGhlbWVPcHRpb25CeUxvZ0xldmVsO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3R5bGluZyBmb3IgbWV0aG9kIG5hbWVzIGluIHRoZSBvdXRwdXQuXG4gICAqL1xuICBtZXRob2Q6IFRoZW1lT3B0aW9uIHwgVGhlbWVPcHRpb25CeUxvZ0xldmVsO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3R5bGluZyBmb3IgaWRlbnRpZmllciBlbGVtZW50cyBpbiB0aGUgb3V0cHV0LlxuICAgKi9cbiAgaWQ6IFRoZW1lT3B0aW9uIHwgVGhlbWVPcHRpb25CeUxvZ0xldmVsO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3R5bGluZyBmb3Igc3RhY2sgdHJhY2UgYmxvY2tzIGluIHRoZSBvdXRwdXQuXG4gICAqL1xuICBzdGFjazogVGhlbWVPcHRpb247XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTdHlsaW5nIG92ZXJyaWRlcyBrZXllZCBieSB7QGxpbmsgTG9nTGV2ZWx9LlxuICAgKi9cbiAgbG9nTGV2ZWw6IFRoZW1lT3B0aW9uQnlMb2dMZXZlbDtcbn1cbiJdfQ==
|
|
@@ -2,10 +2,39 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.LogFilter = void 0;
|
|
4
4
|
const LoggedClass_1 = require("./../LoggedClass.cjs");
|
|
5
|
+
/**
|
|
6
|
+
* @description Base class for message filters that plug into the logging pipeline.
|
|
7
|
+
* @summary Extends {@link LoggedClass} to supply a scoped logger and defines the contract required by {@link LoggingFilter} implementers that transform or drop log messages before emission.
|
|
8
|
+
* @class LogFilter
|
|
9
|
+
* @example
|
|
10
|
+
* class RedactSecretsFilter extends LogFilter {
|
|
11
|
+
* filter(config: LoggingConfig, message: string): string {
|
|
12
|
+
* return message.replace(/secret/gi, "***");
|
|
13
|
+
* }
|
|
14
|
+
* }
|
|
15
|
+
*
|
|
16
|
+
* const filter = new RedactSecretsFilter();
|
|
17
|
+
* filter.filter({ ...DefaultLoggingConfig, verbose: 0 }, "secret token");
|
|
18
|
+
* @mermaid
|
|
19
|
+
* sequenceDiagram
|
|
20
|
+
* participant Logger
|
|
21
|
+
* participant Filter as LogFilter
|
|
22
|
+
* participant Impl as ConcreteFilter
|
|
23
|
+
* participant Output
|
|
24
|
+
* Logger->>Filter: filter(config, message, context)
|
|
25
|
+
* Filter->>Impl: delegate to subclass implementation
|
|
26
|
+
* Impl-->>Filter: transformed message
|
|
27
|
+
* Filter-->>Output: return filtered message
|
|
28
|
+
*/
|
|
5
29
|
class LogFilter extends LoggedClass_1.LoggedClass {
|
|
30
|
+
/**
|
|
31
|
+
* @description Scoped logger that excludes other filters from the chain.
|
|
32
|
+
* @summary Returns a child logger dedicated to the filter, preventing recursive filter invocation when emitting diagnostic messages.
|
|
33
|
+
* @return {Logger} Context-aware logger for the filter instance.
|
|
34
|
+
*/
|
|
6
35
|
get log() {
|
|
7
36
|
return super.log.for(this, { filters: [] });
|
|
8
37
|
}
|
|
9
38
|
}
|
|
10
39
|
exports.LogFilter = LogFilter;
|
|
11
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
40
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9nRmlsdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ZpbHRlcnMvTG9nRmlsdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHNEQUE2QztBQUU3Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Qkc7QUFDSCxNQUFzQixTQUFVLFNBQVEseUJBQVc7SUFDakQ7Ozs7T0FJRztJQUNILElBQWEsR0FBRztRQUNkLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBVyxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDckQsQ0FBQztDQWVGO0FBdkJELDhCQXVCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExvZ2dlciwgTG9nZ2luZ0NvbmZpZywgTG9nZ2luZ0ZpbHRlciB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgTG9nZ2VkQ2xhc3MgfSBmcm9tIFwiLi4vTG9nZ2VkQ2xhc3NcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQmFzZSBjbGFzcyBmb3IgbWVzc2FnZSBmaWx0ZXJzIHRoYXQgcGx1ZyBpbnRvIHRoZSBsb2dnaW5nIHBpcGVsaW5lLlxuICogQHN1bW1hcnkgRXh0ZW5kcyB7QGxpbmsgTG9nZ2VkQ2xhc3N9IHRvIHN1cHBseSBhIHNjb3BlZCBsb2dnZXIgYW5kIGRlZmluZXMgdGhlIGNvbnRyYWN0IHJlcXVpcmVkIGJ5IHtAbGluayBMb2dnaW5nRmlsdGVyfSBpbXBsZW1lbnRlcnMgdGhhdCB0cmFuc2Zvcm0gb3IgZHJvcCBsb2cgbWVzc2FnZXMgYmVmb3JlIGVtaXNzaW9uLlxuICogQGNsYXNzIExvZ0ZpbHRlclxuICogQGV4YW1wbGVcbiAqIGNsYXNzIFJlZGFjdFNlY3JldHNGaWx0ZXIgZXh0ZW5kcyBMb2dGaWx0ZXIge1xuICogICBmaWx0ZXIoY29uZmlnOiBMb2dnaW5nQ29uZmlnLCBtZXNzYWdlOiBzdHJpbmcpOiBzdHJpbmcge1xuICogICAgIHJldHVybiBtZXNzYWdlLnJlcGxhY2UoL3NlY3JldC9naSwgXCIqKipcIik7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiBjb25zdCBmaWx0ZXIgPSBuZXcgUmVkYWN0U2VjcmV0c0ZpbHRlcigpO1xuICogZmlsdGVyLmZpbHRlcih7IC4uLkRlZmF1bHRMb2dnaW5nQ29uZmlnLCB2ZXJib3NlOiAwIH0sIFwic2VjcmV0IHRva2VuXCIpO1xuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBMb2dnZXJcbiAqICAgcGFydGljaXBhbnQgRmlsdGVyIGFzIExvZ0ZpbHRlclxuICogICBwYXJ0aWNpcGFudCBJbXBsIGFzIENvbmNyZXRlRmlsdGVyXG4gKiAgIHBhcnRpY2lwYW50IE91dHB1dFxuICogICBMb2dnZXItPj5GaWx0ZXI6IGZpbHRlcihjb25maWcsIG1lc3NhZ2UsIGNvbnRleHQpXG4gKiAgIEZpbHRlci0+PkltcGw6IGRlbGVnYXRlIHRvIHN1YmNsYXNzIGltcGxlbWVudGF0aW9uXG4gKiAgIEltcGwtLT4+RmlsdGVyOiB0cmFuc2Zvcm1lZCBtZXNzYWdlXG4gKiAgIEZpbHRlci0tPj5PdXRwdXQ6IHJldHVybiBmaWx0ZXJlZCBtZXNzYWdlXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBMb2dGaWx0ZXIgZXh0ZW5kcyBMb2dnZWRDbGFzcyBpbXBsZW1lbnRzIExvZ2dpbmdGaWx0ZXIge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNjb3BlZCBsb2dnZXIgdGhhdCBleGNsdWRlcyBvdGhlciBmaWx0ZXJzIGZyb20gdGhlIGNoYWluLlxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIGEgY2hpbGQgbG9nZ2VyIGRlZGljYXRlZCB0byB0aGUgZmlsdGVyLCBwcmV2ZW50aW5nIHJlY3Vyc2l2ZSBmaWx0ZXIgaW52b2NhdGlvbiB3aGVuIGVtaXR0aW5nIGRpYWdub3N0aWMgbWVzc2FnZXMuXG4gICAqIEByZXR1cm4ge0xvZ2dlcn0gQ29udGV4dC1hd2FyZSBsb2dnZXIgZm9yIHRoZSBmaWx0ZXIgaW5zdGFuY2UuXG4gICAqL1xuICBvdmVycmlkZSBnZXQgbG9nKCk6IExvZ2dlciB7XG4gICAgcmV0dXJuIHN1cGVyLmxvZy5mb3IodGhpcyBhcyBhbnksIHsgZmlsdGVyczogW10gfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRyYW5zZm9ybSBvciBzdXBwcmVzcyBhIGxvZyBtZXNzYWdlLlxuICAgKiBAc3VtbWFyeSBJbnNwZWN0IHRoZSBwcm92aWRlZCBtZXNzYWdlIGFuZCBjb250ZXh0IHRvIHByb2R1Y2UgdGhlIHZhbHVlIHRoYXQgd2lsbCBiZSBmb3J3YXJkZWQgdG8gc3Vic2VxdWVudCBmaWx0ZXJzIG9yIGVtaXR0ZXJzLlxuICAgKiBAcGFyYW0ge0xvZ2dpbmdDb25maWd9IGNvbmZpZyAtIEFjdGl2ZSBsb2dnaW5nIGNvbmZpZ3VyYXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIC0gT3JpZ2luYWwgbG9nIG1lc3NhZ2UgcGF5bG9hZC5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gY29udGV4dCAtIENvbnRleHQgdmFsdWVzIGF0dGFjaGVkIHRvIHRoZSBtZXNzYWdlLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IEZpbHRlcmVkIG1lc3NhZ2UgdG8gcGFzcyB0byBkb3duc3RyZWFtIHByb2Nlc3NpbmcuXG4gICAqL1xuICBhYnN0cmFjdCBmaWx0ZXIoXG4gICAgY29uZmlnOiBMb2dnaW5nQ29uZmlnLFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBjb250ZXh0OiBzdHJpbmdbXVxuICApOiBzdHJpbmc7XG59XG4iXX0=
|
|
@@ -1,6 +1,43 @@
|
|
|
1
1
|
import { Logger, LoggingConfig, LoggingFilter } from "../types";
|
|
2
2
|
import { LoggedClass } from "../LoggedClass";
|
|
3
|
+
/**
|
|
4
|
+
* @description Base class for message filters that plug into the logging pipeline.
|
|
5
|
+
* @summary Extends {@link LoggedClass} to supply a scoped logger and defines the contract required by {@link LoggingFilter} implementers that transform or drop log messages before emission.
|
|
6
|
+
* @class LogFilter
|
|
7
|
+
* @example
|
|
8
|
+
* class RedactSecretsFilter extends LogFilter {
|
|
9
|
+
* filter(config: LoggingConfig, message: string): string {
|
|
10
|
+
* return message.replace(/secret/gi, "***");
|
|
11
|
+
* }
|
|
12
|
+
* }
|
|
13
|
+
*
|
|
14
|
+
* const filter = new RedactSecretsFilter();
|
|
15
|
+
* filter.filter({ ...DefaultLoggingConfig, verbose: 0 }, "secret token");
|
|
16
|
+
* @mermaid
|
|
17
|
+
* sequenceDiagram
|
|
18
|
+
* participant Logger
|
|
19
|
+
* participant Filter as LogFilter
|
|
20
|
+
* participant Impl as ConcreteFilter
|
|
21
|
+
* participant Output
|
|
22
|
+
* Logger->>Filter: filter(config, message, context)
|
|
23
|
+
* Filter->>Impl: delegate to subclass implementation
|
|
24
|
+
* Impl-->>Filter: transformed message
|
|
25
|
+
* Filter-->>Output: return filtered message
|
|
26
|
+
*/
|
|
3
27
|
export declare abstract class LogFilter extends LoggedClass implements LoggingFilter {
|
|
28
|
+
/**
|
|
29
|
+
* @description Scoped logger that excludes other filters from the chain.
|
|
30
|
+
* @summary Returns a child logger dedicated to the filter, preventing recursive filter invocation when emitting diagnostic messages.
|
|
31
|
+
* @return {Logger} Context-aware logger for the filter instance.
|
|
32
|
+
*/
|
|
4
33
|
get log(): Logger;
|
|
34
|
+
/**
|
|
35
|
+
* @description Transform or suppress a log message.
|
|
36
|
+
* @summary Inspect the provided message and context to produce the value that will be forwarded to subsequent filters or emitters.
|
|
37
|
+
* @param {LoggingConfig} config - Active logging configuration.
|
|
38
|
+
* @param {string} message - Original log message payload.
|
|
39
|
+
* @param {string[]} context - Context values attached to the message.
|
|
40
|
+
* @return {string} Filtered message to pass to downstream processing.
|
|
41
|
+
*/
|
|
5
42
|
abstract filter(config: LoggingConfig, message: string, context: string[]): string;
|
|
6
43
|
}
|
|
@@ -12,17 +12,57 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
12
12
|
exports.PatternFilter = void 0;
|
|
13
13
|
const LogFilter_1 = require("./LogFilter.cjs");
|
|
14
14
|
const decorators_1 = require("./../decorators.cjs");
|
|
15
|
+
/**
|
|
16
|
+
* @description Filter that patches log messages using regular expressions.
|
|
17
|
+
* @summary Applies a configured {@link RegExp} and replacement strategy to redact, mask, or restructure log payloads before they are emitted.
|
|
18
|
+
* @param {RegExp} regexp - Expression used to detect sensitive or formatted text.
|
|
19
|
+
* @param {string|ReplacementFunction} replacement - Replacement string or callback invoked for each match.
|
|
20
|
+
* @class PatternFilter
|
|
21
|
+
* @example
|
|
22
|
+
* const filter = new PatternFilter(/token=[^&]+/g, "token=***");
|
|
23
|
+
* const sanitized = filter.filter(config, "token=123&user=tom", []);
|
|
24
|
+
* // sanitized === "token=***&user=tom"
|
|
25
|
+
* @mermaid
|
|
26
|
+
* sequenceDiagram
|
|
27
|
+
* participant Logger
|
|
28
|
+
* participant Filter as PatternFilter
|
|
29
|
+
* participant RegExp
|
|
30
|
+
* Logger->>Filter: filter(config, message, context)
|
|
31
|
+
* Filter->>RegExp: execute match()
|
|
32
|
+
* alt match found
|
|
33
|
+
* RegExp-->>Filter: captures
|
|
34
|
+
* Filter->>RegExp: replace(message, replacement)
|
|
35
|
+
* RegExp-->>Filter: transformed message
|
|
36
|
+
* else no match
|
|
37
|
+
* RegExp-->>Filter: null
|
|
38
|
+
* end
|
|
39
|
+
* Filter-->>Logger: sanitized message
|
|
40
|
+
*/
|
|
15
41
|
class PatternFilter extends LogFilter_1.LogFilter {
|
|
16
42
|
constructor(regexp, replacement) {
|
|
17
43
|
super();
|
|
18
44
|
this.regexp = regexp;
|
|
19
45
|
this.replacement = replacement;
|
|
20
46
|
}
|
|
47
|
+
/**
|
|
48
|
+
* @description Ensures deterministic RegExp matching.
|
|
49
|
+
* @summary Runs the configured expression, then resets its state so repeated invocations behave consistently.
|
|
50
|
+
* @param {string} message - Message to test for matches.
|
|
51
|
+
* @return {RegExpExecArray|null} Match result or null when no match is found.
|
|
52
|
+
*/
|
|
21
53
|
match(message) {
|
|
22
54
|
const match = this.regexp.exec(message);
|
|
23
55
|
this.regexp.lastIndex = 0;
|
|
24
56
|
return match;
|
|
25
57
|
}
|
|
58
|
+
/**
|
|
59
|
+
* @description Applies the replacement strategy to the incoming message.
|
|
60
|
+
* @summary Executes {@link PatternFilter.match} and, when a match is found, replaces every occurrence using the configured replacement handler.
|
|
61
|
+
* @param {LoggingConfig} config - Active logging configuration (unused but part of the filter contract).
|
|
62
|
+
* @param {string} message - Message to be sanitized.
|
|
63
|
+
* @param {string[]} context - Context entries associated with the log event.
|
|
64
|
+
* @return {string} Sanitized log message.
|
|
65
|
+
*/
|
|
26
66
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
27
67
|
filter(config, message, context) {
|
|
28
68
|
const log = this.log.for(this.filter);
|
|
@@ -45,4 +85,4 @@ __decorate([
|
|
|
45
85
|
__metadata("design:paramtypes", [String]),
|
|
46
86
|
__metadata("design:returntype", void 0)
|
|
47
87
|
], PatternFilter.prototype, "match", null);
|
|
48
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
88
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGF0dGVybkZpbHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9maWx0ZXJzL1BhdHRlcm5GaWx0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUEsK0NBQXdDO0FBRXhDLG9EQUFzQztBQVV0Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlCRztBQUNILE1BQWEsYUFBYyxTQUFRLHFCQUFTO0lBQzFDLFlBQ3FCLE1BQWMsRUFDZCxXQUF5QztRQUU1RCxLQUFLLEVBQUUsQ0FBQztRQUhXLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxnQkFBVyxHQUFYLFdBQVcsQ0FBOEI7SUFHOUQsQ0FBQztJQUVEOzs7OztPQUtHO0lBRU8sS0FBSyxDQUFDLE9BQWU7UUFDN0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDeEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQzFCLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCw2REFBNkQ7SUFDN0QsTUFBTSxDQUFDLE1BQXFCLEVBQUUsT0FBZSxFQUFFLE9BQWlCO1FBQzlELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN0QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTyxPQUFPLENBQUM7UUFDM0IsSUFBSSxDQUFDO1lBQ0gsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFdBQWtCLENBQUMsQ0FBQztRQUMvRCxDQUFDO1FBQUMsT0FBTyxDQUFVLEVBQUUsQ0FBQztZQUNwQixHQUFHLENBQUMsS0FBSyxDQUFDLG9DQUFvQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3JELENBQUM7UUFDRCxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7Q0FDRjtBQXpDRCxzQ0F5Q0M7QUExQlc7SUFEVCxJQUFBLGtCQUFLLEdBQUU7Ozs7MENBS1AiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBMb2dGaWx0ZXIgfSBmcm9tIFwiLi9Mb2dGaWx0ZXJcIjtcbmltcG9ydCB7IExvZ2dpbmdDb25maWcgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IGZpbmFsIH0gZnJvbSBcIi4uL2RlY29yYXRvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVwbGFjZW1lbnQgY2FsbGJhY2sgdXNlZCB0byB0cmFuc2Zvcm0gUmVnRXhwIG1hdGNoZXMuXG4gKiBAc3VtbWFyeSBSZWNlaXZlcyB0aGUgbWF0Y2hlZCBzdWJzdHJpbmcgYW5kIGFkZGl0aW9uYWwgY2FwdHVyZSBhcmd1bWVudHMsIHJldHVybmluZyB0aGUgcmVwbGFjZW1lbnQgdGV4dCB0aGF0IHdpbGwgYmUgaW5qZWN0ZWQgaW50byB0aGUgbG9nIG1lc3NhZ2UuXG4gKiBAdHlwZWRlZiB7ZnVuY3Rpb24oc3RyaW5nLCBhbnlbXSk6IHN0cmluZ30gUmVwbGFjZW1lbnRGdW5jdGlvblxuICogQG1lbWJlck9mIG1vZHVsZTpMb2dnaW5nXG4gKi9cbmV4cG9ydCB0eXBlIFJlcGxhY2VtZW50RnVuY3Rpb24gPSAoc3Vic3RyaW5nOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSA9PiBzdHJpbmc7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEZpbHRlciB0aGF0IHBhdGNoZXMgbG9nIG1lc3NhZ2VzIHVzaW5nIHJlZ3VsYXIgZXhwcmVzc2lvbnMuXG4gKiBAc3VtbWFyeSBBcHBsaWVzIGEgY29uZmlndXJlZCB7QGxpbmsgUmVnRXhwfSBhbmQgcmVwbGFjZW1lbnQgc3RyYXRlZ3kgdG8gcmVkYWN0LCBtYXNrLCBvciByZXN0cnVjdHVyZSBsb2cgcGF5bG9hZHMgYmVmb3JlIHRoZXkgYXJlIGVtaXR0ZWQuXG4gKiBAcGFyYW0ge1JlZ0V4cH0gcmVnZXhwIC0gRXhwcmVzc2lvbiB1c2VkIHRvIGRldGVjdCBzZW5zaXRpdmUgb3IgZm9ybWF0dGVkIHRleHQuXG4gKiBAcGFyYW0ge3N0cmluZ3xSZXBsYWNlbWVudEZ1bmN0aW9ufSByZXBsYWNlbWVudCAtIFJlcGxhY2VtZW50IHN0cmluZyBvciBjYWxsYmFjayBpbnZva2VkIGZvciBlYWNoIG1hdGNoLlxuICogQGNsYXNzIFBhdHRlcm5GaWx0ZXJcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBmaWx0ZXIgPSBuZXcgUGF0dGVybkZpbHRlcigvdG9rZW49W14mXSsvZywgXCJ0b2tlbj0qKipcIik7XG4gKiBjb25zdCBzYW5pdGl6ZWQgPSBmaWx0ZXIuZmlsdGVyKGNvbmZpZywgXCJ0b2tlbj0xMjMmdXNlcj10b21cIiwgW10pO1xuICogLy8gc2FuaXRpemVkID09PSBcInRva2VuPSoqKiZ1c2VyPXRvbVwiXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IExvZ2dlclxuICogICBwYXJ0aWNpcGFudCBGaWx0ZXIgYXMgUGF0dGVybkZpbHRlclxuICogICBwYXJ0aWNpcGFudCBSZWdFeHBcbiAqICAgTG9nZ2VyLT4+RmlsdGVyOiBmaWx0ZXIoY29uZmlnLCBtZXNzYWdlLCBjb250ZXh0KVxuICogICBGaWx0ZXItPj5SZWdFeHA6IGV4ZWN1dGUgbWF0Y2goKVxuICogICBhbHQgbWF0Y2ggZm91bmRcbiAqICAgICBSZWdFeHAtLT4+RmlsdGVyOiBjYXB0dXJlc1xuICogICAgIEZpbHRlci0+PlJlZ0V4cDogcmVwbGFjZShtZXNzYWdlLCByZXBsYWNlbWVudClcbiAqICAgICBSZWdFeHAtLT4+RmlsdGVyOiB0cmFuc2Zvcm1lZCBtZXNzYWdlXG4gKiAgIGVsc2Ugbm8gbWF0Y2hcbiAqICAgICBSZWdFeHAtLT4+RmlsdGVyOiBudWxsXG4gKiAgIGVuZFxuICogICBGaWx0ZXItLT4+TG9nZ2VyOiBzYW5pdGl6ZWQgbWVzc2FnZVxuICovXG5leHBvcnQgY2xhc3MgUGF0dGVybkZpbHRlciBleHRlbmRzIExvZ0ZpbHRlciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCByZWFkb25seSByZWdleHA6IFJlZ0V4cCxcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVwbGFjZW1lbnQ6IHN0cmluZyB8IFJlcGxhY2VtZW50RnVuY3Rpb25cbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRW5zdXJlcyBkZXRlcm1pbmlzdGljIFJlZ0V4cCBtYXRjaGluZy5cbiAgICogQHN1bW1hcnkgUnVucyB0aGUgY29uZmlndXJlZCBleHByZXNzaW9uLCB0aGVuIHJlc2V0cyBpdHMgc3RhdGUgc28gcmVwZWF0ZWQgaW52b2NhdGlvbnMgYmVoYXZlIGNvbnNpc3RlbnRseS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgLSBNZXNzYWdlIHRvIHRlc3QgZm9yIG1hdGNoZXMuXG4gICAqIEByZXR1cm4ge1JlZ0V4cEV4ZWNBcnJheXxudWxsfSBNYXRjaCByZXN1bHQgb3IgbnVsbCB3aGVuIG5vIG1hdGNoIGlzIGZvdW5kLlxuICAgKi9cbiAgQGZpbmFsKClcbiAgcHJvdGVjdGVkIG1hdGNoKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIGNvbnN0IG1hdGNoID0gdGhpcy5yZWdleHAuZXhlYyhtZXNzYWdlKTtcbiAgICB0aGlzLnJlZ2V4cC5sYXN0SW5kZXggPSAwO1xuICAgIHJldHVybiBtYXRjaDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXBwbGllcyB0aGUgcmVwbGFjZW1lbnQgc3RyYXRlZ3kgdG8gdGhlIGluY29taW5nIG1lc3NhZ2UuXG4gICAqIEBzdW1tYXJ5IEV4ZWN1dGVzIHtAbGluayBQYXR0ZXJuRmlsdGVyLm1hdGNofSBhbmQsIHdoZW4gYSBtYXRjaCBpcyBmb3VuZCwgcmVwbGFjZXMgZXZlcnkgb2NjdXJyZW5jZSB1c2luZyB0aGUgY29uZmlndXJlZCByZXBsYWNlbWVudCBoYW5kbGVyLlxuICAgKiBAcGFyYW0ge0xvZ2dpbmdDb25maWd9IGNvbmZpZyAtIEFjdGl2ZSBsb2dnaW5nIGNvbmZpZ3VyYXRpb24gKHVudXNlZCBidXQgcGFydCBvZiB0aGUgZmlsdGVyIGNvbnRyYWN0KS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgLSBNZXNzYWdlIHRvIGJlIHNhbml0aXplZC5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gY29udGV4dCAtIENvbnRleHQgZW50cmllcyBhc3NvY2lhdGVkIHdpdGggdGhlIGxvZyBldmVudC5cbiAgICogQHJldHVybiB7c3RyaW5nfSBTYW5pdGl6ZWQgbG9nIG1lc3NhZ2UuXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGZpbHRlcihjb25maWc6IExvZ2dpbmdDb25maWcsIG1lc3NhZ2U6IHN0cmluZywgY29udGV4dDogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmZpbHRlcik7XG4gICAgY29uc3QgbWF0Y2ggPSB0aGlzLm1hdGNoKG1lc3NhZ2UpO1xuICAgIGlmICghbWF0Y2gpIHJldHVybiBtZXNzYWdlO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gbWVzc2FnZS5yZXBsYWNlKHRoaXMucmVnZXhwLCB0aGlzLnJlcGxhY2VtZW50IGFzIGFueSk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgbG9nLmVycm9yKGBQYXR0ZXJuRmlsdGVyIHJlcGxhY2VtZW50IGVycm9yOiAke2V9YCk7XG4gICAgfVxuICAgIHJldHVybiBcIlwiO1xuICB9XG59XG4iXX0=
|
|
@@ -1,10 +1,56 @@
|
|
|
1
1
|
import { LogFilter } from "./LogFilter";
|
|
2
2
|
import { LoggingConfig } from "../types";
|
|
3
|
+
/**
|
|
4
|
+
* @description Replacement callback used to transform RegExp matches.
|
|
5
|
+
* @summary Receives the matched substring and additional capture arguments, returning the replacement text that will be injected into the log message.
|
|
6
|
+
* @typedef {function(string, any[]): string} ReplacementFunction
|
|
7
|
+
* @memberOf module:Logging
|
|
8
|
+
*/
|
|
3
9
|
export type ReplacementFunction = (substring: string, ...args: any[]) => string;
|
|
10
|
+
/**
|
|
11
|
+
* @description Filter that patches log messages using regular expressions.
|
|
12
|
+
* @summary Applies a configured {@link RegExp} and replacement strategy to redact, mask, or restructure log payloads before they are emitted.
|
|
13
|
+
* @param {RegExp} regexp - Expression used to detect sensitive or formatted text.
|
|
14
|
+
* @param {string|ReplacementFunction} replacement - Replacement string or callback invoked for each match.
|
|
15
|
+
* @class PatternFilter
|
|
16
|
+
* @example
|
|
17
|
+
* const filter = new PatternFilter(/token=[^&]+/g, "token=***");
|
|
18
|
+
* const sanitized = filter.filter(config, "token=123&user=tom", []);
|
|
19
|
+
* // sanitized === "token=***&user=tom"
|
|
20
|
+
* @mermaid
|
|
21
|
+
* sequenceDiagram
|
|
22
|
+
* participant Logger
|
|
23
|
+
* participant Filter as PatternFilter
|
|
24
|
+
* participant RegExp
|
|
25
|
+
* Logger->>Filter: filter(config, message, context)
|
|
26
|
+
* Filter->>RegExp: execute match()
|
|
27
|
+
* alt match found
|
|
28
|
+
* RegExp-->>Filter: captures
|
|
29
|
+
* Filter->>RegExp: replace(message, replacement)
|
|
30
|
+
* RegExp-->>Filter: transformed message
|
|
31
|
+
* else no match
|
|
32
|
+
* RegExp-->>Filter: null
|
|
33
|
+
* end
|
|
34
|
+
* Filter-->>Logger: sanitized message
|
|
35
|
+
*/
|
|
4
36
|
export declare class PatternFilter extends LogFilter {
|
|
5
37
|
protected readonly regexp: RegExp;
|
|
6
38
|
protected readonly replacement: string | ReplacementFunction;
|
|
7
39
|
constructor(regexp: RegExp, replacement: string | ReplacementFunction);
|
|
40
|
+
/**
|
|
41
|
+
* @description Ensures deterministic RegExp matching.
|
|
42
|
+
* @summary Runs the configured expression, then resets its state so repeated invocations behave consistently.
|
|
43
|
+
* @param {string} message - Message to test for matches.
|
|
44
|
+
* @return {RegExpExecArray|null} Match result or null when no match is found.
|
|
45
|
+
*/
|
|
8
46
|
protected match(message: string): RegExpExecArray | null;
|
|
47
|
+
/**
|
|
48
|
+
* @description Applies the replacement strategy to the incoming message.
|
|
49
|
+
* @summary Executes {@link PatternFilter.match} and, when a match is found, replaces every occurrence using the configured replacement handler.
|
|
50
|
+
* @param {LoggingConfig} config - Active logging configuration (unused but part of the filter contract).
|
|
51
|
+
* @param {string} message - Message to be sanitized.
|
|
52
|
+
* @param {string[]} context - Context entries associated with the log event.
|
|
53
|
+
* @return {string} Sanitized log message.
|
|
54
|
+
*/
|
|
9
55
|
filter(config: LoggingConfig, message: string, context: string[]): string;
|
|
10
56
|
}
|
package/lib/index.cjs
CHANGED
|
@@ -22,23 +22,20 @@ __exportStar(require("./environment.cjs"), exports);
|
|
|
22
22
|
__exportStar(require("./LoggedClass.cjs"), exports);
|
|
23
23
|
__exportStar(require("./logging.cjs"), exports);
|
|
24
24
|
__exportStar(require("./text.cjs"), exports);
|
|
25
|
+
__exportStar(require("./time.cjs"), exports);
|
|
25
26
|
__exportStar(require("./types.cjs"), exports);
|
|
26
27
|
__exportStar(require("./web.cjs"), exports);
|
|
27
28
|
/**
|
|
28
|
-
* @description
|
|
29
|
-
* @summary
|
|
30
|
-
* - Core classes like {@link Logging} and {@link MiniLogger}
|
|
31
|
-
* - Decorators such as {@link log} for instrumenting methods
|
|
32
|
-
* - Configuration and constants like {@link LogLevel} and {@link DefaultLoggingConfig}
|
|
33
|
-
* - Type definitions including {@link Logger} and {@link LoggingConfig}
|
|
34
|
-
* These exports enable consistent, context-aware, and optionally themed logging across projects.
|
|
29
|
+
* @description Comprehensive logging toolkit for browser and Node environments.
|
|
30
|
+
* @summary Exposes {@link Logging} and {@link MiniLogger} for runtime logging, decorators such as {@link log} for method instrumentation, and utilities like {@link PatternFilter}, {@link StopWatch}, and {@link LoggedEnvironment} to build configurable, theme-aware log pipelines.
|
|
35
31
|
* @module Logging
|
|
36
32
|
*/
|
|
37
33
|
/**
|
|
38
|
-
* @description Current package version string
|
|
39
|
-
* @summary Stores the
|
|
34
|
+
* @description Current package version string.
|
|
35
|
+
* @summary Stores the package version for diagnostics and compatibility checks.
|
|
40
36
|
* @const VERSION
|
|
37
|
+
* @type {string}
|
|
41
38
|
* @memberOf module:Logging
|
|
42
39
|
*/
|
|
43
|
-
exports.VERSION = "0.3.
|
|
44
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
40
|
+
exports.VERSION = "0.3.13";
|
|
41
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxzREFBMEI7QUFDMUIsa0RBQTRCO0FBQzVCLG1EQUE2QjtBQUM3QixvREFBOEI7QUFDOUIsb0RBQThCO0FBQzlCLGdEQUEwQjtBQUMxQiw2Q0FBdUI7QUFDdkIsNkNBQXVCO0FBQ3ZCLDhDQUF3QjtBQUN4Qiw0Q0FBc0I7QUFFdEI7Ozs7R0FJRztBQUVIOzs7Ozs7R0FNRztBQUNVLFFBQUEsT0FBTyxHQUFHLGFBQWEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCIuL2ZpbHRlcnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NvbnN0YW50c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZW52aXJvbm1lbnRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL0xvZ2dlZENsYXNzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9sb2dnaW5nXCI7XG5leHBvcnQgKiBmcm9tIFwiLi90ZXh0XCI7XG5leHBvcnQgKiBmcm9tIFwiLi90aW1lXCI7XG5leHBvcnQgKiBmcm9tIFwiLi90eXBlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vd2ViXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbXByZWhlbnNpdmUgbG9nZ2luZyB0b29sa2l0IGZvciBicm93c2VyIGFuZCBOb2RlIGVudmlyb25tZW50cy5cbiAqIEBzdW1tYXJ5IEV4cG9zZXMge0BsaW5rIExvZ2dpbmd9IGFuZCB7QGxpbmsgTWluaUxvZ2dlcn0gZm9yIHJ1bnRpbWUgbG9nZ2luZywgZGVjb3JhdG9ycyBzdWNoIGFzIHtAbGluayBsb2d9IGZvciBtZXRob2QgaW5zdHJ1bWVudGF0aW9uLCBhbmQgdXRpbGl0aWVzIGxpa2Uge0BsaW5rIFBhdHRlcm5GaWx0ZXJ9LCB7QGxpbmsgU3RvcFdhdGNofSwgYW5kIHtAbGluayBMb2dnZWRFbnZpcm9ubWVudH0gdG8gYnVpbGQgY29uZmlndXJhYmxlLCB0aGVtZS1hd2FyZSBsb2cgcGlwZWxpbmVzLlxuICogQG1vZHVsZSBMb2dnaW5nXG4gKi9cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ3VycmVudCBwYWNrYWdlIHZlcnNpb24gc3RyaW5nLlxuICogQHN1bW1hcnkgU3RvcmVzIHRoZSBwYWNrYWdlIHZlcnNpb24gZm9yIGRpYWdub3N0aWNzIGFuZCBjb21wYXRpYmlsaXR5IGNoZWNrcy5cbiAqIEBjb25zdCBWRVJTSU9OXG4gKiBAdHlwZSB7c3RyaW5nfVxuICogQG1lbWJlck9mIG1vZHVsZTpMb2dnaW5nXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gXCIjI1ZFUlNJT04jI1wiO1xuIl19
|
package/lib/index.d.ts
CHANGED
|
@@ -5,22 +5,19 @@ export * from "./environment";
|
|
|
5
5
|
export * from "./LoggedClass";
|
|
6
6
|
export * from "./logging";
|
|
7
7
|
export * from "./text";
|
|
8
|
+
export * from "./time";
|
|
8
9
|
export * from "./types";
|
|
9
10
|
export * from "./web";
|
|
10
11
|
/**
|
|
11
|
-
* @description
|
|
12
|
-
* @summary
|
|
13
|
-
* - Core classes like {@link Logging} and {@link MiniLogger}
|
|
14
|
-
* - Decorators such as {@link log} for instrumenting methods
|
|
15
|
-
* - Configuration and constants like {@link LogLevel} and {@link DefaultLoggingConfig}
|
|
16
|
-
* - Type definitions including {@link Logger} and {@link LoggingConfig}
|
|
17
|
-
* These exports enable consistent, context-aware, and optionally themed logging across projects.
|
|
12
|
+
* @description Comprehensive logging toolkit for browser and Node environments.
|
|
13
|
+
* @summary Exposes {@link Logging} and {@link MiniLogger} for runtime logging, decorators such as {@link log} for method instrumentation, and utilities like {@link PatternFilter}, {@link StopWatch}, and {@link LoggedEnvironment} to build configurable, theme-aware log pipelines.
|
|
18
14
|
* @module Logging
|
|
19
15
|
*/
|
|
20
16
|
/**
|
|
21
|
-
* @description Current package version string
|
|
22
|
-
* @summary Stores the
|
|
17
|
+
* @description Current package version string.
|
|
18
|
+
* @summary Stores the package version for diagnostics and compatibility checks.
|
|
23
19
|
* @const VERSION
|
|
20
|
+
* @type {string}
|
|
24
21
|
* @memberOf module:Logging
|
|
25
22
|
*/
|
|
26
|
-
export declare const VERSION = "0.3.
|
|
23
|
+
export declare const VERSION = "0.3.13";
|