@decaf-ts/decorator-validation 1.6.1 → 1.6.2
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/README.md +8 -2
- package/dist/decorator-validation.cjs +1154 -352
- package/dist/decorator-validation.esm.cjs +1124 -320
- package/lib/esm/index.d.ts +5 -36
- package/lib/esm/index.js +6 -37
- package/lib/esm/model/Model.d.ts +100 -29
- package/lib/esm/model/Model.js +103 -36
- package/lib/esm/model/constants.d.ts +3 -3
- package/lib/esm/model/constants.js +4 -4
- package/lib/esm/model/construction.d.ts +3 -3
- package/lib/esm/model/construction.js +4 -4
- package/lib/esm/model/decorators.d.ts +4 -4
- package/lib/esm/model/decorators.js +6 -5
- package/lib/esm/model/types.d.ts +30 -11
- package/lib/esm/model/types.js +1 -1
- package/lib/esm/model/validation.d.ts +2 -2
- package/lib/esm/model/validation.js +5 -5
- package/lib/esm/utils/Decoration.d.ts +123 -0
- package/lib/esm/utils/Decoration.js +188 -0
- package/lib/esm/utils/constants.d.ts +27 -9
- package/lib/esm/utils/constants.js +28 -10
- package/lib/esm/utils/dates.d.ts +26 -16
- package/lib/esm/utils/dates.js +27 -17
- package/lib/esm/utils/decorators.d.ts +41 -0
- package/lib/esm/utils/decorators.js +42 -1
- package/lib/esm/utils/hashing.d.ts +50 -6
- package/lib/esm/utils/hashing.js +49 -5
- package/lib/esm/utils/index.d.ts +1 -0
- package/lib/esm/utils/index.js +2 -1
- package/lib/esm/utils/registry.d.ts +2 -2
- package/lib/esm/utils/registry.js +1 -1
- package/lib/esm/utils/serialization.d.ts +1 -1
- package/lib/esm/utils/serialization.js +2 -2
- package/lib/esm/utils/strings.d.ts +4 -4
- package/lib/esm/utils/strings.js +5 -5
- package/lib/esm/utils/types.d.ts +123 -16
- package/lib/esm/utils/types.js +1 -1
- package/lib/esm/validation/Validators/DateValidator.d.ts +40 -8
- package/lib/esm/validation/Validators/DateValidator.js +41 -9
- package/lib/esm/validation/Validators/EmailValidator.d.ts +39 -7
- package/lib/esm/validation/Validators/EmailValidator.js +40 -8
- package/lib/esm/validation/Validators/ListValidator.d.ts +44 -6
- package/lib/esm/validation/Validators/ListValidator.js +45 -7
- package/lib/esm/validation/Validators/MaxValidator.d.ts +52 -6
- package/lib/esm/validation/Validators/MaxValidator.js +53 -7
- package/lib/esm/validation/Validators/MinValidator.d.ts +52 -6
- package/lib/esm/validation/Validators/MinValidator.js +53 -7
- package/lib/esm/validation/Validators/PatternValidator.d.ts +75 -9
- package/lib/esm/validation/Validators/PatternValidator.js +76 -10
- package/lib/esm/validation/Validators/RequiredValidator.d.ts +52 -6
- package/lib/esm/validation/Validators/RequiredValidator.js +53 -7
- package/lib/esm/validation/Validators/TypeValidator.d.ts +60 -6
- package/lib/esm/validation/Validators/TypeValidator.js +69 -7
- package/lib/esm/validation/Validators/URLValidator.d.ts +41 -7
- package/lib/esm/validation/Validators/URLValidator.js +42 -8
- package/lib/esm/validation/Validators/Validator.d.ts +77 -14
- package/lib/esm/validation/Validators/Validator.js +68 -11
- package/lib/esm/validation/Validators/ValidatorRegistry.d.ts +1 -7
- package/lib/esm/validation/Validators/ValidatorRegistry.js +4 -11
- package/lib/esm/validation/decorators.d.ts +50 -40
- package/lib/esm/validation/decorators.js +102 -53
- package/lib/esm/validation/types.d.ts +146 -28
- package/lib/esm/validation/types.js +1 -1
- package/lib/index.cjs +7 -38
- package/lib/index.d.ts +5 -36
- package/lib/model/Model.cjs +103 -38
- package/lib/model/Model.d.ts +100 -29
- package/lib/model/constants.cjs +4 -4
- package/lib/model/constants.d.ts +3 -3
- package/lib/model/construction.cjs +4 -4
- package/lib/model/construction.d.ts +3 -3
- package/lib/model/decorators.cjs +6 -5
- package/lib/model/decorators.d.ts +4 -4
- package/lib/model/types.cjs +1 -1
- package/lib/model/types.d.ts +30 -11
- package/lib/model/validation.cjs +4 -4
- package/lib/model/validation.d.ts +2 -2
- package/lib/utils/Decoration.cjs +192 -0
- package/lib/utils/Decoration.d.ts +123 -0
- package/lib/utils/constants.cjs +29 -11
- package/lib/utils/constants.d.ts +27 -9
- package/lib/utils/dates.cjs +27 -17
- package/lib/utils/dates.d.ts +26 -16
- package/lib/utils/decorators.cjs +42 -1
- package/lib/utils/decorators.d.ts +41 -0
- package/lib/utils/hashing.cjs +49 -5
- package/lib/utils/hashing.d.ts +50 -6
- package/lib/utils/index.cjs +2 -1
- package/lib/utils/index.d.ts +1 -0
- package/lib/utils/registry.cjs +1 -1
- package/lib/utils/registry.d.ts +2 -2
- package/lib/utils/serialization.cjs +2 -2
- package/lib/utils/serialization.d.ts +1 -1
- package/lib/utils/strings.cjs +5 -5
- package/lib/utils/strings.d.ts +4 -4
- package/lib/utils/types.cjs +1 -1
- package/lib/utils/types.d.ts +123 -16
- package/lib/validation/Validators/DateValidator.cjs +41 -9
- package/lib/validation/Validators/DateValidator.d.ts +40 -8
- package/lib/validation/Validators/EmailValidator.cjs +40 -8
- package/lib/validation/Validators/EmailValidator.d.ts +39 -7
- package/lib/validation/Validators/ListValidator.cjs +45 -7
- package/lib/validation/Validators/ListValidator.d.ts +44 -6
- package/lib/validation/Validators/MaxValidator.cjs +53 -7
- package/lib/validation/Validators/MaxValidator.d.ts +52 -6
- package/lib/validation/Validators/MinValidator.cjs +53 -7
- package/lib/validation/Validators/MinValidator.d.ts +52 -6
- package/lib/validation/Validators/PatternValidator.cjs +76 -10
- package/lib/validation/Validators/PatternValidator.d.ts +75 -9
- package/lib/validation/Validators/RequiredValidator.cjs +53 -7
- package/lib/validation/Validators/RequiredValidator.d.ts +52 -6
- package/lib/validation/Validators/TypeValidator.cjs +69 -7
- package/lib/validation/Validators/TypeValidator.d.ts +60 -6
- package/lib/validation/Validators/URLValidator.cjs +42 -8
- package/lib/validation/Validators/URLValidator.d.ts +41 -7
- package/lib/validation/Validators/Validator.cjs +68 -11
- package/lib/validation/Validators/Validator.d.ts +77 -14
- package/lib/validation/Validators/ValidatorRegistry.cjs +4 -12
- package/lib/validation/Validators/ValidatorRegistry.d.ts +1 -7
- package/lib/validation/decorators.cjs +102 -53
- package/lib/validation/decorators.d.ts +50 -40
- package/lib/validation/types.cjs +1 -1
- package/lib/validation/types.d.ts +146 -28
- package/package.json +2 -2
|
@@ -11,13 +11,55 @@ import { Validator } from "./Validator";
|
|
|
11
11
|
import { DEFAULT_ERROR_MESSAGES, ValidationKeys } from "./constants";
|
|
12
12
|
import { validator } from "./decorators";
|
|
13
13
|
/**
|
|
14
|
-
* @
|
|
14
|
+
* @description Validator for checking if a value is present and not empty
|
|
15
|
+
* @summary The RequiredValidator ensures that a value is provided and not empty.
|
|
16
|
+
* It handles different types of values appropriately: for booleans and numbers,
|
|
17
|
+
* it checks if they're undefined; for other types (strings, arrays, objects),
|
|
18
|
+
* it checks if they're falsy. This validator is typically used with the @required decorator
|
|
19
|
+
* and is often the first validation applied to important fields.
|
|
15
20
|
*
|
|
16
|
-
* @param {string} [message] defaults to {@link DEFAULT_ERROR_MESSAGES#REQUIRED}
|
|
21
|
+
* @param {string} [message] - Custom error message to display when validation fails, defaults to {@link DEFAULT_ERROR_MESSAGES#REQUIRED}
|
|
17
22
|
*
|
|
18
23
|
* @class RequiredValidator
|
|
19
24
|
* @extends Validator
|
|
20
25
|
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```typescript
|
|
28
|
+
* // Create a required validator with default error message
|
|
29
|
+
* const requiredValidator = new RequiredValidator();
|
|
30
|
+
*
|
|
31
|
+
* // Create a required validator with custom error message
|
|
32
|
+
* const customRequiredValidator = new RequiredValidator("This field is mandatory");
|
|
33
|
+
*
|
|
34
|
+
* // Validate different types of values
|
|
35
|
+
* requiredValidator.hasErrors("Hello"); // undefined (valid)
|
|
36
|
+
* requiredValidator.hasErrors(""); // Returns error message (invalid)
|
|
37
|
+
* requiredValidator.hasErrors(0); // undefined (valid - 0 is a valid number)
|
|
38
|
+
* requiredValidator.hasErrors(null); // Returns error message (invalid)
|
|
39
|
+
* requiredValidator.hasErrors([]); // undefined (valid - empty array is still an array)
|
|
40
|
+
* ```
|
|
41
|
+
*
|
|
42
|
+
* @mermaid
|
|
43
|
+
* sequenceDiagram
|
|
44
|
+
* participant C as Client
|
|
45
|
+
* participant V as RequiredValidator
|
|
46
|
+
*
|
|
47
|
+
* C->>V: new RequiredValidator(message)
|
|
48
|
+
* C->>V: hasErrors(value, options)
|
|
49
|
+
* alt typeof value is boolean or number
|
|
50
|
+
* alt value is undefined
|
|
51
|
+
* V-->>C: Error message
|
|
52
|
+
* else value is defined
|
|
53
|
+
* V-->>C: undefined (valid)
|
|
54
|
+
* end
|
|
55
|
+
* else other types
|
|
56
|
+
* alt value is falsy (null, undefined, empty string)
|
|
57
|
+
* V-->>C: Error message
|
|
58
|
+
* else value is truthy
|
|
59
|
+
* V-->>C: undefined (valid)
|
|
60
|
+
* end
|
|
61
|
+
* end
|
|
62
|
+
*
|
|
21
63
|
* @category Validators
|
|
22
64
|
*/
|
|
23
65
|
let RequiredValidator = class RequiredValidator extends Validator {
|
|
@@ -25,12 +67,16 @@ let RequiredValidator = class RequiredValidator extends Validator {
|
|
|
25
67
|
super(message);
|
|
26
68
|
}
|
|
27
69
|
/**
|
|
28
|
-
* @
|
|
70
|
+
* @description Checks if a value is present and not empty
|
|
71
|
+
* @summary Validates that the provided value exists and is not empty.
|
|
72
|
+
* The validation logic varies by type:
|
|
73
|
+
* - For booleans and numbers: checks if the value is undefined
|
|
74
|
+
* - For other types (strings, arrays, objects): checks if the value is falsy
|
|
29
75
|
*
|
|
30
|
-
* @param {
|
|
31
|
-
* @param {ValidatorOptions} [options={}]
|
|
76
|
+
* @param {any} value - The value to validate
|
|
77
|
+
* @param {ValidatorOptions} [options={}] - Optional configuration options
|
|
32
78
|
*
|
|
33
|
-
* @return {string | undefined}
|
|
79
|
+
* @return {string | undefined} Error message if validation fails, undefined if validation passes
|
|
34
80
|
*
|
|
35
81
|
* @override
|
|
36
82
|
*
|
|
@@ -55,4 +101,4 @@ RequiredValidator = __decorate([
|
|
|
55
101
|
__metadata("design:paramtypes", [String])
|
|
56
102
|
], RequiredValidator);
|
|
57
103
|
export { RequiredValidator };
|
|
58
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
104
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVxdWlyZWRWYWxpZGF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdmFsaWRhdGlvbi9WYWxpZGF0b3JzL1JlcXVpcmVkVmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDeEMsT0FBTyxFQUFFLHNCQUFzQixFQUFFLGNBQWMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNyRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBR3pDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtREc7QUFFSSxJQUFNLGlCQUFpQixHQUF2QixNQUFNLGlCQUFrQixTQUFRLFNBQVM7SUFDOUMsWUFBWSxVQUFrQixzQkFBc0IsQ0FBQyxRQUFRO1FBQzNELEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNqQixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7OztPQWVHO0lBQ0ksU0FBUyxDQUNkLEtBQVUsRUFDVixVQUE0QixFQUFFO1FBRTlCLFFBQVEsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNyQixLQUFLLFNBQVMsQ0FBQztZQUNmLEtBQUssUUFBUTtnQkFDWCxPQUFPLE9BQU8sS0FBSyxLQUFLLFdBQVc7b0JBQ2pDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQztvQkFDbEQsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUNoQjtnQkFDRSxPQUFPLENBQUMsS0FBSztvQkFDWCxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUM7b0JBQ2xELENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDbEIsQ0FBQztJQUNILENBQUM7Q0FDRixDQUFBO0FBckNZLGlCQUFpQjtJQUQ3QixTQUFTLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQzs7R0FDdEIsaUJBQWlCLENBcUM3QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFZhbGlkYXRvciB9IGZyb20gXCIuL1ZhbGlkYXRvclwiO1xuaW1wb3J0IHsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUywgVmFsaWRhdGlvbktleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHZhbGlkYXRvciB9IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IFZhbGlkYXRvck9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVmFsaWRhdG9yIGZvciBjaGVja2luZyBpZiBhIHZhbHVlIGlzIHByZXNlbnQgYW5kIG5vdCBlbXB0eVxuICogQHN1bW1hcnkgVGhlIFJlcXVpcmVkVmFsaWRhdG9yIGVuc3VyZXMgdGhhdCBhIHZhbHVlIGlzIHByb3ZpZGVkIGFuZCBub3QgZW1wdHkuXG4gKiBJdCBoYW5kbGVzIGRpZmZlcmVudCB0eXBlcyBvZiB2YWx1ZXMgYXBwcm9wcmlhdGVseTogZm9yIGJvb2xlYW5zIGFuZCBudW1iZXJzLFxuICogaXQgY2hlY2tzIGlmIHRoZXkncmUgdW5kZWZpbmVkOyBmb3Igb3RoZXIgdHlwZXMgKHN0cmluZ3MsIGFycmF5cywgb2JqZWN0cyksXG4gKiBpdCBjaGVja3MgaWYgdGhleSdyZSBmYWxzeS4gVGhpcyB2YWxpZGF0b3IgaXMgdHlwaWNhbGx5IHVzZWQgd2l0aCB0aGUgQHJlcXVpcmVkIGRlY29yYXRvclxuICogYW5kIGlzIG9mdGVuIHRoZSBmaXJzdCB2YWxpZGF0aW9uIGFwcGxpZWQgdG8gaW1wb3J0YW50IGZpZWxkcy5cbiAqIFxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSAtIEN1c3RvbSBlcnJvciBtZXNzYWdlIHRvIGRpc3BsYXkgd2hlbiB2YWxpZGF0aW9uIGZhaWxzLCBkZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNSRVFVSVJFRH1cbiAqIFxuICogQGNsYXNzIFJlcXVpcmVkVmFsaWRhdG9yXG4gKiBAZXh0ZW5kcyBWYWxpZGF0b3JcbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENyZWF0ZSBhIHJlcXVpcmVkIHZhbGlkYXRvciB3aXRoIGRlZmF1bHQgZXJyb3IgbWVzc2FnZVxuICogY29uc3QgcmVxdWlyZWRWYWxpZGF0b3IgPSBuZXcgUmVxdWlyZWRWYWxpZGF0b3IoKTtcbiAqIFxuICogLy8gQ3JlYXRlIGEgcmVxdWlyZWQgdmFsaWRhdG9yIHdpdGggY3VzdG9tIGVycm9yIG1lc3NhZ2VcbiAqIGNvbnN0IGN1c3RvbVJlcXVpcmVkVmFsaWRhdG9yID0gbmV3IFJlcXVpcmVkVmFsaWRhdG9yKFwiVGhpcyBmaWVsZCBpcyBtYW5kYXRvcnlcIik7XG4gKiBcbiAqIC8vIFZhbGlkYXRlIGRpZmZlcmVudCB0eXBlcyBvZiB2YWx1ZXNcbiAqIHJlcXVpcmVkVmFsaWRhdG9yLmhhc0Vycm9ycyhcIkhlbGxvXCIpOyAvLyB1bmRlZmluZWQgKHZhbGlkKVxuICogcmVxdWlyZWRWYWxpZGF0b3IuaGFzRXJyb3JzKFwiXCIpOyAvLyBSZXR1cm5zIGVycm9yIG1lc3NhZ2UgKGludmFsaWQpXG4gKiByZXF1aXJlZFZhbGlkYXRvci5oYXNFcnJvcnMoMCk7IC8vIHVuZGVmaW5lZCAodmFsaWQgLSAwIGlzIGEgdmFsaWQgbnVtYmVyKVxuICogcmVxdWlyZWRWYWxpZGF0b3IuaGFzRXJyb3JzKG51bGwpOyAvLyBSZXR1cm5zIGVycm9yIG1lc3NhZ2UgKGludmFsaWQpXG4gKiByZXF1aXJlZFZhbGlkYXRvci5oYXNFcnJvcnMoW10pOyAvLyB1bmRlZmluZWQgKHZhbGlkIC0gZW1wdHkgYXJyYXkgaXMgc3RpbGwgYW4gYXJyYXkpXG4gKiBgYGBcbiAqIFxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDIGFzIENsaWVudFxuICogICBwYXJ0aWNpcGFudCBWIGFzIFJlcXVpcmVkVmFsaWRhdG9yXG4gKiAgIFxuICogICBDLT4+VjogbmV3IFJlcXVpcmVkVmFsaWRhdG9yKG1lc3NhZ2UpXG4gKiAgIEMtPj5WOiBoYXNFcnJvcnModmFsdWUsIG9wdGlvbnMpXG4gKiAgIGFsdCB0eXBlb2YgdmFsdWUgaXMgYm9vbGVhbiBvciBudW1iZXJcbiAqICAgICBhbHQgdmFsdWUgaXMgdW5kZWZpbmVkXG4gKiAgICAgICBWLS0+PkM6IEVycm9yIG1lc3NhZ2VcbiAqICAgICBlbHNlIHZhbHVlIGlzIGRlZmluZWRcbiAqICAgICAgIFYtLT4+QzogdW5kZWZpbmVkICh2YWxpZClcbiAqICAgICBlbmRcbiAqICAgZWxzZSBvdGhlciB0eXBlc1xuICogICAgIGFsdCB2YWx1ZSBpcyBmYWxzeSAobnVsbCwgdW5kZWZpbmVkLCBlbXB0eSBzdHJpbmcpXG4gKiAgICAgICBWLS0+PkM6IEVycm9yIG1lc3NhZ2VcbiAqICAgICBlbHNlIHZhbHVlIGlzIHRydXRoeVxuICogICAgICAgVi0tPj5DOiB1bmRlZmluZWQgKHZhbGlkKVxuICogICAgIGVuZFxuICogICBlbmRcbiAqIFxuICogQGNhdGVnb3J5IFZhbGlkYXRvcnNcbiAqL1xuQHZhbGlkYXRvcihWYWxpZGF0aW9uS2V5cy5SRVFVSVJFRClcbmV4cG9ydCBjbGFzcyBSZXF1aXJlZFZhbGlkYXRvciBleHRlbmRzIFZhbGlkYXRvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuUkVRVUlSRUQpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ2hlY2tzIGlmIGEgdmFsdWUgaXMgcHJlc2VudCBhbmQgbm90IGVtcHR5XG4gICAqIEBzdW1tYXJ5IFZhbGlkYXRlcyB0aGF0IHRoZSBwcm92aWRlZCB2YWx1ZSBleGlzdHMgYW5kIGlzIG5vdCBlbXB0eS5cbiAgICogVGhlIHZhbGlkYXRpb24gbG9naWMgdmFyaWVzIGJ5IHR5cGU6XG4gICAqIC0gRm9yIGJvb2xlYW5zIGFuZCBudW1iZXJzOiBjaGVja3MgaWYgdGhlIHZhbHVlIGlzIHVuZGVmaW5lZFxuICAgKiAtIEZvciBvdGhlciB0eXBlcyAoc3RyaW5ncywgYXJyYXlzLCBvYmplY3RzKTogY2hlY2tzIGlmIHRoZSB2YWx1ZSBpcyBmYWxzeVxuICAgKlxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gdmFsaWRhdGVcbiAgICogQHBhcmFtIHtWYWxpZGF0b3JPcHRpb25zfSBbb3B0aW9ucz17fV0gLSBPcHRpb25hbCBjb25maWd1cmF0aW9uIG9wdGlvbnNcbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfSBFcnJvciBtZXNzYWdlIGlmIHZhbGlkYXRpb24gZmFpbHMsIHVuZGVmaW5lZCBpZiB2YWxpZGF0aW9uIHBhc3Nlc1xuICAgKlxuICAgKiBAb3ZlcnJpZGVcbiAgICpcbiAgICogQHNlZSBWYWxpZGF0b3IjaGFzRXJyb3JzXG4gICAqL1xuICBwdWJsaWMgaGFzRXJyb3JzKFxuICAgIHZhbHVlOiBhbnksXG4gICAgb3B0aW9uczogVmFsaWRhdG9yT3B0aW9ucyA9IHt9XG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwidW5kZWZpbmVkXCJcbiAgICAgICAgICA/IHRoaXMuZ2V0TWVzc2FnZShvcHRpb25zLm1lc3NhZ2UgfHwgdGhpcy5tZXNzYWdlKVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICF2YWx1ZVxuICAgICAgICAgID8gdGhpcy5nZXRNZXNzYWdlKG9wdGlvbnMubWVzc2FnZSB8fCB0aGlzLm1lc3NhZ2UpXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
@@ -1,21 +1,75 @@
|
|
|
1
1
|
import { Validator } from "./Validator";
|
|
2
2
|
import { TypeValidatorOptions } from "../types";
|
|
3
3
|
/**
|
|
4
|
-
* @
|
|
4
|
+
* @description Validator for checking if a value is of the expected type(s)
|
|
5
|
+
* @summary The TypeValidator ensures that a value matches one of the specified types.
|
|
6
|
+
* It can validate against a single type, multiple types, or a type with a specific name.
|
|
7
|
+
* This validator is typically used with the @type decorator and is fundamental for
|
|
8
|
+
* ensuring type safety in validated models.
|
|
5
9
|
*
|
|
6
|
-
* @
|
|
10
|
+
* @param {string} [message] - Custom error message to display when validation fails, defaults to {@link DEFAULT_ERROR_MESSAGES#TYPE}
|
|
11
|
+
*
|
|
12
|
+
* @class TypeValidator
|
|
7
13
|
* @extends Validator
|
|
8
14
|
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```typescript
|
|
17
|
+
* // Create a type validator with default error message
|
|
18
|
+
* const typeValidator = new TypeValidator();
|
|
19
|
+
*
|
|
20
|
+
* // Create a type validator with custom error message
|
|
21
|
+
* const customTypeValidator = new TypeValidator("Value must be of type {0}, but got {1}");
|
|
22
|
+
*
|
|
23
|
+
* // Validate against a single type
|
|
24
|
+
* const stringOptions = { types: "string" };
|
|
25
|
+
* typeValidator.hasErrors("hello", stringOptions); // undefined (valid)
|
|
26
|
+
* typeValidator.hasErrors(123, stringOptions); // Returns error message (invalid)
|
|
27
|
+
*
|
|
28
|
+
* // Validate against multiple types
|
|
29
|
+
* const multiOptions = { types: ["string", "number"] };
|
|
30
|
+
* typeValidator.hasErrors("hello", multiOptions); // undefined (valid)
|
|
31
|
+
* typeValidator.hasErrors(123, multiOptions); // undefined (valid)
|
|
32
|
+
* typeValidator.hasErrors(true, multiOptions); // Returns error message (invalid)
|
|
33
|
+
*
|
|
34
|
+
* // Validate against a class type
|
|
35
|
+
* const classOptions = { types: { name: "Date" } };
|
|
36
|
+
* typeValidator.hasErrors(new Date(), classOptions); // undefined (valid)
|
|
37
|
+
* ```
|
|
38
|
+
*
|
|
39
|
+
* @mermaid
|
|
40
|
+
* sequenceDiagram
|
|
41
|
+
* participant C as Client
|
|
42
|
+
* participant V as TypeValidator
|
|
43
|
+
* participant R as Reflection
|
|
44
|
+
*
|
|
45
|
+
* C->>V: new TypeValidator(message)
|
|
46
|
+
* C->>V: hasErrors(value, options)
|
|
47
|
+
* alt value is undefined
|
|
48
|
+
* V-->>C: undefined (valid)
|
|
49
|
+
* else value is defined
|
|
50
|
+
* V->>R: evaluateDesignTypes(value, types)
|
|
51
|
+
* alt type evaluation passes
|
|
52
|
+
* V-->>C: undefined (valid)
|
|
53
|
+
* else type evaluation fails
|
|
54
|
+
* V->>V: Format error message with type info
|
|
55
|
+
* V-->>C: Error message
|
|
56
|
+
* end
|
|
57
|
+
* end
|
|
58
|
+
*
|
|
9
59
|
* @category Validators
|
|
10
60
|
*/
|
|
11
61
|
export declare class TypeValidator extends Validator<TypeValidatorOptions> {
|
|
12
62
|
constructor(message?: string);
|
|
13
63
|
/**
|
|
14
|
-
* @
|
|
15
|
-
* @
|
|
16
|
-
*
|
|
64
|
+
* @description Checks if a value is of the expected type(s)
|
|
65
|
+
* @summary Validates that the provided value matches one of the specified types.
|
|
66
|
+
* It uses the Reflection utility to evaluate if the value's type matches the expected types.
|
|
67
|
+
* The method skips validation for undefined values to avoid conflicts with the RequiredValidator.
|
|
68
|
+
*
|
|
69
|
+
* @param {any} value - The value to validate
|
|
70
|
+
* @param {TypeValidatorOptions} options - Configuration options containing the expected types
|
|
17
71
|
*
|
|
18
|
-
* @return {string | undefined}
|
|
72
|
+
* @return {string | undefined} Error message if validation fails, undefined if validation passes
|
|
19
73
|
*
|
|
20
74
|
* @override
|
|
21
75
|
*
|
|
@@ -14,11 +14,61 @@ import { Validation } from "../Validation";
|
|
|
14
14
|
import { ModelKeys } from "../../utils/constants";
|
|
15
15
|
import { Reflection } from "@decaf-ts/reflection";
|
|
16
16
|
/**
|
|
17
|
-
* @
|
|
17
|
+
* @description Validator for checking if a value is of the expected type(s)
|
|
18
|
+
* @summary The TypeValidator ensures that a value matches one of the specified types.
|
|
19
|
+
* It can validate against a single type, multiple types, or a type with a specific name.
|
|
20
|
+
* This validator is typically used with the @type decorator and is fundamental for
|
|
21
|
+
* ensuring type safety in validated models.
|
|
18
22
|
*
|
|
19
|
-
* @
|
|
23
|
+
* @param {string} [message] - Custom error message to display when validation fails, defaults to {@link DEFAULT_ERROR_MESSAGES#TYPE}
|
|
24
|
+
*
|
|
25
|
+
* @class TypeValidator
|
|
20
26
|
* @extends Validator
|
|
21
27
|
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```typescript
|
|
30
|
+
* // Create a type validator with default error message
|
|
31
|
+
* const typeValidator = new TypeValidator();
|
|
32
|
+
*
|
|
33
|
+
* // Create a type validator with custom error message
|
|
34
|
+
* const customTypeValidator = new TypeValidator("Value must be of type {0}, but got {1}");
|
|
35
|
+
*
|
|
36
|
+
* // Validate against a single type
|
|
37
|
+
* const stringOptions = { types: "string" };
|
|
38
|
+
* typeValidator.hasErrors("hello", stringOptions); // undefined (valid)
|
|
39
|
+
* typeValidator.hasErrors(123, stringOptions); // Returns error message (invalid)
|
|
40
|
+
*
|
|
41
|
+
* // Validate against multiple types
|
|
42
|
+
* const multiOptions = { types: ["string", "number"] };
|
|
43
|
+
* typeValidator.hasErrors("hello", multiOptions); // undefined (valid)
|
|
44
|
+
* typeValidator.hasErrors(123, multiOptions); // undefined (valid)
|
|
45
|
+
* typeValidator.hasErrors(true, multiOptions); // Returns error message (invalid)
|
|
46
|
+
*
|
|
47
|
+
* // Validate against a class type
|
|
48
|
+
* const classOptions = { types: { name: "Date" } };
|
|
49
|
+
* typeValidator.hasErrors(new Date(), classOptions); // undefined (valid)
|
|
50
|
+
* ```
|
|
51
|
+
*
|
|
52
|
+
* @mermaid
|
|
53
|
+
* sequenceDiagram
|
|
54
|
+
* participant C as Client
|
|
55
|
+
* participant V as TypeValidator
|
|
56
|
+
* participant R as Reflection
|
|
57
|
+
*
|
|
58
|
+
* C->>V: new TypeValidator(message)
|
|
59
|
+
* C->>V: hasErrors(value, options)
|
|
60
|
+
* alt value is undefined
|
|
61
|
+
* V-->>C: undefined (valid)
|
|
62
|
+
* else value is defined
|
|
63
|
+
* V->>R: evaluateDesignTypes(value, types)
|
|
64
|
+
* alt type evaluation passes
|
|
65
|
+
* V-->>C: undefined (valid)
|
|
66
|
+
* else type evaluation fails
|
|
67
|
+
* V->>V: Format error message with type info
|
|
68
|
+
* V-->>C: Error message
|
|
69
|
+
* end
|
|
70
|
+
* end
|
|
71
|
+
*
|
|
22
72
|
* @category Validators
|
|
23
73
|
*/
|
|
24
74
|
let TypeValidator = class TypeValidator extends Validator {
|
|
@@ -26,11 +76,15 @@ let TypeValidator = class TypeValidator extends Validator {
|
|
|
26
76
|
super(message);
|
|
27
77
|
}
|
|
28
78
|
/**
|
|
29
|
-
* @
|
|
30
|
-
* @
|
|
31
|
-
*
|
|
79
|
+
* @description Checks if a value is of the expected type(s)
|
|
80
|
+
* @summary Validates that the provided value matches one of the specified types.
|
|
81
|
+
* It uses the Reflection utility to evaluate if the value's type matches the expected types.
|
|
82
|
+
* The method skips validation for undefined values to avoid conflicts with the RequiredValidator.
|
|
83
|
+
*
|
|
84
|
+
* @param {any} value - The value to validate
|
|
85
|
+
* @param {TypeValidatorOptions} options - Configuration options containing the expected types
|
|
32
86
|
*
|
|
33
|
-
* @return {string | undefined}
|
|
87
|
+
* @return {string | undefined} Error message if validation fails, undefined if validation passes
|
|
34
88
|
*
|
|
35
89
|
* @override
|
|
36
90
|
*
|
|
@@ -53,9 +107,17 @@ TypeValidator = __decorate([
|
|
|
53
107
|
__metadata("design:paramtypes", [String])
|
|
54
108
|
], TypeValidator);
|
|
55
109
|
export { TypeValidator };
|
|
110
|
+
/**
|
|
111
|
+
* @description Register the TypeValidator with the Validation registry
|
|
112
|
+
* @summary This registration associates the TypeValidator with the ModelKeys.TYPE key,
|
|
113
|
+
* allowing it to be used for validating design types. The save flag is set to false
|
|
114
|
+
* to prevent the validator from being saved in the standard validator registry.
|
|
115
|
+
*
|
|
116
|
+
* @memberOf module:decorator-validation
|
|
117
|
+
*/
|
|
56
118
|
Validation.register({
|
|
57
119
|
validator: TypeValidator,
|
|
58
120
|
validationKey: ModelKeys.TYPE,
|
|
59
121
|
save: false,
|
|
60
122
|
});
|
|
61
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
123
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHlwZVZhbGlkYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvVHlwZVZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxjQUFjLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDckUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN6QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFbEQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlERztBQUVJLElBQU0sYUFBYSxHQUFuQixNQUFNLGFBQWMsU0FBUSxTQUErQjtJQUNoRSxZQUFZLFVBQWtCLHNCQUFzQixDQUFDLElBQUk7UUFDdkQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7T0FjRztJQUNJLFNBQVMsQ0FDZCxLQUFVLEVBQ1YsT0FBNkI7UUFFN0IsSUFBSSxLQUFLLEtBQUssU0FBUztZQUFFLE9BQU8sQ0FBQywwQ0FBMEM7UUFDM0UsTUFBTSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsR0FBRyxPQUFPLENBQUM7UUFDbkMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDO1lBQy9DLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FDcEIsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQ3ZCLE9BQU8sS0FBSyxLQUFLLFFBQVE7Z0JBQ3ZCLENBQUMsQ0FBQyxLQUFLO2dCQUNQLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztvQkFDcEIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO29CQUNsQixDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksRUFDaEIsT0FBTyxLQUFLLENBQ2IsQ0FBQztJQUNOLENBQUM7Q0FDRixDQUFBO0FBckNZLGFBQWE7SUFEekIsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUM7O0dBQ2xCLGFBQWEsQ0FxQ3pCOztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxVQUFVLENBQUMsUUFBUSxDQUFDO0lBQ2xCLFNBQVMsRUFBRSxhQUFhO0lBQ3hCLGFBQWEsRUFBRSxTQUFTLENBQUMsSUFBSTtJQUM3QixJQUFJLEVBQUUsS0FBSztDQUNXLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFZhbGlkYXRvciB9IGZyb20gXCIuL1ZhbGlkYXRvclwiO1xuaW1wb3J0IHsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUywgVmFsaWRhdGlvbktleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHZhbGlkYXRvciB9IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IFZhbGlkYXRpb24gfSBmcm9tIFwiLi4vVmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgVHlwZVZhbGlkYXRvck9wdGlvbnMsIFZhbGlkYXRvckRlZmluaXRpb24gfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IE1vZGVsS2V5cyB9IGZyb20gXCIuLi8uLi91dGlscy9jb25zdGFudHNcIjtcbmltcG9ydCB7IFJlZmxlY3Rpb24gfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVmFsaWRhdG9yIGZvciBjaGVja2luZyBpZiBhIHZhbHVlIGlzIG9mIHRoZSBleHBlY3RlZCB0eXBlKHMpXG4gKiBAc3VtbWFyeSBUaGUgVHlwZVZhbGlkYXRvciBlbnN1cmVzIHRoYXQgYSB2YWx1ZSBtYXRjaGVzIG9uZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGVzLlxuICogSXQgY2FuIHZhbGlkYXRlIGFnYWluc3QgYSBzaW5nbGUgdHlwZSwgbXVsdGlwbGUgdHlwZXMsIG9yIGEgdHlwZSB3aXRoIGEgc3BlY2lmaWMgbmFtZS5cbiAqIFRoaXMgdmFsaWRhdG9yIGlzIHR5cGljYWxseSB1c2VkIHdpdGggdGhlIEB0eXBlIGRlY29yYXRvciBhbmQgaXMgZnVuZGFtZW50YWwgZm9yXG4gKiBlbnN1cmluZyB0eXBlIHNhZmV0eSBpbiB2YWxpZGF0ZWQgbW9kZWxzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gLSBDdXN0b20gZXJyb3IgbWVzc2FnZSB0byBkaXNwbGF5IHdoZW4gdmFsaWRhdGlvbiBmYWlscywgZGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjVFlQRX1cbiAqXG4gKiBAY2xhc3MgVHlwZVZhbGlkYXRvclxuICogQGV4dGVuZHMgVmFsaWRhdG9yXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENyZWF0ZSBhIHR5cGUgdmFsaWRhdG9yIHdpdGggZGVmYXVsdCBlcnJvciBtZXNzYWdlXG4gKiBjb25zdCB0eXBlVmFsaWRhdG9yID0gbmV3IFR5cGVWYWxpZGF0b3IoKTtcbiAqXG4gKiAvLyBDcmVhdGUgYSB0eXBlIHZhbGlkYXRvciB3aXRoIGN1c3RvbSBlcnJvciBtZXNzYWdlXG4gKiBjb25zdCBjdXN0b21UeXBlVmFsaWRhdG9yID0gbmV3IFR5cGVWYWxpZGF0b3IoXCJWYWx1ZSBtdXN0IGJlIG9mIHR5cGUgezB9LCBidXQgZ290IHsxfVwiKTtcbiAqXG4gKiAvLyBWYWxpZGF0ZSBhZ2FpbnN0IGEgc2luZ2xlIHR5cGVcbiAqIGNvbnN0IHN0cmluZ09wdGlvbnMgPSB7IHR5cGVzOiBcInN0cmluZ1wiIH07XG4gKiB0eXBlVmFsaWRhdG9yLmhhc0Vycm9ycyhcImhlbGxvXCIsIHN0cmluZ09wdGlvbnMpOyAvLyB1bmRlZmluZWQgKHZhbGlkKVxuICogdHlwZVZhbGlkYXRvci5oYXNFcnJvcnMoMTIzLCBzdHJpbmdPcHRpb25zKTsgLy8gUmV0dXJucyBlcnJvciBtZXNzYWdlIChpbnZhbGlkKVxuICpcbiAqIC8vIFZhbGlkYXRlIGFnYWluc3QgbXVsdGlwbGUgdHlwZXNcbiAqIGNvbnN0IG11bHRpT3B0aW9ucyA9IHsgdHlwZXM6IFtcInN0cmluZ1wiLCBcIm51bWJlclwiXSB9O1xuICogdHlwZVZhbGlkYXRvci5oYXNFcnJvcnMoXCJoZWxsb1wiLCBtdWx0aU9wdGlvbnMpOyAvLyB1bmRlZmluZWQgKHZhbGlkKVxuICogdHlwZVZhbGlkYXRvci5oYXNFcnJvcnMoMTIzLCBtdWx0aU9wdGlvbnMpOyAvLyB1bmRlZmluZWQgKHZhbGlkKVxuICogdHlwZVZhbGlkYXRvci5oYXNFcnJvcnModHJ1ZSwgbXVsdGlPcHRpb25zKTsgLy8gUmV0dXJucyBlcnJvciBtZXNzYWdlIChpbnZhbGlkKVxuICpcbiAqIC8vIFZhbGlkYXRlIGFnYWluc3QgYSBjbGFzcyB0eXBlXG4gKiBjb25zdCBjbGFzc09wdGlvbnMgPSB7IHR5cGVzOiB7IG5hbWU6IFwiRGF0ZVwiIH0gfTtcbiAqIHR5cGVWYWxpZGF0b3IuaGFzRXJyb3JzKG5ldyBEYXRlKCksIGNsYXNzT3B0aW9ucyk7IC8vIHVuZGVmaW5lZCAodmFsaWQpXG4gKiBgYGBcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEMgYXMgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IFYgYXMgVHlwZVZhbGlkYXRvclxuICogICBwYXJ0aWNpcGFudCBSIGFzIFJlZmxlY3Rpb25cbiAqXG4gKiAgIEMtPj5WOiBuZXcgVHlwZVZhbGlkYXRvcihtZXNzYWdlKVxuICogICBDLT4+VjogaGFzRXJyb3JzKHZhbHVlLCBvcHRpb25zKVxuICogICBhbHQgdmFsdWUgaXMgdW5kZWZpbmVkXG4gKiAgICAgVi0tPj5DOiB1bmRlZmluZWQgKHZhbGlkKVxuICogICBlbHNlIHZhbHVlIGlzIGRlZmluZWRcbiAqICAgICBWLT4+UjogZXZhbHVhdGVEZXNpZ25UeXBlcyh2YWx1ZSwgdHlwZXMpXG4gKiAgICAgYWx0IHR5cGUgZXZhbHVhdGlvbiBwYXNzZXNcbiAqICAgICAgIFYtLT4+QzogdW5kZWZpbmVkICh2YWxpZClcbiAqICAgICBlbHNlIHR5cGUgZXZhbHVhdGlvbiBmYWlsc1xuICogICAgICAgVi0+PlY6IEZvcm1hdCBlcnJvciBtZXNzYWdlIHdpdGggdHlwZSBpbmZvXG4gKiAgICAgICBWLS0+PkM6IEVycm9yIG1lc3NhZ2VcbiAqICAgICBlbmRcbiAqICAgZW5kXG4gKlxuICogQGNhdGVnb3J5IFZhbGlkYXRvcnNcbiAqL1xuQHZhbGlkYXRvcihWYWxpZGF0aW9uS2V5cy5UWVBFKVxuZXhwb3J0IGNsYXNzIFR5cGVWYWxpZGF0b3IgZXh0ZW5kcyBWYWxpZGF0b3I8VHlwZVZhbGlkYXRvck9wdGlvbnM+IHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5UWVBFKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENoZWNrcyBpZiBhIHZhbHVlIGlzIG9mIHRoZSBleHBlY3RlZCB0eXBlKHMpXG4gICAqIEBzdW1tYXJ5IFZhbGlkYXRlcyB0aGF0IHRoZSBwcm92aWRlZCB2YWx1ZSBtYXRjaGVzIG9uZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGVzLlxuICAgKiBJdCB1c2VzIHRoZSBSZWZsZWN0aW9uIHV0aWxpdHkgdG8gZXZhbHVhdGUgaWYgdGhlIHZhbHVlJ3MgdHlwZSBtYXRjaGVzIHRoZSBleHBlY3RlZCB0eXBlcy5cbiAgICogVGhlIG1ldGhvZCBza2lwcyB2YWxpZGF0aW9uIGZvciB1bmRlZmluZWQgdmFsdWVzIHRvIGF2b2lkIGNvbmZsaWN0cyB3aXRoIHRoZSBSZXF1aXJlZFZhbGlkYXRvci5cbiAgICpcbiAgICogQHBhcmFtIHthbnl9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIHZhbGlkYXRlXG4gICAqIEBwYXJhbSB7VHlwZVZhbGlkYXRvck9wdGlvbnN9IG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgY29udGFpbmluZyB0aGUgZXhwZWN0ZWQgdHlwZXNcbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfSBFcnJvciBtZXNzYWdlIGlmIHZhbGlkYXRpb24gZmFpbHMsIHVuZGVmaW5lZCBpZiB2YWxpZGF0aW9uIHBhc3Nlc1xuICAgKlxuICAgKiBAb3ZlcnJpZGVcbiAgICpcbiAgICogQHNlZSBWYWxpZGF0b3IjaGFzRXJyb3JzXG4gICAqL1xuICBwdWJsaWMgaGFzRXJyb3JzKFxuICAgIHZhbHVlOiBhbnksXG4gICAgb3B0aW9uczogVHlwZVZhbGlkYXRvck9wdGlvbnNcbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuOyAvLyBEb24ndCB0cnkgYW5kIGVuZm9yY2UgdHlwZSBpZiB1bmRlZmluZWRcbiAgICBjb25zdCB7IHR5cGVzLCBtZXNzYWdlIH0gPSBvcHRpb25zO1xuICAgIGlmICghUmVmbGVjdGlvbi5ldmFsdWF0ZURlc2lnblR5cGVzKHZhbHVlLCB0eXBlcykpXG4gICAgICByZXR1cm4gdGhpcy5nZXRNZXNzYWdlKFxuICAgICAgICBtZXNzYWdlIHx8IHRoaXMubWVzc2FnZSxcbiAgICAgICAgdHlwZW9mIHR5cGVzID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgPyB0eXBlc1xuICAgICAgICAgIDogQXJyYXkuaXNBcnJheSh0eXBlcylcbiAgICAgICAgICAgID8gdHlwZXMuam9pbihcIiwgXCIpXG4gICAgICAgICAgICA6IHR5cGVzLm5hbWUsXG4gICAgICAgIHR5cGVvZiB2YWx1ZVxuICAgICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZWdpc3RlciB0aGUgVHlwZVZhbGlkYXRvciB3aXRoIHRoZSBWYWxpZGF0aW9uIHJlZ2lzdHJ5XG4gKiBAc3VtbWFyeSBUaGlzIHJlZ2lzdHJhdGlvbiBhc3NvY2lhdGVzIHRoZSBUeXBlVmFsaWRhdG9yIHdpdGggdGhlIE1vZGVsS2V5cy5UWVBFIGtleSxcbiAqIGFsbG93aW5nIGl0IHRvIGJlIHVzZWQgZm9yIHZhbGlkYXRpbmcgZGVzaWduIHR5cGVzLiBUaGUgc2F2ZSBmbGFnIGlzIHNldCB0byBmYWxzZVxuICogdG8gcHJldmVudCB0aGUgdmFsaWRhdG9yIGZyb20gYmVpbmcgc2F2ZWQgaW4gdGhlIHN0YW5kYXJkIHZhbGlkYXRvciByZWdpc3RyeS5cbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKi9cblZhbGlkYXRpb24ucmVnaXN0ZXIoe1xuICB2YWxpZGF0b3I6IFR5cGVWYWxpZGF0b3IsXG4gIHZhbGlkYXRpb25LZXk6IE1vZGVsS2V5cy5UWVBFLFxuICBzYXZlOiBmYWxzZSxcbn0gYXMgVmFsaWRhdG9yRGVmaW5pdGlvbik7XG4iXX0=
|
|
@@ -1,27 +1,61 @@
|
|
|
1
1
|
import { PatternValidator } from "./PatternValidator";
|
|
2
2
|
import { PatternValidatorOptions } from "../types";
|
|
3
3
|
/**
|
|
4
|
-
* @
|
|
5
|
-
* @
|
|
4
|
+
* @description Validator for checking if a string is a valid URL
|
|
5
|
+
* @summary The URLValidator checks if a string matches a standard URL pattern.
|
|
6
|
+
* It extends the PatternValidator and uses a robust URL regex pattern to validate web addresses.
|
|
7
|
+
* The pattern is sourced from {@link https://gist.github.com/dperini/729294} and is widely
|
|
8
|
+
* recognized for its accuracy in validating URLs. This validator is typically used with the @url decorator.
|
|
9
|
+
*
|
|
10
|
+
* @param {string} [message] - Custom error message to display when validation fails, defaults to {@link DEFAULT_ERROR_MESSAGES#URL}
|
|
6
11
|
*
|
|
7
12
|
* @class URLValidator
|
|
8
13
|
* @extends PatternValidator
|
|
9
14
|
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```typescript
|
|
17
|
+
* // Create a URL validator with default error message
|
|
18
|
+
* const urlValidator = new URLValidator();
|
|
19
|
+
*
|
|
20
|
+
* // Create a URL validator with custom error message
|
|
21
|
+
* const customUrlValidator = new URLValidator("Please enter a valid web address");
|
|
22
|
+
*
|
|
23
|
+
* // Validate a URL
|
|
24
|
+
* const result = urlValidator.hasErrors("https://example.com"); // undefined (valid)
|
|
25
|
+
* const invalidResult = urlValidator.hasErrors("not-a-url"); // Returns error message (invalid)
|
|
26
|
+
* ```
|
|
27
|
+
*
|
|
28
|
+
* @mermaid
|
|
29
|
+
* sequenceDiagram
|
|
30
|
+
* participant C as Client
|
|
31
|
+
* participant U as URLValidator
|
|
32
|
+
* participant P as PatternValidator
|
|
33
|
+
*
|
|
34
|
+
* C->>U: new URLValidator(message)
|
|
35
|
+
* U->>P: super(message)
|
|
36
|
+
* C->>U: hasErrors(value, options)
|
|
37
|
+
* U->>P: super.hasErrors(value, options with URL pattern)
|
|
38
|
+
* P-->>U: validation result
|
|
39
|
+
* U-->>C: validation result
|
|
40
|
+
*
|
|
10
41
|
* @category Validators
|
|
11
42
|
*/
|
|
12
43
|
export declare class URLValidator extends PatternValidator {
|
|
13
44
|
constructor(message?: string);
|
|
14
45
|
/**
|
|
15
|
-
* @
|
|
46
|
+
* @description Checks if a string is a valid URL
|
|
47
|
+
* @summary Validates that the provided string matches the URL pattern.
|
|
48
|
+
* This method extends the PatternValidator's hasErrors method by ensuring
|
|
49
|
+
* the URL pattern is used, even if not explicitly provided in the options.
|
|
16
50
|
*
|
|
17
|
-
* @param {string} value
|
|
18
|
-
* @param {PatternValidatorOptions} [options={}]
|
|
51
|
+
* @param {string} value - The string to validate as a URL
|
|
52
|
+
* @param {PatternValidatorOptions} [options={}] - Optional configuration options
|
|
19
53
|
*
|
|
20
|
-
* @return {string | undefined}
|
|
54
|
+
* @return {string | undefined} Error message if validation fails, undefined if validation passes
|
|
21
55
|
*
|
|
22
56
|
* @override
|
|
23
57
|
*
|
|
24
|
-
* @see
|
|
58
|
+
* @see PatternValidator#hasErrors
|
|
25
59
|
*/
|
|
26
60
|
hasErrors(value: string, options?: PatternValidatorOptions): string | undefined;
|
|
27
61
|
}
|
|
@@ -11,12 +11,43 @@ import { ValidationKeys, DEFAULT_ERROR_MESSAGES, DEFAULT_PATTERNS, } from "./con
|
|
|
11
11
|
import { PatternValidator } from "./PatternValidator";
|
|
12
12
|
import { validator } from "./decorators";
|
|
13
13
|
/**
|
|
14
|
-
* @
|
|
15
|
-
* @
|
|
14
|
+
* @description Validator for checking if a string is a valid URL
|
|
15
|
+
* @summary The URLValidator checks if a string matches a standard URL pattern.
|
|
16
|
+
* It extends the PatternValidator and uses a robust URL regex pattern to validate web addresses.
|
|
17
|
+
* The pattern is sourced from {@link https://gist.github.com/dperini/729294} and is widely
|
|
18
|
+
* recognized for its accuracy in validating URLs. This validator is typically used with the @url decorator.
|
|
19
|
+
*
|
|
20
|
+
* @param {string} [message] - Custom error message to display when validation fails, defaults to {@link DEFAULT_ERROR_MESSAGES#URL}
|
|
16
21
|
*
|
|
17
22
|
* @class URLValidator
|
|
18
23
|
* @extends PatternValidator
|
|
19
24
|
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```typescript
|
|
27
|
+
* // Create a URL validator with default error message
|
|
28
|
+
* const urlValidator = new URLValidator();
|
|
29
|
+
*
|
|
30
|
+
* // Create a URL validator with custom error message
|
|
31
|
+
* const customUrlValidator = new URLValidator("Please enter a valid web address");
|
|
32
|
+
*
|
|
33
|
+
* // Validate a URL
|
|
34
|
+
* const result = urlValidator.hasErrors("https://example.com"); // undefined (valid)
|
|
35
|
+
* const invalidResult = urlValidator.hasErrors("not-a-url"); // Returns error message (invalid)
|
|
36
|
+
* ```
|
|
37
|
+
*
|
|
38
|
+
* @mermaid
|
|
39
|
+
* sequenceDiagram
|
|
40
|
+
* participant C as Client
|
|
41
|
+
* participant U as URLValidator
|
|
42
|
+
* participant P as PatternValidator
|
|
43
|
+
*
|
|
44
|
+
* C->>U: new URLValidator(message)
|
|
45
|
+
* U->>P: super(message)
|
|
46
|
+
* C->>U: hasErrors(value, options)
|
|
47
|
+
* U->>P: super.hasErrors(value, options with URL pattern)
|
|
48
|
+
* P-->>U: validation result
|
|
49
|
+
* U-->>C: validation result
|
|
50
|
+
*
|
|
20
51
|
* @category Validators
|
|
21
52
|
*/
|
|
22
53
|
let URLValidator = class URLValidator extends PatternValidator {
|
|
@@ -24,16 +55,19 @@ let URLValidator = class URLValidator extends PatternValidator {
|
|
|
24
55
|
super(message);
|
|
25
56
|
}
|
|
26
57
|
/**
|
|
27
|
-
* @
|
|
58
|
+
* @description Checks if a string is a valid URL
|
|
59
|
+
* @summary Validates that the provided string matches the URL pattern.
|
|
60
|
+
* This method extends the PatternValidator's hasErrors method by ensuring
|
|
61
|
+
* the URL pattern is used, even if not explicitly provided in the options.
|
|
28
62
|
*
|
|
29
|
-
* @param {string} value
|
|
30
|
-
* @param {PatternValidatorOptions} [options={}]
|
|
63
|
+
* @param {string} value - The string to validate as a URL
|
|
64
|
+
* @param {PatternValidatorOptions} [options={}] - Optional configuration options
|
|
31
65
|
*
|
|
32
|
-
* @return {string | undefined}
|
|
66
|
+
* @return {string | undefined} Error message if validation fails, undefined if validation passes
|
|
33
67
|
*
|
|
34
68
|
* @override
|
|
35
69
|
*
|
|
36
|
-
* @see
|
|
70
|
+
* @see PatternValidator#hasErrors
|
|
37
71
|
*/
|
|
38
72
|
hasErrors(value, options = {}) {
|
|
39
73
|
return super.hasErrors(value, {
|
|
@@ -47,4 +81,4 @@ URLValidator = __decorate([
|
|
|
47
81
|
__metadata("design:paramtypes", [String])
|
|
48
82
|
], URLValidator);
|
|
49
83
|
export { URLValidator };
|
|
50
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
84
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVVJMVmFsaWRhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3ZhbGlkYXRpb24vVmFsaWRhdG9ycy9VUkxWYWxpZGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUNMLGNBQWMsRUFDZCxzQkFBc0IsRUFDdEIsZ0JBQWdCLEdBQ2pCLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFHekM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVDRztBQUVJLElBQU0sWUFBWSxHQUFsQixNQUFNLFlBQWEsU0FBUSxnQkFBZ0I7SUFDaEQsWUFBWSxVQUFrQixzQkFBc0IsQ0FBQyxHQUFHO1FBQ3RELEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNqQixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7O09BY0c7SUFDSSxTQUFTLENBQ2QsS0FBYSxFQUNiLFVBQW1DLEVBQUU7UUFFckMsT0FBTyxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRTtZQUM1QixHQUFHLE9BQU87WUFDVixPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU8sSUFBSSxnQkFBZ0IsQ0FBQyxHQUFHO1NBQ2pELENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRixDQUFBO0FBN0JZLFlBQVk7SUFEeEIsU0FBUyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUM7O0dBQ2pCLFlBQVksQ0E2QnhCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgVmFsaWRhdGlvbktleXMsXG4gIERFRkFVTFRfRVJST1JfTUVTU0FHRVMsXG4gIERFRkFVTFRfUEFUVEVSTlMsXG59IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgUGF0dGVyblZhbGlkYXRvciB9IGZyb20gXCIuL1BhdHRlcm5WYWxpZGF0b3JcIjtcbmltcG9ydCB7IHZhbGlkYXRvciB9IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IFBhdHRlcm5WYWxpZGF0b3JPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFZhbGlkYXRvciBmb3IgY2hlY2tpbmcgaWYgYSBzdHJpbmcgaXMgYSB2YWxpZCBVUkxcbiAqIEBzdW1tYXJ5IFRoZSBVUkxWYWxpZGF0b3IgY2hlY2tzIGlmIGEgc3RyaW5nIG1hdGNoZXMgYSBzdGFuZGFyZCBVUkwgcGF0dGVybi5cbiAqIEl0IGV4dGVuZHMgdGhlIFBhdHRlcm5WYWxpZGF0b3IgYW5kIHVzZXMgYSByb2J1c3QgVVJMIHJlZ2V4IHBhdHRlcm4gdG8gdmFsaWRhdGUgd2ViIGFkZHJlc3Nlcy5cbiAqIFRoZSBwYXR0ZXJuIGlzIHNvdXJjZWQgZnJvbSB7QGxpbmsgaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vZHBlcmluaS83MjkyOTR9IGFuZCBpcyB3aWRlbHlcbiAqIHJlY29nbml6ZWQgZm9yIGl0cyBhY2N1cmFjeSBpbiB2YWxpZGF0aW5nIFVSTHMuIFRoaXMgdmFsaWRhdG9yIGlzIHR5cGljYWxseSB1c2VkIHdpdGggdGhlIEB1cmwgZGVjb3JhdG9yLlxuICogXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIC0gQ3VzdG9tIGVycm9yIG1lc3NhZ2UgdG8gZGlzcGxheSB3aGVuIHZhbGlkYXRpb24gZmFpbHMsIGRlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI1VSTH1cbiAqIFxuICogQGNsYXNzIFVSTFZhbGlkYXRvclxuICogQGV4dGVuZHMgUGF0dGVyblZhbGlkYXRvclxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ3JlYXRlIGEgVVJMIHZhbGlkYXRvciB3aXRoIGRlZmF1bHQgZXJyb3IgbWVzc2FnZVxuICogY29uc3QgdXJsVmFsaWRhdG9yID0gbmV3IFVSTFZhbGlkYXRvcigpO1xuICogXG4gKiAvLyBDcmVhdGUgYSBVUkwgdmFsaWRhdG9yIHdpdGggY3VzdG9tIGVycm9yIG1lc3NhZ2VcbiAqIGNvbnN0IGN1c3RvbVVybFZhbGlkYXRvciA9IG5ldyBVUkxWYWxpZGF0b3IoXCJQbGVhc2UgZW50ZXIgYSB2YWxpZCB3ZWIgYWRkcmVzc1wiKTtcbiAqIFxuICogLy8gVmFsaWRhdGUgYSBVUkxcbiAqIGNvbnN0IHJlc3VsdCA9IHVybFZhbGlkYXRvci5oYXNFcnJvcnMoXCJodHRwczovL2V4YW1wbGUuY29tXCIpOyAvLyB1bmRlZmluZWQgKHZhbGlkKVxuICogY29uc3QgaW52YWxpZFJlc3VsdCA9IHVybFZhbGlkYXRvci5oYXNFcnJvcnMoXCJub3QtYS11cmxcIik7IC8vIFJldHVybnMgZXJyb3IgbWVzc2FnZSAoaW52YWxpZClcbiAqIGBgYFxuICogXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEMgYXMgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IFUgYXMgVVJMVmFsaWRhdG9yXG4gKiAgIHBhcnRpY2lwYW50IFAgYXMgUGF0dGVyblZhbGlkYXRvclxuICogICBcbiAqICAgQy0+PlU6IG5ldyBVUkxWYWxpZGF0b3IobWVzc2FnZSlcbiAqICAgVS0+PlA6IHN1cGVyKG1lc3NhZ2UpXG4gKiAgIEMtPj5VOiBoYXNFcnJvcnModmFsdWUsIG9wdGlvbnMpXG4gKiAgIFUtPj5QOiBzdXBlci5oYXNFcnJvcnModmFsdWUsIG9wdGlvbnMgd2l0aCBVUkwgcGF0dGVybilcbiAqICAgUC0tPj5VOiB2YWxpZGF0aW9uIHJlc3VsdFxuICogICBVLS0+PkM6IHZhbGlkYXRpb24gcmVzdWx0XG4gKiBcbiAqIEBjYXRlZ29yeSBWYWxpZGF0b3JzXG4gKi9cbkB2YWxpZGF0b3IoVmFsaWRhdGlvbktleXMuVVJMKVxuZXhwb3J0IGNsYXNzIFVSTFZhbGlkYXRvciBleHRlbmRzIFBhdHRlcm5WYWxpZGF0b3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLlVSTCkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDaGVja3MgaWYgYSBzdHJpbmcgaXMgYSB2YWxpZCBVUkxcbiAgICogQHN1bW1hcnkgVmFsaWRhdGVzIHRoYXQgdGhlIHByb3ZpZGVkIHN0cmluZyBtYXRjaGVzIHRoZSBVUkwgcGF0dGVybi5cbiAgICogVGhpcyBtZXRob2QgZXh0ZW5kcyB0aGUgUGF0dGVyblZhbGlkYXRvcidzIGhhc0Vycm9ycyBtZXRob2QgYnkgZW5zdXJpbmdcbiAgICogdGhlIFVSTCBwYXR0ZXJuIGlzIHVzZWQsIGV2ZW4gaWYgbm90IGV4cGxpY2l0bHkgcHJvdmlkZWQgaW4gdGhlIG9wdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIFRoZSBzdHJpbmcgdG8gdmFsaWRhdGUgYXMgYSBVUkxcbiAgICogQHBhcmFtIHtQYXR0ZXJuVmFsaWRhdG9yT3B0aW9uc30gW29wdGlvbnM9e31dIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbiBvcHRpb25zXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH0gRXJyb3IgbWVzc2FnZSBpZiB2YWxpZGF0aW9uIGZhaWxzLCB1bmRlZmluZWQgaWYgdmFsaWRhdGlvbiBwYXNzZXNcbiAgICpcbiAgICogQG92ZXJyaWRlXG4gICAqXG4gICAqIEBzZWUgUGF0dGVyblZhbGlkYXRvciNoYXNFcnJvcnNcbiAgICovXG4gIHB1YmxpYyBoYXNFcnJvcnMoXG4gICAgdmFsdWU6IHN0cmluZyxcbiAgICBvcHRpb25zOiBQYXR0ZXJuVmFsaWRhdG9yT3B0aW9ucyA9IHt9XG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHN1cGVyLmhhc0Vycm9ycyh2YWx1ZSwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIHBhdHRlcm46IG9wdGlvbnMucGF0dGVybiB8fCBERUZBVUxUX1BBVFRFUk5TLlVSTCxcbiAgICB9KTtcbiAgfVxufVxuIl19
|
|
@@ -1,14 +1,54 @@
|
|
|
1
1
|
import { ValidatorOptions } from "../types";
|
|
2
2
|
/**
|
|
3
|
-
* @
|
|
4
|
-
* @
|
|
3
|
+
* @description Abstract base class for all validators in the validation framework
|
|
4
|
+
* @summary The Validator class provides the foundation for all validator implementations.
|
|
5
|
+
* It handles type checking, error message formatting, and defines the common interface
|
|
6
|
+
* that all validators must implement. This class is designed to be extended by specific
|
|
7
|
+
* validator implementations that provide concrete validation logic.
|
|
5
8
|
*
|
|
6
|
-
* @param {string}
|
|
7
|
-
* @param {string
|
|
8
|
-
* @param {string[]} [acceptedTypes] defines the value types this validator can validate
|
|
9
|
+
* @param {string} message - Default error message to display when validation fails, defaults to {@link DEFAULT_ERROR_MESSAGES#DEFAULT}
|
|
10
|
+
* @param {string[]} acceptedTypes - Array of type names that this validator can validate
|
|
9
11
|
*
|
|
10
12
|
* @class Validator
|
|
11
13
|
* @abstract
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```typescript
|
|
17
|
+
* // Example of extending the Validator class to create a custom validator
|
|
18
|
+
* class CustomValidator extends Validator<CustomValidatorOptions> {
|
|
19
|
+
* constructor(message: string = "Custom validation failed") {
|
|
20
|
+
* // Specify that this validator accepts String and Number types
|
|
21
|
+
* super(message, String.name, Number.name);
|
|
22
|
+
* }
|
|
23
|
+
*
|
|
24
|
+
* public hasErrors(value: any, options?: CustomValidatorOptions): string | undefined {
|
|
25
|
+
* // Implement custom validation logic
|
|
26
|
+
* if (someCondition) {
|
|
27
|
+
* return this.getMessage(options?.message || this.message);
|
|
28
|
+
* }
|
|
29
|
+
* return undefined; // No errors
|
|
30
|
+
* }
|
|
31
|
+
* }
|
|
32
|
+
* ```
|
|
33
|
+
*
|
|
34
|
+
* @mermaid
|
|
35
|
+
* sequenceDiagram
|
|
36
|
+
* participant C as Client
|
|
37
|
+
* participant V as Validator Subclass
|
|
38
|
+
* participant B as Base Validator
|
|
39
|
+
*
|
|
40
|
+
* C->>V: new CustomValidator(message)
|
|
41
|
+
* V->>B: super(message, acceptedTypes)
|
|
42
|
+
* B->>B: Store message and types
|
|
43
|
+
* B->>B: Wrap hasErrors with type checking
|
|
44
|
+
* C->>V: hasErrors(value, options)
|
|
45
|
+
* alt value type not in acceptedTypes
|
|
46
|
+
* B-->>C: Type error message
|
|
47
|
+
* else value type is accepted
|
|
48
|
+
* V->>V: Custom validation logic
|
|
49
|
+
* V-->>C: Validation result
|
|
50
|
+
* end
|
|
51
|
+
*
|
|
12
52
|
* @category Validators
|
|
13
53
|
*/
|
|
14
54
|
export declare abstract class Validator<V extends ValidatorOptions = ValidatorOptions> {
|
|
@@ -16,26 +56,49 @@ export declare abstract class Validator<V extends ValidatorOptions = ValidatorOp
|
|
|
16
56
|
readonly acceptedTypes?: string[];
|
|
17
57
|
protected constructor(message?: string, ...acceptedTypes: string[]);
|
|
18
58
|
/**
|
|
19
|
-
* @
|
|
20
|
-
* @
|
|
21
|
-
*
|
|
59
|
+
* @description Formats an error message with optional arguments
|
|
60
|
+
* @summary Creates a formatted error message by replacing placeholders with provided arguments.
|
|
61
|
+
* This method uses the string formatting utility to generate consistent error messages
|
|
62
|
+
* across all validators.
|
|
63
|
+
*
|
|
64
|
+
* @param {string} message - The message template with placeholders
|
|
65
|
+
* @param {...any} args - Values to insert into the message template
|
|
66
|
+
* @return {string} The formatted error message
|
|
22
67
|
* @protected
|
|
23
68
|
*/
|
|
24
69
|
protected getMessage(message: string, ...args: any[]): string;
|
|
25
70
|
/**
|
|
26
|
-
* @
|
|
27
|
-
* @
|
|
71
|
+
* @description Creates a type-checking wrapper around the hasErrors method
|
|
72
|
+
* @summary Wraps the hasErrors method with type validation logic to ensure that
|
|
73
|
+
* the value being validated is of an accepted type before performing specific validation.
|
|
74
|
+
* This method is called during construction if acceptedTypes are provided.
|
|
75
|
+
*
|
|
76
|
+
* @param {Function} unbound - The original hasErrors method to be wrapped
|
|
77
|
+
* @return {Function} A new function that performs type checking before calling the original method
|
|
28
78
|
* @private
|
|
29
79
|
*/
|
|
30
80
|
private checkTypeAndHasErrors;
|
|
31
81
|
/**
|
|
32
|
-
* @
|
|
33
|
-
* @
|
|
34
|
-
*
|
|
82
|
+
* @description Validates a value against specific validation rules
|
|
83
|
+
* @summary Abstract method that must be implemented by all validator subclasses.
|
|
84
|
+
* This method contains the core validation logic that determines whether a value
|
|
85
|
+
* is valid according to the specific rules of the validator. If the value is valid,
|
|
86
|
+
* the method returns undefined; otherwise, it returns an error message.
|
|
87
|
+
*
|
|
88
|
+
* @template V - Type of the options object that can be passed to the validator
|
|
89
|
+
* @param {any} value - The value to validate
|
|
90
|
+
* @param {V} [options] - Optional configuration options for customizing validation behavior
|
|
91
|
+
*
|
|
92
|
+
* @return {string | undefined} Error message if validation fails, undefined if validation passes
|
|
35
93
|
*
|
|
36
94
|
* @abstract
|
|
37
95
|
*
|
|
38
|
-
* @see Model#
|
|
96
|
+
* @see Model#validate
|
|
39
97
|
*/
|
|
40
98
|
abstract hasErrors(value: any, options?: V): string | undefined;
|
|
99
|
+
/**
|
|
100
|
+
* @summary Duck typing for Validators
|
|
101
|
+
* @param val
|
|
102
|
+
*/
|
|
103
|
+
static isValidator(val: any): boolean;
|
|
41
104
|
}
|