@decaf-ts/decorator-validation 1.7.7 → 1.7.9
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.cjs +629 -254
- package/dist/decorator-validation.esm.cjs +622 -255
- package/lib/constants/validation.cjs +3 -2
- package/lib/constants/validation.d.ts +1 -0
- package/lib/esm/constants/validation.d.ts +1 -0
- package/lib/esm/constants/validation.js +2 -1
- package/lib/esm/index.d.ts +1 -1
- package/lib/esm/index.js +1 -1
- package/lib/esm/mcp/ModelContextProtocol.d.ts +14 -22
- package/lib/esm/mcp/ModelContextProtocol.js +55 -51
- package/lib/esm/model/Model.d.ts +11 -8
- package/lib/esm/model/Model.js +12 -6
- package/lib/esm/model/decorators.js +1 -1
- package/lib/esm/model/types.d.ts +37 -9
- package/lib/esm/model/types.js +1 -1
- package/lib/esm/model/utils.d.ts +14 -1
- package/lib/esm/model/utils.js +15 -1
- package/lib/esm/model/validation.d.ts +107 -5
- package/lib/esm/model/validation.js +329 -124
- package/lib/esm/types/index.d.ts +1 -0
- package/lib/esm/types/index.js +2 -0
- package/lib/esm/types/validation.d.ts +25 -0
- package/lib/esm/types/validation.js +2 -0
- package/lib/esm/validation/Validators/AsyncValidator.d.ts +72 -0
- package/lib/esm/validation/Validators/AsyncValidator.js +61 -0
- package/lib/esm/validation/Validators/BaseValidator.d.ts +118 -0
- package/lib/esm/validation/Validators/BaseValidator.js +117 -0
- package/lib/esm/validation/Validators/ListValidator.js +2 -2
- package/lib/esm/validation/Validators/MinLengthValidator.d.ts +1 -1
- package/lib/esm/validation/Validators/MinLengthValidator.js +2 -2
- package/lib/esm/validation/Validators/TypeValidator.js +1 -1
- package/lib/esm/validation/Validators/Validator.d.ts +28 -68
- package/lib/esm/validation/Validators/Validator.js +30 -86
- package/lib/esm/validation/Validators/constants.d.ts +12 -11
- package/lib/esm/validation/Validators/constants.js +14 -12
- package/lib/esm/validation/Validators/index.d.ts +1 -0
- package/lib/esm/validation/Validators/index.js +2 -1
- package/lib/esm/validation/decorators.d.ts +2 -1
- package/lib/esm/validation/decorators.js +31 -8
- package/lib/esm/validation/types.d.ts +19 -0
- package/lib/esm/validation/types.js +1 -1
- package/lib/index.cjs +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/mcp/ModelContextProtocol.cjs +55 -51
- package/lib/mcp/ModelContextProtocol.d.ts +14 -22
- package/lib/model/Model.cjs +11 -5
- package/lib/model/Model.d.ts +11 -8
- package/lib/model/decorators.cjs +1 -1
- package/lib/model/types.cjs +1 -1
- package/lib/model/types.d.ts +37 -9
- package/lib/model/utils.cjs +16 -1
- package/lib/model/utils.d.ts +14 -1
- package/lib/model/validation.cjs +334 -125
- package/lib/model/validation.d.ts +107 -5
- package/lib/types/index.cjs +18 -0
- package/lib/types/index.d.ts +1 -0
- package/lib/types/validation.cjs +3 -0
- package/lib/types/validation.d.ts +25 -0
- package/lib/validation/Validators/AsyncValidator.cjs +65 -0
- package/lib/validation/Validators/AsyncValidator.d.ts +72 -0
- package/lib/validation/Validators/BaseValidator.cjs +121 -0
- package/lib/validation/Validators/BaseValidator.d.ts +118 -0
- package/lib/validation/Validators/ListValidator.cjs +2 -2
- package/lib/validation/Validators/MinLengthValidator.cjs +2 -2
- package/lib/validation/Validators/MinLengthValidator.d.ts +1 -1
- package/lib/validation/Validators/TypeValidator.cjs +1 -1
- package/lib/validation/Validators/Validator.cjs +30 -86
- package/lib/validation/Validators/Validator.d.ts +28 -68
- package/lib/validation/Validators/constants.cjs +14 -12
- package/lib/validation/Validators/constants.d.ts +12 -11
- package/lib/validation/Validators/index.cjs +2 -1
- package/lib/validation/Validators/index.d.ts +1 -0
- package/lib/validation/decorators.cjs +32 -8
- package/lib/validation/decorators.d.ts +2 -1
- package/lib/validation/types.cjs +1 -1
- package/lib/validation/types.d.ts +19 -0
- package/package.json +1 -1
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import type { ValidatorOptions } from "../types";
|
|
2
|
+
import type { PathProxy } from "../../utils";
|
|
3
|
+
import { BaseValidator } from "./BaseValidator";
|
|
4
|
+
/**
|
|
5
|
+
* @description
|
|
6
|
+
* Abstract class for defining asynchronous validators.
|
|
7
|
+
*
|
|
8
|
+
* This class extends the base `Validator` and enforces that any implementation
|
|
9
|
+
* of `hasErrors` must be asynchronous, always returning a Promise.
|
|
10
|
+
*
|
|
11
|
+
* Use this when the validation process involves asynchronous operations,
|
|
12
|
+
* such as API calls, database lookups, or time-based checks (e.g., timeouts).
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```typescript
|
|
16
|
+
* // Example of an asynchronous validator that compares value against a timeout
|
|
17
|
+
* class TimeoutValidator extends AsyncValidator<{ timeout?: number }> {
|
|
18
|
+
* constructor(message: string = "Validation failed due to timeout") {
|
|
19
|
+
* super(message);
|
|
20
|
+
* }
|
|
21
|
+
*
|
|
22
|
+
* async hasErrors(value: number, options?: { timeout?: number }) {
|
|
23
|
+
* const delay = options?.timeout ?? 100;
|
|
24
|
+
*
|
|
25
|
+
* // async call
|
|
26
|
+
* await new Promise(res => setTimeout(res, delay));
|
|
27
|
+
*
|
|
28
|
+
* if (value > delay) {
|
|
29
|
+
* // Rejects the validation after waiting the delay if value is greater
|
|
30
|
+
* return Promise.resolve(this.getMessage());
|
|
31
|
+
* }
|
|
32
|
+
*
|
|
33
|
+
* // Passes the validation after waiting the delay
|
|
34
|
+
* return Promise.resolve(undefined);
|
|
35
|
+
* }
|
|
36
|
+
* }
|
|
37
|
+
*
|
|
38
|
+
* // Example usage:
|
|
39
|
+
* const validator = new TimeoutValidator();
|
|
40
|
+
*
|
|
41
|
+
* async function runValidation() {
|
|
42
|
+
* const error = await validator.hasErrors(50, { timeout: 100 });
|
|
43
|
+
* if (error) {
|
|
44
|
+
* return console.error('Validation error:', error);
|
|
45
|
+
* }
|
|
46
|
+
* console.log('Value is valid');
|
|
47
|
+
* }
|
|
48
|
+
*
|
|
49
|
+
* await runValidation();
|
|
50
|
+
* ```
|
|
51
|
+
*
|
|
52
|
+
* - If `value > timeout`, the validator waits for the delay and then rejects with an error.
|
|
53
|
+
* - If `value <= timeout`, the validator waits for the delay and resolves successfully with `undefined`.
|
|
54
|
+
*
|
|
55
|
+
* @see {@link Validator} For the base synchronous validator.
|
|
56
|
+
*/
|
|
57
|
+
export declare abstract class AsyncValidator<V extends ValidatorOptions> extends BaseValidator<V, true> {
|
|
58
|
+
protected constructor(message?: string, ...acceptedTypes: string[]);
|
|
59
|
+
/**
|
|
60
|
+
* @description
|
|
61
|
+
* Asynchronously validates a value.
|
|
62
|
+
*
|
|
63
|
+
* @template V - Type of the option object that can be passed to the validator
|
|
64
|
+
* @param {any} value - The value to validate
|
|
65
|
+
* @param {V} [options] - Optional configuration options for customizing validation behavior
|
|
66
|
+
* @param {PathProxy<any>} proxy -
|
|
67
|
+
* @return Promise<string | undefined> Error message if validation fails, undefined if validation passes
|
|
68
|
+
*
|
|
69
|
+
* @see {@link Validator}
|
|
70
|
+
*/
|
|
71
|
+
abstract hasErrors(value: any, options?: V, proxy?: PathProxy<any>): Promise<string | undefined>;
|
|
72
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { BaseValidator } from "./BaseValidator.js";
|
|
2
|
+
import { DEFAULT_ERROR_MESSAGES } from "./constants.js";
|
|
3
|
+
/**
|
|
4
|
+
* @description
|
|
5
|
+
* Abstract class for defining asynchronous validators.
|
|
6
|
+
*
|
|
7
|
+
* This class extends the base `Validator` and enforces that any implementation
|
|
8
|
+
* of `hasErrors` must be asynchronous, always returning a Promise.
|
|
9
|
+
*
|
|
10
|
+
* Use this when the validation process involves asynchronous operations,
|
|
11
|
+
* such as API calls, database lookups, or time-based checks (e.g., timeouts).
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```typescript
|
|
15
|
+
* // Example of an asynchronous validator that compares value against a timeout
|
|
16
|
+
* class TimeoutValidator extends AsyncValidator<{ timeout?: number }> {
|
|
17
|
+
* constructor(message: string = "Validation failed due to timeout") {
|
|
18
|
+
* super(message);
|
|
19
|
+
* }
|
|
20
|
+
*
|
|
21
|
+
* async hasErrors(value: number, options?: { timeout?: number }) {
|
|
22
|
+
* const delay = options?.timeout ?? 100;
|
|
23
|
+
*
|
|
24
|
+
* // async call
|
|
25
|
+
* await new Promise(res => setTimeout(res, delay));
|
|
26
|
+
*
|
|
27
|
+
* if (value > delay) {
|
|
28
|
+
* // Rejects the validation after waiting the delay if value is greater
|
|
29
|
+
* return Promise.resolve(this.getMessage());
|
|
30
|
+
* }
|
|
31
|
+
*
|
|
32
|
+
* // Passes the validation after waiting the delay
|
|
33
|
+
* return Promise.resolve(undefined);
|
|
34
|
+
* }
|
|
35
|
+
* }
|
|
36
|
+
*
|
|
37
|
+
* // Example usage:
|
|
38
|
+
* const validator = new TimeoutValidator();
|
|
39
|
+
*
|
|
40
|
+
* async function runValidation() {
|
|
41
|
+
* const error = await validator.hasErrors(50, { timeout: 100 });
|
|
42
|
+
* if (error) {
|
|
43
|
+
* return console.error('Validation error:', error);
|
|
44
|
+
* }
|
|
45
|
+
* console.log('Value is valid');
|
|
46
|
+
* }
|
|
47
|
+
*
|
|
48
|
+
* await runValidation();
|
|
49
|
+
* ```
|
|
50
|
+
*
|
|
51
|
+
* - If `value > timeout`, the validator waits for the delay and then rejects with an error.
|
|
52
|
+
* - If `value <= timeout`, the validator waits for the delay and resolves successfully with `undefined`.
|
|
53
|
+
*
|
|
54
|
+
* @see {@link Validator} For the base synchronous validator.
|
|
55
|
+
*/
|
|
56
|
+
export class AsyncValidator extends BaseValidator {
|
|
57
|
+
constructor(message = DEFAULT_ERROR_MESSAGES.DEFAULT, ...acceptedTypes) {
|
|
58
|
+
super(true, message, ...acceptedTypes);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXN5bmNWYWxpZGF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdmFsaWRhdGlvbi9WYWxpZGF0b3JzL0FzeW5jVmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxhQUFhLEVBQUUsMkJBQXdCO0FBQ2hELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSx1QkFBb0I7QUFFckQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvREc7QUFDSCxNQUFNLE9BQWdCLGNBRXBCLFNBQVEsYUFBc0I7SUFDOUIsWUFDRSxVQUFrQixzQkFBc0IsQ0FBQyxPQUFPLEVBQ2hELEdBQUcsYUFBdUI7UUFFMUIsS0FBSyxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsR0FBRyxhQUFhLENBQUMsQ0FBQztJQUN6QyxDQUFDO0NBbUJGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBWYWxpZGF0b3JPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IFBhdGhQcm94eSB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xuaW1wb3J0IHsgQmFzZVZhbGlkYXRvciB9IGZyb20gXCIuL0Jhc2VWYWxpZGF0b3JcIjtcbmltcG9ydCB7IERFRkFVTFRfRVJST1JfTUVTU0FHRVMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEFic3RyYWN0IGNsYXNzIGZvciBkZWZpbmluZyBhc3luY2hyb25vdXMgdmFsaWRhdG9ycy5cbiAqXG4gKiBUaGlzIGNsYXNzIGV4dGVuZHMgdGhlIGJhc2UgYFZhbGlkYXRvcmAgYW5kIGVuZm9yY2VzIHRoYXQgYW55IGltcGxlbWVudGF0aW9uXG4gKiBvZiBgaGFzRXJyb3JzYCBtdXN0IGJlIGFzeW5jaHJvbm91cywgYWx3YXlzIHJldHVybmluZyBhIFByb21pc2UuXG4gKlxuICogVXNlIHRoaXMgd2hlbiB0aGUgdmFsaWRhdGlvbiBwcm9jZXNzIGludm9sdmVzIGFzeW5jaHJvbm91cyBvcGVyYXRpb25zLFxuICogc3VjaCBhcyBBUEkgY2FsbHMsIGRhdGFiYXNlIGxvb2t1cHMsIG9yIHRpbWUtYmFzZWQgY2hlY2tzIChlLmcuLCB0aW1lb3V0cykuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIEV4YW1wbGUgb2YgYW4gYXN5bmNocm9ub3VzIHZhbGlkYXRvciB0aGF0IGNvbXBhcmVzIHZhbHVlIGFnYWluc3QgYSB0aW1lb3V0XG4gKiBjbGFzcyBUaW1lb3V0VmFsaWRhdG9yIGV4dGVuZHMgQXN5bmNWYWxpZGF0b3I8eyB0aW1lb3V0PzogbnVtYmVyIH0+IHtcbiAqICAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nID0gXCJWYWxpZGF0aW9uIGZhaWxlZCBkdWUgdG8gdGltZW91dFwiKSB7XG4gKiAgICAgc3VwZXIobWVzc2FnZSk7XG4gKiAgIH1cbiAqXG4gKiAgIGFzeW5jIGhhc0Vycm9ycyh2YWx1ZTogbnVtYmVyLCBvcHRpb25zPzogeyB0aW1lb3V0PzogbnVtYmVyIH0pIHtcbiAqICAgICBjb25zdCBkZWxheSA9IG9wdGlvbnM/LnRpbWVvdXQgPz8gMTAwO1xuICpcbiAqICAgICAvLyBhc3luYyBjYWxsXG4gKiAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzID0+IHNldFRpbWVvdXQocmVzLCBkZWxheSkpO1xuICpcbiAqICAgICBpZiAodmFsdWUgPiBkZWxheSkge1xuICogICAgICAgLy8gUmVqZWN0cyB0aGUgdmFsaWRhdGlvbiBhZnRlciB3YWl0aW5nIHRoZSBkZWxheSBpZiB2YWx1ZSBpcyBncmVhdGVyXG4gKiAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuZ2V0TWVzc2FnZSgpKTtcbiAqICAgICB9XG4gKlxuICogICAgIC8vIFBhc3NlcyB0aGUgdmFsaWRhdGlvbiBhZnRlciB3YWl0aW5nIHRoZSBkZWxheVxuICogICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTtcbiAqICAgfVxuICogfVxuICpcbiAqIC8vIEV4YW1wbGUgdXNhZ2U6XG4gKiBjb25zdCB2YWxpZGF0b3IgPSBuZXcgVGltZW91dFZhbGlkYXRvcigpO1xuICpcbiAqIGFzeW5jIGZ1bmN0aW9uIHJ1blZhbGlkYXRpb24oKSB7XG4gKiAgY29uc3QgZXJyb3IgPSBhd2FpdCB2YWxpZGF0b3IuaGFzRXJyb3JzKDUwLCB7IHRpbWVvdXQ6IDEwMCB9KTtcbiAqICBpZiAoZXJyb3IpIHtcbiAqICAgIHJldHVybiBjb25zb2xlLmVycm9yKCdWYWxpZGF0aW9uIGVycm9yOicsIGVycm9yKTtcbiAqICB9XG4gKiAgY29uc29sZS5sb2coJ1ZhbHVlIGlzIHZhbGlkJyk7XG4gKiB9XG4gKlxuICogYXdhaXQgcnVuVmFsaWRhdGlvbigpO1xuICogYGBgXG4gKlxuICogLSBJZiBgdmFsdWUgPiB0aW1lb3V0YCwgdGhlIHZhbGlkYXRvciB3YWl0cyBmb3IgdGhlIGRlbGF5IGFuZCB0aGVuIHJlamVjdHMgd2l0aCBhbiBlcnJvci5cbiAqIC0gSWYgYHZhbHVlIDw9IHRpbWVvdXRgLCB0aGUgdmFsaWRhdG9yIHdhaXRzIGZvciB0aGUgZGVsYXkgYW5kIHJlc29sdmVzIHN1Y2Nlc3NmdWxseSB3aXRoIGB1bmRlZmluZWRgLlxuICpcbiAqIEBzZWUge0BsaW5rIFZhbGlkYXRvcn0gRm9yIHRoZSBiYXNlIHN5bmNocm9ub3VzIHZhbGlkYXRvci5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFzeW5jVmFsaWRhdG9yPFxuICBWIGV4dGVuZHMgVmFsaWRhdG9yT3B0aW9ucyxcbj4gZXh0ZW5kcyBCYXNlVmFsaWRhdG9yPFYsIHRydWU+IHtcbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuREVGQVVMVCxcbiAgICAuLi5hY2NlcHRlZFR5cGVzOiBzdHJpbmdbXVxuICApIHtcbiAgICBzdXBlcih0cnVlLCBtZXNzYWdlLCAuLi5hY2NlcHRlZFR5cGVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQXN5bmNocm9ub3VzbHkgdmFsaWRhdGVzIGEgdmFsdWUuXG4gICAqXG4gICAqIEB0ZW1wbGF0ZSBWIC0gVHlwZSBvZiB0aGUgb3B0aW9uIG9iamVjdCB0aGF0IGNhbiBiZSBwYXNzZWQgdG8gdGhlIHZhbGlkYXRvclxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gdmFsaWRhdGVcbiAgICogQHBhcmFtIHtWfSBbb3B0aW9uc10gLSBPcHRpb25hbCBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIGN1c3RvbWl6aW5nIHZhbGlkYXRpb24gYmVoYXZpb3JcbiAgICogQHBhcmFtIHtQYXRoUHJveHk8YW55Pn0gcHJveHkgLVxuICAgKiBAcmV0dXJuIFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiBFcnJvciBtZXNzYWdlIGlmIHZhbGlkYXRpb24gZmFpbHMsIHVuZGVmaW5lZCBpZiB2YWxpZGF0aW9uIHBhc3Nlc1xuICAgKlxuICAgKiBAc2VlIHtAbGluayBWYWxpZGF0b3J9XG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3Qgb3ZlcnJpZGUgaGFzRXJyb3JzKFxuICAgIHZhbHVlOiBhbnksXG4gICAgb3B0aW9ucz86IFYsXG4gICAgcHJveHk/OiBQYXRoUHJveHk8YW55PlxuICApOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD47XG59XG4iXX0=
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { ValidatorOptions } from "../types";
|
|
2
|
+
import type { PathProxy } from "../../utils";
|
|
3
|
+
import type { ConditionalAsync } from "../../types";
|
|
4
|
+
/**
|
|
5
|
+
* @description Abstract base class for all validators in the validation framework.
|
|
6
|
+
* @summary The BaseValidator class provides the foundation for all synchronous and asynchronous validator implementations.
|
|
7
|
+
* It handles type checking, error message formatting, and defines the interface that all validators must implement.
|
|
8
|
+
* This class is designed to be extended by specific validator classes that define their own validation logic.
|
|
9
|
+
*
|
|
10
|
+
* @template V - Validator options type
|
|
11
|
+
* @template IsAsync - Whether the validator is async (true) or sync (false). Default `false`.
|
|
12
|
+
*
|
|
13
|
+
* @param {boolean} async - Defines if the validator is async (must match the subclass signature)
|
|
14
|
+
* @param {string} message - Default error message to display when validation fails (defaults to {@link DEFAULT_ERROR_MESSAGES#DEFAULT})
|
|
15
|
+
* @param {string[]} acceptedTypes - Type names that this validator accepts (used for runtime type checking)
|
|
16
|
+
*
|
|
17
|
+
* @class BaseValidator
|
|
18
|
+
* @abstract
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* // Example of a synchronous validator
|
|
22
|
+
* class SyncValidator extends BaseValidator<SomeOptions, false> {
|
|
23
|
+
* constructor() {
|
|
24
|
+
* super(false, "Sync validation failed", String.name);
|
|
25
|
+
* }
|
|
26
|
+
*
|
|
27
|
+
* public hasErrors(value: any, options?: SomeOptions): string | undefined {
|
|
28
|
+
* if (typeof value !== "string") return this.getMessage(this.message);
|
|
29
|
+
* return undefined;
|
|
30
|
+
* }
|
|
31
|
+
* }
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* // Example of an asynchronous custom validator
|
|
35
|
+
* class AsyncValidator extends BaseValidator<SomeOptions, true> {
|
|
36
|
+
* constructor() {
|
|
37
|
+
* super(true, "Async validation failed", String.name);
|
|
38
|
+
* }
|
|
39
|
+
*
|
|
40
|
+
* public async hasErrors(value: any, options?: SomeOptions): Promise<string | undefined> {
|
|
41
|
+
* const result = await someAsyncCheck(value);
|
|
42
|
+
* if (!result) return this.getMessage(this.message);
|
|
43
|
+
* return undefined;
|
|
44
|
+
* }
|
|
45
|
+
* }
|
|
46
|
+
*
|
|
47
|
+
* @mermaid
|
|
48
|
+
* sequenceDiagram
|
|
49
|
+
* participant C as Client
|
|
50
|
+
* participant V as Validator Subclass
|
|
51
|
+
* participant B as BaseValidator
|
|
52
|
+
*
|
|
53
|
+
* C->>V: new CustomValidator(async, message)
|
|
54
|
+
* V->>B: super(async, message, acceptedTypes)
|
|
55
|
+
* B->>B: Store message, async flag, and accepted types
|
|
56
|
+
* B->>B: Optionally wrap hasErrors with type checking
|
|
57
|
+
* C->>V: hasErrors(value, options)
|
|
58
|
+
* alt value type not in acceptedTypes
|
|
59
|
+
* B-->>C: Type error message
|
|
60
|
+
* else value type is accepted
|
|
61
|
+
* V->>V: Custom validation logic
|
|
62
|
+
* V-->>C: Validation result
|
|
63
|
+
* end
|
|
64
|
+
*
|
|
65
|
+
* @category Validators
|
|
66
|
+
*/
|
|
67
|
+
export declare abstract class BaseValidator<V extends ValidatorOptions = ValidatorOptions, Async extends boolean = false> {
|
|
68
|
+
readonly message: string;
|
|
69
|
+
readonly acceptedTypes?: string[];
|
|
70
|
+
readonly async?: Async;
|
|
71
|
+
protected constructor(async: Async, message?: string, ...acceptedTypes: string[]);
|
|
72
|
+
/**
|
|
73
|
+
* @description Formats an error message with optional arguments
|
|
74
|
+
* @summary Creates a formatted error message by replacing placeholders with provided arguments.
|
|
75
|
+
* This method uses the string formatting utility to generate consistent error messages
|
|
76
|
+
* across all validators.
|
|
77
|
+
*
|
|
78
|
+
* @param {string} message - The message template with placeholders
|
|
79
|
+
* @param {...any} args - Values to insert into the message template
|
|
80
|
+
* @return {string} The formatted error message
|
|
81
|
+
* @protected
|
|
82
|
+
*/
|
|
83
|
+
protected getMessage(message: string, ...args: any[]): string;
|
|
84
|
+
/**
|
|
85
|
+
* @description Creates a type-checking wrapper around the hasErrors method
|
|
86
|
+
* @summary Wraps the hasErrors method with type validation logic to ensure that
|
|
87
|
+
* the value being validated is of an accepted type before performing specific validation.
|
|
88
|
+
* This method is called during construction if acceptedTypes are provided.
|
|
89
|
+
*
|
|
90
|
+
* @param {Function} unbound - The original hasErrors method to be wrapped
|
|
91
|
+
* @return {Function} A new function that performs type checking before calling the original method
|
|
92
|
+
* @private
|
|
93
|
+
*/
|
|
94
|
+
private checkTypeAndHasErrors;
|
|
95
|
+
/**
|
|
96
|
+
* @description Validates a value against specific validation rules
|
|
97
|
+
* @summary Abstract method that must be implemented by all validator subclasses.
|
|
98
|
+
* This method contains the core validation logic that determines whether a value
|
|
99
|
+
* is valid according to the specific rules of the validator. If the value is valid,
|
|
100
|
+
* the method returns undefined; otherwise, it returns an error message.
|
|
101
|
+
*
|
|
102
|
+
* @template V - Type of the options object that can be passed to the validator
|
|
103
|
+
* @param {any} value - The value to validate
|
|
104
|
+
* @param {V} [options] - Optional configuration options for customizing validation behavior
|
|
105
|
+
* @param {PathProxy<any>} proxy -
|
|
106
|
+
* @return {string | undefined} Error message if validation fails, undefined if validation passes
|
|
107
|
+
*
|
|
108
|
+
* @abstract
|
|
109
|
+
*
|
|
110
|
+
* @see Model#validate
|
|
111
|
+
*/
|
|
112
|
+
abstract hasErrors(value: any, options?: V, proxy?: PathProxy<any>): ConditionalAsync<Async, string | undefined>;
|
|
113
|
+
/**
|
|
114
|
+
* @summary Duck typing for Validators
|
|
115
|
+
* @param val
|
|
116
|
+
*/
|
|
117
|
+
static isValidator(val: any): boolean;
|
|
118
|
+
}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { DEFAULT_ERROR_MESSAGES } from "./constants.js";
|
|
2
|
+
import { sf } from "./../../utils/strings.js";
|
|
3
|
+
import { Reflection } from "@decaf-ts/reflection";
|
|
4
|
+
/**
|
|
5
|
+
* @description Abstract base class for all validators in the validation framework.
|
|
6
|
+
* @summary The BaseValidator class provides the foundation for all synchronous and asynchronous validator implementations.
|
|
7
|
+
* It handles type checking, error message formatting, and defines the interface that all validators must implement.
|
|
8
|
+
* This class is designed to be extended by specific validator classes that define their own validation logic.
|
|
9
|
+
*
|
|
10
|
+
* @template V - Validator options type
|
|
11
|
+
* @template IsAsync - Whether the validator is async (true) or sync (false). Default `false`.
|
|
12
|
+
*
|
|
13
|
+
* @param {boolean} async - Defines if the validator is async (must match the subclass signature)
|
|
14
|
+
* @param {string} message - Default error message to display when validation fails (defaults to {@link DEFAULT_ERROR_MESSAGES#DEFAULT})
|
|
15
|
+
* @param {string[]} acceptedTypes - Type names that this validator accepts (used for runtime type checking)
|
|
16
|
+
*
|
|
17
|
+
* @class BaseValidator
|
|
18
|
+
* @abstract
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* // Example of a synchronous validator
|
|
22
|
+
* class SyncValidator extends BaseValidator<SomeOptions, false> {
|
|
23
|
+
* constructor() {
|
|
24
|
+
* super(false, "Sync validation failed", String.name);
|
|
25
|
+
* }
|
|
26
|
+
*
|
|
27
|
+
* public hasErrors(value: any, options?: SomeOptions): string | undefined {
|
|
28
|
+
* if (typeof value !== "string") return this.getMessage(this.message);
|
|
29
|
+
* return undefined;
|
|
30
|
+
* }
|
|
31
|
+
* }
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* // Example of an asynchronous custom validator
|
|
35
|
+
* class AsyncValidator extends BaseValidator<SomeOptions, true> {
|
|
36
|
+
* constructor() {
|
|
37
|
+
* super(true, "Async validation failed", String.name);
|
|
38
|
+
* }
|
|
39
|
+
*
|
|
40
|
+
* public async hasErrors(value: any, options?: SomeOptions): Promise<string | undefined> {
|
|
41
|
+
* const result = await someAsyncCheck(value);
|
|
42
|
+
* if (!result) return this.getMessage(this.message);
|
|
43
|
+
* return undefined;
|
|
44
|
+
* }
|
|
45
|
+
* }
|
|
46
|
+
*
|
|
47
|
+
* @mermaid
|
|
48
|
+
* sequenceDiagram
|
|
49
|
+
* participant C as Client
|
|
50
|
+
* participant V as Validator Subclass
|
|
51
|
+
* participant B as BaseValidator
|
|
52
|
+
*
|
|
53
|
+
* C->>V: new CustomValidator(async, message)
|
|
54
|
+
* V->>B: super(async, message, acceptedTypes)
|
|
55
|
+
* B->>B: Store message, async flag, and accepted types
|
|
56
|
+
* B->>B: Optionally wrap hasErrors with type checking
|
|
57
|
+
* C->>V: hasErrors(value, options)
|
|
58
|
+
* alt value type not in acceptedTypes
|
|
59
|
+
* B-->>C: Type error message
|
|
60
|
+
* else value type is accepted
|
|
61
|
+
* V->>V: Custom validation logic
|
|
62
|
+
* V-->>C: Validation result
|
|
63
|
+
* end
|
|
64
|
+
*
|
|
65
|
+
* @category Validators
|
|
66
|
+
*/
|
|
67
|
+
export class BaseValidator {
|
|
68
|
+
constructor(async, message = DEFAULT_ERROR_MESSAGES.DEFAULT, ...acceptedTypes) {
|
|
69
|
+
this.async = async;
|
|
70
|
+
this.message = message;
|
|
71
|
+
if (acceptedTypes.length)
|
|
72
|
+
this.acceptedTypes = acceptedTypes;
|
|
73
|
+
if (this.acceptedTypes)
|
|
74
|
+
this.hasErrors = this.checkTypeAndHasErrors(this.hasErrors.bind(this));
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* @description Formats an error message with optional arguments
|
|
78
|
+
* @summary Creates a formatted error message by replacing placeholders with provided arguments.
|
|
79
|
+
* This method uses the string formatting utility to generate consistent error messages
|
|
80
|
+
* across all validators.
|
|
81
|
+
*
|
|
82
|
+
* @param {string} message - The message template with placeholders
|
|
83
|
+
* @param {...any} args - Values to insert into the message template
|
|
84
|
+
* @return {string} The formatted error message
|
|
85
|
+
* @protected
|
|
86
|
+
*/
|
|
87
|
+
getMessage(message, ...args) {
|
|
88
|
+
return sf(message, ...args);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* @description Creates a type-checking wrapper around the hasErrors method
|
|
92
|
+
* @summary Wraps the hasErrors method with type validation logic to ensure that
|
|
93
|
+
* the value being validated is of an accepted type before performing specific validation.
|
|
94
|
+
* This method is called during construction if acceptedTypes are provided.
|
|
95
|
+
*
|
|
96
|
+
* @param {Function} unbound - The original hasErrors method to be wrapped
|
|
97
|
+
* @return {Function} A new function that performs type checking before calling the original method
|
|
98
|
+
* @private
|
|
99
|
+
*/
|
|
100
|
+
checkTypeAndHasErrors(unbound) {
|
|
101
|
+
return function (value, options, proxy, ...args) {
|
|
102
|
+
if (value === undefined || !this.acceptedTypes)
|
|
103
|
+
return unbound(value, options, proxy, ...args);
|
|
104
|
+
if (!Reflection.checkTypes(value, this.acceptedTypes))
|
|
105
|
+
return this.getMessage(DEFAULT_ERROR_MESSAGES.TYPE, this.acceptedTypes.join(", "), typeof value);
|
|
106
|
+
return unbound(value, options, proxy, ...args);
|
|
107
|
+
}.bind(this);
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* @summary Duck typing for Validators
|
|
111
|
+
* @param val
|
|
112
|
+
*/
|
|
113
|
+
static isValidator(val) {
|
|
114
|
+
return val.constructor && !!val["hasErrors"];
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmFzZVZhbGlkYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvQmFzZVZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsdUJBQW9CO0FBQ3JELE9BQU8sRUFBRSxFQUFFLEVBQUUsaUNBQTRCO0FBQ3pDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUtsRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4REc7QUFDSCxNQUFNLE9BQWdCLGFBQWE7SUFRakMsWUFDRSxLQUFZLEVBQ1osVUFBa0Isc0JBQXNCLENBQUMsT0FBTyxFQUNoRCxHQUFHLGFBQXVCO1FBRTFCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBRXZCLElBQUksYUFBYSxDQUFDLE1BQU07WUFBRSxJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztRQUM3RCxJQUFJLElBQUksQ0FBQyxhQUFhO1lBQ3BCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUN6QyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQVEsQ0FDMUIsQ0FBQztJQUNiLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ08sVUFBVSxDQUFDLE9BQWUsRUFBRSxHQUFHLElBQVc7UUFDbEQsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNLLHFCQUFxQixDQUMzQixPQUtnRDtRQUVoRCxPQUFPLFVBRUwsS0FBVSxFQUNWLE9BQVUsRUFDVixLQUFzQixFQUN0QixHQUFHLElBQVc7WUFFZCxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYTtnQkFDNUMsT0FBTyxPQUFPLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztZQUNqRCxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQztnQkFDbkQsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUNwQixzQkFBc0IsQ0FBQyxJQUFJLEVBQzNCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUM3QixPQUFPLEtBQUssQ0FDYixDQUFDO1lBQ0osT0FBTyxPQUFPLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUNqRCxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2YsQ0FBQztJQXlCRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsV0FBVyxDQUFDLEdBQVE7UUFDekIsT0FBTyxHQUFHLENBQUMsV0FBVyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDL0MsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgc2YgfSBmcm9tIFwiLi4vLi4vdXRpbHMvc3RyaW5nc1wiO1xuaW1wb3J0IHsgUmVmbGVjdGlvbiB9IGZyb20gXCJAZGVjYWYtdHMvcmVmbGVjdGlvblwiO1xuaW1wb3J0IHsgVmFsaWRhdG9yT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBQYXRoUHJveHkgfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbmltcG9ydCB0eXBlIHsgQ29uZGl0aW9uYWxBc3luYyB9IGZyb20gXCIuLi8uLi90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBhbGwgdmFsaWRhdG9ycyBpbiB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsuXG4gKiBAc3VtbWFyeSBUaGUgQmFzZVZhbGlkYXRvciBjbGFzcyBwcm92aWRlcyB0aGUgZm91bmRhdGlvbiBmb3IgYWxsIHN5bmNocm9ub3VzIGFuZCBhc3luY2hyb25vdXMgdmFsaWRhdG9yIGltcGxlbWVudGF0aW9ucy5cbiAqIEl0IGhhbmRsZXMgdHlwZSBjaGVja2luZywgZXJyb3IgbWVzc2FnZSBmb3JtYXR0aW5nLCBhbmQgZGVmaW5lcyB0aGUgaW50ZXJmYWNlIHRoYXQgYWxsIHZhbGlkYXRvcnMgbXVzdCBpbXBsZW1lbnQuXG4gKiBUaGlzIGNsYXNzIGlzIGRlc2lnbmVkIHRvIGJlIGV4dGVuZGVkIGJ5IHNwZWNpZmljIHZhbGlkYXRvciBjbGFzc2VzIHRoYXQgZGVmaW5lIHRoZWlyIG93biB2YWxpZGF0aW9uIGxvZ2ljLlxuICpcbiAqIEB0ZW1wbGF0ZSBWIC0gVmFsaWRhdG9yIG9wdGlvbnMgdHlwZVxuICogQHRlbXBsYXRlIElzQXN5bmMgLSBXaGV0aGVyIHRoZSB2YWxpZGF0b3IgaXMgYXN5bmMgKHRydWUpIG9yIHN5bmMgKGZhbHNlKS4gRGVmYXVsdCBgZmFsc2VgLlxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gYXN5bmMgLSBEZWZpbmVzIGlmIHRoZSB2YWxpZGF0b3IgaXMgYXN5bmMgKG11c3QgbWF0Y2ggdGhlIHN1YmNsYXNzIHNpZ25hdHVyZSlcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIC0gRGVmYXVsdCBlcnJvciBtZXNzYWdlIHRvIGRpc3BsYXkgd2hlbiB2YWxpZGF0aW9uIGZhaWxzIChkZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNERUZBVUxUfSlcbiAqIEBwYXJhbSB7c3RyaW5nW119IGFjY2VwdGVkVHlwZXMgLSBUeXBlIG5hbWVzIHRoYXQgdGhpcyB2YWxpZGF0b3IgYWNjZXB0cyAodXNlZCBmb3IgcnVudGltZSB0eXBlIGNoZWNraW5nKVxuICpcbiAqIEBjbGFzcyBCYXNlVmFsaWRhdG9yXG4gKiBAYWJzdHJhY3RcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRXhhbXBsZSBvZiBhIHN5bmNocm9ub3VzIHZhbGlkYXRvclxuICogY2xhc3MgU3luY1ZhbGlkYXRvciBleHRlbmRzIEJhc2VWYWxpZGF0b3I8U29tZU9wdGlvbnMsIGZhbHNlPiB7XG4gKiAgIGNvbnN0cnVjdG9yKCkge1xuICogICAgIHN1cGVyKGZhbHNlLCBcIlN5bmMgdmFsaWRhdGlvbiBmYWlsZWRcIiwgU3RyaW5nLm5hbWUpO1xuICogICB9XG4gKlxuICogICBwdWJsaWMgaGFzRXJyb3JzKHZhbHVlOiBhbnksIG9wdGlvbnM/OiBTb21lT3B0aW9ucyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gKiAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIHRoaXMuZ2V0TWVzc2FnZSh0aGlzLm1lc3NhZ2UpO1xuICogICAgIHJldHVybiB1bmRlZmluZWQ7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRXhhbXBsZSBvZiBhbiBhc3luY2hyb25vdXMgY3VzdG9tIHZhbGlkYXRvclxuICogY2xhc3MgQXN5bmNWYWxpZGF0b3IgZXh0ZW5kcyBCYXNlVmFsaWRhdG9yPFNvbWVPcHRpb25zLCB0cnVlPiB7XG4gKiAgIGNvbnN0cnVjdG9yKCkge1xuICogICAgIHN1cGVyKHRydWUsIFwiQXN5bmMgdmFsaWRhdGlvbiBmYWlsZWRcIiwgU3RyaW5nLm5hbWUpO1xuICogICB9XG4gKlxuICogICBwdWJsaWMgYXN5bmMgaGFzRXJyb3JzKHZhbHVlOiBhbnksIG9wdGlvbnM/OiBTb21lT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gKiAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc29tZUFzeW5jQ2hlY2sodmFsdWUpO1xuICogICAgIGlmICghcmVzdWx0KSByZXR1cm4gdGhpcy5nZXRNZXNzYWdlKHRoaXMubWVzc2FnZSk7XG4gKiAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAqICAgfVxuICogfVxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQyBhcyBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgViBhcyBWYWxpZGF0b3IgU3ViY2xhc3NcbiAqICAgcGFydGljaXBhbnQgQiBhcyBCYXNlVmFsaWRhdG9yXG4gKlxuICogICBDLT4+VjogbmV3IEN1c3RvbVZhbGlkYXRvcihhc3luYywgbWVzc2FnZSlcbiAqICAgVi0+PkI6IHN1cGVyKGFzeW5jLCBtZXNzYWdlLCBhY2NlcHRlZFR5cGVzKVxuICogICBCLT4+QjogU3RvcmUgbWVzc2FnZSwgYXN5bmMgZmxhZywgYW5kIGFjY2VwdGVkIHR5cGVzXG4gKiAgIEItPj5COiBPcHRpb25hbGx5IHdyYXAgaGFzRXJyb3JzIHdpdGggdHlwZSBjaGVja2luZ1xuICogICBDLT4+VjogaGFzRXJyb3JzKHZhbHVlLCBvcHRpb25zKVxuICogICBhbHQgdmFsdWUgdHlwZSBub3QgaW4gYWNjZXB0ZWRUeXBlc1xuICogICAgIEItLT4+QzogVHlwZSBlcnJvciBtZXNzYWdlXG4gKiAgIGVsc2UgdmFsdWUgdHlwZSBpcyBhY2NlcHRlZFxuICogICAgIFYtPj5WOiBDdXN0b20gdmFsaWRhdGlvbiBsb2dpY1xuICogICAgIFYtLT4+QzogVmFsaWRhdGlvbiByZXN1bHRcbiAqICAgZW5kXG4gKlxuICogQGNhdGVnb3J5IFZhbGlkYXRvcnNcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VWYWxpZGF0b3I8XG4gIFYgZXh0ZW5kcyBWYWxpZGF0b3JPcHRpb25zID0gVmFsaWRhdG9yT3B0aW9ucyxcbiAgQXN5bmMgZXh0ZW5kcyBib29sZWFuID0gZmFsc2UsXG4+IHtcbiAgcmVhZG9ubHkgbWVzc2FnZTogc3RyaW5nO1xuICByZWFkb25seSBhY2NlcHRlZFR5cGVzPzogc3RyaW5nW107XG4gIHJlYWRvbmx5IGFzeW5jPzogQXN5bmM7XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKFxuICAgIGFzeW5jOiBBc3luYyxcbiAgICBtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLkRFRkFVTFQsXG4gICAgLi4uYWNjZXB0ZWRUeXBlczogc3RyaW5nW11cbiAgKSB7XG4gICAgdGhpcy5hc3luYyA9IGFzeW5jO1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG5cbiAgICBpZiAoYWNjZXB0ZWRUeXBlcy5sZW5ndGgpIHRoaXMuYWNjZXB0ZWRUeXBlcyA9IGFjY2VwdGVkVHlwZXM7XG4gICAgaWYgKHRoaXMuYWNjZXB0ZWRUeXBlcylcbiAgICAgIHRoaXMuaGFzRXJyb3JzID0gdGhpcy5jaGVja1R5cGVBbmRIYXNFcnJvcnMoXG4gICAgICAgIHRoaXMuaGFzRXJyb3JzLmJpbmQodGhpcykgYXMgYW55XG4gICAgICApIGFzIGFueTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRm9ybWF0cyBhbiBlcnJvciBtZXNzYWdlIHdpdGggb3B0aW9uYWwgYXJndW1lbnRzXG4gICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBmb3JtYXR0ZWQgZXJyb3IgbWVzc2FnZSBieSByZXBsYWNpbmcgcGxhY2Vob2xkZXJzIHdpdGggcHJvdmlkZWQgYXJndW1lbnRzLlxuICAgKiBUaGlzIG1ldGhvZCB1c2VzIHRoZSBzdHJpbmcgZm9ybWF0dGluZyB1dGlsaXR5IHRvIGdlbmVyYXRlIGNvbnNpc3RlbnQgZXJyb3IgbWVzc2FnZXNcbiAgICogYWNyb3NzIGFsbCB2YWxpZGF0b3JzLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSAtIFRoZSBtZXNzYWdlIHRlbXBsYXRlIHdpdGggcGxhY2Vob2xkZXJzXG4gICAqIEBwYXJhbSB7Li4uYW55fSBhcmdzIC0gVmFsdWVzIHRvIGluc2VydCBpbnRvIHRoZSBtZXNzYWdlIHRlbXBsYXRlXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGZvcm1hdHRlZCBlcnJvciBtZXNzYWdlXG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIHByb3RlY3RlZCBnZXRNZXNzYWdlKG1lc3NhZ2U6IHN0cmluZywgLi4uYXJnczogYW55W10pIHtcbiAgICByZXR1cm4gc2YobWVzc2FnZSwgLi4uYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSB0eXBlLWNoZWNraW5nIHdyYXBwZXIgYXJvdW5kIHRoZSBoYXNFcnJvcnMgbWV0aG9kXG4gICAqIEBzdW1tYXJ5IFdyYXBzIHRoZSBoYXNFcnJvcnMgbWV0aG9kIHdpdGggdHlwZSB2YWxpZGF0aW9uIGxvZ2ljIHRvIGVuc3VyZSB0aGF0XG4gICAqIHRoZSB2YWx1ZSBiZWluZyB2YWxpZGF0ZWQgaXMgb2YgYW4gYWNjZXB0ZWQgdHlwZSBiZWZvcmUgcGVyZm9ybWluZyBzcGVjaWZpYyB2YWxpZGF0aW9uLlxuICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgZHVyaW5nIGNvbnN0cnVjdGlvbiBpZiBhY2NlcHRlZFR5cGVzIGFyZSBwcm92aWRlZC5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gdW5ib3VuZCAtIFRoZSBvcmlnaW5hbCBoYXNFcnJvcnMgbWV0aG9kIHRvIGJlIHdyYXBwZWRcbiAgICogQHJldHVybiB7RnVuY3Rpb259IEEgbmV3IGZ1bmN0aW9uIHRoYXQgcGVyZm9ybXMgdHlwZSBjaGVja2luZyBiZWZvcmUgY2FsbGluZyB0aGUgb3JpZ2luYWwgbWV0aG9kXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGNoZWNrVHlwZUFuZEhhc0Vycm9ycyhcbiAgICB1bmJvdW5kOiAoXG4gICAgICB2YWx1ZTogYW55LFxuICAgICAgb3B0aW9ucz86IFYsXG4gICAgICBwcm94eT86IFBhdGhQcm94eTxhbnk+LFxuICAgICAgLi4uYXJnczogYW55W11cbiAgICApID0+IENvbmRpdGlvbmFsQXN5bmM8QXN5bmMsIHN0cmluZyB8IHVuZGVmaW5lZD5cbiAgKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChcbiAgICAgIHRoaXM6IEJhc2VWYWxpZGF0b3IsXG4gICAgICB2YWx1ZTogYW55LFxuICAgICAgb3B0aW9uczogVixcbiAgICAgIHByb3h5PzogUGF0aFByb3h5PGFueT4sXG4gICAgICAuLi5hcmdzOiBhbnlbXVxuICAgICkge1xuICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgIXRoaXMuYWNjZXB0ZWRUeXBlcylcbiAgICAgICAgcmV0dXJuIHVuYm91bmQodmFsdWUsIG9wdGlvbnMsIHByb3h5LCAuLi5hcmdzKTtcbiAgICAgIGlmICghUmVmbGVjdGlvbi5jaGVja1R5cGVzKHZhbHVlLCB0aGlzLmFjY2VwdGVkVHlwZXMpKVxuICAgICAgICByZXR1cm4gdGhpcy5nZXRNZXNzYWdlKFxuICAgICAgICAgIERFRkFVTFRfRVJST1JfTUVTU0FHRVMuVFlQRSxcbiAgICAgICAgICB0aGlzLmFjY2VwdGVkVHlwZXMuam9pbihcIiwgXCIpLFxuICAgICAgICAgIHR5cGVvZiB2YWx1ZVxuICAgICAgICApO1xuICAgICAgcmV0dXJuIHVuYm91bmQodmFsdWUsIG9wdGlvbnMsIHByb3h5LCAuLi5hcmdzKTtcbiAgICB9LmJpbmQodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFZhbGlkYXRlcyBhIHZhbHVlIGFnYWluc3Qgc3BlY2lmaWMgdmFsaWRhdGlvbiBydWxlc1xuICAgKiBAc3VtbWFyeSBBYnN0cmFjdCBtZXRob2QgdGhhdCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IGFsbCB2YWxpZGF0b3Igc3ViY2xhc3Nlcy5cbiAgICogVGhpcyBtZXRob2QgY29udGFpbnMgdGhlIGNvcmUgdmFsaWRhdGlvbiBsb2dpYyB0aGF0IGRldGVybWluZXMgd2hldGhlciBhIHZhbHVlXG4gICAqIGlzIHZhbGlkIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWMgcnVsZXMgb2YgdGhlIHZhbGlkYXRvci4gSWYgdGhlIHZhbHVlIGlzIHZhbGlkLFxuICAgKiB0aGUgbWV0aG9kIHJldHVybnMgdW5kZWZpbmVkOyBvdGhlcndpc2UsIGl0IHJldHVybnMgYW4gZXJyb3IgbWVzc2FnZS5cbiAgICpcbiAgICogQHRlbXBsYXRlIFYgLSBUeXBlIG9mIHRoZSBvcHRpb25zIG9iamVjdCB0aGF0IGNhbiBiZSBwYXNzZWQgdG8gdGhlIHZhbGlkYXRvclxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gdmFsaWRhdGVcbiAgICogQHBhcmFtIHtWfSBbb3B0aW9uc10gLSBPcHRpb25hbCBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIGN1c3RvbWl6aW5nIHZhbGlkYXRpb24gYmVoYXZpb3JcbiAgICogQHBhcmFtIHtQYXRoUHJveHk8YW55Pn0gcHJveHkgLVxuICAgKiBAcmV0dXJuIHtzdHJpbmcgfCB1bmRlZmluZWR9IEVycm9yIG1lc3NhZ2UgaWYgdmFsaWRhdGlvbiBmYWlscywgdW5kZWZpbmVkIGlmIHZhbGlkYXRpb24gcGFzc2VzXG4gICAqXG4gICAqIEBhYnN0cmFjdFxuICAgKlxuICAgKiBAc2VlIE1vZGVsI3ZhbGlkYXRlXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgaGFzRXJyb3JzKFxuICAgIHZhbHVlOiBhbnksXG4gICAgb3B0aW9ucz86IFYsXG4gICAgcHJveHk/OiBQYXRoUHJveHk8YW55PlxuICApOiBDb25kaXRpb25hbEFzeW5jPEFzeW5jLCBzdHJpbmcgfCB1bmRlZmluZWQ+O1xuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBEdWNrIHR5cGluZyBmb3IgVmFsaWRhdG9yc1xuICAgKiBAcGFyYW0gdmFsXG4gICAqL1xuICBzdGF0aWMgaXNWYWxpZGF0b3IodmFsOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdmFsLmNvbnN0cnVjdG9yICYmICEhdmFsW1wiaGFzRXJyb3JzXCJdO1xuICB9XG59XG4iXX0=
|
|
@@ -86,7 +86,7 @@ let ListValidator = class ListValidator extends Validator {
|
|
|
86
86
|
switch (typeof val) {
|
|
87
87
|
case "object":
|
|
88
88
|
case "function":
|
|
89
|
-
isValid = clazz.includes(val.constructor?.name);
|
|
89
|
+
isValid = clazz.includes((val ?? {}).constructor?.name); // null is an object
|
|
90
90
|
break;
|
|
91
91
|
default:
|
|
92
92
|
isValid = clazz.some((c) => typeof val === c.toLowerCase());
|
|
@@ -103,4 +103,4 @@ ListValidator = __decorate([
|
|
|
103
103
|
__metadata("design:paramtypes", [String])
|
|
104
104
|
], ListValidator);
|
|
105
105
|
export { ListValidator };
|
|
106
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
106
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTGlzdFZhbGlkYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvTGlzdFZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLHVCQUFvQjtBQUN4QyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsY0FBYyxFQUFFLHVCQUFvQjtBQUNyRSxPQUFPLEVBQUUsU0FBUyxFQUFFLHdCQUFxQjtBQUd6Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E0Q0c7QUFFSSxJQUFNLGFBQWEsR0FBbkIsTUFBTSxhQUFjLFNBQVEsU0FBK0I7SUFDaEUsWUFBWSxVQUFrQixzQkFBc0IsQ0FBQyxJQUFJO1FBQ3ZELEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7OztPQWNHO0lBQ0gsU0FBUyxDQUNQLEtBQXVCLEVBQ3ZCLE9BQTZCO1FBRTdCLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztZQUFFLE9BQU87UUFFM0UsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1lBQ3hDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSztZQUNmLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwQixJQUFJLEdBQVEsRUFDVixPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLEtBQ0UsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUNULENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFDdEQsQ0FBQyxFQUFFLEVBQ0gsQ0FBQztZQUNELEdBQUcsR0FBSSxLQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDeEIsUUFBUSxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNuQixLQUFLLFFBQVEsQ0FBQztnQkFDZCxLQUFLLFVBQVU7b0JBQ2IsT0FBTyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUUsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFZLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsb0JBQW9CO29CQUN6RixNQUFNO2dCQUNSO29CQUNFLE9BQU8sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztvQkFDcEUsTUFBTTtZQUNWLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxPQUFPO1lBQ1osQ0FBQyxDQUFDLFNBQVM7WUFDWCxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDOUQsQ0FBQztDQUNGLENBQUE7QUFwRFksYUFBYTtJQUR6QixTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQzs7R0FDbEIsYUFBYSxDQW9EekIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBWYWxpZGF0b3IgfSBmcm9tIFwiLi9WYWxpZGF0b3JcIjtcbmltcG9ydCB7IERFRkFVTFRfRVJST1JfTUVTU0FHRVMsIFZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyB2YWxpZGF0b3IgfSBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBMaXN0VmFsaWRhdG9yT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0b3IgZm9yIGNoZWNraW5nIGlmIGVsZW1lbnRzIGluIGEgbGlzdCBvciBzZXQgbWF0Y2ggZXhwZWN0ZWQgdHlwZXNcbiAqIEBzdW1tYXJ5IFRoZSBMaXN0VmFsaWRhdG9yIHZhbGlkYXRlcyB0aGF0IGFsbCBlbGVtZW50cyBpbiBhbiBhcnJheSBvciBTZXQgbWF0Y2ggdGhlIGV4cGVjdGVkIHR5cGVzLlxuICogSXQgY2hlY2tzIGVhY2ggZWxlbWVudCBhZ2FpbnN0IGEgbGlzdCBvZiBhbGxvd2VkIGNsYXNzIHR5cGVzIGFuZCBlbnN1cmVzIHR5cGUgY29uc2lzdGVuY3kuXG4gKiBUaGlzIHZhbGlkYXRvciBpcyB0eXBpY2FsbHkgdXNlZCB3aXRoIHRoZSBAbGlzdCBkZWNvcmF0b3IuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSAtIEN1c3RvbSBlcnJvciBtZXNzYWdlIHRvIGRpc3BsYXkgd2hlbiB2YWxpZGF0aW9uIGZhaWxzLCBkZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNMSVNUfVxuICpcbiAqIEBjbGFzcyBMaXN0VmFsaWRhdG9yXG4gKiBAZXh0ZW5kcyBWYWxpZGF0b3JcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ3JlYXRlIGEgbGlzdCB2YWxpZGF0b3Igd2l0aCBkZWZhdWx0IGVycm9yIG1lc3NhZ2VcbiAqIGNvbnN0IGxpc3RWYWxpZGF0b3IgPSBuZXcgTGlzdFZhbGlkYXRvcigpO1xuICpcbiAqIC8vIENyZWF0ZSBhIGxpc3QgdmFsaWRhdG9yIHdpdGggY3VzdG9tIGVycm9yIG1lc3NhZ2VcbiAqIGNvbnN0IGN1c3RvbUxpc3RWYWxpZGF0b3IgPSBuZXcgTGlzdFZhbGlkYXRvcihcIkFsbCBpdGVtcyBtdXN0IGJlIG9mIHRoZSBzcGVjaWZpZWQgdHlwZVwiKTtcbiAqXG4gKiAvLyBWYWxpZGF0ZSBhIGxpc3RcbiAqIGNvbnN0IG9wdGlvbnMgPSB7IGNsYXp6OiBbXCJTdHJpbmdcIiwgXCJOdW1iZXJcIl0gfTtcbiAqIGNvbnN0IHJlc3VsdCA9IGxpc3RWYWxpZGF0b3IuaGFzRXJyb3JzKFtcInRlc3RcIiwgMTIzXSwgb3B0aW9ucyk7IC8vIHVuZGVmaW5lZCAodmFsaWQpXG4gKiBjb25zdCBpbnZhbGlkUmVzdWx0ID0gbGlzdFZhbGlkYXRvci5oYXNFcnJvcnMoW25ldyBEYXRlKCldLCBvcHRpb25zKTsgLy8gUmV0dXJucyBlcnJvciBtZXNzYWdlIChpbnZhbGlkKVxuICogYGBgXG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDIGFzIENsaWVudFxuICogICBwYXJ0aWNpcGFudCBWIGFzIExpc3RWYWxpZGF0b3JcbiAqXG4gKiAgIEMtPj5WOiBuZXcgTGlzdFZhbGlkYXRvcihtZXNzYWdlKVxuICogICBDLT4+VjogaGFzRXJyb3JzKHZhbHVlLCBvcHRpb25zKVxuICogICBhbHQgdmFsdWUgaXMgZW1wdHlcbiAqICAgICBWLS0+PkM6IHVuZGVmaW5lZCAodmFsaWQpXG4gKiAgIGVsc2UgdmFsdWUgaGFzIGVsZW1lbnRzXG4gKiAgICAgVi0+PlY6IENoZWNrIGVhY2ggZWxlbWVudCdzIHR5cGVcbiAqICAgICBhbHQgQWxsIGVsZW1lbnRzIG1hdGNoIGFsbG93ZWQgdHlwZXNcbiAqICAgICAgIFYtLT4+QzogdW5kZWZpbmVkICh2YWxpZClcbiAqICAgICBlbHNlIFNvbWUgZWxlbWVudHMgZG9uJ3QgbWF0Y2hcbiAqICAgICAgIFYtLT4+QzogRXJyb3IgbWVzc2FnZVxuICogICAgIGVuZFxuICogICBlbmRcbiAqXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdG9yc1xuICovXG5AdmFsaWRhdG9yKFZhbGlkYXRpb25LZXlzLkxJU1QpXG5leHBvcnQgY2xhc3MgTGlzdFZhbGlkYXRvciBleHRlbmRzIFZhbGlkYXRvcjxMaXN0VmFsaWRhdG9yT3B0aW9ucz4ge1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLkxJU1QpIHtcbiAgICBzdXBlcihtZXNzYWdlLCBBcnJheS5uYW1lLCBTZXQubmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENoZWNrcyBpZiBhbGwgZWxlbWVudHMgaW4gYSBsaXN0IG9yIHNldCBtYXRjaCB0aGUgZXhwZWN0ZWQgdHlwZXNcbiAgICogQHN1bW1hcnkgVmFsaWRhdGVzIHRoYXQgZWFjaCBlbGVtZW50IGluIHRoZSBwcm92aWRlZCBhcnJheSBvciBTZXQgbWF0Y2hlcyBvbmUgb2YgdGhlXG4gICAqIGNsYXNzIHR5cGVzIHNwZWNpZmllZCBpbiB0aGUgb3B0aW9ucy4gRm9yIG9iamVjdCB0eXBlcywgaXQgY2hlY2tzIHRoZSBjb25zdHJ1Y3RvciBuYW1lLFxuICAgKiBhbmQgZm9yIHByaW1pdGl2ZSB0eXBlcywgaXQgY29tcGFyZXMgYWdhaW5zdCB0aGUgbG93ZXJjYXNlIHR5cGUgbmFtZS5cbiAgICpcbiAgICogQHBhcmFtIHthbnlbXSB8IFNldDxhbnk+fSB2YWx1ZSAtIFRoZSBhcnJheSBvciBTZXQgdG8gdmFsaWRhdGVcbiAgICogQHBhcmFtIHtMaXN0VmFsaWRhdG9yT3B0aW9uc30gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBjb250YWluaW5nIHRoZSBhbGxvd2VkIGNsYXNzIHR5cGVzXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH0gRXJyb3IgbWVzc2FnZSBpZiB2YWxpZGF0aW9uIGZhaWxzLCB1bmRlZmluZWQgaWYgdmFsaWRhdGlvbiBwYXNzZXNcbiAgICpcbiAgICogQG92ZXJyaWRlXG4gICAqXG4gICAqIEBzZWUgVmFsaWRhdG9yI2hhc0Vycm9yc1xuICAgKi9cbiAgaGFzRXJyb3JzKFxuICAgIHZhbHVlOiBhbnlbXSB8IFNldDxhbnk+LFxuICAgIG9wdGlvbnM6IExpc3RWYWxpZGF0b3JPcHRpb25zXG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF2YWx1ZSB8fCAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyAhdmFsdWUubGVuZ3RoIDogIXZhbHVlLnNpemUpKSByZXR1cm47XG5cbiAgICBjb25zdCBjbGF6eiA9IEFycmF5LmlzQXJyYXkob3B0aW9ucy5jbGF6eilcbiAgICAgID8gb3B0aW9ucy5jbGF6elxuICAgICAgOiBbb3B0aW9ucy5jbGF6el07XG4gICAgbGV0IHZhbDogYW55LFxuICAgICAgaXNWYWxpZCA9IHRydWU7XG4gICAgZm9yIChcbiAgICAgIGxldCBpID0gMDtcbiAgICAgIGkgPCAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZS5sZW5ndGggOiB2YWx1ZS5zaXplKTtcbiAgICAgIGkrK1xuICAgICkge1xuICAgICAgdmFsID0gKHZhbHVlIGFzIGFueSlbaV07XG4gICAgICBzd2l0Y2ggKHR5cGVvZiB2YWwpIHtcbiAgICAgICAgY2FzZSBcIm9iamVjdFwiOlxuICAgICAgICBjYXNlIFwiZnVuY3Rpb25cIjpcbiAgICAgICAgICBpc1ZhbGlkID0gY2xhenouaW5jbHVkZXMoKCh2YWwgPz8ge30pIGFzIG9iamVjdCkuY29uc3RydWN0b3I/Lm5hbWUpOyAvLyBudWxsIGlzIGFuIG9iamVjdFxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGlzVmFsaWQgPSBjbGF6ei5zb21lKChjOiBzdHJpbmcpID0+IHR5cGVvZiB2YWwgPT09IGMudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGlzVmFsaWRcbiAgICAgID8gdW5kZWZpbmVkXG4gICAgICA6IHRoaXMuZ2V0TWVzc2FnZShvcHRpb25zLm1lc3NhZ2UgfHwgdGhpcy5tZXNzYWdlLCBjbGF6eik7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -32,7 +32,7 @@ let MinLengthValidator = class MinLengthValidator extends Validator {
|
|
|
32
32
|
*
|
|
33
33
|
* @return {string | undefined}
|
|
34
34
|
*
|
|
35
|
-
* @memberOf
|
|
35
|
+
* @memberOf module:decorator-validation
|
|
36
36
|
* @override
|
|
37
37
|
*
|
|
38
38
|
* @see Validator#hasErrors
|
|
@@ -50,4 +50,4 @@ MinLengthValidator = __decorate([
|
|
|
50
50
|
__metadata("design:paramtypes", [String])
|
|
51
51
|
], MinLengthValidator);
|
|
52
52
|
export { MinLengthValidator };
|
|
53
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
53
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWluTGVuZ3RoVmFsaWRhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3ZhbGlkYXRpb24vVmFsaWRhdG9ycy9NaW5MZW5ndGhWYWxpZGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSx1QkFBb0I7QUFDeEMsT0FBTyxFQUFFLHNCQUFzQixFQUFFLGNBQWMsRUFBRSx1QkFBb0I7QUFDckUsT0FBTyxFQUFFLFNBQVMsRUFBRSx3QkFBcUI7QUFHekM7Ozs7Ozs7Ozs7R0FVRztBQUVJLElBQU0sa0JBQWtCLEdBQXhCLE1BQU0sa0JBQW1CLFNBQVEsU0FBb0M7SUFDMUUsWUFBWSxVQUFrQixzQkFBc0IsQ0FBQyxVQUFVO1FBQzdELEtBQUssQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVEOzs7Ozs7Ozs7OztPQVdHO0lBQ0ksU0FBUyxDQUNkLEtBQXFCLEVBQ3JCLE9BQWtDO1FBRWxDLElBQUksT0FBTyxLQUFLLEtBQUssV0FBVztZQUFFLE9BQU87UUFDekMsT0FBTyxLQUFLLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxTQUFTO1lBQ3JDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsU0FBUyxDQUFDO1lBQ3JFLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDaEIsQ0FBQztDQUNGLENBQUE7QUExQlksa0JBQWtCO0lBRDlCLFNBQVMsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDOztHQUN4QixrQkFBa0IsQ0EwQjlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVmFsaWRhdG9yIH0gZnJvbSBcIi4vVmFsaWRhdG9yXCI7XG5pbXBvcnQgeyBERUZBVUxUX0VSUk9SX01FU1NBR0VTLCBWYWxpZGF0aW9uS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgdmFsaWRhdG9yIH0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgTWluTGVuZ3RoVmFsaWRhdG9yT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IE1pbmltdW0gTGVuZ3RoIFZhbGlkYXRvclxuICogQGRlc2NyaXB0aW9uIFZhbGlkYXRlcyBzdHJpbmdzIGFuZCBBcnJheXMgb24gdGhlaXIgbWluaW11bSBsZW5ndGhcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIGRlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI01JTl9MRU5HVEh9XG4gKlxuICogQGNsYXNzIE1pbkxlbmd0aFZhbGlkYXRvclxuICogQGV4dGVuZHMgVmFsaWRhdG9yXG4gKlxuICogQGNhdGVnb3J5IFZhbGlkYXRvcnNcbiAqL1xuQHZhbGlkYXRvcihWYWxpZGF0aW9uS2V5cy5NSU5fTEVOR1RIKVxuZXhwb3J0IGNsYXNzIE1pbkxlbmd0aFZhbGlkYXRvciBleHRlbmRzIFZhbGlkYXRvcjxNaW5MZW5ndGhWYWxpZGF0b3JPcHRpb25zPiB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuTUlOX0xFTkdUSCkge1xuICAgIHN1cGVyKG1lc3NhZ2UsIFN0cmluZy5uYW1lLCBBcnJheS5uYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IEFycmF5fSB2YWx1ZVxuICAgKiBAcGFyYW0ge01pbkxlbmd0aFZhbGlkYXRvck9wdGlvbnN9IG9wdGlvbnNcbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfVxuICAgKlxuICAgKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gICAqIEBvdmVycmlkZVxuICAgKlxuICAgKiBAc2VlIFZhbGlkYXRvciNoYXNFcnJvcnNcbiAgICovXG4gIHB1YmxpYyBoYXNFcnJvcnMoXG4gICAgdmFsdWU6IHN0cmluZyB8IGFueVtdLFxuICAgIG9wdGlvbnM6IE1pbkxlbmd0aFZhbGlkYXRvck9wdGlvbnNcbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm47XG4gICAgcmV0dXJuIHZhbHVlLmxlbmd0aCA8IG9wdGlvbnMubWlubGVuZ3RoXG4gICAgICA/IHRoaXMuZ2V0TWVzc2FnZShvcHRpb25zLm1lc3NhZ2UgfHwgdGhpcy5tZXNzYWdlLCBvcHRpb25zLm1pbmxlbmd0aClcbiAgICAgIDogdW5kZWZpbmVkO1xuICB9XG59XG4iXX0=
|
|
@@ -120,4 +120,4 @@ Validation.register({
|
|
|
120
120
|
validationKey: ModelKeys.TYPE,
|
|
121
121
|
save: false,
|
|
122
122
|
});
|
|
123
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
123
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHlwZVZhbGlkYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvVHlwZVZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLHVCQUFvQjtBQUN4QyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsY0FBYyxFQUFFLHVCQUFvQjtBQUNyRSxPQUFPLEVBQUUsU0FBUyxFQUFFLHdCQUFxQjtBQUN6QyxPQUFPLEVBQUUsVUFBVSxFQUFFLDJCQUFzQjtBQU0zQyxPQUFPLEVBQUUsU0FBUyxFQUFFLG1DQUE4QjtBQUNsRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFbEQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlERztBQUVJLElBQU0sYUFBYSxHQUFuQixNQUFNLGFBQWMsU0FBUSxTQUErQjtJQUNoRSxZQUFZLFVBQWtCLHNCQUFzQixDQUFDLElBQUk7UUFDdkQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7T0FjRztJQUNJLFNBQVMsQ0FDZCxLQUFVLEVBQ1YsT0FBNkI7UUFFN0IsSUFBSSxLQUFLLEtBQUssU0FBUztZQUFFLE9BQU8sQ0FBQywwQ0FBMEM7UUFDM0UsTUFBTSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsR0FBRyxPQUFPLENBQUM7UUFDbkMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDO1lBQy9DLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FDcEIsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQ3ZCLE9BQU8sS0FBSyxLQUFLLFFBQVE7Z0JBQ3ZCLENBQUMsQ0FBQyxLQUFLO2dCQUNQLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztvQkFDcEIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO29CQUNsQixDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksRUFDaEIsT0FBTyxLQUFLLENBQ2IsQ0FBQztJQUNOLENBQUM7Q0FDRixDQUFBO0FBckNZLGFBQWE7SUFEekIsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUM7O0dBQ2xCLGFBQWEsQ0FxQ3pCOztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxVQUFVLENBQUMsUUFBUSxDQUFDO0lBQ2xCLFNBQVMsRUFBRSxhQUFpQztJQUM1QyxhQUFhLEVBQUUsU0FBUyxDQUFDLElBQUk7SUFDN0IsSUFBSSxFQUFFLEtBQUs7Q0FDVyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBWYWxpZGF0b3IgfSBmcm9tIFwiLi9WYWxpZGF0b3JcIjtcbmltcG9ydCB7IERFRkFVTFRfRVJST1JfTUVTU0FHRVMsIFZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyB2YWxpZGF0b3IgfSBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBWYWxpZGF0aW9uIH0gZnJvbSBcIi4uL1ZhbGlkYXRpb25cIjtcbmltcG9ydCB7XG4gIFR5cGVWYWxpZGF0b3JPcHRpb25zLFxuICBWYWxpZGF0b3JEZWZpbml0aW9uLFxuICBWYWxpZGF0b3JPcHRpb25zLFxufSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IE1vZGVsS2V5cyB9IGZyb20gXCIuLi8uLi91dGlscy9jb25zdGFudHNcIjtcbmltcG9ydCB7IFJlZmxlY3Rpb24gfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVmFsaWRhdG9yIGZvciBjaGVja2luZyBpZiBhIHZhbHVlIGlzIG9mIHRoZSBleHBlY3RlZCB0eXBlKHMpXG4gKiBAc3VtbWFyeSBUaGUgVHlwZVZhbGlkYXRvciBlbnN1cmVzIHRoYXQgYSB2YWx1ZSBtYXRjaGVzIG9uZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGVzLlxuICogSXQgY2FuIHZhbGlkYXRlIGFnYWluc3QgYSBzaW5nbGUgdHlwZSwgbXVsdGlwbGUgdHlwZXMsIG9yIGEgdHlwZSB3aXRoIGEgc3BlY2lmaWMgbmFtZS5cbiAqIFRoaXMgdmFsaWRhdG9yIGlzIHR5cGljYWxseSB1c2VkIHdpdGggdGhlIEB0eXBlIGRlY29yYXRvciBhbmQgaXMgZnVuZGFtZW50YWwgZm9yXG4gKiBlbnN1cmluZyB0eXBlIHNhZmV0eSBpbiB2YWxpZGF0ZWQgbW9kZWxzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gLSBDdXN0b20gZXJyb3IgbWVzc2FnZSB0byBkaXNwbGF5IHdoZW4gdmFsaWRhdGlvbiBmYWlscywgZGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjVFlQRX1cbiAqXG4gKiBAY2xhc3MgVHlwZVZhbGlkYXRvclxuICogQGV4dGVuZHMgVmFsaWRhdG9yXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENyZWF0ZSBhIHR5cGUgdmFsaWRhdG9yIHdpdGggZGVmYXVsdCBlcnJvciBtZXNzYWdlXG4gKiBjb25zdCB0eXBlVmFsaWRhdG9yID0gbmV3IFR5cGVWYWxpZGF0b3IoKTtcbiAqXG4gKiAvLyBDcmVhdGUgYSB0eXBlIHZhbGlkYXRvciB3aXRoIGN1c3RvbSBlcnJvciBtZXNzYWdlXG4gKiBjb25zdCBjdXN0b21UeXBlVmFsaWRhdG9yID0gbmV3IFR5cGVWYWxpZGF0b3IoXCJWYWx1ZSBtdXN0IGJlIG9mIHR5cGUgezB9LCBidXQgZ290IHsxfVwiKTtcbiAqXG4gKiAvLyBWYWxpZGF0ZSBhZ2FpbnN0IGEgc2luZ2xlIHR5cGVcbiAqIGNvbnN0IHN0cmluZ09wdGlvbnMgPSB7IHR5cGVzOiBcInN0cmluZ1wiIH07XG4gKiB0eXBlVmFsaWRhdG9yLmhhc0Vycm9ycyhcImhlbGxvXCIsIHN0cmluZ09wdGlvbnMpOyAvLyB1bmRlZmluZWQgKHZhbGlkKVxuICogdHlwZVZhbGlkYXRvci5oYXNFcnJvcnMoMTIzLCBzdHJpbmdPcHRpb25zKTsgLy8gUmV0dXJucyBlcnJvciBtZXNzYWdlIChpbnZhbGlkKVxuICpcbiAqIC8vIFZhbGlkYXRlIGFnYWluc3QgbXVsdGlwbGUgdHlwZXNcbiAqIGNvbnN0IG11bHRpT3B0aW9ucyA9IHsgdHlwZXM6IFtcInN0cmluZ1wiLCBcIm51bWJlclwiXSB9O1xuICogdHlwZVZhbGlkYXRvci5oYXNFcnJvcnMoXCJoZWxsb1wiLCBtdWx0aU9wdGlvbnMpOyAvLyB1bmRlZmluZWQgKHZhbGlkKVxuICogdHlwZVZhbGlkYXRvci5oYXNFcnJvcnMoMTIzLCBtdWx0aU9wdGlvbnMpOyAvLyB1bmRlZmluZWQgKHZhbGlkKVxuICogdHlwZVZhbGlkYXRvci5oYXNFcnJvcnModHJ1ZSwgbXVsdGlPcHRpb25zKTsgLy8gUmV0dXJucyBlcnJvciBtZXNzYWdlIChpbnZhbGlkKVxuICpcbiAqIC8vIFZhbGlkYXRlIGFnYWluc3QgYSBjbGFzcyB0eXBlXG4gKiBjb25zdCBjbGFzc09wdGlvbnMgPSB7IHR5cGVzOiB7IG5hbWU6IFwiRGF0ZVwiIH0gfTtcbiAqIHR5cGVWYWxpZGF0b3IuaGFzRXJyb3JzKG5ldyBEYXRlKCksIGNsYXNzT3B0aW9ucyk7IC8vIHVuZGVmaW5lZCAodmFsaWQpXG4gKiBgYGBcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEMgYXMgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IFYgYXMgVHlwZVZhbGlkYXRvclxuICogICBwYXJ0aWNpcGFudCBSIGFzIFJlZmxlY3Rpb25cbiAqXG4gKiAgIEMtPj5WOiBuZXcgVHlwZVZhbGlkYXRvcihtZXNzYWdlKVxuICogICBDLT4+VjogaGFzRXJyb3JzKHZhbHVlLCBvcHRpb25zKVxuICogICBhbHQgdmFsdWUgaXMgdW5kZWZpbmVkXG4gKiAgICAgVi0tPj5DOiB1bmRlZmluZWQgKHZhbGlkKVxuICogICBlbHNlIHZhbHVlIGlzIGRlZmluZWRcbiAqICAgICBWLT4+UjogZXZhbHVhdGVEZXNpZ25UeXBlcyh2YWx1ZSwgdHlwZXMpXG4gKiAgICAgYWx0IHR5cGUgZXZhbHVhdGlvbiBwYXNzZXNcbiAqICAgICAgIFYtLT4+QzogdW5kZWZpbmVkICh2YWxpZClcbiAqICAgICBlbHNlIHR5cGUgZXZhbHVhdGlvbiBmYWlsc1xuICogICAgICAgVi0+PlY6IEZvcm1hdCBlcnJvciBtZXNzYWdlIHdpdGggdHlwZSBpbmZvXG4gKiAgICAgICBWLS0+PkM6IEVycm9yIG1lc3NhZ2VcbiAqICAgICBlbmRcbiAqICAgZW5kXG4gKlxuICogQGNhdGVnb3J5IFZhbGlkYXRvcnNcbiAqL1xuQHZhbGlkYXRvcihWYWxpZGF0aW9uS2V5cy5UWVBFKVxuZXhwb3J0IGNsYXNzIFR5cGVWYWxpZGF0b3IgZXh0ZW5kcyBWYWxpZGF0b3I8VHlwZVZhbGlkYXRvck9wdGlvbnM+IHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5UWVBFKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENoZWNrcyBpZiBhIHZhbHVlIGlzIG9mIHRoZSBleHBlY3RlZCB0eXBlKHMpXG4gICAqIEBzdW1tYXJ5IFZhbGlkYXRlcyB0aGF0IHRoZSBwcm92aWRlZCB2YWx1ZSBtYXRjaGVzIG9uZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGVzLlxuICAgKiBJdCB1c2VzIHRoZSBSZWZsZWN0aW9uIHV0aWxpdHkgdG8gZXZhbHVhdGUgaWYgdGhlIHZhbHVlJ3MgdHlwZSBtYXRjaGVzIHRoZSBleHBlY3RlZCB0eXBlcy5cbiAgICogVGhlIG1ldGhvZCBza2lwcyB2YWxpZGF0aW9uIGZvciB1bmRlZmluZWQgdmFsdWVzIHRvIGF2b2lkIGNvbmZsaWN0cyB3aXRoIHRoZSBSZXF1aXJlZFZhbGlkYXRvci5cbiAgICpcbiAgICogQHBhcmFtIHthbnl9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIHZhbGlkYXRlXG4gICAqIEBwYXJhbSB7VHlwZVZhbGlkYXRvck9wdGlvbnN9IG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgY29udGFpbmluZyB0aGUgZXhwZWN0ZWQgdHlwZXNcbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfSBFcnJvciBtZXNzYWdlIGlmIHZhbGlkYXRpb24gZmFpbHMsIHVuZGVmaW5lZCBpZiB2YWxpZGF0aW9uIHBhc3Nlc1xuICAgKlxuICAgKiBAb3ZlcnJpZGVcbiAgICpcbiAgICogQHNlZSBWYWxpZGF0b3IjaGFzRXJyb3JzXG4gICAqL1xuICBwdWJsaWMgaGFzRXJyb3JzKFxuICAgIHZhbHVlOiBhbnksXG4gICAgb3B0aW9uczogVHlwZVZhbGlkYXRvck9wdGlvbnNcbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuOyAvLyBEb24ndCB0cnkgYW5kIGVuZm9yY2UgdHlwZSBpZiB1bmRlZmluZWRcbiAgICBjb25zdCB7IHR5cGVzLCBtZXNzYWdlIH0gPSBvcHRpb25zO1xuICAgIGlmICghUmVmbGVjdGlvbi5ldmFsdWF0ZURlc2lnblR5cGVzKHZhbHVlLCB0eXBlcykpXG4gICAgICByZXR1cm4gdGhpcy5nZXRNZXNzYWdlKFxuICAgICAgICBtZXNzYWdlIHx8IHRoaXMubWVzc2FnZSxcbiAgICAgICAgdHlwZW9mIHR5cGVzID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgPyB0eXBlc1xuICAgICAgICAgIDogQXJyYXkuaXNBcnJheSh0eXBlcylcbiAgICAgICAgICAgID8gdHlwZXMuam9pbihcIiwgXCIpXG4gICAgICAgICAgICA6IHR5cGVzLm5hbWUsXG4gICAgICAgIHR5cGVvZiB2YWx1ZVxuICAgICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZWdpc3RlciB0aGUgVHlwZVZhbGlkYXRvciB3aXRoIHRoZSBWYWxpZGF0aW9uIHJlZ2lzdHJ5XG4gKiBAc3VtbWFyeSBUaGlzIHJlZ2lzdHJhdGlvbiBhc3NvY2lhdGVzIHRoZSBUeXBlVmFsaWRhdG9yIHdpdGggdGhlIE1vZGVsS2V5cy5UWVBFIGtleSxcbiAqIGFsbG93aW5nIGl0IHRvIGJlIHVzZWQgZm9yIHZhbGlkYXRpbmcgZGVzaWduIHR5cGVzLiBUaGUgc2F2ZSBmbGFnIGlzIHNldCB0byBmYWxzZVxuICogdG8gcHJldmVudCB0aGUgdmFsaWRhdG9yIGZyb20gYmVpbmcgc2F2ZWQgaW4gdGhlIHN0YW5kYXJkIHZhbGlkYXRvciByZWdpc3RyeS5cbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKi9cblZhbGlkYXRpb24ucmVnaXN0ZXIoe1xuICB2YWxpZGF0b3I6IFR5cGVWYWxpZGF0b3IgYXMgVmFsaWRhdG9yT3B0aW9ucyxcbiAgdmFsaWRhdGlvbktleTogTW9kZWxLZXlzLlRZUEUsXG4gIHNhdmU6IGZhbHNlLFxufSBhcyBWYWxpZGF0b3JEZWZpbml0aW9uKTtcbiJdfQ==
|
|
@@ -1,84 +1,49 @@
|
|
|
1
1
|
import { ValidatorOptions } from "../types";
|
|
2
2
|
import type { PathProxy } from "../../utils";
|
|
3
|
+
import { BaseValidator } from "./BaseValidator";
|
|
3
4
|
/**
|
|
4
|
-
* @description
|
|
5
|
-
*
|
|
6
|
-
* It handles type checking, error message formatting, and defines the common interface
|
|
7
|
-
* that all validators must implement. This class is designed to be extended by specific
|
|
8
|
-
* validator implementations that provide concrete validation logic.
|
|
5
|
+
* @description
|
|
6
|
+
* Abstract class for defining synchronous validators.
|
|
9
7
|
*
|
|
10
|
-
*
|
|
11
|
-
* @param {string[]} acceptedTypes - Array of type names that this validator can validate
|
|
8
|
+
* This class extends the base {@link BaseValidator} and enforces that any implementation of `hasErrors` must be synchronous.
|
|
12
9
|
*
|
|
13
|
-
*
|
|
14
|
-
* @abstract
|
|
10
|
+
* Use this when the validation process is immediate and does not require asynchronous operations.
|
|
15
11
|
*
|
|
16
12
|
* @example
|
|
17
13
|
* ```typescript
|
|
18
|
-
* // Example of
|
|
19
|
-
* class
|
|
20
|
-
* constructor(message: string = "
|
|
21
|
-
*
|
|
22
|
-
* super(message, String.name, Number.name);
|
|
14
|
+
* // Example of a synchronous validator that checks if a number is greater than
|
|
15
|
+
* class GreaterThanValidator extends Validator<{ gt?: number }> {
|
|
16
|
+
* constructor(message: string = "Value must be greater than {0}") {
|
|
17
|
+
* super(message);
|
|
23
18
|
* }
|
|
24
19
|
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
* if (
|
|
28
|
-
* return this.getMessage(
|
|
20
|
+
* hasErrors(value: number, options?: { gt?: number }) {
|
|
21
|
+
* const minValue = options?.gt ?? 0;
|
|
22
|
+
* if (value <= minValue) {
|
|
23
|
+
* return this.getMessage();
|
|
29
24
|
* }
|
|
30
|
-
* return undefined;
|
|
25
|
+
* return undefined;
|
|
31
26
|
* }
|
|
32
27
|
* }
|
|
33
|
-
* ```
|
|
34
28
|
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
29
|
+
* // Example usage:
|
|
30
|
+
* const validator = new GreaterThanValidator();
|
|
31
|
+
* const error = validator.hasErrors(10, { gt: 15 });
|
|
32
|
+
* if (error) {
|
|
33
|
+
* console.log('Value must be greater than 15')
|
|
34
|
+
* } else {
|
|
35
|
+
* console.log('Value is valid');
|
|
36
|
+
* }
|
|
37
|
+
* ```
|
|
40
38
|
*
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
* B->>B: Store message and types
|
|
44
|
-
* B->>B: Wrap hasErrors with type checking
|
|
45
|
-
* C->>V: hasErrors(value, options)
|
|
46
|
-
* alt value type not in acceptedTypes
|
|
47
|
-
* B-->>C: Type error message
|
|
48
|
-
* else value type is accepted
|
|
49
|
-
* V->>V: Custom validation logic
|
|
50
|
-
* V-->>C: Validation result
|
|
51
|
-
* end
|
|
39
|
+
* - If `value` is less than or equal to `gt`, returns the error message.
|
|
40
|
+
* - Otherwise, returns `undefined` indicating validation success.
|
|
52
41
|
*
|
|
53
|
-
* @
|
|
42
|
+
* @see {@link BaseValidator} For the base validator.
|
|
43
|
+
* @see {@link ValidatorOptions} For the base validator options.
|
|
54
44
|
*/
|
|
55
|
-
export declare abstract class Validator<V extends ValidatorOptions = ValidatorOptions> {
|
|
56
|
-
readonly message: string;
|
|
57
|
-
readonly acceptedTypes?: string[];
|
|
45
|
+
export declare abstract class Validator<V extends ValidatorOptions = ValidatorOptions> extends BaseValidator<V, false> {
|
|
58
46
|
protected constructor(message?: string, ...acceptedTypes: string[]);
|
|
59
|
-
/**
|
|
60
|
-
* @description Formats an error message with optional arguments
|
|
61
|
-
* @summary Creates a formatted error message by replacing placeholders with provided arguments.
|
|
62
|
-
* This method uses the string formatting utility to generate consistent error messages
|
|
63
|
-
* across all validators.
|
|
64
|
-
*
|
|
65
|
-
* @param {string} message - The message template with placeholders
|
|
66
|
-
* @param {...any} args - Values to insert into the message template
|
|
67
|
-
* @return {string} The formatted error message
|
|
68
|
-
* @protected
|
|
69
|
-
*/
|
|
70
|
-
protected getMessage(message: string, ...args: any[]): string;
|
|
71
|
-
/**
|
|
72
|
-
* @description Creates a type-checking wrapper around the hasErrors method
|
|
73
|
-
* @summary Wraps the hasErrors method with type validation logic to ensure that
|
|
74
|
-
* the value being validated is of an accepted type before performing specific validation.
|
|
75
|
-
* This method is called during construction if acceptedTypes are provided.
|
|
76
|
-
*
|
|
77
|
-
* @param {Function} unbound - The original hasErrors method to be wrapped
|
|
78
|
-
* @return {Function} A new function that performs type checking before calling the original method
|
|
79
|
-
* @private
|
|
80
|
-
*/
|
|
81
|
-
private checkTypeAndHasErrors;
|
|
82
47
|
/**
|
|
83
48
|
* @description Validates a value against specific validation rules
|
|
84
49
|
* @summary Abstract method that must be implemented by all validator subclasses.
|
|
@@ -97,9 +62,4 @@ export declare abstract class Validator<V extends ValidatorOptions = ValidatorOp
|
|
|
97
62
|
* @see Model#validate
|
|
98
63
|
*/
|
|
99
64
|
abstract hasErrors(value: any, options?: V, proxy?: PathProxy<any>): string | undefined;
|
|
100
|
-
/**
|
|
101
|
-
* @summary Duck typing for Validators
|
|
102
|
-
* @param val
|
|
103
|
-
*/
|
|
104
|
-
static isValidator(val: any): boolean;
|
|
105
65
|
}
|