register-decorator.js 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  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. * Registers a custom validation decorator.
  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. name: options.name,
  36. target: options.target,
  37. propertyName: options.propertyName,
  38. validationOptions: options.options,
  39. constraintCls: constraintCls,
  40. constraints: options.constraints,
  41. };
  42. getMetadataStorage().addValidationMetadata(new ValidationMetadata(validationMetadataArgs));
  43. }
  44. //# sourceMappingURL=register-decorator.js.map