@decaf-ts/decorator-validation 1.5.2 → 1.5.5
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/LICENSE.md +0 -0
- package/README.md +34 -108
- package/dist/decorator-validation.js +2 -0
- package/dist/decorator-validation.js.LICENSE.txt +14 -0
- package/dist/esm/decorator-validation.js +2 -0
- package/dist/esm/decorator-validation.js.LICENSE.txt +14 -0
- package/lib/esm/index.d.ts +42 -0
- package/lib/esm/index.js +44 -0
- package/lib/esm/model/Model.d.ts +138 -0
- package/lib/esm/model/Model.js +298 -0
- package/lib/esm/model/ModelErrorDefinition.d.ts +22 -0
- package/lib/esm/model/ModelErrorDefinition.js +54 -0
- package/lib/esm/model/Registry.d.ts +59 -0
- package/lib/esm/model/Registry.js +75 -0
- package/lib/esm/model/constants.d.ts +56 -0
- package/lib/esm/model/constants.js +71 -0
- package/lib/esm/model/construction.d.ts +29 -0
- package/lib/esm/model/construction.js +65 -0
- package/lib/esm/model/decorators.d.ts +25 -0
- package/lib/esm/model/decorators.js +64 -0
- package/lib/esm/model/index.d.ts +9 -0
- package/lib/esm/model/index.js +11 -0
- package/lib/esm/model/types.d.ts +79 -0
- package/lib/esm/model/types.js +3 -0
- package/lib/esm/model/utils.d.ts +11 -0
- package/lib/esm/model/utils.js +27 -0
- package/lib/esm/model/validation.d.ts +14 -0
- package/lib/esm/model/validation.js +137 -0
- package/lib/esm/utils/constants.d.ts +26 -0
- package/lib/esm/utils/constants.js +29 -0
- package/lib/esm/utils/dates.d.ts +76 -0
- package/lib/esm/utils/dates.js +245 -0
- package/lib/esm/utils/decorators.d.ts +2 -0
- package/lib/esm/utils/decorators.js +20 -0
- package/lib/esm/utils/hashing.d.ts +52 -0
- package/lib/esm/utils/hashing.js +101 -0
- package/lib/esm/utils/index.d.ts +7 -0
- package/lib/esm/utils/index.js +9 -0
- package/lib/esm/utils/registry.d.ts +68 -0
- package/lib/esm/utils/registry.js +3 -0
- package/lib/esm/utils/serialization.d.ts +79 -0
- package/lib/esm/utils/serialization.js +90 -0
- package/lib/esm/utils/strings.d.ts +25 -0
- package/lib/esm/utils/strings.js +33 -0
- package/lib/esm/validation/Validation.d.ts +51 -0
- package/lib/esm/validation/Validation.js +73 -0
- package/lib/esm/validation/Validators/DateValidator.d.ts +28 -0
- package/lib/esm/validation/Validators/DateValidator.js +56 -0
- package/lib/esm/validation/Validators/EmailValidator.d.ts +28 -0
- package/lib/esm/validation/Validators/EmailValidator.js +52 -0
- package/lib/esm/validation/Validators/ListValidator.d.ts +28 -0
- package/lib/esm/validation/Validators/ListValidator.js +69 -0
- package/lib/esm/validation/Validators/MaxLengthValidator.d.ts +29 -0
- package/lib/esm/validation/Validators/MaxLengthValidator.js +54 -0
- package/lib/esm/validation/Validators/MaxValidator.d.ts +28 -0
- package/lib/esm/validation/Validators/MaxValidator.js +59 -0
- package/lib/esm/validation/Validators/MinLengthValidator.d.ts +29 -0
- package/lib/esm/validation/Validators/MinLengthValidator.js +54 -0
- package/lib/esm/validation/Validators/MinValidator.d.ts +28 -0
- package/lib/esm/validation/Validators/MinValidator.js +59 -0
- package/lib/esm/validation/Validators/PasswordValidator.d.ts +28 -0
- package/lib/esm/validation/Validators/PasswordValidator.js +52 -0
- package/lib/esm/validation/Validators/PatternValidator.d.ts +37 -0
- package/lib/esm/validation/Validators/PatternValidator.js +72 -0
- package/lib/esm/validation/Validators/RequiredValidator.d.ts +28 -0
- package/lib/esm/validation/Validators/RequiredValidator.js +59 -0
- package/lib/esm/validation/Validators/StepValidator.d.ts +29 -0
- package/lib/esm/validation/Validators/StepValidator.js +54 -0
- package/lib/esm/validation/Validators/TypeValidator.d.ts +25 -0
- package/lib/esm/validation/Validators/TypeValidator.js +62 -0
- package/lib/esm/validation/Validators/URLValidator.d.ts +27 -0
- package/lib/esm/validation/Validators/URLValidator.js +51 -0
- package/lib/esm/validation/Validators/Validator.d.ts +41 -0
- package/lib/esm/validation/Validators/Validator.js +49 -0
- package/lib/esm/validation/Validators/ValidatorRegistry.d.ts +47 -0
- package/lib/esm/validation/Validators/ValidatorRegistry.js +82 -0
- package/lib/esm/validation/Validators/constants.d.ts +96 -0
- package/lib/esm/validation/Validators/constants.js +136 -0
- package/lib/esm/validation/Validators/decorators.d.ts +12 -0
- package/lib/esm/validation/Validators/decorators.js +27 -0
- package/lib/esm/validation/Validators/index.d.ts +52 -0
- package/lib/esm/validation/Validators/index.js +54 -0
- package/lib/esm/validation/Validators/types.d.ts +88 -0
- package/lib/esm/validation/Validators/types.js +3 -0
- package/lib/esm/validation/decorators.d.ts +178 -0
- package/lib/esm/validation/decorators.js +290 -0
- package/lib/esm/validation/index.d.ts +4 -0
- package/lib/esm/validation/index.js +6 -0
- package/lib/esm/validation/types.d.ts +46 -0
- package/lib/esm/validation/types.js +3 -0
- package/lib/index.cjs +61 -0
- package/lib/index.d.ts +42 -0
- package/lib/model/Model.cjs +302 -0
- package/lib/model/Model.d.ts +138 -0
- package/lib/model/ModelErrorDefinition.cjs +58 -0
- package/lib/model/ModelErrorDefinition.d.ts +22 -0
- package/lib/model/Registry.cjs +80 -0
- package/lib/model/Registry.d.ts +59 -0
- package/lib/model/constants.cjs +74 -0
- package/lib/model/constants.d.ts +56 -0
- package/lib/model/construction.cjs +70 -0
- package/lib/model/construction.d.ts +29 -0
- package/lib/model/decorators.cjs +69 -0
- package/lib/model/decorators.d.ts +25 -0
- package/lib/model/index.cjs +27 -0
- package/lib/model/index.d.ts +9 -0
- package/lib/model/types.cjs +4 -0
- package/lib/model/types.d.ts +79 -0
- package/lib/model/utils.cjs +31 -0
- package/lib/model/utils.d.ts +11 -0
- package/lib/model/validation.cjs +140 -0
- package/lib/model/validation.d.ts +14 -0
- package/lib/utils/constants.cjs +32 -0
- package/lib/utils/constants.d.ts +26 -0
- package/lib/utils/dates.cjs +253 -0
- package/lib/utils/dates.d.ts +76 -0
- package/lib/utils/decorators.cjs +24 -0
- package/lib/utils/decorators.d.ts +2 -0
- package/lib/utils/hashing.cjs +108 -0
- package/lib/utils/hashing.d.ts +52 -0
- package/lib/utils/index.cjs +25 -0
- package/lib/utils/index.d.ts +7 -0
- package/lib/utils/registry.cjs +4 -0
- package/lib/utils/registry.d.ts +68 -0
- package/lib/utils/serialization.cjs +95 -0
- package/lib/utils/serialization.d.ts +79 -0
- package/lib/utils/strings.cjs +37 -0
- package/lib/utils/strings.d.ts +25 -0
- package/lib/validation/Validation.cjs +77 -0
- package/lib/validation/Validation.d.ts +51 -0
- package/lib/validation/Validators/DateValidator.cjs +59 -0
- package/lib/validation/Validators/DateValidator.d.ts +28 -0
- package/lib/validation/Validators/EmailValidator.cjs +55 -0
- package/lib/validation/Validators/EmailValidator.d.ts +28 -0
- package/lib/validation/Validators/ListValidator.cjs +72 -0
- package/lib/validation/Validators/ListValidator.d.ts +28 -0
- package/lib/validation/Validators/MaxLengthValidator.cjs +57 -0
- package/lib/validation/Validators/MaxLengthValidator.d.ts +29 -0
- package/lib/validation/Validators/MaxValidator.cjs +62 -0
- package/lib/validation/Validators/MaxValidator.d.ts +28 -0
- package/lib/validation/Validators/MinLengthValidator.cjs +57 -0
- package/lib/validation/Validators/MinLengthValidator.d.ts +29 -0
- package/lib/validation/Validators/MinValidator.cjs +62 -0
- package/lib/validation/Validators/MinValidator.d.ts +28 -0
- package/lib/validation/Validators/PasswordValidator.cjs +55 -0
- package/lib/validation/Validators/PasswordValidator.d.ts +28 -0
- package/lib/validation/Validators/PatternValidator.cjs +75 -0
- package/lib/validation/Validators/PatternValidator.d.ts +37 -0
- package/lib/validation/Validators/RequiredValidator.cjs +62 -0
- package/lib/validation/Validators/RequiredValidator.d.ts +28 -0
- package/lib/validation/Validators/StepValidator.cjs +57 -0
- package/lib/validation/Validators/StepValidator.d.ts +29 -0
- package/lib/validation/Validators/TypeValidator.cjs +65 -0
- package/lib/validation/Validators/TypeValidator.d.ts +25 -0
- package/lib/validation/Validators/URLValidator.cjs +54 -0
- package/lib/validation/Validators/URLValidator.d.ts +27 -0
- package/lib/validation/Validators/Validator.cjs +53 -0
- package/lib/validation/Validators/Validator.d.ts +41 -0
- package/lib/validation/Validators/ValidatorRegistry.cjs +87 -0
- package/lib/validation/Validators/ValidatorRegistry.d.ts +47 -0
- package/lib/validation/Validators/constants.cjs +139 -0
- package/lib/validation/Validators/constants.d.ts +96 -0
- package/lib/validation/Validators/decorators.cjs +30 -0
- package/lib/validation/Validators/decorators.d.ts +12 -0
- package/lib/validation/Validators/index.cjs +71 -0
- package/lib/validation/Validators/index.d.ts +52 -0
- package/lib/validation/Validators/types.d.ts +88 -0
- package/lib/validation/decorators.cjs +306 -0
- package/lib/validation/decorators.d.ts +178 -0
- package/lib/validation/index.cjs +22 -0
- package/lib/validation/index.d.ts +4 -0
- package/lib/validation/types.cjs +4 -0
- package/lib/validation/types.d.ts +46 -0
- package/package.json +18 -13
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import "reflect-metadata";
|
|
2
|
+
/**
|
|
3
|
+
* @summary Reverses the process from {@link formatDate}
|
|
4
|
+
*
|
|
5
|
+
* @param {string} date the date string to be converted back into date
|
|
6
|
+
* @param {string} format the date format
|
|
7
|
+
* @return {Date} the date from the format or the standard new Date({@prop date}) if the string couldn't be parsed (are you sure the format matches the string?)
|
|
8
|
+
*
|
|
9
|
+
* @function dateFromFormat
|
|
10
|
+
* @memberOf module:decorator-validation.Utils.Dates
|
|
11
|
+
* @category Format
|
|
12
|
+
*/
|
|
13
|
+
export declare function dateFromFormat(date: string, format: string): Date;
|
|
14
|
+
/**
|
|
15
|
+
* @summary Binds a date format to a string
|
|
16
|
+
* @param {Date} [date]
|
|
17
|
+
* @param {string} [format]
|
|
18
|
+
* @memberOf module:decorator-validation.Utils.Format
|
|
19
|
+
* @category Utilities
|
|
20
|
+
*/
|
|
21
|
+
export declare function bindDateToString(date: Date | undefined, format: string): Date | undefined;
|
|
22
|
+
/**
|
|
23
|
+
* @summary Helper function to be used instead of instanceOf Date
|
|
24
|
+
* @param date
|
|
25
|
+
* @memberOf module:decorator-validation.Utils.Dates
|
|
26
|
+
* @category Validation
|
|
27
|
+
*/
|
|
28
|
+
export declare function isValidDate(date: any): boolean;
|
|
29
|
+
/**
|
|
30
|
+
* @summary Util function to pad numbers
|
|
31
|
+
* @param {number} num
|
|
32
|
+
*
|
|
33
|
+
* @return {string}
|
|
34
|
+
*
|
|
35
|
+
* @function twoDigitPad
|
|
36
|
+
* @memberOf module:decorator-validation.Utils.Format
|
|
37
|
+
* @category Format
|
|
38
|
+
*/
|
|
39
|
+
export declare function twoDigitPad(num: number): string;
|
|
40
|
+
/**
|
|
41
|
+
* @summary Date Format Handling
|
|
42
|
+
* @description Code from {@link https://stackoverflow.com/questions/3552461/how-to-format-a-javascript-date}
|
|
43
|
+
*
|
|
44
|
+
* <pre>
|
|
45
|
+
* Using similar formatting as Moment.js, Class DateTimeFormatter (Java), and Class SimpleDateFormat (Java),
|
|
46
|
+
* I implemented a comprehensive solution formatDate(date, patternStr) where the code is easy to read and modify.
|
|
47
|
+
* You can display date, time, AM/PM, etc.
|
|
48
|
+
*
|
|
49
|
+
* Date and Time Patterns
|
|
50
|
+
* yy = 2-digit year; yyyy = full year
|
|
51
|
+
* M = digit month; MM = 2-digit month; MMM = short month name; MMMM = full month name
|
|
52
|
+
* EEEE = full weekday name; EEE = short weekday name
|
|
53
|
+
* d = digit day; dd = 2-digit day
|
|
54
|
+
* h = hours am/pm; hh = 2-digit hours am/pm; H = hours; HH = 2-digit hours
|
|
55
|
+
* m = minutes; mm = 2-digit minutes; aaa = AM/PM
|
|
56
|
+
* s = seconds; ss = 2-digit seconds
|
|
57
|
+
* S = miliseconds
|
|
58
|
+
* </pre>
|
|
59
|
+
*
|
|
60
|
+
* @param {Date} date
|
|
61
|
+
* @param {string} [patternStr] defaults to 'yyyy/MM/dd'
|
|
62
|
+
* @return {string} the formatted date
|
|
63
|
+
*
|
|
64
|
+
* @function formatDate
|
|
65
|
+
* @memberOf module:decorator-validation.Utils.Dates
|
|
66
|
+
* @category Format
|
|
67
|
+
*/
|
|
68
|
+
export declare function formatDate(date: Date, patternStr?: string): string;
|
|
69
|
+
/**
|
|
70
|
+
* @summary Parses a date from a specified format
|
|
71
|
+
* @param {string} format
|
|
72
|
+
* @param {string | Date | number} [v]
|
|
73
|
+
* @memberOf module:decorator-validation.Utils.Dates
|
|
74
|
+
* @category Format
|
|
75
|
+
*/
|
|
76
|
+
export declare function parseDate(format: string, v?: string | Date | number): Date | undefined;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.prop = prop;
|
|
4
|
+
exports.propMetadata = propMetadata;
|
|
5
|
+
const reflection_1 = require("@decaf-ts/reflection");
|
|
6
|
+
const constants_1 = require("./constants.cjs");
|
|
7
|
+
function prop(key = constants_1.ModelKeys.ATTRIBUTE) {
|
|
8
|
+
return (model, propertyKey) => {
|
|
9
|
+
let props;
|
|
10
|
+
if (Object.prototype.hasOwnProperty.call(model, key)) {
|
|
11
|
+
props = model[key];
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
props = model[key] = [];
|
|
15
|
+
}
|
|
16
|
+
if (!props.includes(propertyKey))
|
|
17
|
+
props.push(propertyKey);
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
function propMetadata(key, value) {
|
|
21
|
+
return (0, reflection_1.apply)(prop(), (0, reflection_1.metadata)(key, value));
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy91dGlscy9kZWNvcmF0b3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBR0Esb0JBV0M7QUFFRCxvQ0FFQztBQWxCRCxxREFBdUQ7QUFDdkQsMkNBQXdDO0FBRXhDLFNBQWdCLElBQUksQ0FBQyxNQUFjLHFCQUFTLENBQUMsU0FBUztJQUNwRCxPQUFPLENBQUMsS0FBYSxFQUFFLFdBQWlCLEVBQVEsRUFBRTtRQUNoRCxJQUFJLEtBQWUsQ0FBQztRQUNwQixJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNyRCxLQUFLLEdBQUksS0FBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzlCLENBQUM7YUFBTSxDQUFDO1lBQ04sS0FBSyxHQUFJLEtBQWEsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDbkMsQ0FBQztRQUNELElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFdBQXFCLENBQUM7WUFDeEMsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFxQixDQUFDLENBQUM7SUFDdEMsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQUVELFNBQWdCLFlBQVksQ0FBSSxHQUFXLEVBQUUsS0FBUTtJQUNuRCxPQUFPLElBQUEsa0JBQUssRUFBQyxJQUFJLEVBQUUsRUFBRSxJQUFBLHFCQUFRLEVBQUksR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDaEQsQ0FBQyIsImZpbGUiOiJ1dGlscy9kZWNvcmF0b3JzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYXBwbHksIG1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBNb2RlbEtleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHByb3Aoa2V5OiBzdHJpbmcgPSBNb2RlbEtleXMuQVRUUklCVVRFKSB7XG4gIHJldHVybiAobW9kZWw6IG9iamVjdCwgcHJvcGVydHlLZXk/OiBhbnkpOiB2b2lkID0+IHtcbiAgICBsZXQgcHJvcHM6IHN0cmluZ1tdO1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kZWwsIGtleSkpIHtcbiAgICAgIHByb3BzID0gKG1vZGVsIGFzIGFueSlba2V5XTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvcHMgPSAobW9kZWwgYXMgYW55KVtrZXldID0gW107XG4gICAgfVxuICAgIGlmICghcHJvcHMuaW5jbHVkZXMocHJvcGVydHlLZXkgYXMgc3RyaW5nKSlcbiAgICAgIHByb3BzLnB1c2gocHJvcGVydHlLZXkgYXMgc3RyaW5nKTtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByb3BNZXRhZGF0YTxWPihrZXk6IHN0cmluZywgdmFsdWU6IFYpIHtcbiAgcmV0dXJuIGFwcGx5KHByb3AoKSwgbWV0YWRhdGE8Vj4oa2V5LCB2YWx1ZSkpO1xufVxuIl19
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Hashing = exports.DefaultHashingMethod = void 0;
|
|
4
|
+
exports.hashCode = hashCode;
|
|
5
|
+
exports.hashSerialization = hashSerialization;
|
|
6
|
+
exports.hashObj = hashObj;
|
|
7
|
+
const serialization_1 = require("./serialization.cjs");
|
|
8
|
+
/**
|
|
9
|
+
* @summary Mimics Java's String's Hash implementation
|
|
10
|
+
*
|
|
11
|
+
* @param {string | number | symbol | Date} obj
|
|
12
|
+
* @return {number} hash value of obj
|
|
13
|
+
*
|
|
14
|
+
* @function hashCode
|
|
15
|
+
* @memberOf module:decorator-validation.Utils.Hashing
|
|
16
|
+
* @category Hashing
|
|
17
|
+
*/
|
|
18
|
+
function hashCode(obj) {
|
|
19
|
+
obj = String(obj);
|
|
20
|
+
let hash = 0;
|
|
21
|
+
for (let i = 0; i < obj.length; i++) {
|
|
22
|
+
const character = obj.charCodeAt(i);
|
|
23
|
+
hash = (hash << 5) - hash + character;
|
|
24
|
+
hash = hash & hash; // Convert to 32bit integer
|
|
25
|
+
}
|
|
26
|
+
return hash.toString();
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* @summary Hashes an object serializing it and then hashing the string
|
|
30
|
+
* @description The Serialization algorithm used by default (JSON.stringify)
|
|
31
|
+
* is not deterministic and should not be used for hashing
|
|
32
|
+
*
|
|
33
|
+
* @param {Record<string, any>} obj
|
|
34
|
+
* @return {string} the resulting hash
|
|
35
|
+
*
|
|
36
|
+
* @function hashSerialization
|
|
37
|
+
* @memberOf module:decorator-validation.Utils.Hashing
|
|
38
|
+
*
|
|
39
|
+
* @category Hashing
|
|
40
|
+
*/
|
|
41
|
+
function hashSerialization(obj) {
|
|
42
|
+
return hashCode(serialization_1.Serialization.serialize(obj));
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* @summary Hashes an object by combining the hash of all its properties
|
|
46
|
+
*
|
|
47
|
+
* @param {Record<string, any>} obj
|
|
48
|
+
* @return {string} the resulting hash
|
|
49
|
+
*
|
|
50
|
+
* @function hashObj
|
|
51
|
+
* @memberOf module:decorator-validation.Utils.Hashing
|
|
52
|
+
* @category Hashing
|
|
53
|
+
*/
|
|
54
|
+
function hashObj(obj) {
|
|
55
|
+
const hashReducer = function (h, el) {
|
|
56
|
+
const elHash = hashFunction(el);
|
|
57
|
+
if (typeof elHash === "string")
|
|
58
|
+
return hashFunction((h || "") + hashFunction(el));
|
|
59
|
+
h = h || 0;
|
|
60
|
+
h = (h << 5) - h + elHash;
|
|
61
|
+
return h & h;
|
|
62
|
+
};
|
|
63
|
+
const func = hashCode;
|
|
64
|
+
const hashFunction = function (value) {
|
|
65
|
+
if (typeof value === "undefined")
|
|
66
|
+
return "";
|
|
67
|
+
if (["string", "number", "symbol"].indexOf(typeof value) !== -1)
|
|
68
|
+
return func(value.toString());
|
|
69
|
+
if (value instanceof Date)
|
|
70
|
+
return func(value.getTime());
|
|
71
|
+
if (Array.isArray(value))
|
|
72
|
+
return value.reduce(hashReducer, undefined);
|
|
73
|
+
return Object.values(value).reduce(hashReducer, undefined);
|
|
74
|
+
};
|
|
75
|
+
const result = Object.values(obj).reduce(hashReducer, 0);
|
|
76
|
+
return (typeof result === "number" ? Math.abs(result) : result).toString();
|
|
77
|
+
}
|
|
78
|
+
exports.DefaultHashingMethod = "default";
|
|
79
|
+
class Hashing {
|
|
80
|
+
static { this.current = exports.DefaultHashingMethod; }
|
|
81
|
+
static { this.cache = {
|
|
82
|
+
default: hashObj,
|
|
83
|
+
}; }
|
|
84
|
+
constructor() { }
|
|
85
|
+
static get(key) {
|
|
86
|
+
if (key in this.cache)
|
|
87
|
+
return this.cache[key];
|
|
88
|
+
throw new Error(`No hashing method registered under ${key}`);
|
|
89
|
+
}
|
|
90
|
+
static register(key, func, setDefault = false) {
|
|
91
|
+
if (key in this.cache)
|
|
92
|
+
throw new Error(`Hashing method ${key} already registered`);
|
|
93
|
+
this.cache[key] = func;
|
|
94
|
+
if (setDefault)
|
|
95
|
+
this.current = key;
|
|
96
|
+
}
|
|
97
|
+
static hash(obj, method, ...args) {
|
|
98
|
+
if (!method)
|
|
99
|
+
return this.get(this.current)(obj, ...args);
|
|
100
|
+
return this.get(method)(obj, ...args);
|
|
101
|
+
}
|
|
102
|
+
static setDefault(method) {
|
|
103
|
+
this.current = this.get(method);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
exports.Hashing = Hashing;
|
|
107
|
+
|
|
108
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,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QU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2xDLENBQUM7O0FBaENILDBCQWlDQyIsImZpbGUiOiJ1dGlscy9oYXNoaW5nLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2VyaWFsaXphdGlvbiB9IGZyb20gXCIuL3NlcmlhbGl6YXRpb25cIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBNaW1pY3MgSmF2YSdzIFN0cmluZydzIEhhc2ggaW1wbGVtZW50YXRpb25cbiAqXG4gKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlciB8IHN5bWJvbCB8IERhdGV9IG9ialxuICogQHJldHVybiB7bnVtYmVyfSBoYXNoIHZhbHVlIG9mIG9ialxuICpcbiAqIEBmdW5jdGlvbiBoYXNoQ29kZVxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvbi5VdGlscy5IYXNoaW5nXG4gKiBAY2F0ZWdvcnkgSGFzaGluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzaENvZGUob2JqOiBzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2wgfCBEYXRlKTogc3RyaW5nIHtcbiAgb2JqID0gU3RyaW5nKG9iaik7XG4gIGxldCBoYXNoID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBvYmoubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBjaGFyYWN0ZXIgPSBvYmouY2hhckNvZGVBdChpKTtcbiAgICBoYXNoID0gKGhhc2ggPDwgNSkgLSBoYXNoICsgY2hhcmFjdGVyO1xuICAgIGhhc2ggPSBoYXNoICYgaGFzaDsgLy8gQ29udmVydCB0byAzMmJpdCBpbnRlZ2VyXG4gIH1cbiAgcmV0dXJuIGhhc2gudG9TdHJpbmcoKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBEZWZpbmVzIHRlaCB0eXBlIGZvciBhIEhhc2hpbmcgZnVuY3Rpb25cbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb24uVXRpbHMuSGFzaGluZ1xuICogQGNhdGVnb3J5IEhhc2hpbmdcbiAqL1xuZXhwb3J0IHR5cGUgSGFzaGluZ0Z1bmN0aW9uID0gKHZhbHVlOiBhbnksIC4uLmFyZ3M6IGFueVtdKSA9PiBzdHJpbmc7XG5cbi8qKlxuICogQHN1bW1hcnkgSGFzaGVzIGFuIG9iamVjdCBzZXJpYWxpemluZyBpdCBhbmQgdGhlbiBoYXNoaW5nIHRoZSBzdHJpbmdcbiAqIEBkZXNjcmlwdGlvbiBUaGUgU2VyaWFsaXphdGlvbiBhbGdvcml0aG0gdXNlZCBieSBkZWZhdWx0IChKU09OLnN0cmluZ2lmeSlcbiAqIGlzIG5vdCBkZXRlcm1pbmlzdGljIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgZm9yIGhhc2hpbmdcbiAqXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG9ialxuICogQHJldHVybiB7c3RyaW5nfSB0aGUgcmVzdWx0aW5nIGhhc2hcbiAqXG4gKiBAZnVuY3Rpb24gaGFzaFNlcmlhbGl6YXRpb25cbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb24uVXRpbHMuSGFzaGluZ1xuICpcbiAqIEBjYXRlZ29yeSBIYXNoaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNoU2VyaWFsaXphdGlvbihvYmo6IFJlY29yZDxzdHJpbmcsIGFueT4gfCBhbnlbXSkge1xuICByZXR1cm4gaGFzaENvZGUoU2VyaWFsaXphdGlvbi5zZXJpYWxpemUob2JqKSk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgSGFzaGVzIGFuIG9iamVjdCBieSBjb21iaW5pbmcgdGhlIGhhc2ggb2YgYWxsIGl0cyBwcm9wZXJ0aWVzXG4gKlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBvYmpcbiAqIEByZXR1cm4ge3N0cmluZ30gdGhlIHJlc3VsdGluZyBoYXNoXG4gKlxuICogQGZ1bmN0aW9uIGhhc2hPYmpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb24uVXRpbHMuSGFzaGluZ1xuICogQGNhdGVnb3J5IEhhc2hpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc2hPYmoob2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgYW55W10pOiBzdHJpbmcge1xuICBjb25zdCBoYXNoUmVkdWNlciA9IGZ1bmN0aW9uIChoOiBudW1iZXIgfCBzdHJpbmcsIGVsOiBhbnkpOiBzdHJpbmcgfCBudW1iZXIge1xuICAgIGNvbnN0IGVsSGFzaCA9IGhhc2hGdW5jdGlvbihlbCk7XG5cbiAgICBpZiAodHlwZW9mIGVsSGFzaCA9PT0gXCJzdHJpbmdcIilcbiAgICAgIHJldHVybiBoYXNoRnVuY3Rpb24oKChoIGFzIHN0cmluZykgfHwgXCJcIikgKyBoYXNoRnVuY3Rpb24oZWwpKTtcblxuICAgIGggPSBoIHx8IDA7XG4gICAgaCA9ICgoaCBhcyBudW1iZXIpIDw8IDUpIC0gKGggYXMgbnVtYmVyKSArIGVsSGFzaDtcbiAgICByZXR1cm4gaCAmIGg7XG4gIH07XG5cbiAgY29uc3QgZnVuYzogSGFzaGluZ0Z1bmN0aW9uID0gaGFzaENvZGU7XG5cbiAgY29uc3QgaGFzaEZ1bmN0aW9uID0gZnVuY3Rpb24gKHZhbHVlOiBhbnkpOiBzdHJpbmcgfCBudW1iZXIge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybiBcIlwiO1xuICAgIGlmIChbXCJzdHJpbmdcIiwgXCJudW1iZXJcIiwgXCJzeW1ib2xcIl0uaW5kZXhPZih0eXBlb2YgdmFsdWUpICE9PSAtMSlcbiAgICAgIHJldHVybiBmdW5jKHZhbHVlLnRvU3RyaW5nKCkpO1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHJldHVybiBmdW5jKHZhbHVlLmdldFRpbWUoKSk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gdmFsdWUucmVkdWNlKGhhc2hSZWR1Y2VyLCB1bmRlZmluZWQpO1xuICAgIHJldHVybiAoT2JqZWN0LnZhbHVlcyh2YWx1ZSkgYXMgKHN0cmluZyB8IG51bWJlcilbXSkucmVkdWNlKFxuICAgICAgaGFzaFJlZHVjZXIsXG4gICAgICB1bmRlZmluZWQgYXMgdW5rbm93biBhcyBzdHJpbmcgfCBudW1iZXIsXG4gICAgKTtcbiAgfTtcblxuICBjb25zdCByZXN1bHQgPSBPYmplY3QudmFsdWVzKG9iaikucmVkdWNlKGhhc2hSZWR1Y2VyLCAwKTtcblxuICByZXR1cm4gKHR5cGVvZiByZXN1bHQgPT09IFwibnVtYmVyXCIgPyBNYXRoLmFicyhyZXN1bHQpIDogcmVzdWx0KS50b1N0cmluZygpO1xufVxuXG5leHBvcnQgY29uc3QgRGVmYXVsdEhhc2hpbmdNZXRob2QgPSBcImRlZmF1bHRcIjtcblxuZXhwb3J0IGNsYXNzIEhhc2hpbmcge1xuICBwcml2YXRlIHN0YXRpYyBjdXJyZW50OiBzdHJpbmcgPSBEZWZhdWx0SGFzaGluZ01ldGhvZDtcblxuICBwcml2YXRlIHN0YXRpYyBjYWNoZTogUmVjb3JkPHN0cmluZywgSGFzaGluZ0Z1bmN0aW9uPiA9IHtcbiAgICBkZWZhdWx0OiBoYXNoT2JqLFxuICB9O1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxuXG4gIHByaXZhdGUgc3RhdGljIGdldChrZXk6IHN0cmluZyk6IGFueSB7XG4gICAgaWYgKGtleSBpbiB0aGlzLmNhY2hlKSByZXR1cm4gdGhpcy5jYWNoZVtrZXldO1xuICAgIHRocm93IG5ldyBFcnJvcihgTm8gaGFzaGluZyBtZXRob2QgcmVnaXN0ZXJlZCB1bmRlciAke2tleX1gKTtcbiAgfVxuXG4gIHN0YXRpYyByZWdpc3RlcihcbiAgICBrZXk6IHN0cmluZyxcbiAgICBmdW5jOiBIYXNoaW5nRnVuY3Rpb24sXG4gICAgc2V0RGVmYXVsdCA9IGZhbHNlLFxuICApOiB2b2lkIHtcbiAgICBpZiAoa2V5IGluIHRoaXMuY2FjaGUpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEhhc2hpbmcgbWV0aG9kICR7a2V5fSBhbHJlYWR5IHJlZ2lzdGVyZWRgKTtcbiAgICB0aGlzLmNhY2hlW2tleV0gPSBmdW5jO1xuICAgIGlmIChzZXREZWZhdWx0KSB0aGlzLmN1cnJlbnQgPSBrZXk7XG4gIH1cblxuICBzdGF0aWMgaGFzaChvYmo6IGFueSwgbWV0aG9kPzogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgIGlmICghbWV0aG9kKSByZXR1cm4gdGhpcy5nZXQodGhpcy5jdXJyZW50KShvYmosIC4uLmFyZ3MpO1xuICAgIHJldHVybiB0aGlzLmdldChtZXRob2QpKG9iaiwgLi4uYXJncyk7XG4gIH1cblxuICBzdGF0aWMgc2V0RGVmYXVsdChtZXRob2Q6IHN0cmluZykge1xuICAgIHRoaXMuY3VycmVudCA9IHRoaXMuZ2V0KG1ldGhvZCk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @summary Mimics Java's String's Hash implementation
|
|
3
|
+
*
|
|
4
|
+
* @param {string | number | symbol | Date} obj
|
|
5
|
+
* @return {number} hash value of obj
|
|
6
|
+
*
|
|
7
|
+
* @function hashCode
|
|
8
|
+
* @memberOf module:decorator-validation.Utils.Hashing
|
|
9
|
+
* @category Hashing
|
|
10
|
+
*/
|
|
11
|
+
export declare function hashCode(obj: string | number | symbol | Date): string;
|
|
12
|
+
/**
|
|
13
|
+
* @summary Defines teh type for a Hashing function
|
|
14
|
+
* @memberOf module:decorator-validation.Utils.Hashing
|
|
15
|
+
* @category Hashing
|
|
16
|
+
*/
|
|
17
|
+
export type HashingFunction = (value: any, ...args: any[]) => string;
|
|
18
|
+
/**
|
|
19
|
+
* @summary Hashes an object serializing it and then hashing the string
|
|
20
|
+
* @description The Serialization algorithm used by default (JSON.stringify)
|
|
21
|
+
* is not deterministic and should not be used for hashing
|
|
22
|
+
*
|
|
23
|
+
* @param {Record<string, any>} obj
|
|
24
|
+
* @return {string} the resulting hash
|
|
25
|
+
*
|
|
26
|
+
* @function hashSerialization
|
|
27
|
+
* @memberOf module:decorator-validation.Utils.Hashing
|
|
28
|
+
*
|
|
29
|
+
* @category Hashing
|
|
30
|
+
*/
|
|
31
|
+
export declare function hashSerialization(obj: Record<string, any> | any[]): string;
|
|
32
|
+
/**
|
|
33
|
+
* @summary Hashes an object by combining the hash of all its properties
|
|
34
|
+
*
|
|
35
|
+
* @param {Record<string, any>} obj
|
|
36
|
+
* @return {string} the resulting hash
|
|
37
|
+
*
|
|
38
|
+
* @function hashObj
|
|
39
|
+
* @memberOf module:decorator-validation.Utils.Hashing
|
|
40
|
+
* @category Hashing
|
|
41
|
+
*/
|
|
42
|
+
export declare function hashObj(obj: Record<string, any> | any[]): string;
|
|
43
|
+
export declare const DefaultHashingMethod = "default";
|
|
44
|
+
export declare class Hashing {
|
|
45
|
+
private static current;
|
|
46
|
+
private static cache;
|
|
47
|
+
private constructor();
|
|
48
|
+
private static get;
|
|
49
|
+
static register(key: string, func: HashingFunction, setDefault?: boolean): void;
|
|
50
|
+
static hash(obj: any, method?: string, ...args: any[]): any;
|
|
51
|
+
static setDefault(method: string): void;
|
|
52
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./constants.cjs"), exports);
|
|
18
|
+
__exportStar(require("./dates.cjs"), exports);
|
|
19
|
+
__exportStar(require("./decorators.cjs"), exports);
|
|
20
|
+
__exportStar(require("./hashing.cjs"), exports);
|
|
21
|
+
__exportStar(require("./registry.cjs"), exports);
|
|
22
|
+
__exportStar(require("./serialization.cjs"), exports);
|
|
23
|
+
__exportStar(require("./strings.cjs"), exports);
|
|
24
|
+
|
|
25
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy91dGlscy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsOENBQTRCO0FBQzVCLDBDQUF3QjtBQUN4QiwrQ0FBNkI7QUFDN0IsNENBQTBCO0FBQzFCLDZDQUEyQjtBQUMzQixrREFBZ0M7QUFDaEMsNENBQTBCIiwiZmlsZSI6InV0aWxzL2luZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kYXRlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vaGFzaGluZ1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vcmVnaXN0cnlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3NlcmlhbGl6YXRpb25cIjtcbmV4cG9ydCAqIGZyb20gXCIuL3N0cmluZ3NcIjtcbiJdfQ==
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
|
|
4
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy91dGlscy9yZWdpc3RyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwiZmlsZSI6InV0aWxzL3JlZ2lzdHJ5LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiLi4vbW9kZWwvdHlwZXNcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBCYXNpYyBpbnRlcmZhY2UgZm9yIFJlZ2lzdHJpZXNcbiAqXG4gKiBAaW50ZXJmYWNlIElSZWdpc3RyeVxuICpcbiAqIEBjYXRlZ29yeSBVdGlsaXRpZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJUmVnaXN0cnk8VD4ge1xuICAvKipcbiAgICogQHN1bW1hcnkgUmVnaXN0ZXJzIGFuIE9iamVjdFxuICAgKlxuICAgKiBAcGFyYW0ge1R9IG9ialxuICAgKiBAcGFyYW0ge2FueVtdfSBhcmdzXG4gICAqXG4gICAqIEBtZXRob2RcbiAgICovXG4gIHJlZ2lzdGVyKG9iajogVCB8IGFueSwgLi4uYXJnczogYW55W10pOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYW4gT2JqZWN0IGlmIGl0IGNhbiBmaW5kIGl0XG4gICAqXG4gICAqIEBwYXJhbSB7YW55fSBrZXlcbiAgICogQHBhcmFtIHthbnlbXX0gYXJnc1xuICAgKiBAcmV0dXJuIHtUIHwgdW5kZWZpbmVkfVxuICAgKlxuICAgKiBAbWV0aG9kXG4gICAqL1xuICBnZXQoa2V5OiBhbnksIC4uLmFyZ3M6IGFueVtdKTogVCB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBCYXNpYyBCdWlsZGVyIFJlZ2lzdHJ5IEludGVyZmFjZVxuICpcbiAqIEB0eXBlZGVmIFRcbiAqIEBpbnRlcmZhY2UgQnVpbGRlclJlZ2lzdHJ5PFQ+XG4gKlxuICogQGNhdGVnb3J5IENvbnN0cnVjdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkZXJSZWdpc3RyeTxUPiBleHRlbmRzIElSZWdpc3RyeTxDb25zdHJ1Y3RvcjxUPj4ge1xuICAvKipcbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIGFuIEJ1aWxkZXIgT2JqZWN0IGJ5IG5hbWUgaWYgaXQgY2FuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3NcbiAgICpcbiAgICogQG1ldGhvZFxuICAgKi9cbiAgZ2V0KG5hbWU6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBDb25zdHJ1Y3RvcjxUPiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQHN1bW1hcnkgUmVnaXN0ZXJzIGEgY29uc3RydWN0b3IgYnkgbmFtZVxuICAgKlxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPFQ+fSBbY29uc3RydWN0b3JdXG4gICAqIEBwYXJhbSB7bmFtZX0gbmFtZVxuICAgKiBAcGFyYW0ge2FueVtdfSBhcmdzXG4gICAqXG4gICAqIEBtZXRob2RcbiAgICovXG4gIHJlZ2lzdGVyKGNvbnN0cnVjdG9yOiBDb25zdHJ1Y3RvcjxUPiwgbmFtZT86IHN0cmluZywgLi4uYXJnczogYW55W10pOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBCdWlsZHMgYW4gT2JqZWN0IGJ5IG5hbWVcbiAgICpcbiAgICogQHBhcmFtIHt7fX0gb2JqXG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3NcbiAgICogQHJldHVybiBUXG4gICAqXG4gICAqIEBtZXRob2RcbiAgICovXG4gIGJ1aWxkKG9iajogUmVjb3JkPHN0cmluZywgYW55PiB8IFQsIC4uLmFyZ3M6IGFueVtdKTogVDtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { Constructor } from "../model/types";
|
|
2
|
+
/**
|
|
3
|
+
* @summary Basic interface for Registries
|
|
4
|
+
*
|
|
5
|
+
* @interface IRegistry
|
|
6
|
+
*
|
|
7
|
+
* @category Utilities
|
|
8
|
+
*/
|
|
9
|
+
export interface IRegistry<T> {
|
|
10
|
+
/**
|
|
11
|
+
* @summary Registers an Object
|
|
12
|
+
*
|
|
13
|
+
* @param {T} obj
|
|
14
|
+
* @param {any[]} args
|
|
15
|
+
*
|
|
16
|
+
* @method
|
|
17
|
+
*/
|
|
18
|
+
register(obj: T | any, ...args: any[]): void;
|
|
19
|
+
/**
|
|
20
|
+
* @summary Retrieves an Object if it can find it
|
|
21
|
+
*
|
|
22
|
+
* @param {any} key
|
|
23
|
+
* @param {any[]} args
|
|
24
|
+
* @return {T | undefined}
|
|
25
|
+
*
|
|
26
|
+
* @method
|
|
27
|
+
*/
|
|
28
|
+
get(key: any, ...args: any[]): T | undefined;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* @summary Basic Builder Registry Interface
|
|
32
|
+
*
|
|
33
|
+
* @typedef T
|
|
34
|
+
* @interface BuilderRegistry<T>
|
|
35
|
+
*
|
|
36
|
+
* @category Construction
|
|
37
|
+
*/
|
|
38
|
+
export interface BuilderRegistry<T> extends IRegistry<Constructor<T>> {
|
|
39
|
+
/**
|
|
40
|
+
* @summary Retrieves an Builder Object by name if it can
|
|
41
|
+
*
|
|
42
|
+
* @param {string} name
|
|
43
|
+
* @param {any[]} args
|
|
44
|
+
*
|
|
45
|
+
* @method
|
|
46
|
+
*/
|
|
47
|
+
get(name: string, ...args: any[]): Constructor<T> | undefined;
|
|
48
|
+
/**
|
|
49
|
+
* @summary Registers a constructor by name
|
|
50
|
+
*
|
|
51
|
+
* @param {Constructor<T>} [constructor]
|
|
52
|
+
* @param {name} name
|
|
53
|
+
* @param {any[]} args
|
|
54
|
+
*
|
|
55
|
+
* @method
|
|
56
|
+
*/
|
|
57
|
+
register(constructor: Constructor<T>, name?: string, ...args: any[]): void;
|
|
58
|
+
/**
|
|
59
|
+
* @summary Builds an Object by name
|
|
60
|
+
*
|
|
61
|
+
* @param {{}} obj
|
|
62
|
+
* @param {any[]} args
|
|
63
|
+
* @return T
|
|
64
|
+
*
|
|
65
|
+
* @method
|
|
66
|
+
*/
|
|
67
|
+
build(obj: Record<string, any> | T, ...args: any[]): T;
|
|
68
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Serialization = exports.DefaultSerializationMethod = exports.JSONSerializer = void 0;
|
|
4
|
+
const Model_1 = require("../model/Model.cjs");
|
|
5
|
+
const constants_1 = require("./constants.cjs");
|
|
6
|
+
/**
|
|
7
|
+
* @summary Concrete implementation of a {@link Serializer} in JSON format
|
|
8
|
+
* @description JS's native JSON.stringify (used here) is not deterministic
|
|
9
|
+
* and therefore should not be used for hashing purposes
|
|
10
|
+
*
|
|
11
|
+
* To keep dependencies low, we will not implement this, but we recommend
|
|
12
|
+
* implementing a similar {@link JSONSerializer} using 'deterministic-json' libraries
|
|
13
|
+
*
|
|
14
|
+
* @class JSONSerializer
|
|
15
|
+
* @implements Serializer
|
|
16
|
+
*
|
|
17
|
+
* @category Serialization
|
|
18
|
+
*/
|
|
19
|
+
class JSONSerializer {
|
|
20
|
+
/**
|
|
21
|
+
* @summary prepares the model for serialization
|
|
22
|
+
* @description returns a shallow copy of the object, containing an enumerable {@link ModelKeys#ANCHOR} property
|
|
23
|
+
* so the object can be recognized upon deserialization
|
|
24
|
+
*
|
|
25
|
+
* @param {T} model
|
|
26
|
+
* @protected
|
|
27
|
+
*/
|
|
28
|
+
preSerialize(model) {
|
|
29
|
+
// TODO: nested preserialization (so increase performance when deserializing)
|
|
30
|
+
const toSerialize = Object.assign({}, model);
|
|
31
|
+
const metadata = Model_1.Model.getMetadata(model);
|
|
32
|
+
toSerialize[constants_1.ModelKeys.ANCHOR] = metadata || model.constructor.name;
|
|
33
|
+
return toSerialize;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* @summary Rebuilds a model from a serialization
|
|
37
|
+
* @param {string} str
|
|
38
|
+
*
|
|
39
|
+
* @throws {Error} If it fails to parse the string, or to build the model
|
|
40
|
+
*/
|
|
41
|
+
deserialize(str) {
|
|
42
|
+
const deserialization = JSON.parse(str);
|
|
43
|
+
const className = deserialization[constants_1.ModelKeys.ANCHOR];
|
|
44
|
+
if (!className)
|
|
45
|
+
throw new Error("Could not find class reference in serialized model");
|
|
46
|
+
const model = Model_1.Model.build(deserialization, className);
|
|
47
|
+
return model;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* @summary Serializes a model
|
|
51
|
+
* @param {T} model
|
|
52
|
+
*
|
|
53
|
+
* @throws {Error} if fails to serialize
|
|
54
|
+
*/
|
|
55
|
+
serialize(model) {
|
|
56
|
+
return JSON.stringify(this.preSerialize(model));
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
exports.JSONSerializer = JSONSerializer;
|
|
60
|
+
exports.DefaultSerializationMethod = "json";
|
|
61
|
+
class Serialization {
|
|
62
|
+
static { this.current = exports.DefaultSerializationMethod; }
|
|
63
|
+
static { this.cache = {
|
|
64
|
+
json: new JSONSerializer(),
|
|
65
|
+
}; }
|
|
66
|
+
constructor() { }
|
|
67
|
+
static get(key) {
|
|
68
|
+
if (key in this.cache)
|
|
69
|
+
return this.cache[key];
|
|
70
|
+
throw new Error(`No serialization method registered under ${key}`);
|
|
71
|
+
}
|
|
72
|
+
static register(key, func, setDefault = false) {
|
|
73
|
+
if (key in this.cache)
|
|
74
|
+
throw new Error(`Serialization method ${key} already registered`);
|
|
75
|
+
this.cache[key] = new func();
|
|
76
|
+
if (setDefault)
|
|
77
|
+
this.current = key;
|
|
78
|
+
}
|
|
79
|
+
static serialize(obj, method, ...args) {
|
|
80
|
+
if (!method)
|
|
81
|
+
return this.get(this.current).serialize(obj, ...args);
|
|
82
|
+
return this.get(method).serialize(obj, ...args);
|
|
83
|
+
}
|
|
84
|
+
static deserialize(obj, method, ...args) {
|
|
85
|
+
if (!method)
|
|
86
|
+
return this.get(this.current).deserialize(obj, ...args);
|
|
87
|
+
return this.get(method).deserialize(obj, ...args);
|
|
88
|
+
}
|
|
89
|
+
static setDefault(method) {
|
|
90
|
+
this.current = this.get(method);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
exports.Serialization = Serialization;
|
|
94
|
+
|
|
95
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy91dGlscy9zZXJpYWxpemF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDBDQUF1QztBQUN2QywyQ0FBd0M7QUFpQ3hDOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILE1BQWEsY0FBYztJQUN6Qjs7Ozs7OztPQU9HO0lBQ08sWUFBWSxDQUFDLEtBQVE7UUFDN0IsNkVBQTZFO1FBQzdFLE1BQU0sV0FBVyxHQUF3QixNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNsRSxNQUFNLFFBQVEsR0FBRyxhQUFLLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFDLFdBQVcsQ0FBQyxxQkFBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLFFBQVEsSUFBSSxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQztRQUNuRSxPQUFPLFdBQVcsQ0FBQztJQUNyQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxXQUFXLENBQUMsR0FBVztRQUNyQixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sU0FBUyxHQUFHLGVBQWUsQ0FBQyxxQkFBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxTQUFTO1lBQ1osTUFBTSxJQUFJLEtBQUssQ0FBQyxvREFBb0QsQ0FBQyxDQUFDO1FBQ3hFLE1BQU0sS0FBSyxHQUFNLGFBQUssQ0FBQyxLQUFLLENBQUMsZUFBZSxFQUFFLFNBQVMsQ0FBaUIsQ0FBQztRQUN6RSxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILFNBQVMsQ0FBQyxLQUFRO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDbEQsQ0FBQztDQUNGO0FBekNELHdDQXlDQztBQUVZLFFBQUEsMEJBQTBCLEdBQUcsTUFBTSxDQUFDO0FBRWpELE1BQWEsYUFBYTthQUNULFlBQU8sR0FBVyxrQ0FBMEIsQ0FBQzthQUU3QyxVQUFLLEdBQW9DO1FBQ3RELElBQUksRUFBRSxJQUFJLGNBQWMsRUFBRTtLQUMzQixDQUFDO0lBRUYsZ0JBQXVCLENBQUM7SUFFaEIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFXO1FBQzVCLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzlDLE1BQU0sSUFBSSxLQUFLLENBQUMsNENBQTRDLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVELE1BQU0sQ0FBQyxRQUFRLENBQ2IsR0FBVyxFQUNYLElBQWtDLEVBQ2xDLFVBQVUsR0FBRyxLQUFLO1FBRWxCLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLO1lBQ25CLE1BQU0sSUFBSSxLQUFLLENBQUMsd0JBQXdCLEdBQUcscUJBQXFCLENBQUMsQ0FBQztRQUNwRSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDN0IsSUFBSSxVQUFVO1lBQUUsSUFBSSxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUM7SUFDckMsQ0FBQztJQUVELE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBUSxFQUFFLE1BQWUsRUFBRSxHQUFHLElBQVc7UUFDeEQsSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUNuRSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRCxNQUFNLENBQUMsV0FBVyxDQUFDLEdBQVcsRUFBRSxNQUFlLEVBQUUsR0FBRyxJQUFXO1FBQzdELElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDckUsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQsTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFjO1FBQzlCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNsQyxDQUFDOztBQXJDSCxzQ0FzQ0MiLCJmaWxlIjoidXRpbHMvc2VyaWFsaXphdGlvbi5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIi4uL21vZGVsL01vZGVsXCI7XG5pbXBvcnQgeyBNb2RlbEtleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yIH0gZnJvbSBcIi4uL21vZGVsL3R5cGVzXCI7XG5cbi8qKlxuICogQHN1bW1hcnkgSGVscGVyIGluIHNlcmlhbGl6YXRpb25cbiAqXG4gKiBAaW50ZXJmYWNlIFNlcmlhbGl6ZXJcbiAqIEBjYXRlZ29yeSBTZXJpYWxpemF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VyaWFsaXplcjxUIGV4dGVuZHMgTW9kZWw+IHtcbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFNlcmlhbGl6ZXMgYSBtb2RlbFxuICAgKiBAcGFyYW0ge1R9IG1vZGVsXG4gICAqXG4gICAqIEBwYXJhbSBhcmdzXG4gICAqIEBtZXRob2RcbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9XG4gICAqL1xuICBzZXJpYWxpemUobW9kZWw6IFQsIC4uLmFyZ3M6IGFueVtdKTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBSZWJ1aWxkcyBhIG1vZGVsIGZyb20gc2VyaWFsaXphdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqXG4gICAqIEBwYXJhbSBhcmdzXG4gICAqIEBtZXRob2RcbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9XG4gICAqL1xuICBkZXNlcmlhbGl6ZShzdHI6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBUO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IENvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIGEge0BsaW5rIFNlcmlhbGl6ZXJ9IGluIEpTT04gZm9ybWF0XG4gKiBAZGVzY3JpcHRpb24gSlMncyBuYXRpdmUgSlNPTi5zdHJpbmdpZnkgKHVzZWQgaGVyZSkgaXMgbm90IGRldGVybWluaXN0aWNcbiAqIGFuZCB0aGVyZWZvcmUgc2hvdWxkIG5vdCBiZSB1c2VkIGZvciBoYXNoaW5nIHB1cnBvc2VzXG4gKlxuICogVG8ga2VlcCBkZXBlbmRlbmNpZXMgbG93LCB3ZSB3aWxsIG5vdCBpbXBsZW1lbnQgdGhpcywgYnV0IHdlIHJlY29tbWVuZFxuICogaW1wbGVtZW50aW5nIGEgc2ltaWxhciB7QGxpbmsgSlNPTlNlcmlhbGl6ZXJ9IHVzaW5nICdkZXRlcm1pbmlzdGljLWpzb24nIGxpYnJhcmllc1xuICpcbiAqIEBjbGFzcyBKU09OU2VyaWFsaXplclxuICogQGltcGxlbWVudHMgU2VyaWFsaXplclxuICpcbiAqIEBjYXRlZ29yeSBTZXJpYWxpemF0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBKU09OU2VyaWFsaXplcjxUIGV4dGVuZHMgTW9kZWw+IGltcGxlbWVudHMgU2VyaWFsaXplcjxUPiB7XG4gIC8qKlxuICAgKiBAc3VtbWFyeSBwcmVwYXJlcyB0aGUgbW9kZWwgZm9yIHNlcmlhbGl6YXRpb25cbiAgICogQGRlc2NyaXB0aW9uIHJldHVybnMgYSBzaGFsbG93IGNvcHkgb2YgdGhlIG9iamVjdCwgY29udGFpbmluZyBhbiBlbnVtZXJhYmxlIHtAbGluayBNb2RlbEtleXMjQU5DSE9SfSBwcm9wZXJ0eVxuICAgKiBzbyB0aGUgb2JqZWN0IGNhbiBiZSByZWNvZ25pemVkIHVwb24gZGVzZXJpYWxpemF0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7VH0gbW9kZWxcbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIHByZVNlcmlhbGl6ZShtb2RlbDogVCkge1xuICAgIC8vIFRPRE86IG5lc3RlZCBwcmVzZXJpYWxpemF0aW9uIChzbyBpbmNyZWFzZSBwZXJmb3JtYW5jZSB3aGVuIGRlc2VyaWFsaXppbmcpXG4gICAgY29uc3QgdG9TZXJpYWxpemU6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBPYmplY3QuYXNzaWduKHt9LCBtb2RlbCk7XG4gICAgY29uc3QgbWV0YWRhdGEgPSBNb2RlbC5nZXRNZXRhZGF0YShtb2RlbCk7XG4gICAgdG9TZXJpYWxpemVbTW9kZWxLZXlzLkFOQ0hPUl0gPSBtZXRhZGF0YSB8fCBtb2RlbC5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgIHJldHVybiB0b1NlcmlhbGl6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBSZWJ1aWxkcyBhIG1vZGVsIGZyb20gYSBzZXJpYWxpemF0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IElmIGl0IGZhaWxzIHRvIHBhcnNlIHRoZSBzdHJpbmcsIG9yIHRvIGJ1aWxkIHRoZSBtb2RlbFxuICAgKi9cbiAgZGVzZXJpYWxpemUoc3RyOiBzdHJpbmcpOiBUIHtcbiAgICBjb25zdCBkZXNlcmlhbGl6YXRpb24gPSBKU09OLnBhcnNlKHN0cik7XG4gICAgY29uc3QgY2xhc3NOYW1lID0gZGVzZXJpYWxpemF0aW9uW01vZGVsS2V5cy5BTkNIT1JdO1xuICAgIGlmICghY2xhc3NOYW1lKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGQgbm90IGZpbmQgY2xhc3MgcmVmZXJlbmNlIGluIHNlcmlhbGl6ZWQgbW9kZWxcIik7XG4gICAgY29uc3QgbW9kZWw6IFQgPSBNb2RlbC5idWlsZChkZXNlcmlhbGl6YXRpb24sIGNsYXNzTmFtZSkgYXMgdW5rbm93biBhcyBUO1xuICAgIHJldHVybiBtb2RlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBTZXJpYWxpemVzIGEgbW9kZWxcbiAgICogQHBhcmFtIHtUfSBtb2RlbFxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gaWYgZmFpbHMgdG8gc2VyaWFsaXplXG4gICAqL1xuICBzZXJpYWxpemUobW9kZWw6IFQpOiBzdHJpbmcge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLnByZVNlcmlhbGl6ZShtb2RlbCkpO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBEZWZhdWx0U2VyaWFsaXphdGlvbk1ldGhvZCA9IFwianNvblwiO1xuXG5leHBvcnQgY2xhc3MgU2VyaWFsaXphdGlvbiB7XG4gIHByaXZhdGUgc3RhdGljIGN1cnJlbnQ6IHN0cmluZyA9IERlZmF1bHRTZXJpYWxpemF0aW9uTWV0aG9kO1xuXG4gIHByaXZhdGUgc3RhdGljIGNhY2hlOiBSZWNvcmQ8c3RyaW5nLCBTZXJpYWxpemVyPGFueT4+ID0ge1xuICAgIGpzb246IG5ldyBKU09OU2VyaWFsaXplcigpLFxuICB9O1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxuXG4gIHByaXZhdGUgc3RhdGljIGdldChrZXk6IHN0cmluZyk6IGFueSB7XG4gICAgaWYgKGtleSBpbiB0aGlzLmNhY2hlKSByZXR1cm4gdGhpcy5jYWNoZVtrZXldO1xuICAgIHRocm93IG5ldyBFcnJvcihgTm8gc2VyaWFsaXphdGlvbiBtZXRob2QgcmVnaXN0ZXJlZCB1bmRlciAke2tleX1gKTtcbiAgfVxuXG4gIHN0YXRpYyByZWdpc3RlcihcbiAgICBrZXk6IHN0cmluZyxcbiAgICBmdW5jOiBDb25zdHJ1Y3RvcjxTZXJpYWxpemVyPGFueT4+LFxuICAgIHNldERlZmF1bHQgPSBmYWxzZSxcbiAgKTogdm9pZCB7XG4gICAgaWYgKGtleSBpbiB0aGlzLmNhY2hlKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTZXJpYWxpemF0aW9uIG1ldGhvZCAke2tleX0gYWxyZWFkeSByZWdpc3RlcmVkYCk7XG4gICAgdGhpcy5jYWNoZVtrZXldID0gbmV3IGZ1bmMoKTtcbiAgICBpZiAoc2V0RGVmYXVsdCkgdGhpcy5jdXJyZW50ID0ga2V5O1xuICB9XG5cbiAgc3RhdGljIHNlcmlhbGl6ZShvYmo6IGFueSwgbWV0aG9kPzogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgIGlmICghbWV0aG9kKSByZXR1cm4gdGhpcy5nZXQodGhpcy5jdXJyZW50KS5zZXJpYWxpemUob2JqLCAuLi5hcmdzKTtcbiAgICByZXR1cm4gdGhpcy5nZXQobWV0aG9kKS5zZXJpYWxpemUob2JqLCAuLi5hcmdzKTtcbiAgfVxuXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZShvYmo6IHN0cmluZywgbWV0aG9kPzogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgIGlmICghbWV0aG9kKSByZXR1cm4gdGhpcy5nZXQodGhpcy5jdXJyZW50KS5kZXNlcmlhbGl6ZShvYmosIC4uLmFyZ3MpO1xuICAgIHJldHVybiB0aGlzLmdldChtZXRob2QpLmRlc2VyaWFsaXplKG9iaiwgLi4uYXJncyk7XG4gIH1cblxuICBzdGF0aWMgc2V0RGVmYXVsdChtZXRob2Q6IHN0cmluZykge1xuICAgIHRoaXMuY3VycmVudCA9IHRoaXMuZ2V0KG1ldGhvZCk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { Model } from "../model/Model";
|
|
2
|
+
import { Constructor } from "../model/types";
|
|
3
|
+
/**
|
|
4
|
+
* @summary Helper in serialization
|
|
5
|
+
*
|
|
6
|
+
* @interface Serializer
|
|
7
|
+
* @category Serialization
|
|
8
|
+
*/
|
|
9
|
+
export interface Serializer<T extends Model> {
|
|
10
|
+
/**
|
|
11
|
+
* @summary Serializes a model
|
|
12
|
+
* @param {T} model
|
|
13
|
+
*
|
|
14
|
+
* @param args
|
|
15
|
+
* @method
|
|
16
|
+
*
|
|
17
|
+
* @throws {Error}
|
|
18
|
+
*/
|
|
19
|
+
serialize(model: T, ...args: any[]): string;
|
|
20
|
+
/**
|
|
21
|
+
* @summary Rebuilds a model from serialization
|
|
22
|
+
* @param {string} str
|
|
23
|
+
*
|
|
24
|
+
* @param args
|
|
25
|
+
* @method
|
|
26
|
+
*
|
|
27
|
+
* @throws {Error}
|
|
28
|
+
*/
|
|
29
|
+
deserialize(str: string, ...args: any[]): T;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* @summary Concrete implementation of a {@link Serializer} in JSON format
|
|
33
|
+
* @description JS's native JSON.stringify (used here) is not deterministic
|
|
34
|
+
* and therefore should not be used for hashing purposes
|
|
35
|
+
*
|
|
36
|
+
* To keep dependencies low, we will not implement this, but we recommend
|
|
37
|
+
* implementing a similar {@link JSONSerializer} using 'deterministic-json' libraries
|
|
38
|
+
*
|
|
39
|
+
* @class JSONSerializer
|
|
40
|
+
* @implements Serializer
|
|
41
|
+
*
|
|
42
|
+
* @category Serialization
|
|
43
|
+
*/
|
|
44
|
+
export declare class JSONSerializer<T extends Model> implements Serializer<T> {
|
|
45
|
+
/**
|
|
46
|
+
* @summary prepares the model for serialization
|
|
47
|
+
* @description returns a shallow copy of the object, containing an enumerable {@link ModelKeys#ANCHOR} property
|
|
48
|
+
* so the object can be recognized upon deserialization
|
|
49
|
+
*
|
|
50
|
+
* @param {T} model
|
|
51
|
+
* @protected
|
|
52
|
+
*/
|
|
53
|
+
protected preSerialize(model: T): Record<string, any>;
|
|
54
|
+
/**
|
|
55
|
+
* @summary Rebuilds a model from a serialization
|
|
56
|
+
* @param {string} str
|
|
57
|
+
*
|
|
58
|
+
* @throws {Error} If it fails to parse the string, or to build the model
|
|
59
|
+
*/
|
|
60
|
+
deserialize(str: string): T;
|
|
61
|
+
/**
|
|
62
|
+
* @summary Serializes a model
|
|
63
|
+
* @param {T} model
|
|
64
|
+
*
|
|
65
|
+
* @throws {Error} if fails to serialize
|
|
66
|
+
*/
|
|
67
|
+
serialize(model: T): string;
|
|
68
|
+
}
|
|
69
|
+
export declare const DefaultSerializationMethod = "json";
|
|
70
|
+
export declare class Serialization {
|
|
71
|
+
private static current;
|
|
72
|
+
private static cache;
|
|
73
|
+
private constructor();
|
|
74
|
+
private static get;
|
|
75
|
+
static register(key: string, func: Constructor<Serializer<any>>, setDefault?: boolean): void;
|
|
76
|
+
static serialize(obj: any, method?: string, ...args: any[]): any;
|
|
77
|
+
static deserialize(obj: string, method?: string, ...args: any[]): any;
|
|
78
|
+
static setDefault(method: string): void;
|
|
79
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.sf = void 0;
|
|
4
|
+
exports.stringFormat = stringFormat;
|
|
5
|
+
/**
|
|
6
|
+
* @summary Util function to provide string format functionality similar to C#'s string.format
|
|
7
|
+
*
|
|
8
|
+
* @param {string} string
|
|
9
|
+
* @param {Array<string | number>} [args] replacements made by order of appearance (replacement0 wil replace {0} and so on)
|
|
10
|
+
* @return {string} formatted string
|
|
11
|
+
*
|
|
12
|
+
* @function stringFormat
|
|
13
|
+
* @memberOf module:decorator-validation.Utils.Format
|
|
14
|
+
* @category Format
|
|
15
|
+
*/
|
|
16
|
+
function stringFormat(string, ...args) {
|
|
17
|
+
return string.replace(/{(\d+)}/g, function (match, number) {
|
|
18
|
+
return typeof args[number] !== "undefined"
|
|
19
|
+
? args[number].toString()
|
|
20
|
+
: "undefined";
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* @summary Util function to provide string format functionality similar to C#'s string.format
|
|
25
|
+
* @description alias for {@link stringFormat}
|
|
26
|
+
*
|
|
27
|
+
* @param {string} string
|
|
28
|
+
* @param {string} args replacements made by order of appearance (replacement0 wil replace {0} and so on)
|
|
29
|
+
* @return {string} formatted string
|
|
30
|
+
*
|
|
31
|
+
* @function sf
|
|
32
|
+
* @memberOf module:decorator-validation.Utils.Format
|
|
33
|
+
* @category Format
|
|
34
|
+
*/
|
|
35
|
+
exports.sf = stringFormat;
|
|
36
|
+
|
|
37
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy91dGlscy9zdHJpbmdzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQVdBLG9DQU1DO0FBakJEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxTQUFnQixZQUFZLENBQUMsTUFBYyxFQUFFLEdBQUcsSUFBeUI7SUFDdkUsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxVQUFVLEtBQUssRUFBRSxNQUFNO1FBQ3ZELE9BQU8sT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssV0FBVztZQUN4QyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsRUFBRTtZQUN6QixDQUFDLENBQUMsV0FBVyxDQUFDO0lBQ2xCLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVEOzs7Ozs7Ozs7OztHQVdHO0FBQ1UsUUFBQSxFQUFFLEdBQUcsWUFBWSxDQUFDIiwiZmlsZSI6InV0aWxzL3N0cmluZ3MuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBzdW1tYXJ5IFV0aWwgZnVuY3Rpb24gdG8gcHJvdmlkZSBzdHJpbmcgZm9ybWF0IGZ1bmN0aW9uYWxpdHkgc2ltaWxhciB0byBDIydzIHN0cmluZy5mb3JtYXRcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZyB8IG51bWJlcj59IFthcmdzXSByZXBsYWNlbWVudHMgbWFkZSBieSBvcmRlciBvZiBhcHBlYXJhbmNlIChyZXBsYWNlbWVudDAgd2lsIHJlcGxhY2UgezB9IGFuZCBzbyBvbilcbiAqIEByZXR1cm4ge3N0cmluZ30gZm9ybWF0dGVkIHN0cmluZ1xuICpcbiAqIEBmdW5jdGlvbiBzdHJpbmdGb3JtYXRcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb24uVXRpbHMuRm9ybWF0XG4gKiBAY2F0ZWdvcnkgRm9ybWF0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdGb3JtYXQoc3RyaW5nOiBzdHJpbmcsIC4uLmFyZ3M6IChzdHJpbmcgfCBudW1iZXIpW10pIHtcbiAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC97KFxcZCspfS9nLCBmdW5jdGlvbiAobWF0Y2gsIG51bWJlcikge1xuICAgIHJldHVybiB0eXBlb2YgYXJnc1tudW1iZXJdICE9PSBcInVuZGVmaW5lZFwiXG4gICAgICA/IGFyZ3NbbnVtYmVyXS50b1N0cmluZygpXG4gICAgICA6IFwidW5kZWZpbmVkXCI7XG4gIH0pO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFV0aWwgZnVuY3Rpb24gdG8gcHJvdmlkZSBzdHJpbmcgZm9ybWF0IGZ1bmN0aW9uYWxpdHkgc2ltaWxhciB0byBDIydzIHN0cmluZy5mb3JtYXRcbiAqIEBkZXNjcmlwdGlvbiBhbGlhcyBmb3Ige0BsaW5rIHN0cmluZ0Zvcm1hdH1cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncyByZXBsYWNlbWVudHMgbWFkZSBieSBvcmRlciBvZiBhcHBlYXJhbmNlIChyZXBsYWNlbWVudDAgd2lsIHJlcGxhY2UgezB9IGFuZCBzbyBvbilcbiAqIEByZXR1cm4ge3N0cmluZ30gZm9ybWF0dGVkIHN0cmluZ1xuICpcbiAqIEBmdW5jdGlvbiBzZlxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvbi5VdGlscy5Gb3JtYXRcbiAqIEBjYXRlZ29yeSBGb3JtYXRcbiAqL1xuZXhwb3J0IGNvbnN0IHNmID0gc3RyaW5nRm9ybWF0O1xuIl19
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @summary Util function to provide string format functionality similar to C#'s string.format
|
|
3
|
+
*
|
|
4
|
+
* @param {string} string
|
|
5
|
+
* @param {Array<string | number>} [args] replacements made by order of appearance (replacement0 wil replace {0} and so on)
|
|
6
|
+
* @return {string} formatted string
|
|
7
|
+
*
|
|
8
|
+
* @function stringFormat
|
|
9
|
+
* @memberOf module:decorator-validation.Utils.Format
|
|
10
|
+
* @category Format
|
|
11
|
+
*/
|
|
12
|
+
export declare function stringFormat(string: string, ...args: (string | number)[]): string;
|
|
13
|
+
/**
|
|
14
|
+
* @summary Util function to provide string format functionality similar to C#'s string.format
|
|
15
|
+
* @description alias for {@link stringFormat}
|
|
16
|
+
*
|
|
17
|
+
* @param {string} string
|
|
18
|
+
* @param {string} args replacements made by order of appearance (replacement0 wil replace {0} and so on)
|
|
19
|
+
* @return {string} formatted string
|
|
20
|
+
*
|
|
21
|
+
* @function sf
|
|
22
|
+
* @memberOf module:decorator-validation.Utils.Format
|
|
23
|
+
* @category Format
|
|
24
|
+
*/
|
|
25
|
+
export declare const sf: typeof stringFormat;
|