///
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 {};