@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.
- package/dist/logging.cjs +534 -97
- package/dist/logging.esm.cjs +531 -98
- 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 +65 -20
- package/lib/environment.d.ts +66 -22
- 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 +66 -22
- package/lib/esm/environment.js +65 -20
- 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/decorators.js
CHANGED
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
import { LogLevel } from "./constants.js";
|
|
2
2
|
import { Logging } from "./logging.js";
|
|
3
|
+
import { now } from "./time.js";
|
|
4
|
+
import { LoggedClass } from "./LoggedClass.js";
|
|
3
5
|
/**
|
|
4
|
-
* @description Method decorator for logging function calls
|
|
5
|
-
* @summary
|
|
6
|
-
* @param {LogLevel} level -
|
|
7
|
-
* @param {
|
|
8
|
-
* @param {
|
|
9
|
-
* @
|
|
6
|
+
* @description Method decorator for logging function calls.
|
|
7
|
+
* @summary Wraps class methods to automatically log entry, exit, timing, and optional custom messages at a configurable {@link LogLevel}.
|
|
8
|
+
* @param {LogLevel} level - Log level applied to the generated log statements (defaults to `LogLevel.info`).
|
|
9
|
+
* @param {number} [verbosity=0] - Verbosity threshold required for the entry log to appear.
|
|
10
|
+
* @param {ArgFormatFunction} [entryMessage] - Formatter invoked with the original method arguments to describe the invocation.
|
|
11
|
+
* @param {ReturnFormatFunction} [exitMessage] - Optional formatter that describes the outcome or failure of the call.
|
|
12
|
+
* @return {function(any, any, PropertyDescriptor): void} Method decorator proxy that injects logging behavior.
|
|
10
13
|
* @function log
|
|
11
14
|
* @mermaid
|
|
12
15
|
* sequenceDiagram
|
|
@@ -31,93 +34,153 @@ import { Logging } from "./logging.js";
|
|
|
31
34
|
* end
|
|
32
35
|
* @category Method Decorators
|
|
33
36
|
*/
|
|
34
|
-
export function log(level = LogLevel.info,
|
|
35
|
-
return function (target, propertyKey, descriptor) {
|
|
36
|
-
if (!descriptor)
|
|
37
|
+
export function log(level = LogLevel.info, verbosity = 0, entryMessage = (...args) => `called with ${args}`, exitMessage) {
|
|
38
|
+
return function log(target, propertyKey, descriptor) {
|
|
39
|
+
if (!descriptor || typeof descriptor === "number")
|
|
37
40
|
throw new Error(`Logging decoration only applies to methods`);
|
|
38
|
-
const logger =
|
|
41
|
+
const logger = target instanceof LoggedClass
|
|
42
|
+
? target["log"].for(target[propertyKey])
|
|
43
|
+
: Logging.for(target).for(target[propertyKey]);
|
|
39
44
|
const method = logger[level].bind(logger);
|
|
40
45
|
const originalMethod = descriptor.value;
|
|
41
46
|
descriptor.value = new Proxy(originalMethod, {
|
|
42
47
|
apply(fn, thisArg, args) {
|
|
43
|
-
method(
|
|
44
|
-
|
|
48
|
+
method(entryMessage(...args), verbosity);
|
|
49
|
+
try {
|
|
50
|
+
const result = Reflect.apply(fn, thisArg, args);
|
|
51
|
+
if (result instanceof Promise) {
|
|
52
|
+
return result
|
|
53
|
+
.then((r) => {
|
|
54
|
+
if (exitMessage)
|
|
55
|
+
method(exitMessage(undefined, r));
|
|
56
|
+
return r;
|
|
57
|
+
})
|
|
58
|
+
.catch((e) => {
|
|
59
|
+
if (exitMessage)
|
|
60
|
+
logger.error(exitMessage(e));
|
|
61
|
+
throw e;
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
if (exitMessage)
|
|
65
|
+
method(exitMessage(undefined, result));
|
|
66
|
+
return result;
|
|
67
|
+
}
|
|
68
|
+
catch (err) {
|
|
69
|
+
if (exitMessage)
|
|
70
|
+
logger.error(exitMessage(err));
|
|
71
|
+
throw err;
|
|
72
|
+
}
|
|
73
|
+
},
|
|
74
|
+
});
|
|
75
|
+
return descriptor;
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* @description Method decorator that records execution time at the benchmark level.
|
|
80
|
+
* @summary Wraps the target method to emit {@link Logger.benchmark} entries capturing completion time or failure latency.
|
|
81
|
+
* @return {function(any, any, PropertyDescriptor): void} Method decorator proxy that benchmarks the original implementation.
|
|
82
|
+
* @function benchmark
|
|
83
|
+
* @mermaid
|
|
84
|
+
* sequenceDiagram
|
|
85
|
+
* participant Caller
|
|
86
|
+
* participant Decorator as benchmark
|
|
87
|
+
* participant Method as Original Method
|
|
88
|
+
* Caller->>Decorator: invoke()
|
|
89
|
+
* Decorator->>Method: Reflect.apply(...)
|
|
90
|
+
* alt Promise result
|
|
91
|
+
* Method-->>Decorator: Promise
|
|
92
|
+
* Decorator->>Decorator: attach then()
|
|
93
|
+
* Decorator->>Decorator: log completion duration
|
|
94
|
+
* else Synchronous result
|
|
95
|
+
* Method-->>Decorator: value
|
|
96
|
+
* Decorator->>Decorator: log completion duration
|
|
97
|
+
* end
|
|
98
|
+
* Decorator-->>Caller: return result
|
|
99
|
+
* @category Method Decorators
|
|
100
|
+
*/
|
|
101
|
+
export function benchmark() {
|
|
102
|
+
return function benchmark(target, propertyKey, descriptor) {
|
|
103
|
+
if (!descriptor || typeof descriptor === "number")
|
|
104
|
+
throw new Error(`benchmark decoration only applies to methods`);
|
|
105
|
+
const logger = target instanceof LoggedClass
|
|
106
|
+
? target["log"].for(target[propertyKey])
|
|
107
|
+
: Logging.for(target).for(target[propertyKey]);
|
|
108
|
+
const originalMethod = descriptor.value;
|
|
109
|
+
descriptor.value = new Proxy(originalMethod, {
|
|
110
|
+
apply(fn, thisArg, args) {
|
|
111
|
+
const start = now();
|
|
45
112
|
try {
|
|
46
113
|
const result = Reflect.apply(fn, thisArg, args);
|
|
47
114
|
if (result instanceof Promise) {
|
|
48
115
|
return result.then((r) => {
|
|
49
|
-
|
|
50
|
-
method(`completed in ${Date.now() - start}ms`, verbosity);
|
|
116
|
+
logger.benchmark(`completed in ${now() - start}ms`);
|
|
51
117
|
return r;
|
|
52
118
|
});
|
|
53
119
|
}
|
|
54
|
-
|
|
55
|
-
method(`completed in ${Date.now() - start}ms`, verbosity);
|
|
120
|
+
logger.benchmark(`completed in ${now() - start}ms`);
|
|
56
121
|
return result;
|
|
57
122
|
}
|
|
58
123
|
catch (err) {
|
|
59
|
-
|
|
60
|
-
method(`failed in ${Date.now() - start}ms`, verbosity);
|
|
124
|
+
logger.benchmark(`failed in ${now() - start}ms`);
|
|
61
125
|
throw err;
|
|
62
126
|
}
|
|
63
127
|
},
|
|
64
128
|
});
|
|
129
|
+
return descriptor;
|
|
65
130
|
};
|
|
66
131
|
}
|
|
67
132
|
/**
|
|
68
|
-
* @description Method decorator for logging function calls with debug level
|
|
69
|
-
* @summary Convenience wrapper around
|
|
70
|
-
* @
|
|
71
|
-
* @return {Function} A method decorator that wraps the original method with debug logging
|
|
133
|
+
* @description Method decorator for logging function calls with debug level.
|
|
134
|
+
* @summary Convenience wrapper around {@link log} that logs using `LogLevel.debug`.
|
|
135
|
+
* @return {function(any, any, PropertyDescriptor): void} Debug-level logging decorator.
|
|
72
136
|
* @function debug
|
|
73
137
|
* @category Method Decorators
|
|
74
138
|
*/
|
|
75
|
-
export function debug(
|
|
76
|
-
return log(LogLevel.debug,
|
|
139
|
+
export function debug() {
|
|
140
|
+
return log(LogLevel.debug, 0, (...args) => `called with ${args}`, (e, result) => e
|
|
141
|
+
? `Failed with: ${e}`
|
|
142
|
+
: result
|
|
143
|
+
? `Completed with ${JSON.stringify(result)}`
|
|
144
|
+
: "completed");
|
|
77
145
|
}
|
|
78
146
|
/**
|
|
79
|
-
* @description Method decorator for logging function calls with info level
|
|
80
|
-
* @summary Convenience wrapper around
|
|
81
|
-
* @
|
|
82
|
-
* @return {Function} A method decorator that wraps the original method with info logging
|
|
147
|
+
* @description Method decorator for logging function calls with info level.
|
|
148
|
+
* @summary Convenience wrapper around {@link log} that logs using `LogLevel.info`.
|
|
149
|
+
* @return {function(any, any, PropertyDescriptor): void} Info-level logging decorator.
|
|
83
150
|
* @function info
|
|
84
151
|
* @category Method Decorators
|
|
85
152
|
*/
|
|
86
|
-
export function info(
|
|
87
|
-
return log(LogLevel.info
|
|
153
|
+
export function info() {
|
|
154
|
+
return log(LogLevel.info);
|
|
88
155
|
}
|
|
89
156
|
/**
|
|
90
|
-
* @description Method decorator for logging function calls with silly level
|
|
91
|
-
* @summary Convenience wrapper around
|
|
92
|
-
* @
|
|
93
|
-
* @return {Function} A method decorator that wraps the original method with silly logging
|
|
157
|
+
* @description Method decorator for logging function calls with silly level.
|
|
158
|
+
* @summary Convenience wrapper around {@link log} that logs using `LogLevel.silly`.
|
|
159
|
+
* @return {function(any, any, PropertyDescriptor): void} Silly-level logging decorator.
|
|
94
160
|
* @function silly
|
|
95
161
|
* @category Method Decorators
|
|
96
162
|
*/
|
|
97
|
-
export function silly(
|
|
98
|
-
return log(LogLevel.silly
|
|
163
|
+
export function silly() {
|
|
164
|
+
return log(LogLevel.silly);
|
|
99
165
|
}
|
|
100
166
|
/**
|
|
101
|
-
* @description Method decorator for logging function calls with verbose level
|
|
102
|
-
* @summary Convenience wrapper around
|
|
103
|
-
* @param {number} verbosity -
|
|
104
|
-
* @
|
|
105
|
-
* @return {Function} A method decorator that wraps the original method with verbose logging
|
|
167
|
+
* @description Method decorator for logging function calls with verbose level.
|
|
168
|
+
* @summary Convenience wrapper around {@link log} that logs using `LogLevel.verbose` with configurable verbosity and optional benchmarking.
|
|
169
|
+
* @param {number|boolean} verbosity - Verbosity level for log filtering or flag to enable benchmarking.
|
|
170
|
+
* @return {function(any, any,PropertyDescriptor): void} Verbose logging decorator.
|
|
106
171
|
* @function verbose
|
|
107
172
|
* @category Method Decorators
|
|
108
173
|
*/
|
|
109
|
-
export function verbose(verbosity = 0
|
|
110
|
-
if (
|
|
111
|
-
benchmark = verbosity;
|
|
174
|
+
export function verbose(verbosity = 0) {
|
|
175
|
+
if (!verbosity) {
|
|
112
176
|
verbosity = 0;
|
|
113
177
|
}
|
|
114
|
-
return log(LogLevel.verbose,
|
|
178
|
+
return log(LogLevel.verbose, verbosity);
|
|
115
179
|
}
|
|
116
180
|
/**
|
|
117
|
-
* @description Creates a decorator that makes a method non-configurable
|
|
118
|
-
* @summary
|
|
119
|
-
*
|
|
120
|
-
* @return {Function} A decorator function that can be applied to methods
|
|
181
|
+
* @description Creates a decorator that makes a method non-configurable.
|
|
182
|
+
* @summary Prevents overriding by marking the method descriptor as non-configurable, throwing if applied to non-method targets.
|
|
183
|
+
* @return {function(object, any, PropertyDescriptor): PropertyDescriptor|undefined} Decorator that hardens the method descriptor.
|
|
121
184
|
* @function final
|
|
122
185
|
* @category Method Decorators
|
|
123
186
|
*/
|
|
@@ -131,4 +194,4 @@ export function final() {
|
|
|
131
194
|
return descriptor;
|
|
132
195
|
};
|
|
133
196
|
}
|
|
134
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kZWNvcmF0b3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsdUJBQW9CO0FBQ3ZDLE9BQU8sRUFBRSxPQUFPLEVBQUUscUJBQWtCO0FBRXBDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4Qkc7QUFDSCxNQUFNLFVBQVUsR0FBRyxDQUNqQixRQUFrQixRQUFRLENBQUMsSUFBSSxFQUMvQixZQUFxQixLQUFLLEVBQzFCLFNBQVMsR0FBRyxDQUFDO0lBRWIsT0FBTyxVQUNMLE1BQVcsRUFDWCxXQUFpQixFQUNqQixVQUErQjtRQUUvQixJQUFJLENBQUMsVUFBVTtZQUNiLE1BQU0sSUFBSSxLQUFLLENBQUMsNENBQTRDLENBQUMsQ0FBQztRQUNoRSxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztRQUM1RCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBUSxDQUFDO1FBQ2pELE1BQU0sY0FBYyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUM7UUFFeEMsVUFBVSxDQUFDLEtBQUssR0FBRyxJQUFJLEtBQUssQ0FBQyxjQUFjLEVBQUU7WUFDM0MsS0FBSyxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBVztnQkFDNUIsTUFBTSxDQUFDLGVBQWUsSUFBSSxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUM7Z0JBQ3pDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDekIsSUFBSSxDQUFDO29CQUNILE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztvQkFDaEQsSUFBSSxNQUFNLFlBQVksT0FBTyxFQUFFLENBQUM7d0JBQzlCLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFOzRCQUM1QixJQUFJLFNBQVM7Z0NBQ1gsTUFBTSxDQUFDLGdCQUFnQixJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsS0FBSyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7NEJBQzVELE9BQU8sQ0FBQyxDQUFDO3dCQUNYLENBQUMsQ0FBQyxDQUFDO29CQUNMLENBQUM7b0JBQ0QsSUFBSSxTQUFTO3dCQUNYLE1BQU0sQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEtBQUssSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO29CQUM1RCxPQUFPLE1BQU0sQ0FBQztnQkFDaEIsQ0FBQztnQkFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO29CQUNiLElBQUksU0FBUzt3QkFBRSxNQUFNLENBQUMsYUFBYSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsS0FBSyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7b0JBQ3RFLE1BQU0sR0FBRyxDQUFDO2dCQUNaLENBQUM7WUFDSCxDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsS0FBSyxDQUFDLFlBQXFCLEtBQUs7SUFDOUMsT0FBTyxHQUFHLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztBQUN4QyxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxJQUFJLENBQUMsWUFBcUIsS0FBSztJQUM3QyxPQUFPLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQ3ZDLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLEtBQUssQ0FBQyxZQUFxQixLQUFLO0lBQzlDLE9BQU8sR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDeEMsQ0FBQztBQW9DRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxPQUFPLENBQUMsWUFBOEIsQ0FBQyxFQUFFLFNBQW1CO0lBQzFFLElBQUksT0FBTyxTQUFTLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDbkMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUN0QixTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBQ2hCLENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUNyRCxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxLQUFLO0lBQ25CLE9BQU8sQ0FDTCxNQUFjLEVBQ2QsV0FBaUIsRUFDakIsVUFBK0IsRUFDL0IsRUFBRTtRQUNGLElBQUksQ0FBQyxVQUFVO1lBQ2IsTUFBTSxJQUFJLEtBQUssQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDO1FBQ2pFLElBQUksVUFBVSxFQUFFLFlBQVksRUFBRSxDQUFDO1lBQzdCLFVBQVUsQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQ2xDLENBQUM7UUFDRCxPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTG9nTGV2ZWwgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IExvZ2dpbmcgfSBmcm9tIFwiLi9sb2dnaW5nXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE1ldGhvZCBkZWNvcmF0b3IgZm9yIGxvZ2dpbmcgZnVuY3Rpb24gY2FsbHNcbiAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBkZWNvcmF0b3IgdGhhdCBsb2dzIG1ldGhvZCBjYWxscyB3aXRoIHNwZWNpZmllZCBsZXZlbCwgYmVuY2htYXJraW5nLCBhbmQgdmVyYm9zaXR5XG4gKiBAcGFyYW0ge0xvZ0xldmVsfSBsZXZlbCAtIFRoZSBsb2cgbGV2ZWwgdG8gdXNlIChkZWZhdWx0OiBMb2dMZXZlbC5pbmZvKVxuICogQHBhcmFtIHtib29sZWFufSBbYmVuY2htYXJrPWZhbHNlXSAtIFdoZXRoZXIgdG8gbG9nIGV4ZWN1dGlvbiB0aW1lIChkZWZhdWx0OiBmYWxzZSlcbiAqIEBwYXJhbSB7bnVtYmVyfSBbdmVyYm9zaXR5PTBdIC0gVGhlIHZlcmJvc2l0eSBsZXZlbCBmb3IgdGhlIGxvZyBtZXNzYWdlcyAoZGVmYXVsdDogMClcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIG1ldGhvZCBkZWNvcmF0b3IgdGhhdCB3cmFwcyB0aGUgb3JpZ2luYWwgbWV0aG9kIHdpdGggbG9nZ2luZ1xuICogQGZ1bmN0aW9uIGxvZ1xuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgRGVjb3JhdG9yIGFzIGxvZyBkZWNvcmF0b3JcbiAqICAgcGFydGljaXBhbnQgTWV0aG9kIGFzIE9yaWdpbmFsIE1ldGhvZFxuICogICBwYXJ0aWNpcGFudCBMb2dnZXIgYXMgTG9nZ2luZyBpbnN0YW5jZVxuICpcbiAqICAgQ2xpZW50LT4+RGVjb3JhdG9yOiBjYWxsIGRlY29yYXRlZCBtZXRob2RcbiAqICAgRGVjb3JhdG9yLT4+TG9nZ2VyOiBsb2cgbWV0aG9kIGNhbGxcbiAqICAgRGVjb3JhdG9yLT4+TWV0aG9kOiBjYWxsIG9yaWdpbmFsIG1ldGhvZFxuICogICBhbHQgcmVzdWx0IGlzIFByb21pc2VcbiAqICAgICBNZXRob2QtLT4+RGVjb3JhdG9yOiByZXR1cm4gUHJvbWlzZVxuICogICAgIERlY29yYXRvci0+PkRlY29yYXRvcjogYXR0YWNoIHRoZW4gaGFuZGxlclxuICogICAgIE5vdGUgb3ZlciBEZWNvcmF0b3I6IFByb21pc2UgcmVzb2x2ZXNcbiAqICAgICBEZWNvcmF0b3ItPj5Mb2dnZXI6IGxvZyBiZW5jaG1hcmsgKGlmIGVuYWJsZWQpXG4gKiAgICAgRGVjb3JhdG9yLS0+PkNsaWVudDogcmV0dXJuIHJlc3VsdFxuICogICBlbHNlIHJlc3VsdCBpcyBub3QgUHJvbWlzZVxuICogICAgIE1ldGhvZC0tPj5EZWNvcmF0b3I6IHJldHVybiByZXN1bHRcbiAqICAgICBEZWNvcmF0b3ItPj5Mb2dnZXI6IGxvZyBiZW5jaG1hcmsgKGlmIGVuYWJsZWQpXG4gKiAgICAgRGVjb3JhdG9yLS0+PkNsaWVudDogcmV0dXJuIHJlc3VsdFxuICogICBlbmRcbiAqIEBjYXRlZ29yeSBNZXRob2QgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbG9nKFxuICBsZXZlbDogTG9nTGV2ZWwgPSBMb2dMZXZlbC5pbmZvLFxuICBiZW5jaG1hcms6IGJvb2xlYW4gPSBmYWxzZSxcbiAgdmVyYm9zaXR5ID0gMFxuKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoXG4gICAgdGFyZ2V0OiBhbnksXG4gICAgcHJvcGVydHlLZXk/OiBhbnksXG4gICAgZGVzY3JpcHRvcj86IFByb3BlcnR5RGVzY3JpcHRvclxuICApIHtcbiAgICBpZiAoIWRlc2NyaXB0b3IpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYExvZ2dpbmcgZGVjb3JhdGlvbiBvbmx5IGFwcGxpZXMgdG8gbWV0aG9kc2ApO1xuICAgIGNvbnN0IGxvZ2dlciA9IExvZ2dpbmcuZm9yKHRhcmdldCkuZm9yKHRhcmdldFtwcm9wZXJ0eUtleV0pO1xuICAgIGNvbnN0IG1ldGhvZCA9IGxvZ2dlcltsZXZlbF0uYmluZChsb2dnZXIpIGFzIGFueTtcbiAgICBjb25zdCBvcmlnaW5hbE1ldGhvZCA9IGRlc2NyaXB0b3IudmFsdWU7XG5cbiAgICBkZXNjcmlwdG9yLnZhbHVlID0gbmV3IFByb3h5KG9yaWdpbmFsTWV0aG9kLCB7XG4gICAgICBhcHBseShmbiwgdGhpc0FyZywgYXJnczogYW55W10pIHtcbiAgICAgICAgbWV0aG9kKGBjYWxsZWQgd2l0aCAke2FyZ3N9YCwgdmVyYm9zaXR5KTtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IFJlZmxlY3QuYXBwbHkoZm4sIHRoaXNBcmcsIGFyZ3MpO1xuICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LnRoZW4oKHI6IGFueSkgPT4ge1xuICAgICAgICAgICAgICBpZiAoYmVuY2htYXJrKVxuICAgICAgICAgICAgICAgIG1ldGhvZChgY29tcGxldGVkIGluICR7RGF0ZS5ub3coKSAtIHN0YXJ0fW1zYCwgdmVyYm9zaXR5KTtcbiAgICAgICAgICAgICAgcmV0dXJuIHI7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGJlbmNobWFyaylcbiAgICAgICAgICAgIG1ldGhvZChgY29tcGxldGVkIGluICR7RGF0ZS5ub3coKSAtIHN0YXJ0fW1zYCwgdmVyYm9zaXR5KTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBpZiAoYmVuY2htYXJrKSBtZXRob2QoYGZhaWxlZCBpbiAke0RhdGUubm93KCkgLSBzdGFydH1tc2AsIHZlcmJvc2l0eSk7XG4gICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pO1xuICB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBNZXRob2QgZGVjb3JhdG9yIGZvciBsb2dnaW5nIGZ1bmN0aW9uIGNhbGxzIHdpdGggZGVidWcgbGV2ZWxcbiAqIEBzdW1tYXJ5IENvbnZlbmllbmNlIHdyYXBwZXIgYXJvdW5kIHRoZSBsb2cgZGVjb3JhdG9yIHRoYXQgdXNlcyBMb2dMZXZlbC5kZWJ1Z1xuICogQHBhcmFtIHtib29sZWFufSBbYmVuY2htYXJrPWZhbHNlXSAtIFdoZXRoZXIgdG8gbG9nIGV4ZWN1dGlvbiB0aW1lIChkZWZhdWx0OiBmYWxzZSlcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIG1ldGhvZCBkZWNvcmF0b3IgdGhhdCB3cmFwcyB0aGUgb3JpZ2luYWwgbWV0aG9kIHdpdGggZGVidWcgbG9nZ2luZ1xuICogQGZ1bmN0aW9uIGRlYnVnXG4gKiBAY2F0ZWdvcnkgTWV0aG9kIERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlYnVnKGJlbmNobWFyazogYm9vbGVhbiA9IGZhbHNlKSB7XG4gIHJldHVybiBsb2coTG9nTGV2ZWwuZGVidWcsIGJlbmNobWFyayk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE1ldGhvZCBkZWNvcmF0b3IgZm9yIGxvZ2dpbmcgZnVuY3Rpb24gY2FsbHMgd2l0aCBpbmZvIGxldmVsXG4gKiBAc3VtbWFyeSBDb252ZW5pZW5jZSB3cmFwcGVyIGFyb3VuZCB0aGUgbG9nIGRlY29yYXRvciB0aGF0IHVzZXMgTG9nTGV2ZWwuaW5mb1xuICogQHBhcmFtIHtib29sZWFufSBbYmVuY2htYXJrPWZhbHNlXSAtIFdoZXRoZXIgdG8gbG9nIGV4ZWN1dGlvbiB0aW1lIChkZWZhdWx0OiBmYWxzZSlcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIG1ldGhvZCBkZWNvcmF0b3IgdGhhdCB3cmFwcyB0aGUgb3JpZ2luYWwgbWV0aG9kIHdpdGggaW5mbyBsb2dnaW5nXG4gKiBAZnVuY3Rpb24gaW5mb1xuICogQGNhdGVnb3J5IE1ldGhvZCBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmZvKGJlbmNobWFyazogYm9vbGVhbiA9IGZhbHNlKSB7XG4gIHJldHVybiBsb2coTG9nTGV2ZWwuaW5mbywgYmVuY2htYXJrKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTWV0aG9kIGRlY29yYXRvciBmb3IgbG9nZ2luZyBmdW5jdGlvbiBjYWxscyB3aXRoIHNpbGx5IGxldmVsXG4gKiBAc3VtbWFyeSBDb252ZW5pZW5jZSB3cmFwcGVyIGFyb3VuZCB0aGUgbG9nIGRlY29yYXRvciB0aGF0IHVzZXMgTG9nTGV2ZWwuc2lsbHlcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2JlbmNobWFyaz1mYWxzZV0gLSBXaGV0aGVyIHRvIGxvZyBleGVjdXRpb24gdGltZSAoZGVmYXVsdDogZmFsc2UpXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBtZXRob2QgZGVjb3JhdG9yIHRoYXQgd3JhcHMgdGhlIG9yaWdpbmFsIG1ldGhvZCB3aXRoIHNpbGx5IGxvZ2dpbmdcbiAqIEBmdW5jdGlvbiBzaWxseVxuICogQGNhdGVnb3J5IE1ldGhvZCBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaWxseShiZW5jaG1hcms6IGJvb2xlYW4gPSBmYWxzZSkge1xuICByZXR1cm4gbG9nKExvZ0xldmVsLnNpbGx5LCBiZW5jaG1hcmspO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBNZXRob2QgZGVjb3JhdG9yIGZvciBsb2dnaW5nIGZ1bmN0aW9uIGNhbGxzIHdpdGggdmVyYm9zZSBsZXZlbFxuICogQHN1bW1hcnkgQ29udmVuaWVuY2Ugd3JhcHBlciBhcm91bmQgdGhlIGxvZyBkZWNvcmF0b3IgdGhhdCB1c2VzIExvZ0xldmVsLnZlcmJvc2Ugd2l0aCBjb25maWd1cmFibGUgdmVyYm9zaXR5XG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBtZXRob2QgZGVjb3JhdG9yIHRoYXQgd3JhcHMgdGhlIG9yaWdpbmFsIG1ldGhvZCB3aXRoIHZlcmJvc2UgbG9nZ2luZ1xuICogQGZ1bmN0aW9uIHZlcmJvc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZlcmJvc2UoKTogKFxuICB0YXJnZXQ6IGFueSxcbiAgcHJvcGVydHlLZXk/OiBhbnksXG4gIGRlc2NyaXB0b3I/OiBhbnlcbikgPT4gdm9pZDtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTWV0aG9kIGRlY29yYXRvciBmb3IgbG9nZ2luZyBmdW5jdGlvbiBjYWxscyB3aXRoIHZlcmJvc2UgbGV2ZWxcbiAqIEBzdW1tYXJ5IENvbnZlbmllbmNlIHdyYXBwZXIgYXJvdW5kIHRoZSBsb2cgZGVjb3JhdG9yIHRoYXQgdXNlcyBMb2dMZXZlbC52ZXJib3NlIHdpdGggY29uZmlndXJhYmxlIHZlcmJvc2l0eVxuICogQHBhcmFtIHtib29sZWFufSBiZW5jaG1hcmsgLSBXaGV0aGVyIHRvIGxvZyBleGVjdXRpb24gdGltZVxuICogQHJldHVybiB7RnVuY3Rpb259IEEgbWV0aG9kIGRlY29yYXRvciB0aGF0IHdyYXBzIHRoZSBvcmlnaW5hbCBtZXRob2Qgd2l0aCB2ZXJib3NlIGxvZ2dpbmdcbiAqIEBmdW5jdGlvbiB2ZXJib3NlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2ZXJib3NlKFxuICBiZW5jaG1hcms6IGJvb2xlYW5cbik6ICh0YXJnZXQ6IGFueSwgcHJvcGVydHlLZXk/OiBhbnksIGRlc2NyaXB0b3I/OiBhbnkpID0+IHZvaWQ7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE1ldGhvZCBkZWNvcmF0b3IgZm9yIGxvZ2dpbmcgZnVuY3Rpb24gY2FsbHMgd2l0aCB2ZXJib3NlIGxldmVsXG4gKiBAc3VtbWFyeSBDb252ZW5pZW5jZSB3cmFwcGVyIGFyb3VuZCB0aGUgbG9nIGRlY29yYXRvciB0aGF0IHVzZXMgTG9nTGV2ZWwudmVyYm9zZSB3aXRoIGNvbmZpZ3VyYWJsZSB2ZXJib3NpdHlcbiAqIEBwYXJhbSB7bnVtYmVyfSB2ZXJib3NpdHkgLSBUaGUgdmVyYm9zaXR5IGxldmVsIGZvciB0aGUgbG9nIG1lc3NhZ2VzIChkZWZhdWx0OiAwKVxuICogQHJldHVybiB7RnVuY3Rpb259IEEgbWV0aG9kIGRlY29yYXRvciB0aGF0IHdyYXBzIHRoZSBvcmlnaW5hbCBtZXRob2Qgd2l0aCB2ZXJib3NlIGxvZ2dpbmdcbiAqIEBmdW5jdGlvbiB2ZXJib3NlXG4gKiBAY2F0ZWdvcnkgTWV0aG9kIERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZlcmJvc2UoXG4gIHZlcmJvc2l0eTogbnVtYmVyIHwgYm9vbGVhblxuKTogKHRhcmdldDogYW55LCBwcm9wZXJ0eUtleT86IGFueSwgZGVzY3JpcHRvcj86IGFueSkgPT4gdm9pZDtcbi8qKlxuICogQGRlc2NyaXB0aW9uIE1ldGhvZCBkZWNvcmF0b3IgZm9yIGxvZ2dpbmcgZnVuY3Rpb24gY2FsbHMgd2l0aCB2ZXJib3NlIGxldmVsXG4gKiBAc3VtbWFyeSBDb252ZW5pZW5jZSB3cmFwcGVyIGFyb3VuZCB0aGUgbG9nIGRlY29yYXRvciB0aGF0IHVzZXMgTG9nTGV2ZWwudmVyYm9zZSB3aXRoIGNvbmZpZ3VyYWJsZSB2ZXJib3NpdHlcbiAqIEBwYXJhbSB7bnVtYmVyfSB2ZXJib3NpdHkgLSBUaGUgdmVyYm9zaXR5IGxldmVsIGZvciB0aGUgbG9nIG1lc3NhZ2VzIChkZWZhdWx0OiAwKVxuICogQHBhcmFtIHtib29sZWFufSBbYmVuY2htYXJrPWZhbHNlXSAtIFdoZXRoZXIgdG8gbG9nIGV4ZWN1dGlvbiB0aW1lIChkZWZhdWx0OiBmYWxzZSlcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIG1ldGhvZCBkZWNvcmF0b3IgdGhhdCB3cmFwcyB0aGUgb3JpZ2luYWwgbWV0aG9kIHdpdGggdmVyYm9zZSBsb2dnaW5nXG4gKiBAZnVuY3Rpb24gdmVyYm9zZVxuICogQGNhdGVnb3J5IE1ldGhvZCBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2ZXJib3NlKHZlcmJvc2l0eTogbnVtYmVyIHwgYm9vbGVhbiA9IDAsIGJlbmNobWFyaz86IGJvb2xlYW4pIHtcbiAgaWYgKHR5cGVvZiB2ZXJib3NpdHkgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgYmVuY2htYXJrID0gdmVyYm9zaXR5O1xuICAgIHZlcmJvc2l0eSA9IDA7XG4gIH1cbiAgcmV0dXJuIGxvZyhMb2dMZXZlbC52ZXJib3NlLCBiZW5jaG1hcmssIHZlcmJvc2l0eSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBkZWNvcmF0b3IgdGhhdCBtYWtlcyBhIG1ldGhvZCBub24tY29uZmlndXJhYmxlXG4gKiBAc3VtbWFyeSBUaGlzIGRlY29yYXRvciBwcmV2ZW50cyBhIG1ldGhvZCBmcm9tIGJlaW5nIG92ZXJyaWRkZW4gYnkgbWFraW5nIGl0IG5vbi1jb25maWd1cmFibGUuXG4gKiBJdCB0aHJvd3MgYW4gZXJyb3IgaWYgdXNlZCBvbiBhbnl0aGluZyBvdGhlciB0aGFuIGEgbWV0aG9kLlxuICogQHJldHVybiB7RnVuY3Rpb259IEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gbWV0aG9kc1xuICogQGZ1bmN0aW9uIGZpbmFsXG4gKiBAY2F0ZWdvcnkgTWV0aG9kIERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmFsKCkge1xuICByZXR1cm4gKFxuICAgIHRhcmdldDogb2JqZWN0LFxuICAgIHByb3BlcnR5S2V5PzogYW55LFxuICAgIGRlc2NyaXB0b3I/OiBQcm9wZXJ0eURlc2NyaXB0b3JcbiAgKSA9PiB7XG4gICAgaWYgKCFkZXNjcmlwdG9yKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZmluYWwgZGVjb3JhdG9yIGNhbiBvbmx5IGJlIHVzZWQgb24gbWV0aG9kc1wiKTtcbiAgICBpZiAoZGVzY3JpcHRvcj8uY29uZmlndXJhYmxlKSB7XG4gICAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgfTtcbn1cbiJdfQ==
|
|
197
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kZWNvcmF0b3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsdUJBQW9CO0FBQ3ZDLE9BQU8sRUFBRSxPQUFPLEVBQUUscUJBQWtCO0FBQ3BDLE9BQU8sRUFBRSxHQUFHLEVBQUUsa0JBQWU7QUFDN0IsT0FBTyxFQUFFLFdBQVcsRUFBRSx5QkFBc0I7QUFNNUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0ErQkc7QUFDSCxNQUFNLFVBQVUsR0FBRyxDQUNqQixRQUFrQixRQUFRLENBQUMsSUFBSSxFQUMvQixTQUFTLEdBQUcsQ0FBQyxFQUNiLGVBQWtDLENBQUMsR0FBRyxJQUFXLEVBQUUsRUFBRSxDQUFDLGVBQWUsSUFBSSxFQUFFLEVBQzNFLFdBQWtDO0lBRWxDLE9BQU8sU0FBUyxHQUFHLENBQUMsTUFBVyxFQUFFLFdBQWlCLEVBQUUsVUFBZ0I7UUFDbEUsSUFBSSxDQUFDLFVBQVUsSUFBSSxPQUFPLFVBQVUsS0FBSyxRQUFRO1lBQy9DLE1BQU0sSUFBSSxLQUFLLENBQUMsNENBQTRDLENBQUMsQ0FBQztRQUNoRSxNQUFNLE1BQU0sR0FDVixNQUFNLFlBQVksV0FBVztZQUMzQixDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsV0FBa0MsQ0FBQyxDQUFDO1lBQy9ELENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztRQUNuRCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBUSxDQUFDO1FBQ2pELE1BQU0sY0FBYyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUM7UUFFeEMsVUFBVSxDQUFDLEtBQUss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QUM7SUFDRCxPQUFPLEdBQUcsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLFNBQW1CLENBQUMsQ0FBQztBQUNwRCxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLEtBQUs7SUFDbkIsT0FBTyxDQUFDLE1BQWMsRUFBRSxXQUFpQixFQUFFLFVBQWdCLEVBQUUsRUFBRTtRQUM3RCxJQUFJLENBQUMsVUFBVTtZQUNiLE1BQU0sSUFBSSxLQUFLLENBQUMsNkNBQTZDLENBQUMsQ0FBQztRQUNqRSxJQUFJLFVBQVUsRUFBRSxZQUFZLEVBQUUsQ0FBQztZQUM3QixVQUFVLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztRQUNsQyxDQUFDO1FBQ0QsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExvZ0xldmVsIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBMb2dnaW5nIH0gZnJvbSBcIi4vbG9nZ2luZ1wiO1xuaW1wb3J0IHsgbm93IH0gZnJvbSBcIi4vdGltZVwiO1xuaW1wb3J0IHsgTG9nZ2VkQ2xhc3MgfSBmcm9tIFwiLi9Mb2dnZWRDbGFzc1wiO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuZXhwb3J0IHR5cGUgQXJnRm9ybWF0RnVuY3Rpb24gPSAoLi4uYXJnczogYW55W10pID0+IHN0cmluZztcbmV4cG9ydCB0eXBlIFJldHVybkZvcm1hdEZ1bmN0aW9uID0gKGU/OiBFcnJvciwgcmVzdWx0PzogYW55KSA9PiBzdHJpbmc7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE1ldGhvZCBkZWNvcmF0b3IgZm9yIGxvZ2dpbmcgZnVuY3Rpb24gY2FsbHMuXG4gKiBAc3VtbWFyeSBXcmFwcyBjbGFzcyBtZXRob2RzIHRvIGF1dG9tYXRpY2FsbHkgbG9nIGVudHJ5LCBleGl0LCB0aW1pbmcsIGFuZCBvcHRpb25hbCBjdXN0b20gbWVzc2FnZXMgYXQgYSBjb25maWd1cmFibGUge0BsaW5rIExvZ0xldmVsfS5cbiAqIEBwYXJhbSB7TG9nTGV2ZWx9IGxldmVsIC0gTG9nIGxldmVsIGFwcGxpZWQgdG8gdGhlIGdlbmVyYXRlZCBsb2cgc3RhdGVtZW50cyAoZGVmYXVsdHMgdG8gYExvZ0xldmVsLmluZm9gKS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbdmVyYm9zaXR5PTBdIC0gVmVyYm9zaXR5IHRocmVzaG9sZCByZXF1aXJlZCBmb3IgdGhlIGVudHJ5IGxvZyB0byBhcHBlYXIuXG4gKiBAcGFyYW0ge0FyZ0Zvcm1hdEZ1bmN0aW9ufSBbZW50cnlNZXNzYWdlXSAtIEZvcm1hdHRlciBpbnZva2VkIHdpdGggdGhlIG9yaWdpbmFsIG1ldGhvZCBhcmd1bWVudHMgdG8gZGVzY3JpYmUgdGhlIGludm9jYXRpb24uXG4gKiBAcGFyYW0ge1JldHVybkZvcm1hdEZ1bmN0aW9ufSBbZXhpdE1lc3NhZ2VdIC0gT3B0aW9uYWwgZm9ybWF0dGVyIHRoYXQgZGVzY3JpYmVzIHRoZSBvdXRjb21lIG9yIGZhaWx1cmUgb2YgdGhlIGNhbGwuXG4gKiBAcmV0dXJuIHtmdW5jdGlvbihhbnksIGFueSwgUHJvcGVydHlEZXNjcmlwdG9yKTogdm9pZH0gTWV0aG9kIGRlY29yYXRvciBwcm94eSB0aGF0IGluamVjdHMgbG9nZ2luZyBiZWhhdmlvci5cbiAqIEBmdW5jdGlvbiBsb2dcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IERlY29yYXRvciBhcyBsb2cgZGVjb3JhdG9yXG4gKiAgIHBhcnRpY2lwYW50IE1ldGhvZCBhcyBPcmlnaW5hbCBNZXRob2RcbiAqICAgcGFydGljaXBhbnQgTG9nZ2VyIGFzIExvZ2dpbmcgaW5zdGFuY2VcbiAqXG4gKiAgIENsaWVudC0+PkRlY29yYXRvcjogY2FsbCBkZWNvcmF0ZWQgbWV0aG9kXG4gKiAgIERlY29yYXRvci0+PkxvZ2dlcjogbG9nIG1ldGhvZCBjYWxsXG4gKiAgIERlY29yYXRvci0+Pk1ldGhvZDogY2FsbCBvcmlnaW5hbCBtZXRob2RcbiAqICAgYWx0IHJlc3VsdCBpcyBQcm9taXNlXG4gKiAgICAgTWV0aG9kLS0+PkRlY29yYXRvcjogcmV0dXJuIFByb21pc2VcbiAqICAgICBEZWNvcmF0b3ItPj5EZWNvcmF0b3I6IGF0dGFjaCB0aGVuIGhhbmRsZXJcbiAqICAgICBOb3RlIG92ZXIgRGVjb3JhdG9yOiBQcm9taXNlIHJlc29sdmVzXG4gKiAgICAgRGVjb3JhdG9yLT4+TG9nZ2VyOiBsb2cgYmVuY2htYXJrIChpZiBlbmFibGVkKVxuICogICAgIERlY29yYXRvci0tPj5DbGllbnQ6IHJldHVybiByZXN1bHRcbiAqICAgZWxzZSByZXN1bHQgaXMgbm90IFByb21pc2VcbiAqICAgICBNZXRob2QtLT4+RGVjb3JhdG9yOiByZXR1cm4gcmVzdWx0XG4gKiAgICAgRGVjb3JhdG9yLT4+TG9nZ2VyOiBsb2cgYmVuY2htYXJrIChpZiBlbmFibGVkKVxuICogICAgIERlY29yYXRvci0tPj5DbGllbnQ6IHJldHVybiByZXN1bHRcbiAqICAgZW5kXG4gKiBAY2F0ZWdvcnkgTWV0aG9kIERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvZyhcbiAgbGV2ZWw6IExvZ0xldmVsID0gTG9nTGV2ZWwuaW5mbyxcbiAgdmVyYm9zaXR5ID0gMCxcbiAgZW50cnlNZXNzYWdlOiBBcmdGb3JtYXRGdW5jdGlvbiA9ICguLi5hcmdzOiBhbnlbXSkgPT4gYGNhbGxlZCB3aXRoICR7YXJnc31gLFxuICBleGl0TWVzc2FnZT86IFJldHVybkZvcm1hdEZ1bmN0aW9uXG4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGxvZyh0YXJnZXQ6IGFueSwgcHJvcGVydHlLZXk/OiBhbnksIGRlc2NyaXB0b3I/OiBhbnkpIHtcbiAgICBpZiAoIWRlc2NyaXB0b3IgfHwgdHlwZW9mIGRlc2NyaXB0b3IgPT09IFwibnVtYmVyXCIpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYExvZ2dpbmcgZGVjb3JhdGlvbiBvbmx5IGFwcGxpZXMgdG8gbWV0aG9kc2ApO1xuICAgIGNvbnN0IGxvZ2dlcjogTG9nZ2VyID1cbiAgICAgIHRhcmdldCBpbnN0YW5jZW9mIExvZ2dlZENsYXNzXG4gICAgICAgID8gdGFyZ2V0W1wibG9nXCJdLmZvcih0YXJnZXRbcHJvcGVydHlLZXkgYXMga2V5b2YgdHlwZW9mIHRhcmdldF0pXG4gICAgICAgIDogTG9nZ2luZy5mb3IodGFyZ2V0KS5mb3IodGFyZ2V0W3Byb3BlcnR5S2V5XSk7XG4gICAgY29uc3QgbWV0aG9kID0gbG9nZ2VyW2xldmVsXS5iaW5kKGxvZ2dlcikgYXMgYW55O1xuICAgIGNvbnN0IG9yaWdpbmFsTWV0aG9kID0gZGVzY3JpcHRvci52YWx1ZTtcblxuICAgIGRlc2NyaXB0b3IudmFsdWUgPSBuZXcgUHJveHkob3JpZ2luYWxNZXRob2QsIHtcbiAgICAgIGFwcGx5KGZuLCB0aGlzQXJnLCBhcmdzOiBhbnlbXSkge1xuICAgICAgICBtZXRob2QoZW50cnlNZXNzYWdlKC4uLmFyZ3MpLCB2ZXJib3NpdHkpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IFJlZmxlY3QuYXBwbHkoZm4sIHRoaXNBcmcsIGFyZ3MpO1xuICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICAgICAgICAgIC50aGVuKChyOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXhpdE1lc3NhZ2UpIG1ldGhvZChleGl0TWVzc2FnZSh1bmRlZmluZWQsIHIpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGV4aXRNZXNzYWdlKSBsb2dnZXIuZXJyb3IoZXhpdE1lc3NhZ2UoZSBhcyBFcnJvcikpO1xuICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZXhpdE1lc3NhZ2UpIG1ldGhvZChleGl0TWVzc2FnZSh1bmRlZmluZWQsIHJlc3VsdCkpO1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0gY2F0Y2ggKGVycjogdW5rbm93bikge1xuICAgICAgICAgIGlmIChleGl0TWVzc2FnZSkgbG9nZ2VyLmVycm9yKGV4aXRNZXNzYWdlKGVyciBhcyBFcnJvcikpO1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9KTtcbiAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTWV0aG9kIGRlY29yYXRvciB0aGF0IHJlY29yZHMgZXhlY3V0aW9uIHRpbWUgYXQgdGhlIGJlbmNobWFyayBsZXZlbC5cbiAqIEBzdW1tYXJ5IFdyYXBzIHRoZSB0YXJnZXQgbWV0aG9kIHRvIGVtaXQge0BsaW5rIExvZ2dlci5iZW5jaG1hcmt9IGVudHJpZXMgY2FwdHVyaW5nIGNvbXBsZXRpb24gdGltZSBvciBmYWlsdXJlIGxhdGVuY3kuXG4gKiBAcmV0dXJuIHtmdW5jdGlvbihhbnksIGFueSwgIFByb3BlcnR5RGVzY3JpcHRvcik6IHZvaWR9IE1ldGhvZCBkZWNvcmF0b3IgcHJveHkgdGhhdCBiZW5jaG1hcmtzIHRoZSBvcmlnaW5hbCBpbXBsZW1lbnRhdGlvbi5cbiAqIEBmdW5jdGlvbiBiZW5jaG1hcmtcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IERlY29yYXRvciBhcyBiZW5jaG1hcmtcbiAqICAgcGFydGljaXBhbnQgTWV0aG9kIGFzIE9yaWdpbmFsIE1ldGhvZFxuICogICBDYWxsZXItPj5EZWNvcmF0b3I6IGludm9rZSgpXG4gKiAgIERlY29yYXRvci0+Pk1ldGhvZDogUmVmbGVjdC5hcHBseSguLi4pXG4gKiAgIGFsdCBQcm9taXNlIHJlc3VsdFxuICogICAgIE1ldGhvZC0tPj5EZWNvcmF0b3I6IFByb21pc2VcbiAqICAgICBEZWNvcmF0b3ItPj5EZWNvcmF0b3I6IGF0dGFjaCB0aGVuKClcbiAqICAgICBEZWNvcmF0b3ItPj5EZWNvcmF0b3I6IGxvZyBjb21wbGV0aW9uIGR1cmF0aW9uXG4gKiAgIGVsc2UgU3luY2hyb25vdXMgcmVzdWx0XG4gKiAgICAgTWV0aG9kLS0+PkRlY29yYXRvcjogdmFsdWVcbiAqICAgICBEZWNvcmF0b3ItPj5EZWNvcmF0b3I6IGxvZyBjb21wbGV0aW9uIGR1cmF0aW9uXG4gKiAgIGVuZFxuICogICBEZWNvcmF0b3ItLT4+Q2FsbGVyOiByZXR1cm4gcmVzdWx0XG4gKiBAY2F0ZWdvcnkgTWV0aG9kIERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJlbmNobWFyaygpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGJlbmNobWFyayh0YXJnZXQ6IGFueSwgcHJvcGVydHlLZXk/OiBhbnksIGRlc2NyaXB0b3I/OiBhbnkpIHtcbiAgICBpZiAoIWRlc2NyaXB0b3IgfHwgdHlwZW9mIGRlc2NyaXB0b3IgPT09IFwibnVtYmVyXCIpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGJlbmNobWFyayBkZWNvcmF0aW9uIG9ubHkgYXBwbGllcyB0byBtZXRob2RzYCk7XG4gICAgY29uc3QgbG9nZ2VyOiBMb2dnZXIgPVxuICAgICAgdGFyZ2V0IGluc3RhbmNlb2YgTG9nZ2VkQ2xhc3NcbiAgICAgICAgPyB0YXJnZXRbXCJsb2dcIl0uZm9yKHRhcmdldFtwcm9wZXJ0eUtleSBhcyBrZXlvZiB0eXBlb2YgdGFyZ2V0XSlcbiAgICAgICAgOiBMb2dnaW5nLmZvcih0YXJnZXQpLmZvcih0YXJnZXRbcHJvcGVydHlLZXldKTtcbiAgICBjb25zdCBvcmlnaW5hbE1ldGhvZCA9IGRlc2NyaXB0b3IudmFsdWU7XG5cbiAgICBkZXNjcmlwdG9yLnZhbHVlID0gbmV3IFByb3h5KG9yaWdpbmFsTWV0aG9kLCB7XG4gICAgICBhcHBseShmbiwgdGhpc0FyZywgYXJnczogYW55W10pIHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBub3coKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBSZWZsZWN0LmFwcGx5KGZuLCB0aGlzQXJnLCBhcmdzKTtcbiAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC50aGVuKChyOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgbG9nZ2VyLmJlbmNobWFyayhgY29tcGxldGVkIGluICR7bm93KCkgLSBzdGFydH1tc2ApO1xuICAgICAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsb2dnZXIuYmVuY2htYXJrKGBjb21wbGV0ZWQgaW4gJHtub3coKSAtIHN0YXJ0fW1zYCk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSBjYXRjaCAoZXJyOiB1bmtub3duKSB7XG4gICAgICAgICAgbG9nZ2VyLmJlbmNobWFyayhgZmFpbGVkIGluICR7bm93KCkgLSBzdGFydH1tc2ApO1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBNZXRob2QgZGVjb3JhdG9yIGZvciBsb2dnaW5nIGZ1bmN0aW9uIGNhbGxzIHdpdGggZGVidWcgbGV2ZWwuXG4gKiBAc3VtbWFyeSBDb252ZW5pZW5jZSB3cmFwcGVyIGFyb3VuZCB7QGxpbmsgbG9nfSB0aGF0IGxvZ3MgdXNpbmcgYExvZ0xldmVsLmRlYnVnYC5cbiAqIEByZXR1cm4ge2Z1bmN0aW9uKGFueSwgYW55LCBQcm9wZXJ0eURlc2NyaXB0b3IpOiB2b2lkfSBEZWJ1Zy1sZXZlbCBsb2dnaW5nIGRlY29yYXRvci5cbiAqIEBmdW5jdGlvbiBkZWJ1Z1xuICogQGNhdGVnb3J5IE1ldGhvZCBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWJ1ZygpIHtcbiAgcmV0dXJuIGxvZyhcbiAgICBMb2dMZXZlbC5kZWJ1ZyxcbiAgICAwLFxuICAgICguLi5hcmdzOiBhbnlbXSkgPT4gYGNhbGxlZCB3aXRoICR7YXJnc31gLFxuICAgIChlPzogRXJyb3IsIHJlc3VsdD86IGFueSkgPT5cbiAgICAgIGVcbiAgICAgICAgPyBgRmFpbGVkIHdpdGg6ICR7ZX1gXG4gICAgICAgIDogcmVzdWx0XG4gICAgICAgICAgPyBgQ29tcGxldGVkIHdpdGggJHtKU09OLnN0cmluZ2lmeShyZXN1bHQpfWBcbiAgICAgICAgICA6IFwiY29tcGxldGVkXCJcbiAgKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTWV0aG9kIGRlY29yYXRvciBmb3IgbG9nZ2luZyBmdW5jdGlvbiBjYWxscyB3aXRoIGluZm8gbGV2ZWwuXG4gKiBAc3VtbWFyeSBDb252ZW5pZW5jZSB3cmFwcGVyIGFyb3VuZCB7QGxpbmsgbG9nfSB0aGF0IGxvZ3MgdXNpbmcgYExvZ0xldmVsLmluZm9gLlxuICogQHJldHVybiB7ZnVuY3Rpb24oYW55LCBhbnksIFByb3BlcnR5RGVzY3JpcHRvcik6IHZvaWR9IEluZm8tbGV2ZWwgbG9nZ2luZyBkZWNvcmF0b3IuXG4gKiBAZnVuY3Rpb24gaW5mb1xuICogQGNhdGVnb3J5IE1ldGhvZCBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmZvKCkge1xuICByZXR1cm4gbG9nKExvZ0xldmVsLmluZm8pO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBNZXRob2QgZGVjb3JhdG9yIGZvciBsb2dnaW5nIGZ1bmN0aW9uIGNhbGxzIHdpdGggc2lsbHkgbGV2ZWwuXG4gKiBAc3VtbWFyeSBDb252ZW5pZW5jZSB3cmFwcGVyIGFyb3VuZCB7QGxpbmsgbG9nfSB0aGF0IGxvZ3MgdXNpbmcgYExvZ0xldmVsLnNpbGx5YC5cbiAqIEByZXR1cm4ge2Z1bmN0aW9uKGFueSwgYW55LCBQcm9wZXJ0eURlc2NyaXB0b3IpOiB2b2lkfSBTaWxseS1sZXZlbCBsb2dnaW5nIGRlY29yYXRvci5cbiAqIEBmdW5jdGlvbiBzaWxseVxuICogQGNhdGVnb3J5IE1ldGhvZCBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaWxseSgpIHtcbiAgcmV0dXJuIGxvZyhMb2dMZXZlbC5zaWxseSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE1ldGhvZCBkZWNvcmF0b3IgZm9yIGxvZ2dpbmcgZnVuY3Rpb24gY2FsbHMgd2l0aCB2ZXJib3NlIGxldmVsLlxuICogQHN1bW1hcnkgQ29udmVuaWVuY2Ugd3JhcHBlciBhcm91bmQge0BsaW5rIGxvZ30gdGhhdCBsb2dzIHVzaW5nIGBMb2dMZXZlbC52ZXJib3NlYCB3aXRoIGNvbmZpZ3VyYWJsZSB2ZXJib3NpdHkuXG4gKiBAcmV0dXJuIHtmdW5jdGlvbihhbnksIGFueSwgUHJvcGVydHlEZXNjcmlwdG9yKTogdm9pZH0gVmVyYm9zZSBsb2dnaW5nIGRlY29yYXRvci5cbiAqIEBmdW5jdGlvbiB2ZXJib3NlXG4gKiBAY2F0ZWdvcnkgTWV0aG9kIERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZlcmJvc2UoKTogKFxuICB0YXJnZXQ6IGFueSxcbiAgcHJvcGVydHlLZXk/OiBhbnksXG4gIGRlc2NyaXB0b3I/OiBhbnlcbikgPT4gdm9pZDtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTWV0aG9kIGRlY29yYXRvciBmb3IgbG9nZ2luZyBmdW5jdGlvbiBjYWxscyB3aXRoIHZlcmJvc2UgbGV2ZWwuXG4gKiBAc3VtbWFyeSBDb252ZW5pZW5jZSB3cmFwcGVyIGFyb3VuZCB7QGxpbmsgbG9nfSB0aGF0IGxvZ3MgdXNpbmcgYExvZ0xldmVsLnZlcmJvc2VgIHdoaWxlIHRvZ2dsaW5nIGJlbmNobWFya2luZy5cbiAqIEByZXR1cm4ge2Z1bmN0aW9uKGFueSwgUHJvcGVydHlEZXNjcmlwdG9yKTogdm9pZH0gVmVyYm9zZSBsb2dnaW5nIGRlY29yYXRvci5cbiAqIEBmdW5jdGlvbiB2ZXJib3NlXG4gKiBAY2F0ZWdvcnkgTWV0aG9kIERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZlcmJvc2UoKTogKFxuICB0YXJnZXQ6IGFueSxcbiAgcHJvcGVydHlLZXk/OiBhbnksXG4gIGRlc2NyaXB0b3I/OiBhbnlcbikgPT4gdm9pZDtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTWV0aG9kIGRlY29yYXRvciBmb3IgbG9nZ2luZyBmdW5jdGlvbiBjYWxscyB3aXRoIHZlcmJvc2UgbGV2ZWwuXG4gKiBAc3VtbWFyeSBDb252ZW5pZW5jZSB3cmFwcGVyIGFyb3VuZCB7QGxpbmsgbG9nfSB0aGF0IGxvZ3MgdXNpbmcgYExvZ0xldmVsLnZlcmJvc2VgIHdpdGggY29uZmlndXJhYmxlIHZlcmJvc2l0eSBhbmQgb3B0aW9uYWwgYmVuY2htYXJraW5nLlxuICogQHBhcmFtIHtudW1iZXJ8Ym9vbGVhbn0gdmVyYm9zaXR5IC0gVmVyYm9zaXR5IGxldmVsIGZvciBsb2cgZmlsdGVyaW5nIG9yIGZsYWcgdG8gZW5hYmxlIGJlbmNobWFya2luZy5cbiAqIEByZXR1cm4ge2Z1bmN0aW9uKGFueSwgYW55LFByb3BlcnR5RGVzY3JpcHRvcik6IHZvaWR9IFZlcmJvc2UgbG9nZ2luZyBkZWNvcmF0b3IuXG4gKiBAZnVuY3Rpb24gdmVyYm9zZVxuICogQGNhdGVnb3J5IE1ldGhvZCBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2ZXJib3NlKHZlcmJvc2l0eTogbnVtYmVyIHwgYm9vbGVhbiA9IDApIHtcbiAgaWYgKCF2ZXJib3NpdHkpIHtcbiAgICB2ZXJib3NpdHkgPSAwO1xuICB9XG4gIHJldHVybiBsb2coTG9nTGV2ZWwudmVyYm9zZSwgdmVyYm9zaXR5IGFzIG51bWJlcik7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBkZWNvcmF0b3IgdGhhdCBtYWtlcyBhIG1ldGhvZCBub24tY29uZmlndXJhYmxlLlxuICogQHN1bW1hcnkgUHJldmVudHMgb3ZlcnJpZGluZyBieSBtYXJraW5nIHRoZSBtZXRob2QgZGVzY3JpcHRvciBhcyBub24tY29uZmlndXJhYmxlLCB0aHJvd2luZyBpZiBhcHBsaWVkIHRvIG5vbi1tZXRob2QgdGFyZ2V0cy5cbiAqIEByZXR1cm4ge2Z1bmN0aW9uKG9iamVjdCwgYW55LCBQcm9wZXJ0eURlc2NyaXB0b3IpOiBQcm9wZXJ0eURlc2NyaXB0b3J8dW5kZWZpbmVkfSBEZWNvcmF0b3IgdGhhdCBoYXJkZW5zIHRoZSBtZXRob2QgZGVzY3JpcHRvci5cbiAqIEBmdW5jdGlvbiBmaW5hbFxuICogQGNhdGVnb3J5IE1ldGhvZCBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5hbCgpIHtcbiAgcmV0dXJuICh0YXJnZXQ6IG9iamVjdCwgcHJvcGVydHlLZXk/OiBhbnksIGRlc2NyaXB0b3I/OiBhbnkpID0+IHtcbiAgICBpZiAoIWRlc2NyaXB0b3IpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJmaW5hbCBkZWNvcmF0b3IgY2FuIG9ubHkgYmUgdXNlZCBvbiBtZXRob2RzXCIpO1xuICAgIGlmIChkZXNjcmlwdG9yPy5jb25maWd1cmFibGUpIHtcbiAgICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICB9O1xufVxuIl19
|
package/lib/esm/environment.d.ts
CHANGED
|
@@ -1,21 +1,39 @@
|
|
|
1
1
|
import { ObjectAccumulator } from "typed-object-accumulator";
|
|
2
2
|
/**
|
|
3
3
|
* @description Factory type for creating Environment instances.
|
|
4
|
-
* @summary
|
|
5
|
-
*
|
|
4
|
+
* @summary Describes factories that construct {@link Environment} derivatives with custom initialization.
|
|
6
5
|
* @template T - The type of object the Environment will accumulate.
|
|
7
6
|
* @template E - The specific Environment type to be created, extending Environment<T>.
|
|
8
|
-
* @typedef {function(
|
|
7
|
+
* @typedef {function(unknown[]): E} EnvironmentFactory
|
|
9
8
|
* @memberOf module:Logging
|
|
10
9
|
*/
|
|
11
10
|
export type EnvironmentFactory<T extends object, E extends Environment<T>> = (...args: unknown[]) => E;
|
|
12
11
|
/**
|
|
13
|
-
* @
|
|
14
|
-
* @
|
|
12
|
+
* @description Environment accumulator that lazily reads from runtime sources.
|
|
13
|
+
* @summary Extends {@link ObjectAccumulator} to merge configuration objects while resolving values from Node or browser environment variables on demand.
|
|
15
14
|
* @template T
|
|
16
|
-
* @
|
|
17
|
-
* @
|
|
18
|
-
*
|
|
15
|
+
* @class Environment
|
|
16
|
+
* @example
|
|
17
|
+
* const Config = Environment.accumulate({ logging: { level: "info" } });
|
|
18
|
+
* console.log(Config.logging.level);
|
|
19
|
+
* console.log(String(Config.logging.level)); // => LOGGING__LEVEL key when serialized
|
|
20
|
+
* @mermaid
|
|
21
|
+
* sequenceDiagram
|
|
22
|
+
* participant Client
|
|
23
|
+
* participant Env as Environment
|
|
24
|
+
* participant Process as process.env
|
|
25
|
+
* participant Browser as globalThis.ENV
|
|
26
|
+
* Client->>Env: accumulate(partialConfig)
|
|
27
|
+
* Env->>Env: expand(values)
|
|
28
|
+
* Client->>Env: Config.logging.level
|
|
29
|
+
* alt Browser runtime
|
|
30
|
+
* Env->>Browser: lookup ENV key
|
|
31
|
+
* Browser-->>Env: resolved value
|
|
32
|
+
* else Node runtime
|
|
33
|
+
* Env->>Process: lookup ENV key
|
|
34
|
+
* Process-->>Env: resolved value
|
|
35
|
+
* end
|
|
36
|
+
* Env-->>Client: merged value
|
|
19
37
|
*/
|
|
20
38
|
export declare class Environment<T extends object> extends ObjectAccumulator<T> {
|
|
21
39
|
/**
|
|
@@ -35,18 +53,24 @@ export declare class Environment<T extends object> extends ObjectAccumulator<T>
|
|
|
35
53
|
private static _instance;
|
|
36
54
|
protected constructor();
|
|
37
55
|
/**
|
|
38
|
-
* @description Retrieves a value from the environment
|
|
39
|
-
* @summary
|
|
40
|
-
* @param {string} k -
|
|
41
|
-
* @return {unknown}
|
|
56
|
+
* @description Retrieves a value from the runtime environment.
|
|
57
|
+
* @summary Handles browser and Node.js environments by normalizing keys and parsing values.
|
|
58
|
+
* @param {string} k - Key to resolve from the environment.
|
|
59
|
+
* @return {unknown} Value resolved from the environment or `undefined` when absent.
|
|
42
60
|
*/
|
|
43
61
|
protected fromEnv(k: string): unknown;
|
|
62
|
+
/**
|
|
63
|
+
* @description Converts stringified environment values into native types.
|
|
64
|
+
* @summary Interprets booleans and numbers while leaving other types unchanged.
|
|
65
|
+
* @param {unknown} val - Raw value retrieved from the environment.
|
|
66
|
+
* @return {unknown} Parsed value converted to boolean, number, or left as-is.
|
|
67
|
+
*/
|
|
44
68
|
protected parseEnvValue(val: unknown): unknown;
|
|
45
69
|
/**
|
|
46
|
-
* @description Expands an object into the environment
|
|
47
|
-
* @summary Defines properties
|
|
48
|
-
* @template V - Type of the object being expanded
|
|
49
|
-
* @param {V} value -
|
|
70
|
+
* @description Expands an object into the environment.
|
|
71
|
+
* @summary Defines lazy properties that first consult runtime variables before falling back to seeded values.
|
|
72
|
+
* @template V - Type of the object being expanded.
|
|
73
|
+
* @param {V} value - Object to expose through environment getters and setters.
|
|
50
74
|
* @return {void}
|
|
51
75
|
*/
|
|
52
76
|
protected expand<V extends object>(value: V): void;
|
|
@@ -54,22 +78,36 @@ export declare class Environment<T extends object> extends ObjectAccumulator<T>
|
|
|
54
78
|
* @protected
|
|
55
79
|
* @static
|
|
56
80
|
* @description Retrieves or creates the singleton instance of the Environment class.
|
|
57
|
-
* @summary Ensures only one instance
|
|
81
|
+
* @summary Ensures only one {@link Environment} instance is created, wrapping it in a proxy to compose ENV keys on demand.
|
|
58
82
|
* @template E
|
|
59
|
-
* @param {...unknown[]} args - Arguments
|
|
60
|
-
* @return {E}
|
|
83
|
+
* @param {...unknown[]} args - Arguments forwarded to the factory when instantiating the singleton.
|
|
84
|
+
* @return {E} Singleton environment instance.
|
|
61
85
|
*/
|
|
62
86
|
protected static instance<E extends Environment<any>>(...args: unknown[]): E;
|
|
63
87
|
/**
|
|
64
88
|
* @static
|
|
65
89
|
* @description Accumulates the given value into the environment.
|
|
66
|
-
* @summary Adds new properties
|
|
90
|
+
* @summary Adds new properties, hiding raw descriptors to avoid leaking enumeration semantics.
|
|
91
|
+
* @template T
|
|
67
92
|
* @template V
|
|
68
|
-
* @param {V} value -
|
|
69
|
-
* @return {
|
|
93
|
+
* @param {V} value - Object to merge into the environment.
|
|
94
|
+
* @return {Environment} Updated environment reference.
|
|
70
95
|
*/
|
|
71
96
|
static accumulate<V extends object>(value: V): typeof Environment._instance & V & ObjectAccumulator<typeof Environment._instance & V>;
|
|
97
|
+
/**
|
|
98
|
+
* @description Retrieves a value using a dot-path key from the accumulated environment.
|
|
99
|
+
* @summary Delegates to the singleton instance to access stored configuration.
|
|
100
|
+
* @param {string} key - Key to resolve from the environment store.
|
|
101
|
+
* @return {unknown} Stored value corresponding to the provided key.
|
|
102
|
+
*/
|
|
72
103
|
static get(key: string): any;
|
|
104
|
+
/**
|
|
105
|
+
* @description Builds a proxy that composes environment keys for nested properties.
|
|
106
|
+
* @summary Allows chained property access to emit uppercase ENV identifiers while honoring existing runtime overrides.
|
|
107
|
+
* @param {any} current - Seed model segment used when projecting nested structures.
|
|
108
|
+
* @param {string[]} path - Accumulated path segments leading to the proxy.
|
|
109
|
+
* @return {any} Proxy that resolves environment values or composes additional proxies for deeper paths.
|
|
110
|
+
*/
|
|
73
111
|
private static buildEnvProxy;
|
|
74
112
|
/**
|
|
75
113
|
* @static
|
|
@@ -80,6 +118,12 @@ export declare class Environment<T extends object> extends ObjectAccumulator<T>
|
|
|
80
118
|
*/
|
|
81
119
|
static keys(toEnv?: boolean): string[];
|
|
82
120
|
}
|
|
121
|
+
/**
|
|
122
|
+
* @description Singleton environment instance seeded with default logging configuration.
|
|
123
|
+
* @summary Combines {@link DefaultLoggingConfig} with runtime environment variables to provide consistent logging defaults across platforms.
|
|
124
|
+
* @const LoggedEnvironment
|
|
125
|
+
* @memberOf module:Logging
|
|
126
|
+
*/
|
|
83
127
|
export declare const LoggedEnvironment: Environment<any> & import("./types").LoggingConfig & {
|
|
84
128
|
env: any;
|
|
85
129
|
} & ObjectAccumulator<Environment<any> & import("./types").LoggingConfig & {
|