|
| 1 | +import type { ToRefs } from 'vue' |
| 2 | +import type { FieldValues, Fields } from './filed' |
| 3 | +import type { Resolver } from './resolver' |
| 4 | +import type { |
| 5 | + DeepMap, |
| 6 | + DeepPartial, |
| 7 | + DefaultValues, |
| 8 | + UnpackNestedValue, |
| 9 | +} from './utils' |
| 10 | +import type { FieldError, FieldErrors } from './errors' |
| 11 | +import type { RegisterOptions } from './validator' |
| 12 | +import type { FieldPath, FieldPathValue } from './path' |
| 13 | + |
| 14 | +export type Mode = 'onSubmit' | 'onBlur' | 'onChange' | 'onTouched' | 'all' |
| 15 | + |
| 16 | +export type CriteriaMode = 'firstError' | 'all' |
| 17 | + |
| 18 | +export type FieldNamesMarkedBoolean<TFieldValues extends FieldValues> = DeepMap< |
| 19 | + DeepPartial<TFieldValues>, |
| 20 | + boolean |
| 21 | +> |
| 22 | + |
| 23 | +declare const $NestedValue: unique symbol |
| 24 | + |
| 25 | +export type NestedValue<TValue extends object = object> = { |
| 26 | + [$NestedValue]: never |
| 27 | +} & TValue |
| 28 | + |
| 29 | +export interface UseFormProps<TFieldValues extends object> { |
| 30 | + mode: Mode |
| 31 | + reValidateMode: Exclude<Mode, 'onTouched' | 'all'> |
| 32 | + defaultValues: Partial<DefaultValues<TFieldValues>> |
| 33 | + resolver: Resolver<TFieldValues> |
| 34 | + shouldFocusError: boolean |
| 35 | + shouldUnregister: boolean |
| 36 | + criteriaMode: CriteriaMode |
| 37 | + delayError: number |
| 38 | +} |
| 39 | + |
| 40 | +export type KeepStateOptions = Partial<{ |
| 41 | + keepDirtyValues: boolean |
| 42 | + keepErrors: boolean |
| 43 | + keepDirty: boolean |
| 44 | + keepValues: boolean |
| 45 | + keepDefaultValues: boolean |
| 46 | + keepIsSubmitted: boolean |
| 47 | + keepIsValid: boolean |
| 48 | + keepSubmitCount: boolean |
| 49 | +}> |
| 50 | + |
| 51 | +export type SubmitHandler<TFieldValues extends FieldValues> = ( |
| 52 | + data: UnpackNestedValue<TFieldValues>, |
| 53 | + event?: Event |
| 54 | +) => any | Promise<any> |
| 55 | + |
| 56 | +export type SubmitErrorHandler<TFieldValues extends FieldValues> = ( |
| 57 | + errors: FieldErrors<TFieldValues>, |
| 58 | + event?: Event |
| 59 | +) => any | Promise<any> |
| 60 | + |
| 61 | +export type UseFormHandleSubmit<TFieldValues extends FieldValues> = ( |
| 62 | + onValid: SubmitHandler<TFieldValues>, |
| 63 | + onInvalid?: SubmitErrorHandler<TFieldValues> |
| 64 | +) => (e?: Event) => Promise<void> |
| 65 | + |
| 66 | +export type UseFormClearErrors<FieldName> = ( |
| 67 | + fieldName?: FieldName | FieldName[] |
| 68 | +) => void |
| 69 | + |
| 70 | +export type GetValuesReturn<TFieldValues extends FieldValues> = { |
| 71 | + [K in keyof TFieldValues]: TFieldValues[K] extends NestedValue<infer U> |
| 72 | + ? U |
| 73 | + : TFieldValues[K] |
| 74 | +} |
| 75 | + |
| 76 | +export type UseFormGetValues<FieldValues, FieldKeys> = ( |
| 77 | + fieldNames?: FieldKeys | FieldKeys[] |
| 78 | +) => GetValuesReturn<FieldValues> |
| 79 | + |
| 80 | +export interface GetFieldStateReturn { |
| 81 | + isDirty: boolean |
| 82 | + isValid: boolean |
| 83 | + error?: FieldError |
| 84 | +} |
| 85 | + |
| 86 | +export type UseFormGetFieldState<FieldKeys> = ( |
| 87 | + fieldName: FieldKeys |
| 88 | +) => GetFieldStateReturn |
| 89 | + |
| 90 | +export type UseFormSetError<FieldName> = ( |
| 91 | + name: FieldName, |
| 92 | + error: FieldError, |
| 93 | + config?: { shouldFocusError: boolean } |
| 94 | +) => void |
| 95 | + |
| 96 | +export type UseFormSetValue<TFieldValues extends FieldValues> = < |
| 97 | + TFieldName extends FieldPath<TFieldValues> = FieldPath<TFieldValues> |
| 98 | +>( |
| 99 | + name: TFieldName, |
| 100 | + value: FieldPathValue<TFieldValues, TFieldName>, |
| 101 | + options?: { |
| 102 | + shouldValidate?: boolean |
| 103 | + shouldDirty?: boolean |
| 104 | + } |
| 105 | +) => Promise<void> |
| 106 | + |
| 107 | +export type UseFormTriggerValidateOptions = { |
| 108 | + shouldFocus?: boolean |
| 109 | +} |
| 110 | + |
| 111 | +export type UseFormTriggerValidate< |
| 112 | + TFieldValues extends FieldValues, |
| 113 | + FieldName extends FieldPath<TFieldValues> = FieldPath<TFieldValues> |
| 114 | +> = ( |
| 115 | + fieldNames?: FieldName | FieldName[], |
| 116 | + options?: UseFormTriggerValidateOptions |
| 117 | +) => Promise<void> |
| 118 | + |
| 119 | +export type UseFormResetField<TFieldValues extends FieldValues> = < |
| 120 | + TFieldName extends FieldPath<TFieldValues> = FieldPath<TFieldValues> |
| 121 | +>( |
| 122 | + name: TFieldName, |
| 123 | + options?: Partial<{ |
| 124 | + keepDirty: boolean |
| 125 | + keepTouched: boolean |
| 126 | + keepError: boolean |
| 127 | + defaultValue: any |
| 128 | + }> |
| 129 | +) => void |
| 130 | + |
| 131 | +export type UseFormReset<TFieldValues extends FieldValues> = ( |
| 132 | + values?: |
| 133 | + | DefaultValues<TFieldValues> |
| 134 | + | UnpackNestedValue<TFieldValues> |
| 135 | + | 'all', |
| 136 | + keepStateOptions?: KeepStateOptions |
| 137 | +) => void |
| 138 | + |
| 139 | +export type UseFormUnregister<TFieldValues extends FieldValues> = < |
| 140 | + TFieldName extends FieldPath<TFieldValues> = FieldPath<TFieldValues> |
| 141 | +>( |
| 142 | + name?: TFieldName, |
| 143 | + options?: Omit< |
| 144 | + KeepStateOptions, |
| 145 | + | 'keepIsSubmitted' |
| 146 | + | 'keepSubmitCount' |
| 147 | + | 'keepValues' |
| 148 | + | 'keepDefaultValues' |
| 149 | + | 'keepErrors' |
| 150 | + | 'keepIsValid' |
| 151 | + | 'keepDirtyValues' |
| 152 | + > & { keepValue?: boolean; keepError?: boolean } |
| 153 | +) => void |
| 154 | + |
| 155 | +export interface UseFormRegisterReturn< |
| 156 | + T, |
| 157 | + BaseType = string | Date | number | T |
| 158 | +> { |
| 159 | + value: BaseType |
| 160 | + onInput: (e: InputEvent) => void |
| 161 | + modelValue: BaseType |
| 162 | + 'onUpdate:modelValue': (input: any) => void |
| 163 | +} |
| 164 | + |
| 165 | +// TODO solve register returnType problem |
| 166 | +export type UseFormRegister<TFieldValues extends FieldValues> = < |
| 167 | + TFieldName extends FieldPath<TFieldValues> = FieldPath<TFieldValues> |
| 168 | +>( |
| 169 | + name: TFieldName, |
| 170 | + options?: RegisterOptions<TFieldValues> |
| 171 | +) => any // UseFormRegisterReturn<TFieldName> |
| 172 | + |
| 173 | +export type UseFormSetFocus< |
| 174 | + TFieldValues extends FieldValues, |
| 175 | + FieldName extends FieldPath<TFieldValues> = FieldPath<TFieldValues> |
| 176 | +> = (name: FieldName) => void |
| 177 | + |
| 178 | +export type UseFormIsExistInErrors< |
| 179 | + TFieldValues extends FieldValues, |
| 180 | + FieldName extends FieldPath<TFieldValues> = FieldPath<TFieldValues> |
| 181 | +> = (name: FieldName) => boolean |
| 182 | + |
| 183 | +export interface UseFormHandlers< |
| 184 | + TFieldValues extends FieldValues, |
| 185 | + FieldName extends FieldPath<TFieldValues> = FieldPath<TFieldValues> |
| 186 | +> { |
| 187 | + getValues: UseFormGetValues<TFieldValues, FieldName> |
| 188 | + getFieldState: UseFormGetFieldState<FieldName> |
| 189 | + setError: UseFormSetError<FieldName> |
| 190 | + clearErrors: UseFormClearErrors<FieldName> |
| 191 | + setValue: UseFormSetValue<TFieldValues> |
| 192 | + triggerValidate: UseFormTriggerValidate<FieldName> |
| 193 | + reset: UseFormReset<TFieldValues> |
| 194 | + handleSubmit: UseFormHandleSubmit<TFieldValues> |
| 195 | + unregister: UseFormUnregister<TFieldValues> |
| 196 | + register: UseFormRegister<TFieldValues> |
| 197 | + setFocus: UseFormSetFocus<FieldName> |
| 198 | + isExistInErrors: UseFormIsExistInErrors<FieldName> |
| 199 | +} |
| 200 | + |
| 201 | +export type FieldArrayDefaultValues = Record<number, any> |
| 202 | + |
| 203 | +export type UseFormControl<TFieldValues extends FieldValues> = { |
| 204 | + _formState: ToRefs<FormState<TFieldValues>> |
| 205 | + _fieldArrayDefaultValues: FieldArrayDefaultValues |
| 206 | + _fields: Fields<TFieldValues, keyof TFieldValues> |
| 207 | +} & UseFormHandlers<TFieldValues> |
| 208 | + |
| 209 | +export type UseFormReturn<TFieldValues extends FieldValues> = { |
| 210 | + control: UseFormControl<TFieldValues> |
| 211 | + formState: ToRefs<FormState<TFieldValues>> |
| 212 | + fields: Fields<TFieldValues, keyof TFieldValues> |
| 213 | +} & UseFormHandlers<TFieldValues> |
| 214 | + |
| 215 | +export interface FormState<TFieldValues> { |
| 216 | + isDirty: boolean |
| 217 | + dirtyFields: FieldNamesMarkedBoolean<TFieldValues> |
| 218 | + isSubmitted: boolean |
| 219 | + isSubmitSuccessful: boolean |
| 220 | + submitCount: number |
| 221 | + isSubmitting: boolean |
| 222 | + isValidating: boolean |
| 223 | + isValid: boolean |
| 224 | + defaultValues: DefaultValues<TFieldValues> |
| 225 | + errors: FieldErrors<TFieldValues> |
| 226 | +} |
0 commit comments