/** * Additional parameters passed to complex validation functions. */ export interface ValidatorFunctionParams { /** The entire original input data. */ data: any, } /** * An interface representing the result of an attempted validation that failed. */ export interface ValidationErrorResult { /** Whether or not the validation succeeded. */ valid: false /** * The human-readable error message(s) describing the issue. */ message?: string | string[] /** * If true, validation of subsequent fields will stop. */ stopValidation?: boolean } /** * An interface representing the result of an attempted validation that succeeded. */ export interface ValidationSuccessResult { /** Whether or not the validation succeeded. */ valid: true /** * If the value was cast to a different type, or inferred, as a result of this validation, * provide it here. It will replace the input string as the value of the field in the form. */ castValue?: any /** * If true, validation of subsequent fields will stop. */ stopValidation?: boolean } /** All possible results of an attempted validation. */ export type ValidationResult = ValidationErrorResult | ValidationSuccessResult /** A validator function that takes only the field key and the object value. */ export type SimpleValidatorFunction = (fieldName: string, inputValue: any) => ValidationResult | Promise /** A validator function that takes the field key, the object value, and an object of contextual params. */ export type ComplexValidatorFunction = (fieldName: string, inputValue: any, params: ValidatorFunctionParams) => ValidationResult | Promise /** Useful type alias for all allowed validator function signatures. */ export type ValidatorFunction = SimpleValidatorFunction | ComplexValidatorFunction /** * A set of validation rules that are applied to input objects on validators. * * The keys of this object are deep-nested keys and can be used to validate * nested properties. * * For example, the key "user.links.*.url" refers to the "url" property of all * objects in the "links" array on the "user" object on: * * ```json * { * "user": { * "links": [ * { * "url": "..." * }, * { * "url": "..." * } * ] * } * } * ``` */ export type ValidationRules = {[key: string]: ValidatorFunction | ValidatorFunction[]} /** A type alias denoting that a particular type has been validated. */ export type Valid = T