UNPKG

aptx-validator

Version:

轻量易用的 Node.js + Typescript 参数校验库

97 lines (96 loc) 4.95 kB
import AnyValidator from '../AnyValidator'; import ArrayValidator from '../ArrayValidator'; import AllValidator from '../AllValidator'; import BooleanValidator from '../BooleanValidator'; import NumberValidator from '../NumberValidator'; import ObjectValidator from '../ObjectValidator'; import StringValidator from '../StringValidator'; import { AndCondition, OrCondition } from '../helpers'; export interface IValidator { result: () => boolean; errText: (text: string) => void; error: () => Error; } export type ValidateFunction = (value: any, option?: any) => boolean; export type UtilFunction = (option?: any) => ValidateFunction; export interface IUtils { number: UtilFunction; boolean: UtilFunction; string: UtilFunction; object: UtilFunction; array: UtilFunction; oneof: UtilFunction; min: UtilFunction; max: UtilFunction; int: UtilFunction; positive: UtilFunction; negative: UtilFunction; id: UtilFunction; toFixed: UtilFunction; minLength: UtilFunction; maxLength: UtilFunction; numeric: UtilFunction; booleanStr: UtilFunction; useRE: UtilFunction; email: UtilFunction; phone: UtilFunction; date: UtilFunction; } export type ARecord = Record<string, AllValidator<any, boolean>>; export type OrParams = Readonly<[ AllValidator<any, boolean>, AllValidator<any, boolean>, ...AllValidator<boolean>[] ]>; export type AndParams = Readonly<[ AllValidator<any, boolean>, AllValidator<any, boolean> ]>; export type Infer<Input extends AllValidator<any, boolean>> = Input extends AnyValidator ? any : Input extends BooleanValidator<boolean> | NumberValidator<boolean> | StringValidator<boolean> ? OptionalInfer<Input> : Input extends OrCondition<OrParams, boolean, boolean> ? Input['isOptional'] extends false ? OrInfer<Input['output']> : OrInfer<Input['output']> | undefined : Input extends AndCondition<AndParams, boolean, boolean> ? Input['isOptional'] extends false ? AndInfer<Input['output']> : AndInfer<Input['output']> | undefined : Input extends ArrayValidator<any, boolean> ? Input['isOptional'] extends false ? ArrayInfer<Input['output']> : ArrayInfer<Input['output']> | undefined : Input extends ObjectValidator<any, boolean> ? Input['isOptional'] extends false ? ObjectInfer<Input['output']> : ObjectInfer<Input['output']> | undefined : never; export type ComputedOptionalKey<T extends ARecord> = { [k in keyof T]: T[k]['isOptional']; }; export type SelectRequiredKey<T extends Record<string, boolean>> = keyof { [k in keyof T as T extends Record<k, false> ? k : never]: k; }; export type ObjectRule<T extends ARecord> = { [k in keyof T]?: Infer<T[k]>; }; export type UnionType<T> = T extends (infer E)[] ? E : never; export type PickRequiredKey<T, K extends keyof T> = Omit<T, K> & { [k in K]-?: T[k]; }; export type ObjectInfer<A extends ARecord> = PickRequiredKey<ObjectRule<A>, SelectRequiredKey<ComputedOptionalKey<A>>>; export type ArrayInfer<A extends AllValidator<boolean>> = Infer<A>[]; export type OrInfer<A extends OrParams> = UnionType<OrObject<A>>; export type AndInfer<A extends AndParams> = Infer<A[0]> & Infer<A[1]>; export type OptionalInfer<V extends AllValidator<any, boolean>> = V['isOptional'] extends true ? V['output'] | undefined : V['output']; export type OrObject<T extends OrParams> = { [k in keyof T]: Infer<T[k]>; }; export type AndObject<T extends AndParams> = { [k in keyof T]: Infer<T[k]>; }; export type OptionalValidator<T extends AllValidator> = Exclude<T, 'isOptional'> & { isOptional: true; }; export declare const boolean: () => BooleanValidator<false>; export declare const number: () => NumberValidator<false>; export declare const string: () => StringValidator<false, false>; export declare const object: <T extends ARecord = any>(v?: T) => ObjectValidator<T, false, false>; export declare const array: <T extends AllValidator = AnyValidator<true, true>>(v?: T) => ArrayValidator<T, false>; export declare const any: () => AnyValidator<true, true>; export declare const or: <T extends OrParams = any>(p: T) => OrCondition<T, false, false>; export declare const and: <T extends AndParams = any>(p: T) => AndCondition<T, false, false>; declare const _default: { boolean: () => BooleanValidator<false>; object: <T extends ARecord = any>(v?: T) => ObjectValidator<T, false, false>; number: () => NumberValidator<false>; string: () => StringValidator<false, false>; any: () => AnyValidator<true, true>; array: <T extends AllValidator = AnyValidator<true, true>>(v?: T) => ArrayValidator<T, false>; or: <T extends OrParams = any>(p: T) => OrCondition<T, false, false>; and: <T extends AndParams = any>(p: T) => AndCondition<T, false, false>; }; export default _default; export type { BooleanValidator, ObjectValidator, NumberValidator, StringValidator, AnyValidator, ArrayValidator, AllValidator, OrCondition, AndCondition, };