@decaf-ts/logging 0.3.12 → 0.3.13

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.
Files changed (43) hide show
  1. package/dist/logging.cjs +534 -97
  2. package/dist/logging.esm.cjs +531 -98
  3. package/lib/LoggedClass.cjs +9 -12
  4. package/lib/LoggedClass.d.ts +6 -10
  5. package/lib/constants.cjs +40 -8
  6. package/lib/constants.d.ts +35 -7
  7. package/lib/decorators.cjs +114 -50
  8. package/lib/decorators.d.ts +58 -43
  9. package/lib/environment.cjs +65 -20
  10. package/lib/environment.d.ts +66 -22
  11. package/lib/esm/LoggedClass.d.ts +6 -10
  12. package/lib/esm/LoggedClass.js +9 -12
  13. package/lib/esm/constants.d.ts +35 -7
  14. package/lib/esm/constants.js +40 -8
  15. package/lib/esm/decorators.d.ts +58 -43
  16. package/lib/esm/decorators.js +113 -50
  17. package/lib/esm/environment.d.ts +66 -22
  18. package/lib/esm/environment.js +65 -20
  19. package/lib/esm/filters/LogFilter.d.ts +37 -0
  20. package/lib/esm/filters/LogFilter.js +30 -1
  21. package/lib/esm/filters/PatternFilter.d.ts +46 -0
  22. package/lib/esm/filters/PatternFilter.js +41 -1
  23. package/lib/esm/index.d.ts +7 -10
  24. package/lib/esm/index.js +8 -11
  25. package/lib/esm/logging.d.ts +14 -0
  26. package/lib/esm/logging.js +22 -1
  27. package/lib/esm/time.d.ts +149 -0
  28. package/lib/esm/time.js +212 -0
  29. package/lib/esm/types.d.ts +89 -51
  30. package/lib/esm/types.js +1 -1
  31. package/lib/filters/LogFilter.cjs +30 -1
  32. package/lib/filters/LogFilter.d.ts +37 -0
  33. package/lib/filters/PatternFilter.cjs +41 -1
  34. package/lib/filters/PatternFilter.d.ts +46 -0
  35. package/lib/index.cjs +8 -11
  36. package/lib/index.d.ts +7 -10
  37. package/lib/logging.cjs +22 -1
  38. package/lib/logging.d.ts +14 -0
  39. package/lib/time.cjs +217 -0
  40. package/lib/time.d.ts +149 -0
  41. package/lib/types.cjs +1 -1
  42. package/lib/types.d.ts +89 -51
  43. package/package.json +2 -2
@@ -1,8 +1,8 @@
1
1
  import { styles } from "styled-string-builder";
2
2
  import { LoggingMode, LogLevel } from "./constants";
3
3
  /**
4
- * @description A type representing string-like values
5
- * @summary Represents either a string or an object with a toString method that returns a string
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 A generic function type with any arguments and return
14
- * @summary Represents any callable signature, useful for annotating higher-order utilities
15
- * and dynamic method references where argument and return types are not constrained.
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 A constructable class type
22
- * @summary Describes a class constructor that produces instances of type T. Useful when
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 {function(any[]): T} Class
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 A type representing logging context
33
- * @summary Represents a context for logging, which can be a string, a class constructor, or a function
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 a logger with verbosity levels.
43
- * @summary Defines methods for logging at different verbosity levels.
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
- * @param {StringLike} msg - The message to log.
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
- * @param {StringLike} msg - The message to log.
62
- * @param {number} verbosity - The verbosity level of the message.
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
- * @param {StringLike} msg - The message to log.
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
- * @param {StringLike | Error} msg - The message to log.
73
- * @param e
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
- * @param {string} msg - The message to log.
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 Returns a new logger instance that includes the specified method or context in its logs
84
- * @param {string|Function} [method] - The method name or function to create a logger for
85
- * @param {Partial<LoggingConfig>} [config] - Optional configuration for the new logger
86
- * @param args
87
- * @return {Logger} A new logger instance
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 Sets or updates the configuration options for this logger instance
95
- * @param {Partial<LoggingConfig>} config - The configuration options to apply
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 A factory function type for creating loggers
140
- * @summary Defines a function type that creates and returns a logger instance for a given object
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 {Function} LoggerFactory
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 Represents a theme option for console output styling.
151
- * @summary Defines the structure for styling a specific element in the console output.
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 A type for theme options organized by log level
164
- * @summary Defines a partial record mapping log levels to theme options, allowing different styling for different log levels
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 Defines the color theme for console output.
171
- * @summary This interface specifies the color scheme for various elements of console output,
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 class names in the output.
218
+ * @description Styling for application identifiers in the output.
181
219
  */
182
220
  app: ThemeOption | ThemeOptionByLogLevel;
183
221
  /**
184
- * @description Styling for class names in the output.
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 identifier elements in the output.
246
+ * @description Styling for stack trace blocks in the output.
209
247
  */
210
248
  stack: ThemeOption;
211
249
  /**
212
- * @description Styling for different log levels in the output.
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9nRmlsdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ZpbHRlcnMvTG9nRmlsdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHNEQUE2QztBQUU3QyxNQUFzQixTQUFVLFNBQVEseUJBQVc7SUFDakQsSUFBYSxHQUFHO1FBQ2QsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFXLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNyRCxDQUFDO0NBT0Y7QUFWRCw4QkFVQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExvZ2dlciwgTG9nZ2luZ0NvbmZpZywgTG9nZ2luZ0ZpbHRlciB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgTG9nZ2VkQ2xhc3MgfSBmcm9tIFwiLi4vTG9nZ2VkQ2xhc3NcIjtcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIExvZ0ZpbHRlciBleHRlbmRzIExvZ2dlZENsYXNzIGltcGxlbWVudHMgTG9nZ2luZ0ZpbHRlciB7XG4gIG92ZXJyaWRlIGdldCBsb2coKTogTG9nZ2VyIHtcbiAgICByZXR1cm4gc3VwZXIubG9nLmZvcih0aGlzIGFzIGFueSwgeyBmaWx0ZXJzOiBbXSB9KTtcbiAgfVxuXG4gIGFic3RyYWN0IGZpbHRlcihcbiAgICBjb25maWc6IExvZ2dpbmdDb25maWcsXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIGNvbnRleHQ6IHN0cmluZ1tdXG4gICk6IHN0cmluZztcbn1cbiJdfQ==
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGF0dGVybkZpbHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9maWx0ZXJzL1BhdHRlcm5GaWx0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUEsK0NBQXdDO0FBRXhDLG9EQUFzQztBQUl0QyxNQUFhLGFBQWMsU0FBUSxxQkFBUztJQUMxQyxZQUNxQixNQUFjLEVBQ2QsV0FBeUM7UUFFNUQsS0FBSyxFQUFFLENBQUM7UUFIVyxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsZ0JBQVcsR0FBWCxXQUFXLENBQThCO0lBRzlELENBQUM7SUFHUyxLQUFLLENBQUMsT0FBZTtRQUM3QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7UUFDMUIsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsNkRBQTZEO0lBQzdELE1BQU0sQ0FBQyxNQUFxQixFQUFFLE9BQWUsRUFBRSxPQUFpQjtRQUM5RCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsS0FBSztZQUFFLE9BQU8sT0FBTyxDQUFDO1FBQzNCLElBQUksQ0FBQztZQUNILE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxXQUFrQixDQUFDLENBQUM7UUFDL0QsQ0FBQztRQUFDLE9BQU8sQ0FBVSxFQUFFLENBQUM7WUFDcEIsR0FBRyxDQUFDLEtBQUssQ0FBQyxvQ0FBb0MsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNyRCxDQUFDO1FBQ0QsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0NBQ0Y7QUEzQkQsc0NBMkJDO0FBbEJXO0lBRFQsSUFBQSxrQkFBSyxHQUFFOzs7OzBDQUtQIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTG9nRmlsdGVyIH0gZnJvbSBcIi4vTG9nRmlsdGVyXCI7XG5pbXBvcnQgeyBMb2dnaW5nQ29uZmlnIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBmaW5hbCB9IGZyb20gXCIuLi9kZWNvcmF0b3JzXCI7XG5cbmV4cG9ydCB0eXBlIFJlcGxhY2VtZW50RnVuY3Rpb24gPSAoc3Vic3RyaW5nOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSA9PiBzdHJpbmc7XG5cbmV4cG9ydCBjbGFzcyBQYXR0ZXJuRmlsdGVyIGV4dGVuZHMgTG9nRmlsdGVyIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlZ2V4cDogUmVnRXhwLFxuICAgIHByb3RlY3RlZCByZWFkb25seSByZXBsYWNlbWVudDogc3RyaW5nIHwgUmVwbGFjZW1lbnRGdW5jdGlvblxuICApIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgQGZpbmFsKClcbiAgcHJvdGVjdGVkIG1hdGNoKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIGNvbnN0IG1hdGNoID0gdGhpcy5yZWdleHAuZXhlYyhtZXNzYWdlKTtcbiAgICB0aGlzLnJlZ2V4cC5sYXN0SW5kZXggPSAwO1xuICAgIHJldHVybiBtYXRjaDtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgZmlsdGVyKGNvbmZpZzogTG9nZ2luZ0NvbmZpZywgbWVzc2FnZTogc3RyaW5nLCBjb250ZXh0OiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuZmlsdGVyKTtcbiAgICBjb25zdCBtYXRjaCA9IHRoaXMubWF0Y2gobWVzc2FnZSk7XG4gICAgaWYgKCFtYXRjaCkgcmV0dXJuIG1lc3NhZ2U7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBtZXNzYWdlLnJlcGxhY2UodGhpcy5yZWdleHAsIHRoaXMucmVwbGFjZW1lbnQgYXMgYW55KTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICBsb2cuZXJyb3IoYFBhdHRlcm5GaWx0ZXIgcmVwbGFjZW1lbnQgZXJyb3I6ICR7ZX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cbn1cbiJdfQ==
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 A logging module for TypeScript applications
29
- * @summary Provides a comprehensive, flexible logging solution. This module exposes:
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 current package version, used for version tracking and compatibility checks
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.11";
44
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxzREFBMEI7QUFDMUIsa0RBQTRCO0FBQzVCLG1EQUE2QjtBQUM3QixvREFBOEI7QUFDOUIsb0RBQThCO0FBQzlCLGdEQUEwQjtBQUMxQiw2Q0FBdUI7QUFDdkIsOENBQXdCO0FBQ3hCLDRDQUFzQjtBQUV0Qjs7Ozs7Ozs7O0dBU0c7QUFFSDs7Ozs7R0FLRztBQUNVLFFBQUEsT0FBTyxHQUFHLGFBQWEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCIuL2ZpbHRlcnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NvbnN0YW50c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZW52aXJvbm1lbnRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL0xvZ2dlZENsYXNzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9sb2dnaW5nXCI7XG5leHBvcnQgKiBmcm9tIFwiLi90ZXh0XCI7XG5leHBvcnQgKiBmcm9tIFwiLi90eXBlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vd2ViXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEEgbG9nZ2luZyBtb2R1bGUgZm9yIFR5cGVTY3JpcHQgYXBwbGljYXRpb25zXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBhIGNvbXByZWhlbnNpdmUsIGZsZXhpYmxlIGxvZ2dpbmcgc29sdXRpb24uIFRoaXMgbW9kdWxlIGV4cG9zZXM6XG4gKiAtIENvcmUgY2xhc3NlcyBsaWtlIHtAbGluayBMb2dnaW5nfSBhbmQge0BsaW5rIE1pbmlMb2dnZXJ9XG4gKiAtIERlY29yYXRvcnMgc3VjaCBhcyB7QGxpbmsgbG9nfSBmb3IgaW5zdHJ1bWVudGluZyBtZXRob2RzXG4gKiAtIENvbmZpZ3VyYXRpb24gYW5kIGNvbnN0YW50cyBsaWtlIHtAbGluayBMb2dMZXZlbH0gYW5kIHtAbGluayBEZWZhdWx0TG9nZ2luZ0NvbmZpZ31cbiAqIC0gVHlwZSBkZWZpbml0aW9ucyBpbmNsdWRpbmcge0BsaW5rIExvZ2dlcn0gYW5kIHtAbGluayBMb2dnaW5nQ29uZmlnfVxuICogVGhlc2UgZXhwb3J0cyBlbmFibGUgY29uc2lzdGVudCwgY29udGV4dC1hd2FyZSwgYW5kIG9wdGlvbmFsbHkgdGhlbWVkIGxvZ2dpbmcgYWNyb3NzIHByb2plY3RzLlxuICogQG1vZHVsZSBMb2dnaW5nXG4gKi9cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ3VycmVudCBwYWNrYWdlIHZlcnNpb24gc3RyaW5nXG4gKiBAc3VtbWFyeSBTdG9yZXMgdGhlIGN1cnJlbnQgcGFja2FnZSB2ZXJzaW9uLCB1c2VkIGZvciB2ZXJzaW9uIHRyYWNraW5nIGFuZCBjb21wYXRpYmlsaXR5IGNoZWNrc1xuICogQGNvbnN0IFZFUlNJT05cbiAqIEBtZW1iZXJPZiBtb2R1bGU6TG9nZ2luZ1xuICovXG5leHBvcnQgY29uc3QgVkVSU0lPTiA9IFwiIyNWRVJTSU9OIyNcIjtcbiJdfQ==
40
+ exports.VERSION = "0.3.12";
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 A logging module for TypeScript applications
12
- * @summary Provides a comprehensive, flexible logging solution. This module exposes:
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 current package version, used for version tracking and compatibility checks
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.11";
23
+ export declare const VERSION = "0.3.12";