import { type Transform } from './lib'; export type IsValidType = 'string' | 'number' | 'boolean' | 'json' | 'object' | 'array' | 'primitive'; export interface ObjectCommonType { [key: string]: IsValidType | ObjectCommonType; } export type Primitive = null | undefined | string | number | boolean | symbol | bigint; export type IsEqual = T1 extends T2 ? ((() => G extends T1 ? 1 : 2) extends () => G extends T2 ? 1 : 2 ? true : false) : false; export type IsTuple> = number extends T['length'] ? false : true; export type IsTruthy = T extends boolean ? (T extends true ? true : false) : false; export type IsFalsy = T extends boolean ? (T extends false ? true : false) : false; export type IsArray = T extends any[] ? true : false; export type IsObject = T extends object ? (T extends any[] ? false : true) : false; export type IsNumber = T extends number | bigint ? true : false; export type IsUnsignedNumber = T extends number | bigint ? (`${T}` extends `-${number}` ? false : true) : false; export type IsSignedNumber = T extends number | bigint ? (`${T}` extends `-${number}` ? true : false) : false; export type IsInt = T extends number | bigint ? (`${T}` extends `${number}.${number}` ? false : true) : false; export type IsUnsignedInt = IsUnsignedNumber extends true ? IsInt : false; export type IsSignedInt = IsInt extends true ? IsSignedNumber : false; export type IsBigInt = T extends bigint ? (`${T}` extends `${number}.${number}` ? false : true) : false; export type IsUnsignedBigInt = IsUnsignedNumber extends true ? IsBigInt : false; export type IsSignedBigInt = IsBigInt extends true ? IsSignedNumber : false; export type IsString = T extends string ? true : false; export type IsBoolean = T extends boolean ? true : false; export type IsNull = T extends null ? true : false; export type IsUndefined = T extends undefined ? true : false; export type TupleKeys> = Exclude; export type AnyIsEqual = T1 extends T2 ? (IsEqual extends true ? true : never) : never; type CombineAll = T extends { [name in keyof T]: infer Type; } ? Type : never; type PropertyNameMap = { [name in keyof T]: T[name] extends object ? SubPathsOf | name : name; }; type SubPathsOf = `${string & key}.${string & Path}`; export type Path = CombineAll>; export type PathValue> = T extends any ? P extends `${infer K}.${infer R}` ? K extends keyof T ? R extends Path ? PathValue : never : K extends number ? T extends ReadonlyArray ? PathValue> : never : never : P extends keyof T ? T[P] : P extends number ? T extends ReadonlyArray ? V : never : never : never; export type UnionToIntersection = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never; export type UnionPick = K extends keyof T ? Pick : K extends `${infer Key}.${infer Rest}` ? Key extends keyof T ? { [P in Key]: Rest extends Path ? UnionPick : never; } : never : never; export type NestedPick = UnionToIntersection>; export type ObjectRecord = Record; export type NonNeverProps = { [K in keyof T as T[K] extends never ? never : K]: T[K]; }; export type DeepPropsOmit = T extends object ? K extends `${infer Key}.${infer Rest}` ? IsEqual extends true ? Rest extends Path ? NestedOmit : T : T : T : T; export type NestedOmit = { [P in Exclude]: DeepPropsOmit>; }; export type SpreadObjects = UnionToIntersection ? (Item extends object ? Item : never) : never>; export type ExtendsObject = { [K in keyof T | keyof O]: K extends keyof T ? K extends keyof O ? T[K] extends object ? IsArray extends false ? O[K] extends object ? IsArray extends false ? ExtendsObject : O[K] : O[K] : O[K] : O[K] : T[K] : K extends keyof O ? O[K] : never; }; export type MergeObjects = T extends [infer First, ...infer Rest] ? First extends object ? Rest extends object[] ? ExtendsObject> : never : never : {}; export type ExtendsObjects = MergeObjects<[T, ...O]>; export type DefaultObject = IsObject extends true ? T : {}; export type DefaultArray = IsArray extends true ? T : []; export type DefaultValue = V extends undefined | null ? D : V; export type FirstElement = T extends [infer First, ...infer _] ? First : undefined; export type LastElement = T extends [...infer _, infer Last] ? Last : undefined; export type Callable = (...args: any[]) => any | Promise | Function; export interface EventHandler { name: string; priority: number; once?: boolean; disabled?: boolean; handler: Callable; } export interface NumberFormatOptions { decimals?: number; decimalPoint?: string; separator?: string; prefix?: string; suffix?: string; pattern?: string; } export type ObjectRulesOptions = { rules: ObjectCommonType; suitable?: boolean; }; export type ArrayRulesOptions = { rules: IsValidType | ObjectCommonType; suitable?: boolean; notEmpty?: boolean; }; export type ObjectArrayRulesOptions = { object?: ObjectRulesOptions; array?: ArrayRulesOptions; }; export type ClassConstructor = new (...arg: any[]) => T; export type CreditCardType = 'VISA' | 'AMEX' | 'MASTERCARD' | 'DISCOVER' | 'DINERS' | 'JCB' | 'CHINA_UNION_PAY'; export declare class IsError extends Error { } export interface IsBaseOptions { optional?: boolean; nullable?: boolean; allowValues?: any[]; defaultValue?: any; description?: string; example?: any; validate?: boolean; } export type IsStringOptionFormat = 'email' | 'mongoId' | 'dateTime' | 'date' | 'time' | 'ipv4' | 'ipv6' | 'creditCard' | 'uri' | 'image' | 'base64' | 'md5' | 'sha1' | 'sha256' | 'uuid' | 'jwt' | 'number' | 'integer' | 'unsignedNumber' | 'unsignedInteger' | 'boolean' | 'trim' | 'json' | 'alphanum' | 'lowercase' | 'uppercase' | 'binary' | 'slug' | 'path' | RegExp; export interface IsStringOptions extends IsBaseOptions { format?: IsStringOptionFormat; minLength?: number; maxLength?: number; strongPassword?: IsStrongPasswordOptions; allowHtml?: 'safe' | 'raw' | false; } export interface IsNumberOptions extends IsBaseOptions { integer?: boolean; min?: number; max?: number; } export type IsPrimitiveType = 'null' | 'undefined' | 'string' | 'number' | 'boolean' | 'symbol' | 'bigint'; export interface IsArrayOptions extends IsBaseOptions { unique?: boolean; minLength?: number; maxLength?: number; } export interface IsStrongPasswordOptions { minLength?: number; minSpecialChars?: number; minUpper?: number; minLower?: number; minNumber?: number; } export type IsFunc = (...agrs: any[]) => any; export type IsAsyncFunc = (...agrs: any[]) => Promise; export type IsCallable = (...agrs: any[]) => any | Promise; export type StaticMethods = { [P in keyof T]: T[P] extends (...args: any[]) => any ? P : never; }; export type TransformType = keyof Omit, 'prototype' | 'clean'>; export type EnumElement = string | number | null | boolean; export type EnumArgs = EnumElement[] | Record; export {};