@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.
- package/dist/array-util.d.ts +23 -0
- package/dist/array-util.d.ts.map +1 -0
- package/dist/array-util.js +27 -0
- package/{src/class-factory-pattern.ts → dist/class-factory-pattern.d.ts} +5 -9
- package/dist/class-factory-pattern.d.ts.map +1 -0
- package/dist/class-factory-pattern.js +26 -0
- package/{src/express/error-handler.ts → dist/express/error-handler.d.ts} +2 -10
- package/dist/express/error-handler.d.ts.map +1 -0
- package/dist/express/error-handler.js +26 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/joi-util.d.ts +47 -0
- package/dist/joi-util.d.ts.map +1 -0
- package/dist/joi-util.js +62 -0
- package/{src/memoize-factory.ts → dist/memoize-factory.d.ts} +3 -14
- package/dist/memoize-factory.d.ts.map +1 -0
- package/dist/memoize-factory.js +24 -0
- package/dist/object-util.d.ts +72 -0
- package/dist/object-util.d.ts.map +1 -0
- package/dist/object-util.js +115 -0
- package/dist/regex-util.d.ts +12 -0
- package/dist/regex-util.d.ts.map +1 -0
- package/dist/regex-util.js +12 -0
- package/dist/single-threshold-promise.d.ts +31 -0
- package/dist/single-threshold-promise.d.ts.map +1 -0
- package/dist/single-threshold-promise.js +46 -0
- package/dist/singleton/async.d.ts +50 -0
- package/dist/singleton/async.d.ts.map +1 -0
- package/dist/singleton/async.js +75 -0
- package/{src/singleton/pattern.ts → dist/singleton/pattern.d.ts} +3 -13
- package/dist/singleton/pattern.d.ts.map +1 -0
- package/dist/singleton/pattern.js +41 -0
- package/dist/string-util.d.ts +10 -0
- package/dist/string-util.d.ts.map +1 -0
- package/dist/string-util.js +18 -0
- package/dist/time-util.d.ts +74 -0
- package/dist/time-util.d.ts.map +1 -0
- package/dist/time-util.js +90 -0
- package/dist/time-zone.d.ts +467 -0
- package/dist/time-zone.d.ts.map +1 -0
- package/dist/time-zone.js +468 -0
- package/{src/timeout.ts → dist/timeout.d.ts} +2 -3
- package/dist/timeout.d.ts.map +1 -0
- package/dist/timeout.js +17 -0
- package/dist/type-util.d.ts +50 -0
- package/dist/type-util.d.ts.map +1 -0
- package/dist/type-util.js +54 -0
- package/lib/array-util.d.ts.map +1 -1
- package/lib/array-util.js +30 -28
- package/lib/class-factory-pattern.d.ts.map +1 -1
- package/lib/class-factory-pattern.js +17 -8
- package/lib/express/error-handler.d.ts.map +1 -1
- package/lib/express/error-handler.js +15 -11
- package/lib/index.d.ts +16 -13
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +107 -29
- package/lib/joi-util.d.ts.map +1 -1
- package/lib/joi-util.js +66 -22
- package/lib/memoize-factory.d.ts +1 -1
- package/lib/memoize-factory.d.ts.map +1 -1
- package/lib/memoize-factory.js +19 -13
- package/lib/object-util.d.ts.map +1 -1
- package/lib/object-util.js +110 -55
- package/lib/package.json +1 -0
- package/lib/regex-util.js +15 -13
- package/lib/single-threshold-promise.d.ts +1 -1
- package/lib/single-threshold-promise.d.ts.map +1 -1
- package/lib/single-threshold-promise.js +74 -28
- package/lib/singleton/async.d.ts +1 -1
- package/lib/singleton/async.d.ts.map +1 -1
- package/lib/singleton/async.js +105 -45
- package/lib/singleton/pattern.d.ts +1 -1
- package/lib/singleton/pattern.d.ts.map +1 -1
- package/lib/singleton/pattern.js +13 -12
- package/lib/string-util.js +21 -19
- package/lib/time-util.js +69 -39
- package/lib/time-zone.d.ts +467 -0
- package/lib/time-zone.d.ts.map +1 -0
- package/lib/time-zone.js +473 -0
- package/lib/timeout.js +9 -6
- package/lib/type-util.js +57 -55
- package/lib/types/global.d.js +5 -0
- package/lib/types/types.d.js +3 -0
- package/package.json +188 -134
- package/lib/array-util.js.map +0 -1
- package/lib/class-factory-pattern.js.map +0 -1
- package/lib/express/error-handler.js.map +0 -1
- package/lib/index.js.map +0 -1
- package/lib/joi-util.js.map +0 -1
- package/lib/memoize-factory.js.map +0 -1
- package/lib/object-util.js.map +0 -1
- package/lib/regex-util.js.map +0 -1
- package/lib/single-threshold-promise.js.map +0 -1
- package/lib/singleton/async.js.map +0 -1
- package/lib/singleton/pattern.js.map +0 -1
- package/lib/string-util.js.map +0 -1
- package/lib/time-util.js.map +0 -1
- package/lib/timeout.js.map +0 -1
- package/lib/type-util.js.map +0 -1
- package/lib/types/any-function/index.d.ts +0 -2
- package/lib/types/any-function/index.d.ts.map +0 -1
- package/lib/types/any-function/index.js +0 -3
- package/lib/types/any-function/index.js.map +0 -1
- package/lib/types/any-function/no-params.d.ts +0 -2
- package/lib/types/any-function/no-params.d.ts.map +0 -1
- package/lib/types/any-function/no-params.js +0 -3
- package/lib/types/any-function/no-params.js.map +0 -1
- package/lib/types/any-function/promise-no-params.d.ts +0 -2
- package/lib/types/any-function/promise-no-params.d.ts.map +0 -1
- package/lib/types/any-function/promise-no-params.js +0 -3
- package/lib/types/any-function/promise-no-params.js.map +0 -1
- package/lib/types/any-function/promise.d.ts +0 -2
- package/lib/types/any-function/promise.d.ts.map +0 -1
- package/lib/types/any-function/promise.js +0 -3
- package/lib/types/any-function/promise.js.map +0 -1
- package/src/array-util.test.ts +0 -50
- package/src/array-util.ts +0 -26
- package/src/class-factory-pattern.test.ts +0 -39
- package/src/express/error-handler.test.ts +0 -44
- package/src/index.ts +0 -25
- package/src/joi-util.test.ts +0 -192
- package/src/joi-util.ts +0 -65
- package/src/memoize-factory.test.ts +0 -40
- package/src/object-util.test.ts +0 -360
- package/src/object-util.ts +0 -127
- package/src/regex-util.test.ts +0 -25
- package/src/regex-util.ts +0 -11
- package/src/single-threshold-promise.test.ts +0 -91
- package/src/single-threshold-promise.ts +0 -56
- package/src/singleton/async.test.ts +0 -122
- package/src/singleton/async.ts +0 -90
- package/src/singleton/pattern.test.ts +0 -16
- package/src/string-util.test.ts +0 -18
- package/src/string-util.ts +0 -18
- package/src/time-util.test.ts +0 -89
- package/src/time-util.ts +0 -98
- package/src/timeout.test.ts +0 -65
- package/src/type-util.test.ts +0 -20
- package/src/type-util.ts +0 -54
- package/src/types/any-function/index.ts +0 -1
- package/src/types/any-function/no-params.ts +0 -1
- package/src/types/any-function/promise-no-params.ts +0 -1
- package/src/types/any-function/promise.ts +0 -1
- 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 {
|
|
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
|
|
24
|
-
|
|
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
|
|
17
|
-
|
|
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=
|
package/dist/index.d.ts
ADDED
|
@@ -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"}
|
package/dist/joi-util.js
ADDED
|
@@ -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
|
-
|
|
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
|
|
17
|
-
|
|
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=
|