vee-validate 4.8.5 → 4.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -168,6 +168,7 @@ You are welcome to contribute to this project, but before you do, please make su
168
168
 
169
169
  - Inspired by Laravel's [validation syntax](https://laravel.com/docs/5.4/validation)
170
170
  - v4 API Inspired by [Formik's](https://github.com/formium/formik)
171
+ - Nested path types by [react-hook-form](https://github.com/react-hook-form/react-hook-form)
171
172
  - Logo by [Baianat](https://github.com/baianat)
172
173
 
173
174
  ## Emeriti
@@ -1,5 +1,141 @@
1
1
  import * as vue from 'vue';
2
2
  import { Ref, ComputedRef, PropType, VNode, UnwrapRef, InjectionKey } from 'vue';
3
+ import { PartialDeep } from 'type-fest';
4
+
5
+ type BrowserNativeObject = Date | FileList | File;
6
+ type Primitive = null | undefined | string | number | boolean | symbol | bigint;
7
+ /**
8
+ * Checks whether the type is any
9
+ * See {@link https://stackoverflow.com/a/49928360/3406963}
10
+ * @typeParam T - type which may be any
11
+ * ```
12
+ * IsAny<any> = true
13
+ * IsAny<string> = false
14
+ * ```
15
+ */
16
+ type IsAny<T> = 0 extends 1 & T ? true : false;
17
+ /**
18
+ * Checks whether T1 can be exactly (mutually) assigned to T2
19
+ * @typeParam T1 - type to check
20
+ * @typeParam T2 - type to check against
21
+ * ```
22
+ * IsEqual<string, string> = true
23
+ * IsEqual<'foo', 'foo'> = true
24
+ * IsEqual<string, number> = false
25
+ * IsEqual<string, number> = false
26
+ * IsEqual<string, 'foo'> = false
27
+ * IsEqual<'foo', string> = false
28
+ * IsEqual<'foo' | 'bar', 'foo'> = boolean // 'foo' is assignable, but 'bar' is not (true | false) -> boolean
29
+ * ```
30
+ */
31
+ type IsEqual<T1, T2> = T1 extends T2 ? (<G>() => G extends T1 ? 1 : 2) extends <G>() => G extends T2 ? 1 : 2 ? true : false : false;
32
+ /**
33
+ * Type to query whether an array type T is a tuple type.
34
+ * @typeParam T - type which may be an array or tuple
35
+ * @example
36
+ * ```
37
+ * IsTuple<[number]> = true
38
+ * IsTuple<number[]> = false
39
+ * ```
40
+ */
41
+ type IsTuple<T extends ReadonlyArray<any>> = number extends T['length'] ? false : true;
42
+ /**
43
+ * Type which can be used to index an array or tuple type.
44
+ */
45
+ type ArrayKey = number;
46
+ /**
47
+ * Helper function to break apart T1 and check if any are equal to T2
48
+ *
49
+ * See {@link IsEqual}
50
+ */
51
+ type AnyIsEqual<T1, T2> = T1 extends T2 ? (IsEqual<T1, T2> extends true ? true : never) : never;
52
+ /**
53
+ * Type which given a tuple type returns its own keys, i.e. only its indices.
54
+ * @typeParam T - tuple type
55
+ * @example
56
+ * ```
57
+ * TupleKeys<[number, string]> = '0' | '1'
58
+ * ```
59
+ */
60
+ type TupleKeys<T extends ReadonlyArray<any>> = Exclude<keyof T, keyof any[]>;
61
+ /**
62
+ * Helper type for recursively constructing paths through a type.
63
+ * This actually constructs the strings and recurses into nested
64
+ * object types.
65
+ *
66
+ * See {@link Path}
67
+ */
68
+ type PathImpl<K extends string | number, V, TraversedTypes> = V extends Primitive | BrowserNativeObject ? `${K}` : true extends AnyIsEqual<TraversedTypes, V> ? `${K}` : `${K}` | `${K}.${PathInternal<V, TraversedTypes | V>}`;
69
+ /**
70
+ * Helper type for recursively constructing paths through a type.
71
+ * This obscures the internal type param TraversedTypes from ed contract.
72
+ *
73
+ * See {@link Path}
74
+ */
75
+ type PathInternal<T, TraversedTypes = T> = T extends ReadonlyArray<infer V> ? IsTuple<T> extends true ? {
76
+ [K in TupleKeys<T>]-?: PathImpl<K & string, T[K], TraversedTypes>;
77
+ }[TupleKeys<T>] : PathImpl<ArrayKey, V, TraversedTypes> : {
78
+ [K in keyof T]-?: PathImpl<K & string, T[K], TraversedTypes>;
79
+ }[keyof T];
80
+ /**
81
+ * Helper type for recursively constructing paths through a type.
82
+ * This actually constructs the strings and recurses into nested
83
+ * object types.
84
+ *
85
+ * See {@link ArrayPath}
86
+ */
87
+ type ArrayPathImpl<K extends string | number, V, TraversedTypes> = V extends Primitive | BrowserNativeObject ? IsAny<V> extends true ? string : never : V extends ReadonlyArray<infer U> ? U extends Primitive | BrowserNativeObject ? IsAny<V> extends true ? string : never : true extends AnyIsEqual<TraversedTypes, V> ? never : `${K}` | `${K}.${ArrayPathInternal<V, TraversedTypes | V>}` : true extends AnyIsEqual<TraversedTypes, V> ? never : `${K}.${ArrayPathInternal<V, TraversedTypes | V>}`;
88
+ /**
89
+ * Helper type for recursively constructing paths through a type.
90
+ * This obscures the internal type param TraversedTypes from ed contract.
91
+ *
92
+ * See {@link ArrayPath}
93
+ */
94
+ type ArrayPathInternal<T, TraversedTypes = T> = T extends ReadonlyArray<infer V> ? IsTuple<T> extends true ? {
95
+ [K in TupleKeys<T>]-?: ArrayPathImpl<K & string, T[K], TraversedTypes>;
96
+ }[TupleKeys<T>] : ArrayPathImpl<ArrayKey, V, TraversedTypes> : {
97
+ [K in keyof T]-?: ArrayPathImpl<K & string, T[K], TraversedTypes>;
98
+ }[keyof T];
99
+ /**
100
+ * Type which eagerly collects all paths through a type which point to an array
101
+ * type.
102
+ * @typeParam T - type which should be introspected.
103
+ * @example
104
+ * ```
105
+ * Path<{foo: {bar: string[], baz: number[]}}> = 'foo.bar' | 'foo.baz'
106
+ * ```
107
+ */
108
+ type ArrayPath<T> = T extends any ? ArrayPathInternal<T> : never;
109
+ /**
110
+ * Type to evaluate the type which the given path points to.
111
+ * @typeParam T - deeply nested type which is indexed by the path
112
+ * @typeParam P - path into the deeply nested type
113
+ * @example
114
+ * ```
115
+ * PathValue<{foo: {bar: string}}, 'foo.bar'> = string
116
+ * PathValue<[number, string], '1'> = string
117
+ * ```
118
+ */
119
+ type PathValue<T, P extends Path<T> | ArrayPath<T>> = T extends any ? P extends `${infer K}.${infer R}` ? K extends keyof T ? R extends Path<T[K]> ? PathValue<T[K], R> : never : K extends `${ArrayKey}` ? T extends ReadonlyArray<infer V> ? PathValue<V, R & Path<V>> : never : never : P extends keyof T ? T[P] : P extends `${ArrayKey}` ? T extends ReadonlyArray<infer V> ? V : never : never : never;
120
+ /**
121
+ * Type which eagerly collects all paths through a type
122
+ * @typeParam T - type which should be introspected
123
+ * @example
124
+ * ```
125
+ * Path<{foo: {bar: string}}> = 'foo' | 'foo.bar'
126
+ * ```
127
+ */
128
+ type Path<T> = T extends any ? PathInternal<T> : never;
129
+
130
+ type GenericObject = Record<string, any>;
131
+ type MaybeRef<T> = Ref<T> | T;
132
+ type MaybeRefOrLazy<T> = MaybeRef<T> | (() => T);
133
+ type MapValuesPathsToRefs<TValues extends GenericObject, TPaths extends readonly [...MaybeRef<Path<TValues>>[]]> = {
134
+ readonly [K in keyof TPaths]: TPaths[K] extends MaybeRef<infer TKey> ? TKey extends Path<TValues> ? Ref<PathValue<TValues, TKey>> : Ref<unknown> : Ref<unknown>;
135
+ };
136
+ type FlattenAndSetPathsType<TRecord, TType> = {
137
+ [K in Path<TRecord>]: TType;
138
+ };
3
139
 
4
140
  interface FieldValidationMetaInfo {
5
141
  field: string;
@@ -16,7 +152,6 @@ type ValidationRuleFunction<TValue = unknown, TParams = unknown[] | Record<strin
16
152
  type SimpleValidationRuleFunction<TValue = unknown, TParams = unknown[] | Record<string, unknown>> = (value: TValue, params: TParams) => boolean | string | Promise<boolean | string>;
17
153
  type ValidationMessageGenerator = (ctx: FieldValidationMetaInfo) => string;
18
154
 
19
- type GenericFormValues = Record<string, any>;
20
155
  interface ValidationResult {
21
156
  errors: string[];
22
157
  valid: boolean;
@@ -35,10 +170,8 @@ interface TypedSchema<TInput = any, TOutput = TInput> {
35
170
  }
36
171
  type YupSchema<TValues = any> = {
37
172
  __isYupSchema__: boolean;
38
- validate(value: any, options: Record<string, any>): Promise<any>;
173
+ validate(value: any, options: GenericObject): Promise<any>;
39
174
  };
40
- type MaybeRef<T> = Ref<T> | T;
41
- type MaybeRefOrLazy<T> = MaybeRef<T> | (() => T);
42
175
  interface FieldMeta<TValue> {
43
176
  touched: boolean;
44
177
  dirty: boolean;
@@ -47,7 +180,7 @@ interface FieldMeta<TValue> {
47
180
  pending: boolean;
48
181
  initialValue?: TValue;
49
182
  }
50
- interface FormMeta<TValues extends Record<string, any>> {
183
+ interface FormMeta<TValues extends GenericObject> {
51
184
  touched: boolean;
52
185
  dirty: boolean;
53
186
  valid: boolean;
@@ -60,6 +193,7 @@ interface FieldState<TValue = unknown> {
60
193
  touched: boolean;
61
194
  errors: string[];
62
195
  }
196
+ type InputType = 'checkbox' | 'radio' | 'default';
63
197
  /**
64
198
  * validated-only: only mutate the previously validated fields
65
199
  * silent: do not mutate any field
@@ -69,6 +203,31 @@ type SchemaValidationMode = 'validated-only' | 'silent' | 'force';
69
203
  interface ValidationOptions$1 {
70
204
  mode: SchemaValidationMode;
71
205
  }
206
+ type FieldValidator = (opts?: Partial<ValidationOptions$1>) => Promise<ValidationResult>;
207
+ interface PathStateConfig {
208
+ bails: boolean;
209
+ label: MaybeRef<string | undefined>;
210
+ type: InputType;
211
+ validate: FieldValidator;
212
+ }
213
+ interface PathState<TValue = unknown> {
214
+ id: number | number[];
215
+ path: string;
216
+ touched: boolean;
217
+ dirty: boolean;
218
+ valid: boolean;
219
+ validated: boolean;
220
+ pending: boolean;
221
+ initialValue: TValue | undefined;
222
+ value: TValue | undefined;
223
+ errors: string[];
224
+ bails: boolean;
225
+ label: string | undefined;
226
+ type: InputType;
227
+ multiple: boolean;
228
+ fieldsCount: number;
229
+ validate?: FieldValidator;
230
+ }
72
231
  interface FieldEntry<TValue = unknown> {
73
232
  value: TValue;
74
233
  key: string | number;
@@ -106,7 +265,7 @@ interface PrivateFieldContext<TValue = unknown> {
106
265
  checked?: Ref<boolean>;
107
266
  resetField(state?: Partial<FieldState<TValue>>): void;
108
267
  handleReset(): void;
109
- validate(opts?: Partial<ValidationOptions$1>): Promise<ValidationResult>;
268
+ validate: FieldValidator;
110
269
  handleChange(e: Event | unknown, shouldValidate?: boolean): void;
111
270
  handleBlur(e?: Event): void;
112
271
  setState(state: Partial<FieldState<TValue>>): void;
@@ -117,55 +276,51 @@ interface PrivateFieldContext<TValue = unknown> {
117
276
  type FieldContext<TValue = unknown> = Omit<PrivateFieldContext<TValue>, 'id' | 'instances'>;
118
277
  type GenericValidateFunction<TValue = unknown> = (value: TValue, ctx: FieldValidationMetaInfo) => boolean | string | Promise<boolean | string>;
119
278
  interface FormState<TValues> {
120
- values: TValues;
121
- errors: Partial<Record<keyof TValues, string | undefined>>;
122
- touched: Partial<Record<keyof TValues, boolean>>;
279
+ values: PartialDeep<TValues>;
280
+ errors: Partial<Record<Path<TValues>, string | undefined>>;
281
+ touched: Partial<Record<Path<TValues>, boolean>>;
123
282
  submitCount: number;
124
283
  }
125
- type FormErrors<TValues extends GenericFormValues> = Partial<Record<keyof TValues, string | undefined>>;
126
- type FormErrorBag<TValues extends GenericFormValues> = Partial<Record<keyof TValues, string[]>>;
284
+ type FormErrors<TValues extends GenericObject> = Partial<Record<Path<TValues>, string | undefined>>;
285
+ type FormErrorBag<TValues extends GenericObject> = Partial<Record<Path<TValues>, string[]>>;
127
286
  interface SetFieldValueOptions {
128
287
  force: boolean;
129
288
  }
130
- interface FormActions<TValues extends GenericFormValues, TOutput extends TValues = TValues> {
131
- setFieldValue<T extends keyof TValues>(field: T, value: TValues[T], opts?: Partial<SetFieldValueOptions>): void;
132
- setFieldError(field: keyof TValues, message: string | string[] | undefined): void;
289
+ interface FormActions<TValues extends GenericObject, TOutput = TValues> {
290
+ setFieldValue<T extends Path<TValues>>(field: T, value: PathValue<TValues, T>, opts?: Partial<SetFieldValueOptions>): void;
291
+ setFieldError(field: Path<TValues>, message: string | string[] | undefined): void;
133
292
  setErrors(fields: FormErrors<TValues>): void;
134
- setValues<T extends keyof TValues>(fields: Partial<Record<T, TValues[T]>>): void;
135
- setFieldTouched(field: keyof TValues, isTouched: boolean): void;
136
- setTouched(fields: Partial<Record<keyof TValues, boolean>>): void;
293
+ setValues(fields: PartialDeep<TValues>): void;
294
+ setFieldTouched(field: Path<TValues>, isTouched: boolean): void;
295
+ setTouched(fields: Partial<Record<Path<TValues>, boolean>>): void;
137
296
  resetForm(state?: Partial<FormState<TValues>>): void;
138
- resetField(field: keyof TValues, state?: Partial<FieldState>): void;
297
+ resetField(field: Path<TValues>, state?: Partial<FieldState>): void;
139
298
  }
140
299
  interface FormValidationResult<TValues, TOutput = TValues> {
141
300
  valid: boolean;
142
- results: Partial<Record<keyof TValues, ValidationResult>>;
143
- errors: Partial<Record<keyof TValues, string>>;
301
+ results: Partial<Record<Path<TValues>, ValidationResult>>;
302
+ errors: Partial<Record<Path<TValues>, string>>;
144
303
  values?: TOutput;
145
304
  }
146
- interface SubmissionContext<TValues extends GenericFormValues = GenericFormValues> extends FormActions<TValues> {
305
+ interface SubmissionContext<TValues extends GenericObject = GenericObject> extends FormActions<TValues> {
147
306
  evt?: Event;
148
307
  controlledValues: Partial<TValues>;
149
308
  }
150
- type SubmissionHandler<TValues extends GenericFormValues = GenericFormValues, TOutput extends TValues = TValues, TReturn = unknown> = (values: TOutput, ctx: SubmissionContext<TValues>) => TReturn;
151
- interface InvalidSubmissionContext<TValues extends GenericFormValues = GenericFormValues> {
309
+ type SubmissionHandler<TValues extends GenericObject = GenericObject, TOutput = TValues, TReturn = unknown> = (values: TOutput, ctx: SubmissionContext<TValues>) => TReturn;
310
+ interface InvalidSubmissionContext<TValues extends GenericObject = GenericObject> {
152
311
  values: TValues;
153
312
  evt?: Event;
154
- errors: Partial<Record<keyof TValues, string>>;
155
- results: Partial<Record<keyof TValues, ValidationResult>>;
313
+ errors: Partial<Record<Path<TValues>, string>>;
314
+ results: Partial<Record<Path<TValues>, ValidationResult>>;
156
315
  }
157
- type InvalidSubmissionHandler<TValues extends GenericFormValues = GenericFormValues> = (ctx: InvalidSubmissionContext<TValues>) => void;
158
- type RawFormSchema<TValues> = Record<keyof TValues, string | GenericValidateFunction | Record<string, any>>;
159
- type FieldPathLookup<TValues extends Record<string, any> = Record<string, any>> = Partial<Record<keyof TValues, PrivateFieldContext | PrivateFieldContext[]>>;
160
- type MapValues<T, TValues extends Record<string, any>> = {
161
- [K in keyof T]: T[K] extends MaybeRef<infer TKey> ? TKey extends keyof TValues ? Ref<TValues[TKey]> : Ref<unknown> : Ref<unknown>;
162
- };
163
- type HandleSubmitFactory<TValues extends GenericFormValues, TOutput extends TValues = TValues> = <TReturn = unknown>(cb: SubmissionHandler<TValues, TOutput, TReturn>, onSubmitValidationErrorCb?: InvalidSubmissionHandler<TValues>) => (e?: Event) => Promise<TReturn | undefined>;
164
- interface PrivateFormContext<TValues extends GenericFormValues = GenericFormValues, TOutput extends TValues = TValues> extends FormActions<TValues> {
316
+ type InvalidSubmissionHandler<TValues extends GenericObject = GenericObject> = (ctx: InvalidSubmissionContext<TValues>) => void;
317
+ type RawFormSchema<TValues> = Record<Path<TValues>, string | GenericValidateFunction | GenericObject>;
318
+ type HandleSubmitFactory<TValues extends GenericObject, TOutput = TValues> = <TReturn = unknown>(cb: SubmissionHandler<TValues, TOutput, TReturn>, onSubmitValidationErrorCb?: InvalidSubmissionHandler<TValues>) => (e?: Event) => Promise<TReturn | undefined>;
319
+ interface PrivateFormContext<TValues extends GenericObject = GenericObject, TOutput = TValues> extends FormActions<TValues> {
165
320
  formId: number;
166
321
  values: TValues;
322
+ initialValues: Ref<Partial<TValues>>;
167
323
  controlledValues: Ref<TValues>;
168
- fieldsByPath: Ref<FieldPathLookup>;
169
324
  fieldArrays: PrivateFieldArrayContext[];
170
325
  submitCount: Ref<number>;
171
326
  schema?: MaybeRef<RawFormSchema<TValues> | TypedSchema<TValues, TOutput> | YupSchema<TValues> | undefined>;
@@ -175,23 +330,61 @@ interface PrivateFormContext<TValues extends GenericFormValues = GenericFormValu
175
330
  isSubmitting: Ref<boolean>;
176
331
  keepValuesOnUnmount: MaybeRef<boolean>;
177
332
  validateSchema?: (mode: SchemaValidationMode) => Promise<FormValidationResult<TValues, TOutput>>;
178
- validate(opts?: Partial<ValidationOptions$1>): Promise<FormValidationResult<TValues>>;
179
- validateField(field: keyof TValues): Promise<ValidationResult>;
180
- setFieldErrorBag(field: string, messages: string | string[]): void;
333
+ validate(opts?: Partial<ValidationOptions$1>): Promise<FormValidationResult<TValues, TOutput>>;
334
+ validateField(field: Path<TValues>): Promise<ValidationResult>;
181
335
  stageInitialValue(path: string, value: unknown, updateOriginal?: boolean): void;
182
336
  unsetInitialValue(path: string): void;
183
- register(field: PrivateFieldContext): void;
184
- unregister(field: PrivateFieldContext): void;
185
337
  handleSubmit: HandleSubmitFactory<TValues, TOutput> & {
186
338
  withControlled: HandleSubmitFactory<TValues, TOutput>;
187
339
  };
188
340
  setFieldInitialValue(path: string, value: unknown): void;
189
- useFieldModel<TPath extends keyof TValues>(path: MaybeRef<TPath>): Ref<TValues[TPath]>;
190
- useFieldModel<TPath extends keyof TValues>(paths: [...MaybeRef<TPath>[]]): MapValues<typeof paths, TValues>;
341
+ useFieldModel<TPath extends Path<TValues>>(path: TPath): Ref<PathValue<TValues, TPath>>;
342
+ useFieldModel<TPaths extends readonly [...MaybeRef<Path<TValues>>[]]>(paths: TPaths): MapValuesPathsToRefs<TValues, TPaths>;
343
+ createPathState<TPath extends Path<TValues>>(path: MaybeRef<TPath>, config?: Partial<PathStateConfig>): PathState<PathValue<TValues, TPath>>;
344
+ getPathState<TPath extends Path<TValues>>(path: TPath): PathState<PathValue<TValues, TPath>> | undefined;
345
+ getAllPathStates(): PathState[];
346
+ removePathState<TPath extends Path<TValues>>(path: TPath): void;
347
+ unsetPathValue<TPath extends Path<TValues>>(path: TPath): void;
191
348
  }
192
- interface FormContext<TValues extends Record<string, any> = Record<string, any>, TOutput extends TValues = TValues> extends Omit<PrivateFormContext<TValues, TOutput>, 'formId' | 'register' | 'unregister' | 'fieldsByPath' | 'schema' | 'validateSchema' | 'setFieldErrorBag' | 'stageInitialValue' | 'setFieldInitialValue' | 'unsetInitialValue' | 'fieldArrays' | 'keepValuesOnUnmount'> {
349
+ interface BaseComponentBinds<TValue = unknown> {
350
+ modelValue: TValue | undefined;
351
+ 'onUpdate:modelValue': (value: TValue) => void;
352
+ onBlur: () => void;
353
+ }
354
+ type PublicPathState<TValue = unknown> = Omit<PathState<TValue>, 'bails' | 'label' | 'multiple' | 'fieldsCount' | 'validate' | 'id' | 'type'>;
355
+ interface ComponentBindsConfig<TValue = unknown, TExtraProps extends GenericObject = GenericObject> {
356
+ mapProps: (state: PublicPathState<TValue>) => TExtraProps;
357
+ validateOnBlur: boolean;
358
+ validateOnModelUpdate: boolean;
359
+ }
360
+ type LazyComponentBindsConfig<TValue = unknown, TExtraProps extends GenericObject = GenericObject> = (state: PublicPathState<TValue>) => Partial<{
361
+ props: TExtraProps;
362
+ validateOnBlur: boolean;
363
+ validateOnModelUpdate: boolean;
364
+ }>;
365
+ interface BaseInputBinds<TValue = unknown> {
366
+ value: TValue | undefined;
367
+ onBlur: (e: Event) => void;
368
+ onChange: (e: Event) => void;
369
+ onInput: (e: Event) => void;
370
+ }
371
+ interface InputBindsConfig<TValue = unknown, TExtraProps extends GenericObject = GenericObject> {
372
+ mapAttrs: (state: PublicPathState<TValue>) => TExtraProps;
373
+ validateOnBlur: boolean;
374
+ validateOnChange: boolean;
375
+ validateOnInput: boolean;
376
+ }
377
+ type LazyInputBindsConfig<TValue = unknown, TExtraProps extends GenericObject = GenericObject> = (state: PublicPathState<TValue>) => Partial<{
378
+ attrs: TExtraProps;
379
+ validateOnBlur: boolean;
380
+ validateOnChange: boolean;
381
+ validateOnInput: boolean;
382
+ }>;
383
+ interface FormContext<TValues extends GenericObject = GenericObject, TOutput = TValues> extends Omit<PrivateFormContext<TValues, TOutput>, 'formId' | 'schema' | 'initialValues' | 'getPathState' | 'getAllPathStates' | 'removePathState' | 'unsetPathValue' | 'validateSchema' | 'stageInitialValue' | 'setFieldInitialValue' | 'unsetInitialValue' | 'fieldArrays' | 'keepValuesOnUnmount'> {
193
384
  handleReset: () => void;
194
385
  submitForm: (e?: unknown) => Promise<void>;
386
+ defineComponentBinds<TPath extends Path<TValues>, TValue = PathValue<TValues, TPath>, TExtras extends GenericObject = GenericObject>(path: MaybeRefOrLazy<TPath>, config?: Partial<ComponentBindsConfig<TValue, TExtras>> | LazyComponentBindsConfig<TValue, TExtras>): Ref<BaseComponentBinds<TValue> & TExtras>;
387
+ defineInputBinds<TPath extends Path<TValues>, TValue = PathValue<TValues, TPath>, TExtras extends GenericObject = GenericObject>(path: MaybeRefOrLazy<TPath>, config?: Partial<InputBindsConfig<TValue, TExtras>> | LazyInputBindsConfig<TValue, TExtras>): Ref<BaseInputBinds<TValue> & TExtras>;
195
388
  }
196
389
 
197
390
  interface ValidationOptions {
@@ -232,7 +425,7 @@ interface FieldOptions<TValue = unknown> {
232
425
  validateOnValueUpdate: boolean;
233
426
  validateOnMount?: boolean;
234
427
  bails?: boolean;
235
- type?: string;
428
+ type?: InputType;
236
429
  valueProp?: MaybeRef<TValue>;
237
430
  checkedValue?: MaybeRef<TValue>;
238
431
  uncheckedValue?: MaybeRef<TValue>;
@@ -250,11 +443,12 @@ type RuleExpression<TValue> = string | Record<string, unknown> | GenericValidate
250
443
  */
251
444
  declare function useField<TValue = unknown>(path: MaybeRefOrLazy<string>, rules?: MaybeRef<RuleExpression<TValue>>, opts?: Partial<FieldOptions<TValue>>): FieldContext<TValue>;
252
445
 
446
+ type EventHandlerBinding<T> = T | T[];
253
447
  interface FieldBindingObject<TValue = unknown> {
254
448
  name: string;
255
- onBlur: (e: Event) => unknown;
256
- onInput: (e: Event) => unknown;
257
- onChange: (e: Event) => unknown;
449
+ onBlur: EventHandlerBinding<(e: Event) => unknown>;
450
+ onInput: EventHandlerBinding<(e: Event) => unknown>;
451
+ onChange: EventHandlerBinding<(e: Event) => unknown>;
258
452
  'onUpdate:modelValue'?: ((e: TValue) => unknown) | undefined;
259
453
  value?: unknown;
260
454
  checked?: boolean;
@@ -655,23 +849,23 @@ declare const Field: {
655
849
  type FormSlotProps = UnwrapRef<Pick<FormContext, 'meta' | 'errors' | 'errorBag' | 'values' | 'isSubmitting' | 'submitCount' | 'validate' | 'validateField' | 'handleReset' | 'setErrors' | 'setFieldError' | 'setFieldValue' | 'setValues' | 'setFieldTouched' | 'setTouched' | 'resetForm' | 'resetField' | 'controlledValues'>> & {
656
850
  handleSubmit: (evt: Event | SubmissionHandler, onSubmit?: SubmissionHandler) => Promise<unknown>;
657
851
  submitForm(evt?: Event): void;
658
- getValues<TValues extends GenericFormValues = GenericFormValues>(): TValues;
659
- getMeta<TValues extends GenericFormValues = GenericFormValues>(): FormMeta<TValues>;
660
- getErrors<TValues extends GenericFormValues = GenericFormValues>(): FormErrors<TValues>;
852
+ getValues<TValues extends GenericObject = GenericObject>(): TValues;
853
+ getMeta<TValues extends GenericObject = GenericObject>(): FormMeta<TValues>;
854
+ getErrors<TValues extends GenericObject = GenericObject>(): FormErrors<TValues>;
661
855
  };
662
856
  declare const Form: {
663
857
  new (...args: any[]): {
664
858
  $: vue.ComponentInternalInstance;
665
859
  $data: {};
666
860
  $props: Partial<{
667
- onSubmit: SubmissionHandler<GenericFormValues, GenericFormValues, unknown>;
861
+ onSubmit: SubmissionHandler;
668
862
  as: string;
669
863
  initialValues: Record<string, any>;
670
864
  validateOnMount: boolean;
671
865
  validationSchema: Record<string, any>;
672
866
  initialErrors: Record<string, any>;
673
867
  initialTouched: Record<string, any>;
674
- onInvalidSubmit: InvalidSubmissionHandler<GenericFormValues>;
868
+ onInvalidSubmit: InvalidSubmissionHandler;
675
869
  keepValues: boolean;
676
870
  }> & Omit<Readonly<vue.ExtractPropTypes<{
677
871
  as: {
@@ -699,11 +893,11 @@ declare const Form: {
699
893
  default: boolean;
700
894
  };
701
895
  onSubmit: {
702
- type: PropType<SubmissionHandler<GenericFormValues, GenericFormValues, unknown>>;
896
+ type: PropType<SubmissionHandler>;
703
897
  default: any;
704
898
  };
705
899
  onInvalidSubmit: {
706
- type: PropType<InvalidSubmissionHandler<GenericFormValues>>;
900
+ type: PropType<InvalidSubmissionHandler>;
707
901
  default: any;
708
902
  };
709
903
  keepValues: {
@@ -750,11 +944,11 @@ declare const Form: {
750
944
  default: boolean;
751
945
  };
752
946
  onSubmit: {
753
- type: PropType<SubmissionHandler<GenericFormValues, GenericFormValues, unknown>>;
947
+ type: PropType<SubmissionHandler>;
754
948
  default: any;
755
949
  };
756
950
  onInvalidSubmit: {
757
- type: PropType<InvalidSubmissionHandler<GenericFormValues>>;
951
+ type: PropType<InvalidSubmissionHandler>;
758
952
  default: any;
759
953
  };
760
954
  keepValues: {
@@ -770,14 +964,14 @@ declare const Form: {
770
964
  [key: string]: any;
771
965
  }>[];
772
966
  }, unknown, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {}, string, {
773
- onSubmit: SubmissionHandler<GenericFormValues, GenericFormValues, unknown>;
967
+ onSubmit: SubmissionHandler;
774
968
  as: string;
775
969
  initialValues: Record<string, any>;
776
970
  validateOnMount: boolean;
777
971
  validationSchema: Record<string, any>;
778
972
  initialErrors: Record<string, any>;
779
973
  initialTouched: Record<string, any>;
780
- onInvalidSubmit: InvalidSubmissionHandler<GenericFormValues>;
974
+ onInvalidSubmit: InvalidSubmissionHandler;
781
975
  keepValues: boolean;
782
976
  }, {}, string> & {
783
977
  beforeCreate?: (() => void) | (() => void)[];
@@ -825,11 +1019,11 @@ declare const Form: {
825
1019
  default: boolean;
826
1020
  };
827
1021
  onSubmit: {
828
- type: PropType<SubmissionHandler<GenericFormValues, GenericFormValues, unknown>>;
1022
+ type: PropType<SubmissionHandler>;
829
1023
  default: any;
830
1024
  };
831
1025
  onInvalidSubmit: {
832
- type: PropType<InvalidSubmissionHandler<GenericFormValues>>;
1026
+ type: PropType<InvalidSubmissionHandler>;
833
1027
  default: any;
834
1028
  };
835
1029
  keepValues: {
@@ -874,11 +1068,11 @@ declare const Form: {
874
1068
  default: boolean;
875
1069
  };
876
1070
  onSubmit: {
877
- type: PropType<SubmissionHandler<GenericFormValues, GenericFormValues, unknown>>;
1071
+ type: PropType<SubmissionHandler>;
878
1072
  default: any;
879
1073
  };
880
1074
  onInvalidSubmit: {
881
- type: PropType<InvalidSubmissionHandler<GenericFormValues>>;
1075
+ type: PropType<InvalidSubmissionHandler>;
882
1076
  default: any;
883
1077
  };
884
1078
  keepValues: {
@@ -894,14 +1088,14 @@ declare const Form: {
894
1088
  [key: string]: any;
895
1089
  }>[];
896
1090
  }, unknown, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {}, string, {
897
- onSubmit: SubmissionHandler<GenericFormValues, GenericFormValues, unknown>;
1091
+ onSubmit: SubmissionHandler;
898
1092
  as: string;
899
1093
  initialValues: Record<string, any>;
900
1094
  validateOnMount: boolean;
901
1095
  validationSchema: Record<string, any>;
902
1096
  initialErrors: Record<string, any>;
903
1097
  initialTouched: Record<string, any>;
904
- onInvalidSubmit: InvalidSubmissionHandler<GenericFormValues>;
1098
+ onInvalidSubmit: InvalidSubmissionHandler;
905
1099
  keepValues: boolean;
906
1100
  }, {}, string> & vue.VNodeProps & vue.AllowedComponentProps & vue.ComponentCustomProps & (new () => {
907
1101
  setFieldError: FormContext['setFieldError'];
@@ -1133,16 +1327,16 @@ declare const ErrorMessage: {
1133
1327
  };
1134
1328
  });
1135
1329
 
1136
- type FormSchema<TValues> = Record<keyof TValues, GenericValidateFunction | string | GenericFormValues> | undefined;
1137
- interface FormOptions<TValues extends GenericFormValues, TOutput extends TValues = TValues, TSchema extends TypedSchema<TValues, TOutput> | FormSchema<TValues> = FormSchema<TValues> | TypedSchema<TValues, TOutput>> {
1330
+ type FormSchema<TValues extends Record<string, unknown>> = FlattenAndSetPathsType<TValues, GenericValidateFunction | string | GenericObject> | undefined;
1331
+ interface FormOptions<TValues extends GenericObject, TOutput = TValues, TSchema extends TypedSchema<TValues, TOutput> | FormSchema<TValues> = FormSchema<TValues> | TypedSchema<TValues, TOutput>> {
1138
1332
  validationSchema?: MaybeRef<TSchema extends TypedSchema ? TypedSchema<TValues, TOutput> : any>;
1139
- initialValues?: MaybeRef<Partial<TValues>>;
1140
- initialErrors?: Record<keyof TValues, string | undefined>;
1141
- initialTouched?: Record<keyof TValues, boolean>;
1333
+ initialValues?: MaybeRef<PartialDeep<TValues>>;
1334
+ initialErrors?: FlattenAndSetPathsType<TValues, string | undefined>;
1335
+ initialTouched?: FlattenAndSetPathsType<TValues, boolean>;
1142
1336
  validateOnMount?: boolean;
1143
1337
  keepValuesOnUnmount?: MaybeRef<boolean>;
1144
1338
  }
1145
- declare function useForm<TValues extends GenericFormValues = GenericFormValues, TOutput extends TValues = TValues, TSchema extends FormSchema<TValues> | TypedSchema<TValues, TOutput> = FormSchema<TValues> | TypedSchema<TValues, TOutput>>(opts?: FormOptions<TValues, TOutput, TSchema>): FormContext<TValues, TOutput>;
1339
+ declare function useForm<TValues extends GenericObject = GenericObject, TOutput = TValues, TSchema extends FormSchema<TValues> | TypedSchema<TValues, TOutput> = FormSchema<TValues> | TypedSchema<TValues, TOutput>>(opts?: FormOptions<TValues, TOutput, TSchema>): FormContext<TValues, TOutput>;
1146
1340
 
1147
1341
  declare function useFieldArray<TValue = unknown>(arrayPath: MaybeRef<string>): FieldArrayContext<TValue>;
1148
1342
 
@@ -1211,7 +1405,7 @@ declare function useFormValues<TValues extends Record<string, any> = Record<stri
1211
1405
  /**
1212
1406
  * Gives access to all form errors
1213
1407
  */
1214
- declare function useFormErrors<TValues extends Record<string, unknown> = Record<string, unknown>>(): vue.ComputedRef<Partial<Record<keyof TValues, string>>>;
1408
+ declare function useFormErrors<TValues extends Record<string, unknown> = Record<string, unknown>>(): vue.ComputedRef<Partial<Record<Path<TValues>, string>>>;
1215
1409
 
1216
1410
  /**
1217
1411
  * Gives access to a single field error
@@ -1224,4 +1418,4 @@ declare const FormContextKey: InjectionKey<PrivateFormContext>;
1224
1418
  declare const FieldContextKey: InjectionKey<PrivateFieldContext<unknown>>;
1225
1419
  declare const IS_ABSENT: any;
1226
1420
 
1227
- export { ErrorMessage, Field, FieldArray, FieldArrayContext, FieldContext, FieldContextKey, FieldEntry, FieldMeta, FieldOptions, FieldState, Form, FormActions, FormContext, FormContextKey, FormMeta, FormOptions, FormState, FormValidationResult, GenericValidateFunction, IS_ABSENT, InvalidSubmissionContext, InvalidSubmissionHandler, RawFormSchema, RuleExpression, SubmissionContext, SubmissionHandler, TypedSchema, TypedSchemaError, ValidationOptions$1 as ValidationOptions, ValidationResult, configure, defineRule, useField, useFieldArray, useFieldError, useFieldValue, useForm, useFormErrors, useFormValues, useIsFieldDirty, useIsFieldTouched, useIsFieldValid, useIsFormDirty, useIsFormTouched, useIsFormValid, useIsSubmitting, useResetForm, useSubmitCount, useSubmitForm, useValidateField, useValidateForm, validate, validateObjectSchema as validateObject };
1421
+ export { ComponentBindsConfig, ErrorMessage, Field, FieldArray, FieldArrayContext, FieldContext, FieldContextKey, FieldEntry, FieldMeta, FieldOptions, FieldState, Form, FormActions, FormContext, FormContextKey, FormMeta, FormOptions, FormState, FormValidationResult, GenericValidateFunction, IS_ABSENT, InputBindsConfig, InvalidSubmissionContext, InvalidSubmissionHandler, LazyComponentBindsConfig, LazyInputBindsConfig, Path, PublicPathState as PathState, RawFormSchema, RuleExpression, SubmissionContext, SubmissionHandler, TypedSchema, TypedSchemaError, ValidationOptions$1 as ValidationOptions, ValidationResult, configure, defineRule, useField, useFieldArray, useFieldError, useFieldValue, useForm, useFormErrors, useFormValues, useIsFieldDirty, useIsFieldTouched, useIsFieldValid, useIsFormDirty, useIsFormTouched, useIsFormValid, useIsSubmitting, useResetForm, useSubmitCount, useSubmitForm, useValidateField, useValidateForm, validate, validateObjectSchema as validateObject };