/// import { ObjectId } from 'bson'; export type RuleType = 'any' | 'boolean' | 'number' | 'email' | 'object' | 'string' | 'enum' | 'uuid' | 'array' | 'forbidden' | 'function' | 'date' | 'customDate' | 'objectId' | 'version' | 'phoneNumber' | 'internationalPhoneNumber' | 'buffer' | 'record'; interface BasicRule { type: T; optional?: boolean; default?: unknown; null?: boolean; } interface Sanitazible { convert?: boolean; } export interface NumberRule extends BasicRule<'number'>, Sanitazible { min?: number; max?: number; equal?: number; notEqual?: number; integer?: boolean; positive?: boolean; negative?: boolean; } export interface ArrayRule extends BasicRule<'array'> { items?: ValidationProperty; empty?: boolean; min?: number; max?: number; length?: number; contains?: any; enum?: any[]; unique?: boolean; } export interface ObjectRule extends BasicRule<'object'> { props?: ValidationSchema; strict?: boolean; } export interface RecordRule extends BasicRule<'record'> { key: EnumRule; value: ValidationProperty | ValidationProperty[]; } export interface StringRule extends BasicRule<'string'> { empty?: boolean; min?: number; max?: number; length?: number; pattern?: any; contains?: any; enum?: string[]; alpha?: boolean; numeric?: boolean; alphanum?: boolean; alphadash?: boolean; uppercase?: boolean; } export interface EmailRule extends BasicRule<'email'> { mode?: string; } export interface VersionRule extends BasicRule<'version'>, Sanitazible { versions?: string[]; } export interface EnumRule extends BasicRule<'enum'> { values: T[]; } export interface DateRule extends BasicRule<'date'>, Sanitazible { format?: string; } export interface ListValidationSchema { skip: NumberRule; limit: NumberRule; } export interface CustomDateRule extends BasicRule<'customDate'>, Sanitazible { } export interface ObjectIdRule extends BasicRule<'objectId'>, Sanitazible { } export interface BooleanRule extends BasicRule<'boolean'>, Sanitazible { } type CommonRule = BasicRule<'any' | 'forbidden'> | EnumRule; type ComplexRule = StringRule | NumberRule | BooleanRule | ArrayRule | ObjectRule | DateRule | CustomDateRule | EmailRule | EnumRule | ObjectIdRule | RecordRule | VersionRule; type ValidationProperty = T extends null ? ValidationRule : T extends string ? StringRule | EmailRule | VersionRule | BasicRule<'uuid' | 'phoneNumber' | 'internationalPhoneNumber'> : T extends number ? NumberRule : T extends boolean ? BooleanRule : T extends Date ? DateRule | CustomDateRule | StringRule : T extends Buffer ? BasicRule<'buffer'> : T extends ObjectId ? ObjectIdRule | StringRule : T extends ArrayLike ? ArrayRule : T extends object ? ObjectRule | RecordRule[keyof T]> : ValidationRule; type Rule = string | boolean | ComplexRule | CommonRule | BasicRule>; export type ValidationRule = T extends null ? Rule : T extends object ? ObjectRule : T extends ArrayLike ? ArrayRule : Rule; export type ValidationSchema = T extends null ? { [path: string]: ValidationRule | ValidationRule[]; } : { [path in keyof Required]: ValidationProperty | ValidationProperty[] | CommonRule; }; export {};