@decaf-ts/decorator-validation 1.0.7 → 1.0.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/dist/decorator-validation.bundle.min.js +1 -1
  2. package/dist/esm/decorator-validation.bundle.min.esm.js +1 -1
  3. package/lib/esm/index.d.ts +6 -1
  4. package/lib/esm/index.js +68 -1
  5. package/lib/esm/model/Model.d.ts +3 -1
  6. package/lib/esm/model/Model.js +316 -1
  7. package/lib/esm/model/ModelErrorDefinition.d.ts +1 -1
  8. package/lib/esm/model/ModelErrorDefinition.js +55 -3
  9. package/lib/esm/model/Registry.d.ts +1 -1
  10. package/lib/esm/model/Registry.js +76 -1
  11. package/lib/esm/model/constants.js +44 -1
  12. package/lib/esm/model/construction.js +124 -1
  13. package/lib/esm/model/decorators.d.ts +3 -3
  14. package/lib/esm/model/decorators.js +68 -1
  15. package/lib/esm/model/index.d.ts +3 -3
  16. package/lib/esm/model/index.js +9 -1
  17. package/lib/esm/model/types.js +3 -0
  18. package/lib/esm/reflection/decorators.d.ts +15 -0
  19. package/lib/esm/reflection/decorators.js +28 -0
  20. package/lib/esm/reflection/index.d.ts +2 -0
  21. package/lib/esm/reflection/index.js +4 -0
  22. package/lib/esm/{utils/general.d.ts → reflection/utils.d.ts} +7 -87
  23. package/lib/esm/reflection/utils.js +239 -0
  24. package/lib/esm/utils/constants.js +25 -1
  25. package/lib/esm/utils/dates.d.ts +76 -0
  26. package/lib/esm/utils/dates.js +241 -0
  27. package/lib/esm/utils/equality.d.ts +14 -0
  28. package/lib/esm/utils/equality.js +34 -0
  29. package/lib/esm/utils/hashing.d.ts +42 -0
  30. package/lib/esm/utils/hashing.js +73 -0
  31. package/lib/esm/utils/index.d.ts +6 -2
  32. package/lib/esm/utils/index.js +10 -1
  33. package/lib/esm/utils/registry.js +3 -0
  34. package/lib/esm/utils/serialization.js +53 -1
  35. package/lib/esm/utils/strings.d.ts +25 -0
  36. package/lib/esm/utils/strings.js +31 -0
  37. package/lib/esm/validation/Validation.d.ts +2 -1
  38. package/lib/esm/validation/Validation.js +63 -1
  39. package/lib/esm/validation/Validators/DateValidator.js +55 -1
  40. package/lib/esm/validation/Validators/EmailValidator.d.ts +0 -1
  41. package/lib/esm/validation/Validators/EmailValidator.js +49 -1
  42. package/lib/esm/validation/Validators/ListValidator.js +67 -1
  43. package/lib/esm/validation/Validators/MaxLengthValidator.js +55 -1
  44. package/lib/esm/validation/Validators/MaxValidator.js +59 -1
  45. package/lib/esm/validation/Validators/MinLengthValidator.js +55 -1
  46. package/lib/esm/validation/Validators/MinValidator.js +59 -1
  47. package/lib/esm/validation/Validators/PasswordValidator.js +52 -1
  48. package/lib/esm/validation/Validators/PatternValidator.d.ts +3 -3
  49. package/lib/esm/validation/Validators/PatternValidator.js +72 -1
  50. package/lib/esm/validation/Validators/RequiredValidator.js +57 -1
  51. package/lib/esm/validation/Validators/StepValidator.js +54 -1
  52. package/lib/esm/validation/Validators/TypeValidator.js +42 -1
  53. package/lib/esm/validation/Validators/URLValidator.d.ts +0 -1
  54. package/lib/esm/validation/Validators/URLValidator.js +48 -1
  55. package/lib/esm/validation/Validators/Validator.js +50 -1
  56. package/lib/esm/validation/Validators/ValidatorRegistry.js +81 -1
  57. package/lib/esm/validation/Validators/constants.d.ts +8 -4
  58. package/lib/esm/validation/Validators/constants.js +135 -1
  59. package/lib/esm/validation/Validators/decorators.d.ts +13 -0
  60. package/lib/esm/validation/Validators/decorators.js +23 -0
  61. package/lib/esm/validation/Validators/index.d.ts +9 -7
  62. package/lib/esm/validation/Validators/index.js +54 -1
  63. package/lib/esm/validation/Validators/types.d.ts +2 -2
  64. package/lib/esm/validation/Validators/types.js +3 -0
  65. package/lib/esm/validation/decorators.d.ts +14 -87
  66. package/lib/esm/validation/decorators.js +320 -1
  67. package/lib/esm/validation/index.d.ts +1 -10
  68. package/lib/esm/validation/index.js +6 -1
  69. package/lib/esm/validation/types.d.ts +11 -0
  70. package/lib/esm/validation/types.js +3 -0
  71. package/lib/index.cjs +85 -1
  72. package/lib/index.d.ts +6 -1
  73. package/lib/model/Model.cjs +321 -1
  74. package/lib/model/Model.d.ts +3 -1
  75. package/lib/model/ModelErrorDefinition.cjs +59 -3
  76. package/lib/model/ModelErrorDefinition.d.ts +1 -1
  77. package/lib/model/Registry.cjs +81 -1
  78. package/lib/model/Registry.d.ts +1 -1
  79. package/lib/model/constants.cjs +47 -1
  80. package/lib/model/construction.cjs +129 -1
  81. package/lib/model/decorators.cjs +73 -1
  82. package/lib/model/decorators.d.ts +3 -3
  83. package/lib/model/index.cjs +25 -1
  84. package/lib/model/index.d.ts +3 -3
  85. package/lib/model/types.cjs +4 -1
  86. package/lib/reflection/decorators.cjs +31 -0
  87. package/lib/reflection/decorators.d.ts +15 -0
  88. package/lib/reflection/index.cjs +20 -0
  89. package/lib/reflection/index.d.ts +2 -0
  90. package/lib/reflection/utils.cjs +251 -0
  91. package/lib/{utils/general.d.ts → reflection/utils.d.ts} +7 -87
  92. package/lib/utils/constants.cjs +28 -1
  93. package/lib/utils/dates.cjs +249 -0
  94. package/lib/utils/dates.d.ts +76 -0
  95. package/lib/utils/equality.cjs +37 -0
  96. package/lib/utils/equality.d.ts +14 -0
  97. package/lib/utils/hashing.cjs +78 -0
  98. package/lib/utils/hashing.d.ts +42 -0
  99. package/lib/utils/index.cjs +26 -1
  100. package/lib/utils/index.d.ts +6 -2
  101. package/lib/utils/registry.cjs +4 -1
  102. package/lib/utils/serialization.cjs +57 -1
  103. package/lib/utils/strings.cjs +35 -0
  104. package/lib/utils/strings.d.ts +25 -0
  105. package/lib/validation/Validation.cjs +67 -1
  106. package/lib/validation/Validation.d.ts +2 -1
  107. package/lib/validation/Validators/DateValidator.cjs +58 -1
  108. package/lib/validation/Validators/EmailValidator.cjs +52 -1
  109. package/lib/validation/Validators/EmailValidator.d.ts +0 -1
  110. package/lib/validation/Validators/ListValidator.cjs +70 -1
  111. package/lib/validation/Validators/MaxLengthValidator.cjs +58 -1
  112. package/lib/validation/Validators/MaxValidator.cjs +62 -1
  113. package/lib/validation/Validators/MinLengthValidator.cjs +58 -1
  114. package/lib/validation/Validators/MinValidator.cjs +62 -1
  115. package/lib/validation/Validators/PasswordValidator.cjs +55 -1
  116. package/lib/validation/Validators/PatternValidator.cjs +75 -1
  117. package/lib/validation/Validators/PatternValidator.d.ts +3 -3
  118. package/lib/validation/Validators/RequiredValidator.cjs +60 -1
  119. package/lib/validation/Validators/StepValidator.cjs +57 -1
  120. package/lib/validation/Validators/TypeValidator.cjs +46 -1
  121. package/lib/validation/Validators/URLValidator.cjs +51 -1
  122. package/lib/validation/Validators/URLValidator.d.ts +0 -1
  123. package/lib/validation/Validators/Validator.cjs +54 -1
  124. package/lib/validation/Validators/ValidatorRegistry.cjs +86 -1
  125. package/lib/validation/Validators/constants.cjs +138 -1
  126. package/lib/validation/Validators/constants.d.ts +8 -4
  127. package/lib/validation/Validators/decorators.cjs +26 -0
  128. package/lib/validation/Validators/decorators.d.ts +13 -0
  129. package/lib/validation/Validators/index.cjs +71 -1
  130. package/lib/validation/Validators/index.d.ts +9 -7
  131. package/lib/validation/Validators/types.cjs +4 -1
  132. package/lib/validation/Validators/types.d.ts +2 -2
  133. package/lib/validation/decorators.cjs +337 -1
  134. package/lib/validation/decorators.d.ts +14 -87
  135. package/lib/validation/index.cjs +22 -1
  136. package/lib/validation/index.d.ts +1 -10
  137. package/lib/validation/types.cjs +4 -1
  138. package/lib/validation/types.d.ts +11 -0
  139. package/package.json +17 -13
  140. package/lib/esm/utils/general.js +0 -1
  141. package/lib/utils/general.cjs +0 -1
@@ -1 +1,321 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.Model=exports.validate=void 0;const validation_1=require("../validation/index.cjs"),utils_1=require("../utils/index.cjs"),ModelErrorDefinition_1=require("./ModelErrorDefinition/index.cjs"),constants_1=require("./constants/index.cjs"),constants_2=require("../utils/constants/index.cjs"),construction_1=require("./construction/index.cjs"),Registry_1=require("./Registry/index.cjs"),Validation_1=require("../validation/Validation/index.cjs");function validate(n,...t){var e=[];for(const i in n)n.hasOwnProperty(i)&&-1===t.indexOf(i)&&e.push((0,utils_1.getPropertyDecorators)(validation_1.ValidationKeys.REFLECT,n,i));var r=e.reduce((t,r)=>{const{prop:i,decorators:s}=r;if(s&&s.length){const o=s[0];s.find(t=>t.key===validation_1.ValidationKeys.TYPE||!!t.props.types?.find(t=>t===o.props.name))&&s.shift();let e=s.reduce((t,e)=>{var r=Validation_1.Validation.get(e.key);return r&&(r=r.hasErrors(n[i.toString()],...e.key===constants_2.ModelKeys.TYPE?[e.props]:Object.values(e.props)))&&((t=t||{})[e.key]=r),t},void 0);(e=e||Object.keys(n).filter(t=>!e||!e[t]).reduce((t,r)=>{let i;const s=(0,utils_1.getPropertyDecorators)(validation_1.ValidationKeys.REFLECT,n,r).decorators;var e=s.filter(t=>-1!==[constants_2.ModelKeys.TYPE,validation_1.ValidationKeys.TYPE].indexOf(t.key));if(e&&e.length){e=e.pop(),e=e.props.name?[e.props.name]:Array.isArray(e.props.customTypes)?e.props.customTypes:[e.props.customTypes];const o=Object.values(constants_1.ReservedModels).map(t=>t.toLowerCase());e.forEach(t=>{if(-1===o.indexOf(t.toLowerCase()))switch(t){case"Array":case"Set":var e;s.length&&s.find(t=>t.key===validation_1.ValidationKeys.LIST)&&(e="Array"===t?n[r].find(t=>t.hasErrors()):n[r].values().find(t=>t.hasErrors()))&&(i=(0,utils_1.stringFormat)(validation_1.DEFAULT_ERROR_MESSAGES.LIST_INSIDE,e.toString()));break;default:try{n[r]&&(i=n[r].hasErrors())}catch(t){console.warn((0,utils_1.stringFormat)("Model should be validatable but its not"))}}}),i&&((t=t||{})[r]=i)}return t},void 0))&&((t=t||{})[r.prop.toString()]=e)}return t},void 0);return r?new ModelErrorDefinition_1.ModelErrorDefinition(r):void 0}exports.validate=validate;let modelBuilderFunction,actingModelRegistry,serializer,hashingFunction;class Model{constructor(t){}hasErrors(...t){return validate(this,...t)}equals(t,...e){return(0,utils_1.isEqual)(this,t,...e)}serialize(){return Model.serialize(this)}toString(){return this.constructor.name+": "+JSON.stringify(this,void 0,2)}toHash(){return Model.getHashingFunction()(this).toString()}static deserialize(t){return Model.getSerializer().deserialize(t)}static serialize(t){return Model.getSerializer().serialize(t)}static hash(t){return Model.getHashingFunction()(t)}static fromObject(t,e){return(0,construction_1.constructFromObject)(t,e)}static fromModel(t,e){return(0,construction_1.constructFromModel)(t,e)}static setBuilder(t){modelBuilderFunction=t}static getBuilder(){return modelBuilderFunction}static getRegistry(){return actingModelRegistry=actingModelRegistry||new Registry_1.ModelRegistryManager}static setRegistry(t){actingModelRegistry=t}static register(t,e){return Model.getRegistry().register(t,e)}static get(t){return Model.getRegistry().get(t)}static build(t={},e){return Model.getRegistry().build(t,e)}static setSerializer(t){serializer=t}static getSerializer(){return serializer=serializer||new utils_1.JSONSerializer}static setHashingFunction(t){hashingFunction=t}static getHashingFunction(){return hashingFunction=hashingFunction||utils_1.hashObj}}exports.Model=Model;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Model = void 0;
4
+ exports.validate = validate;
5
+ const constants_1 = require("../validation/Validators/constants/index.cjs");
6
+ const serialization_1 = require("../utils/serialization/index.cjs");
7
+ const ModelErrorDefinition_1 = require("./ModelErrorDefinition/index.cjs");
8
+ const constants_2 = require("./constants/index.cjs");
9
+ const constants_3 = require("../utils/constants/index.cjs");
10
+ const construction_1 = require("./construction/index.cjs");
11
+ const Registry_1 = require("./Registry/index.cjs");
12
+ const Validation_1 = require("../validation/Validation/index.cjs");
13
+ const utils_1 = require("../reflection/utils/index.cjs");
14
+ const hashing_1 = require("../utils/hashing/index.cjs");
15
+ const strings_1 = require("../utils/strings/index.cjs");
16
+ const equality_1 = require("../utils/equality/index.cjs");
17
+ /**
18
+ * @summary Analyses the decorations of the properties and validates the obj according to them
19
+ *
20
+ * @typedef T extends Model
21
+ * @prop {T} obj Model object to validate
22
+ * @prop {string[]} [propsToIgnore] object properties to ignore in the validation
23
+ *
24
+ * @function validate
25
+ * @memberOf module:decorator-validation.Validation
26
+ * @category Validation
27
+ */
28
+ function validate(obj, ...propsToIgnore) {
29
+ const decoratedProperties = [];
30
+ for (const prop in obj)
31
+ if (obj.hasOwnProperty(prop) && propsToIgnore.indexOf(prop) === -1)
32
+ decoratedProperties.push((0, utils_1.getPropertyDecorators)(constants_1.ValidationKeys.REFLECT, obj, prop));
33
+ const result = decoratedProperties.reduce((accum, decoratedProperty) => {
34
+ const { prop, decorators } = decoratedProperty;
35
+ if (!decorators || !decorators.length)
36
+ return accum;
37
+ // @ts-expect-error due to type casting in decorators
38
+ const defaultTypeDecorator = decorators[0];
39
+ // tries to find any type decorators or other decorators that already enforce type (the ones with the allowed types property defined). if so, skip the default type verification
40
+ if (decorators.find((d) => {
41
+ if (d.key === constants_1.ValidationKeys.TYPE)
42
+ return true;
43
+ if (d.props.types?.find((t) => t === defaultTypeDecorator.props.name))
44
+ return true;
45
+ return false;
46
+ }))
47
+ decorators.shift(); // remove the design:type decorator, since the type will already be checked
48
+ let errs = decorators.reduce((acc, decorator) => {
49
+ const validator = Validation_1.Validation.get(decorator.key);
50
+ if (!validator) {
51
+ return acc;
52
+ }
53
+ const err = validator.hasErrors(obj[prop.toString()], ...(decorator.key === constants_3.ModelKeys.TYPE
54
+ ? [decorator.props]
55
+ : Object.values(decorator.props)));
56
+ if (err) {
57
+ acc = acc || {};
58
+ acc[decorator.key] = err;
59
+ }
60
+ return acc;
61
+ }, undefined);
62
+ errs =
63
+ errs ||
64
+ Object.keys(obj)
65
+ .filter((k) => !errs || !errs[k])
66
+ .reduce((acc, prop) => {
67
+ let err;
68
+ // if a nested Model
69
+ const allDecorators = (0, utils_1.getPropertyDecorators)(constants_1.ValidationKeys.REFLECT, obj, prop).decorators;
70
+ const decorators = allDecorators.filter((d) => [constants_3.ModelKeys.TYPE, constants_1.ValidationKeys.TYPE].indexOf(d.key) !== -1);
71
+ if (!decorators || !decorators.length)
72
+ return acc;
73
+ const dec = decorators.pop();
74
+ const clazz = dec.props.name
75
+ ? [dec.props.name]
76
+ : Array.isArray(dec.props.customTypes)
77
+ ? dec.props.customTypes
78
+ : [dec.props.customTypes];
79
+ const reserved = Object.values(constants_2.ReservedModels).map((v) => v.toLowerCase());
80
+ clazz.forEach((c) => {
81
+ if (reserved.indexOf(c.toLowerCase()) === -1) {
82
+ switch (c) {
83
+ case "Array":
84
+ case "Set":
85
+ if (allDecorators.length) {
86
+ const listDec = allDecorators.find((d) => d.key === constants_1.ValidationKeys.LIST);
87
+ if (listDec) {
88
+ const e = c === "Array"
89
+ ? obj[prop].find((c) => c.hasErrors())
90
+ : obj[prop]
91
+ .values()
92
+ .find((c) => c.hasErrors());
93
+ if (e)
94
+ err = (0, strings_1.sf)(constants_1.DEFAULT_ERROR_MESSAGES.LIST_INSIDE, e.toString());
95
+ }
96
+ }
97
+ break;
98
+ default:
99
+ try {
100
+ if (obj[prop])
101
+ err = obj[prop].hasErrors();
102
+ }
103
+ catch (e) {
104
+ console.warn((0, strings_1.sf)("Model should be validatable but its not"));
105
+ }
106
+ }
107
+ }
108
+ });
109
+ if (err) {
110
+ acc = acc || {};
111
+ acc[prop] = err;
112
+ }
113
+ return acc;
114
+ }, undefined);
115
+ if (errs) {
116
+ accum = accum || {};
117
+ accum[decoratedProperty.prop.toString()] = errs;
118
+ }
119
+ return accum;
120
+ }, undefined);
121
+ return result ? new ModelErrorDefinition_1.ModelErrorDefinition(result) : undefined;
122
+ }
123
+ let modelBuilderFunction;
124
+ let actingModelRegistry;
125
+ let serializer;
126
+ let hashingFunction;
127
+ /**
128
+ * @summary Abstract class representing a Validatable Model object
129
+ * @description Meant to be used as a base class for all Model classes
130
+ *
131
+ * Model objects must:
132
+ * - Have all their properties defined as optional;
133
+ * - Have all their properties initialized eg:
134
+ *
135
+ * <pre>
136
+ * class ClassName {
137
+ * propertyName?: PropertyType = undefined;
138
+ * }
139
+ * </pre>
140
+ *
141
+ * @param {Model | {}} model base object from which to populate properties from
142
+ *
143
+ * @class Model
144
+ * @abstract
145
+ * @implements Validatable
146
+ * @implements Serializable
147
+ *
148
+ * @category Model
149
+ */
150
+ class Model {
151
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
152
+ constructor(model) { }
153
+ /**
154
+ * @summary Validates the object according to its decorated properties
155
+ *
156
+ * @param {any[]} [exceptions] properties in the object to be ignored for he validation. Marked as 'any' to allow for extension but expects strings
157
+ */
158
+ hasErrors(...exceptions) {
159
+ return validate(this, ...exceptions);
160
+ }
161
+ /**
162
+ * @summary Compare object equality recursively
163
+ * @param {any} obj object to compare to
164
+ * @param {string} [exceptions] property names to be excluded from the comparison
165
+ */
166
+ equals(obj, ...exceptions) {
167
+ return (0, equality_1.isEqual)(this, obj, ...exceptions);
168
+ }
169
+ /**
170
+ * @summary Returns the serialized model according to the currently defined {@link Serializer}
171
+ */
172
+ serialize() {
173
+ return Model.serialize(this);
174
+ }
175
+ /**
176
+ * @summary Override the implementation for js's 'toString()' which sucks...
177
+ * @override
178
+ */
179
+ toString() {
180
+ return this.constructor.name + ": " + JSON.stringify(this, undefined, 2);
181
+ }
182
+ /**
183
+ * @summary Defines a default implementation for object hash. Relies on a very basic implementation based on Java's string hash;
184
+ */
185
+ toHash() {
186
+ return Model.getHashingFunction()(this).toString();
187
+ }
188
+ /**
189
+ * @summary Deserializes a Model
190
+ * @param {string} str
191
+ *
192
+ * @throws {Error} If it fails to parse the string, or if it fails to build the model
193
+ */
194
+ static deserialize(str) {
195
+ return Model.getSerializer().deserialize(str);
196
+ }
197
+ /**
198
+ * @summary Serializes a Model
199
+ * @param {Model} model
200
+ */
201
+ static serialize(model) {
202
+ return Model.getSerializer().serialize(model);
203
+ }
204
+ static hash(obj) {
205
+ return Model.getHashingFunction()(obj);
206
+ }
207
+ /**
208
+ * @summary Wrapper around {@link constructFromObject}
209
+ * @param {T} self
210
+ * @param {T | Record<string, any>} obj
211
+ */
212
+ static fromObject(self, obj) {
213
+ return (0, construction_1.constructFromObject)(self, obj);
214
+ }
215
+ /**
216
+ * @summary Wrapper around {@link constructFromModel}
217
+ * @param {T} self
218
+ * @param {T | Record<string, any>} obj
219
+ */
220
+ static fromModel(self, obj) {
221
+ return (0, construction_1.constructFromModel)(self, obj);
222
+ }
223
+ /**
224
+ * @summary Sets the Global {@link ModelBuilderFunction}
225
+ * @param {ModelBuilderFunction} [builder]
226
+ */
227
+ static setBuilder(builder) {
228
+ modelBuilderFunction = builder;
229
+ }
230
+ /**
231
+ * @summary Retrieves the current global {@link ModelBuilderFunction}
232
+ */
233
+ static getBuilder() {
234
+ return modelBuilderFunction;
235
+ }
236
+ /**
237
+ * Returns the current {@link ModelRegistryManager}
238
+ *
239
+ * @return ModelRegistry, defaults to {@link ModelRegistryManager}
240
+ */
241
+ static getRegistry() {
242
+ if (!actingModelRegistry)
243
+ actingModelRegistry = new Registry_1.ModelRegistryManager();
244
+ return actingModelRegistry;
245
+ }
246
+ /**
247
+ * Returns the current actingModelRegistry
248
+ *
249
+ * @param {BuilderRegistry} modelRegistry the new implementation of Registry
250
+ */
251
+ static setRegistry(modelRegistry) {
252
+ actingModelRegistry = modelRegistry;
253
+ }
254
+ /**
255
+ * @summary register new Models
256
+ * @param {any} constructor
257
+ * @param {string} [name] when not defined, the name of the constructor will be used
258
+ *
259
+ * @see ModelRegistry
260
+ */
261
+ static register(constructor, name) {
262
+ return Model.getRegistry().register(constructor, name);
263
+ }
264
+ /**
265
+ * @summary Gets a registered Model {@link ModelConstructor}
266
+ * @param {string} name
267
+ *
268
+ * @see ModelRegistry
269
+ */
270
+ static get(name) {
271
+ return Model.getRegistry().get(name);
272
+ }
273
+ /**
274
+ * @param {Record<string, any>} obj
275
+ * @param {string} [clazz] when provided, it will attempt to find the matching constructor
276
+ *
277
+ * @throws Error If clazz is not found, or obj is not a {@link Model} meaning it has no {@link ModelKeys.ANCHOR} property
278
+ *
279
+ * @see ModelRegistry
280
+ */
281
+ static build(obj = {}, clazz) {
282
+ return Model.getRegistry().build(obj, clazz);
283
+ }
284
+ /**
285
+ * @summary Sets the {@link Serializer}
286
+ *
287
+ * @param {Serializer} ser
288
+ */
289
+ static setSerializer(ser) {
290
+ serializer = ser;
291
+ }
292
+ /**
293
+ * @summary Retrieves the current defined {@link Serializer}
294
+ *
295
+ */
296
+ static getSerializer() {
297
+ if (!serializer)
298
+ serializer = new serialization_1.JSONSerializer();
299
+ return serializer;
300
+ }
301
+ /**
302
+ * @summary Sets the {@link HashingFunction}
303
+ *
304
+ * @param {HashingFunction} hasher
305
+ */
306
+ static setHashingFunction(hasher) {
307
+ hashingFunction = hasher;
308
+ }
309
+ /**
310
+ * @summary Retrieves the current defined {@link HashingFunction}
311
+ *
312
+ */
313
+ static getHashingFunction() {
314
+ if (!hashingFunction)
315
+ hashingFunction = hashing_1.hashObj;
316
+ return hashingFunction;
317
+ }
318
+ }
319
+ exports.Model = Model;
320
+
321
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,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QUFDLENBQUM7SUFDL0MsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsYUFBYSxDQUFDLEdBQW9CO1FBQ3ZDLFVBQVUsR0FBRyxHQUFHLENBQUM7SUFDbkIsQ0FBQztJQUVEOzs7T0FHRztJQUNLLE1BQU0sQ0FBQyxhQUFhO1FBQzFCLElBQUksQ0FBQyxVQUFVO1lBQUUsVUFBVSxHQUFHLElBQUksOEJBQWMsRUFBRSxDQUFDO1FBQ25ELE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLGtCQUFrQixDQUFDLE1BQXVCO1FBQy9DLGVBQWUsR0FBRyxNQUFNLENBQUM7SUFDM0IsQ0FBQztJQUVEOzs7T0FHRztJQUNLLE1BQU0sQ0FBQyxrQkFBa0I7UUFDL0IsSUFBSSxDQUFDLGVBQWU7WUFBRSxlQUFlLEdBQUcsaUJBQU8sQ0FBQztRQUNoRCxPQUFPLGVBQWUsQ0FBQztJQUN6QixDQUFDO0NBQ0Y7QUFyTUQsc0JBcU1DIiwiZmlsZSI6Im1vZGVsL01vZGVsLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyxcbiAgVmFsaWRhdGlvbktleXMsXG59IGZyb20gXCIuLi92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBEZWNvcmF0b3JNZXRhZGF0YSxcbiAgRXJyb3JzLFxuICBNb2RlbEVycm9ycyxcbiAgVmFsaWRhdGlvblByb3BlcnR5RGVjb3JhdG9yRGVmaW5pdGlvbixcbn0gZnJvbSBcIi4uL3ZhbGlkYXRpb24vdHlwZXNcIjtcbmltcG9ydCB7IEpTT05TZXJpYWxpemVyLCBTZXJpYWxpemVyIH0gZnJvbSBcIi4uL3V0aWxzL3NlcmlhbGl6YXRpb25cIjtcbmltcG9ydCB7IEJ1aWxkZXJSZWdpc3RyeSB9IGZyb20gXCIuLi91dGlscy9yZWdpc3RyeVwiO1xuaW1wb3J0IHsgTW9kZWxFcnJvckRlZmluaXRpb24gfSBmcm9tIFwiLi9Nb2RlbEVycm9yRGVmaW5pdGlvblwiO1xuaW1wb3J0IHsgTW9kZWxBcmcsIE1vZGVsQ29uc3RydWN0b3IsIFNlcmlhbGl6YWJsZSwgVmFsaWRhdGFibGUgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgUmVzZXJ2ZWRNb2RlbHMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IE1vZGVsS2V5cyB9IGZyb20gXCIuLi91dGlscy9jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIGNvbnN0cnVjdEZyb21Nb2RlbCxcbiAgY29uc3RydWN0RnJvbU9iamVjdCxcbiAgTW9kZWxCdWlsZGVyRnVuY3Rpb24sXG59IGZyb20gXCIuL2NvbnN0cnVjdGlvblwiO1xuaW1wb3J0IHsgTW9kZWxSZWdpc3RyeU1hbmFnZXIgfSBmcm9tIFwiLi9SZWdpc3RyeVwiO1xuaW1wb3J0IHsgVmFsaWRhdGlvbiB9IGZyb20gXCIuLi92YWxpZGF0aW9uL1ZhbGlkYXRpb25cIjtcbmltcG9ydCB7IGdldFByb3BlcnR5RGVjb3JhdG9ycyB9IGZyb20gXCIuLi9yZWZsZWN0aW9uL3V0aWxzXCI7XG5pbXBvcnQgeyBIYXNoaW5nRnVuY3Rpb24sIGhhc2hPYmogfSBmcm9tIFwiLi4vdXRpbHMvaGFzaGluZ1wiO1xuaW1wb3J0IHsgc2YgfSBmcm9tIFwiLi4vdXRpbHMvc3RyaW5nc1wiO1xuaW1wb3J0IHsgaXNFcXVhbCB9IGZyb20gXCIuLi91dGlscy9lcXVhbGl0eVwiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IEFuYWx5c2VzIHRoZSBkZWNvcmF0aW9ucyBvZiB0aGUgcHJvcGVydGllcyBhbmQgdmFsaWRhdGVzIHRoZSBvYmogYWNjb3JkaW5nIHRvIHRoZW1cbiAqXG4gKiBAdHlwZWRlZiBUIGV4dGVuZHMgTW9kZWxcbiAqIEBwcm9wIHtUfSBvYmogTW9kZWwgb2JqZWN0IHRvIHZhbGlkYXRlXG4gKiBAcHJvcCB7c3RyaW5nW119IFtwcm9wc1RvSWdub3JlXSBvYmplY3QgcHJvcGVydGllcyB0byBpZ25vcmUgaW4gdGhlIHZhbGlkYXRpb25cbiAqXG4gKiBAZnVuY3Rpb24gdmFsaWRhdGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb24uVmFsaWRhdGlvblxuICogQGNhdGVnb3J5IFZhbGlkYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlPFQgZXh0ZW5kcyBNb2RlbD4oXG4gIG9iajogVCxcbiAgLi4ucHJvcHNUb0lnbm9yZTogc3RyaW5nW11cbik6IE1vZGVsRXJyb3JEZWZpbml0aW9uIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGVjb3JhdGVkUHJvcGVydGllczogVmFsaWRhdGlvblByb3BlcnR5RGVjb3JhdG9yRGVmaW5pdGlvbltdID0gW107XG4gIGZvciAoY29uc3QgcHJvcCBpbiBvYmopXG4gICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShwcm9wKSAmJiBwcm9wc1RvSWdub3JlLmluZGV4T2YocHJvcCkgPT09IC0xKVxuICAgICAgZGVjb3JhdGVkUHJvcGVydGllcy5wdXNoKFxuICAgICAgICBnZXRQcm9wZXJ0eURlY29yYXRvcnMoXG4gICAgICAgICAgVmFsaWRhdGlvbktleXMuUkVGTEVDVCxcbiAgICAgICAgICBvYmosXG4gICAgICAgICAgcHJvcCxcbiAgICAgICAgKSBhcyBWYWxpZGF0aW9uUHJvcGVydHlEZWNvcmF0b3JEZWZpbml0aW9uLFxuICAgICAgKTtcblxuICBjb25zdCByZXN1bHQgPSBkZWNvcmF0ZWRQcm9wZXJ0aWVzLnJlZHVjZShcbiAgICAoXG4gICAgICBhY2N1bTogdW5kZWZpbmVkIHwgTW9kZWxFcnJvcnMsXG4gICAgICBkZWNvcmF0ZWRQcm9wZXJ0eTogVmFsaWRhdGlvblByb3BlcnR5RGVjb3JhdG9yRGVmaW5pdGlvbixcbiAgICApID0+IHtcbiAgICAgIGNvbnN0IHsgcHJvcCwgZGVjb3JhdG9ycyB9ID0gZGVjb3JhdGVkUHJvcGVydHk7XG5cbiAgICAgIGlmICghZGVjb3JhdG9ycyB8fCAhZGVjb3JhdG9ycy5sZW5ndGgpIHJldHVybiBhY2N1bTtcblxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBkdWUgdG8gdHlwZSBjYXN0aW5nIGluIGRlY29yYXRvcnNcbiAgICAgIGNvbnN0IGRlZmF1bHRUeXBlRGVjb3JhdG9yOiB7IGtleTogc3RyaW5nOyBwcm9wczogeyBuYW1lOiBzdHJpbmcgfSB9ID1cbiAgICAgICAgZGVjb3JhdG9yc1swXTtcblxuICAgICAgLy8gdHJpZXMgdG8gZmluZCBhbnkgdHlwZSBkZWNvcmF0b3JzIG9yIG90aGVyIGRlY29yYXRvcnMgdGhhdCBhbHJlYWR5IGVuZm9yY2UgdHlwZSAodGhlIG9uZXMgd2l0aCB0aGUgYWxsb3dlZCB0eXBlcyBwcm9wZXJ0eSBkZWZpbmVkKS4gaWYgc28sIHNraXAgdGhlIGRlZmF1bHQgdHlwZSB2ZXJpZmljYXRpb25cbiAgICAgIGlmIChcbiAgICAgICAgZGVjb3JhdG9ycy5maW5kKChkKSA9PiB7XG4gICAgICAgICAgaWYgKGQua2V5ID09PSBWYWxpZGF0aW9uS2V5cy5UWVBFKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICBpZiAoZC5wcm9wcy50eXBlcz8uZmluZCgodCkgPT4gdCA9PT0gZGVmYXVsdFR5cGVEZWNvcmF0b3IucHJvcHMubmFtZSkpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAgIGRlY29yYXRvcnMuc2hpZnQoKTsgLy8gcmVtb3ZlIHRoZSBkZXNpZ246dHlwZSBkZWNvcmF0b3IsIHNpbmNlIHRoZSB0eXBlIHdpbGwgYWxyZWFkeSBiZSBjaGVja2VkXG5cbiAgICAgIGxldCBlcnJzOiB7IFtpbmRleGVyOiBzdHJpbmddOiBFcnJvcnMgfSB8IHVuZGVmaW5lZCA9IGRlY29yYXRvcnMucmVkdWNlKFxuICAgICAgICAoXG4gICAgICAgICAgYWNjOiB1bmRlZmluZWQgfCB7IFtpbmRleGVyOiBzdHJpbmddOiBFcnJvcnMgfSxcbiAgICAgICAgICBkZWNvcmF0b3I6IHsga2V5OiBzdHJpbmc7IHByb3BzOiBvYmplY3QgfSxcbiAgICAgICAgKSA9PiB7XG4gICAgICAgICAgY29uc3QgdmFsaWRhdG9yID0gVmFsaWRhdGlvbi5nZXQoZGVjb3JhdG9yLmtleSk7XG4gICAgICAgICAgaWYgKCF2YWxpZGF0b3IpIHtcbiAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgZXJyOiBFcnJvcnMgPSB2YWxpZGF0b3IuaGFzRXJyb3JzKFxuICAgICAgICAgICAgb2JqW3Byb3AudG9TdHJpbmcoKV0sXG4gICAgICAgICAgICAuLi4oZGVjb3JhdG9yLmtleSA9PT0gTW9kZWxLZXlzLlRZUEVcbiAgICAgICAgICAgICAgPyBbZGVjb3JhdG9yLnByb3BzXVxuICAgICAgICAgICAgICA6IE9iamVjdC52YWx1ZXMoZGVjb3JhdG9yLnByb3BzKSksXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIGFjYyA9IGFjYyB8fCB7fTtcbiAgICAgICAgICAgIGFjY1tkZWNvcmF0b3Iua2V5XSA9IGVycjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9LFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICApO1xuXG4gICAgICBlcnJzID1cbiAgICAgICAgZXJycyB8fFxuICAgICAgICBPYmplY3Qua2V5cyhvYmopXG4gICAgICAgICAgLmZpbHRlcigoaykgPT4gIWVycnMgfHwgIWVycnNba10pXG4gICAgICAgICAgLnJlZHVjZSgoYWNjOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkLCBwcm9wKSA9PiB7XG4gICAgICAgICAgICBsZXQgZXJyOiBFcnJvcnM7XG4gICAgICAgICAgICAvLyBpZiBhIG5lc3RlZCBNb2RlbFxuICAgICAgICAgICAgY29uc3QgYWxsRGVjb3JhdG9ycyA9IGdldFByb3BlcnR5RGVjb3JhdG9ycyhcbiAgICAgICAgICAgICAgVmFsaWRhdGlvbktleXMuUkVGTEVDVCxcbiAgICAgICAgICAgICAgb2JqLFxuICAgICAgICAgICAgICBwcm9wLFxuICAgICAgICAgICAgKS5kZWNvcmF0b3JzO1xuICAgICAgICAgICAgY29uc3QgZGVjb3JhdG9ycyA9IGFsbERlY29yYXRvcnMuZmlsdGVyKFxuICAgICAgICAgICAgICAoZCkgPT5cbiAgICAgICAgICAgICAgICBbTW9kZWxLZXlzLlRZUEUsIFZhbGlkYXRpb25LZXlzLlRZUEVdLmluZGV4T2YoZC5rZXkpICE9PSAtMSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoIWRlY29yYXRvcnMgfHwgIWRlY29yYXRvcnMubGVuZ3RoKSByZXR1cm4gYWNjO1xuICAgICAgICAgICAgY29uc3QgZGVjID0gZGVjb3JhdG9ycy5wb3AoKSBhcyBEZWNvcmF0b3JNZXRhZGF0YTtcbiAgICAgICAgICAgIGNvbnN0IGNsYXp6ID0gZGVjLnByb3BzLm5hbWVcbiAgICAgICAgICAgICAgPyBbZGVjLnByb3BzLm5hbWVdXG4gICAgICAgICAgICAgIDogQXJyYXkuaXNBcnJheShkZWMucHJvcHMuY3VzdG9tVHlwZXMpXG4gICAgICAgICAgICAgICAgPyBkZWMucHJvcHMuY3VzdG9tVHlwZXNcbiAgICAgICAgICAgICAgICA6IFtkZWMucHJvcHMuY3VzdG9tVHlwZXNdO1xuICAgICAgICAgICAgY29uc3QgcmVzZXJ2ZWQgPSBPYmplY3QudmFsdWVzKFJlc2VydmVkTW9kZWxzKS5tYXAoKHYpID0+XG4gICAgICAgICAgICAgIHYudG9Mb3dlckNhc2UoKSxcbiAgICAgICAgICAgICkgYXMgc3RyaW5nW107XG5cbiAgICAgICAgICAgIGNsYXp6LmZvckVhY2goKGM6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICBpZiAocmVzZXJ2ZWQuaW5kZXhPZihjLnRvTG93ZXJDYXNlKCkpID09PSAtMSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoYykge1xuICAgICAgICAgICAgICAgICAgY2FzZSBcIkFycmF5XCI6XG4gICAgICAgICAgICAgICAgICBjYXNlIFwiU2V0XCI6XG4gICAgICAgICAgICAgICAgICAgIGlmIChhbGxEZWNvcmF0b3JzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpc3REZWMgPSBhbGxEZWNvcmF0b3JzLmZpbmQoXG4gICAgICAgICAgICAgICAgICAgICAgICAoZCkgPT4gZC5rZXkgPT09IFZhbGlkYXRpb25LZXlzLkxJU1QsXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAobGlzdERlYykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGMgPT09IFwiQXJyYXlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKG9iaiBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtwcm9wXS5maW5kKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYzogVmFsaWRhdGFibGUpID0+IGMuaGFzRXJyb3JzKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAob2JqIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW3Byb3BdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC52YWx1ZXMoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmluZCgoYzogVmFsaWRhdGFibGUpID0+IGMuaGFzRXJyb3JzKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHNmKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfRVJST1JfTUVTU0FHRVMuTElTVF9JTlNJREUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKChvYmogYXMgUmVjb3JkPHN0cmluZywgYW55PilbcHJvcF0pXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSAob2JqIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW3Byb3BdLmhhc0Vycm9ycygpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgICAgICAgICBzZihcIk1vZGVsIHNob3VsZCBiZSB2YWxpZGF0YWJsZSBidXQgaXRzIG5vdFwiKSxcbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICBhY2MgPSBhY2MgfHwge307XG4gICAgICAgICAgICAgIGFjY1twcm9wXSA9IGVycjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgICAgfSwgdW5kZWZpbmVkKTtcblxuICAgICAgaWYgKGVycnMpIHtcbiAgICAgICAgYWNjdW0gPSBhY2N1bSB8fCB7fTtcbiAgICAgICAgYWNjdW1bZGVjb3JhdGVkUHJvcGVydHkucHJvcC50b1N0cmluZygpXSA9IGVycnM7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhY2N1bTtcbiAgICB9LFxuICAgIHVuZGVmaW5lZCxcbiAgKTtcbiAgcmV0dXJuIHJlc3VsdCA/IG5ldyBNb2RlbEVycm9yRGVmaW5pdGlvbihyZXN1bHQpIDogdW5kZWZpbmVkO1xufVxuXG5sZXQgbW9kZWxCdWlsZGVyRnVuY3Rpb246IE1vZGVsQnVpbGRlckZ1bmN0aW9uIHwgdW5kZWZpbmVkO1xubGV0IGFjdGluZ01vZGVsUmVnaXN0cnk6IEJ1aWxkZXJSZWdpc3RyeTxhbnk+O1xubGV0IHNlcmlhbGl6ZXI6IFNlcmlhbGl6ZXI8YW55PjtcbmxldCBoYXNoaW5nRnVuY3Rpb246IGFueTtcblxuLyoqXG4gKiBAc3VtbWFyeSBBYnN0cmFjdCBjbGFzcyByZXByZXNlbnRpbmcgYSBWYWxpZGF0YWJsZSBNb2RlbCBvYmplY3RcbiAqIEBkZXNjcmlwdGlvbiBNZWFudCB0byBiZSB1c2VkIGFzIGEgYmFzZSBjbGFzcyBmb3IgYWxsIE1vZGVsIGNsYXNzZXNcbiAqXG4gKiBNb2RlbCBvYmplY3RzIG11c3Q6XG4gKiAgLSBIYXZlIGFsbCB0aGVpciBwcm9wZXJ0aWVzIGRlZmluZWQgYXMgb3B0aW9uYWw7XG4gKiAgLSBIYXZlIGFsbCB0aGVpciBwcm9wZXJ0aWVzIGluaXRpYWxpemVkIGVnOlxuICpcbiAqICA8cHJlPlxuICogICAgICBjbGFzcyBDbGFzc05hbWUge1xuICogICAgICAgICAgcHJvcGVydHlOYW1lPzogUHJvcGVydHlUeXBlID0gdW5kZWZpbmVkO1xuICogICAgICB9XG4gKiAgPC9wcmU+XG4gKlxuICogQHBhcmFtIHtNb2RlbCB8IHt9fSBtb2RlbCBiYXNlIG9iamVjdCBmcm9tIHdoaWNoIHRvIHBvcHVsYXRlIHByb3BlcnRpZXMgZnJvbVxuICpcbiAqIEBjbGFzcyBNb2RlbFxuICogQGFic3RyYWN0XG4gKiBAaW1wbGVtZW50cyBWYWxpZGF0YWJsZVxuICogQGltcGxlbWVudHMgU2VyaWFsaXphYmxlXG4gKlxuICogQGNhdGVnb3J5IE1vZGVsXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBNb2RlbCBpbXBsZW1lbnRzIFZhbGlkYXRhYmxlLCBTZXJpYWxpemFibGUge1xuICBbaW5kZXhlcjogc3RyaW5nXTogYW55O1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKG1vZGVsPzogTW9kZWxBcmc8TW9kZWw+KSB7fVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBWYWxpZGF0ZXMgdGhlIG9iamVjdCBhY2NvcmRpbmcgdG8gaXRzIGRlY29yYXRlZCBwcm9wZXJ0aWVzXG4gICAqXG4gICAqIEBwYXJhbSB7YW55W119IFtleGNlcHRpb25zXSBwcm9wZXJ0aWVzIGluIHRoZSBvYmplY3QgdG8gYmUgaWdub3JlZCBmb3IgaGUgdmFsaWRhdGlvbi4gTWFya2VkIGFzICdhbnknIHRvIGFsbG93IGZvciBleHRlbnNpb24gYnV0IGV4cGVjdHMgc3RyaW5nc1xuICAgKi9cbiAgcHVibGljIGhhc0Vycm9ycyguLi5leGNlcHRpb25zOiBhbnlbXSk6IE1vZGVsRXJyb3JEZWZpbml0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdmFsaWRhdGUodGhpcywgLi4uZXhjZXB0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgQ29tcGFyZSBvYmplY3QgZXF1YWxpdHkgcmVjdXJzaXZlbHlcbiAgICogQHBhcmFtIHthbnl9IG9iaiBvYmplY3QgdG8gY29tcGFyZSB0b1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW2V4Y2VwdGlvbnNdIHByb3BlcnR5IG5hbWVzIHRvIGJlIGV4Y2x1ZGVkIGZyb20gdGhlIGNvbXBhcmlzb25cbiAgICovXG4gIHB1YmxpYyBlcXVhbHMob2JqOiBhbnksIC4uLmV4Y2VwdGlvbnM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzRXF1YWwodGhpcywgb2JqLCAuLi5leGNlcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIHRoZSBzZXJpYWxpemVkIG1vZGVsIGFjY29yZGluZyB0byB0aGUgY3VycmVudGx5IGRlZmluZWQge0BsaW5rIFNlcmlhbGl6ZXJ9XG4gICAqL1xuICBzZXJpYWxpemUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gTW9kZWwuc2VyaWFsaXplKHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IE92ZXJyaWRlIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3IganMncyAndG9TdHJpbmcoKScgd2hpY2ggc3Vja3MuLi5cbiAgICogQG92ZXJyaWRlXG4gICAqL1xuICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lICsgXCI6IFwiICsgSlNPTi5zdHJpbmdpZnkodGhpcywgdW5kZWZpbmVkLCAyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBEZWZpbmVzIGEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmb3Igb2JqZWN0IGhhc2guIFJlbGllcyBvbiBhIHZlcnkgYmFzaWMgaW1wbGVtZW50YXRpb24gYmFzZWQgb24gSmF2YSdzIHN0cmluZyBoYXNoO1xuICAgKi9cbiAgcHVibGljIHRvSGFzaCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBNb2RlbC5nZXRIYXNoaW5nRnVuY3Rpb24oKSh0aGlzKS50b1N0cmluZygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IERlc2VyaWFsaXplcyBhIE1vZGVsXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IElmIGl0IGZhaWxzIHRvIHBhcnNlIHRoZSBzdHJpbmcsIG9yIGlmIGl0IGZhaWxzIHRvIGJ1aWxkIHRoZSBtb2RlbFxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplKHN0cjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIE1vZGVsLmdldFNlcmlhbGl6ZXIoKS5kZXNlcmlhbGl6ZShzdHIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFNlcmlhbGl6ZXMgYSBNb2RlbFxuICAgKiBAcGFyYW0ge01vZGVsfSBtb2RlbFxuICAgKi9cbiAgc3RhdGljIHNlcmlhbGl6ZShtb2RlbDogYW55KSB7XG4gICAgcmV0dXJuIE1vZGVsLmdldFNlcmlhbGl6ZXIoKS5zZXJpYWxpemUobW9kZWwpO1xuICB9XG5cbiAgc3RhdGljIGhhc2gob2JqOiBhbnkpOiBzdHJpbmcge1xuICAgIHJldHVybiBNb2RlbC5nZXRIYXNoaW5nRnVuY3Rpb24oKShvYmopO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFdyYXBwZXIgYXJvdW5kIHtAbGluayBjb25zdHJ1Y3RGcm9tT2JqZWN0fVxuICAgKiBAcGFyYW0ge1R9IHNlbGZcbiAgICogQHBhcmFtIHtUIHwgUmVjb3JkPHN0cmluZywgYW55Pn0gb2JqXG4gICAqL1xuICBzdGF0aWMgZnJvbU9iamVjdDxUIGV4dGVuZHMgTW9kZWw+KFxuICAgIHNlbGY6IFQsXG4gICAgb2JqPzogVCB8IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICk6IFQge1xuICAgIHJldHVybiBjb25zdHJ1Y3RGcm9tT2JqZWN0PFQ+KHNlbGYsIG9iaik7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgV3JhcHBlciBhcm91bmQge0BsaW5rIGNvbnN0cnVjdEZyb21Nb2RlbH1cbiAgICogQHBhcmFtIHtUfSBzZWxmXG4gICAqIEBwYXJhbSB7VCB8IFJlY29yZDxzdHJpbmcsIGFueT59IG9ialxuICAgKi9cbiAgc3RhdGljIGZyb21Nb2RlbDxUIGV4dGVuZHMgTW9kZWw+KHNlbGY6IFQsIG9iaj86IFQgfCBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogVCB7XG4gICAgcmV0dXJuIGNvbnN0cnVjdEZyb21Nb2RlbDxUPihzZWxmLCBvYmopO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFNldHMgdGhlIEdsb2JhbCB7QGxpbmsgTW9kZWxCdWlsZGVyRnVuY3Rpb259XG4gICAqIEBwYXJhbSB7TW9kZWxCdWlsZGVyRnVuY3Rpb259IFtidWlsZGVyXVxuICAgKi9cbiAgc3RhdGljIHNldEJ1aWxkZXIoYnVpbGRlcj86IE1vZGVsQnVpbGRlckZ1bmN0aW9uKSB7XG4gICAgbW9kZWxCdWlsZGVyRnVuY3Rpb24gPSBidWlsZGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyB0aGUgY3VycmVudCBnbG9iYWwge0BsaW5rIE1vZGVsQnVpbGRlckZ1bmN0aW9ufVxuICAgKi9cbiAgc3RhdGljIGdldEJ1aWxkZXIoKTogTW9kZWxCdWlsZGVyRnVuY3Rpb24gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBtb2RlbEJ1aWxkZXJGdW5jdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHtAbGluayBNb2RlbFJlZ2lzdHJ5TWFuYWdlcn1cbiAgICpcbiAgICogQHJldHVybiBNb2RlbFJlZ2lzdHJ5LCBkZWZhdWx0cyB0byB7QGxpbmsgTW9kZWxSZWdpc3RyeU1hbmFnZXJ9XG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBnZXRSZWdpc3RyeSgpIHtcbiAgICBpZiAoIWFjdGluZ01vZGVsUmVnaXN0cnkpIGFjdGluZ01vZGVsUmVnaXN0cnkgPSBuZXcgTW9kZWxSZWdpc3RyeU1hbmFnZXIoKTtcbiAgICByZXR1cm4gYWN0aW5nTW9kZWxSZWdpc3RyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGFjdGluZ01vZGVsUmVnaXN0cnlcbiAgICpcbiAgICogQHBhcmFtIHtCdWlsZGVyUmVnaXN0cnl9IG1vZGVsUmVnaXN0cnkgdGhlIG5ldyBpbXBsZW1lbnRhdGlvbiBvZiBSZWdpc3RyeVxuICAgKi9cbiAgc3RhdGljIHNldFJlZ2lzdHJ5KG1vZGVsUmVnaXN0cnk6IEJ1aWxkZXJSZWdpc3RyeTxhbnk+KSB7XG4gICAgYWN0aW5nTW9kZWxSZWdpc3RyeSA9IG1vZGVsUmVnaXN0cnk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgcmVnaXN0ZXIgbmV3IE1vZGVsc1xuICAgKiBAcGFyYW0ge2FueX0gY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtuYW1lXSB3aGVuIG5vdCBkZWZpbmVkLCB0aGUgbmFtZSBvZiB0aGUgY29uc3RydWN0b3Igd2lsbCBiZSB1c2VkXG4gICAqXG4gICAqIEBzZWUgTW9kZWxSZWdpc3RyeVxuICAgKi9cbiAgc3RhdGljIHJlZ2lzdGVyPFQgZXh0ZW5kcyBNb2RlbD4oXG4gICAgY29uc3RydWN0b3I6IE1vZGVsQ29uc3RydWN0b3I8VD4sXG4gICAgbmFtZT86IHN0cmluZyxcbiAgKTogdm9pZCB7XG4gICAgcmV0dXJuIE1vZGVsLmdldFJlZ2lzdHJ5KCkucmVnaXN0ZXIoY29uc3RydWN0b3IsIG5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IEdldHMgYSByZWdpc3RlcmVkIE1vZGVsIHtAbGluayBNb2RlbENvbnN0cnVjdG9yfVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKlxuICAgKiBAc2VlIE1vZGVsUmVnaXN0cnlcbiAgICovXG4gIHN0YXRpYyBnZXQ8VCBleHRlbmRzIE1vZGVsPihuYW1lOiBzdHJpbmcpOiBNb2RlbENvbnN0cnVjdG9yPFQ+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gTW9kZWwuZ2V0UmVnaXN0cnkoKS5nZXQobmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBvYmpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtjbGF6el0gd2hlbiBwcm92aWRlZCwgaXQgd2lsbCBhdHRlbXB0IHRvIGZpbmQgdGhlIG1hdGNoaW5nIGNvbnN0cnVjdG9yXG4gICAqXG4gICAqIEB0aHJvd3MgRXJyb3IgSWYgY2xhenogaXMgbm90IGZvdW5kLCBvciBvYmogaXMgbm90IGEge0BsaW5rIE1vZGVsfSBtZWFuaW5nIGl0IGhhcyBubyB7QGxpbmsgTW9kZWxLZXlzLkFOQ0hPUn0gcHJvcGVydHlcbiAgICpcbiAgICogQHNlZSBNb2RlbFJlZ2lzdHJ5XG4gICAqL1xuICBzdGF0aWMgYnVpbGQ8VCBleHRlbmRzIE1vZGVsPihcbiAgICBvYmo6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fSxcbiAgICBjbGF6ej86IHN0cmluZyxcbiAgKTogVCB7XG4gICAgcmV0dXJuIE1vZGVsLmdldFJlZ2lzdHJ5KCkuYnVpbGQob2JqLCBjbGF6eik7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgU2V0cyB0aGUge0BsaW5rIFNlcmlhbGl6ZXJ9XG4gICAqXG4gICAqIEBwYXJhbSB7U2VyaWFsaXplcn0gc2VyXG4gICAqL1xuICBzdGF0aWMgc2V0U2VyaWFsaXplcihzZXI6IFNlcmlhbGl6ZXI8YW55Pikge1xuICAgIHNlcmlhbGl6ZXIgPSBzZXI7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBjdXJyZW50IGRlZmluZWQge0BsaW5rIFNlcmlhbGl6ZXJ9XG4gICAqXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBnZXRTZXJpYWxpemVyKCkge1xuICAgIGlmICghc2VyaWFsaXplcikgc2VyaWFsaXplciA9IG5ldyBKU09OU2VyaWFsaXplcigpO1xuICAgIHJldHVybiBzZXJpYWxpemVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFNldHMgdGhlIHtAbGluayBIYXNoaW5nRnVuY3Rpb259XG4gICAqXG4gICAqIEBwYXJhbSB7SGFzaGluZ0Z1bmN0aW9ufSBoYXNoZXJcbiAgICovXG4gIHN0YXRpYyBzZXRIYXNoaW5nRnVuY3Rpb24oaGFzaGVyOiBIYXNoaW5nRnVuY3Rpb24pIHtcbiAgICBoYXNoaW5nRnVuY3Rpb24gPSBoYXNoZXI7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBjdXJyZW50IGRlZmluZWQge0BsaW5rIEhhc2hpbmdGdW5jdGlvbn1cbiAgICpcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGdldEhhc2hpbmdGdW5jdGlvbigpIHtcbiAgICBpZiAoIWhhc2hpbmdGdW5jdGlvbikgaGFzaGluZ0Z1bmN0aW9uID0gaGFzaE9iajtcbiAgICByZXR1cm4gaGFzaGluZ0Z1bmN0aW9uO1xuICB9XG59XG4iXX0=
@@ -1,7 +1,9 @@
1
- import { BuilderRegistry, HashingFunction, Serializer } from "../utils";
1
+ import { Serializer } from "../utils/serialization";
2
+ import { BuilderRegistry } from "../utils/registry";
2
3
  import { ModelErrorDefinition } from "./ModelErrorDefinition";
3
4
  import { ModelArg, ModelConstructor, Serializable, Validatable } from "./types";
4
5
  import { ModelBuilderFunction } from "./construction";
6
+ import { HashingFunction } from "../utils/hashing";
5
7
  /**
6
8
  * @summary Analyses the decorations of the properties and validates the obj according to them
7
9
  *
@@ -1,3 +1,59 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.ModelErrorDefinition=void 0;class ModelErrorDefinition{constructor(e){for(const r in e)e.hasOwnProperty(r)&&e[r]&&Object.defineProperty(this,r,{enumerable:!0,configurable:!1,value:e[r],writable:!1})}toString(){const t=this;return Object.keys(t).filter(e=>t.hasOwnProperty(e)&&"function"!=typeof t[e]).reduce((e,o)=>{var r=Object.keys(t[o]).reduce((e,r)=>(e?e+=`
2
- `+t[o][r]:e=t[o][r],e),void 0);return r&&(r=o+" - "+r,e?e+=`
3
- `+r:e=r),e},"")}}exports.ModelErrorDefinition=ModelErrorDefinition;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ModelErrorDefinition = void 0;
4
+ /**
5
+ * @summary Helper Class to hold the error results
6
+ * @description holds error results in an 'indexable' manner
7
+ * while still providing the same result on toString
8
+ *
9
+ * @param {ModelErrors} errors
10
+ *
11
+ * @class ModelErrorDefinition
12
+ *
13
+ * @category Model
14
+ */
15
+ class ModelErrorDefinition {
16
+ constructor(errors) {
17
+ for (const prop in errors) {
18
+ if (errors.hasOwnProperty(prop) && errors[prop])
19
+ Object.defineProperty(this, prop, {
20
+ enumerable: true,
21
+ configurable: false,
22
+ value: errors[prop],
23
+ writable: false,
24
+ });
25
+ }
26
+ }
27
+ /**
28
+ * @summary Outputs the class to a nice readable string
29
+ *
30
+ * @override
31
+ */
32
+ toString() {
33
+ const self = this;
34
+ return Object.keys(self)
35
+ .filter((k) => self.hasOwnProperty(k) && typeof self[k] !== "function")
36
+ .reduce((accum, prop) => {
37
+ let propError = Object.keys(self[prop]).reduce((propAccum, key) => {
38
+ if (!propAccum)
39
+ // @ts-expect-error because i said so
40
+ propAccum = self[prop][key];
41
+ // @ts-expect-error because i said so
42
+ else
43
+ propAccum += `\n${self[prop][key]}`;
44
+ return propAccum;
45
+ }, undefined);
46
+ if (propError) {
47
+ propError = `${prop} - ${propError}`;
48
+ if (!accum)
49
+ accum = propError;
50
+ else
51
+ accum += `\n${propError}`;
52
+ }
53
+ return accum;
54
+ }, "");
55
+ }
56
+ }
57
+ exports.ModelErrorDefinition = ModelErrorDefinition;
58
+
59
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9tb2RlbC9Nb2RlbEVycm9yRGVmaW5pdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQTs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBYSxvQkFBb0I7SUFHL0IsWUFBWSxNQUFtQjtRQUM3QixLQUFLLE1BQU0sSUFBSSxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQzFCLElBQUksTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDO2dCQUM3QyxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUU7b0JBQ2hDLFVBQVUsRUFBRSxJQUFJO29CQUNoQixZQUFZLEVBQUUsS0FBSztvQkFDbkIsS0FBSyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUM7b0JBQ25CLFFBQVEsRUFBRSxLQUFLO2lCQUNoQixDQUFDLENBQUM7UUFDUCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxRQUFRO1FBQ04sTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7YUFDckIsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLFVBQVUsQ0FBQzthQUN0RSxNQUFNLENBQUMsQ0FBQyxLQUFhLEVBQUUsSUFBSSxFQUFFLEVBQUU7WUFDOUIsSUFBSSxTQUFTLEdBQXVCLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUNoRSxDQUFDLFNBQTZCLEVBQUUsR0FBRyxFQUFFLEVBQUU7Z0JBQ3JDLElBQUksQ0FBQyxTQUFTO29CQUNaLHFDQUFxQztvQkFDckMsU0FBUyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDOUIscUNBQXFDOztvQkFDaEMsU0FBUyxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3pDLE9BQU8sU0FBUyxDQUFDO1lBQ25CLENBQUMsRUFDRCxTQUFTLENBQ1YsQ0FBQztZQUVGLElBQUksU0FBUyxFQUFFLENBQUM7Z0JBQ2QsU0FBUyxHQUFHLEdBQUcsSUFBSSxNQUFNLFNBQVMsRUFBRSxDQUFDO2dCQUNyQyxJQUFJLENBQUMsS0FBSztvQkFBRSxLQUFLLEdBQUcsU0FBUyxDQUFDOztvQkFDekIsS0FBSyxJQUFJLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDakMsQ0FBQztZQUVELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ1gsQ0FBQztDQUNGO0FBOUNELG9EQThDQyIsImZpbGUiOiJtb2RlbC9Nb2RlbEVycm9yRGVmaW5pdGlvbi5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVycm9ycywgTW9kZWxFcnJvcnMgfSBmcm9tIFwiLi4vdmFsaWRhdGlvbi90eXBlc1wiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IEhlbHBlciBDbGFzcyB0byBob2xkIHRoZSBlcnJvciByZXN1bHRzXG4gKiBAZGVzY3JpcHRpb24gaG9sZHMgZXJyb3IgcmVzdWx0cyBpbiBhbiAnaW5kZXhhYmxlJyBtYW5uZXJcbiAqIHdoaWxlIHN0aWxsIHByb3ZpZGluZyB0aGUgc2FtZSByZXN1bHQgb24gdG9TdHJpbmdcbiAqXG4gKiBAcGFyYW0ge01vZGVsRXJyb3JzfSBlcnJvcnNcbiAqXG4gKiBAY2xhc3MgTW9kZWxFcnJvckRlZmluaXRpb25cbiAqXG4gKiBAY2F0ZWdvcnkgTW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIE1vZGVsRXJyb3JEZWZpbml0aW9uIHtcbiAgW2luZGV4ZXI6IHN0cmluZ106IFJlY29yZDxzdHJpbmcsIEVycm9ycz4gfCAoKCkgPT4gRXJyb3JzKTtcblxuICBjb25zdHJ1Y3RvcihlcnJvcnM6IE1vZGVsRXJyb3JzKSB7XG4gICAgZm9yIChjb25zdCBwcm9wIGluIGVycm9ycykge1xuICAgICAgaWYgKGVycm9ycy5oYXNPd25Qcm9wZXJ0eShwcm9wKSAmJiBlcnJvcnNbcHJvcF0pXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBwcm9wLCB7XG4gICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgIHZhbHVlOiBlcnJvcnNbcHJvcF0sXG4gICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgT3V0cHV0cyB0aGUgY2xhc3MgdG8gYSBuaWNlIHJlYWRhYmxlIHN0cmluZ1xuICAgKlxuICAgKiBAb3ZlcnJpZGVcbiAgICovXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHNlbGYpXG4gICAgICAuZmlsdGVyKChrKSA9PiBzZWxmLmhhc093blByb3BlcnR5KGspICYmIHR5cGVvZiBzZWxmW2tdICE9PSBcImZ1bmN0aW9uXCIpXG4gICAgICAucmVkdWNlKChhY2N1bTogc3RyaW5nLCBwcm9wKSA9PiB7XG4gICAgICAgIGxldCBwcm9wRXJyb3I6IHN0cmluZyB8IHVuZGVmaW5lZCA9IE9iamVjdC5rZXlzKHNlbGZbcHJvcF0pLnJlZHVjZShcbiAgICAgICAgICAocHJvcEFjY3VtOiB1bmRlZmluZWQgfCBzdHJpbmcsIGtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFwcm9wQWNjdW0pXG4gICAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgYmVjYXVzZSBpIHNhaWQgc29cbiAgICAgICAgICAgICAgcHJvcEFjY3VtID0gc2VsZltwcm9wXVtrZXldO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBiZWNhdXNlIGkgc2FpZCBzb1xuICAgICAgICAgICAgZWxzZSBwcm9wQWNjdW0gKz0gYFxcbiR7c2VsZltwcm9wXVtrZXldfWA7XG4gICAgICAgICAgICByZXR1cm4gcHJvcEFjY3VtO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChwcm9wRXJyb3IpIHtcbiAgICAgICAgICBwcm9wRXJyb3IgPSBgJHtwcm9wfSAtICR7cHJvcEVycm9yfWA7XG4gICAgICAgICAgaWYgKCFhY2N1bSkgYWNjdW0gPSBwcm9wRXJyb3I7XG4gICAgICAgICAgZWxzZSBhY2N1bSArPSBgXFxuJHtwcm9wRXJyb3J9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgIH0sIFwiXCIpO1xuICB9XG59XG4iXX0=
@@ -1,4 +1,4 @@
1
- import { Errors, ModelErrors } from "../validation";
1
+ import { Errors, ModelErrors } from "../validation/types";
2
2
  /**
3
3
  * @summary Helper Class to hold the error results
4
4
  * @description holds error results in an 'indexable' manner
@@ -1 +1,81 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.bulkModelRegister=exports.ModelRegistryManager=void 0;const Model_1=require("./Model/index.cjs"),utils_1=require("../utils/index.cjs"),constants_1=require("../utils/constants/index.cjs");class ModelRegistryManager{constructor(e=constants_1.ModelKeys.ANCHOR,t=utils_1.isModel){this.cache={},this.testFunction=t,this.anchorKey=e}register(e,t){if("function"!=typeof e)throw new Error("Model registering failed. Missing Class name or constructor");t=t||e.name,this.cache[t]=e}get(e){try{return this.cache[e]}catch(e){}}build(e={},t){if(!t&&!this.testFunction(e))throw new Error("Provided obj is not a Model object");t=t||e[this.anchorKey].class;if(t in this.cache)return new this.cache[t](e);throw new Error((0,utils_1.stringFormat)("Provided class {0} is not a registered Model object",t))}}function bulkModelRegister(...e){e.forEach(e=>{var t=e.constructor||e;Model_1.Model.register(t,e.name)})}exports.ModelRegistryManager=ModelRegistryManager,exports.bulkModelRegister=bulkModelRegister;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ModelRegistryManager = void 0;
4
+ exports.bulkModelRegister = bulkModelRegister;
5
+ const Model_1 = require("./Model/index.cjs");
6
+ const constants_1 = require("../utils/constants/index.cjs");
7
+ const utils_1 = require("../reflection/utils/index.cjs");
8
+ const strings_1 = require("../utils/strings/index.cjs");
9
+ /**
10
+ * @summary Util class to enable serialization and correct rebuilding
11
+ *
12
+ * @param {string} anchorKey defaults to {@link ModelKeys.ANCHOR}. The property name where the registered class name is stored;
13
+ * @param {function(Record<string, any>): boolean} [testFunction] method to test if the provided object is a Model Object. defaults to {@link isModel}
14
+ *
15
+ * @class ModelRegistryManager
16
+ * @implements ModelRegistry
17
+ *
18
+ * @category Model
19
+ */
20
+ class ModelRegistryManager {
21
+ constructor(anchorKey = constants_1.ModelKeys.ANCHOR, testFunction = utils_1.isModel) {
22
+ this.cache = {};
23
+ this.testFunction = testFunction;
24
+ this.anchorKey = anchorKey;
25
+ }
26
+ /**
27
+ * @summary register new Models
28
+ * @param {any} constructor
29
+ * @param {string} [name] when not defined, the name of the constructor will be used
30
+ */
31
+ register(constructor, name) {
32
+ if (typeof constructor !== "function")
33
+ throw new Error(`Model registering failed. Missing Class name or constructor`);
34
+ name = name || constructor.name;
35
+ this.cache[name] = constructor;
36
+ }
37
+ /**
38
+ * @summary Gets a registered Model {@link ModelConstructor}
39
+ * @param {string} name
40
+ */
41
+ get(name) {
42
+ try {
43
+ return this.cache[name];
44
+ }
45
+ catch (e) {
46
+ return undefined;
47
+ }
48
+ }
49
+ /**
50
+ * @param {Record<string, any>} obj
51
+ * @param {string} [clazz] when provided, it will attempt to find the matching constructor
52
+ *
53
+ * @throws Error If clazz is not found, or obj is not a {@link Model} meaning it has no {@link ModelKeys.ANCHOR} property
54
+ */
55
+ build(obj = {}, clazz) {
56
+ if (!clazz && !this.testFunction(obj))
57
+ throw new Error(`Provided obj is not a Model object`);
58
+ const name = clazz || obj[this.anchorKey].class;
59
+ if (!(name in this.cache))
60
+ throw new Error((0, strings_1.sf)(`Provided class {0} is not a registered Model object`, name));
61
+ return new this.cache[name](obj);
62
+ }
63
+ }
64
+ exports.ModelRegistryManager = ModelRegistryManager;
65
+ /**
66
+ * @summary Bulk Registers Models
67
+ * @description Useful when using bundlers that might not evaluate all of the code at once
68
+ *
69
+ * @param {Array<Constructor<T>> | Array<{name: string, constructor: Constructor<T>}>} [models]
70
+ *
71
+ * @memberOf module:decorator-validation.Model
72
+ * @category Model
73
+ */
74
+ function bulkModelRegister(...models) {
75
+ models.forEach((m) => {
76
+ const constructor = (m.constructor ? m.constructor : m);
77
+ Model_1.Model.register(constructor, m.name);
78
+ });
79
+ }
80
+
81
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9tb2RlbC9SZWdpc3RyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUE4RkEsOENBV0M7QUF6R0QsbUNBQWdDO0FBR2hDLGtEQUErQztBQUMvQywrQ0FBOEM7QUFDOUMsOENBQXNDO0FBWXRDOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFhLG9CQUFvQjtJQUsvQixZQUNFLFlBQW9CLHFCQUFTLENBQUMsTUFBTSxFQUNwQyxlQUFzRCxlQUFPO1FBTnZELFVBQUssR0FBd0MsRUFBRSxDQUFDO1FBUXRELElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO0lBQzdCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsUUFBUSxDQUFDLFdBQWdDLEVBQUUsSUFBYTtRQUN0RCxJQUFJLE9BQU8sV0FBVyxLQUFLLFVBQVU7WUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FDYiw2REFBNkQsQ0FDOUQsQ0FBQztRQUNKLElBQUksR0FBRyxJQUFJLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQztRQUNoQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLFdBQVcsQ0FBQztJQUNqQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsR0FBRyxDQUFDLElBQVk7UUFDZCxJQUFJLENBQUM7WUFDSCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUIsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWCxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLE1BQTJCLEVBQUUsRUFBRSxLQUFjO1FBQ2pELElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQztZQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7UUFDeEQsTUFBTSxJQUFJLEdBQUcsS0FBSyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQ2hELElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDO1lBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQ2IsSUFBQSxZQUFFLEVBQUMscURBQXFELEVBQUUsSUFBSSxDQUFDLENBQ2hFLENBQUM7UUFDSixPQUFPLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNuQyxDQUFDO0NBQ0Y7QUF2REQsb0RBdURDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFnQixpQkFBaUIsQ0FDL0IsR0FBRyxNQUEwRTtJQUU3RSxNQUFNLENBQUMsT0FBTyxDQUNaLENBQUMsQ0FBaUUsRUFBRSxFQUFFO1FBQ3BFLE1BQU0sV0FBVyxHQUFtQixDQUNsQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ2hCLENBQUM7UUFDcEIsYUFBSyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUcsQ0FBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxRCxDQUFDLENBQ0YsQ0FBQztBQUNKLENBQUMiLCJmaWxlIjoibW9kZWwvUmVnaXN0cnkuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNb2RlbCB9IGZyb20gXCIuL01vZGVsXCI7XG5pbXBvcnQgeyBCdWlsZGVyUmVnaXN0cnkgfSBmcm9tIFwiLi4vdXRpbHMvcmVnaXN0cnlcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNb2RlbENvbnN0cnVjdG9yIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IE1vZGVsS2V5cyB9IGZyb20gXCIuLi91dGlscy9jb25zdGFudHNcIjtcbmltcG9ydCB7IGlzTW9kZWwgfSBmcm9tIFwiLi4vcmVmbGVjdGlvbi91dGlsc1wiO1xuaW1wb3J0IHsgc2YgfSBmcm9tIFwiLi4vdXRpbHMvc3RyaW5nc1wiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IE1vZGVsUmVnaXN0cnkgSW50ZXJmYWNlXG4gKlxuICogQGludGVyZmFjZSBNb2RlbFJlZ2lzdHJ5XG4gKiBAZXh0ZW5kcyBCdWlsZGVyUmVnaXN0cnk8TW9kZWw+XG4gKlxuICogQGNhdGVnb3J5IE1vZGVsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxSZWdpc3RyeTxUIGV4dGVuZHMgTW9kZWw+IGV4dGVuZHMgQnVpbGRlclJlZ2lzdHJ5PFQ+IHt9XG5cbi8qKlxuICogQHN1bW1hcnkgVXRpbCBjbGFzcyB0byBlbmFibGUgc2VyaWFsaXphdGlvbiBhbmQgY29ycmVjdCByZWJ1aWxkaW5nXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFuY2hvcktleSBkZWZhdWx0cyB0byB7QGxpbmsgTW9kZWxLZXlzLkFOQ0hPUn0uIFRoZSBwcm9wZXJ0eSBuYW1lIHdoZXJlIHRoZSByZWdpc3RlcmVkIGNsYXNzIG5hbWUgaXMgc3RvcmVkO1xuICogQHBhcmFtIHtmdW5jdGlvbihSZWNvcmQ8c3RyaW5nLCBhbnk+KTogYm9vbGVhbn0gW3Rlc3RGdW5jdGlvbl0gbWV0aG9kIHRvIHRlc3QgaWYgdGhlIHByb3ZpZGVkIG9iamVjdCBpcyBhIE1vZGVsIE9iamVjdC4gZGVmYXVsdHMgdG8ge0BsaW5rIGlzTW9kZWx9XG4gKlxuICogQGNsYXNzIE1vZGVsUmVnaXN0cnlNYW5hZ2VyXG4gKiBAaW1wbGVtZW50cyBNb2RlbFJlZ2lzdHJ5XG4gKlxuICogQGNhdGVnb3J5IE1vZGVsXG4gKi9cbmV4cG9ydCBjbGFzcyBNb2RlbFJlZ2lzdHJ5TWFuYWdlcjxUIGV4dGVuZHMgTW9kZWw+IGltcGxlbWVudHMgTW9kZWxSZWdpc3RyeTxUPiB7XG4gIHByaXZhdGUgY2FjaGU6IFJlY29yZDxzdHJpbmcsIE1vZGVsQ29uc3RydWN0b3I8VD4+ID0ge307XG4gIHByaXZhdGUgcmVhZG9ubHkgdGVzdEZ1bmN0aW9uOiAob2JqOiBvYmplY3QpID0+IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgYW5jaG9yS2V5OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgYW5jaG9yS2V5OiBzdHJpbmcgPSBNb2RlbEtleXMuQU5DSE9SLFxuICAgIHRlc3RGdW5jdGlvbjogKG9iajogUmVjb3JkPHN0cmluZywgYW55PikgPT4gYm9vbGVhbiA9IGlzTW9kZWwsXG4gICkge1xuICAgIHRoaXMudGVzdEZ1bmN0aW9uID0gdGVzdEZ1bmN0aW9uO1xuICAgIHRoaXMuYW5jaG9yS2V5ID0gYW5jaG9yS2V5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IHJlZ2lzdGVyIG5ldyBNb2RlbHNcbiAgICogQHBhcmFtIHthbnl9IGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbmFtZV0gd2hlbiBub3QgZGVmaW5lZCwgdGhlIG5hbWUgb2YgdGhlIGNvbnN0cnVjdG9yIHdpbGwgYmUgdXNlZFxuICAgKi9cbiAgcmVnaXN0ZXIoY29uc3RydWN0b3I6IE1vZGVsQ29uc3RydWN0b3I8VD4sIG5hbWU/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodHlwZW9mIGNvbnN0cnVjdG9yICE9PSBcImZ1bmN0aW9uXCIpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBNb2RlbCByZWdpc3RlcmluZyBmYWlsZWQuIE1pc3NpbmcgQ2xhc3MgbmFtZSBvciBjb25zdHJ1Y3RvcmAsXG4gICAgICApO1xuICAgIG5hbWUgPSBuYW1lIHx8IGNvbnN0cnVjdG9yLm5hbWU7XG4gICAgdGhpcy5jYWNoZVtuYW1lXSA9IGNvbnN0cnVjdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IEdldHMgYSByZWdpc3RlcmVkIE1vZGVsIHtAbGluayBNb2RlbENvbnN0cnVjdG9yfVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKi9cbiAgZ2V0KG5hbWU6IHN0cmluZyk6IE1vZGVsQ29uc3RydWN0b3I8VD4gfCB1bmRlZmluZWQge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5jYWNoZVtuYW1lXTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG9ialxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2NsYXp6XSB3aGVuIHByb3ZpZGVkLCBpdCB3aWxsIGF0dGVtcHQgdG8gZmluZCB0aGUgbWF0Y2hpbmcgY29uc3RydWN0b3JcbiAgICpcbiAgICogQHRocm93cyBFcnJvciBJZiBjbGF6eiBpcyBub3QgZm91bmQsIG9yIG9iaiBpcyBub3QgYSB7QGxpbmsgTW9kZWx9IG1lYW5pbmcgaXQgaGFzIG5vIHtAbGluayBNb2RlbEtleXMuQU5DSE9SfSBwcm9wZXJ0eVxuICAgKi9cbiAgYnVpbGQob2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge30sIGNsYXp6Pzogc3RyaW5nKTogVCB7XG4gICAgaWYgKCFjbGF6eiAmJiAhdGhpcy50ZXN0RnVuY3Rpb24ob2JqKSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUHJvdmlkZWQgb2JqIGlzIG5vdCBhIE1vZGVsIG9iamVjdGApO1xuICAgIGNvbnN0IG5hbWUgPSBjbGF6eiB8fCBvYmpbdGhpcy5hbmNob3JLZXldLmNsYXNzO1xuICAgIGlmICghKG5hbWUgaW4gdGhpcy5jYWNoZSkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIHNmKGBQcm92aWRlZCBjbGFzcyB7MH0gaXMgbm90IGEgcmVnaXN0ZXJlZCBNb2RlbCBvYmplY3RgLCBuYW1lKSxcbiAgICAgICk7XG4gICAgcmV0dXJuIG5ldyB0aGlzLmNhY2hlW25hbWVdKG9iaik7XG4gIH1cbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBCdWxrIFJlZ2lzdGVycyBNb2RlbHNcbiAqIEBkZXNjcmlwdGlvbiBVc2VmdWwgd2hlbiB1c2luZyBidW5kbGVycyB0aGF0IG1pZ2h0IG5vdCBldmFsdWF0ZSBhbGwgb2YgdGhlIGNvZGUgYXQgb25jZVxuICpcbiAqIEBwYXJhbSB7QXJyYXk8Q29uc3RydWN0b3I8VD4+IHwgQXJyYXk8e25hbWU6IHN0cmluZywgY29uc3RydWN0b3I6IENvbnN0cnVjdG9yPFQ+fT59IFttb2RlbHNdXG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvbi5Nb2RlbFxuICogQGNhdGVnb3J5IE1vZGVsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWxrTW9kZWxSZWdpc3RlcjxUIGV4dGVuZHMgTW9kZWw+KFxuICAuLi5tb2RlbHM6IChDb25zdHJ1Y3RvcjxUPiB8IHsgbmFtZTogc3RyaW5nOyBjb25zdHJ1Y3RvcjogQ29uc3RydWN0b3I8VD4gfSlbXVxuKSB7XG4gIG1vZGVscy5mb3JFYWNoKFxuICAgIChtOiBDb25zdHJ1Y3RvcjxUPiB8IHsgbmFtZTogc3RyaW5nOyBjb25zdHJ1Y3RvcjogQ29uc3RydWN0b3I8VD4gfSkgPT4ge1xuICAgICAgY29uc3QgY29uc3RydWN0b3I6IENvbnN0cnVjdG9yPFQ+ID0gKFxuICAgICAgICBtLmNvbnN0cnVjdG9yID8gbS5jb25zdHJ1Y3RvciA6IG1cbiAgICAgICkgYXMgQ29uc3RydWN0b3I8VD47XG4gICAgICBNb2RlbC5yZWdpc3Rlcihjb25zdHJ1Y3RvciwgKG0gYXMgQ29uc3RydWN0b3I8VD4pLm5hbWUpO1xuICAgIH0sXG4gICk7XG59XG4iXX0=
@@ -1,5 +1,5 @@
1
1
  import { Model } from "./Model";
2
- import { BuilderRegistry } from "../utils";
2
+ import { BuilderRegistry } from "../utils/registry";
3
3
  import { Constructor, ModelConstructor } from "./types";
4
4
  /**
5
5
  * @summary ModelRegistry Interface
@@ -1 +1,47 @@
1
- "use strict";var Primitives,ReservedModels;Object.defineProperty(exports,"__esModule",{value:!0}),exports.ReservedModels=exports.Primitives=void 0,function(e){e.STRING="string",e.NUMBER="number",e.BOOLEAN="boolean",e.BIGINT="bigint"}(Primitives||(exports.Primitives=Primitives={})),function(e){e.STRING="string",e.OBJECT="object",e.NUMBER="number",e.BOOLEAN="boolean",e.BIGINT="bigint",e.DATE="date"}(ReservedModels||(exports.ReservedModels=ReservedModels={}));
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ReservedModels = exports.Primitives = void 0;
4
+ /**
5
+ * @summary References the relevant JS primitives
6
+ *
7
+ * @property {string} STRING references the string primitive
8
+ * @property {string} NUMBER references the number primitive
9
+ * @property {string} BOOLEAN references the boolean primitive
10
+ * @property {string} BIGINT references the bigint primitive
11
+ *
12
+ * @constant Primitives
13
+ * @memberOf module:decorator-validation.Construction
14
+ * @category Model
15
+ */
16
+ var Primitives;
17
+ (function (Primitives) {
18
+ Primitives["STRING"] = "string";
19
+ Primitives["NUMBER"] = "number";
20
+ Primitives["BOOLEAN"] = "boolean";
21
+ Primitives["BIGINT"] = "bigint";
22
+ })(Primitives || (exports.Primitives = Primitives = {}));
23
+ /**
24
+ * @summary References the Reserved model names to ignore during Model rebuilding
25
+ *
26
+ * @property {string} STRING
27
+ * @property {string} OBJECT
28
+ * @property {string} NUMBER
29
+ * @property {string} BOOLEAN
30
+ * @property {string} BIGINT
31
+ * @property {string} DATE
32
+ *
33
+ * @constant ReservedModels
34
+ * @memberOf module:decorator-validation.Construction
35
+ * @category Construction
36
+ */
37
+ var ReservedModels;
38
+ (function (ReservedModels) {
39
+ ReservedModels["STRING"] = "string";
40
+ ReservedModels["OBJECT"] = "object";
41
+ ReservedModels["NUMBER"] = "number";
42
+ ReservedModels["BOOLEAN"] = "boolean";
43
+ ReservedModels["BIGINT"] = "bigint";
44
+ ReservedModels["DATE"] = "date";
45
+ })(ReservedModels || (exports.ReservedModels = ReservedModels = {}));
46
+
47
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9tb2RlbC9jb25zdGFudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUE7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxJQUFZLFVBS1g7QUFMRCxXQUFZLFVBQVU7SUFDcEIsK0JBQWlCLENBQUE7SUFDakIsK0JBQWlCLENBQUE7SUFDakIsaUNBQW1CLENBQUE7SUFDbkIsK0JBQWlCLENBQUE7QUFDbkIsQ0FBQyxFQUxXLFVBQVUsMEJBQVYsVUFBVSxRQUtyQjtBQUVEOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxJQUFZLGNBT1g7QUFQRCxXQUFZLGNBQWM7SUFDeEIsbUNBQWlCLENBQUE7SUFDakIsbUNBQWlCLENBQUE7SUFDakIsbUNBQWlCLENBQUE7SUFDakIscUNBQW1CLENBQUE7SUFDbkIsbUNBQWlCLENBQUE7SUFDakIsK0JBQWEsQ0FBQTtBQUNmLENBQUMsRUFQVyxjQUFjLDhCQUFkLGNBQWMsUUFPekIiLCJmaWxlIjoibW9kZWwvY29uc3RhbnRzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAc3VtbWFyeSBSZWZlcmVuY2VzIHRoZSByZWxldmFudCBKUyBwcmltaXRpdmVzXG4gKlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFNUUklORyByZWZlcmVuY2VzIHRoZSBzdHJpbmcgcHJpbWl0aXZlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTlVNQkVSIHJlZmVyZW5jZXMgdGhlIG51bWJlciBwcmltaXRpdmVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBCT09MRUFOIHJlZmVyZW5jZXMgdGhlIGJvb2xlYW4gcHJpbWl0aXZlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gQklHSU5UIHJlZmVyZW5jZXMgdGhlIGJpZ2ludCBwcmltaXRpdmVcbiAqXG4gKiBAY29uc3RhbnQgUHJpbWl0aXZlc1xuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvbi5Db25zdHJ1Y3Rpb25cbiAqIEBjYXRlZ29yeSBNb2RlbFxuICovXG5leHBvcnQgZW51bSBQcmltaXRpdmVzIHtcbiAgU1RSSU5HID0gXCJzdHJpbmdcIixcbiAgTlVNQkVSID0gXCJudW1iZXJcIixcbiAgQk9PTEVBTiA9IFwiYm9vbGVhblwiLFxuICBCSUdJTlQgPSBcImJpZ2ludFwiLFxufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFJlZmVyZW5jZXMgdGhlIFJlc2VydmVkIG1vZGVsIG5hbWVzIHRvIGlnbm9yZSBkdXJpbmcgTW9kZWwgcmVidWlsZGluZ1xuICpcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBTVFJJTkdcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBPQkpFQ1RcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBOVU1CRVJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBCT09MRUFOXG4gKiBAcHJvcGVydHkge3N0cmluZ30gQklHSU5UXG4gKiBAcHJvcGVydHkge3N0cmluZ30gREFURVxuICpcbiAqIEBjb25zdGFudCBSZXNlcnZlZE1vZGVsc1xuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvbi5Db25zdHJ1Y3Rpb25cbiAqIEBjYXRlZ29yeSBDb25zdHJ1Y3Rpb25cbiAqL1xuZXhwb3J0IGVudW0gUmVzZXJ2ZWRNb2RlbHMge1xuICBTVFJJTkcgPSBcInN0cmluZ1wiLFxuICBPQkpFQ1QgPSBcIm9iamVjdFwiLFxuICBOVU1CRVIgPSBcIm51bWJlclwiLFxuICBCT09MRUFOID0gXCJib29sZWFuXCIsXG4gIEJJR0lOVCA9IFwiYmlnaW50XCIsXG4gIERBVEUgPSBcImRhdGVcIixcbn1cbiJdfQ==