import type { NestedValue } from './form'; export type Noop = () => void; interface File extends Blob { readonly lastModified: number; readonly name: string; } interface FileList { readonly length: number; item(index: number): File | null; [index: number]: File; } export type Primitive = null | undefined | string | number | boolean | symbol | bigint; export type BrowserNativeObject = Date | FileList | File; /** * Registry of types which the recursive type helpers ({@link Path}, * {@link DeepPartial}, FieldErrors, ...) treat as opaque leaf values * instead of recursing into their properties. * * Empty by default, so it has no effect until a consumer registers a type * via declaration merging. Useful for rich third-party value types (Dayjs, * Decimal, Luxon DateTime, ...) whose members should never be addressed by * a form path and can be expensive for the compiler to traverse. * @example * ``` * declare module 'react-hook-form' { * interface OpaqueTypes { * dayjs: Dayjs; * } * } * ``` */ export interface OpaqueTypes { } /** * Union of all types registered in {@link OpaqueTypes}. `never` while the * registry is empty. */ export type OpaqueType = OpaqueTypes[keyof OpaqueTypes]; export type EmptyObject = { [K in string | number]: never; }; export type NonUndefined = T extends undefined ? never : T; export type LiteralUnion = T | (U & { _?: never; }); export type ExtractObjects = T extends infer U ? U extends object ? U : never : never; type IsPrimitiveLike = T extends Primitive ? true : false; export type DeepPartial = IsPrimitiveLike extends true ? T : T extends BrowserNativeObject | NestedValue | OpaqueType ? T : { [K in keyof T]?: ExtractObjects extends never ? T[K] : DeepPartial; }; export type DeepPartialSkipArrayKey = IsPrimitiveLike extends true ? T : T extends BrowserNativeObject | NestedValue | OpaqueType ? T : T extends ReadonlyArray ? { [K in keyof T]: DeepPartialSkipArrayKey; } : { [K in keyof T]?: DeepPartialSkipArrayKey; }; /** * Checks whether the type is any * See {@link https://stackoverflow.com/a/49928360/3406963} * @typeParam T - type which may be any * ``` * IsAny = true * IsAny = false * ``` */ export type IsAny = 0 extends 1 & T ? true : false; /** * Checks whether the type is never * @typeParam T - type which may be never * ``` * IsNever = true * IsNever = false * ``` */ export type IsNever = [T] extends [never] ? true : false; /** * Checks whether T1 can be exactly (mutually) assigned to T2 * @typeParam T1 - type to check * @typeParam T2 - type to check against * ``` * IsEqual = true * IsEqual<'foo', 'foo'> = true * IsEqual = false * IsEqual = false * IsEqual = false * IsEqual<'foo', string> = false * IsEqual<'foo' | 'bar', 'foo'> = boolean // 'foo' is assignable, but 'bar' is not (true | false) -> boolean * ``` */ export type IsEqual = T1 extends T2 ? (() => G extends T1 ? 1 : 2) extends () => G extends T2 ? 1 : 2 ? true : false : false; export type DeepMap = IsAny extends true ? any : T extends BrowserNativeObject | NestedValue | OpaqueType ? TValue : T extends ReadonlyArray ? Array, TValue> | undefined> : T extends object ? { [K in keyof T]: DeepMap, TValue>; } : TValue; export type IsFlatObject = Extract, any[] | object> extends never ? true : false; export type Merge = { [K in keyof A | keyof B]?: K extends keyof A & keyof B ? [A[K], B[K]] extends [object, object] ? Merge : B[K] : K extends keyof A ? A[K] : K extends keyof B ? B[K] : never; }; export {}; //# sourceMappingURL=utils.d.ts.map