@decaf-ts/logging 0.3.8 → 0.3.10

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 (56) hide show
  1. package/LICENSE.md +3 -2
  2. package/dist/logging.cjs +588 -105
  3. package/dist/logging.esm.cjs +568 -102
  4. package/lib/constants.cjs +15 -6
  5. package/lib/constants.d.ts +7 -0
  6. package/lib/decorators.cjs +44 -27
  7. package/lib/decorators.d.ts +9 -0
  8. package/lib/environment.cjs +204 -0
  9. package/lib/environment.d.ts +86 -0
  10. package/lib/esm/constants.d.ts +7 -0
  11. package/lib/esm/constants.js +14 -5
  12. package/lib/esm/decorators.d.ts +9 -0
  13. package/lib/esm/decorators.js +43 -27
  14. package/lib/esm/environment.d.ts +86 -0
  15. package/lib/esm/environment.js +200 -0
  16. package/lib/esm/filters/LogFilter.d.ts +6 -0
  17. package/lib/esm/filters/LogFilter.js +7 -0
  18. package/lib/esm/filters/PatternFilter.d.ts +10 -0
  19. package/lib/esm/filters/PatternFilter.js +44 -0
  20. package/lib/esm/filters/index.d.ts +2 -0
  21. package/lib/esm/filters/index.js +3 -0
  22. package/lib/esm/index.d.ts +5 -2
  23. package/lib/esm/index.js +6 -3
  24. package/lib/esm/logging.d.ts +10 -11
  25. package/lib/esm/logging.js +38 -27
  26. package/lib/esm/text.d.ts +156 -0
  27. package/lib/esm/text.js +214 -0
  28. package/lib/esm/types.d.ts +31 -5
  29. package/lib/esm/types.js +1 -1
  30. package/lib/esm/web.d.ts +8 -0
  31. package/lib/esm/web.js +12 -0
  32. package/lib/esm/winston/winston.d.ts +2 -2
  33. package/lib/esm/winston/winston.js +4 -4
  34. package/lib/filters/LogFilter.cjs +11 -0
  35. package/lib/filters/LogFilter.d.ts +6 -0
  36. package/lib/filters/PatternFilter.cjs +48 -0
  37. package/lib/filters/PatternFilter.d.ts +10 -0
  38. package/lib/filters/index.cjs +19 -0
  39. package/lib/filters/index.d.ts +2 -0
  40. package/lib/index.cjs +6 -3
  41. package/lib/index.d.ts +5 -2
  42. package/lib/logging.cjs +37 -26
  43. package/lib/logging.d.ts +10 -11
  44. package/lib/text.cjs +227 -0
  45. package/lib/text.d.ts +156 -0
  46. package/lib/types.cjs +1 -1
  47. package/lib/types.d.ts +31 -5
  48. package/lib/web.cjs +15 -0
  49. package/lib/web.d.ts +8 -0
  50. package/lib/winston/winston.cjs +4 -4
  51. package/lib/winston/winston.d.ts +2 -2
  52. package/package.json +13 -4
  53. package/lib/esm/utils.d.ts +0 -12
  54. package/lib/esm/utils.js +0 -31
  55. package/lib/utils.cjs +0 -34
  56. package/lib/utils.d.ts +0 -12
@@ -1,3 +1,10 @@
1
+ export const BrowserEnvKey = "ENV";
2
+ /**
3
+ * @description Delimiter used for composing nested environment variable names.
4
+ * @summary Joins parent and child keys when mapping object paths to ENV strings.
5
+ */
6
+ export const ENV_PATH_DELIMITER = "__";
7
+ export const DefaultPlaceholderWrappers = ["${", "}"];
1
8
  /**
2
9
  * @description Enum for log levels.
3
10
  * @summary Defines different levels of logging for the application.
@@ -75,6 +82,8 @@ export var LoggingMode;
75
82
  * @memberOf module:Logging
76
83
  */
77
84
  export const DefaultTheme = {
85
+ app: {},
86
+ separator: {},
78
87
  class: {
79
88
  fg: 34,
80
89
  },
@@ -126,18 +135,18 @@ export const DefaultTheme = {
126
135
  * @memberOf module:Logging
127
136
  */
128
137
  export const DefaultLoggingConfig = {
138
+ env: "development",
129
139
  verbose: 0,
130
140
  level: LogLevel.info,
131
141
  logLevel: true,
132
- mode: LoggingMode.RAW,
133
142
  style: false,
134
143
  contextSeparator: ".",
135
- separator: " - ",
144
+ separator: "-",
136
145
  timestamp: true,
137
146
  timestampFormat: "HH:mm:ss.SSS",
138
147
  context: true,
139
- format: "raw",
140
- pattern: "{level} [{timestamp}] {context} - {message} {stack}",
148
+ format: LoggingMode.RAW,
149
+ pattern: "{level} [{timestamp}] {app} {context} {separator} {message} {stack}",
141
150
  theme: DefaultTheme,
142
151
  };
143
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQTs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQU4sSUFBWSxRQVdYO0FBWEQsV0FBWSxRQUFRO0lBQ2xCLHNEQUFzRDtJQUN0RCwyQkFBZSxDQUFBO0lBQ2Ysa0VBQWtFO0lBQ2xFLHlCQUFhLENBQUE7SUFDYix1Q0FBdUM7SUFDdkMsK0JBQW1CLENBQUE7SUFDbkIsa0NBQWtDO0lBQ2xDLDJCQUFlLENBQUE7SUFDZiw0Q0FBNEM7SUFDNUMsMkJBQWUsQ0FBQTtBQUNqQixDQUFDLEVBWFcsUUFBUSxLQUFSLFFBQVEsUUFXbkI7QUFFRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUc7SUFDOUIsS0FBSyxFQUFFLENBQUM7SUFDUixJQUFJLEVBQUUsQ0FBQztJQUNQLE9BQU8sRUFBRSxDQUFDO0lBQ1YsS0FBSyxFQUFFLENBQUM7SUFDUixLQUFLLEVBQUUsQ0FBQztDQUNULENBQUM7QUFFRjs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBTixJQUFZLFdBS1g7QUFMRCxXQUFZLFdBQVc7SUFDckIsNENBQTRDO0lBQzVDLDBCQUFXLENBQUE7SUFDWCxzQ0FBc0M7SUFDdEMsNEJBQWEsQ0FBQTtBQUNmLENBQUMsRUFMVyxXQUFXLEtBQVgsV0FBVyxRQUt0QjtBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Qkc7QUFDSCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQVU7SUFDakMsS0FBSyxFQUFFO1FBQ0wsRUFBRSxFQUFFLEVBQUU7S0FDUDtJQUNELEVBQUUsRUFBRTtRQUNGLEVBQUUsRUFBRSxFQUFFO0tBQ1A7SUFDRCxLQUFLLEVBQUUsRUFBRTtJQUNULFNBQVMsRUFBRSxFQUFFO0lBQ2IsT0FBTyxFQUFFO1FBQ1AsS0FBSyxFQUFFO1lBQ0wsRUFBRSxFQUFFLEVBQUU7U0FDUDtLQUNGO0lBQ0QsTUFBTSxFQUFFLEVBQUU7SUFDVixRQUFRLEVBQUU7UUFDUixLQUFLLEVBQUU7WUFDTCxFQUFFLEVBQUUsRUFBRTtZQUNOLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQztTQUNoQjtRQUNELElBQUksRUFBRTtZQUNKLEVBQUUsRUFBRSxFQUFFO1lBQ04sS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDO1NBQ2hCO1FBQ0QsT0FBTyxFQUFFO1lBQ1AsRUFBRSxFQUFFLEVBQUU7WUFDTixLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUM7U0FDaEI7UUFDRCxLQUFLLEVBQUU7WUFDTCxFQUFFLEVBQUUsRUFBRTtZQUNOLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQztTQUNoQjtLQUNGO0NBQ0YsQ0FBQztBQUVGOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQWtCO0lBQ2pELE9BQU8sRUFBRSxDQUFDO0lBQ1YsS0FBSyxFQUFFLFFBQVEsQ0FBQyxJQUFJO0lBQ3BCLFFBQVEsRUFBRSxJQUFJO0lBQ2QsSUFBSSxFQUFFLFdBQVcsQ0FBQyxHQUFHO0lBQ3JCLEtBQUssRUFBRSxLQUFLO0lBQ1osZ0JBQWdCLEVBQUUsR0FBRztJQUNyQixTQUFTLEVBQUUsS0FBSztJQUNoQixTQUFTLEVBQUUsSUFBSTtJQUNmLGVBQWUsRUFBRSxjQUFjO0lBQy9CLE9BQU8sRUFBRSxJQUFJO0lBQ2IsTUFBTSxFQUFFLEtBQUs7SUFDYixPQUFPLEVBQUUscURBQXFEO0lBQzlELEtBQUssRUFBRSxZQUFZO0NBQ3BCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBMb2dnaW5nQ29uZmlnLCBUaGVtZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVudW0gZm9yIGxvZyBsZXZlbHMuXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGRpZmZlcmVudCBsZXZlbHMgb2YgbG9nZ2luZyBmb3IgdGhlIGFwcGxpY2F0aW9uLlxuICogQGVudW0ge3N0cmluZ31cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTpMb2dnaW5nXG4gKi9cbmV4cG9ydCBlbnVtIExvZ0xldmVsIHtcbiAgLyoqIEVycm9yIGV2ZW50cyB0aGF0IGFyZSBsaWtlbHkgdG8gY2F1c2UgcHJvYmxlbXMuICovXG4gIGVycm9yID0gXCJlcnJvclwiLFxuICAvKiogUm91dGluZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBvbmdvaW5nIHN0YXR1cyBvciBwZXJmb3JtYW5jZS4gKi9cbiAgaW5mbyA9IFwiaW5mb1wiLFxuICAvKiogQWRkaXRpb25hbCByZWxldmFudCBpbmZvcm1hdGlvbi4gKi9cbiAgdmVyYm9zZSA9IFwidmVyYm9zZVwiLFxuICAvKiogRGVidWcgb3IgdHJhY2UgaW5mb3JtYXRpb24uICovXG4gIGRlYnVnID0gXCJkZWJ1Z1wiLFxuICAvKiogd2F5IHRvbyB2ZXJib3NlIG9yIHNpbGx5IGluZm9ybWF0aW9uLiAqL1xuICBzaWxseSA9IFwic2lsbHlcIixcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTnVtZXJpYyB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoIGxvZyBsZXZlbHMuXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBhIG51bWVyaWMgcmVwcmVzZW50YXRpb24gb2YgbG9nIGxldmVscyBmb3IgY29tcGFyaXNvbiBhbmQgZmlsdGVyaW5nLlxuICogQGNvbnN0IE51bWVyaWNMb2dMZXZlbHNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBlcnJvciAtIE51bWVyaWMgdmFsdWUgZm9yIGVycm9yIGxldmVsICgyKS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBpbmZvIC0gTnVtZXJpYyB2YWx1ZSBmb3IgaW5mbyBsZXZlbCAoNCkuXG4gKiBAcHJvcGVydHkge251bWJlcn0gdmVyYm9zZSAtIE51bWVyaWMgdmFsdWUgZm9yIHZlcmJvc2UgbGV2ZWwgKDYpLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGRlYnVnIC0gTnVtZXJpYyB2YWx1ZSBmb3IgZGVidWcgbGV2ZWwgKDcpLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHNpbGx5IC0gTnVtZXJpYyB2YWx1ZSBmb3Igc2lsbHkgbGV2ZWwgKDkpLlxuICogQG1lbWJlck9mIG1vZHVsZTpMb2dnaW5nXG4gKi9cbmV4cG9ydCBjb25zdCBOdW1lcmljTG9nTGV2ZWxzID0ge1xuICBlcnJvcjogMixcbiAgaW5mbzogNCxcbiAgdmVyYm9zZTogNixcbiAgZGVidWc6IDcsXG4gIHNpbGx5OiA5LFxufTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRW51bSBmb3IgbG9nZ2luZyBvdXRwdXQgbW9kZXMuXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGRpZmZlcmVudCBvdXRwdXQgZm9ybWF0cyBmb3IgbG9nIG1lc3NhZ2VzLlxuICogQGVudW0ge3N0cmluZ31cbiAqIEBtZW1iZXJPZiBtb2R1bGU6TG9nZ2luZ1xuICovXG5leHBvcnQgZW51bSBMb2dnaW5nTW9kZSB7XG4gIC8qKiBSYXcgdGV4dCBmb3JtYXQgZm9yIGh1bWFuIHJlYWRhYmlsaXR5ICovXG4gIFJBVyA9IFwicmF3XCIsXG4gIC8qKiBKU09OIGZvcm1hdCBmb3IgbWFjaGluZSBwYXJzaW5nICovXG4gIEpTT04gPSBcImpzb25cIixcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVmYXVsdCB0aGVtZSBmb3Igc3R5bGluZyBsb2cgb3V0cHV0LlxuICogQHN1bW1hcnkgRGVmaW5lcyB0aGUgZGVmYXVsdCBjb2xvciBhbmQgc3R5bGUgc2V0dGluZ3MgZm9yIHZhcmlvdXMgY29tcG9uZW50cyBvZiBsb2cgbWVzc2FnZXMuXG4gKiBAY29uc3QgRGVmYXVsdFRoZW1lXG4gKiBAdHlwZWRlZiB7VGhlbWV9IERlZmF1bHRUaGVtZVxuICogQHByb3BlcnR5IHtPYmplY3R9IGNsYXNzIC0gU3R5bGluZyBmb3IgY2xhc3MgbmFtZXMuXG4gKiBAcHJvcGVydHkge251bWJlcn0gY2xhc3MuZmcgLSBGb3JlZ3JvdW5kIGNvbG9yIGNvZGUgZm9yIGNsYXNzIG5hbWVzICgzNCkuXG4gKiBAcHJvcGVydHkge09iamVjdH0gaWQgLSBTdHlsaW5nIGZvciBpZGVudGlmaWVycy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBpZC5mZyAtIEZvcmVncm91bmQgY29sb3IgY29kZSBmb3IgaWRlbnRpZmllcnMgKDM2KS5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBzdGFjayAtIFN0eWxpbmcgZm9yIHN0YWNrIHRyYWNlcyAoZW1wdHkgb2JqZWN0KS5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSB0aW1lc3RhbXAgLSBTdHlsaW5nIGZvciB0aW1lc3RhbXBzIChlbXB0eSBvYmplY3QpLlxuICogQHByb3BlcnR5IHtPYmplY3R9IG1lc3NhZ2UgLSBTdHlsaW5nIGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgbWVzc2FnZXMuXG4gKiBAcHJvcGVydHkge09iamVjdH0gbWVzc2FnZS5lcnJvciAtIFN0eWxpbmcgZm9yIGVycm9yIG1lc3NhZ2VzLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IG1lc3NhZ2UuZXJyb3IuZmcgLSBGb3JlZ3JvdW5kIGNvbG9yIGNvZGUgZm9yIGVycm9yIG1lc3NhZ2VzICgzMSkuXG4gKiBAcHJvcGVydHkge09iamVjdH0gbWV0aG9kIC0gU3R5bGluZyBmb3IgbWV0aG9kIG5hbWVzIChlbXB0eSBvYmplY3QpLlxuICogQHByb3BlcnR5IHtPYmplY3R9IGxvZ0xldmVsIC0gU3R5bGluZyBmb3IgZGlmZmVyZW50IGxvZyBsZXZlbHMuXG4gKiBAcHJvcGVydHkge09iamVjdH0gbG9nTGV2ZWwuZXJyb3IgLSBTdHlsaW5nIGZvciBlcnJvciBsZXZlbCBsb2dzLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGxvZ0xldmVsLmVycm9yLmZnIC0gRm9yZWdyb3VuZCBjb2xvciBjb2RlIGZvciBlcnJvciBsZXZlbCBsb2dzICgzMSkuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBsb2dMZXZlbC5lcnJvci5zdHlsZSAtIFN0eWxlIGF0dHJpYnV0ZXMgZm9yIGVycm9yIGxldmVsIGxvZ3MgKFtcImJvbGRcIl0pLlxuICogQHByb3BlcnR5IHtPYmplY3R9IGxvZ0xldmVsLmluZm8gLSBTdHlsaW5nIGZvciBpbmZvIGxldmVsIGxvZ3MgKGVtcHR5IG9iamVjdCkuXG4gKiBAcHJvcGVydHkge09iamVjdH0gbG9nTGV2ZWwudmVyYm9zZSAtIFN0eWxpbmcgZm9yIHZlcmJvc2UgbGV2ZWwgbG9ncyAoZW1wdHkgb2JqZWN0KS5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBsb2dMZXZlbC5kZWJ1ZyAtIFN0eWxpbmcgZm9yIGRlYnVnIGxldmVsIGxvZ3MuXG4gKiBAcHJvcGVydHkge251bWJlcn0gbG9nTGV2ZWwuZGVidWcuZmcgLSBGb3JlZ3JvdW5kIGNvbG9yIGNvZGUgZm9yIGRlYnVnIGxldmVsIGxvZ3MgKDMzKS5cbiAqIEBtZW1iZXJPZiBtb2R1bGU6TG9nZ2luZ1xuICovXG5leHBvcnQgY29uc3QgRGVmYXVsdFRoZW1lOiBUaGVtZSA9IHtcbiAgY2xhc3M6IHtcbiAgICBmZzogMzQsXG4gIH0sXG4gIGlkOiB7XG4gICAgZmc6IDM2LFxuICB9LFxuICBzdGFjazoge30sXG4gIHRpbWVzdGFtcDoge30sXG4gIG1lc3NhZ2U6IHtcbiAgICBlcnJvcjoge1xuICAgICAgZmc6IDMxLFxuICAgIH0sXG4gIH0sXG4gIG1ldGhvZDoge30sXG4gIGxvZ0xldmVsOiB7XG4gICAgZXJyb3I6IHtcbiAgICAgIGZnOiAzMSxcbiAgICAgIHN0eWxlOiBbXCJib2xkXCJdLFxuICAgIH0sXG4gICAgaW5mbzoge1xuICAgICAgZmc6IDM0LFxuICAgICAgc3R5bGU6IFtcImJvbGRcIl0sXG4gICAgfSxcbiAgICB2ZXJib3NlOiB7XG4gICAgICBmZzogMzQsXG4gICAgICBzdHlsZTogW1wiYm9sZFwiXSxcbiAgICB9LFxuICAgIGRlYnVnOiB7XG4gICAgICBmZzogMzMsXG4gICAgICBzdHlsZTogW1wiYm9sZFwiXSxcbiAgICB9LFxuICB9LFxufTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVmYXVsdCBjb25maWd1cmF0aW9uIGZvciBsb2dnaW5nLlxuICogQHN1bW1hcnkgRGVmaW5lcyB0aGUgZGVmYXVsdCBzZXR0aW5ncyBmb3IgdGhlIGxvZ2dpbmcgc3lzdGVtLCBpbmNsdWRpbmcgdmVyYm9zaXR5LCBsb2cgbGV2ZWwsIHN0eWxpbmcsIGFuZCB0aW1lc3RhbXAgZm9ybWF0LlxuICogQGNvbnN0IERlZmF1bHRMb2dnaW5nQ29uZmlnXG4gKiBAdHlwZWRlZiB7TG9nZ2luZ0NvbmZpZ30gRGVmYXVsdExvZ2dpbmdDb25maWdcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB2ZXJib3NlIC0gVmVyYm9zaXR5IGxldmVsICgwKS5cbiAqIEBwcm9wZXJ0eSB7TG9nTGV2ZWx9IGxldmVsIC0gRGVmYXVsdCBsb2cgbGV2ZWwgKExvZ0xldmVsLmluZm8pLlxuICogQHByb3BlcnR5IHtib29sZWFufSBsb2dMZXZlbCAtIFdoZXRoZXIgdG8gZGlzcGxheSBsb2cgbGV2ZWwgaW4gb3V0cHV0ICh0cnVlKS5cbiAqIEBwcm9wZXJ0eSB7TG9nZ2luZ01vZGV9IG1vZGUgLSBPdXRwdXQgZm9ybWF0IG1vZGUgKExvZ2dpbmdNb2RlLlJBVykuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHN0eWxlIC0gV2hldGhlciB0byBhcHBseSBzdHlsaW5nIHRvIGxvZyBvdXRwdXQgKGZhbHNlKS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzZXBhcmF0b3IgLSBTZXBhcmF0b3IgYmV0d2VlbiBsb2cgY29tcG9uZW50cyAoXCIgLSBcIikuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHRpbWVzdGFtcCAtIFdoZXRoZXIgdG8gaW5jbHVkZSB0aW1lc3RhbXBzIGluIGxvZyBtZXNzYWdlcyAodHJ1ZSkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdGltZXN0YW1wRm9ybWF0IC0gRm9ybWF0IGZvciB0aW1lc3RhbXBzIChcIkhIOm1tOnNzLlNTU1wiKS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gY29udGV4dCAtIFdoZXRoZXIgdG8gaW5jbHVkZSBjb250ZXh0IGluZm9ybWF0aW9uIGluIGxvZyBtZXNzYWdlcyAodHJ1ZSkuXG4gKiBAcHJvcGVydHkge1RoZW1lfSB0aGVtZSAtIFRoZSB0aGVtZSB0byB1c2UgZm9yIHN0eWxpbmcgbG9nIG1lc3NhZ2VzIChEZWZhdWx0VGhlbWUpLlxuICogQG1lbWJlck9mIG1vZHVsZTpMb2dnaW5nXG4gKi9cbmV4cG9ydCBjb25zdCBEZWZhdWx0TG9nZ2luZ0NvbmZpZzogTG9nZ2luZ0NvbmZpZyA9IHtcbiAgdmVyYm9zZTogMCxcbiAgbGV2ZWw6IExvZ0xldmVsLmluZm8sXG4gIGxvZ0xldmVsOiB0cnVlLFxuICBtb2RlOiBMb2dnaW5nTW9kZS5SQVcsXG4gIHN0eWxlOiBmYWxzZSxcbiAgY29udGV4dFNlcGFyYXRvcjogXCIuXCIsXG4gIHNlcGFyYXRvcjogXCIgLSBcIixcbiAgdGltZXN0YW1wOiB0cnVlLFxuICB0aW1lc3RhbXBGb3JtYXQ6IFwiSEg6bW06c3MuU1NTXCIsXG4gIGNvbnRleHQ6IHRydWUsXG4gIGZvcm1hdDogXCJyYXdcIixcbiAgcGF0dGVybjogXCJ7bGV2ZWx9IFt7dGltZXN0YW1wfV0ge2NvbnRleHR9IC0ge21lc3NhZ2V9IHtzdGFja31cIixcbiAgdGhlbWU6IERlZmF1bHRUaGVtZSxcbn07XG4iXX0=
152
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDO0FBRW5DOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQztBQUV2QyxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztBQUV0RDs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQU4sSUFBWSxRQVdYO0FBWEQsV0FBWSxRQUFRO0lBQ2xCLHNEQUFzRDtJQUN0RCwyQkFBZSxDQUFBO0lBQ2Ysa0VBQWtFO0lBQ2xFLHlCQUFhLENBQUE7SUFDYix1Q0FBdUM7SUFDdkMsK0JBQW1CLENBQUE7SUFDbkIsa0NBQWtDO0lBQ2xDLDJCQUFlLENBQUE7SUFDZiw0Q0FBNEM7SUFDNUMsMkJBQWUsQ0FBQTtBQUNqQixDQUFDLEVBWFcsUUFBUSxLQUFSLFFBQVEsUUFXbkI7QUFFRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUc7SUFDOUIsS0FBSyxFQUFFLENBQUM7SUFDUixJQUFJLEVBQUUsQ0FBQztJQUNQLE9BQU8sRUFBRSxDQUFDO0lBQ1YsS0FBSyxFQUFFLENBQUM7SUFDUixLQUFLLEVBQUUsQ0FBQztDQUNULENBQUM7QUFFRjs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBTixJQUFZLFdBS1g7QUFMRCxXQUFZLFdBQVc7SUFDckIsNENBQTRDO0lBQzVDLDBCQUFXLENBQUE7SUFDWCxzQ0FBc0M7SUFDdEMsNEJBQWEsQ0FBQTtBQUNmLENBQUMsRUFMVyxXQUFXLEtBQVgsV0FBVyxRQUt0QjtBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Qkc7QUFDSCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQVU7SUFDakMsR0FBRyxFQUFFLEVBQUU7SUFDUCxTQUFTLEVBQUUsRUFBRTtJQUNiLEtBQUssRUFBRTtRQUNMLEVBQUUsRUFBRSxFQUFFO0tBQ1A7SUFDRCxFQUFFLEVBQUU7UUFDRixFQUFFLEVBQUUsRUFBRTtLQUNQO0lBQ0QsS0FBSyxFQUFFLEVBQUU7SUFDVCxTQUFTLEVBQUUsRUFBRTtJQUNiLE9BQU8sRUFBRTtRQUNQLEtBQUssRUFBRTtZQUNMLEVBQUUsRUFBRSxFQUFFO1NBQ1A7S0FDRjtJQUNELE1BQU0sRUFBRSxFQUFFO0lBQ1YsUUFBUSxFQUFFO1FBQ1IsS0FBSyxFQUFFO1lBQ0wsRUFBRSxFQUFFLEVBQUU7WUFDTixLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUM7U0FDaEI7UUFDRCxJQUFJLEVBQUU7WUFDSixFQUFFLEVBQUUsRUFBRTtZQUNOLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQztTQUNoQjtRQUNELE9BQU8sRUFBRTtZQUNQLEVBQUUsRUFBRSxFQUFFO1lBQ04sS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDO1NBQ2hCO1FBQ0QsS0FBSyxFQUFFO1lBQ0wsRUFBRSxFQUFFLEVBQUU7WUFDTixLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUM7U0FDaEI7S0FDRjtDQUNGLENBQUM7QUFFRjs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFrQjtJQUNqRCxHQUFHLEVBQUUsYUFBYTtJQUNsQixPQUFPLEVBQUUsQ0FBQztJQUNWLEtBQUssRUFBRSxRQUFRLENBQUMsSUFBSTtJQUNwQixRQUFRLEVBQUUsSUFBSTtJQUNkLEtBQUssRUFBRSxLQUFLO0lBQ1osZ0JBQWdCLEVBQUUsR0FBRztJQUNyQixTQUFTLEVBQUUsR0FBRztJQUNkLFNBQVMsRUFBRSxJQUFJO0lBQ2YsZUFBZSxFQUFFLGNBQWM7SUFDL0IsT0FBTyxFQUFFLElBQUk7SUFDYixNQUFNLEVBQUUsV0FBVyxDQUFDLEdBQUc7SUFDdkIsT0FBTyxFQUNMLHFFQUFxRTtJQUN2RSxLQUFLLEVBQUUsWUFBWTtDQUNwQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTG9nZ2luZ0NvbmZpZywgVGhlbWUgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG5leHBvcnQgY29uc3QgQnJvd3NlckVudktleSA9IFwiRU5WXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlbGltaXRlciB1c2VkIGZvciBjb21wb3NpbmcgbmVzdGVkIGVudmlyb25tZW50IHZhcmlhYmxlIG5hbWVzLlxuICogQHN1bW1hcnkgSm9pbnMgcGFyZW50IGFuZCBjaGlsZCBrZXlzIHdoZW4gbWFwcGluZyBvYmplY3QgcGF0aHMgdG8gRU5WIHN0cmluZ3MuXG4gKi9cbmV4cG9ydCBjb25zdCBFTlZfUEFUSF9ERUxJTUlURVIgPSBcIl9fXCI7XG5cbmV4cG9ydCBjb25zdCBEZWZhdWx0UGxhY2Vob2xkZXJXcmFwcGVycyA9IFtcIiR7XCIsIFwifVwiXTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRW51bSBmb3IgbG9nIGxldmVscy5cbiAqIEBzdW1tYXJ5IERlZmluZXMgZGlmZmVyZW50IGxldmVscyBvZiBsb2dnaW5nIGZvciB0aGUgYXBwbGljYXRpb24uXG4gKiBAZW51bSB7c3RyaW5nfVxuICogQHJlYWRvbmx5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOkxvZ2dpbmdcbiAqL1xuZXhwb3J0IGVudW0gTG9nTGV2ZWwge1xuICAvKiogRXJyb3IgZXZlbnRzIHRoYXQgYXJlIGxpa2VseSB0byBjYXVzZSBwcm9ibGVtcy4gKi9cbiAgZXJyb3IgPSBcImVycm9yXCIsXG4gIC8qKiBSb3V0aW5lIGluZm9ybWF0aW9uLCBzdWNoIGFzIG9uZ29pbmcgc3RhdHVzIG9yIHBlcmZvcm1hbmNlLiAqL1xuICBpbmZvID0gXCJpbmZvXCIsXG4gIC8qKiBBZGRpdGlvbmFsIHJlbGV2YW50IGluZm9ybWF0aW9uLiAqL1xuICB2ZXJib3NlID0gXCJ2ZXJib3NlXCIsXG4gIC8qKiBEZWJ1ZyBvciB0cmFjZSBpbmZvcm1hdGlvbi4gKi9cbiAgZGVidWcgPSBcImRlYnVnXCIsXG4gIC8qKiB3YXkgdG9vIHZlcmJvc2Ugb3Igc2lsbHkgaW5mb3JtYXRpb24uICovXG4gIHNpbGx5ID0gXCJzaWxseVwiLFxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBOdW1lcmljIHZhbHVlcyBhc3NvY2lhdGVkIHdpdGggbG9nIGxldmVscy5cbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIGEgbnVtZXJpYyByZXByZXNlbnRhdGlvbiBvZiBsb2cgbGV2ZWxzIGZvciBjb21wYXJpc29uIGFuZCBmaWx0ZXJpbmcuXG4gKiBAY29uc3QgTnVtZXJpY0xvZ0xldmVsc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IGVycm9yIC0gTnVtZXJpYyB2YWx1ZSBmb3IgZXJyb3IgbGV2ZWwgKDIpLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGluZm8gLSBOdW1lcmljIHZhbHVlIGZvciBpbmZvIGxldmVsICg0KS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB2ZXJib3NlIC0gTnVtZXJpYyB2YWx1ZSBmb3IgdmVyYm9zZSBsZXZlbCAoNikuXG4gKiBAcHJvcGVydHkge251bWJlcn0gZGVidWcgLSBOdW1lcmljIHZhbHVlIGZvciBkZWJ1ZyBsZXZlbCAoNykuXG4gKiBAcHJvcGVydHkge251bWJlcn0gc2lsbHkgLSBOdW1lcmljIHZhbHVlIGZvciBzaWxseSBsZXZlbCAoOSkuXG4gKiBAbWVtYmVyT2YgbW9kdWxlOkxvZ2dpbmdcbiAqL1xuZXhwb3J0IGNvbnN0IE51bWVyaWNMb2dMZXZlbHMgPSB7XG4gIGVycm9yOiAyLFxuICBpbmZvOiA0LFxuICB2ZXJib3NlOiA2LFxuICBkZWJ1ZzogNyxcbiAgc2lsbHk6IDksXG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFbnVtIGZvciBsb2dnaW5nIG91dHB1dCBtb2Rlcy5cbiAqIEBzdW1tYXJ5IERlZmluZXMgZGlmZmVyZW50IG91dHB1dCBmb3JtYXRzIGZvciBsb2cgbWVzc2FnZXMuXG4gKiBAZW51bSB7c3RyaW5nfVxuICogQG1lbWJlck9mIG1vZHVsZTpMb2dnaW5nXG4gKi9cbmV4cG9ydCBlbnVtIExvZ2dpbmdNb2RlIHtcbiAgLyoqIFJhdyB0ZXh0IGZvcm1hdCBmb3IgaHVtYW4gcmVhZGFiaWxpdHkgKi9cbiAgUkFXID0gXCJyYXdcIixcbiAgLyoqIEpTT04gZm9ybWF0IGZvciBtYWNoaW5lIHBhcnNpbmcgKi9cbiAgSlNPTiA9IFwianNvblwiLFxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZhdWx0IHRoZW1lIGZvciBzdHlsaW5nIGxvZyBvdXRwdXQuXG4gKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBkZWZhdWx0IGNvbG9yIGFuZCBzdHlsZSBzZXR0aW5ncyBmb3IgdmFyaW91cyBjb21wb25lbnRzIG9mIGxvZyBtZXNzYWdlcy5cbiAqIEBjb25zdCBEZWZhdWx0VGhlbWVcbiAqIEB0eXBlZGVmIHtUaGVtZX0gRGVmYXVsdFRoZW1lXG4gKiBAcHJvcGVydHkge09iamVjdH0gY2xhc3MgLSBTdHlsaW5nIGZvciBjbGFzcyBuYW1lcy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBjbGFzcy5mZyAtIEZvcmVncm91bmQgY29sb3IgY29kZSBmb3IgY2xhc3MgbmFtZXMgKDM0KS5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBpZCAtIFN0eWxpbmcgZm9yIGlkZW50aWZpZXJzLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGlkLmZnIC0gRm9yZWdyb3VuZCBjb2xvciBjb2RlIGZvciBpZGVudGlmaWVycyAoMzYpLlxuICogQHByb3BlcnR5IHtPYmplY3R9IHN0YWNrIC0gU3R5bGluZyBmb3Igc3RhY2sgdHJhY2VzIChlbXB0eSBvYmplY3QpLlxuICogQHByb3BlcnR5IHtPYmplY3R9IHRpbWVzdGFtcCAtIFN0eWxpbmcgZm9yIHRpbWVzdGFtcHMgKGVtcHR5IG9iamVjdCkuXG4gKiBAcHJvcGVydHkge09iamVjdH0gbWVzc2FnZSAtIFN0eWxpbmcgZm9yIGRpZmZlcmVudCB0eXBlcyBvZiBtZXNzYWdlcy5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBtZXNzYWdlLmVycm9yIC0gU3R5bGluZyBmb3IgZXJyb3IgbWVzc2FnZXMuXG4gKiBAcHJvcGVydHkge251bWJlcn0gbWVzc2FnZS5lcnJvci5mZyAtIEZvcmVncm91bmQgY29sb3IgY29kZSBmb3IgZXJyb3IgbWVzc2FnZXMgKDMxKS5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBtZXRob2QgLSBTdHlsaW5nIGZvciBtZXRob2QgbmFtZXMgKGVtcHR5IG9iamVjdCkuXG4gKiBAcHJvcGVydHkge09iamVjdH0gbG9nTGV2ZWwgLSBTdHlsaW5nIGZvciBkaWZmZXJlbnQgbG9nIGxldmVscy5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBsb2dMZXZlbC5lcnJvciAtIFN0eWxpbmcgZm9yIGVycm9yIGxldmVsIGxvZ3MuXG4gKiBAcHJvcGVydHkge251bWJlcn0gbG9nTGV2ZWwuZXJyb3IuZmcgLSBGb3JlZ3JvdW5kIGNvbG9yIGNvZGUgZm9yIGVycm9yIGxldmVsIGxvZ3MgKDMxKS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IGxvZ0xldmVsLmVycm9yLnN0eWxlIC0gU3R5bGUgYXR0cmlidXRlcyBmb3IgZXJyb3IgbGV2ZWwgbG9ncyAoW1wiYm9sZFwiXSkuXG4gKiBAcHJvcGVydHkge09iamVjdH0gbG9nTGV2ZWwuaW5mbyAtIFN0eWxpbmcgZm9yIGluZm8gbGV2ZWwgbG9ncyAoZW1wdHkgb2JqZWN0KS5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBsb2dMZXZlbC52ZXJib3NlIC0gU3R5bGluZyBmb3IgdmVyYm9zZSBsZXZlbCBsb2dzIChlbXB0eSBvYmplY3QpLlxuICogQHByb3BlcnR5IHtPYmplY3R9IGxvZ0xldmVsLmRlYnVnIC0gU3R5bGluZyBmb3IgZGVidWcgbGV2ZWwgbG9ncy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBsb2dMZXZlbC5kZWJ1Zy5mZyAtIEZvcmVncm91bmQgY29sb3IgY29kZSBmb3IgZGVidWcgbGV2ZWwgbG9ncyAoMzMpLlxuICogQG1lbWJlck9mIG1vZHVsZTpMb2dnaW5nXG4gKi9cbmV4cG9ydCBjb25zdCBEZWZhdWx0VGhlbWU6IFRoZW1lID0ge1xuICBhcHA6IHt9LFxuICBzZXBhcmF0b3I6IHt9LFxuICBjbGFzczoge1xuICAgIGZnOiAzNCxcbiAgfSxcbiAgaWQ6IHtcbiAgICBmZzogMzYsXG4gIH0sXG4gIHN0YWNrOiB7fSxcbiAgdGltZXN0YW1wOiB7fSxcbiAgbWVzc2FnZToge1xuICAgIGVycm9yOiB7XG4gICAgICBmZzogMzEsXG4gICAgfSxcbiAgfSxcbiAgbWV0aG9kOiB7fSxcbiAgbG9nTGV2ZWw6IHtcbiAgICBlcnJvcjoge1xuICAgICAgZmc6IDMxLFxuICAgICAgc3R5bGU6IFtcImJvbGRcIl0sXG4gICAgfSxcbiAgICBpbmZvOiB7XG4gICAgICBmZzogMzQsXG4gICAgICBzdHlsZTogW1wiYm9sZFwiXSxcbiAgICB9LFxuICAgIHZlcmJvc2U6IHtcbiAgICAgIGZnOiAzNCxcbiAgICAgIHN0eWxlOiBbXCJib2xkXCJdLFxuICAgIH0sXG4gICAgZGVidWc6IHtcbiAgICAgIGZnOiAzMyxcbiAgICAgIHN0eWxlOiBbXCJib2xkXCJdLFxuICAgIH0sXG4gIH0sXG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZhdWx0IGNvbmZpZ3VyYXRpb24gZm9yIGxvZ2dpbmcuXG4gKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBkZWZhdWx0IHNldHRpbmdzIGZvciB0aGUgbG9nZ2luZyBzeXN0ZW0sIGluY2x1ZGluZyB2ZXJib3NpdHksIGxvZyBsZXZlbCwgc3R5bGluZywgYW5kIHRpbWVzdGFtcCBmb3JtYXQuXG4gKiBAY29uc3QgRGVmYXVsdExvZ2dpbmdDb25maWdcbiAqIEB0eXBlZGVmIHtMb2dnaW5nQ29uZmlnfSBEZWZhdWx0TG9nZ2luZ0NvbmZpZ1xuICogQHByb3BlcnR5IHtudW1iZXJ9IHZlcmJvc2UgLSBWZXJib3NpdHkgbGV2ZWwgKDApLlxuICogQHByb3BlcnR5IHtMb2dMZXZlbH0gbGV2ZWwgLSBEZWZhdWx0IGxvZyBsZXZlbCAoTG9nTGV2ZWwuaW5mbykuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGxvZ0xldmVsIC0gV2hldGhlciB0byBkaXNwbGF5IGxvZyBsZXZlbCBpbiBvdXRwdXQgKHRydWUpLlxuICogQHByb3BlcnR5IHtMb2dnaW5nTW9kZX0gbW9kZSAtIE91dHB1dCBmb3JtYXQgbW9kZSAoTG9nZ2luZ01vZGUuUkFXKS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gc3R5bGUgLSBXaGV0aGVyIHRvIGFwcGx5IHN0eWxpbmcgdG8gbG9nIG91dHB1dCAoZmFsc2UpLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNlcGFyYXRvciAtIFNlcGFyYXRvciBiZXR3ZWVuIGxvZyBjb21wb25lbnRzIChcIiAtIFwiKS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gdGltZXN0YW1wIC0gV2hldGhlciB0byBpbmNsdWRlIHRpbWVzdGFtcHMgaW4gbG9nIG1lc3NhZ2VzICh0cnVlKS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0aW1lc3RhbXBGb3JtYXQgLSBGb3JtYXQgZm9yIHRpbWVzdGFtcHMgKFwiSEg6bW06c3MuU1NTXCIpLlxuICogQHByb3BlcnR5IHtib29sZWFufSBjb250ZXh0IC0gV2hldGhlciB0byBpbmNsdWRlIGNvbnRleHQgaW5mb3JtYXRpb24gaW4gbG9nIG1lc3NhZ2VzICh0cnVlKS5cbiAqIEBwcm9wZXJ0eSB7VGhlbWV9IHRoZW1lIC0gVGhlIHRoZW1lIHRvIHVzZSBmb3Igc3R5bGluZyBsb2cgbWVzc2FnZXMgKERlZmF1bHRUaGVtZSkuXG4gKiBAbWVtYmVyT2YgbW9kdWxlOkxvZ2dpbmdcbiAqL1xuZXhwb3J0IGNvbnN0IERlZmF1bHRMb2dnaW5nQ29uZmlnOiBMb2dnaW5nQ29uZmlnID0ge1xuICBlbnY6IFwiZGV2ZWxvcG1lbnRcIixcbiAgdmVyYm9zZTogMCxcbiAgbGV2ZWw6IExvZ0xldmVsLmluZm8sXG4gIGxvZ0xldmVsOiB0cnVlLFxuICBzdHlsZTogZmFsc2UsXG4gIGNvbnRleHRTZXBhcmF0b3I6IFwiLlwiLFxuICBzZXBhcmF0b3I6IFwiLVwiLFxuICB0aW1lc3RhbXA6IHRydWUsXG4gIHRpbWVzdGFtcEZvcm1hdDogXCJISDptbTpzcy5TU1NcIixcbiAgY29udGV4dDogdHJ1ZSxcbiAgZm9ybWF0OiBMb2dnaW5nTW9kZS5SQVcsXG4gIHBhdHRlcm46XG4gICAgXCJ7bGV2ZWx9IFt7dGltZXN0YW1wfV0ge2FwcH0ge2NvbnRleHR9IHtzZXBhcmF0b3J9IHttZXNzYWdlfSB7c3RhY2t9XCIsXG4gIHRoZW1lOiBEZWZhdWx0VGhlbWUsXG59O1xuIl19
@@ -82,3 +82,12 @@ export declare function verbose(benchmark: boolean): (target: any, propertyKey?:
82
82
  * @category Method Decorators
83
83
  */
84
84
  export declare function verbose(verbosity: number | boolean): (target: any, propertyKey?: any, descriptor?: any) => void;
85
+ /**
86
+ * @description Creates a decorator that makes a method non-configurable
87
+ * @summary This decorator prevents a method from being overridden by making it non-configurable.
88
+ * It throws an error if used on anything other than a method.
89
+ * @return {Function} A decorator function that can be applied to methods
90
+ * @function final
91
+ * @category Method Decorators
92
+ */
93
+ export declare function final(): (target: object, propertyKey?: any, descriptor?: PropertyDescriptor) => PropertyDescriptor;
@@ -35,35 +35,33 @@ export function log(level = LogLevel.info, benchmark = false, verbosity = 0) {
35
35
  return function (target, propertyKey, descriptor) {
36
36
  if (!descriptor)
37
37
  throw new Error(`Logging decoration only applies to methods`);
38
- const log = Logging.for(target).for(target[propertyKey]);
39
- const method = log[level].bind(log);
38
+ const logger = Logging.for(target).for(target[propertyKey]);
39
+ const method = logger[level].bind(logger);
40
40
  const originalMethod = descriptor.value;
41
- const func = function (...args) {
42
- method(`called with ${args}`, verbosity);
43
- const start = Date.now();
44
- let end;
45
- const result = originalMethod.apply(this, args);
46
- if (result instanceof Promise) {
47
- return result.then((r) => {
48
- if (benchmark) {
49
- end = Date.now();
50
- if (benchmark)
51
- method(`completed in ${end - start}ms`, verbosity);
41
+ descriptor.value = new Proxy(originalMethod, {
42
+ apply(fn, thisArg, args) {
43
+ method(`called with ${args}`, verbosity);
44
+ const start = Date.now();
45
+ try {
46
+ const result = Reflect.apply(fn, thisArg, args);
47
+ if (result instanceof Promise) {
48
+ return result.then((r) => {
49
+ if (benchmark)
50
+ method(`completed in ${Date.now() - start}ms`, verbosity);
51
+ return r;
52
+ });
52
53
  }
53
- return r;
54
- });
55
- }
56
- if (benchmark) {
57
- end = Date.now();
58
- if (benchmark)
59
- method(`completed in ${end - start}ms`, verbosity);
60
- }
61
- return result;
62
- }.bind(target);
63
- Object.assign(func, "name", {
64
- value: descriptor.value.name,
54
+ if (benchmark)
55
+ method(`completed in ${Date.now() - start}ms`, verbosity);
56
+ return result;
57
+ }
58
+ catch (err) {
59
+ if (benchmark)
60
+ method(`failed in ${Date.now() - start}ms`, verbosity);
61
+ throw err;
62
+ }
63
+ },
65
64
  });
66
- descriptor.value = func;
67
65
  };
68
66
  }
69
67
  /**
@@ -115,4 +113,22 @@ export function verbose(verbosity = 0, benchmark) {
115
113
  }
116
114
  return log(LogLevel.verbose, benchmark, verbosity);
117
115
  }
118
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kZWNvcmF0b3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsdUJBQW9CO0FBQ3ZDLE9BQU8sRUFBRSxPQUFPLEVBQUUscUJBQWtCO0FBRXBDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4Qkc7QUFDSCxNQUFNLFVBQVUsR0FBRyxDQUNqQixRQUFrQixRQUFRLENBQUMsSUFBSSxFQUMvQixZQUFxQixLQUFLLEVBQzFCLFNBQVMsR0FBRyxDQUFDO0lBRWIsT0FBTyxVQUNMLE1BQVcsRUFDWCxXQUFpQixFQUNqQixVQUErQjtRQUUvQixJQUFJLENBQUMsVUFBVTtZQUNiLE1BQU0sSUFBSSxLQUFLLENBQUMsNENBQTRDLENBQUMsQ0FBQztRQUNoRSxNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztRQUN6RCxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sY0FBYyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUM7UUFFeEMsTUFBTSxJQUFJLEdBQUcsVUFBK0IsR0FBRyxJQUFXO1lBQ3hELE1BQU0sQ0FBQyxlQUFlLElBQUksRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ3pDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUN6QixJQUFJLEdBQVcsQ0FBQztZQUNoQixNQUFNLE1BQU0sR0FBUSxjQUFjLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNyRCxJQUFJLE1BQU0sWUFBWSxPQUFPLEVBQUUsQ0FBQztnQkFDOUIsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7b0JBQ3ZCLElBQUksU0FBUyxFQUFFLENBQUM7d0JBQ2QsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQzt3QkFDakIsSUFBSSxTQUFTOzRCQUFFLE1BQU0sQ0FBQyxnQkFBZ0IsR0FBRyxHQUFHLEtBQUssSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO29CQUNwRSxDQUFDO29CQUNELE9BQU8sQ0FBQyxDQUFDO2dCQUNYLENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQUNELElBQUksU0FBUyxFQUFFLENBQUM7Z0JBQ2QsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDakIsSUFBSSxTQUFTO29CQUFFLE1BQU0sQ0FBQyxnQkFBZ0IsR0FBRyxHQUFHLEtBQUssSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ3BFLENBQUM7WUFFRCxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBUSxDQUFDO1FBRXRCLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRTtZQUMxQixLQUFLLEVBQUUsVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJO1NBQzdCLENBQUMsQ0FBQztRQUVILFVBQVUsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0lBQzFCLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLEtBQUssQ0FBQyxZQUFxQixLQUFLO0lBQzlDLE9BQU8sR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDeEMsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsSUFBSSxDQUFDLFlBQXFCLEtBQUs7SUFDN0MsT0FBTyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztBQUN2QyxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxLQUFLLENBQUMsWUFBcUIsS0FBSztJQUM5QyxPQUFPLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQ3hDLENBQUM7QUFvQ0Q7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsT0FBTyxDQUFDLFlBQThCLENBQUMsRUFBRSxTQUFtQjtJQUMxRSxJQUFJLE9BQU8sU0FBUyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ25DLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDdEIsU0FBUyxHQUFHLENBQUMsQ0FBQztJQUNoQixDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDckQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExvZ0xldmVsIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBMb2dnaW5nIH0gZnJvbSBcIi4vbG9nZ2luZ1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBNZXRob2QgZGVjb3JhdG9yIGZvciBsb2dnaW5nIGZ1bmN0aW9uIGNhbGxzXG4gKiBAc3VtbWFyeSBDcmVhdGVzIGEgZGVjb3JhdG9yIHRoYXQgbG9ncyBtZXRob2QgY2FsbHMgd2l0aCBzcGVjaWZpZWQgbGV2ZWwsIGJlbmNobWFya2luZywgYW5kIHZlcmJvc2l0eVxuICogQHBhcmFtIHtMb2dMZXZlbH0gbGV2ZWwgLSBUaGUgbG9nIGxldmVsIHRvIHVzZSAoZGVmYXVsdDogTG9nTGV2ZWwuaW5mbylcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2JlbmNobWFyaz1mYWxzZV0gLSBXaGV0aGVyIHRvIGxvZyBleGVjdXRpb24gdGltZSAoZGVmYXVsdDogZmFsc2UpXG4gKiBAcGFyYW0ge251bWJlcn0gW3ZlcmJvc2l0eT0wXSAtIFRoZSB2ZXJib3NpdHkgbGV2ZWwgZm9yIHRoZSBsb2cgbWVzc2FnZXMgKGRlZmF1bHQ6IDApXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBtZXRob2QgZGVjb3JhdG9yIHRoYXQgd3JhcHMgdGhlIG9yaWdpbmFsIG1ldGhvZCB3aXRoIGxvZ2dpbmdcbiAqIEBmdW5jdGlvbiBsb2dcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IERlY29yYXRvciBhcyBsb2cgZGVjb3JhdG9yXG4gKiAgIHBhcnRpY2lwYW50IE1ldGhvZCBhcyBPcmlnaW5hbCBNZXRob2RcbiAqICAgcGFydGljaXBhbnQgTG9nZ2VyIGFzIExvZ2dpbmcgaW5zdGFuY2VcbiAqXG4gKiAgIENsaWVudC0+PkRlY29yYXRvcjogY2FsbCBkZWNvcmF0ZWQgbWV0aG9kXG4gKiAgIERlY29yYXRvci0+PkxvZ2dlcjogbG9nIG1ldGhvZCBjYWxsXG4gKiAgIERlY29yYXRvci0+Pk1ldGhvZDogY2FsbCBvcmlnaW5hbCBtZXRob2RcbiAqICAgYWx0IHJlc3VsdCBpcyBQcm9taXNlXG4gKiAgICAgTWV0aG9kLS0+PkRlY29yYXRvcjogcmV0dXJuIFByb21pc2VcbiAqICAgICBEZWNvcmF0b3ItPj5EZWNvcmF0b3I6IGF0dGFjaCB0aGVuIGhhbmRsZXJcbiAqICAgICBOb3RlIG92ZXIgRGVjb3JhdG9yOiBQcm9taXNlIHJlc29sdmVzXG4gKiAgICAgRGVjb3JhdG9yLT4+TG9nZ2VyOiBsb2cgYmVuY2htYXJrIChpZiBlbmFibGVkKVxuICogICAgIERlY29yYXRvci0tPj5DbGllbnQ6IHJldHVybiByZXN1bHRcbiAqICAgZWxzZSByZXN1bHQgaXMgbm90IFByb21pc2VcbiAqICAgICBNZXRob2QtLT4+RGVjb3JhdG9yOiByZXR1cm4gcmVzdWx0XG4gKiAgICAgRGVjb3JhdG9yLT4+TG9nZ2VyOiBsb2cgYmVuY2htYXJrIChpZiBlbmFibGVkKVxuICogICAgIERlY29yYXRvci0tPj5DbGllbnQ6IHJldHVybiByZXN1bHRcbiAqICAgZW5kXG4gKiBAY2F0ZWdvcnkgTWV0aG9kIERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvZyhcbiAgbGV2ZWw6IExvZ0xldmVsID0gTG9nTGV2ZWwuaW5mbyxcbiAgYmVuY2htYXJrOiBib29sZWFuID0gZmFsc2UsXG4gIHZlcmJvc2l0eSA9IDBcbikge1xuICByZXR1cm4gZnVuY3Rpb24gKFxuICAgIHRhcmdldDogYW55LFxuICAgIHByb3BlcnR5S2V5PzogYW55LFxuICAgIGRlc2NyaXB0b3I/OiBQcm9wZXJ0eURlc2NyaXB0b3JcbiAgKSB7XG4gICAgaWYgKCFkZXNjcmlwdG9yKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBMb2dnaW5nIGRlY29yYXRpb24gb25seSBhcHBsaWVzIHRvIG1ldGhvZHNgKTtcbiAgICBjb25zdCBsb2cgPSBMb2dnaW5nLmZvcih0YXJnZXQpLmZvcih0YXJnZXRbcHJvcGVydHlLZXldKTtcbiAgICBjb25zdCBtZXRob2QgPSBsb2dbbGV2ZWxdLmJpbmQobG9nKTtcbiAgICBjb25zdCBvcmlnaW5hbE1ldGhvZCA9IGRlc2NyaXB0b3IudmFsdWU7XG5cbiAgICBjb25zdCBmdW5jID0gZnVuY3Rpb24gKHRoaXM6IHR5cGVvZiB0YXJnZXQsIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgICBtZXRob2QoYGNhbGxlZCB3aXRoICR7YXJnc31gLCB2ZXJib3NpdHkpO1xuICAgICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgbGV0IGVuZDogbnVtYmVyO1xuICAgICAgY29uc3QgcmVzdWx0OiBhbnkgPSBvcmlnaW5hbE1ldGhvZC5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQudGhlbigocikgPT4ge1xuICAgICAgICAgIGlmIChiZW5jaG1hcmspIHtcbiAgICAgICAgICAgIGVuZCA9IERhdGUubm93KCk7XG4gICAgICAgICAgICBpZiAoYmVuY2htYXJrKSBtZXRob2QoYGNvbXBsZXRlZCBpbiAke2VuZCAtIHN0YXJ0fW1zYCwgdmVyYm9zaXR5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHI7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGJlbmNobWFyaykge1xuICAgICAgICBlbmQgPSBEYXRlLm5vdygpO1xuICAgICAgICBpZiAoYmVuY2htYXJrKSBtZXRob2QoYGNvbXBsZXRlZCBpbiAke2VuZCAtIHN0YXJ0fW1zYCwgdmVyYm9zaXR5KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LmJpbmQodGFyZ2V0KSBhcyBhbnk7XG5cbiAgICBPYmplY3QuYXNzaWduKGZ1bmMsIFwibmFtZVwiLCB7XG4gICAgICB2YWx1ZTogZGVzY3JpcHRvci52YWx1ZS5uYW1lLFxuICAgIH0pO1xuXG4gICAgZGVzY3JpcHRvci52YWx1ZSA9IGZ1bmM7XG4gIH07XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE1ldGhvZCBkZWNvcmF0b3IgZm9yIGxvZ2dpbmcgZnVuY3Rpb24gY2FsbHMgd2l0aCBkZWJ1ZyBsZXZlbFxuICogQHN1bW1hcnkgQ29udmVuaWVuY2Ugd3JhcHBlciBhcm91bmQgdGhlIGxvZyBkZWNvcmF0b3IgdGhhdCB1c2VzIExvZ0xldmVsLmRlYnVnXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtiZW5jaG1hcms9ZmFsc2VdIC0gV2hldGhlciB0byBsb2cgZXhlY3V0aW9uIHRpbWUgKGRlZmF1bHQ6IGZhbHNlKVxuICogQHJldHVybiB7RnVuY3Rpb259IEEgbWV0aG9kIGRlY29yYXRvciB0aGF0IHdyYXBzIHRoZSBvcmlnaW5hbCBtZXRob2Qgd2l0aCBkZWJ1ZyBsb2dnaW5nXG4gKiBAZnVuY3Rpb24gZGVidWdcbiAqIEBjYXRlZ29yeSBNZXRob2QgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZGVidWcoYmVuY2htYXJrOiBib29sZWFuID0gZmFsc2UpIHtcbiAgcmV0dXJuIGxvZyhMb2dMZXZlbC5kZWJ1ZywgYmVuY2htYXJrKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTWV0aG9kIGRlY29yYXRvciBmb3IgbG9nZ2luZyBmdW5jdGlvbiBjYWxscyB3aXRoIGluZm8gbGV2ZWxcbiAqIEBzdW1tYXJ5IENvbnZlbmllbmNlIHdyYXBwZXIgYXJvdW5kIHRoZSBsb2cgZGVjb3JhdG9yIHRoYXQgdXNlcyBMb2dMZXZlbC5pbmZvXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtiZW5jaG1hcms9ZmFsc2VdIC0gV2hldGhlciB0byBsb2cgZXhlY3V0aW9uIHRpbWUgKGRlZmF1bHQ6IGZhbHNlKVxuICogQHJldHVybiB7RnVuY3Rpb259IEEgbWV0aG9kIGRlY29yYXRvciB0aGF0IHdyYXBzIHRoZSBvcmlnaW5hbCBtZXRob2Qgd2l0aCBpbmZvIGxvZ2dpbmdcbiAqIEBmdW5jdGlvbiBpbmZvXG4gKiBAY2F0ZWdvcnkgTWV0aG9kIERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluZm8oYmVuY2htYXJrOiBib29sZWFuID0gZmFsc2UpIHtcbiAgcmV0dXJuIGxvZyhMb2dMZXZlbC5pbmZvLCBiZW5jaG1hcmspO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBNZXRob2QgZGVjb3JhdG9yIGZvciBsb2dnaW5nIGZ1bmN0aW9uIGNhbGxzIHdpdGggc2lsbHkgbGV2ZWxcbiAqIEBzdW1tYXJ5IENvbnZlbmllbmNlIHdyYXBwZXIgYXJvdW5kIHRoZSBsb2cgZGVjb3JhdG9yIHRoYXQgdXNlcyBMb2dMZXZlbC5zaWxseVxuICogQHBhcmFtIHtib29sZWFufSBbYmVuY2htYXJrPWZhbHNlXSAtIFdoZXRoZXIgdG8gbG9nIGV4ZWN1dGlvbiB0aW1lIChkZWZhdWx0OiBmYWxzZSlcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIG1ldGhvZCBkZWNvcmF0b3IgdGhhdCB3cmFwcyB0aGUgb3JpZ2luYWwgbWV0aG9kIHdpdGggc2lsbHkgbG9nZ2luZ1xuICogQGZ1bmN0aW9uIHNpbGx5XG4gKiBAY2F0ZWdvcnkgTWV0aG9kIERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpbGx5KGJlbmNobWFyazogYm9vbGVhbiA9IGZhbHNlKSB7XG4gIHJldHVybiBsb2coTG9nTGV2ZWwuc2lsbHksIGJlbmNobWFyayk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE1ldGhvZCBkZWNvcmF0b3IgZm9yIGxvZ2dpbmcgZnVuY3Rpb24gY2FsbHMgd2l0aCB2ZXJib3NlIGxldmVsXG4gKiBAc3VtbWFyeSBDb252ZW5pZW5jZSB3cmFwcGVyIGFyb3VuZCB0aGUgbG9nIGRlY29yYXRvciB0aGF0IHVzZXMgTG9nTGV2ZWwudmVyYm9zZSB3aXRoIGNvbmZpZ3VyYWJsZSB2ZXJib3NpdHlcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIG1ldGhvZCBkZWNvcmF0b3IgdGhhdCB3cmFwcyB0aGUgb3JpZ2luYWwgbWV0aG9kIHdpdGggdmVyYm9zZSBsb2dnaW5nXG4gKiBAZnVuY3Rpb24gdmVyYm9zZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdmVyYm9zZSgpOiAoXG4gIHRhcmdldDogYW55LFxuICBwcm9wZXJ0eUtleT86IGFueSxcbiAgZGVzY3JpcHRvcj86IGFueVxuKSA9PiB2b2lkO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBNZXRob2QgZGVjb3JhdG9yIGZvciBsb2dnaW5nIGZ1bmN0aW9uIGNhbGxzIHdpdGggdmVyYm9zZSBsZXZlbFxuICogQHN1bW1hcnkgQ29udmVuaWVuY2Ugd3JhcHBlciBhcm91bmQgdGhlIGxvZyBkZWNvcmF0b3IgdGhhdCB1c2VzIExvZ0xldmVsLnZlcmJvc2Ugd2l0aCBjb25maWd1cmFibGUgdmVyYm9zaXR5XG4gKiBAcGFyYW0ge2Jvb2xlYW59IGJlbmNobWFyayAtIFdoZXRoZXIgdG8gbG9nIGV4ZWN1dGlvbiB0aW1lXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBtZXRob2QgZGVjb3JhdG9yIHRoYXQgd3JhcHMgdGhlIG9yaWdpbmFsIG1ldGhvZCB3aXRoIHZlcmJvc2UgbG9nZ2luZ1xuICogQGZ1bmN0aW9uIHZlcmJvc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZlcmJvc2UoXG4gIGJlbmNobWFyazogYm9vbGVhblxuKTogKHRhcmdldDogYW55LCBwcm9wZXJ0eUtleT86IGFueSwgZGVzY3JpcHRvcj86IGFueSkgPT4gdm9pZDtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTWV0aG9kIGRlY29yYXRvciBmb3IgbG9nZ2luZyBmdW5jdGlvbiBjYWxscyB3aXRoIHZlcmJvc2UgbGV2ZWxcbiAqIEBzdW1tYXJ5IENvbnZlbmllbmNlIHdyYXBwZXIgYXJvdW5kIHRoZSBsb2cgZGVjb3JhdG9yIHRoYXQgdXNlcyBMb2dMZXZlbC52ZXJib3NlIHdpdGggY29uZmlndXJhYmxlIHZlcmJvc2l0eVxuICogQHBhcmFtIHtudW1iZXJ9IHZlcmJvc2l0eSAtIFRoZSB2ZXJib3NpdHkgbGV2ZWwgZm9yIHRoZSBsb2cgbWVzc2FnZXMgKGRlZmF1bHQ6IDApXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBtZXRob2QgZGVjb3JhdG9yIHRoYXQgd3JhcHMgdGhlIG9yaWdpbmFsIG1ldGhvZCB3aXRoIHZlcmJvc2UgbG9nZ2luZ1xuICogQGZ1bmN0aW9uIHZlcmJvc2VcbiAqIEBjYXRlZ29yeSBNZXRob2QgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdmVyYm9zZShcbiAgdmVyYm9zaXR5OiBudW1iZXIgfCBib29sZWFuXG4pOiAodGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5PzogYW55LCBkZXNjcmlwdG9yPzogYW55KSA9PiB2b2lkO1xuLyoqXG4gKiBAZGVzY3JpcHRpb24gTWV0aG9kIGRlY29yYXRvciBmb3IgbG9nZ2luZyBmdW5jdGlvbiBjYWxscyB3aXRoIHZlcmJvc2UgbGV2ZWxcbiAqIEBzdW1tYXJ5IENvbnZlbmllbmNlIHdyYXBwZXIgYXJvdW5kIHRoZSBsb2cgZGVjb3JhdG9yIHRoYXQgdXNlcyBMb2dMZXZlbC52ZXJib3NlIHdpdGggY29uZmlndXJhYmxlIHZlcmJvc2l0eVxuICogQHBhcmFtIHtudW1iZXJ9IHZlcmJvc2l0eSAtIFRoZSB2ZXJib3NpdHkgbGV2ZWwgZm9yIHRoZSBsb2cgbWVzc2FnZXMgKGRlZmF1bHQ6IDApXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtiZW5jaG1hcms9ZmFsc2VdIC0gV2hldGhlciB0byBsb2cgZXhlY3V0aW9uIHRpbWUgKGRlZmF1bHQ6IGZhbHNlKVxuICogQHJldHVybiB7RnVuY3Rpb259IEEgbWV0aG9kIGRlY29yYXRvciB0aGF0IHdyYXBzIHRoZSBvcmlnaW5hbCBtZXRob2Qgd2l0aCB2ZXJib3NlIGxvZ2dpbmdcbiAqIEBmdW5jdGlvbiB2ZXJib3NlXG4gKiBAY2F0ZWdvcnkgTWV0aG9kIERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZlcmJvc2UodmVyYm9zaXR5OiBudW1iZXIgfCBib29sZWFuID0gMCwgYmVuY2htYXJrPzogYm9vbGVhbikge1xuICBpZiAodHlwZW9mIHZlcmJvc2l0eSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICBiZW5jaG1hcmsgPSB2ZXJib3NpdHk7XG4gICAgdmVyYm9zaXR5ID0gMDtcbiAgfVxuICByZXR1cm4gbG9nKExvZ0xldmVsLnZlcmJvc2UsIGJlbmNobWFyaywgdmVyYm9zaXR5KTtcbn1cbiJdfQ==
116
+ /**
117
+ * @description Creates a decorator that makes a method non-configurable
118
+ * @summary This decorator prevents a method from being overridden by making it non-configurable.
119
+ * It throws an error if used on anything other than a method.
120
+ * @return {Function} A decorator function that can be applied to methods
121
+ * @function final
122
+ * @category Method Decorators
123
+ */
124
+ export function final() {
125
+ return (target, propertyKey, descriptor) => {
126
+ if (!descriptor)
127
+ throw new Error("final decorator can only be used on methods");
128
+ if (descriptor?.configurable) {
129
+ descriptor.configurable = false;
130
+ }
131
+ return descriptor;
132
+ };
133
+ }
134
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kZWNvcmF0b3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsdUJBQW9CO0FBQ3ZDLE9BQU8sRUFBRSxPQUFPLEVBQUUscUJBQWtCO0FBRXBDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4Qkc7QUFDSCxNQUFNLFVBQVUsR0FBRyxDQUNqQixRQUFrQixRQUFRLENBQUMsSUFBSSxFQUMvQixZQUFxQixLQUFLLEVBQzFCLFNBQVMsR0FBRyxDQUFDO0lBRWIsT0FBTyxVQUNMLE1BQVcsRUFDWCxXQUFpQixFQUNqQixVQUErQjtRQUUvQixJQUFJLENBQUMsVUFBVTtZQUNiLE1BQU0sSUFBSSxLQUFLLENBQUMsNENBQTRDLENBQUMsQ0FBQztRQUNoRSxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztRQUM1RCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBUSxDQUFDO1FBQ2pELE1BQU0sY0FBYyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUM7UUFFeEMsVUFBVSxDQUFDLEtBQUssR0FBRyxJQUFJLEtBQUssQ0FBQyxjQUFjLEVBQUU7WUFDM0MsS0FBSyxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBVztnQkFDNUIsTUFBTSxDQUFDLGVBQWUsSUFBSSxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUM7Z0JBQ3pDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDekIsSUFBSSxDQUFDO29CQUNILE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztvQkFDaEQsSUFBSSxNQUFNLFlBQVksT0FBTyxFQUFFLENBQUM7d0JBQzlCLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFOzRCQUM1QixJQUFJLFNBQVM7Z0NBQ1gsTUFBTSxDQUFDLGdCQUFnQixJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsS0FBSyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7NEJBQzVELE9BQU8sQ0FBQyxDQUFDO3dCQUNYLENBQUMsQ0FBQyxDQUFDO29CQUNMLENBQUM7b0JBQ0QsSUFBSSxTQUFTO3dCQUNYLE1BQU0sQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEtBQUssSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO29CQUM1RCxPQUFPLE1BQU0sQ0FBQztnQkFDaEIsQ0FBQztnQkFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO29CQUNiLElBQUksU0FBUzt3QkFBRSxNQUFNLENBQUMsYUFBYSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsS0FBSyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7b0JBQ3RFLE1BQU0sR0FBRyxDQUFDO2dCQUNaLENBQUM7WUFDSCxDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsS0FBSyxDQUFDLFlBQXFCLEtBQUs7SUFDOUMsT0FBTyxHQUFHLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztBQUN4QyxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxJQUFJLENBQUMsWUFBcUIsS0FBSztJQUM3QyxPQUFPLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQ3ZDLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLEtBQUssQ0FBQyxZQUFxQixLQUFLO0lBQzlDLE9BQU8sR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDeEMsQ0FBQztBQW9DRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxPQUFPLENBQUMsWUFBOEIsQ0FBQyxFQUFFLFNBQW1CO0lBQzFFLElBQUksT0FBTyxTQUFTLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDbkMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUN0QixTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBQ2hCLENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUNyRCxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxLQUFLO0lBQ25CLE9BQU8sQ0FDTCxNQUFjLEVBQ2QsV0FBaUIsRUFDakIsVUFBK0IsRUFDL0IsRUFBRTtRQUNGLElBQUksQ0FBQyxVQUFVO1lBQ2IsTUFBTSxJQUFJLEtBQUssQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDO1FBQ2pFLElBQUksVUFBVSxFQUFFLFlBQVksRUFBRSxDQUFDO1lBQzdCLFVBQVUsQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQ2xDLENBQUM7UUFDRCxPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTG9nTGV2ZWwgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IExvZ2dpbmcgfSBmcm9tIFwiLi9sb2dnaW5nXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE1ldGhvZCBkZWNvcmF0b3IgZm9yIGxvZ2dpbmcgZnVuY3Rpb24gY2FsbHNcbiAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBkZWNvcmF0b3IgdGhhdCBsb2dzIG1ldGhvZCBjYWxscyB3aXRoIHNwZWNpZmllZCBsZXZlbCwgYmVuY2htYXJraW5nLCBhbmQgdmVyYm9zaXR5XG4gKiBAcGFyYW0ge0xvZ0xldmVsfSBsZXZlbCAtIFRoZSBsb2cgbGV2ZWwgdG8gdXNlIChkZWZhdWx0OiBMb2dMZXZlbC5pbmZvKVxuICogQHBhcmFtIHtib29sZWFufSBbYmVuY2htYXJrPWZhbHNlXSAtIFdoZXRoZXIgdG8gbG9nIGV4ZWN1dGlvbiB0aW1lIChkZWZhdWx0OiBmYWxzZSlcbiAqIEBwYXJhbSB7bnVtYmVyfSBbdmVyYm9zaXR5PTBdIC0gVGhlIHZlcmJvc2l0eSBsZXZlbCBmb3IgdGhlIGxvZyBtZXNzYWdlcyAoZGVmYXVsdDogMClcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIG1ldGhvZCBkZWNvcmF0b3IgdGhhdCB3cmFwcyB0aGUgb3JpZ2luYWwgbWV0aG9kIHdpdGggbG9nZ2luZ1xuICogQGZ1bmN0aW9uIGxvZ1xuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgRGVjb3JhdG9yIGFzIGxvZyBkZWNvcmF0b3JcbiAqICAgcGFydGljaXBhbnQgTWV0aG9kIGFzIE9yaWdpbmFsIE1ldGhvZFxuICogICBwYXJ0aWNpcGFudCBMb2dnZXIgYXMgTG9nZ2luZyBpbnN0YW5jZVxuICpcbiAqICAgQ2xpZW50LT4+RGVjb3JhdG9yOiBjYWxsIGRlY29yYXRlZCBtZXRob2RcbiAqICAgRGVjb3JhdG9yLT4+TG9nZ2VyOiBsb2cgbWV0aG9kIGNhbGxcbiAqICAgRGVjb3JhdG9yLT4+TWV0aG9kOiBjYWxsIG9yaWdpbmFsIG1ldGhvZFxuICogICBhbHQgcmVzdWx0IGlzIFByb21pc2VcbiAqICAgICBNZXRob2QtLT4+RGVjb3JhdG9yOiByZXR1cm4gUHJvbWlzZVxuICogICAgIERlY29yYXRvci0+PkRlY29yYXRvcjogYXR0YWNoIHRoZW4gaGFuZGxlclxuICogICAgIE5vdGUgb3ZlciBEZWNvcmF0b3I6IFByb21pc2UgcmVzb2x2ZXNcbiAqICAgICBEZWNvcmF0b3ItPj5Mb2dnZXI6IGxvZyBiZW5jaG1hcmsgKGlmIGVuYWJsZWQpXG4gKiAgICAgRGVjb3JhdG9yLS0+PkNsaWVudDogcmV0dXJuIHJlc3VsdFxuICogICBlbHNlIHJlc3VsdCBpcyBub3QgUHJvbWlzZVxuICogICAgIE1ldGhvZC0tPj5EZWNvcmF0b3I6IHJldHVybiByZXN1bHRcbiAqICAgICBEZWNvcmF0b3ItPj5Mb2dnZXI6IGxvZyBiZW5jaG1hcmsgKGlmIGVuYWJsZWQpXG4gKiAgICAgRGVjb3JhdG9yLS0+PkNsaWVudDogcmV0dXJuIHJlc3VsdFxuICogICBlbmRcbiAqIEBjYXRlZ29yeSBNZXRob2QgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbG9nKFxuICBsZXZlbDogTG9nTGV2ZWwgPSBMb2dMZXZlbC5pbmZvLFxuICBiZW5jaG1hcms6IGJvb2xlYW4gPSBmYWxzZSxcbiAgdmVyYm9zaXR5ID0gMFxuKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoXG4gICAgdGFyZ2V0OiBhbnksXG4gICAgcHJvcGVydHlLZXk/OiBhbnksXG4gICAgZGVzY3JpcHRvcj86IFByb3BlcnR5RGVzY3JpcHRvclxuICApIHtcbiAgICBpZiAoIWRlc2NyaXB0b3IpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYExvZ2dpbmcgZGVjb3JhdGlvbiBvbmx5IGFwcGxpZXMgdG8gbWV0aG9kc2ApO1xuICAgIGNvbnN0IGxvZ2dlciA9IExvZ2dpbmcuZm9yKHRhcmdldCkuZm9yKHRhcmdldFtwcm9wZXJ0eUtleV0pO1xuICAgIGNvbnN0IG1ldGhvZCA9IGxvZ2dlcltsZXZlbF0uYmluZChsb2dnZXIpIGFzIGFueTtcbiAgICBjb25zdCBvcmlnaW5hbE1ldGhvZCA9IGRlc2NyaXB0b3IudmFsdWU7XG5cbiAgICBkZXNjcmlwdG9yLnZhbHVlID0gbmV3IFByb3h5KG9yaWdpbmFsTWV0aG9kLCB7XG4gICAgICBhcHBseShmbiwgdGhpc0FyZywgYXJnczogYW55W10pIHtcbiAgICAgICAgbWV0aG9kKGBjYWxsZWQgd2l0aCAke2FyZ3N9YCwgdmVyYm9zaXR5KTtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IFJlZmxlY3QuYXBwbHkoZm4sIHRoaXNBcmcsIGFyZ3MpO1xuICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LnRoZW4oKHI6IGFueSkgPT4ge1xuICAgICAgICAgICAgICBpZiAoYmVuY2htYXJrKVxuICAgICAgICAgICAgICAgIG1ldGhvZChgY29tcGxldGVkIGluICR7RGF0ZS5ub3coKSAtIHN0YXJ0fW1zYCwgdmVyYm9zaXR5KTtcbiAgICAgICAgICAgICAgcmV0dXJuIHI7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGJlbmNobWFyaylcbiAgICAgICAgICAgIG1ldGhvZChgY29tcGxldGVkIGluICR7RGF0ZS5ub3coKSAtIHN0YXJ0fW1zYCwgdmVyYm9zaXR5KTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBpZiAoYmVuY2htYXJrKSBtZXRob2QoYGZhaWxlZCBpbiAke0RhdGUubm93KCkgLSBzdGFydH1tc2AsIHZlcmJvc2l0eSk7XG4gICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pO1xuICB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBNZXRob2QgZGVjb3JhdG9yIGZvciBsb2dnaW5nIGZ1bmN0aW9uIGNhbGxzIHdpdGggZGVidWcgbGV2ZWxcbiAqIEBzdW1tYXJ5IENvbnZlbmllbmNlIHdyYXBwZXIgYXJvdW5kIHRoZSBsb2cgZGVjb3JhdG9yIHRoYXQgdXNlcyBMb2dMZXZlbC5kZWJ1Z1xuICogQHBhcmFtIHtib29sZWFufSBbYmVuY2htYXJrPWZhbHNlXSAtIFdoZXRoZXIgdG8gbG9nIGV4ZWN1dGlvbiB0aW1lIChkZWZhdWx0OiBmYWxzZSlcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIG1ldGhvZCBkZWNvcmF0b3IgdGhhdCB3cmFwcyB0aGUgb3JpZ2luYWwgbWV0aG9kIHdpdGggZGVidWcgbG9nZ2luZ1xuICogQGZ1bmN0aW9uIGRlYnVnXG4gKiBAY2F0ZWdvcnkgTWV0aG9kIERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlYnVnKGJlbmNobWFyazogYm9vbGVhbiA9IGZhbHNlKSB7XG4gIHJldHVybiBsb2coTG9nTGV2ZWwuZGVidWcsIGJlbmNobWFyayk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE1ldGhvZCBkZWNvcmF0b3IgZm9yIGxvZ2dpbmcgZnVuY3Rpb24gY2FsbHMgd2l0aCBpbmZvIGxldmVsXG4gKiBAc3VtbWFyeSBDb252ZW5pZW5jZSB3cmFwcGVyIGFyb3VuZCB0aGUgbG9nIGRlY29yYXRvciB0aGF0IHVzZXMgTG9nTGV2ZWwuaW5mb1xuICogQHBhcmFtIHtib29sZWFufSBbYmVuY2htYXJrPWZhbHNlXSAtIFdoZXRoZXIgdG8gbG9nIGV4ZWN1dGlvbiB0aW1lIChkZWZhdWx0OiBmYWxzZSlcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIG1ldGhvZCBkZWNvcmF0b3IgdGhhdCB3cmFwcyB0aGUgb3JpZ2luYWwgbWV0aG9kIHdpdGggaW5mbyBsb2dnaW5nXG4gKiBAZnVuY3Rpb24gaW5mb1xuICogQGNhdGVnb3J5IE1ldGhvZCBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmZvKGJlbmNobWFyazogYm9vbGVhbiA9IGZhbHNlKSB7XG4gIHJldHVybiBsb2coTG9nTGV2ZWwuaW5mbywgYmVuY2htYXJrKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTWV0aG9kIGRlY29yYXRvciBmb3IgbG9nZ2luZyBmdW5jdGlvbiBjYWxscyB3aXRoIHNpbGx5IGxldmVsXG4gKiBAc3VtbWFyeSBDb252ZW5pZW5jZSB3cmFwcGVyIGFyb3VuZCB0aGUgbG9nIGRlY29yYXRvciB0aGF0IHVzZXMgTG9nTGV2ZWwuc2lsbHlcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2JlbmNobWFyaz1mYWxzZV0gLSBXaGV0aGVyIHRvIGxvZyBleGVjdXRpb24gdGltZSAoZGVmYXVsdDogZmFsc2UpXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBtZXRob2QgZGVjb3JhdG9yIHRoYXQgd3JhcHMgdGhlIG9yaWdpbmFsIG1ldGhvZCB3aXRoIHNpbGx5IGxvZ2dpbmdcbiAqIEBmdW5jdGlvbiBzaWxseVxuICogQGNhdGVnb3J5IE1ldGhvZCBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaWxseShiZW5jaG1hcms6IGJvb2xlYW4gPSBmYWxzZSkge1xuICByZXR1cm4gbG9nKExvZ0xldmVsLnNpbGx5LCBiZW5jaG1hcmspO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBNZXRob2QgZGVjb3JhdG9yIGZvciBsb2dnaW5nIGZ1bmN0aW9uIGNhbGxzIHdpdGggdmVyYm9zZSBsZXZlbFxuICogQHN1bW1hcnkgQ29udmVuaWVuY2Ugd3JhcHBlciBhcm91bmQgdGhlIGxvZyBkZWNvcmF0b3IgdGhhdCB1c2VzIExvZ0xldmVsLnZlcmJvc2Ugd2l0aCBjb25maWd1cmFibGUgdmVyYm9zaXR5XG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBtZXRob2QgZGVjb3JhdG9yIHRoYXQgd3JhcHMgdGhlIG9yaWdpbmFsIG1ldGhvZCB3aXRoIHZlcmJvc2UgbG9nZ2luZ1xuICogQGZ1bmN0aW9uIHZlcmJvc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZlcmJvc2UoKTogKFxuICB0YXJnZXQ6IGFueSxcbiAgcHJvcGVydHlLZXk/OiBhbnksXG4gIGRlc2NyaXB0b3I/OiBhbnlcbikgPT4gdm9pZDtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTWV0aG9kIGRlY29yYXRvciBmb3IgbG9nZ2luZyBmdW5jdGlvbiBjYWxscyB3aXRoIHZlcmJvc2UgbGV2ZWxcbiAqIEBzdW1tYXJ5IENvbnZlbmllbmNlIHdyYXBwZXIgYXJvdW5kIHRoZSBsb2cgZGVjb3JhdG9yIHRoYXQgdXNlcyBMb2dMZXZlbC52ZXJib3NlIHdpdGggY29uZmlndXJhYmxlIHZlcmJvc2l0eVxuICogQHBhcmFtIHtib29sZWFufSBiZW5jaG1hcmsgLSBXaGV0aGVyIHRvIGxvZyBleGVjdXRpb24gdGltZVxuICogQHJldHVybiB7RnVuY3Rpb259IEEgbWV0aG9kIGRlY29yYXRvciB0aGF0IHdyYXBzIHRoZSBvcmlnaW5hbCBtZXRob2Qgd2l0aCB2ZXJib3NlIGxvZ2dpbmdcbiAqIEBmdW5jdGlvbiB2ZXJib3NlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2ZXJib3NlKFxuICBiZW5jaG1hcms6IGJvb2xlYW5cbik6ICh0YXJnZXQ6IGFueSwgcHJvcGVydHlLZXk/OiBhbnksIGRlc2NyaXB0b3I/OiBhbnkpID0+IHZvaWQ7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE1ldGhvZCBkZWNvcmF0b3IgZm9yIGxvZ2dpbmcgZnVuY3Rpb24gY2FsbHMgd2l0aCB2ZXJib3NlIGxldmVsXG4gKiBAc3VtbWFyeSBDb252ZW5pZW5jZSB3cmFwcGVyIGFyb3VuZCB0aGUgbG9nIGRlY29yYXRvciB0aGF0IHVzZXMgTG9nTGV2ZWwudmVyYm9zZSB3aXRoIGNvbmZpZ3VyYWJsZSB2ZXJib3NpdHlcbiAqIEBwYXJhbSB7bnVtYmVyfSB2ZXJib3NpdHkgLSBUaGUgdmVyYm9zaXR5IGxldmVsIGZvciB0aGUgbG9nIG1lc3NhZ2VzIChkZWZhdWx0OiAwKVxuICogQHJldHVybiB7RnVuY3Rpb259IEEgbWV0aG9kIGRlY29yYXRvciB0aGF0IHdyYXBzIHRoZSBvcmlnaW5hbCBtZXRob2Qgd2l0aCB2ZXJib3NlIGxvZ2dpbmdcbiAqIEBmdW5jdGlvbiB2ZXJib3NlXG4gKiBAY2F0ZWdvcnkgTWV0aG9kIERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZlcmJvc2UoXG4gIHZlcmJvc2l0eTogbnVtYmVyIHwgYm9vbGVhblxuKTogKHRhcmdldDogYW55LCBwcm9wZXJ0eUtleT86IGFueSwgZGVzY3JpcHRvcj86IGFueSkgPT4gdm9pZDtcbi8qKlxuICogQGRlc2NyaXB0aW9uIE1ldGhvZCBkZWNvcmF0b3IgZm9yIGxvZ2dpbmcgZnVuY3Rpb24gY2FsbHMgd2l0aCB2ZXJib3NlIGxldmVsXG4gKiBAc3VtbWFyeSBDb252ZW5pZW5jZSB3cmFwcGVyIGFyb3VuZCB0aGUgbG9nIGRlY29yYXRvciB0aGF0IHVzZXMgTG9nTGV2ZWwudmVyYm9zZSB3aXRoIGNvbmZpZ3VyYWJsZSB2ZXJib3NpdHlcbiAqIEBwYXJhbSB7bnVtYmVyfSB2ZXJib3NpdHkgLSBUaGUgdmVyYm9zaXR5IGxldmVsIGZvciB0aGUgbG9nIG1lc3NhZ2VzIChkZWZhdWx0OiAwKVxuICogQHBhcmFtIHtib29sZWFufSBbYmVuY2htYXJrPWZhbHNlXSAtIFdoZXRoZXIgdG8gbG9nIGV4ZWN1dGlvbiB0aW1lIChkZWZhdWx0OiBmYWxzZSlcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIG1ldGhvZCBkZWNvcmF0b3IgdGhhdCB3cmFwcyB0aGUgb3JpZ2luYWwgbWV0aG9kIHdpdGggdmVyYm9zZSBsb2dnaW5nXG4gKiBAZnVuY3Rpb24gdmVyYm9zZVxuICogQGNhdGVnb3J5IE1ldGhvZCBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2ZXJib3NlKHZlcmJvc2l0eTogbnVtYmVyIHwgYm9vbGVhbiA9IDAsIGJlbmNobWFyaz86IGJvb2xlYW4pIHtcbiAgaWYgKHR5cGVvZiB2ZXJib3NpdHkgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgYmVuY2htYXJrID0gdmVyYm9zaXR5O1xuICAgIHZlcmJvc2l0eSA9IDA7XG4gIH1cbiAgcmV0dXJuIGxvZyhMb2dMZXZlbC52ZXJib3NlLCBiZW5jaG1hcmssIHZlcmJvc2l0eSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBkZWNvcmF0b3IgdGhhdCBtYWtlcyBhIG1ldGhvZCBub24tY29uZmlndXJhYmxlXG4gKiBAc3VtbWFyeSBUaGlzIGRlY29yYXRvciBwcmV2ZW50cyBhIG1ldGhvZCBmcm9tIGJlaW5nIG92ZXJyaWRkZW4gYnkgbWFraW5nIGl0IG5vbi1jb25maWd1cmFibGUuXG4gKiBJdCB0aHJvd3MgYW4gZXJyb3IgaWYgdXNlZCBvbiBhbnl0aGluZyBvdGhlciB0aGFuIGEgbWV0aG9kLlxuICogQHJldHVybiB7RnVuY3Rpb259IEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gbWV0aG9kc1xuICogQGZ1bmN0aW9uIGZpbmFsXG4gKiBAY2F0ZWdvcnkgTWV0aG9kIERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmFsKCkge1xuICByZXR1cm4gKFxuICAgIHRhcmdldDogb2JqZWN0LFxuICAgIHByb3BlcnR5S2V5PzogYW55LFxuICAgIGRlc2NyaXB0b3I/OiBQcm9wZXJ0eURlc2NyaXB0b3JcbiAgKSA9PiB7XG4gICAgaWYgKCFkZXNjcmlwdG9yKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZmluYWwgZGVjb3JhdG9yIGNhbiBvbmx5IGJlIHVzZWQgb24gbWV0aG9kc1wiKTtcbiAgICBpZiAoZGVzY3JpcHRvcj8uY29uZmlndXJhYmxlKSB7XG4gICAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgfTtcbn1cbiJdfQ==
@@ -0,0 +1,86 @@
1
+ import { ObjectAccumulator } from "typed-object-accumulator";
2
+ /**
3
+ * @description Factory type for creating Environment instances.
4
+ * @summary Defines a function type that creates and returns Environment instances.
5
+ *
6
+ * @template T - The type of object the Environment will accumulate.
7
+ * @template E - The specific Environment type to be created, extending Environment<T>.
8
+ * @typedef {function(...unknown[]): E} EnvironmentFactory
9
+ * @memberOf module:Logging
10
+ */
11
+ export type EnvironmentFactory<T extends object, E extends Environment<T>> = (...args: unknown[]) => E;
12
+ /**
13
+ * @class Environment
14
+ * @extends {ObjectAccumulator<T>}
15
+ * @template T
16
+ * @description A class representing an environment with accumulation capabilities.
17
+ * @summary Manages environment-related data and provides methods for accumulation and key retrieval.
18
+ * @param {T} [initialData] - The initial data to populate the environment with.
19
+ */
20
+ export declare class Environment<T extends object> extends ObjectAccumulator<T> {
21
+ /**
22
+ * @static
23
+ * @protected
24
+ * @description A factory function for creating Environment instances.
25
+ * @summary Defines how new instances of the Environment class should be created.
26
+ * @return {Environment<any>} A new instance of the Environment class.
27
+ */
28
+ protected static factory: EnvironmentFactory<any, any>;
29
+ /**
30
+ * @static
31
+ * @private
32
+ * @description The singleton instance of the Environment class.
33
+ * @type {Environment<any>}
34
+ */
35
+ private static _instance;
36
+ protected constructor();
37
+ /**
38
+ * @description Retrieves a value from the environment
39
+ * @summary Gets a value from the environment variables, handling browser and Node.js environments differently
40
+ * @param {string} k - The key to retrieve from the environment
41
+ * @return {unknown} The value from the environment, or undefined if not found
42
+ */
43
+ protected fromEnv(k: string): unknown;
44
+ /**
45
+ * @description Expands an object into the environment
46
+ * @summary Defines properties on the environment object that can be accessed as getters and setters
47
+ * @template V - Type of the object being expanded
48
+ * @param {V} value - The object to expand into the environment
49
+ * @return {void}
50
+ */
51
+ protected expand<V extends object>(value: V): void;
52
+ /**
53
+ * @protected
54
+ * @static
55
+ * @description Retrieves or creates the singleton instance of the Environment class.
56
+ * @summary Ensures only one instance of the Environment class exists.
57
+ * @template E
58
+ * @param {...unknown[]} args - Arguments to pass to the factory function if a new instance is created.
59
+ * @return {E} The singleton instance of the Environment class.
60
+ */
61
+ protected static instance<E extends Environment<any>>(...args: unknown[]): E;
62
+ /**
63
+ * @static
64
+ * @description Accumulates the given value into the environment.
65
+ * @summary Adds new properties to the environment from the provided object.
66
+ * @template V
67
+ * @param {V} value - The object to accumulate into the environment.
68
+ * @return {V} The updated environment instance.
69
+ */
70
+ static accumulate<V extends object>(value: V): typeof Environment._instance & V & ObjectAccumulator<typeof Environment._instance & V>;
71
+ static get(key: string): any;
72
+ private static buildEnvProxy;
73
+ /**
74
+ * @static
75
+ * @description Retrieves the keys of the environment, optionally converting them to ENV format.
76
+ * @summary Gets all keys in the environment, with an option to format them for environment variables.
77
+ * @param {boolean} [toEnv=true] - Whether to convert the keys to ENV format.
78
+ * @return {string[]} An array of keys from the environment.
79
+ */
80
+ static keys(toEnv?: boolean): string[];
81
+ }
82
+ export declare const LoggedEnvironment: Environment<any> & import("./types").LoggingConfig & {
83
+ env: any;
84
+ } & ObjectAccumulator<Environment<any> & import("./types").LoggingConfig & {
85
+ env: any;
86
+ }>;
@@ -0,0 +1,200 @@
1
+ import { ObjectAccumulator } from "typed-object-accumulator";
2
+ import { toENVFormat } from "./text.js";
3
+ import { isBrowser } from "./web.js";
4
+ import { BrowserEnvKey, DefaultLoggingConfig, ENV_PATH_DELIMITER, } from "./constants.js";
5
+ /**
6
+ * @class Environment
7
+ * @extends {ObjectAccumulator<T>}
8
+ * @template T
9
+ * @description A class representing an environment with accumulation capabilities.
10
+ * @summary Manages environment-related data and provides methods for accumulation and key retrieval.
11
+ * @param {T} [initialData] - The initial data to populate the environment with.
12
+ */
13
+ export class Environment extends ObjectAccumulator {
14
+ /**
15
+ * @static
16
+ * @protected
17
+ * @description A factory function for creating Environment instances.
18
+ * @summary Defines how new instances of the Environment class should be created.
19
+ * @return {Environment<any>} A new instance of the Environment class.
20
+ */
21
+ static { this.factory = () => new Environment(); }
22
+ constructor() {
23
+ super();
24
+ }
25
+ /**
26
+ * @description Retrieves a value from the environment
27
+ * @summary Gets a value from the environment variables, handling browser and Node.js environments differently
28
+ * @param {string} k - The key to retrieve from the environment
29
+ * @return {unknown} The value from the environment, or undefined if not found
30
+ */
31
+ fromEnv(k) {
32
+ let env;
33
+ if (isBrowser()) {
34
+ env = globalThis[BrowserEnvKey];
35
+ }
36
+ else {
37
+ env = globalThis.process.env;
38
+ k = toENVFormat(k);
39
+ }
40
+ return env[k];
41
+ }
42
+ /**
43
+ * @description Expands an object into the environment
44
+ * @summary Defines properties on the environment object that can be accessed as getters and setters
45
+ * @template V - Type of the object being expanded
46
+ * @param {V} value - The object to expand into the environment
47
+ * @return {void}
48
+ */
49
+ expand(value) {
50
+ Object.entries(value).forEach(([k, v]) => {
51
+ Object.defineProperty(this, k, {
52
+ get: () => {
53
+ const fromEnv = this.fromEnv(k);
54
+ if (typeof fromEnv !== "undefined")
55
+ return fromEnv;
56
+ if (v && typeof v === "object") {
57
+ return Environment.buildEnvProxy(v, [k]);
58
+ }
59
+ // If the model provides an empty string, expose a proxy that composes ENV keys
60
+ if (v === "") {
61
+ return Environment.buildEnvProxy(undefined, [k]);
62
+ }
63
+ return v;
64
+ },
65
+ set: (val) => {
66
+ v = val;
67
+ },
68
+ configurable: true,
69
+ enumerable: true,
70
+ });
71
+ });
72
+ }
73
+ /**
74
+ * @protected
75
+ * @static
76
+ * @description Retrieves or creates the singleton instance of the Environment class.
77
+ * @summary Ensures only one instance of the Environment class exists.
78
+ * @template E
79
+ * @param {...unknown[]} args - Arguments to pass to the factory function if a new instance is created.
80
+ * @return {E} The singleton instance of the Environment class.
81
+ */
82
+ static instance(...args) {
83
+ if (!Environment._instance) {
84
+ const base = Environment.factory(...args);
85
+ const proxied = new Proxy(base, {
86
+ get(target, prop, receiver) {
87
+ const value = Reflect.get(target, prop, receiver);
88
+ if (typeof value !== "undefined")
89
+ return value;
90
+ if (typeof prop === "string") {
91
+ // Avoid interfering with logging config lookups for optional fields like 'app'
92
+ if (prop === "app")
93
+ return undefined;
94
+ return Environment.buildEnvProxy(undefined, [prop]);
95
+ }
96
+ return value;
97
+ },
98
+ });
99
+ Environment._instance = proxied;
100
+ }
101
+ return Environment._instance;
102
+ }
103
+ /**
104
+ * @static
105
+ * @description Accumulates the given value into the environment.
106
+ * @summary Adds new properties to the environment from the provided object.
107
+ * @template V
108
+ * @param {V} value - The object to accumulate into the environment.
109
+ * @return {V} The updated environment instance.
110
+ */
111
+ static accumulate(value) {
112
+ const instance = Environment.instance();
113
+ Object.keys(instance).forEach((key) => {
114
+ const desc = Object.getOwnPropertyDescriptor(instance, key);
115
+ if (desc && desc.configurable && desc.enumerable) {
116
+ Object.defineProperty(instance, key, {
117
+ ...desc,
118
+ enumerable: false,
119
+ });
120
+ }
121
+ });
122
+ return instance.accumulate(value);
123
+ }
124
+ static get(key) {
125
+ return Environment._instance.get(key);
126
+ }
127
+ static buildEnvProxy(current, path) {
128
+ const buildKey = (p) => p.map((seg) => toENVFormat(seg)).join(ENV_PATH_DELIMITER);
129
+ // Helper to read from the active environment given a composed key
130
+ const readEnv = (key) => {
131
+ if (isBrowser()) {
132
+ const env = globalThis[BrowserEnvKey];
133
+ return env ? env[key] : undefined;
134
+ }
135
+ return globalThis?.process?.env?.[key];
136
+ };
137
+ const handler = {
138
+ get(_target, prop) {
139
+ if (prop === Symbol.toPrimitive) {
140
+ return () => buildKey(path);
141
+ }
142
+ if (prop === "toString") {
143
+ return () => buildKey(path);
144
+ }
145
+ if (prop === "valueOf") {
146
+ return () => buildKey(path);
147
+ }
148
+ if (typeof prop === "symbol")
149
+ return undefined;
150
+ const nextModel = current && Object.prototype.hasOwnProperty.call(current, prop)
151
+ ? current[prop]
152
+ : undefined;
153
+ const nextPath = [...path, prop];
154
+ const composedKey = buildKey(nextPath);
155
+ // If an ENV value exists for this path, return it directly
156
+ const envValue = readEnv(composedKey);
157
+ if (typeof envValue !== "undefined")
158
+ return envValue;
159
+ // Otherwise, if the model has an object at this path, keep drilling with a proxy
160
+ const isNextObject = nextModel && typeof nextModel === "object";
161
+ if (isNextObject)
162
+ return Environment.buildEnvProxy(nextModel, nextPath);
163
+ // Always return a proxy for further path composition when no ENV value;
164
+ // do not surface primitive model defaults here (this API is for key composition).
165
+ return Environment.buildEnvProxy(undefined, nextPath);
166
+ },
167
+ ownKeys() {
168
+ return current ? Reflect.ownKeys(current) : [];
169
+ },
170
+ getOwnPropertyDescriptor(_t, p) {
171
+ if (!current)
172
+ return undefined;
173
+ if (Object.prototype.hasOwnProperty.call(current, p)) {
174
+ return { enumerable: true, configurable: true };
175
+ }
176
+ return undefined;
177
+ },
178
+ };
179
+ const target = {};
180
+ return new Proxy(target, handler);
181
+ }
182
+ /**
183
+ * @static
184
+ * @description Retrieves the keys of the environment, optionally converting them to ENV format.
185
+ * @summary Gets all keys in the environment, with an option to format them for environment variables.
186
+ * @param {boolean} [toEnv=true] - Whether to convert the keys to ENV format.
187
+ * @return {string[]} An array of keys from the environment.
188
+ */
189
+ static keys(toEnv = true) {
190
+ return Environment.instance()
191
+ .keys()
192
+ .map((k) => (toEnv ? toENVFormat(k) : k));
193
+ }
194
+ }
195
+ export const LoggedEnvironment = Environment.accumulate(Object.assign({}, DefaultLoggingConfig, {
196
+ env: (isBrowser() && globalThis[BrowserEnvKey]
197
+ ? globalThis[BrowserEnvKey]["NODE_ENV"]
198
+ : globalThis.process.env["NODE_ENV"]) || "development",
199
+ }));
200
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52aXJvbm1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZW52aXJvbm1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFdBQVcsRUFBRSxrQkFBZTtBQUNyQyxPQUFPLEVBQUUsU0FBUyxFQUFFLGlCQUFjO0FBQ2xDLE9BQU8sRUFDTCxhQUFhLEVBQ2Isb0JBQW9CLEVBQ3BCLGtCQUFrQixHQUNuQix1QkFBb0I7QUFlckI7Ozs7Ozs7R0FPRztBQUNILE1BQU0sT0FBTyxXQUE4QixTQUFRLGlCQUFvQjtJQUNyRTs7Ozs7O09BTUc7YUFDYyxZQUFPLEdBQ3RCLEdBQXFCLEVBQUUsQ0FBQyxJQUFJLFdBQVcsRUFBRSxDQUFDO0lBVTVDO1FBQ0UsS0FBSyxFQUFFLENBQUM7SUFDVixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDTyxPQUFPLENBQUMsQ0FBUztRQUN6QixJQUFJLEdBQTRCLENBQUM7UUFDakMsSUFBSSxTQUFTLEVBQUUsRUFBRSxDQUFDO1lBQ2hCLEdBQUcsR0FDRCxVQUdELENBQUMsYUFBYSxDQUFDLENBQUM7UUFDbkIsQ0FBQzthQUFNLENBQUM7WUFDTixHQUFHLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUM7WUFDN0IsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyQixDQUFDO1FBQ0QsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNnQixNQUFNLENBQW1CLEtBQVE7UUFDbEQsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQ3ZDLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUMsRUFB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QUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDckQsT0FBTyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBd0IsQ0FBQztnQkFDeEUsQ0FBQztnQkFDRCxPQUFPLFNBQWdCLENBQUM7WUFDMUIsQ0FBQztTQUNGLENBQUM7UUFFRixNQUFNLE1BQU0sR0FBRyxFQUFTLENBQUM7UUFDekIsT0FBTyxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBaUIsSUFBSTtRQUMvQixPQUFPLFdBQVcsQ0FBQyxRQUFRLEVBQUU7YUFDMUIsSUFBSSxFQUFFO2FBQ04sR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlDLENBQUM7O0FBR0gsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FDckQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsb0JBQW9CLEVBQUU7SUFDdEMsR0FBRyxFQUNELENBQUMsU0FBUyxFQUFFLElBQUssVUFBa0IsQ0FBQyxhQUFhLENBQUM7UUFDaEQsQ0FBQyxDQUFFLFVBQWtCLENBQUMsYUFBYSxDQUFDLENBQUMsVUFBVSxDQUFDO1FBQ2hELENBQUMsQ0FBRSxVQUFrQixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxhQUFhO0NBQ3BFLENBQUMsQ0FDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT2JqZWN0QWNjdW11bGF0b3IgfSBmcm9tIFwidHlwZWQtb2JqZWN0LWFjY3VtdWxhdG9yXCI7XG5pbXBvcnQgeyB0b0VOVkZvcm1hdCB9IGZyb20gXCIuL3RleHRcIjtcbmltcG9ydCB7IGlzQnJvd3NlciB9IGZyb20gXCIuL3dlYlwiO1xuaW1wb3J0IHtcbiAgQnJvd3NlckVudktleSxcbiAgRGVmYXVsdExvZ2dpbmdDb25maWcsXG4gIEVOVl9QQVRIX0RFTElNSVRFUixcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEZhY3RvcnkgdHlwZSBmb3IgY3JlYXRpbmcgRW52aXJvbm1lbnQgaW5zdGFuY2VzLlxuICogQHN1bW1hcnkgRGVmaW5lcyBhIGZ1bmN0aW9uIHR5cGUgdGhhdCBjcmVhdGVzIGFuZCByZXR1cm5zIEVudmlyb25tZW50IGluc3RhbmNlcy5cbiAqXG4gKiBAdGVtcGxhdGUgVCAtIFRoZSB0eXBlIG9mIG9iamVjdCB0aGUgRW52aXJvbm1lbnQgd2lsbCBhY2N1bXVsYXRlLlxuICogQHRlbXBsYXRlIEUgLSBUaGUgc3BlY2lmaWMgRW52aXJvbm1lbnQgdHlwZSB0byBiZSBjcmVhdGVkLCBleHRlbmRpbmcgRW52aXJvbm1lbnQ8VD4uXG4gKiBAdHlwZWRlZiB7ZnVuY3Rpb24oLi4udW5rbm93bltdKTogRX0gRW52aXJvbm1lbnRGYWN0b3J5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOkxvZ2dpbmdcbiAqL1xuZXhwb3J0IHR5cGUgRW52aXJvbm1lbnRGYWN0b3J5PFQgZXh0ZW5kcyBvYmplY3QsIEUgZXh0ZW5kcyBFbnZpcm9ubWVudDxUPj4gPSAoXG4gIC4uLmFyZ3M6IHVua25vd25bXVxuKSA9PiBFO1xuXG4vKipcbiAqIEBjbGFzcyBFbnZpcm9ubWVudFxuICogQGV4dGVuZHMge09iamVjdEFjY3VtdWxhdG9yPFQ+fVxuICogQHRlbXBsYXRlIFRcbiAqIEBkZXNjcmlwdGlvbiBBIGNsYXNzIHJlcHJlc2VudGluZyBhbiBlbnZpcm9ubWVudCB3aXRoIGFjY3VtdWxhdGlvbiBjYXBhYmlsaXRpZXMuXG4gKiBAc3VtbWFyeSBNYW5hZ2VzIGVudmlyb25tZW50LXJlbGF0ZWQgZGF0YSBhbmQgcHJvdmlkZXMgbWV0aG9kcyBmb3IgYWNjdW11bGF0aW9uIGFuZCBrZXkgcmV0cmlldmFsLlxuICogQHBhcmFtIHtUfSBbaW5pdGlhbERhdGFdIC0gVGhlIGluaXRpYWwgZGF0YSB0byBwb3B1bGF0ZSB0aGUgZW52aXJvbm1lbnQgd2l0aC5cbiAqL1xuZXhwb3J0IGNsYXNzIEVudmlyb25tZW50PFQgZXh0ZW5kcyBvYmplY3Q+IGV4dGVuZHMgT2JqZWN0QWNjdW11bGF0b3I8VD4ge1xuICAvKipcbiAgICogQHN0YXRpY1xuICAgKiBAcHJvdGVjdGVkXG4gICAqIEBkZXNjcmlwdGlvbiBBIGZhY3RvcnkgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIEVudmlyb25tZW50IGluc3RhbmNlcy5cbiAgICogQHN1bW1hcnkgRGVmaW5lcyBob3cgbmV3IGluc3RhbmNlcyBvZiB0aGUgRW52aXJvbm1lbnQgY2xhc3Mgc2hvdWxkIGJlIGNyZWF0ZWQuXG4gICAqIEByZXR1cm4ge0Vudmlyb25tZW50PGFueT59IEEgbmV3IGluc3RhbmNlIG9mIHRoZSBFbnZpcm9ubWVudCBjbGFzcy5cbiAgICovXG4gIHByb3RlY3RlZCBzdGF0aWMgZmFjdG9yeTogRW52aXJvbm1lbnRGYWN0b3J5PGFueSwgYW55PiA9XG4gICAgKCk6IEVudmlyb25tZW50PGFueT4gPT4gbmV3IEVudmlyb25tZW50KCk7XG5cbiAgLyoqXG4gICAqIEBzdGF0aWNcbiAgICogQHByaXZhdGVcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVudmlyb25tZW50IGNsYXNzLlxuICAgKiBAdHlwZSB7RW52aXJvbm1lbnQ8YW55Pn1cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIF9pbnN0YW5jZTogRW52aXJvbm1lbnQ8YW55PjtcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGEgdmFsdWUgZnJvbSB0aGUgZW52aXJvbm1lbnRcbiAgICogQHN1bW1hcnkgR2V0cyBhIHZhbHVlIGZyb20gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcywgaGFuZGxpbmcgYnJvd3NlciBhbmQgTm9kZS5qcyBlbnZpcm9ubWVudHMgZGlmZmVyZW50bHlcbiAgICogQHBhcmFtIHtzdHJpbmd9IGsgLSBUaGUga2V5IHRvIHJldHJpZXZlIGZyb20gdGhlIGVudmlyb25tZW50XG4gICAqIEByZXR1cm4ge3Vua25vd259IFRoZSB2YWx1ZSBmcm9tIHRoZSBlbnZpcm9ubWVudCwgb3IgdW5kZWZpbmVkIGlmIG5vdCBmb3VuZFxuICAgKi9cbiAgcHJvdGVjdGVkIGZyb21FbnYoazogc3RyaW5nKSB7XG4gICAgbGV0IGVudjogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgaWYgKGlzQnJvd3NlcigpKSB7XG4gICAgICBlbnYgPSAoXG4gICAgICAgIGdsb2JhbFRoaXMgYXMgdHlwZW9mIGdsb2JhbFRoaXMgJiB7XG4gICAgICAgICAgW0Jyb3dzZXJFbnZLZXldOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgICAgICB9XG4gICAgICApW0Jyb3dzZXJFbnZLZXldO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbnYgPSBnbG9iYWxUaGlzLnByb2Nlc3MuZW52O1xuICAgICAgayA9IHRvRU5WRm9ybWF0KGspO1xuICAgIH1cbiAgICByZXR1cm4gZW52W2tdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeHBhbmRzIGFuIG9iamVjdCBpbnRvIHRoZSBlbnZpcm9ubWVudFxuICAgKiBAc3VtbWFyeSBEZWZpbmVzIHByb3BlcnRpZXMgb24gdGhlIGVudmlyb25tZW50IG9iamVjdCB0aGF0IGNhbiBiZSBhY2Nlc3NlZCBhcyBnZXR0ZXJzIGFuZCBzZXR0ZXJzXG4gICAqIEB0ZW1wbGF0ZSBWIC0gVHlwZSBvZiB0aGUgb2JqZWN0IGJlaW5nIGV4cGFuZGVkXG4gICAqIEBwYXJhbSB7Vn0gdmFsdWUgLSBUaGUgb2JqZWN0IHRvIGV4cGFuZCBpbnRvIHRoZSBlbnZpcm9ubWVudFxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGV4cGFuZDxWIGV4dGVuZHMgb2JqZWN0Pih2YWx1ZTogVik6IHZvaWQge1xuICAgIE9iamVjdC5lbnRyaWVzKHZhbHVlKS5mb3JFYWNoKChbaywgdl0pID0+IHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBrLCB7XG4gICAgICAgIGdldDogKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGZyb21FbnYgPSB0aGlzLmZyb21FbnYoayk7XG4gICAgICAgICAgaWYgKHR5cGVvZiBmcm9tRW52ICE9PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gZnJvbUVudjtcbiAgICAgICAgICBpZiAodiAmJiB0eXBlb2YgdiA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgcmV0dXJuIEVudmlyb25tZW50LmJ1aWxkRW52UHJveHkodiBhcyBhbnksIFtrXSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIElmIHRoZSBtb2RlbCBwcm92aWRlcyBhbiBlbXB0eSBzdHJpbmcsIGV4cG9zZSBhIHByb3h5IHRoYXQgY29tcG9zZXMgRU5WIGtleXNcbiAgICAgICAgICBpZiAodiA9PT0gXCJcIikge1xuICAgICAgICAgICAgcmV0dXJuIEVudmlyb25tZW50LmJ1aWxkRW52UHJveHkodW5kZWZpbmVkLCBba10pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiAodmFsOiBWW2tleW9mIFZdKSA9PiB7XG4gICAgICAgICAgdiA9IHZhbDtcbiAgICAgICAgfSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQHByb3RlY3RlZFxuICAgKiBAc3RhdGljXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgb3IgY3JlYXRlcyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFbnZpcm9ubWVudCBjbGFzcy5cbiAgICogQHN1bW1hcnkgRW5zdXJlcyBvbmx5IG9uZSBpbnN0YW5jZSBvZiB0aGUgRW52aXJvbm1lbnQgY2xhc3MgZXhpc3RzLlxuICAgKiBAdGVtcGxhdGUgRVxuICAgKiBAcGFyYW0gey4uLnVua25vd25bXX0gYXJncyAtIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBmYWN0b3J5IGZ1bmN0aW9uIGlmIGEgbmV3IGluc3RhbmNlIGlzIGNyZWF0ZWQuXG4gICAqIEByZXR1cm4ge0V9IFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVudmlyb25tZW50IGNsYXNzLlxuICAgKi9cbiAgcHJvdGVjdGVkIHN0YXRpYyBpbnN0YW5jZTxFIGV4dGVuZHMgRW52aXJvbm1lbnQ8YW55Pj4oLi4uYXJnczogdW5rbm93bltdKTogRSB7XG4gICAgaWYgKCFFbnZpcm9ubWVudC5faW5zdGFuY2UpIHtcbiAgICAgIGNvbnN0IGJhc2UgPSBFbnZpcm9ubWVudC5mYWN0b3J5KC4uLmFyZ3MpIGFzIEU7XG4gICAgICBjb25zdCBwcm94aWVkID0gbmV3IFByb3h5KGJhc2UgYXMgYW55LCB7XG4gICAgICAgIGdldCh0YXJnZXQsIHByb3AsIHJlY2VpdmVyKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3AsIHJlY2VpdmVyKTtcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgaWYgKHR5cGVvZiBwcm9wID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAvLyBBdm9pZCBpbnRlcmZlcmluZyB3aXRoIGxvZ2dpbmcgY29uZmlnIGxvb2t1cHMgZm9yIG9wdGlvbmFsIGZpZWxkcyBsaWtlICdhcHAnXG4gICAgICAgICAgICBpZiAocHJvcCA9PT0gXCJhcHBcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiBFbnZpcm9ubWVudC5idWlsZEVudlByb3h5KHVuZGVmaW5lZCwgW3Byb3BdKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBFbnZpcm9ubWVudC5faW5zdGFuY2UgPSBwcm94aWVkIGFzIGFueTtcbiAgICB9XG4gICAgcmV0dXJuIEVudmlyb25tZW50Ll9pbnN0YW5jZSBhcyBFO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdGF0aWNcbiAgICogQGRlc2NyaXB0aW9uIEFjY3VtdWxhdGVzIHRoZSBnaXZlbiB2YWx1ZSBpbnRvIHRoZSBlbnZpcm9ubWVudC5cbiAgICogQHN1bW1hcnkgQWRkcyBuZXcgcHJvcGVydGllcyB0byB0aGUgZW52aXJvbm1lbnQgZnJvbSB0aGUgcHJvdmlkZWQgb2JqZWN0LlxuICAgKiBAdGVtcGxhdGUgVlxuICAgKiBAcGFyYW0ge1Z9IHZhbHVlIC0gVGhlIG9iamVjdCB0byBhY2N1bXVsYXRlIGludG8gdGhlIGVudmlyb25tZW50LlxuICAgKiBAcmV0dXJuIHtWfSBUaGUgdXBkYXRlZCBlbnZpcm9ubWVudCBpbnN0YW5jZS5cbiAgICovXG4gIHN0YXRpYyBhY2N1bXVsYXRlPFYgZXh0ZW5kcyBvYmplY3Q+KFxuICAgIHZhbHVlOiBWXG4gICk6IHR5cGVvZiBFbnZpcm9ubWVudC5faW5zdGFuY2UgJlxuICAgIFYgJlxuICAgIE9iamVjdEFjY3VtdWxhdG9yPHR5cGVvZiBFbnZpcm9ubWVudC5faW5zdGFuY2UgJiBWPiB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBFbnZpcm9ubWVudC5pbnN0YW5jZSgpO1xuICAgIE9iamVjdC5rZXlzKGluc3RhbmNlIGFzIGFueSkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBjb25zdCBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihpbnN0YW5jZSBhcyBhbnksIGtleSk7XG4gICAgICBpZiAoZGVzYyAmJiBkZXNjLmNvbmZpZ3VyYWJsZSAmJiBkZXNjLmVudW1lcmFibGUpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGluc3RhbmNlIGFzIGFueSwga2V5LCB7XG4gICAgICAgICAgLi4uZGVzYyxcbiAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGluc3RhbmNlLmFjY3VtdWxhdGUodmFsdWUpO1xuICB9XG5cbiAgc3RhdGljIGdldChrZXk6IHN0cmluZykge1xuICAgIHJldHVybiBFbnZpcm9ubWVudC5faW5zdGFuY2UuZ2V0KGtleSk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBidWlsZEVudlByb3h5KGN1cnJlbnQ6IGFueSwgcGF0aDogc3RyaW5nW10pOiBhbnkge1xuICAgIGNvbnN0IGJ1aWxkS2V5ID0gKHA6IHN0cmluZ1tdKSA9PlxuICAgICAgcC5tYXAoKHNlZykgPT4gdG9FTlZGb3JtYXQoc2VnKSkuam9pbihFTlZfUEFUSF9ERUxJTUlURVIpO1xuXG4gICAgLy8gSGVscGVyIHRvIHJlYWQgZnJvbSB0aGUgYWN0aXZlIGVudmlyb25tZW50IGdpdmVuIGEgY29tcG9zZWQga2V5XG4gICAgY29uc3QgcmVhZEVudiA9IChrZXk6IHN0cmluZyk6IHVua25vd24gPT4ge1xuICAgICAgaWYgKGlzQnJvd3NlcigpKSB7XG4gICAgICAgIGNvbnN0IGVudiA9IChcbiAgICAgICAgICBnbG9iYWxUaGlzIGFzIHR5cGVvZiBnbG9iYWxUaGlzICYge1xuICAgICAgICAgICAgW0Jyb3dzZXJFbnZLZXldPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgICAgfVxuICAgICAgICApW0Jyb3dzZXJFbnZLZXldO1xuICAgICAgICByZXR1cm4gZW52ID8gZW52W2tleV0gOiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gKGdsb2JhbFRoaXMgYXMgYW55KT8ucHJvY2Vzcz8uZW52Py5ba2V5XTtcbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlcjogUHJveHlIYW5kbGVyPGFueT4gPSB7XG4gICAgICBnZXQoX3RhcmdldCwgcHJvcDogc3RyaW5nIHwgc3ltYm9sKSB7XG4gICAgICAgIGlmIChwcm9wID09PSBTeW1ib2wudG9QcmltaXRpdmUpIHtcbiAgICAgICAgICByZXR1cm4gKCkgPT4gYnVpbGRLZXkocGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb3AgPT09IFwidG9TdHJpbmdcIikge1xuICAgICAgICAgIHJldHVybiAoKSA9PiBidWlsZEtleShwYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvcCA9PT0gXCJ2YWx1ZU9mXCIpIHtcbiAgICAgICAgICByZXR1cm4gKCkgPT4gYnVpbGRLZXkocGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBwcm9wID09PSBcInN5bWJvbFwiKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgICAgIGNvbnN0IG5leHRNb2RlbCA9XG4gICAgICAgICAgY3VycmVudCAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY3VycmVudCwgcHJvcClcbiAgICAgICAgICAgID8gKGN1cnJlbnQgYXMgYW55KVtwcm9wXVxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IG5leHRQYXRoID0gWy4uLnBhdGgsIHByb3BdO1xuICAgICAgICBjb25zdCBjb21wb3NlZEtleSA9IGJ1aWxkS2V5KG5leHRQYXRoKTtcblxuICAgICAgICAvLyBJZiBhbiBFTlYgdmFsdWUgZXhpc3RzIGZvciB0aGlzIHBhdGgsIHJldHVybiBpdCBkaXJlY3RseVxuICAgICAgICBjb25zdCBlbnZWYWx1ZSA9IHJlYWRFbnYoY29tcG9zZWRLZXkpO1xuICAgICAgICBpZiAodHlwZW9mIGVudlZhbHVlICE9PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gZW52VmFsdWU7XG5cbiAgICAgICAgLy8gT3RoZXJ3aXNlLCBpZiB0aGUgbW9kZWwgaGFzIGFuIG9iamVjdCBhdCB0aGlzIHBhdGgsIGtlZXAgZHJpbGxpbmcgd2l0aCBhIHByb3h5XG4gICAgICAgIGNvbnN0IGlzTmV4dE9iamVjdCA9IG5leHRNb2RlbCAmJiB0eXBlb2YgbmV4dE1vZGVsID09PSBcIm9iamVjdFwiO1xuICAgICAgICBpZiAoaXNOZXh0T2JqZWN0KSByZXR1cm4gRW52aXJvbm1lbnQuYnVpbGRFbnZQcm94eShuZXh0TW9kZWwsIG5leHRQYXRoKTtcblxuICAgICAgICAvLyBBbHdheXMgcmV0dXJuIGEgcHJveHkgZm9yIGZ1cnRoZXIgcGF0aCBjb21wb3NpdGlvbiB3aGVuIG5vIEVOViB2YWx1ZTtcbiAgICAgICAgLy8gZG8gbm90IHN1cmZhY2UgcHJpbWl0aXZlIG1vZGVsIGRlZmF1bHRzIGhlcmUgKHRoaXMgQVBJIGlzIGZvciBrZXkgY29tcG9zaXRpb24pLlxuICAgICAgICByZXR1cm4gRW52aXJvbm1lbnQuYnVpbGRFbnZQcm94eSh1bmRlZmluZWQsIG5leHRQYXRoKTtcbiAgICAgIH0sXG4gICAgICBvd25LZXlzKCkge1xuICAgICAgICByZXR1cm4gY3VycmVudCA/IFJlZmxlY3Qub3duS2V5cyhjdXJyZW50KSA6IFtdO1xuICAgICAgfSxcbiAgICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihfdCwgcCkge1xuICAgICAgICBpZiAoIWN1cnJlbnQpIHJldHVybiB1bmRlZmluZWQgYXMgYW55O1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGN1cnJlbnQsIHApKSB7XG4gICAgICAgICAgcmV0dXJuIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gYXMgUHJvcGVydHlEZXNjcmlwdG9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQgYXMgYW55O1xuICAgICAgfSxcbiAgICB9O1xuXG4gICAgY29uc3QgdGFyZ2V0ID0ge30gYXMgYW55O1xuICAgIHJldHVybiBuZXcgUHJveHkodGFyZ2V0LCBoYW5kbGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3RhdGljXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgdGhlIGtleXMgb2YgdGhlIGVudmlyb25tZW50LCBvcHRpb25hbGx5IGNvbnZlcnRpbmcgdGhlbSB0byBFTlYgZm9ybWF0LlxuICAgKiBAc3VtbWFyeSBHZXRzIGFsbCBrZXlzIGluIHRoZSBlbnZpcm9ubWVudCwgd2l0aCBhbiBvcHRpb24gdG8gZm9ybWF0IHRoZW0gZm9yIGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAgICogQHBhcmFtIHtib29sZWFufSBbdG9FbnY9dHJ1ZV0gLSBXaGV0aGVyIHRvIGNvbnZlcnQgdGhlIGtleXMgdG8gRU5WIGZvcm1hdC5cbiAgICogQHJldHVybiB7c3RyaW5nW119IEFuIGFycmF5IG9mIGtleXMgZnJvbSB0aGUgZW52aXJvbm1lbnQuXG4gICAqL1xuICBzdGF0aWMga2V5cyh0b0VudjogYm9vbGVhbiA9IHRydWUpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIEVudmlyb25tZW50Lmluc3RhbmNlKClcbiAgICAgIC5rZXlzKClcbiAgICAgIC5tYXAoKGspID0+ICh0b0VudiA/IHRvRU5WRm9ybWF0KGspIDogaykpO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBMb2dnZWRFbnZpcm9ubWVudCA9IEVudmlyb25tZW50LmFjY3VtdWxhdGUoXG4gIE9iamVjdC5hc3NpZ24oe30sIERlZmF1bHRMb2dnaW5nQ29uZmlnLCB7XG4gICAgZW52OlxuICAgICAgKGlzQnJvd3NlcigpICYmIChnbG9iYWxUaGlzIGFzIGFueSlbQnJvd3NlckVudktleV1cbiAgICAgICAgPyAoZ2xvYmFsVGhpcyBhcyBhbnkpW0Jyb3dzZXJFbnZLZXldW1wiTk9ERV9FTlZcIl1cbiAgICAgICAgOiAoZ2xvYmFsVGhpcyBhcyBhbnkpLnByb2Nlc3MuZW52W1wiTk9ERV9FTlZcIl0pIHx8IFwiZGV2ZWxvcG1lbnRcIixcbiAgfSlcbik7XG4iXX0=
@@ -0,0 +1,6 @@
1
+ import { Logger, LoggingConfig, LoggingFilter } from "../types";
2
+ import { LoggedClass } from "../LoggedClass";
3
+ export declare abstract class LogFilter extends LoggedClass implements LoggingFilter {
4
+ get log(): Logger;
5
+ abstract filter(config: LoggingConfig, message: string, context: string[]): string;
6
+ }
@@ -0,0 +1,7 @@
1
+ import { LoggedClass } from "./../LoggedClass.js";
2
+ export class LogFilter extends LoggedClass {
3
+ get log() {
4
+ return super.log.for(this, { filters: [] });
5
+ }
6
+ }
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9nRmlsdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ZpbHRlcnMvTG9nRmlsdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxXQUFXLEVBQUUsNEJBQXVCO0FBRTdDLE1BQU0sT0FBZ0IsU0FBVSxTQUFRLFdBQVc7SUFDakQsSUFBYSxHQUFHO1FBQ2QsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFXLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNyRCxDQUFDO0NBT0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBMb2dnZXIsIExvZ2dpbmdDb25maWcsIExvZ2dpbmdGaWx0ZXIgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IExvZ2dlZENsYXNzIH0gZnJvbSBcIi4uL0xvZ2dlZENsYXNzXCI7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBMb2dGaWx0ZXIgZXh0ZW5kcyBMb2dnZWRDbGFzcyBpbXBsZW1lbnRzIExvZ2dpbmdGaWx0ZXIge1xuICBvdmVycmlkZSBnZXQgbG9nKCk6IExvZ2dlciB7XG4gICAgcmV0dXJuIHN1cGVyLmxvZy5mb3IodGhpcyBhcyBhbnksIHsgZmlsdGVyczogW10gfSk7XG4gIH1cblxuICBhYnN0cmFjdCBmaWx0ZXIoXG4gICAgY29uZmlnOiBMb2dnaW5nQ29uZmlnLFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBjb250ZXh0OiBzdHJpbmdbXVxuICApOiBzdHJpbmc7XG59XG4iXX0=
@@ -0,0 +1,10 @@
1
+ import { LogFilter } from "./LogFilter";
2
+ import { LoggingConfig } from "../types";
3
+ export type ReplacementFunction = (substring: string, ...args: any[]) => string;
4
+ export declare class PatternFilter extends LogFilter {
5
+ protected readonly regexp: RegExp;
6
+ protected readonly replacement: string | ReplacementFunction;
7
+ constructor(regexp: RegExp, replacement: string | ReplacementFunction);
8
+ protected match(message: string): RegExpExecArray | null;
9
+ filter(config: LoggingConfig, message: string, context: string[]): string;
10
+ }
@@ -0,0 +1,44 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { LogFilter } from "./LogFilter.js";
11
+ import { final } from "./../decorators.js";
12
+ export class PatternFilter extends LogFilter {
13
+ constructor(regexp, replacement) {
14
+ super();
15
+ this.regexp = regexp;
16
+ this.replacement = replacement;
17
+ }
18
+ match(message) {
19
+ const match = this.regexp.exec(message);
20
+ this.regexp.lastIndex = 0;
21
+ return match;
22
+ }
23
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
24
+ filter(config, message, context) {
25
+ const log = this.log.for(this.filter);
26
+ const match = this.match(message);
27
+ if (!match)
28
+ return message;
29
+ try {
30
+ return message.replace(this.regexp, this.replacement);
31
+ }
32
+ catch (e) {
33
+ log.error(`PatternFilter replacement error: ${e}`);
34
+ }
35
+ return "";
36
+ }
37
+ }
38
+ __decorate([
39
+ final(),
40
+ __metadata("design:type", Function),
41
+ __metadata("design:paramtypes", [String]),
42
+ __metadata("design:returntype", void 0)
43
+ ], PatternFilter.prototype, "match", null);
44
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGF0dGVybkZpbHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9maWx0ZXJzL1BhdHRlcm5GaWx0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSx1QkFBb0I7QUFFeEMsT0FBTyxFQUFFLEtBQUssRUFBRSwyQkFBc0I7QUFJdEMsTUFBTSxPQUFPLGFBQWMsU0FBUSxTQUFTO0lBQzFDLFlBQ3FCLE1BQWMsRUFDZCxXQUF5QztRQUU1RCxLQUFLLEVBQUUsQ0FBQztRQUhXLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxnQkFBVyxHQUFYLFdBQVcsQ0FBOEI7SUFHOUQsQ0FBQztJQUdTLEtBQUssQ0FBQyxPQUFlO1FBQzdCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztRQUMxQixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCw2REFBNkQ7SUFDN0QsTUFBTSxDQUFDLE1BQXFCLEVBQUUsT0FBZSxFQUFFLE9BQWlCO1FBQzlELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN0QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTyxPQUFPLENBQUM7UUFDM0IsSUFBSSxDQUFDO1lBQ0gsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFdBQWtCLENBQUMsQ0FBQztRQUMvRCxDQUFDO1FBQUMsT0FBTyxDQUFVLEVBQUUsQ0FBQztZQUNwQixHQUFHLENBQUMsS0FBSyxDQUFDLG9DQUFvQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3JELENBQUM7UUFDRCxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7Q0FDRjtBQWxCVztJQURULEtBQUssRUFBRTs7OzswQ0FLUCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExvZ0ZpbHRlciB9IGZyb20gXCIuL0xvZ0ZpbHRlclwiO1xuaW1wb3J0IHsgTG9nZ2luZ0NvbmZpZyB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgZmluYWwgfSBmcm9tIFwiLi4vZGVjb3JhdG9yc1wiO1xuXG5leHBvcnQgdHlwZSBSZXBsYWNlbWVudEZ1bmN0aW9uID0gKHN1YnN0cmluZzogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkgPT4gc3RyaW5nO1xuXG5leHBvcnQgY2xhc3MgUGF0dGVybkZpbHRlciBleHRlbmRzIExvZ0ZpbHRlciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCByZWFkb25seSByZWdleHA6IFJlZ0V4cCxcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVwbGFjZW1lbnQ6IHN0cmluZyB8IFJlcGxhY2VtZW50RnVuY3Rpb25cbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIEBmaW5hbCgpXG4gIHByb3RlY3RlZCBtYXRjaChtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBjb25zdCBtYXRjaCA9IHRoaXMucmVnZXhwLmV4ZWMobWVzc2FnZSk7XG4gICAgdGhpcy5yZWdleHAubGFzdEluZGV4ID0gMDtcbiAgICByZXR1cm4gbWF0Y2g7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGZpbHRlcihjb25maWc6IExvZ2dpbmdDb25maWcsIG1lc3NhZ2U6IHN0cmluZywgY29udGV4dDogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmZpbHRlcik7XG4gICAgY29uc3QgbWF0Y2ggPSB0aGlzLm1hdGNoKG1lc3NhZ2UpO1xuICAgIGlmICghbWF0Y2gpIHJldHVybiBtZXNzYWdlO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gbWVzc2FnZS5yZXBsYWNlKHRoaXMucmVnZXhwLCB0aGlzLnJlcGxhY2VtZW50IGFzIGFueSk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgbG9nLmVycm9yKGBQYXR0ZXJuRmlsdGVyIHJlcGxhY2VtZW50IGVycm9yOiAke2V9YCk7XG4gICAgfVxuICAgIHJldHVybiBcIlwiO1xuICB9XG59XG4iXX0=