UNPKG

react-hook-form

Version:

Performant, flexible and extensible forms library for React Hooks

206 lines (205 loc) • 12.1 kB
import * as React from 'react'; import { EmptyObject, NonUndefined, LiteralToPrimitive, DeepPartial, DeepMap, IsFlatObject, LiteralUnion } from './utils'; declare const $NestedValue: unique symbol; export declare type FieldValues = Record<string, any>; export declare type InternalFieldName<TFieldValues extends FieldValues> = (keyof TFieldValues & string) | string; export declare type FieldName<TFieldValues extends FieldValues> = IsFlatObject<TFieldValues> extends true ? Extract<keyof TFieldValues, string> : string; export declare type FieldValue<TFieldValues extends FieldValues> = TFieldValues[InternalFieldName<TFieldValues>]; export declare type NestedValue<TValue extends any[] | Record<string, unknown> = any[] | Record<string, unknown>> = { [$NestedValue]: never; } & TValue; export declare type UnpackNestedValue<T> = NonUndefined<T> extends NestedValue<infer U> ? U : NonUndefined<T> extends Date | FileList ? T : NonUndefined<T> extends Record<string, unknown> ? { [K in keyof T]: UnpackNestedValue<T[K]>; } : T; export declare type DefaultValuesAtRender<TFieldValues> = UnpackNestedValue<DeepPartial<Record<InternalFieldName<TFieldValues>, FieldValue<TFieldValues>>>>; export declare type FieldElement<TFieldValues extends FieldValues = FieldValues> = HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement | CustomElement<TFieldValues>; export declare type Ref = FieldElement; export declare type ValidationMode = { onBlur: 'onBlur'; onChange: 'onChange'; onSubmit: 'onSubmit'; onTouched: 'onTouched'; all: 'all'; }; export declare type Mode = keyof ValidationMode; export declare type SubmitHandler<TFieldValues extends FieldValues> = (data: UnpackNestedValue<TFieldValues>, event?: React.BaseSyntheticEvent) => void | Promise<void>; export declare type SubmitErrorHandler<TFieldValues extends FieldValues> = (errors: FieldErrors<TFieldValues>, event?: React.BaseSyntheticEvent) => void | Promise<void>; export declare type ResolverSuccess<TFieldValues extends FieldValues = FieldValues> = { values: UnpackNestedValue<TFieldValues>; errors: EmptyObject; }; export declare type ResolverError<TFieldValues extends FieldValues = FieldValues> = { values: EmptyObject; errors: FieldErrors<TFieldValues>; }; export declare type ResolverResult<TFieldValues extends FieldValues = FieldValues> = ResolverSuccess<TFieldValues> | ResolverError<TFieldValues>; export declare type Resolver<TFieldValues extends FieldValues = FieldValues, TContext extends object = object> = (values: TFieldValues, context?: TContext, validateAllFieldCriteria?: boolean) => Promise<ResolverResult<TFieldValues>> | ResolverResult<TFieldValues>; export declare type UseFormOptions<TFieldValues extends FieldValues = FieldValues, TContext extends object = object> = Partial<{ mode: Mode; reValidateMode: Exclude<Mode, 'onTouched' | 'all'>; defaultValues: UnpackNestedValue<DeepPartial<TFieldValues>>; resolver: Resolver<TFieldValues, TContext>; context: TContext; shouldFocusError: boolean; shouldUnregister: boolean; criteriaMode: 'firstError' | 'all'; }>; export declare type Message = string; export declare type ValidationValue = boolean | number | string | RegExp; export declare type ValidationRule<TValidationValue extends ValidationValue = ValidationValue> = TValidationValue | ValidationValueMessage<TValidationValue>; export declare type ValidationValueMessage<TValidationValue extends ValidationValue = ValidationValue> = { value: TValidationValue; message: Message; }; export declare type ValidateResult = Message | Message[] | boolean | undefined; export declare type Validate = (data: any) => ValidateResult | Promise<ValidateResult>; export declare type ValidationRules = Partial<{ required: Message | ValidationRule<boolean>; min: ValidationRule<number | string>; max: ValidationRule<number | string>; maxLength: ValidationRule<number | string>; minLength: ValidationRule<number | string>; pattern: ValidationRule<RegExp>; validate: Validate | Record<string, Validate>; }>; export declare type MultipleFieldErrors = { [K in keyof ValidationRules]?: ValidateResult; } & { [key: string]: ValidateResult; }; export declare type FieldError = { type: LiteralUnion<keyof ValidationRules, string>; ref?: Ref; types?: MultipleFieldErrors; message?: Message; }; export declare type ErrorOption = { types: MultipleFieldErrors; } | { message?: Message; type: LiteralUnion<keyof ValidationRules, string>; }; export declare type Field = { ref: Ref; options?: RadioOrCheckboxOption[]; } & ValidationRules; export declare type FieldRefs<TFieldValues extends FieldValues> = Partial<Record<InternalFieldName<TFieldValues>, Field>>; export declare type FieldErrors<TFieldValues extends FieldValues = FieldValues> = DeepMap<TFieldValues, FieldError>; export declare type FlatFieldErrors<TFieldValues extends FieldValues> = Partial<Record<InternalFieldName<TFieldValues>, FieldError>>; export declare type FieldNames<TFieldValues extends FieldValues> = DeepMap<TFieldValues, true>; export declare type Dirtied<TFieldValues extends FieldValues> = DeepMap<TFieldValues, true>; export declare type SetValueConfig = Partial<{ shouldValidate: boolean; shouldDirty: boolean; }>; export declare type FormStateProxy<TFieldValues extends FieldValues = FieldValues> = { isDirty: boolean; dirtyFields: Dirtied<TFieldValues>; isSubmitted: boolean; submitCount: number; touched: FieldNames<TFieldValues>; isSubmitting: boolean; isValid: boolean; errors: FieldErrors<TFieldValues>; }; export declare type ReadFormState = { [K in keyof FormStateProxy]: boolean; }; export declare type RadioOrCheckboxOption = { ref: HTMLInputElement; mutationWatcher?: MutationObserver; }; export declare type CustomElement<TFieldValues extends FieldValues> = { name: FieldName<TFieldValues>; type?: string; value?: any; disabled?: boolean; checked?: boolean; options?: HTMLOptionsCollection; files?: FileList | null; focus?: () => void; }; export declare type HandleChange = (event: Event) => Promise<void | boolean>; export declare type FieldValuesFromControl<TControl extends Control> = TControl extends Control<infer TFieldValues> ? TFieldValues : never; export declare type FieldArrayName = string; export declare type UseFieldArrayOptions<TKeyName extends string = 'id', TControl extends Control = Control> = { name: FieldArrayName; keyName?: TKeyName; control?: TControl; }; export declare type FormState<TFieldValues> = { isDirty: boolean; dirtyFields: FieldNames<TFieldValues>; isSubmitted: boolean; submitCount: number; touched: FieldNames<TFieldValues>; isSubmitting: boolean; isValid: boolean; errors: FieldErrors<TFieldValues>; }; export declare type Control<TFieldValues extends FieldValues = FieldValues> = Pick<UseFormMethods<TFieldValues>, 'register' | 'unregister' | 'setValue' | 'getValues' | 'trigger'> & { removeFieldEventListener: (field: Field, forceDelete?: boolean) => void; mode: { readonly isOnBlur: boolean; readonly isOnSubmit: boolean; readonly isOnChange: boolean; readonly isOnAll: boolean; readonly isOnTouch: boolean; }; reValidateMode: { readonly isReValidateOnBlur: boolean; readonly isReValidateOnChange: boolean; }; fieldArrayDefaultValues: React.MutableRefObject<Record<FieldArrayName, any[]>>; formStateRef: React.MutableRefObject<FormState<FieldValues>>; updateFormState: (args?: Partial<FormState<TFieldValues>>) => void; validateResolver: ((fieldsValues: any) => void) | undefined; watchFieldsRef: React.MutableRefObject<Set<InternalFieldName<TFieldValues>>>; isWatchAllRef: React.MutableRefObject<boolean>; validFieldsRef: React.MutableRefObject<FieldNames<TFieldValues>>; fieldsWithValidationRef: React.MutableRefObject<FieldNames<TFieldValues>>; fieldsRef: React.MutableRefObject<FieldRefs<TFieldValues>>; resetFieldArrayFunctionRef: React.MutableRefObject<Record<string, () => void>>; unmountFieldsStateRef: Record<InternalFieldName<FieldValues>, any>; fieldArrayNamesRef: React.MutableRefObject<Set<InternalFieldName<FieldValues>>>; readFormStateRef: React.MutableRefObject<{ [k in keyof FormStateProxy<TFieldValues>]: boolean; }>; defaultValuesRef: React.MutableRefObject<FieldValue<UnpackNestedValue<TFieldValues>> | UnpackNestedValue<DeepPartial<TFieldValues>>>; watchFieldsHookRef: React.MutableRefObject<Record<string, Set<InternalFieldName<TFieldValues>>>>; watchFieldsHookRenderRef: React.MutableRefObject<Record<string, Function>>; watchInternal: (fieldNames?: string | string[], defaultValue?: unknown, watchId?: string) => unknown; renderWatchedInputs: (name: string, found?: boolean) => void; }; export declare type ArrayField<TFieldArrayValues extends FieldValues = FieldValues, TKeyName extends string = 'id'> = TFieldArrayValues & Record<TKeyName, string>; export declare type OmitResetState = Partial<{ errors: boolean; } & ReadFormState>; export declare type UseWatchOptions = { defaultValue?: unknown; name?: string | string[]; control?: Control; }; export declare type UseFormMethods<TFieldValues extends FieldValues = FieldValues> = { register<TFieldElement extends FieldElement<TFieldValues>>(rules?: ValidationRules): (ref: (TFieldElement & Ref) | null) => void; register(name: FieldName<TFieldValues>, rules?: ValidationRules): void; register<TFieldElement extends FieldElement<TFieldValues>>(ref: (TFieldElement & Ref) | null, rules?: ValidationRules): void; unregister(name: FieldName<TFieldValues> | FieldName<TFieldValues>[]): void; watch(): UnpackNestedValue<TFieldValues>; watch<TFieldName extends string, TFieldValue>(name: TFieldName, defaultValue?: TFieldName extends keyof TFieldValues ? UnpackNestedValue<TFieldValues[TFieldName]> : UnpackNestedValue<LiteralToPrimitive<TFieldValue>>): TFieldName extends keyof TFieldValues ? UnpackNestedValue<TFieldValues[TFieldName]> : UnpackNestedValue<LiteralToPrimitive<TFieldValue>>; watch<TFieldName extends keyof TFieldValues>(names: TFieldName[], defaultValues?: UnpackNestedValue<DeepPartial<Pick<TFieldValues, TFieldName>>>): UnpackNestedValue<Pick<TFieldValues, TFieldName>>; watch(names: string[], defaultValues?: UnpackNestedValue<DeepPartial<TFieldValues>>): UnpackNestedValue<DeepPartial<TFieldValues>>; setError(name: FieldName<TFieldValues>, error: ErrorOption): void; clearErrors(name?: FieldName<TFieldValues> | FieldName<TFieldValues>[]): void; setValue<TFieldName extends string, TFieldValue extends TFieldValues[TFieldName]>(name: TFieldName, value?: NonUndefined<TFieldValue> extends NestedValue<infer U> ? U : UnpackNestedValue<DeepPartial<LiteralToPrimitive<TFieldValue>>>, options?: SetValueConfig): void; trigger(name?: FieldName<TFieldValues> | FieldName<TFieldValues>[]): Promise<boolean>; errors: FieldErrors<TFieldValues>; formState: FormStateProxy<TFieldValues>; reset: (values?: UnpackNestedValue<DeepPartial<TFieldValues>>, omitResetState?: OmitResetState) => void; getValues(): UnpackNestedValue<TFieldValues>; getValues<TFieldName extends string, TFieldValue extends unknown>(name: TFieldName): TFieldName extends keyof TFieldValues ? UnpackNestedValue<TFieldValues>[TFieldName] : TFieldValue; getValues<TFieldName extends keyof TFieldValues>(names: TFieldName[]): UnpackNestedValue<Pick<TFieldValues, TFieldName>>; handleSubmit: <TSubmitFieldValues extends FieldValues = TFieldValues>(onValid: SubmitHandler<TSubmitFieldValues>, onInvalid?: SubmitErrorHandler<TFieldValues>) => (e?: React.BaseSyntheticEvent) => Promise<void>; control: Control<TFieldValues>; }; export {};