@decaf-ts/decorator-validation 1.5.6 → 1.5.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/decorator-validation.js +2 -604
- package/dist/decorator-validation.js.LICENSE.txt +14 -0
- package/dist/esm/decorator-validation.js +2 -541
- package/dist/esm/decorator-validation.js.LICENSE.txt +14 -0
- package/lib/esm/index.d.ts +1 -1
- package/lib/esm/index.js +1 -3
- package/lib/esm/model/Model.d.ts +65 -0
- package/lib/esm/model/Model.js +87 -3
- package/lib/esm/model/ModelErrorDefinition.js +0 -2
- package/lib/esm/model/constants.js +0 -2
- package/lib/esm/model/construction.js +0 -2
- package/lib/esm/model/decorators.js +0 -2
- package/lib/esm/model/index.d.ts +0 -1
- package/lib/esm/model/index.js +0 -3
- package/lib/esm/model/types.js +0 -2
- package/lib/esm/model/utils.d.ts +0 -9
- package/lib/esm/model/utils.js +1 -20
- package/lib/esm/model/validation.js +2 -4
- package/lib/esm/utils/constants.js +0 -2
- package/lib/esm/utils/dates.js +0 -2
- package/lib/esm/utils/decorators.js +0 -2
- package/lib/esm/utils/hashing.js +0 -2
- package/lib/esm/utils/index.js +0 -2
- package/lib/esm/utils/registry.js +0 -2
- package/lib/esm/utils/serialization.js +0 -2
- package/lib/esm/utils/strings.js +0 -2
- package/lib/esm/validation/Validation.js +0 -2
- package/lib/esm/validation/Validators/DateValidator.js +0 -2
- package/lib/esm/validation/Validators/EmailValidator.js +0 -2
- package/lib/esm/validation/Validators/ListValidator.js +0 -2
- package/lib/esm/validation/Validators/MaxLengthValidator.js +0 -2
- package/lib/esm/validation/Validators/MaxValidator.js +0 -2
- package/lib/esm/validation/Validators/MinLengthValidator.js +0 -2
- package/lib/esm/validation/Validators/MinValidator.js +0 -2
- package/lib/esm/validation/Validators/PasswordValidator.js +0 -2
- package/lib/esm/validation/Validators/PatternValidator.js +0 -2
- package/lib/esm/validation/Validators/RequiredValidator.js +0 -2
- package/lib/esm/validation/Validators/StepValidator.js +0 -2
- package/lib/esm/validation/Validators/TypeValidator.js +0 -2
- package/lib/esm/validation/Validators/URLValidator.js +0 -2
- package/lib/esm/validation/Validators/Validator.js +0 -2
- package/lib/esm/validation/Validators/ValidatorRegistry.js +0 -2
- package/lib/esm/validation/Validators/constants.js +0 -2
- package/lib/esm/validation/Validators/decorators.js +0 -2
- package/lib/esm/validation/Validators/index.js +0 -2
- package/lib/esm/validation/Validators/types.js +1 -0
- package/lib/esm/validation/decorators.js +0 -2
- package/lib/esm/validation/index.js +0 -2
- package/lib/esm/validation/types.js +0 -2
- package/lib/index.d.ts +1 -1
- package/lib/index.js +1 -3
- package/lib/model/Model.d.ts +65 -0
- package/lib/model/Model.js +92 -5
- package/lib/model/ModelErrorDefinition.js +0 -2
- package/lib/model/constants.js +0 -2
- package/lib/model/construction.js +0 -2
- package/lib/model/decorators.js +0 -2
- package/lib/model/index.d.ts +0 -1
- package/lib/model/index.js +0 -3
- package/lib/model/types.js +0 -2
- package/lib/model/utils.d.ts +0 -9
- package/lib/model/utils.js +1 -21
- package/lib/model/validation.js +3 -5
- package/lib/utils/constants.js +0 -2
- package/lib/utils/dates.js +0 -2
- package/lib/utils/decorators.js +0 -2
- package/lib/utils/hashing.js +0 -2
- package/lib/utils/index.js +0 -2
- package/lib/utils/registry.js +0 -2
- package/lib/utils/serialization.js +0 -2
- package/lib/utils/strings.js +0 -2
- package/lib/validation/Validation.js +0 -2
- package/lib/validation/Validators/DateValidator.js +0 -2
- package/lib/validation/Validators/EmailValidator.js +0 -2
- package/lib/validation/Validators/ListValidator.js +0 -2
- package/lib/validation/Validators/MaxLengthValidator.js +0 -2
- package/lib/validation/Validators/MaxValidator.js +0 -2
- package/lib/validation/Validators/MinLengthValidator.js +0 -2
- package/lib/validation/Validators/MinValidator.js +0 -2
- package/lib/validation/Validators/PasswordValidator.js +0 -2
- package/lib/validation/Validators/PatternValidator.js +0 -2
- package/lib/validation/Validators/RequiredValidator.js +0 -2
- package/lib/validation/Validators/StepValidator.js +0 -2
- package/lib/validation/Validators/TypeValidator.js +0 -2
- package/lib/validation/Validators/URLValidator.js +0 -2
- package/lib/validation/Validators/Validator.js +0 -2
- package/lib/validation/Validators/ValidatorRegistry.js +85 -0
- package/lib/validation/Validators/constants.js +137 -0
- package/lib/validation/Validators/decorators.js +28 -0
- package/lib/validation/Validators/index.js +69 -0
- package/lib/validation/Validators/types.js +2 -0
- package/lib/validation/decorators.js +0 -2
- package/lib/validation/index.js +0 -2
- package/lib/validation/types.js +0 -2
- package/package.json +2 -2
- package/lib/esm/model/Registry.d.ts +0 -59
- package/lib/esm/model/Registry.js +0 -75
- package/lib/esm/validation/Validators/types.d.ts +0 -88
- package/lib/model/Registry.d.ts +0 -59
- package/lib/model/Registry.js +0 -80
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
import { Model } from "./Model";
|
|
2
|
-
import { BuilderRegistry } from "../utils/registry";
|
|
3
|
-
import { Constructor, ModelConstructor } from "./types";
|
|
4
|
-
/**
|
|
5
|
-
* @summary ModelRegistry Interface
|
|
6
|
-
*
|
|
7
|
-
* @interface ModelRegistry
|
|
8
|
-
* @extends BuilderRegistry<Model>
|
|
9
|
-
*
|
|
10
|
-
* @category Model
|
|
11
|
-
*/
|
|
12
|
-
export type ModelRegistry<T extends Model> = BuilderRegistry<T>;
|
|
13
|
-
/**
|
|
14
|
-
* @summary Util class to enable serialization and correct rebuilding
|
|
15
|
-
*
|
|
16
|
-
* @param {string} anchorKey defaults to {@link ModelKeys.ANCHOR}. The property name where the registered class name is stored;
|
|
17
|
-
* @param {function(Record<string, any>): boolean} [testFunction] method to test if the provided object is a Model Object. defaults to {@link isModel}
|
|
18
|
-
*
|
|
19
|
-
* @class ModelRegistryManager
|
|
20
|
-
* @implements ModelRegistry
|
|
21
|
-
*
|
|
22
|
-
* @category Model
|
|
23
|
-
*/
|
|
24
|
-
export declare class ModelRegistryManager<T extends Model> implements ModelRegistry<T> {
|
|
25
|
-
private cache;
|
|
26
|
-
private readonly testFunction;
|
|
27
|
-
constructor(testFunction?: (obj: Record<string, any>) => boolean);
|
|
28
|
-
/**
|
|
29
|
-
* @summary register new Models
|
|
30
|
-
* @param {any} constructor
|
|
31
|
-
* @param {string} [name] when not defined, the name of the constructor will be used
|
|
32
|
-
*/
|
|
33
|
-
register(constructor: ModelConstructor<T>, name?: string): void;
|
|
34
|
-
/**
|
|
35
|
-
* @summary Gets a registered Model {@link ModelConstructor}
|
|
36
|
-
* @param {string} name
|
|
37
|
-
*/
|
|
38
|
-
get(name: string): ModelConstructor<T> | undefined;
|
|
39
|
-
/**
|
|
40
|
-
* @param {Record<string, any>} obj
|
|
41
|
-
* @param {string} [clazz] when provided, it will attempt to find the matching constructor
|
|
42
|
-
*
|
|
43
|
-
* @throws Error If clazz is not found, or obj is not a {@link Model} meaning it has no {@link ModelKeys.ANCHOR} property
|
|
44
|
-
*/
|
|
45
|
-
build(obj?: Record<string, any>, clazz?: string): T;
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* @summary Bulk Registers Models
|
|
49
|
-
* @description Useful when using bundlers that might not evaluate all the code at once
|
|
50
|
-
*
|
|
51
|
-
* @param {Array<Constructor<T>> | Array<{name: string, constructor: Constructor<T>}>} [models]
|
|
52
|
-
*
|
|
53
|
-
* @memberOf module:decorator-validation.Model
|
|
54
|
-
* @category Model
|
|
55
|
-
*/
|
|
56
|
-
export declare function bulkModelRegister<T extends Model>(...models: (Constructor<T> | {
|
|
57
|
-
name: string;
|
|
58
|
-
constructor: Constructor<T>;
|
|
59
|
-
})[]): void;
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
import { Model } from "./Model";
|
|
2
|
-
import { sf } from "../utils/strings";
|
|
3
|
-
import { isModel } from "./utils";
|
|
4
|
-
/**
|
|
5
|
-
* @summary Util class to enable serialization and correct rebuilding
|
|
6
|
-
*
|
|
7
|
-
* @param {string} anchorKey defaults to {@link ModelKeys.ANCHOR}. The property name where the registered class name is stored;
|
|
8
|
-
* @param {function(Record<string, any>): boolean} [testFunction] method to test if the provided object is a Model Object. defaults to {@link isModel}
|
|
9
|
-
*
|
|
10
|
-
* @class ModelRegistryManager
|
|
11
|
-
* @implements ModelRegistry
|
|
12
|
-
*
|
|
13
|
-
* @category Model
|
|
14
|
-
*/
|
|
15
|
-
export class ModelRegistryManager {
|
|
16
|
-
constructor(testFunction = isModel) {
|
|
17
|
-
this.cache = {};
|
|
18
|
-
this.testFunction = testFunction;
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* @summary register new Models
|
|
22
|
-
* @param {any} constructor
|
|
23
|
-
* @param {string} [name] when not defined, the name of the constructor will be used
|
|
24
|
-
*/
|
|
25
|
-
register(constructor, name) {
|
|
26
|
-
if (typeof constructor !== "function")
|
|
27
|
-
throw new Error("Model registering failed. Missing Class name or constructor");
|
|
28
|
-
name = name || constructor.name;
|
|
29
|
-
this.cache[name] = constructor;
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* @summary Gets a registered Model {@link ModelConstructor}
|
|
33
|
-
* @param {string} name
|
|
34
|
-
*/
|
|
35
|
-
get(name) {
|
|
36
|
-
try {
|
|
37
|
-
return this.cache[name];
|
|
38
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
39
|
-
}
|
|
40
|
-
catch (e) {
|
|
41
|
-
return undefined;
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* @param {Record<string, any>} obj
|
|
46
|
-
* @param {string} [clazz] when provided, it will attempt to find the matching constructor
|
|
47
|
-
*
|
|
48
|
-
* @throws Error If clazz is not found, or obj is not a {@link Model} meaning it has no {@link ModelKeys.ANCHOR} property
|
|
49
|
-
*/
|
|
50
|
-
build(obj = {}, clazz) {
|
|
51
|
-
if (!clazz && !this.testFunction(obj))
|
|
52
|
-
throw new Error("Provided obj is not a Model object");
|
|
53
|
-
const name = clazz || Model.getMetadata(obj);
|
|
54
|
-
if (!(name in this.cache))
|
|
55
|
-
throw new Error(sf("Provided class {0} is not a registered Model object", name));
|
|
56
|
-
return new this.cache[name](obj);
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* @summary Bulk Registers Models
|
|
61
|
-
* @description Useful when using bundlers that might not evaluate all the code at once
|
|
62
|
-
*
|
|
63
|
-
* @param {Array<Constructor<T>> | Array<{name: string, constructor: Constructor<T>}>} [models]
|
|
64
|
-
*
|
|
65
|
-
* @memberOf module:decorator-validation.Model
|
|
66
|
-
* @category Model
|
|
67
|
-
*/
|
|
68
|
-
export function bulkModelRegister(...models) {
|
|
69
|
-
models.forEach((m) => {
|
|
70
|
-
const constructor = (m.constructor ? m.constructor : m);
|
|
71
|
-
Model.register(constructor, m.name);
|
|
72
|
-
});
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9tb2RlbC9SZWdpc3RyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBR2hDLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN0QyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBWWxDOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLE9BQU8sb0JBQW9CO0lBSS9CLFlBQVksZUFBc0QsT0FBTztRQUhqRSxVQUFLLEdBQXdDLEVBQUUsQ0FBQztRQUl0RCxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztJQUNuQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFFBQVEsQ0FBQyxXQUFnQyxFQUFFLElBQWE7UUFDdEQsSUFBSSxPQUFPLFdBQVcsS0FBSyxVQUFVO1lBQ25DLE1BQU0sSUFBSSxLQUFLLENBQ2IsNkRBQTZELENBQzlELENBQUM7UUFDSixJQUFJLEdBQUcsSUFBSSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUM7UUFDaEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxXQUFXLENBQUM7SUFDakMsQ0FBQztJQUVEOzs7T0FHRztJQUNILEdBQUcsQ0FBQyxJQUFZO1FBQ2QsSUFBSSxDQUFDO1lBQ0gsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3hCLDZEQUE2RDtRQUMvRCxDQUFDO1FBQUMsT0FBTyxDQUFNLEVBQUUsQ0FBQztZQUNoQixPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLE1BQTJCLEVBQUUsRUFBRSxLQUFjO1FBQ2pELElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQztZQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7UUFDeEQsTUFBTSxJQUFJLEdBQUcsS0FBSyxJQUFJLEtBQUssQ0FBQyxXQUFXLENBQUMsR0FBVSxDQUFDLENBQUM7UUFDcEQsSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUM7WUFDdkIsTUFBTSxJQUFJLEtBQUssQ0FDYixFQUFFLENBQUMscURBQXFELEVBQUUsSUFBSSxDQUFDLENBQ2hFLENBQUM7UUFDSixPQUFPLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNuQyxDQUFDO0NBQ0Y7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxpQkFBaUIsQ0FDL0IsR0FBRyxNQUEwRTtJQUU3RSxNQUFNLENBQUMsT0FBTyxDQUNaLENBQUMsQ0FBaUUsRUFBRSxFQUFFO1FBQ3BFLE1BQU0sV0FBVyxHQUFtQixDQUNsQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ2hCLENBQUM7UUFDcEIsS0FBSyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUcsQ0FBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxRCxDQUFDLENBQ0YsQ0FBQztBQUNKLENBQUMiLCJmaWxlIjoibW9kZWwvUmVnaXN0cnkuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNb2RlbCB9IGZyb20gXCIuL01vZGVsXCI7XG5pbXBvcnQgeyBCdWlsZGVyUmVnaXN0cnkgfSBmcm9tIFwiLi4vdXRpbHMvcmVnaXN0cnlcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNb2RlbENvbnN0cnVjdG9yIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IHNmIH0gZnJvbSBcIi4uL3V0aWxzL3N0cmluZ3NcIjtcbmltcG9ydCB7IGlzTW9kZWwgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IE1vZGVsUmVnaXN0cnkgSW50ZXJmYWNlXG4gKlxuICogQGludGVyZmFjZSBNb2RlbFJlZ2lzdHJ5XG4gKiBAZXh0ZW5kcyBCdWlsZGVyUmVnaXN0cnk8TW9kZWw+XG4gKlxuICogQGNhdGVnb3J5IE1vZGVsXG4gKi9cbmV4cG9ydCB0eXBlIE1vZGVsUmVnaXN0cnk8VCBleHRlbmRzIE1vZGVsPiA9IEJ1aWxkZXJSZWdpc3RyeTxUPjtcblxuLyoqXG4gKiBAc3VtbWFyeSBVdGlsIGNsYXNzIHRvIGVuYWJsZSBzZXJpYWxpemF0aW9uIGFuZCBjb3JyZWN0IHJlYnVpbGRpbmdcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYW5jaG9yS2V5IGRlZmF1bHRzIHRvIHtAbGluayBNb2RlbEtleXMuQU5DSE9SfS4gVGhlIHByb3BlcnR5IG5hbWUgd2hlcmUgdGhlIHJlZ2lzdGVyZWQgY2xhc3MgbmFtZSBpcyBzdG9yZWQ7XG4gKiBAcGFyYW0ge2Z1bmN0aW9uKFJlY29yZDxzdHJpbmcsIGFueT4pOiBib29sZWFufSBbdGVzdEZ1bmN0aW9uXSBtZXRob2QgdG8gdGVzdCBpZiB0aGUgcHJvdmlkZWQgb2JqZWN0IGlzIGEgTW9kZWwgT2JqZWN0LiBkZWZhdWx0cyB0byB7QGxpbmsgaXNNb2RlbH1cbiAqXG4gKiBAY2xhc3MgTW9kZWxSZWdpc3RyeU1hbmFnZXJcbiAqIEBpbXBsZW1lbnRzIE1vZGVsUmVnaXN0cnlcbiAqXG4gKiBAY2F0ZWdvcnkgTW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIE1vZGVsUmVnaXN0cnlNYW5hZ2VyPFQgZXh0ZW5kcyBNb2RlbD4gaW1wbGVtZW50cyBNb2RlbFJlZ2lzdHJ5PFQ+IHtcbiAgcHJpdmF0ZSBjYWNoZTogUmVjb3JkPHN0cmluZywgTW9kZWxDb25zdHJ1Y3RvcjxUPj4gPSB7fTtcbiAgcHJpdmF0ZSByZWFkb25seSB0ZXN0RnVuY3Rpb246IChvYmo6IG9iamVjdCkgPT4gYm9vbGVhbjtcblxuICBjb25zdHJ1Y3Rvcih0ZXN0RnVuY3Rpb246IChvYmo6IFJlY29yZDxzdHJpbmcsIGFueT4pID0+IGJvb2xlYW4gPSBpc01vZGVsKSB7XG4gICAgdGhpcy50ZXN0RnVuY3Rpb24gPSB0ZXN0RnVuY3Rpb247XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgcmVnaXN0ZXIgbmV3IE1vZGVsc1xuICAgKiBAcGFyYW0ge2FueX0gY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtuYW1lXSB3aGVuIG5vdCBkZWZpbmVkLCB0aGUgbmFtZSBvZiB0aGUgY29uc3RydWN0b3Igd2lsbCBiZSB1c2VkXG4gICAqL1xuICByZWdpc3Rlcihjb25zdHJ1Y3RvcjogTW9kZWxDb25zdHJ1Y3RvcjxUPiwgbmFtZT86IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0eXBlb2YgY29uc3RydWN0b3IgIT09IFwiZnVuY3Rpb25cIilcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJNb2RlbCByZWdpc3RlcmluZyBmYWlsZWQuIE1pc3NpbmcgQ2xhc3MgbmFtZSBvciBjb25zdHJ1Y3RvclwiXG4gICAgICApO1xuICAgIG5hbWUgPSBuYW1lIHx8IGNvbnN0cnVjdG9yLm5hbWU7XG4gICAgdGhpcy5jYWNoZVtuYW1lXSA9IGNvbnN0cnVjdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IEdldHMgYSByZWdpc3RlcmVkIE1vZGVsIHtAbGluayBNb2RlbENvbnN0cnVjdG9yfVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKi9cbiAgZ2V0KG5hbWU6IHN0cmluZyk6IE1vZGVsQ29uc3RydWN0b3I8VD4gfCB1bmRlZmluZWQge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5jYWNoZVtuYW1lXTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gb2JqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbY2xhenpdIHdoZW4gcHJvdmlkZWQsIGl0IHdpbGwgYXR0ZW1wdCB0byBmaW5kIHRoZSBtYXRjaGluZyBjb25zdHJ1Y3RvclxuICAgKlxuICAgKiBAdGhyb3dzIEVycm9yIElmIGNsYXp6IGlzIG5vdCBmb3VuZCwgb3Igb2JqIGlzIG5vdCBhIHtAbGluayBNb2RlbH0gbWVhbmluZyBpdCBoYXMgbm8ge0BsaW5rIE1vZGVsS2V5cy5BTkNIT1J9IHByb3BlcnR5XG4gICAqL1xuICBidWlsZChvYmo6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fSwgY2xheno/OiBzdHJpbmcpOiBUIHtcbiAgICBpZiAoIWNsYXp6ICYmICF0aGlzLnRlc3RGdW5jdGlvbihvYmopKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUHJvdmlkZWQgb2JqIGlzIG5vdCBhIE1vZGVsIG9iamVjdFwiKTtcbiAgICBjb25zdCBuYW1lID0gY2xhenogfHwgTW9kZWwuZ2V0TWV0YWRhdGEob2JqIGFzIGFueSk7XG4gICAgaWYgKCEobmFtZSBpbiB0aGlzLmNhY2hlKSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgc2YoXCJQcm92aWRlZCBjbGFzcyB7MH0gaXMgbm90IGEgcmVnaXN0ZXJlZCBNb2RlbCBvYmplY3RcIiwgbmFtZSlcbiAgICAgICk7XG4gICAgcmV0dXJuIG5ldyB0aGlzLmNhY2hlW25hbWVdKG9iaik7XG4gIH1cbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBCdWxrIFJlZ2lzdGVycyBNb2RlbHNcbiAqIEBkZXNjcmlwdGlvbiBVc2VmdWwgd2hlbiB1c2luZyBidW5kbGVycyB0aGF0IG1pZ2h0IG5vdCBldmFsdWF0ZSBhbGwgdGhlIGNvZGUgYXQgb25jZVxuICpcbiAqIEBwYXJhbSB7QXJyYXk8Q29uc3RydWN0b3I8VD4+IHwgQXJyYXk8e25hbWU6IHN0cmluZywgY29uc3RydWN0b3I6IENvbnN0cnVjdG9yPFQ+fT59IFttb2RlbHNdXG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvbi5Nb2RlbFxuICogQGNhdGVnb3J5IE1vZGVsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWxrTW9kZWxSZWdpc3RlcjxUIGV4dGVuZHMgTW9kZWw+KFxuICAuLi5tb2RlbHM6IChDb25zdHJ1Y3RvcjxUPiB8IHsgbmFtZTogc3RyaW5nOyBjb25zdHJ1Y3RvcjogQ29uc3RydWN0b3I8VD4gfSlbXVxuKSB7XG4gIG1vZGVscy5mb3JFYWNoKFxuICAgIChtOiBDb25zdHJ1Y3RvcjxUPiB8IHsgbmFtZTogc3RyaW5nOyBjb25zdHJ1Y3RvcjogQ29uc3RydWN0b3I8VD4gfSkgPT4ge1xuICAgICAgY29uc3QgY29uc3RydWN0b3I6IENvbnN0cnVjdG9yPFQ+ID0gKFxuICAgICAgICBtLmNvbnN0cnVjdG9yID8gbS5jb25zdHJ1Y3RvciA6IG1cbiAgICAgICkgYXMgQ29uc3RydWN0b3I8VD47XG4gICAgICBNb2RlbC5yZWdpc3Rlcihjb25zdHJ1Y3RvciwgKG0gYXMgQ29uc3RydWN0b3I8VD4pLm5hbWUpO1xuICAgIH1cbiAgKTtcbn1cbiJdfQ==
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
import { Validator } from "./Validator";
|
|
2
|
-
import { IRegistry } from "../../utils/registry";
|
|
3
|
-
import { Constructor } from "../../model/types";
|
|
4
|
-
/**
|
|
5
|
-
* @summary Util type for {@link Validator} configuration
|
|
6
|
-
* @memberOf module:decorator-validation.Validation
|
|
7
|
-
* @category Validation
|
|
8
|
-
*/
|
|
9
|
-
export type ValidatorDefinition = {
|
|
10
|
-
validator: Constructor<Validator>;
|
|
11
|
-
validationKey: string;
|
|
12
|
-
save: boolean;
|
|
13
|
-
};
|
|
14
|
-
/**
|
|
15
|
-
* @summary Base API for a {@link Validator} registry
|
|
16
|
-
*
|
|
17
|
-
* @interface ValidatorRegistry
|
|
18
|
-
* @extends IRegistry
|
|
19
|
-
*
|
|
20
|
-
* @category Validation
|
|
21
|
-
*/
|
|
22
|
-
export interface IValidatorRegistry<T extends Validator> extends IRegistry<T> {
|
|
23
|
-
/**
|
|
24
|
-
* @summary retrieves the custom keys
|
|
25
|
-
* @method
|
|
26
|
-
*/
|
|
27
|
-
getCustomKeys(): Record<string, string>;
|
|
28
|
-
/**
|
|
29
|
-
* @summary Retrieves the Registered validator keys
|
|
30
|
-
* @return {string[]} the registered validators keys
|
|
31
|
-
* @method
|
|
32
|
-
*/
|
|
33
|
-
getKeys(): string[];
|
|
34
|
-
/**
|
|
35
|
-
* @summary Registers the provided validators onto the registry
|
|
36
|
-
*
|
|
37
|
-
* @typedef T extends Validator
|
|
38
|
-
* @param {T[] | ValidatorDefinition[]} validator
|
|
39
|
-
* @method
|
|
40
|
-
*/
|
|
41
|
-
register<T extends Validator>(...validator: (T | ValidatorDefinition)[]): void;
|
|
42
|
-
/**
|
|
43
|
-
* @summary Retrieves the Validator constructor if registered
|
|
44
|
-
*
|
|
45
|
-
* @typedef T extends Validator
|
|
46
|
-
* @param {string} key one of the {@link ValidationKeys}
|
|
47
|
-
* @return {Validator | undefined} the registered Validator or undefined if there is nono matching the provided key
|
|
48
|
-
* @method
|
|
49
|
-
*/
|
|
50
|
-
get<T extends Validator>(key: string): T | undefined;
|
|
51
|
-
}
|
|
52
|
-
export type ValidatorOptions = {
|
|
53
|
-
message?: string;
|
|
54
|
-
};
|
|
55
|
-
export interface URLValidatorOptions extends ValidatorOptions {
|
|
56
|
-
types: string | string[] | {
|
|
57
|
-
name: string;
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
export interface TypeValidatorOptions extends ValidatorOptions {
|
|
61
|
-
types: string | string[] | {
|
|
62
|
-
name: string;
|
|
63
|
-
};
|
|
64
|
-
}
|
|
65
|
-
export interface StepValidatorOptions extends ValidatorOptions {
|
|
66
|
-
step: number | string;
|
|
67
|
-
}
|
|
68
|
-
export interface PatternValidatorOptions extends ValidatorOptions {
|
|
69
|
-
pattern?: RegExp | string;
|
|
70
|
-
}
|
|
71
|
-
export interface MinValidatorOptions extends ValidatorOptions {
|
|
72
|
-
min: number | Date | string;
|
|
73
|
-
}
|
|
74
|
-
export interface MinLengthValidatorOptions extends ValidatorOptions {
|
|
75
|
-
minLength: number;
|
|
76
|
-
}
|
|
77
|
-
export interface MaxValidatorOptions extends ValidatorOptions {
|
|
78
|
-
max: number | Date | string;
|
|
79
|
-
}
|
|
80
|
-
export interface MaxLengthValidatorOptions extends ValidatorOptions {
|
|
81
|
-
maxLength: number;
|
|
82
|
-
}
|
|
83
|
-
export interface ListValidatorOptions extends ValidatorOptions {
|
|
84
|
-
clazz: string[];
|
|
85
|
-
}
|
|
86
|
-
export interface DateValidatorOptions extends ValidatorOptions {
|
|
87
|
-
format?: string;
|
|
88
|
-
}
|
package/lib/model/Registry.d.ts
DELETED
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
import { Model } from "./Model";
|
|
2
|
-
import { BuilderRegistry } from "../utils/registry";
|
|
3
|
-
import { Constructor, ModelConstructor } from "./types";
|
|
4
|
-
/**
|
|
5
|
-
* @summary ModelRegistry Interface
|
|
6
|
-
*
|
|
7
|
-
* @interface ModelRegistry
|
|
8
|
-
* @extends BuilderRegistry<Model>
|
|
9
|
-
*
|
|
10
|
-
* @category Model
|
|
11
|
-
*/
|
|
12
|
-
export type ModelRegistry<T extends Model> = BuilderRegistry<T>;
|
|
13
|
-
/**
|
|
14
|
-
* @summary Util class to enable serialization and correct rebuilding
|
|
15
|
-
*
|
|
16
|
-
* @param {string} anchorKey defaults to {@link ModelKeys.ANCHOR}. The property name where the registered class name is stored;
|
|
17
|
-
* @param {function(Record<string, any>): boolean} [testFunction] method to test if the provided object is a Model Object. defaults to {@link isModel}
|
|
18
|
-
*
|
|
19
|
-
* @class ModelRegistryManager
|
|
20
|
-
* @implements ModelRegistry
|
|
21
|
-
*
|
|
22
|
-
* @category Model
|
|
23
|
-
*/
|
|
24
|
-
export declare class ModelRegistryManager<T extends Model> implements ModelRegistry<T> {
|
|
25
|
-
private cache;
|
|
26
|
-
private readonly testFunction;
|
|
27
|
-
constructor(testFunction?: (obj: Record<string, any>) => boolean);
|
|
28
|
-
/**
|
|
29
|
-
* @summary register new Models
|
|
30
|
-
* @param {any} constructor
|
|
31
|
-
* @param {string} [name] when not defined, the name of the constructor will be used
|
|
32
|
-
*/
|
|
33
|
-
register(constructor: ModelConstructor<T>, name?: string): void;
|
|
34
|
-
/**
|
|
35
|
-
* @summary Gets a registered Model {@link ModelConstructor}
|
|
36
|
-
* @param {string} name
|
|
37
|
-
*/
|
|
38
|
-
get(name: string): ModelConstructor<T> | undefined;
|
|
39
|
-
/**
|
|
40
|
-
* @param {Record<string, any>} obj
|
|
41
|
-
* @param {string} [clazz] when provided, it will attempt to find the matching constructor
|
|
42
|
-
*
|
|
43
|
-
* @throws Error If clazz is not found, or obj is not a {@link Model} meaning it has no {@link ModelKeys.ANCHOR} property
|
|
44
|
-
*/
|
|
45
|
-
build(obj?: Record<string, any>, clazz?: string): T;
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* @summary Bulk Registers Models
|
|
49
|
-
* @description Useful when using bundlers that might not evaluate all the code at once
|
|
50
|
-
*
|
|
51
|
-
* @param {Array<Constructor<T>> | Array<{name: string, constructor: Constructor<T>}>} [models]
|
|
52
|
-
*
|
|
53
|
-
* @memberOf module:decorator-validation.Model
|
|
54
|
-
* @category Model
|
|
55
|
-
*/
|
|
56
|
-
export declare function bulkModelRegister<T extends Model>(...models: (Constructor<T> | {
|
|
57
|
-
name: string;
|
|
58
|
-
constructor: Constructor<T>;
|
|
59
|
-
})[]): void;
|
package/lib/model/Registry.js
DELETED
|
@@ -1,80 +0,0 @@
|
|
|
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");
|
|
6
|
-
const strings_1 = require("../utils/strings");
|
|
7
|
-
const utils_1 = require("./utils");
|
|
8
|
-
/**
|
|
9
|
-
* @summary Util class to enable serialization and correct rebuilding
|
|
10
|
-
*
|
|
11
|
-
* @param {string} anchorKey defaults to {@link ModelKeys.ANCHOR}. The property name where the registered class name is stored;
|
|
12
|
-
* @param {function(Record<string, any>): boolean} [testFunction] method to test if the provided object is a Model Object. defaults to {@link isModel}
|
|
13
|
-
*
|
|
14
|
-
* @class ModelRegistryManager
|
|
15
|
-
* @implements ModelRegistry
|
|
16
|
-
*
|
|
17
|
-
* @category Model
|
|
18
|
-
*/
|
|
19
|
-
class ModelRegistryManager {
|
|
20
|
-
constructor(testFunction = utils_1.isModel) {
|
|
21
|
-
this.cache = {};
|
|
22
|
-
this.testFunction = testFunction;
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* @summary register new Models
|
|
26
|
-
* @param {any} constructor
|
|
27
|
-
* @param {string} [name] when not defined, the name of the constructor will be used
|
|
28
|
-
*/
|
|
29
|
-
register(constructor, name) {
|
|
30
|
-
if (typeof constructor !== "function")
|
|
31
|
-
throw new Error("Model registering failed. Missing Class name or constructor");
|
|
32
|
-
name = name || constructor.name;
|
|
33
|
-
this.cache[name] = constructor;
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* @summary Gets a registered Model {@link ModelConstructor}
|
|
37
|
-
* @param {string} name
|
|
38
|
-
*/
|
|
39
|
-
get(name) {
|
|
40
|
-
try {
|
|
41
|
-
return this.cache[name];
|
|
42
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
43
|
-
}
|
|
44
|
-
catch (e) {
|
|
45
|
-
return undefined;
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* @param {Record<string, any>} obj
|
|
50
|
-
* @param {string} [clazz] when provided, it will attempt to find the matching constructor
|
|
51
|
-
*
|
|
52
|
-
* @throws Error If clazz is not found, or obj is not a {@link Model} meaning it has no {@link ModelKeys.ANCHOR} property
|
|
53
|
-
*/
|
|
54
|
-
build(obj = {}, clazz) {
|
|
55
|
-
if (!clazz && !this.testFunction(obj))
|
|
56
|
-
throw new Error("Provided obj is not a Model object");
|
|
57
|
-
const name = clazz || Model_1.Model.getMetadata(obj);
|
|
58
|
-
if (!(name in this.cache))
|
|
59
|
-
throw new Error((0, strings_1.sf)("Provided class {0} is not a registered Model object", name));
|
|
60
|
-
return new this.cache[name](obj);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
exports.ModelRegistryManager = ModelRegistryManager;
|
|
64
|
-
/**
|
|
65
|
-
* @summary Bulk Registers Models
|
|
66
|
-
* @description Useful when using bundlers that might not evaluate all the code at once
|
|
67
|
-
*
|
|
68
|
-
* @param {Array<Constructor<T>> | Array<{name: string, constructor: Constructor<T>}>} [models]
|
|
69
|
-
*
|
|
70
|
-
* @memberOf module:decorator-validation.Model
|
|
71
|
-
* @category Model
|
|
72
|
-
*/
|
|
73
|
-
function bulkModelRegister(...models) {
|
|
74
|
-
models.forEach((m) => {
|
|
75
|
-
const constructor = (m.constructor ? m.constructor : m);
|
|
76
|
-
Model_1.Model.register(constructor, m.name);
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9tb2RlbC9SZWdpc3RyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUF5RkEsOENBV0M7QUFwR0QsbUNBQWdDO0FBR2hDLDhDQUFzQztBQUN0QyxtQ0FBa0M7QUFZbEM7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQWEsb0JBQW9CO0lBSS9CLFlBQVksZUFBc0QsZUFBTztRQUhqRSxVQUFLLEdBQXdDLEVBQUUsQ0FBQztRQUl0RCxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztJQUNuQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFFBQVEsQ0FBQyxXQUFnQyxFQUFFLElBQWE7UUFDdEQsSUFBSSxPQUFPLFdBQVcsS0FBSyxVQUFVO1lBQ25DLE1BQU0sSUFBSSxLQUFLLENBQ2IsNkRBQTZELENBQzlELENBQUM7UUFDSixJQUFJLEdBQUcsSUFBSSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUM7UUFDaEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxXQUFXLENBQUM7SUFDakMsQ0FBQztJQUVEOzs7T0FHRztJQUNILEdBQUcsQ0FBQyxJQUFZO1FBQ2QsSUFBSSxDQUFDO1lBQ0gsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3hCLDZEQUE2RDtRQUMvRCxDQUFDO1FBQUMsT0FBTyxDQUFNLEVBQUUsQ0FBQztZQUNoQixPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLE1BQTJCLEVBQUUsRUFBRSxLQUFjO1FBQ2pELElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQztZQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7UUFDeEQsTUFBTSxJQUFJLEdBQUcsS0FBSyxJQUFJLGFBQUssQ0FBQyxXQUFXLENBQUMsR0FBVSxDQUFDLENBQUM7UUFDcEQsSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUM7WUFDdkIsTUFBTSxJQUFJLEtBQUssQ0FDYixJQUFBLFlBQUUsRUFBQyxxREFBcUQsRUFBRSxJQUFJLENBQUMsQ0FDaEUsQ0FBQztRQUNKLE9BQU8sSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ25DLENBQUM7Q0FDRjtBQW5ERCxvREFtREM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQWdCLGlCQUFpQixDQUMvQixHQUFHLE1BQTBFO0lBRTdFLE1BQU0sQ0FBQyxPQUFPLENBQ1osQ0FBQyxDQUFpRSxFQUFFLEVBQUU7UUFDcEUsTUFBTSxXQUFXLEdBQW1CLENBQ2xDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDaEIsQ0FBQztRQUNwQixhQUFLLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRyxDQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFELENBQUMsQ0FDRixDQUFDO0FBQ0osQ0FBQyIsImZpbGUiOiJtb2RlbC9SZWdpc3RyeS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIi4vTW9kZWxcIjtcbmltcG9ydCB7IEJ1aWxkZXJSZWdpc3RyeSB9IGZyb20gXCIuLi91dGlscy9yZWdpc3RyeVwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1vZGVsQ29uc3RydWN0b3IgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgc2YgfSBmcm9tIFwiLi4vdXRpbHMvc3RyaW5nc1wiO1xuaW1wb3J0IHsgaXNNb2RlbCB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbi8qKlxuICogQHN1bW1hcnkgTW9kZWxSZWdpc3RyeSBJbnRlcmZhY2VcbiAqXG4gKiBAaW50ZXJmYWNlIE1vZGVsUmVnaXN0cnlcbiAqIEBleHRlbmRzIEJ1aWxkZXJSZWdpc3RyeTxNb2RlbD5cbiAqXG4gKiBAY2F0ZWdvcnkgTW9kZWxcbiAqL1xuZXhwb3J0IHR5cGUgTW9kZWxSZWdpc3RyeTxUIGV4dGVuZHMgTW9kZWw+ID0gQnVpbGRlclJlZ2lzdHJ5PFQ+O1xuXG4vKipcbiAqIEBzdW1tYXJ5IFV0aWwgY2xhc3MgdG8gZW5hYmxlIHNlcmlhbGl6YXRpb24gYW5kIGNvcnJlY3QgcmVidWlsZGluZ1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhbmNob3JLZXkgZGVmYXVsdHMgdG8ge0BsaW5rIE1vZGVsS2V5cy5BTkNIT1J9LiBUaGUgcHJvcGVydHkgbmFtZSB3aGVyZSB0aGUgcmVnaXN0ZXJlZCBjbGFzcyBuYW1lIGlzIHN0b3JlZDtcbiAqIEBwYXJhbSB7ZnVuY3Rpb24oUmVjb3JkPHN0cmluZywgYW55Pik6IGJvb2xlYW59IFt0ZXN0RnVuY3Rpb25dIG1ldGhvZCB0byB0ZXN0IGlmIHRoZSBwcm92aWRlZCBvYmplY3QgaXMgYSBNb2RlbCBPYmplY3QuIGRlZmF1bHRzIHRvIHtAbGluayBpc01vZGVsfVxuICpcbiAqIEBjbGFzcyBNb2RlbFJlZ2lzdHJ5TWFuYWdlclxuICogQGltcGxlbWVudHMgTW9kZWxSZWdpc3RyeVxuICpcbiAqIEBjYXRlZ29yeSBNb2RlbFxuICovXG5leHBvcnQgY2xhc3MgTW9kZWxSZWdpc3RyeU1hbmFnZXI8VCBleHRlbmRzIE1vZGVsPiBpbXBsZW1lbnRzIE1vZGVsUmVnaXN0cnk8VD4ge1xuICBwcml2YXRlIGNhY2hlOiBSZWNvcmQ8c3RyaW5nLCBNb2RlbENvbnN0cnVjdG9yPFQ+PiA9IHt9O1xuICBwcml2YXRlIHJlYWRvbmx5IHRlc3RGdW5jdGlvbjogKG9iajogb2JqZWN0KSA9PiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKHRlc3RGdW5jdGlvbjogKG9iajogUmVjb3JkPHN0cmluZywgYW55PikgPT4gYm9vbGVhbiA9IGlzTW9kZWwpIHtcbiAgICB0aGlzLnRlc3RGdW5jdGlvbiA9IHRlc3RGdW5jdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSByZWdpc3RlciBuZXcgTW9kZWxzXG4gICAqIEBwYXJhbSB7YW55fSBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW25hbWVdIHdoZW4gbm90IGRlZmluZWQsIHRoZSBuYW1lIG9mIHRoZSBjb25zdHJ1Y3RvciB3aWxsIGJlIHVzZWRcbiAgICovXG4gIHJlZ2lzdGVyKGNvbnN0cnVjdG9yOiBNb2RlbENvbnN0cnVjdG9yPFQ+LCBuYW1lPzogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHR5cGVvZiBjb25zdHJ1Y3RvciAhPT0gXCJmdW5jdGlvblwiKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIk1vZGVsIHJlZ2lzdGVyaW5nIGZhaWxlZC4gTWlzc2luZyBDbGFzcyBuYW1lIG9yIGNvbnN0cnVjdG9yXCJcbiAgICAgICk7XG4gICAgbmFtZSA9IG5hbWUgfHwgY29uc3RydWN0b3IubmFtZTtcbiAgICB0aGlzLmNhY2hlW25hbWVdID0gY29uc3RydWN0b3I7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgR2V0cyBhIHJlZ2lzdGVyZWQgTW9kZWwge0BsaW5rIE1vZGVsQ29uc3RydWN0b3J9XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqL1xuICBnZXQobmFtZTogc3RyaW5nKTogTW9kZWxDb25zdHJ1Y3RvcjxUPiB8IHVuZGVmaW5lZCB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLmNhY2hlW25hbWVdO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBvYmpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtjbGF6el0gd2hlbiBwcm92aWRlZCwgaXQgd2lsbCBhdHRlbXB0IHRvIGZpbmQgdGhlIG1hdGNoaW5nIGNvbnN0cnVjdG9yXG4gICAqXG4gICAqIEB0aHJvd3MgRXJyb3IgSWYgY2xhenogaXMgbm90IGZvdW5kLCBvciBvYmogaXMgbm90IGEge0BsaW5rIE1vZGVsfSBtZWFuaW5nIGl0IGhhcyBubyB7QGxpbmsgTW9kZWxLZXlzLkFOQ0hPUn0gcHJvcGVydHlcbiAgICovXG4gIGJ1aWxkKG9iajogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9LCBjbGF6ej86IHN0cmluZyk6IFQge1xuICAgIGlmICghY2xhenogJiYgIXRoaXMudGVzdEZ1bmN0aW9uKG9iaikpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQcm92aWRlZCBvYmogaXMgbm90IGEgTW9kZWwgb2JqZWN0XCIpO1xuICAgIGNvbnN0IG5hbWUgPSBjbGF6eiB8fCBNb2RlbC5nZXRNZXRhZGF0YShvYmogYXMgYW55KTtcbiAgICBpZiAoIShuYW1lIGluIHRoaXMuY2FjaGUpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBzZihcIlByb3ZpZGVkIGNsYXNzIHswfSBpcyBub3QgYSByZWdpc3RlcmVkIE1vZGVsIG9iamVjdFwiLCBuYW1lKVxuICAgICAgKTtcbiAgICByZXR1cm4gbmV3IHRoaXMuY2FjaGVbbmFtZV0ob2JqKTtcbiAgfVxufVxuXG4vKipcbiAqIEBzdW1tYXJ5IEJ1bGsgUmVnaXN0ZXJzIE1vZGVsc1xuICogQGRlc2NyaXB0aW9uIFVzZWZ1bCB3aGVuIHVzaW5nIGJ1bmRsZXJzIHRoYXQgbWlnaHQgbm90IGV2YWx1YXRlIGFsbCB0aGUgY29kZSBhdCBvbmNlXG4gKlxuICogQHBhcmFtIHtBcnJheTxDb25zdHJ1Y3RvcjxUPj4gfCBBcnJheTx7bmFtZTogc3RyaW5nLCBjb25zdHJ1Y3RvcjogQ29uc3RydWN0b3I8VD59Pn0gW21vZGVsc11cbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uLk1vZGVsXG4gKiBAY2F0ZWdvcnkgTW9kZWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1bGtNb2RlbFJlZ2lzdGVyPFQgZXh0ZW5kcyBNb2RlbD4oXG4gIC4uLm1vZGVsczogKENvbnN0cnVjdG9yPFQ+IHwgeyBuYW1lOiBzdHJpbmc7IGNvbnN0cnVjdG9yOiBDb25zdHJ1Y3RvcjxUPiB9KVtdXG4pIHtcbiAgbW9kZWxzLmZvckVhY2goXG4gICAgKG06IENvbnN0cnVjdG9yPFQ+IHwgeyBuYW1lOiBzdHJpbmc7IGNvbnN0cnVjdG9yOiBDb25zdHJ1Y3RvcjxUPiB9KSA9PiB7XG4gICAgICBjb25zdCBjb25zdHJ1Y3RvcjogQ29uc3RydWN0b3I8VD4gPSAoXG4gICAgICAgIG0uY29uc3RydWN0b3IgPyBtLmNvbnN0cnVjdG9yIDogbVxuICAgICAgKSBhcyBDb25zdHJ1Y3RvcjxUPjtcbiAgICAgIE1vZGVsLnJlZ2lzdGVyKGNvbnN0cnVjdG9yLCAobSBhcyBDb25zdHJ1Y3RvcjxUPikubmFtZSk7XG4gICAgfVxuICApO1xufVxuIl19
|