diff --git a/src/index.ts b/src/index.ts index 6f23bfd..646fb4b 100644 --- a/src/index.ts +++ b/src/index.ts @@ -7,7 +7,7 @@ export { Joiful } from './joiful'; export const DEFAULT_INSTANCE = new Joiful(); const DEFAULT_VALIDATOR = new Validator(); -const { validate, validateAsClass, validateArrayAsClass } = DEFAULT_VALIDATOR; +const { validate, validateAsClass, validateArrayAsClass, validateAsClassAsync, validateAsync } = DEFAULT_VALIDATOR; const { any, @@ -37,7 +37,9 @@ export { object, string, validate, + validateAsync, validateAsClass, + validateAsClassAsync, validateArrayAsClass, validateParams, getSchema, diff --git a/src/validation.ts b/src/validation.ts index ed6e48d..57aa79c 100644 --- a/src/validation.ts +++ b/src/validation.ts @@ -116,6 +116,19 @@ export class Validator { return this.validateAsClass(target, target.constructor as AnyClass, options); } + /** + * Validates an instance of a decorated class asynchronously. + * @param target Instance of decorated class to validate. + * @param options Optional validation options to use. These override any default options. + */ + validateAsync = (target: T, options?: ValidationOptions) + : Promise> => { + if (target === null || target === undefined) { + throw new InvalidValidationTarget(); + } + return this.validateAsClassAsync(target, target.constructor as AnyClass, options); + } + /** * Validates a plain old javascript object against a decorated class. * @param target Object to validate. @@ -153,6 +166,43 @@ export class Validator { } as ValidationResult; } + /** + * Validates a plain old javascript object against a decorated class asynchronously. + * @param target Object to validate. + * @param clz Decorated class to validate against. + * @param options Optional validation options to use. These override any default options. + */ + validateAsClassAsync = async < + TClass extends Constructor, + TInstance = TClass extends Constructor ? TInstance : never + >( + target: Partial | null | undefined, + Class: TClass, + options: ValidationOptions | undefined = this.defaultOptions, + ): Promise> => { + if (target === null || target === undefined) { + throw new InvalidValidationTarget(); + } + + const {joi, joiOptions} = this.extractOptions(options); + const classSchema = getJoiSchema(Class, joi); + + if (!classSchema) { + throw new NoValidationSchemaForClassError(Class); + } + + const result = joiOptions ? + await classSchema.validateAsync(target, joiOptions) : + await classSchema.validateAsync(target); + + return { + error: (result.error ? result.error : null), + errors: null, + warning: null, + value: result.value as TInstance, + } as ValidationResult; + } + /** * Validates an array of plain old javascript objects against a decorated class. * @param target Objects to validate.