@beecode/msh-util 1.2.1 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (145) hide show
  1. package/dist/array-util.d.ts +23 -0
  2. package/dist/array-util.d.ts.map +1 -0
  3. package/dist/array-util.js +27 -0
  4. package/{src/class-factory-pattern.ts → dist/class-factory-pattern.d.ts} +5 -9
  5. package/dist/class-factory-pattern.d.ts.map +1 -0
  6. package/dist/class-factory-pattern.js +26 -0
  7. package/{src/express/error-handler.ts → dist/express/error-handler.d.ts} +2 -10
  8. package/dist/express/error-handler.d.ts.map +1 -0
  9. package/dist/express/error-handler.js +26 -0
  10. package/dist/index.d.ts +17 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +14 -0
  13. package/dist/joi-util.d.ts +47 -0
  14. package/dist/joi-util.d.ts.map +1 -0
  15. package/dist/joi-util.js +62 -0
  16. package/{src/memoize-factory.ts → dist/memoize-factory.d.ts} +3 -14
  17. package/dist/memoize-factory.d.ts.map +1 -0
  18. package/dist/memoize-factory.js +24 -0
  19. package/dist/object-util.d.ts +72 -0
  20. package/dist/object-util.d.ts.map +1 -0
  21. package/dist/object-util.js +115 -0
  22. package/dist/regex-util.d.ts +12 -0
  23. package/dist/regex-util.d.ts.map +1 -0
  24. package/dist/regex-util.js +12 -0
  25. package/dist/single-threshold-promise.d.ts +31 -0
  26. package/dist/single-threshold-promise.d.ts.map +1 -0
  27. package/dist/single-threshold-promise.js +46 -0
  28. package/dist/singleton/async.d.ts +50 -0
  29. package/dist/singleton/async.d.ts.map +1 -0
  30. package/dist/singleton/async.js +75 -0
  31. package/{src/singleton/pattern.ts → dist/singleton/pattern.d.ts} +3 -13
  32. package/dist/singleton/pattern.d.ts.map +1 -0
  33. package/dist/singleton/pattern.js +41 -0
  34. package/dist/string-util.d.ts +10 -0
  35. package/dist/string-util.d.ts.map +1 -0
  36. package/dist/string-util.js +18 -0
  37. package/dist/time-util.d.ts +74 -0
  38. package/dist/time-util.d.ts.map +1 -0
  39. package/dist/time-util.js +90 -0
  40. package/dist/time-zone.d.ts +467 -0
  41. package/dist/time-zone.d.ts.map +1 -0
  42. package/dist/time-zone.js +468 -0
  43. package/{src/timeout.ts → dist/timeout.d.ts} +2 -3
  44. package/dist/timeout.d.ts.map +1 -0
  45. package/dist/timeout.js +17 -0
  46. package/dist/type-util.d.ts +50 -0
  47. package/dist/type-util.d.ts.map +1 -0
  48. package/dist/type-util.js +54 -0
  49. package/lib/array-util.d.ts.map +1 -1
  50. package/lib/array-util.js +30 -28
  51. package/lib/class-factory-pattern.d.ts.map +1 -1
  52. package/lib/class-factory-pattern.js +17 -8
  53. package/lib/express/error-handler.d.ts.map +1 -1
  54. package/lib/express/error-handler.js +15 -11
  55. package/lib/index.d.ts +16 -13
  56. package/lib/index.d.ts.map +1 -1
  57. package/lib/index.js +107 -29
  58. package/lib/joi-util.d.ts.map +1 -1
  59. package/lib/joi-util.js +66 -22
  60. package/lib/memoize-factory.d.ts +1 -1
  61. package/lib/memoize-factory.d.ts.map +1 -1
  62. package/lib/memoize-factory.js +19 -13
  63. package/lib/object-util.d.ts.map +1 -1
  64. package/lib/object-util.js +110 -55
  65. package/lib/package.json +1 -0
  66. package/lib/regex-util.js +15 -13
  67. package/lib/single-threshold-promise.d.ts +1 -1
  68. package/lib/single-threshold-promise.d.ts.map +1 -1
  69. package/lib/single-threshold-promise.js +74 -28
  70. package/lib/singleton/async.d.ts +1 -1
  71. package/lib/singleton/async.d.ts.map +1 -1
  72. package/lib/singleton/async.js +105 -45
  73. package/lib/singleton/pattern.d.ts +1 -1
  74. package/lib/singleton/pattern.d.ts.map +1 -1
  75. package/lib/singleton/pattern.js +13 -12
  76. package/lib/string-util.js +21 -19
  77. package/lib/time-util.js +69 -39
  78. package/lib/time-zone.d.ts +467 -0
  79. package/lib/time-zone.d.ts.map +1 -0
  80. package/lib/time-zone.js +473 -0
  81. package/lib/timeout.js +9 -6
  82. package/lib/type-util.js +57 -55
  83. package/lib/types/global.d.js +5 -0
  84. package/lib/types/types.d.js +3 -0
  85. package/package.json +188 -134
  86. package/lib/array-util.js.map +0 -1
  87. package/lib/class-factory-pattern.js.map +0 -1
  88. package/lib/express/error-handler.js.map +0 -1
  89. package/lib/index.js.map +0 -1
  90. package/lib/joi-util.js.map +0 -1
  91. package/lib/memoize-factory.js.map +0 -1
  92. package/lib/object-util.js.map +0 -1
  93. package/lib/regex-util.js.map +0 -1
  94. package/lib/single-threshold-promise.js.map +0 -1
  95. package/lib/singleton/async.js.map +0 -1
  96. package/lib/singleton/pattern.js.map +0 -1
  97. package/lib/string-util.js.map +0 -1
  98. package/lib/time-util.js.map +0 -1
  99. package/lib/timeout.js.map +0 -1
  100. package/lib/type-util.js.map +0 -1
  101. package/lib/types/any-function/index.d.ts +0 -2
  102. package/lib/types/any-function/index.d.ts.map +0 -1
  103. package/lib/types/any-function/index.js +0 -3
  104. package/lib/types/any-function/index.js.map +0 -1
  105. package/lib/types/any-function/no-params.d.ts +0 -2
  106. package/lib/types/any-function/no-params.d.ts.map +0 -1
  107. package/lib/types/any-function/no-params.js +0 -3
  108. package/lib/types/any-function/no-params.js.map +0 -1
  109. package/lib/types/any-function/promise-no-params.d.ts +0 -2
  110. package/lib/types/any-function/promise-no-params.d.ts.map +0 -1
  111. package/lib/types/any-function/promise-no-params.js +0 -3
  112. package/lib/types/any-function/promise-no-params.js.map +0 -1
  113. package/lib/types/any-function/promise.d.ts +0 -2
  114. package/lib/types/any-function/promise.d.ts.map +0 -1
  115. package/lib/types/any-function/promise.js +0 -3
  116. package/lib/types/any-function/promise.js.map +0 -1
  117. package/src/array-util.test.ts +0 -50
  118. package/src/array-util.ts +0 -26
  119. package/src/class-factory-pattern.test.ts +0 -39
  120. package/src/express/error-handler.test.ts +0 -44
  121. package/src/index.ts +0 -25
  122. package/src/joi-util.test.ts +0 -192
  123. package/src/joi-util.ts +0 -65
  124. package/src/memoize-factory.test.ts +0 -40
  125. package/src/object-util.test.ts +0 -360
  126. package/src/object-util.ts +0 -127
  127. package/src/regex-util.test.ts +0 -25
  128. package/src/regex-util.ts +0 -11
  129. package/src/single-threshold-promise.test.ts +0 -91
  130. package/src/single-threshold-promise.ts +0 -56
  131. package/src/singleton/async.test.ts +0 -122
  132. package/src/singleton/async.ts +0 -90
  133. package/src/singleton/pattern.test.ts +0 -16
  134. package/src/string-util.test.ts +0 -18
  135. package/src/string-util.ts +0 -18
  136. package/src/time-util.test.ts +0 -89
  137. package/src/time-util.ts +0 -98
  138. package/src/timeout.test.ts +0 -65
  139. package/src/type-util.test.ts +0 -20
  140. package/src/type-util.ts +0 -54
  141. package/src/types/any-function/index.ts +0 -1
  142. package/src/types/any-function/no-params.ts +0 -1
  143. package/src/types/any-function/promise-no-params.ts +0 -1
  144. package/src/types/any-function/promise.ts +0 -1
  145. package/src/types/types.d.ts +0 -2
@@ -0,0 +1,23 @@
1
+ export declare const arrayUtil: {
2
+ /**
3
+ * Check if array element is not empty
4
+ * @template T
5
+ * @param {T | null | undefined} value
6
+ * @return {value is T}
7
+ * @example
8
+ * const notEmptyArray = [0, 1, 2, null, undefined, ''].filter(arrayUtil.notEmpty)
9
+ * console.log(notEmptyArray)// [0, 1, 2, '']
10
+ */
11
+ notEmpty: <T>(value: T | null | undefined) => value is T;
12
+ /**
13
+ * Check if array element is not falsy
14
+ * @template T
15
+ * @param {T | null | undefined} value
16
+ * @return {value is T}
17
+ * @example
18
+ * const notFalsyArray = [0, 1, 2, null, undefined, ''].filter(arrayUtil.notFalsy)
19
+ * console.log(notFalsyArray)// [1, 2]
20
+ */
21
+ notFalsy: <T_1>(value: T_1 | null | undefined) => value is T_1;
22
+ };
23
+ //# sourceMappingURL=array-util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"array-util.d.ts","sourceRoot":"","sources":["../src/array-util.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,SAAS;IACrB;;;;;;;;OAQG;yBACkB,CAAC,GAAG,IAAI,GAAG,SAAS;IAGzC;;;;;;;;OAQG;;CAIH,CAAA"}
@@ -0,0 +1,27 @@
1
+ export const arrayUtil = {
2
+ /**
3
+ * Check if array element is not empty
4
+ * @template T
5
+ * @param {T | null | undefined} value
6
+ * @return {value is T}
7
+ * @example
8
+ * const notEmptyArray = [0, 1, 2, null, undefined, ''].filter(arrayUtil.notEmpty)
9
+ * console.log(notEmptyArray)// [0, 1, 2, '']
10
+ */
11
+ notEmpty: (value) => {
12
+ return value !== null && value !== undefined;
13
+ },
14
+ /**
15
+ * Check if array element is not falsy
16
+ * @template T
17
+ * @param {T | null | undefined} value
18
+ * @return {value is T}
19
+ * @example
20
+ * const notFalsyArray = [0, 1, 2, null, undefined, ''].filter(arrayUtil.notFalsy)
21
+ * console.log(notFalsyArray)// [1, 2]
22
+ */
23
+ notFalsy: (value) => {
24
+ return !!value;
25
+ },
26
+ };
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJyYXktdXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9hcnJheS11dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRztJQUN4Qjs7Ozs7Ozs7T0FRRztJQUNILFFBQVEsRUFBRSxDQUFJLEtBQTJCLEVBQWMsRUFBRTtRQUN4RCxPQUFPLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLFNBQVMsQ0FBQTtJQUM3QyxDQUFDO0lBQ0Q7Ozs7Ozs7O09BUUc7SUFDSCxRQUFRLEVBQUUsQ0FBSSxLQUEyQixFQUFjLEVBQUU7UUFDeEQsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFBO0lBQ2YsQ0FBQztDQUNELENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgYXJyYXlVdGlsID0ge1xuXHQvKipcblx0ICogQ2hlY2sgaWYgYXJyYXkgZWxlbWVudCBpcyBub3QgZW1wdHlcblx0ICogQHRlbXBsYXRlIFRcblx0ICogQHBhcmFtIHtUIHwgbnVsbCB8IHVuZGVmaW5lZH0gdmFsdWVcblx0ICogQHJldHVybiB7dmFsdWUgaXMgVH1cblx0ICogQGV4YW1wbGVcblx0ICogY29uc3Qgbm90RW1wdHlBcnJheSA9IFswLCAxLCAyLCBudWxsLCB1bmRlZmluZWQsICcnXS5maWx0ZXIoYXJyYXlVdGlsLm5vdEVtcHR5KVxuXHQgKiBjb25zb2xlLmxvZyhub3RFbXB0eUFycmF5KS8vIFswLCAxLCAyLCAnJ11cblx0ICovXG5cdG5vdEVtcHR5OiA8VD4odmFsdWU6IFQgfCBudWxsIHwgdW5kZWZpbmVkKTogdmFsdWUgaXMgVCA9PiB7XG5cdFx0cmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWRcblx0fSxcblx0LyoqXG5cdCAqIENoZWNrIGlmIGFycmF5IGVsZW1lbnQgaXMgbm90IGZhbHN5XG5cdCAqIEB0ZW1wbGF0ZSBUXG5cdCAqIEBwYXJhbSB7VCB8IG51bGwgfCB1bmRlZmluZWR9IHZhbHVlXG5cdCAqIEByZXR1cm4ge3ZhbHVlIGlzIFR9XG5cdCAqIEBleGFtcGxlXG5cdCAqIGNvbnN0IG5vdEZhbHN5QXJyYXkgPSBbMCwgMSwgMiwgbnVsbCwgdW5kZWZpbmVkLCAnJ10uZmlsdGVyKGFycmF5VXRpbC5ub3RGYWxzeSlcblx0ICogY29uc29sZS5sb2cobm90RmFsc3lBcnJheSkvLyBbMSwgMl1cblx0ICovXG5cdG5vdEZhbHN5OiA8VD4odmFsdWU6IFQgfCBudWxsIHwgdW5kZWZpbmVkKTogdmFsdWUgaXMgVCA9PiB7XG5cdFx0cmV0dXJuICEhdmFsdWVcblx0fSxcbn1cbiJdfQ==
@@ -1,5 +1,6 @@
1
- export type ClassType<T = object> = new (...args: T extends { new (...args: infer P): any } ? P : never[]) => T
2
-
1
+ export type ClassType<T = object> = new (...args: T extends {
2
+ new (...args: infer P): any;
3
+ } ? P : never[]) => T;
3
4
  /**
4
5
  * This is a wrapper that easily converts class constructor call (`new className(..constructorParams)`) into function call (`classNameFactory(..constructorParams)`)
5
6
  * @param {C} classType
@@ -20,10 +21,5 @@ export type ClassType<T = object> = new (...args: T extends { new (...args: infe
20
21
  * // using
21
22
  * const someClassInstance = someClassFactory({ a: 'test' })
22
23
  */
23
- export const classFactoryPattern = <C extends ClassType>(
24
- classType: C
25
- ): ((...args: ConstructorParameters<C>) => InstanceType<C>) => {
26
- return (...args: ConstructorParameters<C>): InstanceType<C> => {
27
- return new classType(...args) as InstanceType<C>
28
- }
29
- }
24
+ export declare const classFactoryPattern: <C extends ClassType<object>>(classType: C) => (...args: ConstructorParameters<C>) => InstanceType<C>;
25
+ //# sourceMappingURL=class-factory-pattern.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"class-factory-pattern.d.ts","sourceRoot":"","sources":["../src/class-factory-pattern.ts"],"names":[],"mappings":"AACA,MAAM,MAAM,SAAS,CAAC,CAAC,GAAG,MAAM,IAAI,KAAK,GAAG,IAAI,EAAE,CAAC,SAAS;IAAE,KAAK,GAAG,IAAI,EAAE,MAAM,CAAC,GAAG,GAAG,CAAA;CAAE,GAAG,CAAC,GAAG,KAAK,EAAE,KAAK,CAAC,CAAA;AAE/G;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,mBAAmB,2CACpB,CAAC,eACC,sBAAsB,CAAC,CAAC,KAAK,aAAa,CAAC,CAIxD,CAAA"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * This is a wrapper that easily converts class constructor call (`new className(..constructorParams)`) into function call (`classNameFactory(..constructorParams)`)
3
+ * @param {C} classType
4
+ * @template C
5
+ * @return {(...args: ConstructorParameters<C>) => InstanceType<C>}
6
+ * @example
7
+ * export class SomeClass {
8
+ * protected _a: string
9
+ *
10
+ * constructor(params: { a: string }) {
11
+ * const { a } = params
12
+ * this._a = a
13
+ * }
14
+ * }
15
+ *
16
+ * export const someClassFactory = classFactoryPattern(SomeClass)
17
+ *
18
+ * // using
19
+ * const someClassInstance = someClassFactory({ a: 'test' })
20
+ */
21
+ export const classFactoryPattern = (classType) => {
22
+ return (...args) => {
23
+ return new classType(...args);
24
+ };
25
+ };
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3MtZmFjdG9yeS1wYXR0ZXJuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NsYXNzLWZhY3RvcnktcGF0dGVybi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUNILE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLENBQ2xDLFNBQVksRUFDK0MsRUFBRTtJQUM3RCxPQUFPLENBQUMsR0FBRyxJQUE4QixFQUFtQixFQUFFO1FBQzdELE9BQU8sSUFBSSxTQUFTLENBQUMsR0FBRyxJQUFJLENBQW9CLENBQUE7SUFDakQsQ0FBQyxDQUFBO0FBQ0YsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCB0eXBlIENsYXNzVHlwZTxUID0gb2JqZWN0PiA9IG5ldyAoLi4uYXJnczogVCBleHRlbmRzIHsgbmV3ICguLi5hcmdzOiBpbmZlciBQKTogYW55IH0gPyBQIDogbmV2ZXJbXSkgPT4gVFxuXG4vKipcbiAqIFRoaXMgaXMgYSB3cmFwcGVyIHRoYXQgZWFzaWx5IGNvbnZlcnRzIGNsYXNzIGNvbnN0cnVjdG9yIGNhbGwgKGBuZXcgY2xhc3NOYW1lKC4uY29uc3RydWN0b3JQYXJhbXMpYCkgaW50byBmdW5jdGlvbiBjYWxsIChgY2xhc3NOYW1lRmFjdG9yeSguLmNvbnN0cnVjdG9yUGFyYW1zKWApXG4gKiBAcGFyYW0ge0N9IGNsYXNzVHlwZVxuICogQHRlbXBsYXRlIENcbiAqIEByZXR1cm4geyguLi5hcmdzOiBDb25zdHJ1Y3RvclBhcmFtZXRlcnM8Qz4pID0+IEluc3RhbmNlVHlwZTxDPn1cbiAqIEBleGFtcGxlXG4gKiBleHBvcnQgY2xhc3MgU29tZUNsYXNzIHtcbiAqICAgcHJvdGVjdGVkIF9hOiBzdHJpbmdcbiAqXG4gKiAgIGNvbnN0cnVjdG9yKHBhcmFtczogeyBhOiBzdHJpbmcgfSkge1xuICogICAgIGNvbnN0IHsgYSB9ID0gcGFyYW1zXG4gKiAgICAgdGhpcy5fYSA9IGFcbiAqICAgfVxuICogfVxuICpcbiAqIGV4cG9ydCBjb25zdCBzb21lQ2xhc3NGYWN0b3J5ID0gY2xhc3NGYWN0b3J5UGF0dGVybihTb21lQ2xhc3MpXG4gKlxuICogLy8gdXNpbmdcbiAqIGNvbnN0IHNvbWVDbGFzc0luc3RhbmNlID0gc29tZUNsYXNzRmFjdG9yeSh7IGE6ICd0ZXN0JyB9KVxuICovXG5leHBvcnQgY29uc3QgY2xhc3NGYWN0b3J5UGF0dGVybiA9IDxDIGV4dGVuZHMgQ2xhc3NUeXBlPihcblx0Y2xhc3NUeXBlOiBDXG4pOiAoKC4uLmFyZ3M6IENvbnN0cnVjdG9yUGFyYW1ldGVyczxDPikgPT4gSW5zdGFuY2VUeXBlPEM+KSA9PiB7XG5cdHJldHVybiAoLi4uYXJnczogQ29uc3RydWN0b3JQYXJhbWV0ZXJzPEM+KTogSW5zdGFuY2VUeXBlPEM+ID0+IHtcblx0XHRyZXR1cm4gbmV3IGNsYXNzVHlwZSguLi5hcmdzKSBhcyBJbnN0YW5jZVR5cGU8Qz5cblx0fVxufVxuIl19
@@ -13,13 +13,5 @@
13
13
  * }
14
14
  * }
15
15
  */
16
- export const expressErrorHandler = (_target: any, _key: string, descriptor: TypedPropertyDescriptor<any>): any => {
17
- const originalMethod = descriptor.value
18
- descriptor.value = function (): any {
19
- const next = arguments[2] // eslint-disable-line prefer-rest-params
20
-
21
- return Promise.resolve(originalMethod.apply(this, arguments)).catch(next) // eslint-disable-line prefer-rest-params
22
- }
23
-
24
- return descriptor
25
- }
16
+ export declare const expressErrorHandler: (_target: any, _key: string, descriptor: TypedPropertyDescriptor<any>) => any;
17
+ //# sourceMappingURL=error-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-handler.d.ts","sourceRoot":"","sources":["../../src/express/error-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,eAAO,MAAM,mBAAmB,YAAa,GAAG,QAAQ,MAAM,cAAc,wBAAwB,GAAG,CAAC,KAAG,GAU1G,CAAA"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Wrap async express http request end return promise or call next on catch
3
+ * @param _target
4
+ * @param _key
5
+ * @param descriptor
6
+ * @example
7
+ * export class RootController {
8
+ * /@expressErrorHandler
9
+ * async login(req: Request, res: Response): Promise<void> {
10
+ * const { username, password } = validationUtil().sanitize(req.body, postLoginBodySchema)
11
+ * const result = await authorizationUseCase.login({ username, password })
12
+ * res.json(result)
13
+ * }
14
+ * }
15
+ */
16
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
17
+ export const expressErrorHandler = (_target, _key, descriptor) => {
18
+ const originalMethod = descriptor.value;
19
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
20
+ descriptor.value = function () {
21
+ const next = arguments[2]; // eslint-disable-line prefer-rest-params
22
+ return Promise.resolve(originalMethod.apply(this, arguments)).catch(next); // eslint-disable-line prefer-rest-params
23
+ };
24
+ return descriptor;
25
+ };
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3ItaGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9leHByZXNzL2Vycm9yLWhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCw4REFBOEQ7QUFDOUQsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxPQUFZLEVBQUUsSUFBWSxFQUFFLFVBQXdDLEVBQU8sRUFBRTtJQUNoSCxNQUFNLGNBQWMsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFBO0lBQ3ZDLDhEQUE4RDtJQUM5RCxVQUFVLENBQUMsS0FBSyxHQUFHO1FBQ2xCLE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLHlDQUF5QztRQUVuRSxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUEsQ0FBQyx5Q0FBeUM7SUFDcEgsQ0FBQyxDQUFBO0lBRUQsT0FBTyxVQUFVLENBQUE7QUFDbEIsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBXcmFwIGFzeW5jIGV4cHJlc3MgaHR0cCByZXF1ZXN0IGVuZCByZXR1cm4gcHJvbWlzZSBvciBjYWxsIG5leHQgb24gY2F0Y2hcbiAqIEBwYXJhbSBfdGFyZ2V0XG4gKiBAcGFyYW0gX2tleVxuICogQHBhcmFtIGRlc2NyaXB0b3JcbiAqIEBleGFtcGxlXG4gKiBleHBvcnQgY2xhc3MgUm9vdENvbnRyb2xsZXIge1xuICogIC9AZXhwcmVzc0Vycm9ySGFuZGxlclxuICogICBhc3luYyBsb2dpbihyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAqICAgICBjb25zdCB7IHVzZXJuYW1lLCBwYXNzd29yZCB9ID0gdmFsaWRhdGlvblV0aWwoKS5zYW5pdGl6ZShyZXEuYm9keSwgcG9zdExvZ2luQm9keVNjaGVtYSlcbiAqICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBhdXRob3JpemF0aW9uVXNlQ2FzZS5sb2dpbih7IHVzZXJuYW1lLCBwYXNzd29yZCB9KVxuICogICAgIHJlcy5qc29uKHJlc3VsdClcbiAqICAgfVxuICogfVxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGNvbnN0IGV4cHJlc3NFcnJvckhhbmRsZXIgPSAoX3RhcmdldDogYW55LCBfa2V5OiBzdHJpbmcsIGRlc2NyaXB0b3I6IFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPGFueT4pOiBhbnkgPT4ge1xuXHRjb25zdCBvcmlnaW5hbE1ldGhvZCA9IGRlc2NyaXB0b3IudmFsdWVcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcblx0ZGVzY3JpcHRvci52YWx1ZSA9IGZ1bmN0aW9uICgpOiBhbnkge1xuXHRcdGNvbnN0IG5leHQgPSBhcmd1bWVudHNbMl0gLy8gZXNsaW50LWRpc2FibGUtbGluZSBwcmVmZXItcmVzdC1wYXJhbXNcblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUob3JpZ2luYWxNZXRob2QuYXBwbHkodGhpcywgYXJndW1lbnRzKSkuY2F0Y2gobmV4dCkgLy8gZXNsaW50LWRpc2FibGUtbGluZSBwcmVmZXItcmVzdC1wYXJhbXNcblx0fVxuXG5cdHJldHVybiBkZXNjcmlwdG9yXG59XG4iXX0=
@@ -0,0 +1,17 @@
1
+ export { expressErrorHandler } from '#src/express/error-handler';
2
+ export { SingletonAsync } from '#src/singleton/async';
3
+ export { singletonPattern } from '#src/singleton/pattern';
4
+ export { classFactoryPattern } from '#src/class-factory-pattern';
5
+ export type { ClassType } from '#src/class-factory-pattern';
6
+ export { ErrorWithPayload, JoiUtil } from '#src/joi-util';
7
+ export { memoizeFactory } from '#src/memoize-factory';
8
+ export { ObjectUtil } from '#src/object-util';
9
+ export type { ObjectType } from '#src/object-util';
10
+ export { regexUtil } from '#src/regex-util';
11
+ export { SingleThresholdPromise } from '#src/single-threshold-promise';
12
+ export { stringUtil } from '#src/string-util';
13
+ export { DurationUnit, TimeUtil } from '#src/time-util';
14
+ export type { DurationUnitType } from '#src/time-util';
15
+ export { timeout } from '#src/timeout';
16
+ export { typeUtil } from '#src/type-util';
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAEhE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAErD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAEzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAEhE,YAAY,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAA;AAE3D,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAEzD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAErD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAElD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAE3C,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAA;AAEtE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAEvD,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAEtD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,14 @@
1
+ export { expressErrorHandler } from '#src/express/error-handler';
2
+ export { SingletonAsync } from '#src/singleton/async';
3
+ export { singletonPattern } from '#src/singleton/pattern';
4
+ export { classFactoryPattern } from '#src/class-factory-pattern';
5
+ export { ErrorWithPayload, JoiUtil } from '#src/joi-util';
6
+ export { memoizeFactory } from '#src/memoize-factory';
7
+ export { ObjectUtil } from '#src/object-util';
8
+ export { regexUtil } from '#src/regex-util';
9
+ export { SingleThresholdPromise } from '#src/single-threshold-promise';
10
+ export { stringUtil } from '#src/string-util';
11
+ export { DurationUnit, TimeUtil } from '#src/time-util';
12
+ export { timeout } from '#src/timeout';
13
+ export { typeUtil } from '#src/type-util';
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNEJBQTRCLENBQUE7QUFFaEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFBO0FBRXJELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFBO0FBRXpELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDRCQUE0QixDQUFBO0FBSWhFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFFekQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFBO0FBRXJELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUk3QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUE7QUFFM0MsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sK0JBQStCLENBQUE7QUFFdEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBRTdDLE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFJdkQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUV0QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBleHByZXNzRXJyb3JIYW5kbGVyIH0gZnJvbSAnI3NyYy9leHByZXNzL2Vycm9yLWhhbmRsZXInXG5cbmV4cG9ydCB7IFNpbmdsZXRvbkFzeW5jIH0gZnJvbSAnI3NyYy9zaW5nbGV0b24vYXN5bmMnXG5cbmV4cG9ydCB7IHNpbmdsZXRvblBhdHRlcm4gfSBmcm9tICcjc3JjL3NpbmdsZXRvbi9wYXR0ZXJuJ1xuXG5leHBvcnQgeyBjbGFzc0ZhY3RvcnlQYXR0ZXJuIH0gZnJvbSAnI3NyYy9jbGFzcy1mYWN0b3J5LXBhdHRlcm4nXG5cbmV4cG9ydCB0eXBlIHsgQ2xhc3NUeXBlIH0gZnJvbSAnI3NyYy9jbGFzcy1mYWN0b3J5LXBhdHRlcm4nXG5cbmV4cG9ydCB7IEVycm9yV2l0aFBheWxvYWQsIEpvaVV0aWwgfSBmcm9tICcjc3JjL2pvaS11dGlsJ1xuXG5leHBvcnQgeyBtZW1vaXplRmFjdG9yeSB9IGZyb20gJyNzcmMvbWVtb2l6ZS1mYWN0b3J5J1xuXG5leHBvcnQgeyBPYmplY3RVdGlsIH0gZnJvbSAnI3NyYy9vYmplY3QtdXRpbCdcblxuZXhwb3J0IHR5cGUgeyBPYmplY3RUeXBlIH0gZnJvbSAnI3NyYy9vYmplY3QtdXRpbCdcblxuZXhwb3J0IHsgcmVnZXhVdGlsIH0gZnJvbSAnI3NyYy9yZWdleC11dGlsJ1xuXG5leHBvcnQgeyBTaW5nbGVUaHJlc2hvbGRQcm9taXNlIH0gZnJvbSAnI3NyYy9zaW5nbGUtdGhyZXNob2xkLXByb21pc2UnXG5cbmV4cG9ydCB7IHN0cmluZ1V0aWwgfSBmcm9tICcjc3JjL3N0cmluZy11dGlsJ1xuXG5leHBvcnQgeyBEdXJhdGlvblVuaXQsIFRpbWVVdGlsIH0gZnJvbSAnI3NyYy90aW1lLXV0aWwnXG5cbmV4cG9ydCB0eXBlIHsgRHVyYXRpb25Vbml0VHlwZSB9IGZyb20gJyNzcmMvdGltZS11dGlsJ1xuXG5leHBvcnQgeyB0aW1lb3V0IH0gZnJvbSAnI3NyYy90aW1lb3V0J1xuXG5leHBvcnQgeyB0eXBlVXRpbCB9IGZyb20gJyNzcmMvdHlwZS11dGlsJ1xuIl19
@@ -0,0 +1,47 @@
1
+ import { ObjectSchema, Schema, ValidationOptions } from 'joi';
2
+ export declare class ErrorWithPayload<T> extends Error {
3
+ payload: T;
4
+ constructor(message: string, payload: T);
5
+ }
6
+ /**
7
+ * This is a simple wrapper around Joi validation with two functions exposed validate and sanitize. If object is not valid function throws an error.
8
+ * @example
9
+ * type SomeType = {
10
+ * a: string
11
+ * b: number
12
+ * }
13
+ * const someSchema = Joi.object<SomeType>().keys({
14
+ * a: Joi.string().required(),
15
+ * b: Joi.number().required(),
16
+ * }).required()
17
+ *
18
+ * const joiUtil = new JoiUtil()
19
+ *
20
+ * // using
21
+ * const invalidObject = joiUtil.validate({}, someSchema) // validate throws an error
22
+ * const validObject = joiUtil.validate({ a: 'a', b: 1 }, someSchema)
23
+ */
24
+ export declare class JoiUtil {
25
+ /**
26
+ * Validate and clean object
27
+ * @template T
28
+ * @template Joi
29
+ * @param {any} objectToValidate
30
+ * @param {Joi.Schema | Joi.ObjectSchema<T>} schema
31
+ * @param {validationOptions} [validationOptions]
32
+ * @returns {T} expected object after validation
33
+ */
34
+ sanitize<T>(objectToValidate: any, schema: Schema | ObjectSchema<T>, validationOptions?: ValidationOptions): T;
35
+ /**
36
+ * Only validate properties specified in validation schema
37
+ * @template T
38
+ * @template Joi
39
+ * @param {any} objectToValidate
40
+ * @param {Joi.Schema | Joi.ObjectSchema<T>} schema
41
+ * @param {validationOptions} [validationOptions]
42
+ * @returns {T} expected object after validation
43
+ */
44
+ validate<T>(objectToValidate: any, schema: Schema | ObjectSchema<T>, validationOptions?: ValidationOptions): T;
45
+ protected _validate<T>(objectToValidate: any, schema: Schema | ObjectSchema<T>, validationOptions?: ValidationOptions): T;
46
+ }
47
+ //# sourceMappingURL=joi-util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"joi-util.d.ts","sourceRoot":"","sources":["../src/joi-util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,KAAK,CAAA;AAE7D,qBAAa,gBAAgB,CAAC,CAAC,CAAE,SAAQ,KAAK;IAC7C,OAAO,EAAE,CAAC,CAAA;gBAEE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;CAIvC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,OAAO;IACnB;;;;;;;;OAQG;IAEH,QAAQ,CAAC,CAAC,EAAE,gBAAgB,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,EAAE,iBAAiB,CAAC,EAAE,iBAAiB,GAAG,CAAC;IAI9G;;;;;;;;OAQG;IAEH,QAAQ,CAAC,CAAC,EAAE,gBAAgB,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,EAAE,iBAAiB,CAAC,EAAE,iBAAiB,GAAG,CAAC;IAK9G,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,gBAAgB,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,EAAE,iBAAiB,CAAC,EAAE,iBAAiB,GAAG,CAAC;CAQzH"}
@@ -0,0 +1,62 @@
1
+ export class ErrorWithPayload extends Error {
2
+ payload;
3
+ constructor(message, payload) {
4
+ super(message);
5
+ this.payload = payload;
6
+ }
7
+ }
8
+ /**
9
+ * This is a simple wrapper around Joi validation with two functions exposed validate and sanitize. If object is not valid function throws an error.
10
+ * @example
11
+ * type SomeType = {
12
+ * a: string
13
+ * b: number
14
+ * }
15
+ * const someSchema = Joi.object<SomeType>().keys({
16
+ * a: Joi.string().required(),
17
+ * b: Joi.number().required(),
18
+ * }).required()
19
+ *
20
+ * const joiUtil = new JoiUtil()
21
+ *
22
+ * // using
23
+ * const invalidObject = joiUtil.validate({}, someSchema) // validate throws an error
24
+ * const validObject = joiUtil.validate({ a: 'a', b: 1 }, someSchema)
25
+ */
26
+ export class JoiUtil {
27
+ /**
28
+ * Validate and clean object
29
+ * @template T
30
+ * @template Joi
31
+ * @param {any} objectToValidate
32
+ * @param {Joi.Schema | Joi.ObjectSchema<T>} schema
33
+ * @param {validationOptions} [validationOptions]
34
+ * @returns {T} expected object after validation
35
+ */
36
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
37
+ sanitize(objectToValidate, schema, validationOptions) {
38
+ return this._validate(objectToValidate, schema, { ...validationOptions, stripUnknown: true });
39
+ }
40
+ /**
41
+ * Only validate properties specified in validation schema
42
+ * @template T
43
+ * @template Joi
44
+ * @param {any} objectToValidate
45
+ * @param {Joi.Schema | Joi.ObjectSchema<T>} schema
46
+ * @param {validationOptions} [validationOptions]
47
+ * @returns {T} expected object after validation
48
+ */
49
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
50
+ validate(objectToValidate, schema, validationOptions) {
51
+ return this._validate(objectToValidate, schema, validationOptions);
52
+ }
53
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
54
+ _validate(objectToValidate, schema, validationOptions) {
55
+ const { error: validationError, value } = schema.validate(objectToValidate, validationOptions);
56
+ if (validationError) {
57
+ throw new ErrorWithPayload(validationError.message.split('"').join("'"), validationError);
58
+ }
59
+ return value;
60
+ }
61
+ }
62
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiam9pLXV0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvam9pLXV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxPQUFPLGdCQUFvQixTQUFRLEtBQUs7SUFDN0MsT0FBTyxDQUFHO0lBRVYsWUFBWSxPQUFlLEVBQUUsT0FBVTtRQUN0QyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDZCxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQTtJQUN2QixDQUFDO0NBQ0Q7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCxNQUFNLE9BQU8sT0FBTztJQUNuQjs7Ozs7Ozs7T0FRRztJQUNILDhEQUE4RDtJQUM5RCxRQUFRLENBQUksZ0JBQXFCLEVBQUUsTUFBZ0MsRUFBRSxpQkFBcUM7UUFDekcsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFJLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxFQUFFLEdBQUcsaUJBQWlCLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUE7SUFDakcsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0gsOERBQThEO0lBQzlELFFBQVEsQ0FBSSxnQkFBcUIsRUFBRSxNQUFnQyxFQUFFLGlCQUFxQztRQUN6RyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUksZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLGlCQUFpQixDQUFDLENBQUE7SUFDdEUsQ0FBQztJQUVELDhEQUE4RDtJQUNwRCxTQUFTLENBQUksZ0JBQXFCLEVBQUUsTUFBZ0MsRUFBRSxpQkFBcUM7UUFDcEgsTUFBTSxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxpQkFBaUIsQ0FBQyxDQUFBO1FBQzlGLElBQUksZUFBZSxFQUFFLENBQUM7WUFDckIsTUFBTSxJQUFJLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxlQUFlLENBQUMsQ0FBQTtRQUMxRixDQUFDO1FBRUQsT0FBTyxLQUFVLENBQUE7SUFDbEIsQ0FBQztDQUNEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT2JqZWN0U2NoZW1hLCBTY2hlbWEsIFZhbGlkYXRpb25PcHRpb25zIH0gZnJvbSAnam9pJ1xuXG5leHBvcnQgY2xhc3MgRXJyb3JXaXRoUGF5bG9hZDxUPiBleHRlbmRzIEVycm9yIHtcblx0cGF5bG9hZDogVFxuXG5cdGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgcGF5bG9hZDogVCkge1xuXHRcdHN1cGVyKG1lc3NhZ2UpXG5cdFx0dGhpcy5wYXlsb2FkID0gcGF5bG9hZFxuXHR9XG59XG5cbi8qKlxuICogVGhpcyBpcyBhIHNpbXBsZSB3cmFwcGVyIGFyb3VuZCBKb2kgdmFsaWRhdGlvbiB3aXRoIHR3byBmdW5jdGlvbnMgZXhwb3NlZCB2YWxpZGF0ZSBhbmQgc2FuaXRpemUuIElmIG9iamVjdCBpcyBub3QgdmFsaWQgZnVuY3Rpb24gdGhyb3dzIGFuIGVycm9yLlxuICogQGV4YW1wbGVcbiAqIHR5cGUgU29tZVR5cGUgPSB7XG4gKiAgIGE6IHN0cmluZ1xuICogICBiOiBudW1iZXJcbiAqIH1cbiAqIGNvbnN0IHNvbWVTY2hlbWEgPSBKb2kub2JqZWN0PFNvbWVUeXBlPigpLmtleXMoe1xuICogICBhOiBKb2kuc3RyaW5nKCkucmVxdWlyZWQoKSxcbiAqICAgYjogSm9pLm51bWJlcigpLnJlcXVpcmVkKCksXG4gKiB9KS5yZXF1aXJlZCgpXG4gKlxuICogY29uc3Qgam9pVXRpbCA9IG5ldyBKb2lVdGlsKClcbiAqXG4gKiAvLyB1c2luZ1xuICogY29uc3QgaW52YWxpZE9iamVjdCA9IGpvaVV0aWwudmFsaWRhdGUoe30sIHNvbWVTY2hlbWEpIC8vIHZhbGlkYXRlIHRocm93cyBhbiBlcnJvclxuICogY29uc3QgdmFsaWRPYmplY3QgPSBqb2lVdGlsLnZhbGlkYXRlKHsgYTogJ2EnLCBiOiAxIH0sIHNvbWVTY2hlbWEpXG4gKi9cbmV4cG9ydCBjbGFzcyBKb2lVdGlsIHtcblx0LyoqXG5cdCAqIFZhbGlkYXRlIGFuZCBjbGVhbiBvYmplY3Rcblx0ICogQHRlbXBsYXRlIFRcblx0ICogQHRlbXBsYXRlIEpvaVxuXHQgKiBAcGFyYW0ge2FueX0gb2JqZWN0VG9WYWxpZGF0ZVxuXHQgKiBAcGFyYW0ge0pvaS5TY2hlbWEgfCBKb2kuT2JqZWN0U2NoZW1hPFQ+fSBzY2hlbWFcblx0ICogQHBhcmFtIHt2YWxpZGF0aW9uT3B0aW9uc30gW3ZhbGlkYXRpb25PcHRpb25zXVxuXHQgKiBAcmV0dXJucyB7VH0gZXhwZWN0ZWQgb2JqZWN0IGFmdGVyIHZhbGlkYXRpb25cblx0ICovXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5cdHNhbml0aXplPFQ+KG9iamVjdFRvVmFsaWRhdGU6IGFueSwgc2NoZW1hOiBTY2hlbWEgfCBPYmplY3RTY2hlbWE8VD4sIHZhbGlkYXRpb25PcHRpb25zPzogVmFsaWRhdGlvbk9wdGlvbnMpOiBUIHtcblx0XHRyZXR1cm4gdGhpcy5fdmFsaWRhdGU8VD4ob2JqZWN0VG9WYWxpZGF0ZSwgc2NoZW1hLCB7IC4uLnZhbGlkYXRpb25PcHRpb25zLCBzdHJpcFVua25vd246IHRydWUgfSlcblx0fVxuXG5cdC8qKlxuXHQgKiBPbmx5IHZhbGlkYXRlIHByb3BlcnRpZXMgc3BlY2lmaWVkIGluIHZhbGlkYXRpb24gc2NoZW1hXG5cdCAqIEB0ZW1wbGF0ZSBUXG5cdCAqIEB0ZW1wbGF0ZSBKb2lcblx0ICogQHBhcmFtIHthbnl9IG9iamVjdFRvVmFsaWRhdGVcblx0ICogQHBhcmFtIHtKb2kuU2NoZW1hIHwgSm9pLk9iamVjdFNjaGVtYTxUPn0gc2NoZW1hXG5cdCAqIEBwYXJhbSB7dmFsaWRhdGlvbk9wdGlvbnN9IFt2YWxpZGF0aW9uT3B0aW9uc11cblx0ICogQHJldHVybnMge1R9IGV4cGVjdGVkIG9iamVjdCBhZnRlciB2YWxpZGF0aW9uXG5cdCAqL1xuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuXHR2YWxpZGF0ZTxUPihvYmplY3RUb1ZhbGlkYXRlOiBhbnksIHNjaGVtYTogU2NoZW1hIHwgT2JqZWN0U2NoZW1hPFQ+LCB2YWxpZGF0aW9uT3B0aW9ucz86IFZhbGlkYXRpb25PcHRpb25zKTogVCB7XG5cdFx0cmV0dXJuIHRoaXMuX3ZhbGlkYXRlPFQ+KG9iamVjdFRvVmFsaWRhdGUsIHNjaGVtYSwgdmFsaWRhdGlvbk9wdGlvbnMpXG5cdH1cblxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuXHRwcm90ZWN0ZWQgX3ZhbGlkYXRlPFQ+KG9iamVjdFRvVmFsaWRhdGU6IGFueSwgc2NoZW1hOiBTY2hlbWEgfCBPYmplY3RTY2hlbWE8VD4sIHZhbGlkYXRpb25PcHRpb25zPzogVmFsaWRhdGlvbk9wdGlvbnMpOiBUIHtcblx0XHRjb25zdCB7IGVycm9yOiB2YWxpZGF0aW9uRXJyb3IsIHZhbHVlIH0gPSBzY2hlbWEudmFsaWRhdGUob2JqZWN0VG9WYWxpZGF0ZSwgdmFsaWRhdGlvbk9wdGlvbnMpXG5cdFx0aWYgKHZhbGlkYXRpb25FcnJvcikge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yV2l0aFBheWxvYWQodmFsaWRhdGlvbkVycm9yLm1lc3NhZ2Uuc3BsaXQoJ1wiJykuam9pbihcIidcIiksIHZhbGlkYXRpb25FcnJvcilcblx0XHR9XG5cblx0XHRyZXR1cm4gdmFsdWUgYXMgVFxuXHR9XG59XG4iXX0=
@@ -1,5 +1,4 @@
1
- import { AnyFunction } from 'src/types/any-function'
2
-
1
+ export type AnyFunction<T> = (...args: any[]) => T;
3
2
  /**
4
3
  * This is a simple implementation of memoize function that caches result against the parameter passed that are passed to the
5
4
  * function so it never runs the same calculation twice.
@@ -13,15 +12,5 @@ import { AnyFunction } from 'src/types/any-function'
13
12
  * // using
14
13
  * sumTwoNumbersMemoize(5 + 10) // 15
15
14
  */
16
- export const memoizeFactory = <F extends AnyFunction<R>, R>(factoryFn: F): F => {
17
- const cache: { [k: string]: R } = {}
18
-
19
- return ((...args: Parameters<F>): R => {
20
- const key = JSON.stringify(args)
21
- if (key in cache) {
22
- return cache[key]
23
- }
24
-
25
- return (cache[key] = factoryFn(...args))
26
- }) as F
27
- }
15
+ export declare const memoizeFactory: <F extends AnyFunction<R>, R>(factoryFn: F) => F;
16
+ //# sourceMappingURL=memoize-factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memoize-factory.d.ts","sourceRoot":"","sources":["../src/memoize-factory.ts"],"names":[],"mappings":"AACA,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;AAElD;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,cAAc,2CAA4C,CAAC,KAAG,CAW1E,CAAA"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * This is a simple implementation of memoize function that caches result against the parameter passed that are passed to the
3
+ * function so it never runs the same calculation twice.
4
+ * @template F
5
+ * @template R
6
+ * @param {F} factoryFn
7
+ * @return {F: AnyFunction<R>}
8
+ * @example
9
+ * export const sumTwoNumbersMemoize = memoizeFactory((a:number, b:number): number => a + b)
10
+ *
11
+ * // using
12
+ * sumTwoNumbersMemoize(5 + 10) // 15
13
+ */
14
+ export const memoizeFactory = (factoryFn) => {
15
+ const cache = {};
16
+ return ((...args) => {
17
+ const key = JSON.stringify(args);
18
+ if (key in cache) {
19
+ return cache[key];
20
+ }
21
+ return (cache[key] = factoryFn(...args));
22
+ });
23
+ };
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtb2l6ZS1mYWN0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL21lbW9pemUtZmFjdG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQTs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsQ0FBOEIsU0FBWSxFQUFLLEVBQUU7SUFDOUUsTUFBTSxLQUFLLEdBQXNCLEVBQUUsQ0FBQTtJQUVuQyxPQUFPLENBQUMsQ0FBQyxHQUFHLElBQW1CLEVBQUssRUFBRTtRQUNyQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ2hDLElBQUksR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ2xCLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBRSxDQUFBO1FBQ25CLENBQUM7UUFFRCxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUE7SUFDekMsQ0FBQyxDQUFNLENBQUE7QUFDUixDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IHR5cGUgQW55RnVuY3Rpb248VD4gPSAoLi4uYXJnczogYW55W10pID0+IFRcblxuLyoqXG4gKiBUaGlzIGlzIGEgc2ltcGxlIGltcGxlbWVudGF0aW9uIG9mIG1lbW9pemUgZnVuY3Rpb24gdGhhdCBjYWNoZXMgcmVzdWx0IGFnYWluc3QgdGhlIHBhcmFtZXRlciBwYXNzZWQgdGhhdCBhcmUgcGFzc2VkIHRvIHRoZVxuICogZnVuY3Rpb24gc28gaXQgbmV2ZXIgcnVucyB0aGUgc2FtZSBjYWxjdWxhdGlvbiB0d2ljZS5cbiAqIEB0ZW1wbGF0ZSBGXG4gKiBAdGVtcGxhdGUgUlxuICogQHBhcmFtIHtGfSBmYWN0b3J5Rm5cbiAqIEByZXR1cm4ge0Y6IEFueUZ1bmN0aW9uPFI+fVxuICogQGV4YW1wbGVcbiAqIGV4cG9ydCBjb25zdCBzdW1Ud29OdW1iZXJzTWVtb2l6ZSA9IG1lbW9pemVGYWN0b3J5KChhOm51bWJlciwgYjpudW1iZXIpOiBudW1iZXIgPT4gYSArIGIpXG4gKlxuICogLy8gdXNpbmdcbiAqIHN1bVR3b051bWJlcnNNZW1vaXplKDUgKyAxMCkgLy8gMTVcbiAqL1xuZXhwb3J0IGNvbnN0IG1lbW9pemVGYWN0b3J5ID0gPEYgZXh0ZW5kcyBBbnlGdW5jdGlvbjxSPiwgUj4oZmFjdG9yeUZuOiBGKTogRiA9PiB7XG5cdGNvbnN0IGNhY2hlOiBSZWNvcmQ8c3RyaW5nLCBSPiA9IHt9XG5cblx0cmV0dXJuICgoLi4uYXJnczogUGFyYW1ldGVyczxGPik6IFIgPT4ge1xuXHRcdGNvbnN0IGtleSA9IEpTT04uc3RyaW5naWZ5KGFyZ3MpXG5cdFx0aWYgKGtleSBpbiBjYWNoZSkge1xuXHRcdFx0cmV0dXJuIGNhY2hlW2tleV0hXG5cdFx0fVxuXG5cdFx0cmV0dXJuIChjYWNoZVtrZXldID0gZmFjdG9yeUZuKC4uLmFyZ3MpKVxuXHR9KSBhcyBGXG59XG4iXX0=
@@ -0,0 +1,72 @@
1
+ export type ObjectType = Record<string, any>;
2
+ export declare class ObjectUtil {
3
+ /**
4
+ * Deep clone object. Returned object will have no references to the object passed through params
5
+ * @template T
6
+ * @param {T} objectToClone
7
+ * @return {T}
8
+ */
9
+ deepClone<T extends ObjectType>(objectToClone: T): T;
10
+ /**
11
+ * Pick only properties from the property list. It is only allowed to pick properties from the first level
12
+ * @template T
13
+ * @template L
14
+ * @param {T} obj
15
+ * @param {L[]} keyList
16
+ * @return {Pick<T, L>}
17
+ */
18
+ pickByList<T extends object, L extends keyof T>(obj: T, keyList: (L | string)[]): Pick<T, L>;
19
+ /**
20
+ * Pick objects properties using keys from the second object.
21
+ * @template T
22
+ * @template L
23
+ * @param {T} obj
24
+ * @param {Partial<T>} objWithPickKeys
25
+ * @return {Pick<T, L>}
26
+ */
27
+ pickByObjectKeys<T extends object, L extends keyof T>(obj: T, objWithPickKeys: Partial<T> | ObjectType): Pick<T, L>;
28
+ /**
29
+ * This function will do stringify deeper that JSON.stringify.
30
+ * @param {any} entity - entity thant needs to be stringify
31
+ * @param {object} [options] - available options
32
+ * @param {boolean} [options.isSortable=false] - if object property should be sorted
33
+ * @param {boolean} [options.isPrettyPrinted=false] - if object and array properties should be printed in a new row
34
+ * @param {number} [options.prettyPrintCompactLevel=0] - if pretty print is on define the level of deepest children that are not
35
+ * going to be pretty. It doesn't matter if the siblings doesn't have the same depth.
36
+ * @return {string} - strung result
37
+ * @example
38
+ * console.log(new ObjectUtil().deepStringify(null)) // 'null'
39
+ * console.log(new ObjectUtil().deepStringify(undefined)) // 'undefined'
40
+ * console.log(new ObjectUtil().deepStringify({ a: 1 })) // '{\n\ta: 1\n}'
41
+ * // `{
42
+ * // a:1
43
+ * // }`
44
+ * console.log(new ObjectUtil().deepStringify({ b: 1, a: 2 }, {isSorted:true, compact: true})) // { a: 2, b: 1 }
45
+ */
46
+ deepStringify(entity: any, options?: {
47
+ isSorted?: boolean;
48
+ isPrettyPrinted?: boolean;
49
+ prettyPrintCompactLevel?: number;
50
+ }): string;
51
+ protected _deepStringifyCompact(params: {
52
+ isPrettyPrinted: boolean;
53
+ prettyPrintCompactLevel: number;
54
+ }): number | boolean;
55
+ /**
56
+ * We are converting objects to string (or null or undefined) and comparing if the result is equal
57
+ * @param a
58
+ * @param b
59
+ * @return {boolean}
60
+ */
61
+ deepEqual(a: any, b: any): boolean;
62
+ /**
63
+ * This function is going to convert any null to undefined in the object that is passed to it.
64
+ * @template T
65
+ * @param {T} objectWithNulls
66
+ * @return {T}
67
+ * @example
68
+ * console.log(new ObjectUtil().deepNullToUndefined({ a: null, b: { c: null } })) // { a: undefined, b: { c: undefined } }
69
+ */
70
+ deepNullToUndefined<T extends ObjectType>(objectWithNulls: T): T;
71
+ }
72
+ //# sourceMappingURL=object-util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"object-util.d.ts","sourceRoot":"","sources":["../src/object-util.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;AAE5C,qBAAa,UAAU;IACtB;;;;;OAKG;IACH,SAAS,CAAC,CAAC,SAAS,UAAU,EAAE,aAAa,EAAE,CAAC,GAAG,CAAC;IAIpD;;;;;;;OAOG;IACH,UAAU,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;IAa5F;;;;;;;OAOG;IACH,gBAAgB,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,UAAU,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;IAMnH;;;;;;;;;;;;;;;;;OAiBG;IACH,aAAa,CAEZ,MAAM,EAAE,GAAG,EACX,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;QAAC,eAAe,CAAC,EAAE,OAAO,CAAC;QAAC,uBAAuB,CAAC,EAAE,MAAM,CAAA;KAAE,GAC3F,MAAM;IAeT,SAAS,CAAC,qBAAqB,CAAC,MAAM,EAAE;QAAE,eAAe,EAAE,OAAO,CAAC;QAAC,uBAAuB,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM,GAAG,OAAO;IAUxH;;;;;OAKG;IAEH,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,GAAG,OAAO;IAIlC;;;;;;;OAOG;IACH,mBAAmB,CAAC,CAAC,SAAS,UAAU,EAAE,eAAe,EAAE,CAAC,GAAG,CAAC;CAehE"}
@@ -0,0 +1,115 @@
1
+ import cloneDeep from 'lodash.clonedeep';
2
+ import util from 'util';
3
+ export class ObjectUtil {
4
+ /**
5
+ * Deep clone object. Returned object will have no references to the object passed through params
6
+ * @template T
7
+ * @param {T} objectToClone
8
+ * @return {T}
9
+ */
10
+ deepClone(objectToClone) {
11
+ return cloneDeep(objectToClone);
12
+ }
13
+ /**
14
+ * Pick only properties from the property list. It is only allowed to pick properties from the first level
15
+ * @template T
16
+ * @template L
17
+ * @param {T} obj
18
+ * @param {L[]} keyList
19
+ * @return {Pick<T, L>}
20
+ */
21
+ pickByList(obj, keyList) {
22
+ return keyList.reduce((pickedObj, key) => {
23
+ if (Object.prototype.hasOwnProperty.call(obj, key)) {
24
+ pickedObj[key] = obj[key];
25
+ }
26
+ return pickedObj;
27
+ }, {}); // eslint-disable-line @typescript-eslint/prefer-reduce-type-parameter
28
+ }
29
+ /**
30
+ * Pick objects properties using keys from the second object.
31
+ * @template T
32
+ * @template L
33
+ * @param {T} obj
34
+ * @param {Partial<T>} objWithPickKeys
35
+ * @return {Pick<T, L>}
36
+ */
37
+ pickByObjectKeys(obj, objWithPickKeys) {
38
+ const keys = Object.keys(objWithPickKeys);
39
+ return this.pickByList(obj, keys);
40
+ }
41
+ /**
42
+ * This function will do stringify deeper that JSON.stringify.
43
+ * @param {any} entity - entity thant needs to be stringify
44
+ * @param {object} [options] - available options
45
+ * @param {boolean} [options.isSortable=false] - if object property should be sorted
46
+ * @param {boolean} [options.isPrettyPrinted=false] - if object and array properties should be printed in a new row
47
+ * @param {number} [options.prettyPrintCompactLevel=0] - if pretty print is on define the level of deepest children that are not
48
+ * going to be pretty. It doesn't matter if the siblings doesn't have the same depth.
49
+ * @return {string} - strung result
50
+ * @example
51
+ * console.log(new ObjectUtil().deepStringify(null)) // 'null'
52
+ * console.log(new ObjectUtil().deepStringify(undefined)) // 'undefined'
53
+ * console.log(new ObjectUtil().deepStringify({ a: 1 })) // '{\n\ta: 1\n}'
54
+ * // `{
55
+ * // a:1
56
+ * // }`
57
+ * console.log(new ObjectUtil().deepStringify({ b: 1, a: 2 }, {isSorted:true, compact: true})) // { a: 2, b: 1 }
58
+ */
59
+ deepStringify(
60
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
61
+ entity, options) {
62
+ const { isSorted = false, isPrettyPrinted = false, prettyPrintCompactLevel = 0 } = options ?? {};
63
+ const compact = this._deepStringifyCompact({ isPrettyPrinted, prettyPrintCompactLevel });
64
+ return util.inspect(entity, {
65
+ breakLength: Infinity,
66
+ compact,
67
+ depth: Infinity,
68
+ maxArrayLength: Infinity,
69
+ maxStringLength: Infinity,
70
+ sorted: isSorted,
71
+ });
72
+ }
73
+ _deepStringifyCompact(params) {
74
+ const { isPrettyPrinted, prettyPrintCompactLevel } = params;
75
+ if (!isPrettyPrinted) {
76
+ return true;
77
+ }
78
+ return prettyPrintCompactLevel;
79
+ }
80
+ /**
81
+ * We are converting objects to string (or null or undefined) and comparing if the result is equal
82
+ * @param a
83
+ * @param b
84
+ * @return {boolean}
85
+ */
86
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
87
+ deepEqual(a, b) {
88
+ return this.deepStringify(a, { isSorted: true }) === this.deepStringify(b, { isSorted: true });
89
+ }
90
+ /**
91
+ * This function is going to convert any null to undefined in the object that is passed to it.
92
+ * @template T
93
+ * @param {T} objectWithNulls
94
+ * @return {T}
95
+ * @example
96
+ * console.log(new ObjectUtil().deepNullToUndefined({ a: null, b: { c: null } })) // { a: undefined, b: { c: undefined } }
97
+ */
98
+ deepNullToUndefined(objectWithNulls) {
99
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
100
+ return Object.entries(objectWithNulls).reduce((acc, cur) => {
101
+ const [key, value] = cur;
102
+ if (value === null) {
103
+ acc[key] = undefined;
104
+ }
105
+ else if (typeof value === 'object' && !(value instanceof Date)) {
106
+ acc[key] = this.deepNullToUndefined(value);
107
+ }
108
+ else {
109
+ acc[key] = value;
110
+ }
111
+ return acc;
112
+ }, {});
113
+ }
114
+ }
115
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JqZWN0LXV0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvb2JqZWN0LXV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxTQUFTLE1BQU0sa0JBQWtCLENBQUE7QUFDeEMsT0FBTyxJQUFJLE1BQU0sTUFBTSxDQUFBO0FBS3ZCLE1BQU0sT0FBTyxVQUFVO0lBQ3RCOzs7OztPQUtHO0lBQ0gsU0FBUyxDQUF1QixhQUFnQjtRQUMvQyxPQUFPLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQTtJQUNoQyxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILFVBQVUsQ0FBc0MsR0FBTSxFQUFFLE9BQXVCO1FBQzlFLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FDcEIsQ0FBQyxTQUFTLEVBQUUsR0FBRyxFQUFFLEVBQUU7WUFDbEIsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3BELFNBQVMsQ0FBQyxHQUFRLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBUSxDQUFDLENBQUE7WUFDcEMsQ0FBQztZQUVELE9BQU8sU0FBUyxDQUFBO1FBQ2pCLENBQUMsRUFDRCxFQUFnQixDQUNoQixDQUFBLENBQUMsc0VBQXNFO0lBQ3pFLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsZ0JBQWdCLENBQXNDLEdBQU0sRUFBRSxlQUF3QztRQUNyRyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBUSxDQUFBO1FBRWhELE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBTyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFDeEMsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7OztPQWlCRztJQUNILGFBQWE7SUFDWiw4REFBOEQ7SUFDOUQsTUFBVyxFQUNYLE9BQTZGO1FBRTdGLE1BQU0sRUFBRSxRQUFRLEdBQUcsS0FBSyxFQUFFLGVBQWUsR0FBRyxLQUFLLEVBQUUsdUJBQXVCLEdBQUcsQ0FBQyxFQUFFLEdBQUcsT0FBTyxJQUFJLEVBQUUsQ0FBQTtRQUVoRyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsRUFBRSxlQUFlLEVBQUUsdUJBQXVCLEVBQUUsQ0FBQyxDQUFBO1FBRXhGLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUU7WUFDM0IsV0FBVyxFQUFFLFFBQVE7WUFDckIsT0FBTztZQUNQLEtBQUssRUFBRSxRQUFRO1lBQ2YsY0FBYyxFQUFFLFFBQVE7WUFDeEIsZUFBZSxFQUFFLFFBQVE7WUFDekIsTUFBTSxFQUFFLFFBQVE7U0FDaEIsQ0FBQyxDQUFBO0lBQ0gsQ0FBQztJQUVTLHFCQUFxQixDQUFDLE1BQXFFO1FBQ3BHLE1BQU0sRUFBRSxlQUFlLEVBQUUsdUJBQXVCLEVBQUUsR0FBRyxNQUFNLENBQUE7UUFFM0QsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3RCLE9BQU8sSUFBSSxDQUFBO1FBQ1osQ0FBQztRQUVELE9BQU8sdUJBQXVCLENBQUE7SUFDL0IsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsOERBQThEO0lBQzlELFNBQVMsQ0FBQyxDQUFNLEVBQUUsQ0FBTTtRQUN2QixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLEtBQUssSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQTtJQUMvRixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILG1CQUFtQixDQUF1QixlQUFrQjtRQUMzRCw4REFBOEQ7UUFDOUQsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDLE1BQU0sQ0FBTSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRTtZQUMvRCxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQTtZQUN4QixJQUFJLEtBQUssS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDcEIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLFNBQVMsQ0FBQTtZQUNyQixDQUFDO2lCQUFNLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLENBQUMsQ0FBQyxLQUFLLFlBQVksSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDbEUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQTtZQUMzQyxDQUFDO2lCQUFNLENBQUM7Z0JBQ1AsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQTtZQUNqQixDQUFDO1lBRUQsT0FBTyxHQUFHLENBQUE7UUFDWCxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUE7SUFDUCxDQUFDO0NBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC5jbG9uZWRlZXAnXG5pbXBvcnQgdXRpbCBmcm9tICd1dGlsJ1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IHR5cGUgT2JqZWN0VHlwZSA9IFJlY29yZDxzdHJpbmcsIGFueT5cblxuZXhwb3J0IGNsYXNzIE9iamVjdFV0aWwge1xuXHQvKipcblx0ICogRGVlcCBjbG9uZSBvYmplY3QuIFJldHVybmVkIG9iamVjdCB3aWxsIGhhdmUgbm8gcmVmZXJlbmNlcyB0byB0aGUgb2JqZWN0IHBhc3NlZCB0aHJvdWdoIHBhcmFtc1xuXHQgKiBAdGVtcGxhdGUgVFxuXHQgKiBAcGFyYW0ge1R9IG9iamVjdFRvQ2xvbmVcblx0ICogQHJldHVybiB7VH1cblx0ICovXG5cdGRlZXBDbG9uZTxUIGV4dGVuZHMgT2JqZWN0VHlwZT4ob2JqZWN0VG9DbG9uZTogVCk6IFQge1xuXHRcdHJldHVybiBjbG9uZURlZXAob2JqZWN0VG9DbG9uZSlcblx0fVxuXG5cdC8qKlxuXHQgKiBQaWNrIG9ubHkgcHJvcGVydGllcyBmcm9tIHRoZSBwcm9wZXJ0eSBsaXN0LiBJdCBpcyBvbmx5IGFsbG93ZWQgdG8gcGljayBwcm9wZXJ0aWVzIGZyb20gdGhlIGZpcnN0IGxldmVsXG5cdCAqIEB0ZW1wbGF0ZSBUXG5cdCAqIEB0ZW1wbGF0ZSBMXG5cdCAqIEBwYXJhbSB7VH0gb2JqXG5cdCAqIEBwYXJhbSB7TFtdfSBrZXlMaXN0XG5cdCAqIEByZXR1cm4ge1BpY2s8VCwgTD59XG5cdCAqL1xuXHRwaWNrQnlMaXN0PFQgZXh0ZW5kcyBvYmplY3QsIEwgZXh0ZW5kcyBrZXlvZiBUPihvYmo6IFQsIGtleUxpc3Q6IChMIHwgc3RyaW5nKVtdKTogUGljazxULCBMPiB7XG5cdFx0cmV0dXJuIGtleUxpc3QucmVkdWNlKFxuXHRcdFx0KHBpY2tlZE9iaiwga2V5KSA9PiB7XG5cdFx0XHRcdGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7XG5cdFx0XHRcdFx0cGlja2VkT2JqW2tleSBhcyBMXSA9IG9ialtrZXkgYXMgTF1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBwaWNrZWRPYmpcblx0XHRcdH0sXG5cdFx0XHR7fSBhcyBQaWNrPFQsIEw+XG5cdFx0KSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItcmVkdWNlLXR5cGUtcGFyYW1ldGVyXG5cdH1cblxuXHQvKipcblx0ICogUGljayBvYmplY3RzIHByb3BlcnRpZXMgdXNpbmcga2V5cyBmcm9tIHRoZSBzZWNvbmQgb2JqZWN0LlxuXHQgKiBAdGVtcGxhdGUgVFxuXHQgKiBAdGVtcGxhdGUgTFxuXHQgKiBAcGFyYW0ge1R9IG9ialxuXHQgKiBAcGFyYW0ge1BhcnRpYWw8VD59IG9ialdpdGhQaWNrS2V5c1xuXHQgKiBAcmV0dXJuIHtQaWNrPFQsIEw+fVxuXHQgKi9cblx0cGlja0J5T2JqZWN0S2V5czxUIGV4dGVuZHMgb2JqZWN0LCBMIGV4dGVuZHMga2V5b2YgVD4ob2JqOiBULCBvYmpXaXRoUGlja0tleXM6IFBhcnRpYWw8VD4gfCBPYmplY3RUeXBlKTogUGljazxULCBMPiB7XG5cdFx0Y29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKG9ialdpdGhQaWNrS2V5cykgYXMgTFtdXG5cblx0XHRyZXR1cm4gdGhpcy5waWNrQnlMaXN0PFQsIEw+KG9iaiwga2V5cylcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgZG8gc3RyaW5naWZ5IGRlZXBlciB0aGF0IEpTT04uc3RyaW5naWZ5LlxuXHQgKiBAcGFyYW0ge2FueX0gZW50aXR5IC0gZW50aXR5IHRoYW50IG5lZWRzIHRvIGJlIHN0cmluZ2lmeVxuXHQgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdIC0gYXZhaWxhYmxlIG9wdGlvbnNcblx0ICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5pc1NvcnRhYmxlPWZhbHNlXSAtIGlmIG9iamVjdCBwcm9wZXJ0eSBzaG91bGQgYmUgc29ydGVkXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuaXNQcmV0dHlQcmludGVkPWZhbHNlXSAtIGlmIG9iamVjdCBhbmQgYXJyYXkgcHJvcGVydGllcyBzaG91bGQgYmUgcHJpbnRlZCBpbiBhIG5ldyByb3dcblx0ICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLnByZXR0eVByaW50Q29tcGFjdExldmVsPTBdIC0gaWYgcHJldHR5IHByaW50IGlzIG9uIGRlZmluZSB0aGUgbGV2ZWwgb2YgZGVlcGVzdCBjaGlsZHJlbiB0aGF0IGFyZSBub3Rcblx0ICogZ29pbmcgdG8gYmUgcHJldHR5LiBJdCBkb2Vzbid0IG1hdHRlciBpZiB0aGUgc2libGluZ3MgZG9lc24ndCBoYXZlIHRoZSBzYW1lIGRlcHRoLlxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9IC0gc3RydW5nIHJlc3VsdFxuXHQgKiBAZXhhbXBsZVxuXHQgKiBjb25zb2xlLmxvZyhuZXcgT2JqZWN0VXRpbCgpLmRlZXBTdHJpbmdpZnkobnVsbCkpIC8vICdudWxsJ1xuXHQgKiBjb25zb2xlLmxvZyhuZXcgT2JqZWN0VXRpbCgpLmRlZXBTdHJpbmdpZnkodW5kZWZpbmVkKSkgLy8gJ3VuZGVmaW5lZCdcblx0ICogY29uc29sZS5sb2cobmV3IE9iamVjdFV0aWwoKS5kZWVwU3RyaW5naWZ5KHsgYTogMSB9KSkgLy8gJ3tcXG5cXHRhOiAxXFxufSdcblx0ICogLy8gYHtcblx0ICogLy8gICBhOjFcblx0ICogLy8gfWBcblx0ICogY29uc29sZS5sb2cobmV3IE9iamVjdFV0aWwoKS5kZWVwU3RyaW5naWZ5KHsgYjogMSwgYTogMiB9LCB7aXNTb3J0ZWQ6dHJ1ZSwgY29tcGFjdDogdHJ1ZX0pKSAvLyB7IGE6IDIsIGI6IDEgfVxuXHQgKi9cblx0ZGVlcFN0cmluZ2lmeShcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuXHRcdGVudGl0eTogYW55LFxuXHRcdG9wdGlvbnM/OiB7IGlzU29ydGVkPzogYm9vbGVhbjsgaXNQcmV0dHlQcmludGVkPzogYm9vbGVhbjsgcHJldHR5UHJpbnRDb21wYWN0TGV2ZWw/OiBudW1iZXIgfVxuXHQpOiBzdHJpbmcge1xuXHRcdGNvbnN0IHsgaXNTb3J0ZWQgPSBmYWxzZSwgaXNQcmV0dHlQcmludGVkID0gZmFsc2UsIHByZXR0eVByaW50Q29tcGFjdExldmVsID0gMCB9ID0gb3B0aW9ucyA/PyB7fVxuXG5cdFx0Y29uc3QgY29tcGFjdCA9IHRoaXMuX2RlZXBTdHJpbmdpZnlDb21wYWN0KHsgaXNQcmV0dHlQcmludGVkLCBwcmV0dHlQcmludENvbXBhY3RMZXZlbCB9KVxuXG5cdFx0cmV0dXJuIHV0aWwuaW5zcGVjdChlbnRpdHksIHtcblx0XHRcdGJyZWFrTGVuZ3RoOiBJbmZpbml0eSxcblx0XHRcdGNvbXBhY3QsXG5cdFx0XHRkZXB0aDogSW5maW5pdHksXG5cdFx0XHRtYXhBcnJheUxlbmd0aDogSW5maW5pdHksXG5cdFx0XHRtYXhTdHJpbmdMZW5ndGg6IEluZmluaXR5LFxuXHRcdFx0c29ydGVkOiBpc1NvcnRlZCxcblx0XHR9KVxuXHR9XG5cblx0cHJvdGVjdGVkIF9kZWVwU3RyaW5naWZ5Q29tcGFjdChwYXJhbXM6IHsgaXNQcmV0dHlQcmludGVkOiBib29sZWFuOyBwcmV0dHlQcmludENvbXBhY3RMZXZlbDogbnVtYmVyIH0pOiBudW1iZXIgfCBib29sZWFuIHtcblx0XHRjb25zdCB7IGlzUHJldHR5UHJpbnRlZCwgcHJldHR5UHJpbnRDb21wYWN0TGV2ZWwgfSA9IHBhcmFtc1xuXG5cdFx0aWYgKCFpc1ByZXR0eVByaW50ZWQpIHtcblx0XHRcdHJldHVybiB0cnVlXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHByZXR0eVByaW50Q29tcGFjdExldmVsXG5cdH1cblxuXHQvKipcblx0ICogV2UgYXJlIGNvbnZlcnRpbmcgb2JqZWN0cyB0byBzdHJpbmcgKG9yIG51bGwgb3IgdW5kZWZpbmVkKSBhbmQgY29tcGFyaW5nIGlmIHRoZSByZXN1bHQgaXMgZXF1YWxcblx0ICogQHBhcmFtIGFcblx0ICogQHBhcmFtIGJcblx0ICogQHJldHVybiB7Ym9vbGVhbn1cblx0ICovXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5cdGRlZXBFcXVhbChhOiBhbnksIGI6IGFueSk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLmRlZXBTdHJpbmdpZnkoYSwgeyBpc1NvcnRlZDogdHJ1ZSB9KSA9PT0gdGhpcy5kZWVwU3RyaW5naWZ5KGIsIHsgaXNTb3J0ZWQ6IHRydWUgfSlcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIGdvaW5nIHRvIGNvbnZlcnQgYW55IG51bGwgdG8gdW5kZWZpbmVkIGluIHRoZSBvYmplY3QgdGhhdCBpcyBwYXNzZWQgdG8gaXQuXG5cdCAqIEB0ZW1wbGF0ZSBUXG5cdCAqIEBwYXJhbSB7VH0gb2JqZWN0V2l0aE51bGxzXG5cdCAqIEByZXR1cm4ge1R9XG5cdCAqIEBleGFtcGxlXG5cdCAqIGNvbnNvbGUubG9nKG5ldyBPYmplY3RVdGlsKCkuZGVlcE51bGxUb1VuZGVmaW5lZCh7IGE6IG51bGwsIGI6IHsgYzogbnVsbCB9IH0pKSAvLyB7IGE6IHVuZGVmaW5lZCwgYjogeyBjOiB1bmRlZmluZWQgfSB9XG5cdCAqL1xuXHRkZWVwTnVsbFRvVW5kZWZpbmVkPFQgZXh0ZW5kcyBPYmplY3RUeXBlPihvYmplY3RXaXRoTnVsbHM6IFQpOiBUIHtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuXHRcdHJldHVybiBPYmplY3QuZW50cmllcyhvYmplY3RXaXRoTnVsbHMpLnJlZHVjZTxhbnk+KChhY2MsIGN1cikgPT4ge1xuXHRcdFx0Y29uc3QgW2tleSwgdmFsdWVdID0gY3VyXG5cdFx0XHRpZiAodmFsdWUgPT09IG51bGwpIHtcblx0XHRcdFx0YWNjW2tleV0gPSB1bmRlZmluZWRcblx0XHRcdH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkpIHtcblx0XHRcdFx0YWNjW2tleV0gPSB0aGlzLmRlZXBOdWxsVG9VbmRlZmluZWQodmFsdWUpXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRhY2Nba2V5XSA9IHZhbHVlXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBhY2Ncblx0XHR9LCB7fSlcblx0fVxufVxuIl19
@@ -0,0 +1,12 @@
1
+ export declare const regexUtil: {
2
+ /**
3
+ * This is a UUID regex expression. This is usually used in express router to constrict the values passed as a path parameter (if you are using UUID as your identifier).
4
+ * @return {string}
5
+ * @example
6
+ * const { uuid } = regexUtil
7
+ * router.route(`/users/:userId(${uuid})`).get(getUsersById)
8
+ * //...
9
+ */
10
+ uuid: "\\b[0-9a-f]{8}\\b-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-\\b[0-9a-f]{12}\\b";
11
+ };
12
+ //# sourceMappingURL=regex-util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"regex-util.d.ts","sourceRoot":"","sources":["../src/regex-util.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,SAAS;IACrB;;;;;;;OAOG;;CAEH,CAAA"}
@@ -0,0 +1,12 @@
1
+ export const regexUtil = {
2
+ /**
3
+ * This is a UUID regex expression. This is usually used in express router to constrict the values passed as a path parameter (if you are using UUID as your identifier).
4
+ * @return {string}
5
+ * @example
6
+ * const { uuid } = regexUtil
7
+ * router.route(`/users/:userId(${uuid})`).get(getUsersById)
8
+ * //...
9
+ */
10
+ uuid: `\\b[0-9a-f]{8}\\b-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-\\b[0-9a-f]{12}\\b`,
11
+ };
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnZXgtdXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9yZWdleC11dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRztJQUN4Qjs7Ozs7OztPQU9HO0lBQ0gsSUFBSSxFQUFFLDBFQUFtRjtDQUN6RixDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IHJlZ2V4VXRpbCA9IHtcblx0LyoqXG5cdCAqIFRoaXMgaXMgYSBVVUlEIHJlZ2V4IGV4cHJlc3Npb24uIFRoaXMgaXMgdXN1YWxseSB1c2VkIGluIGV4cHJlc3Mgcm91dGVyIHRvIGNvbnN0cmljdCB0aGUgdmFsdWVzIHBhc3NlZCBhcyBhIHBhdGggcGFyYW1ldGVyIChpZiB5b3UgYXJlIHVzaW5nIFVVSUQgYXMgeW91ciBpZGVudGlmaWVyKS5cblx0ICogQHJldHVybiB7c3RyaW5nfVxuXHQgKiBAZXhhbXBsZVxuXHQgKiBjb25zdCB7IHV1aWQgfSA9IHJlZ2V4VXRpbFxuXHQgKiByb3V0ZXIucm91dGUoYC91c2Vycy86dXNlcklkKCR7dXVpZH0pYCkuZ2V0KGdldFVzZXJzQnlJZClcblx0ICogLy8uLi5cblx0ICovXG5cdHV1aWQ6IGBcXFxcYlswLTlhLWZdezh9XFxcXGItWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tXFxcXGJbMC05YS1mXXsxMn1cXFxcYmAgYXMgY29uc3QsXG59XG4iXX0=