1 | import { ConstraintMetadata } from './metadata/ConstraintMetadata';
|
2 | import { ValidationMetadata } from './metadata/ValidationMetadata';
|
3 | import { ValidationTypes } from './validation/ValidationTypes';
|
4 | import { getFromContainer } from './container';
|
5 | import { MetadataStorage, getMetadataStorage } from './metadata/MetadataStorage';
|
6 |
|
7 |
|
8 |
|
9 | export function registerDecorator(options) {
|
10 | let constraintCls;
|
11 | if (options.validator instanceof Function) {
|
12 | constraintCls = options.validator;
|
13 | const constraintClasses = getFromContainer(MetadataStorage).getTargetValidatorConstraints(options.validator);
|
14 | if (constraintClasses.length > 1) {
|
15 | throw `More than one implementation of ValidatorConstraintInterface found for validator on: ${options.target.name}:${options.propertyName}`;
|
16 | }
|
17 | }
|
18 | else {
|
19 | const validator = options.validator;
|
20 | constraintCls = class CustomConstraint {
|
21 | validate(value, validationArguments) {
|
22 | return validator.validate(value, validationArguments);
|
23 | }
|
24 | defaultMessage(validationArguments) {
|
25 | if (validator.defaultMessage) {
|
26 | return validator.defaultMessage(validationArguments);
|
27 | }
|
28 | return '';
|
29 | }
|
30 | };
|
31 | getMetadataStorage().addConstraintMetadata(new ConstraintMetadata(constraintCls, options.name, options.async));
|
32 | }
|
33 | const validationMetadataArgs = {
|
34 | type: options.name && ValidationTypes.isValid(options.name) ? options.name : ValidationTypes.CUSTOM_VALIDATION,
|
35 | target: options.target,
|
36 | propertyName: options.propertyName,
|
37 | validationOptions: options.options,
|
38 | constraintCls: constraintCls,
|
39 | constraints: options.constraints,
|
40 | };
|
41 | getMetadataStorage().addValidationMetadata(new ValidationMetadata(validationMetadataArgs));
|
42 | }
|
43 |
|
\ | No newline at end of file |