+
- There was an error on the form: {{formErrorMap.onChange }}
+ There was an error on the form: {{formErrorMap.onChange[0] }}
diff --git a/docs/reference/classes/fieldapi.md b/docs/reference/classes/fieldapi.md
index ee7290043..c5b63600f 100644
--- a/docs/reference/classes/fieldapi.md
+++ b/docs/reference/classes/fieldapi.md
@@ -47,7 +47,7 @@ Initializes a new `FieldApi` instance.
#### Defined in
-[packages/form-core/src/FieldApi.ts:477](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L477)
+[packages/form-core/src/FieldApi.ts:478](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L478)
## Properties
@@ -61,7 +61,7 @@ A reference to the form API instance.
#### Defined in
-[packages/form-core/src/FieldApi.ts:441](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L441)
+[packages/form-core/src/FieldApi.ts:442](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L442)
***
@@ -75,7 +75,7 @@ The field name.
#### Defined in
-[packages/form-core/src/FieldApi.ts:451](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L451)
+[packages/form-core/src/FieldApi.ts:452](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L452)
***
@@ -89,7 +89,7 @@ The field options.
#### Defined in
-[packages/form-core/src/FieldApi.ts:455](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L455)
+[packages/form-core/src/FieldApi.ts:456](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L456)
***
@@ -103,7 +103,7 @@ The field state store.
#### Defined in
-[packages/form-core/src/FieldApi.ts:465](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L465)
+[packages/form-core/src/FieldApi.ts:466](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L466)
***
@@ -115,7 +115,7 @@ timeoutIds: Record
;
#### Defined in
-[packages/form-core/src/FieldApi.ts:472](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L472)
+[packages/form-core/src/FieldApi.ts:473](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L473)
## Accessors
@@ -135,7 +135,7 @@ The current field state.
#### Defined in
-[packages/form-core/src/FieldApi.ts:469](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L469)
+[packages/form-core/src/FieldApi.ts:470](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L470)
## Methods
@@ -153,7 +153,7 @@ Gets the field information object.
#### Defined in
-[packages/form-core/src/FieldApi.ts:672](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L672)
+[packages/form-core/src/FieldApi.ts:676](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L676)
***
@@ -169,7 +169,7 @@ getMeta(): FieldMeta
#### Defined in
-[packages/form-core/src/FieldApi.ts:661](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L661)
+[packages/form-core/src/FieldApi.ts:665](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L665)
***
@@ -191,7 +191,7 @@ Use `field.state.value` instead.
#### Defined in
-[packages/form-core/src/FieldApi.ts:643](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L643)
+[packages/form-core/src/FieldApi.ts:647](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L647)
***
@@ -209,7 +209,7 @@ Handles the blur event.
#### Defined in
-[packages/form-core/src/FieldApi.ts:1024](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L1024)
+[packages/form-core/src/FieldApi.ts:1030](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L1030)
***
@@ -233,7 +233,7 @@ Handles the change event.
#### Defined in
-[packages/form-core/src/FieldApi.ts:1017](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L1017)
+[packages/form-core/src/FieldApi.ts:1023](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L1023)
***
@@ -268,7 +268,7 @@ Inserts a value at the specified index, shifting the subsequent values to the ri
#### Defined in
-[packages/form-core/src/FieldApi.ts:685](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L685)
+[packages/form-core/src/FieldApi.ts:689](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L689)
***
@@ -290,7 +290,7 @@ Mounts the field instance to the form.
#### Defined in
-[packages/form-core/src/FieldApi.ts:567](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L567)
+[packages/form-core/src/FieldApi.ts:568](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L568)
***
@@ -325,7 +325,7 @@ Moves the value at the first specified index to the second specified index.
#### Defined in
-[packages/form-core/src/FieldApi.ts:715](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L715)
+[packages/form-core/src/FieldApi.ts:719](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L719)
***
@@ -353,7 +353,7 @@ Pushes a new value to the field.
#### Defined in
-[packages/form-core/src/FieldApi.ts:677](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L677)
+[packages/form-core/src/FieldApi.ts:681](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L681)
***
@@ -381,7 +381,7 @@ Removes a value at the specified index.
#### Defined in
-[packages/form-core/src/FieldApi.ts:703](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L703)
+[packages/form-core/src/FieldApi.ts:707](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L707)
***
@@ -416,7 +416,7 @@ Replaces a value at the specified index.
#### Defined in
-[packages/form-core/src/FieldApi.ts:694](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L694)
+[packages/form-core/src/FieldApi.ts:698](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L698)
***
@@ -440,7 +440,7 @@ Updates the field's errorMap
#### Defined in
-[packages/form-core/src/FieldApi.ts:1044](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L1044)
+[packages/form-core/src/FieldApi.ts:1050](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L1050)
***
@@ -464,7 +464,7 @@ Sets the field metadata.
#### Defined in
-[packages/form-core/src/FieldApi.ts:666](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L666)
+[packages/form-core/src/FieldApi.ts:670](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L670)
***
@@ -492,7 +492,7 @@ Sets the field value and run the `change` validator.
#### Defined in
-[packages/form-core/src/FieldApi.ts:650](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L650)
+[packages/form-core/src/FieldApi.ts:654](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L654)
***
@@ -527,7 +527,7 @@ Swaps the values at the specified indices.
#### Defined in
-[packages/form-core/src/FieldApi.ts:709](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L709)
+[packages/form-core/src/FieldApi.ts:713](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L713)
***
@@ -551,14 +551,14 @@ Updates the field instance with new options.
#### Defined in
-[packages/form-core/src/FieldApi.ts:606](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L606)
+[packages/form-core/src/FieldApi.ts:610](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L610)
***
### validate()
```ts
-validate(cause): ValidationError[] | Promise
+validate(cause): string[] | Promise
```
Validates the field value.
@@ -571,8 +571,8 @@ Validates the field value.
#### Returns
-[`ValidationError`](../type-aliases/validationerror.md)[] \| `Promise`\<[`ValidationError`](../type-aliases/validationerror.md)[]\>
+`string`[] \| `Promise`\<`string`[]\>
#### Defined in
-[packages/form-core/src/FieldApi.ts:989](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L989)
+[packages/form-core/src/FieldApi.ts:995](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L995)
diff --git a/docs/reference/classes/formapi.md b/docs/reference/classes/formapi.md
index d9b818804..58416928e 100644
--- a/docs/reference/classes/formapi.md
+++ b/docs/reference/classes/formapi.md
@@ -39,7 +39,7 @@ Constructs a new `FormApi` instance with the given form options.
#### Defined in
-[packages/form-core/src/FormApi.ts:389](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L389)
+[packages/form-core/src/FormApi.ts:401](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L401)
## Properties
@@ -51,7 +51,7 @@ baseStore: Store, (cb) => BaseFormState>;
#### Defined in
-[packages/form-core/src/FormApi.ts:368](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L368)
+[packages/form-core/src/FormApi.ts:380](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L380)
***
@@ -65,7 +65,7 @@ A record of field information for each field in the form.
#### Defined in
-[packages/form-core/src/FormApi.ts:374](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L374)
+[packages/form-core/src/FormApi.ts:386](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L386)
***
@@ -77,7 +77,7 @@ fieldMetaDerived: Derived, readonly any[]>;
#### Defined in
-[packages/form-core/src/FormApi.ts:370](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L370)
+[packages/form-core/src/FormApi.ts:382](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L382)
## Accessors
@@ -121,7 +121,7 @@ get state(): FormState
#### Defined in
-[packages/form-core/src/FormApi.ts:377](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L377)
+[packages/form-core/src/FormApi.ts:389](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L389)
## Methods
@@ -147,7 +147,7 @@ deleteField(field): void
#### Defined in
-[packages/form-core/src/FormApi.ts:1182](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L1182)
+[packages/form-core/src/FormApi.ts:1188](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L1188)
***
@@ -175,7 +175,7 @@ Gets the field info of the specified field.
#### Defined in
-[packages/form-core/src/FormApi.ts:1091](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L1091)
+[packages/form-core/src/FormApi.ts:1097](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L1097)
***
@@ -203,7 +203,7 @@ Gets the metadata of the specified field.
#### Defined in
-[packages/form-core/src/FormApi.ts:1082](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L1082)
+[packages/form-core/src/FormApi.ts:1088](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L1088)
***
@@ -231,7 +231,7 @@ Gets the value of the specified field.
#### Defined in
-[packages/form-core/src/FormApi.ts:1075](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L1075)
+[packages/form-core/src/FormApi.ts:1081](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L1081)
***
@@ -249,7 +249,7 @@ Handles the form submission, performs validation, and calls the appropriate onSu
#### Defined in
-[packages/form-core/src/FormApi.ts:1016](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L1016)
+[packages/form-core/src/FormApi.ts:1022](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L1022)
***
@@ -293,7 +293,7 @@ Inserts a value into an array field at the specified index, shifting the subsequ
#### Defined in
-[packages/form-core/src/FormApi.ts:1214](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L1214)
+[packages/form-core/src/FormApi.ts:1220](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L1220)
***
@@ -313,7 +313,7 @@ mount(): () => void
#### Defined in
-[packages/form-core/src/FormApi.ts:595](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L595)
+[packages/form-core/src/FormApi.ts:600](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L600)
***
@@ -357,7 +357,7 @@ Moves the value at the first specified index to the second specified index withi
#### Defined in
-[packages/form-core/src/FormApi.ts:1332](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L1332)
+[packages/form-core/src/FormApi.ts:1338](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L1338)
***
@@ -396,7 +396,7 @@ Pushes a value into an array field.
#### Defined in
-[packages/form-core/src/FormApi.ts:1196](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L1196)
+[packages/form-core/src/FormApi.ts:1202](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L1202)
***
@@ -435,7 +435,7 @@ Removes a value from an array field at the specified index.
#### Defined in
-[packages/form-core/src/FormApi.ts:1267](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L1267)
+[packages/form-core/src/FormApi.ts:1273](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L1273)
***
@@ -479,7 +479,7 @@ Replaces a value into an array field at the specified index.
#### Defined in
-[packages/form-core/src/FormApi.ts:1241](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L1241)
+[packages/form-core/src/FormApi.ts:1247](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L1247)
***
@@ -514,7 +514,7 @@ Optional options to control the reset behavior.
#### Defined in
-[packages/form-core/src/FormApi.ts:656](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L656)
+[packages/form-core/src/FormApi.ts:661](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L661)
***
@@ -540,7 +540,7 @@ resetFieldMeta(fieldMeta): Record
#### Defined in
-[packages/form-core/src/FormApi.ts:1128](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L1128)
+[packages/form-core/src/FormApi.ts:1134](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L1134)
***
@@ -564,7 +564,7 @@ Updates the form's errorMap
#### Defined in
-[packages/form-core/src/FormApi.ts:1356](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L1356)
+[packages/form-core/src/FormApi.ts:1362](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L1362)
***
@@ -596,7 +596,7 @@ Updates the metadata of the specified field.
#### Defined in
-[packages/form-core/src/FormApi.ts:1110](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L1110)
+[packages/form-core/src/FormApi.ts:1116](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L1116)
***
@@ -635,7 +635,7 @@ Sets the value of the specified field and optionally updates the touched state.
#### Defined in
-[packages/form-core/src/FormApi.ts:1152](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L1152)
+[packages/form-core/src/FormApi.ts:1158](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L1158)
***
@@ -679,7 +679,7 @@ Swaps the values at the specified indices within an array field.
#### Defined in
-[packages/form-core/src/FormApi.ts:1306](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L1306)
+[packages/form-core/src/FormApi.ts:1312](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L1312)
***
@@ -703,14 +703,14 @@ Updates the form options and form state.
#### Defined in
-[packages/form-core/src/FormApi.ts:612](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L612)
+[packages/form-core/src/FormApi.ts:617](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L617)
***
### validateAllFields()
```ts
-validateAllFields(cause): Promise
+validateAllFields(cause): Promise
```
Validates form and all fields in using the correct handlers for a given validation cause.
@@ -723,11 +723,11 @@ Validates form and all fields in using the correct handlers for a given validati
#### Returns
-`Promise`\<[`ValidationError`](../type-aliases/validationerror.md)[]\>
+`Promise`\<`string`[]\>
#### Defined in
-[packages/form-core/src/FormApi.ts:682](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L682)
+[packages/form-core/src/FormApi.ts:687](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L687)
***
@@ -737,7 +737,7 @@ Validates form and all fields in using the correct handlers for a given validati
validateArrayFieldsStartingFrom(
field,
index,
-cause): Promise
+cause): Promise
```
Validates the children of a specified array in the form starting from a given index until the end using the correct handlers for a given validation type.
@@ -762,18 +762,18 @@ Validates the children of a specified array in the form starting from a given in
#### Returns
-`Promise`\<[`ValidationError`](../type-aliases/validationerror.md)[]\>
+`Promise`\<`string`[]\>
#### Defined in
-[packages/form-core/src/FormApi.ts:710](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L710)
+[packages/form-core/src/FormApi.ts:715](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L715)
***
### validateField()
```ts
-validateField(field, cause): ValidationError[] | Promise
+validateField(field, cause): string[] | Promise
```
Validates a specified field in the form using the correct handlers for a given validation type.
@@ -794,8 +794,8 @@ Validates a specified field in the form using the correct handlers for a given v
#### Returns
-[`ValidationError`](../type-aliases/validationerror.md)[] \| `Promise`\<[`ValidationError`](../type-aliases/validationerror.md)[]\>
+`string`[] \| `Promise`\<`string`[]\>
#### Defined in
-[packages/form-core/src/FormApi.ts:749](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L749)
+[packages/form-core/src/FormApi.ts:754](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L754)
diff --git a/docs/reference/index.md b/docs/reference/index.md
index 6221bdca0..03c73cb29 100644
--- a/docs/reference/index.md
+++ b/docs/reference/index.md
@@ -33,12 +33,14 @@ title: "@tanstack/form-core"
- [FieldState](type-aliases/fieldstate.md)
- [FormState](type-aliases/formstate.md)
- [FormValidateFn](type-aliases/formvalidatefn.md)
+- [FormValidationError](type-aliases/formvalidationerror.md)
- [FormValidator](type-aliases/formvalidator.md)
- [StandardSchemaV1](type-aliases/standardschemav1.md)
- [Updater](type-aliases/updater.md)
- [UpdaterFn](type-aliases/updaterfn.md)
- [ValidationError](type-aliases/validationerror.md)
- [ValidationMeta](type-aliases/validationmeta.md)
+- [ValidationResult](type-aliases/validationresult.md)
- [ValidationSource](type-aliases/validationsource.md)
## Functions
diff --git a/docs/reference/interfaces/fieldapioptions.md b/docs/reference/interfaces/fieldapioptions.md
index 43a394b83..ce793f1d8 100644
--- a/docs/reference/interfaces/fieldapioptions.md
+++ b/docs/reference/interfaces/fieldapioptions.md
@@ -39,7 +39,7 @@ If `true`, always run async validation, even if there are errors emitted during
#### Defined in
-[packages/form-core/src/FieldApi.ts:311](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L311)
+[packages/form-core/src/FieldApi.ts:312](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L312)
***
@@ -57,7 +57,7 @@ The default time to debounce async validation if there is not a more specific de
#### Defined in
-[packages/form-core/src/FieldApi.ts:307](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L307)
+[packages/form-core/src/FieldApi.ts:308](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L308)
***
@@ -75,7 +75,7 @@ An optional object with default metadata for the field.
#### Defined in
-[packages/form-core/src/FieldApi.ts:329](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L329)
+[packages/form-core/src/FieldApi.ts:330](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L330)
***
@@ -93,7 +93,7 @@ An optional default value for the field.
#### Defined in
-[packages/form-core/src/FieldApi.ts:303](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L303)
+[packages/form-core/src/FieldApi.ts:304](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L304)
***
@@ -105,7 +105,7 @@ form: FormApi;
#### Defined in
-[packages/form-core/src/FieldApi.ts:362](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L362)
+[packages/form-core/src/FieldApi.ts:363](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L363)
***
@@ -123,7 +123,7 @@ A list of listeners which attach to the corresponding events
#### Defined in
-[packages/form-core/src/FieldApi.ts:333](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L333)
+[packages/form-core/src/FieldApi.ts:334](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L334)
***
@@ -141,7 +141,7 @@ The field name. The type will be `DeepKeys` to ensure your name is
#### Defined in
-[packages/form-core/src/FieldApi.ts:299](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L299)
+[packages/form-core/src/FieldApi.ts:300](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L300)
***
@@ -159,7 +159,7 @@ A validator provided by an extension, like `yupValidator` from `@tanstack/yup-fo
#### Defined in
-[packages/form-core/src/FieldApi.ts:315](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L315)
+[packages/form-core/src/FieldApi.ts:316](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L316)
***
@@ -177,4 +177,4 @@ A list of validators to pass to the field
#### Defined in
-[packages/form-core/src/FieldApi.ts:319](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L319)
+[packages/form-core/src/FieldApi.ts:320](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L320)
diff --git a/docs/reference/interfaces/fieldlisteners.md b/docs/reference/interfaces/fieldlisteners.md
index 937c14c6e..3c5499b43 100644
--- a/docs/reference/interfaces/fieldlisteners.md
+++ b/docs/reference/interfaces/fieldlisteners.md
@@ -27,7 +27,7 @@ optional onBlur: FieldListenerFn` to ensure your name is
#### Defined in
-[packages/form-core/src/FieldApi.ts:299](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L299)
+[packages/form-core/src/FieldApi.ts:300](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L300)
***
@@ -119,7 +119,7 @@ A validator provided by an extension, like `yupValidator` from `@tanstack/yup-fo
#### Defined in
-[packages/form-core/src/FieldApi.ts:315](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L315)
+[packages/form-core/src/FieldApi.ts:316](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L316)
***
@@ -133,4 +133,4 @@ A list of validators to pass to the field
#### Defined in
-[packages/form-core/src/FieldApi.ts:319](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L319)
+[packages/form-core/src/FieldApi.ts:320](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L320)
diff --git a/docs/reference/interfaces/fieldvalidators.md b/docs/reference/interfaces/fieldvalidators.md
index e3770d3f8..f4ac6352d 100644
--- a/docs/reference/interfaces/fieldvalidators.md
+++ b/docs/reference/interfaces/fieldvalidators.md
@@ -36,7 +36,7 @@ z.string().min(1) // if `zodAdapter` is passed
#### Defined in
-[packages/form-core/src/FieldApi.ts:182](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L182)
+[packages/form-core/src/FieldApi.ts:183](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L183)
***
@@ -57,7 +57,7 @@ z.string().refine(async (val) => val.length > 3, { message: 'Testing 123' }) //
#### Defined in
-[packages/form-core/src/FieldApi.ts:195](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L195)
+[packages/form-core/src/FieldApi.ts:196](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L196)
***
@@ -73,7 +73,7 @@ If set to a number larger than 0, will debounce the async validation event by th
#### Defined in
-[packages/form-core/src/FieldApi.ts:208](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L208)
+[packages/form-core/src/FieldApi.ts:209](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L209)
***
@@ -87,7 +87,7 @@ An optional list of field names that should trigger this field's `onBlur` and `o
#### Defined in
-[packages/form-core/src/FieldApi.ts:212](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L212)
+[packages/form-core/src/FieldApi.ts:213](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L213)
***
@@ -108,7 +108,7 @@ z.string().min(1) // if `zodAdapter` is passed
#### Defined in
-[packages/form-core/src/FieldApi.ts:146](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L146)
+[packages/form-core/src/FieldApi.ts:147](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L147)
***
@@ -129,7 +129,7 @@ z.string().refine(async (val) => val.length > 3, { message: 'Testing 123' }) //
#### Defined in
-[packages/form-core/src/FieldApi.ts:159](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L159)
+[packages/form-core/src/FieldApi.ts:160](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L160)
***
@@ -145,7 +145,7 @@ If set to a number larger than 0, will debounce the async validation event by th
#### Defined in
-[packages/form-core/src/FieldApi.ts:171](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L171)
+[packages/form-core/src/FieldApi.ts:172](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L172)
***
@@ -159,7 +159,7 @@ An optional list of field names that should trigger this field's `onChange` and
#### Defined in
-[packages/form-core/src/FieldApi.ts:175](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L175)
+[packages/form-core/src/FieldApi.ts:176](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L176)
***
@@ -173,7 +173,7 @@ An optional function that takes a param of `formApi` which is a generic type of
#### Defined in
-[packages/form-core/src/FieldApi.ts:133](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L133)
+[packages/form-core/src/FieldApi.ts:134](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L134)
***
@@ -194,7 +194,7 @@ z.string().min(1) // if `zodAdapter` is passed
#### Defined in
-[packages/form-core/src/FieldApi.ts:219](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L219)
+[packages/form-core/src/FieldApi.ts:220](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L220)
***
@@ -215,4 +215,4 @@ z.string().refine(async (val) => val.length > 3, { message: 'Testing 123' }) //
#### Defined in
-[packages/form-core/src/FieldApi.ts:232](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L232)
+[packages/form-core/src/FieldApi.ts:233](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L233)
diff --git a/docs/reference/interfaces/formoptions.md b/docs/reference/interfaces/formoptions.md
index af7cc1a83..12bccf4c5 100644
--- a/docs/reference/interfaces/formoptions.md
+++ b/docs/reference/interfaces/formoptions.md
@@ -25,7 +25,7 @@ If true, always run async validation, even when sync validation has produced an
#### Defined in
-[packages/form-core/src/FormApi.ts:163](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L163)
+[packages/form-core/src/FormApi.ts:169](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L169)
***
@@ -39,7 +39,7 @@ Optional time in milliseconds if you want to introduce a delay before firing off
#### Defined in
-[packages/form-core/src/FormApi.ts:167](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L167)
+[packages/form-core/src/FormApi.ts:173](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L173)
***
@@ -53,7 +53,7 @@ The default state for the form.
#### Defined in
-[packages/form-core/src/FormApi.ts:159](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L159)
+[packages/form-core/src/FormApi.ts:165](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L165)
***
@@ -67,7 +67,7 @@ Set initial values for your form.
#### Defined in
-[packages/form-core/src/FormApi.ts:155](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L155)
+[packages/form-core/src/FormApi.ts:161](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L161)
***
@@ -97,7 +97,7 @@ A function to be called when the form is submitted, what should happen once the
#### Defined in
-[packages/form-core/src/FormApi.ts:179](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L179)
+[packages/form-core/src/FormApi.ts:185](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L185)
***
@@ -127,7 +127,7 @@ Specify an action for scenarios where the user tries to submit an invalid form.
#### Defined in
-[packages/form-core/src/FormApi.ts:186](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L186)
+[packages/form-core/src/FormApi.ts:192](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L192)
***
@@ -139,7 +139,7 @@ optional transform: FormTransform;
#### Defined in
-[packages/form-core/src/FormApi.ts:190](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L190)
+[packages/form-core/src/FormApi.ts:196](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L196)
***
@@ -153,7 +153,7 @@ A validator adapter to support usage of extra validation types (IE: Zod, Yup, or
#### Defined in
-[packages/form-core/src/FormApi.ts:171](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L171)
+[packages/form-core/src/FormApi.ts:177](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L177)
***
@@ -167,4 +167,4 @@ A list of validators to pass to the form
#### Defined in
-[packages/form-core/src/FormApi.ts:175](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L175)
+[packages/form-core/src/FormApi.ts:181](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L181)
diff --git a/docs/reference/interfaces/formvalidators.md b/docs/reference/interfaces/formvalidators.md
index bd0ad8870..97c3fc40c 100644
--- a/docs/reference/interfaces/formvalidators.md
+++ b/docs/reference/interfaces/formvalidators.md
@@ -23,7 +23,7 @@ Optional function that validates the form data when a field loses focus, returns
#### Defined in
-[packages/form-core/src/FormApi.ts:119](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L119)
+[packages/form-core/src/FormApi.ts:125](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L125)
***
@@ -37,7 +37,7 @@ Optional onBlur asynchronous validation method for when a field loses focus retu
#### Defined in
-[packages/form-core/src/FormApi.ts:123](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L123)
+[packages/form-core/src/FormApi.ts:129](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L129)
***
@@ -51,7 +51,7 @@ The default time in milliseconds that if set to a number larger than 0, will deb
#### Defined in
-[packages/form-core/src/FormApi.ts:127](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L127)
+[packages/form-core/src/FormApi.ts:133](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L133)
***
@@ -65,7 +65,7 @@ Optional function that checks the validity of your data whenever a value changes
#### Defined in
-[packages/form-core/src/FormApi.ts:107](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L107)
+[packages/form-core/src/FormApi.ts:113](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L113)
***
@@ -79,7 +79,7 @@ Optional onChange asynchronous counterpart to onChange. Useful for more complex
#### Defined in
-[packages/form-core/src/FormApi.ts:111](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L111)
+[packages/form-core/src/FormApi.ts:117](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L117)
***
@@ -93,7 +93,7 @@ The default time in milliseconds that if set to a number larger than 0, will deb
#### Defined in
-[packages/form-core/src/FormApi.ts:115](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L115)
+[packages/form-core/src/FormApi.ts:121](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L121)
***
@@ -107,7 +107,7 @@ Optional function that fires as soon as the component mounts.
#### Defined in
-[packages/form-core/src/FormApi.ts:103](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L103)
+[packages/form-core/src/FormApi.ts:109](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L109)
***
@@ -119,7 +119,7 @@ optional onSubmit: FormValidateOrFn;
#### Defined in
-[packages/form-core/src/FormApi.ts:128](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L128)
+[packages/form-core/src/FormApi.ts:134](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L134)
***
@@ -131,4 +131,4 @@ optional onSubmitAsync: FormAsyncValidateOrFn;
#### Defined in
-[packages/form-core/src/FormApi.ts:129](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L129)
+[packages/form-core/src/FormApi.ts:135](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L135)
diff --git a/docs/reference/type-aliases/baseformstate.md b/docs/reference/type-aliases/baseformstate.md
index 277b5c0e7..116dfd1d8 100644
--- a/docs/reference/type-aliases/baseformstate.md
+++ b/docs/reference/type-aliases/baseformstate.md
@@ -91,4 +91,4 @@ The current values of the form fields.
## Defined in
-[packages/form-core/src/FormApi.ts:228](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L228)
+[packages/form-core/src/FormApi.ts:234](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L234)
diff --git a/docs/reference/type-aliases/derivedformstate.md b/docs/reference/type-aliases/derivedformstate.md
index 59a7579b7..562ea344f 100644
--- a/docs/reference/type-aliases/derivedformstate.md
+++ b/docs/reference/type-aliases/derivedformstate.md
@@ -113,4 +113,4 @@ A boolean indicating if the form and all its fields are valid.
## Defined in
-[packages/form-core/src/FormApi.ts:272](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L272)
+[packages/form-core/src/FormApi.ts:278](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L278)
diff --git a/docs/reference/type-aliases/fieldinfo.md b/docs/reference/type-aliases/fieldinfo.md
index 55b60f198..1ed1b4a8c 100644
--- a/docs/reference/type-aliases/fieldinfo.md
+++ b/docs/reference/type-aliases/fieldinfo.md
@@ -37,4 +37,4 @@ A record of field validation internal handling.
## Defined in
-[packages/form-core/src/FormApi.ts:206](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L206)
+[packages/form-core/src/FormApi.ts:212](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L212)
diff --git a/docs/reference/type-aliases/fieldmeta.md b/docs/reference/type-aliases/fieldmeta.md
index 2984539a8..06754c2c3 100644
--- a/docs/reference/type-aliases/fieldmeta.md
+++ b/docs/reference/type-aliases/fieldmeta.md
@@ -13,4 +13,4 @@ An object type representing the metadata of a field in a form.
## Defined in
-[packages/form-core/src/FieldApi.ts:402](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L402)
+[packages/form-core/src/FieldApi.ts:403](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L403)
diff --git a/docs/reference/type-aliases/fieldmetabase.md b/docs/reference/type-aliases/fieldmetabase.md
index 763e9fca8..10dd395ba 100644
--- a/docs/reference/type-aliases/fieldmetabase.md
+++ b/docs/reference/type-aliases/fieldmetabase.md
@@ -53,4 +53,4 @@ A flag indicating whether the field is currently being validated.
## Defined in
-[packages/form-core/src/FieldApi.ts:365](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L365)
+[packages/form-core/src/FieldApi.ts:366](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L366)
diff --git a/docs/reference/type-aliases/fieldmetaderived.md b/docs/reference/type-aliases/fieldmetaderived.md
index 54edb3bdb..40a0d5df3 100644
--- a/docs/reference/type-aliases/fieldmetaderived.md
+++ b/docs/reference/type-aliases/fieldmetaderived.md
@@ -29,4 +29,4 @@ A flag that is `true` if the field's value has not been modified by the user. Op
## Defined in
-[packages/form-core/src/FieldApi.ts:388](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L388)
+[packages/form-core/src/FieldApi.ts:389](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L389)
diff --git a/docs/reference/type-aliases/fieldserrormapfromvalidator.md b/docs/reference/type-aliases/fieldserrormapfromvalidator.md
index 874056b36..d734323f1 100644
--- a/docs/reference/type-aliases/fieldserrormapfromvalidator.md
+++ b/docs/reference/type-aliases/fieldserrormapfromvalidator.md
@@ -15,4 +15,4 @@ type FieldsErrorMapFromValidator: Partial,
## Defined in
-[packages/form-core/src/FormApi.ts:31](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L31)
+[packages/form-core/src/FormApi.ts:34](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L34)
diff --git a/docs/reference/type-aliases/fieldstate.md b/docs/reference/type-aliases/fieldstate.md
index 3054b5c63..5bcb867e1 100644
--- a/docs/reference/type-aliases/fieldstate.md
+++ b/docs/reference/type-aliases/fieldstate.md
@@ -35,4 +35,4 @@ The current value of the field.
## Defined in
-[packages/form-core/src/FieldApi.ts:407](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L407)
+[packages/form-core/src/FieldApi.ts:408](https://github.com/TanStack/form/blob/main/packages/form-core/src/FieldApi.ts#L408)
diff --git a/docs/reference/type-aliases/formstate.md b/docs/reference/type-aliases/formstate.md
index 69f519257..a84f81644 100644
--- a/docs/reference/type-aliases/formstate.md
+++ b/docs/reference/type-aliases/formstate.md
@@ -15,4 +15,4 @@ type FormState: BaseFormState & DerivedFormState
```ts
-type FormValidateFn: (props) => FormValidationError;
+type FormValidateFn: (props) => ValidationResult | FormValidationResult;
```
## Type Parameters
@@ -29,8 +29,8 @@ type FormValidateFn: (props) => FormValidationError
+[`ValidationResult`](validationresult.md) \| `FormValidationResult`\<`TFormData`\>
## Defined in
-[packages/form-core/src/FormApi.ts:35](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L35)
+[packages/form-core/src/FormApi.ts:38](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L38)
diff --git a/docs/reference/type-aliases/formvalidationerror.md b/docs/reference/type-aliases/formvalidationerror.md
new file mode 100644
index 000000000..eddf3c70a
--- /dev/null
+++ b/docs/reference/type-aliases/formvalidationerror.md
@@ -0,0 +1,32 @@
+---
+id: FormValidationError
+title: FormValidationError
+---
+
+# Type Alias: FormValidationError\
+
+```ts
+type FormValidationError: object;
+```
+
+## Type Parameters
+
+• **TFormData**
+
+## Type declaration
+
+### fieldErrors?
+
+```ts
+optional fieldErrors: Partial, ValidationError[]>>;
+```
+
+### formError
+
+```ts
+formError: ValidationError[] | undefined;
+```
+
+## Defined in
+
+[packages/form-core/src/types.ts:62](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L62)
diff --git a/docs/reference/type-aliases/formvalidator.md b/docs/reference/type-aliases/formvalidator.md
index e2cde55da..d9a2c1966 100644
--- a/docs/reference/type-aliases/formvalidator.md
+++ b/docs/reference/type-aliases/formvalidator.md
@@ -35,7 +35,7 @@ type FormValidator: object;
#### Returns
-[`ValidationError`](validationerror.md)
+`string`
### validateAsync()
@@ -53,8 +53,8 @@ type FormValidator: object;
#### Returns
-`Promise`\<`FormValidationError`\<`TFormData`\>\>
+`Promise`\<[`ValidationResult`](validationresult.md) \| `FormValidationResult`\<`TFormData`\>\>
## Defined in
-[packages/form-core/src/FormApi.ts:68](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L68)
+[packages/form-core/src/FormApi.ts:74](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L74)
diff --git a/docs/reference/type-aliases/validationerror.md b/docs/reference/type-aliases/validationerror.md
index a36d1d03f..4b12efb5d 100644
--- a/docs/reference/type-aliases/validationerror.md
+++ b/docs/reference/type-aliases/validationerror.md
@@ -6,7 +6,7 @@ title: ValidationError
# Type Alias: ValidationError
```ts
-type ValidationError: undefined | false | null | string;
+type ValidationError: string;
```
## Defined in
diff --git a/docs/reference/type-aliases/validationmeta.md b/docs/reference/type-aliases/validationmeta.md
index 31eb09f9f..a18fb0572 100644
--- a/docs/reference/type-aliases/validationmeta.md
+++ b/docs/reference/type-aliases/validationmeta.md
@@ -23,4 +23,4 @@ An abort controller stored in memory to cancel previous async validation attempt
## Defined in
-[packages/form-core/src/FormApi.ts:196](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L196)
+[packages/form-core/src/FormApi.ts:202](https://github.com/TanStack/form/blob/main/packages/form-core/src/FormApi.ts#L202)
diff --git a/docs/reference/type-aliases/validationresult.md b/docs/reference/type-aliases/validationresult.md
new file mode 100644
index 000000000..a98a26cad
--- /dev/null
+++ b/docs/reference/type-aliases/validationresult.md
@@ -0,0 +1,19 @@
+---
+id: ValidationResult
+title: ValidationResult
+---
+
+# Type Alias: ValidationResult
+
+```ts
+type ValidationResult:
+ | undefined
+ | false
+ | null
+ | ValidationError
+ | ValidationError[];
+```
+
+## Defined in
+
+[packages/form-core/src/types.ts:5](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L5)
diff --git a/docs/reference/type-aliases/validationsource.md b/docs/reference/type-aliases/validationsource.md
index af0b0a62a..e35d31bc0 100644
--- a/docs/reference/type-aliases/validationsource.md
+++ b/docs/reference/type-aliases/validationsource.md
@@ -11,4 +11,4 @@ type ValidationSource: "form" | "field";
## Defined in
-[packages/form-core/src/types.ts:5](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L5)
+[packages/form-core/src/types.ts:12](https://github.com/TanStack/form/blob/main/packages/form-core/src/types.ts#L12)
diff --git a/examples/react/field-errors-from-form-validators/src/index.tsx b/examples/react/field-errors-from-form-validators/src/index.tsx
index 462661849..6284c3330 100644
--- a/examples/react/field-errors-from-form-validators/src/index.tsx
+++ b/examples/react/field-errors-from-form-validators/src/index.tsx
@@ -109,11 +109,10 @@ export default function App() {
[state.errorMap]}
children={([errorMap]) =>
- errorMap.onSubmit ? (
+ errorMap.onSubmit?.length ? (
- There was an error on the form:{' '}
- {errorMap.onSubmit?.toString()}
+ There was an error on the form: {errorMap.onSubmit.join(', ')}
) : null
diff --git a/packages/form-core/src/FieldApi.ts b/packages/form-core/src/FieldApi.ts
index 810869b7f..ffeaf7c98 100644
--- a/packages/form-core/src/FieldApi.ts
+++ b/packages/form-core/src/FieldApi.ts
@@ -11,6 +11,7 @@ import type {
ValidationCause,
ValidationError,
ValidationErrorMap,
+ ValidationResult,
ValidationSource,
Validator,
} from './types'
@@ -33,7 +34,7 @@ export type FieldValidateFn<
> = (props: {
value: TData
fieldApi: FieldApi
-}) => ValidationError
+}) => ValidationResult
/**
* @private
@@ -71,7 +72,7 @@ export type FieldValidateAsyncFn<
value: TData
fieldApi: FieldApi
signal: AbortSignal
-}) => ValidationError | Promise
+}) => ValidationResult | Promise
/**
* @private
@@ -534,7 +535,7 @@ export class FieldApi<
value: TValue
type: TType
// When `api` is 'field', the return type cannot be `FormValidationError`
- }): TType extends 'validate' ? ValidationError : Promise {
+ }): TType extends 'validate' ? ValidationResult : Promise {
const adapters = [
this.form.options.validatorAdapter,
this.options.validatorAdapter,
@@ -586,8 +587,11 @@ export class FieldApi<
if (error) {
this.setMeta((prev) => ({
...prev,
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
- errorMap: { ...prev?.errorMap, onMount: error },
+ errorMap: {
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
+ ...prev?.errorMap,
+ onMount: Array.isArray(error) ? error : [error],
+ },
}))
}
}
@@ -782,7 +786,7 @@ export class FieldApi<
form's validator.
*/
validateObj.validate
- ? normalizeError(
+ ? normalizeFieldError(
field.runValidator({
validate: validateObj.validate,
value: {
@@ -883,13 +887,13 @@ export class FieldApi<
* We have to use a for loop and generate our promises this way, otherwise it won't be sync
* when there are no validators needed to be run
*/
- const validatesPromises: Promise[] = []
- const linkedPromises: Promise[] = []
+ const validatesPromises: Promise[] = []
+ const linkedPromises: Promise[] = []
const validateFieldAsyncFn = (
field: FieldApi,
validateObj: AsyncValidator,
- promises: Promise[],
+ promises: Promise[],
) => {
const errorMapKey = getErrorMapKey(validateObj.cause)
const fieldValidatorMeta = field.getInfo().validationMetaMap[errorMapKey]
@@ -902,8 +906,8 @@ export class FieldApi<
}
promises.push(
- new Promise(async (resolve) => {
- let rawError!: ValidationError | undefined
+ new Promise(async (resolve) => {
+ let rawError!: ValidationResult
try {
rawError = await new Promise((rawResolve, rawReject) => {
if (this.timeoutIds[validateObj.cause]) {
@@ -931,10 +935,10 @@ export class FieldApi<
}, validateObj.debounceMs)
})
} catch (e: unknown) {
- rawError = e as ValidationError
+ rawError = e as ValidationError[]
}
if (controller.signal.aborted) return resolve(undefined)
- const error = normalizeError(rawError)
+ const error = normalizeFieldError(rawError)
const fieldErrorFromForm =
asyncFormValidationResults[this.name]?.[errorMapKey]
const fieldError = error || fieldErrorFromForm
@@ -970,7 +974,9 @@ export class FieldApi<
let results: ValidationError[] = []
if (validatesPromises.length || linkedPromises.length) {
- results = await Promise.all(validatesPromises)
+ results = (await Promise.all(validatesPromises))
+ .filter((errors) => errors?.length)
+ .flat() as ValidationError[]
await Promise.all(linkedPromises)
}
@@ -1052,16 +1058,25 @@ export class FieldApi<
}
}
-function normalizeError(rawError?: ValidationError) {
- if (rawError) {
- if (typeof rawError !== 'string') {
- return 'Invalid Form Values'
- }
+/**
+ * @private
+ */
+export function normalizeFieldError(
+ rawError?: ValidationResult,
+): ValidationError[] | undefined {
+ if (!rawError) {
+ return undefined
+ }
+ if (Array.isArray(rawError)) {
return rawError
}
- return undefined
+ if (typeof rawError !== 'string') {
+ return ['Invalid Field Values']
+ }
+
+ return [rawError]
}
function getErrorMapKey(cause: ValidationCause) {
diff --git a/packages/form-core/src/FormApi.ts b/packages/form-core/src/FormApi.ts
index 93fec3a05..e8ac2de2d 100644
--- a/packages/form-core/src/FormApi.ts
+++ b/packages/form-core/src/FormApi.ts
@@ -12,16 +12,19 @@ import {
isStandardSchemaValidator,
standardSchemaValidator,
} from './standardSchemaValidator'
-import type { StandardSchemaV1 } from './standardSchemaValidator'
+import { normalizeFieldError } from './FieldApi'
import type { FieldApi, FieldMeta, FieldMetaBase } from './FieldApi'
+import type { StandardSchemaV1 } from './standardSchemaValidator'
import type {
FormValidationError,
FormValidationErrorMap,
+ FormValidationResult,
UpdateMetaOptions,
ValidationCause,
ValidationError,
ValidationErrorMap,
ValidationErrorMapKeys,
+ ValidationResult,
ValidationSource,
Validator,
} from './types'
@@ -38,7 +41,7 @@ export type FormValidateFn<
> = (props: {
value: TFormData
formApi: FormApi
-}) => FormValidationError
+}) => ValidationResult | FormValidationResult
/**
* @private
@@ -63,19 +66,22 @@ export type FormValidateAsyncFn<
value: TFormData
formApi: FormApi
signal: AbortSignal
-}) => FormValidationError | Promise>
+}) =>
+ | ValidationResult
+ | FormValidationResult
+ | Promise>
export type FormValidator = {
validate(options: { value: TType }, fn: TFn): ValidationError
validateAsync(
options: { value: TType },
fn: TFn,
- ): Promise>
+ ): Promise>
}
type ValidationPromiseResult =
| {
- fieldErrors: Partial, ValidationError>>
+ fieldErrors: Partial, ValidationError[]>>
errorMapKey: ValidationErrorMapKeys
}
| undefined
@@ -344,10 +350,16 @@ function getDefaultFormState(
}
}
+const isFormValidationResult = (
+ error: unknown,
+): error is FormValidationResult => {
+ return typeof error === 'object' && !Array.isArray(error)
+}
+
const isFormValidationError = (
error: unknown,
): error is FormValidationError => {
- return typeof error === 'object'
+ return typeof error === 'object' && !Array.isArray(error)
}
/**
@@ -420,9 +432,9 @@ export class FormApi<
prevVal?.[fieldName as never as keyof typeof prevVal]?.errors
if (!prevBaseVal || currBaseVal.errorMap !== prevBaseVal.errorMap) {
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
- fieldErrors = Object.values(currBaseVal.errorMap ?? {}).filter(
- (val: unknown) => val !== undefined,
- )
+ fieldErrors = Object.values(currBaseVal.errorMap ?? {})
+ .filter((val: unknown) => val !== undefined)
+ .flat()
}
// As a primitive, we don't need to aggressively persist the same referencial value for performance reasons
@@ -467,7 +479,7 @@ export class FormApi<
const shouldInvalidateOnMount =
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
- isTouched && currBaseStore?.errorMap?.onMount
+ isTouched && !!currBaseStore?.errorMap?.onMount?.length
const isDirty = fieldMetaValues.some((field) => field?.isDirty)
const isPristine = !isDirty
@@ -481,27 +493,28 @@ export class FormApi<
const isValidating = !!isFieldsValidating
+ const errorMap = currBaseStore.errorMap
+ if (shouldInvalidateOnMount) {
+ delete errorMap.onMount
+ }
+
// As `errors` is not a primitive, we need to aggressively persist the same referencial value for performance reasons
let errors = prevVal?.errors ?? []
if (
!prevBaseStore ||
- currBaseStore.errorMap !== prevBaseStore.errorMap
+ errorMap !== prevBaseStore.errorMap ||
+ shouldInvalidateOnMount
) {
- errors = Object.values(currBaseStore.errorMap).reduce(
- (prev, curr) => {
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
- if (curr === undefined) return prev
- if (typeof curr === 'string') {
- prev.push(curr)
- return prev
- } else if (curr && isFormValidationError(curr)) {
- prev.push(curr.form)
- return prev
- }
- return prev
- },
- [] as ValidationError[],
- )
+ errors = Object.values(errorMap).reduce((prev, curr) => {
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
+ if (curr === undefined) return prev
+
+ if (isFormValidationError(curr)) {
+ return curr.formError ? prev.concat(curr.formError) : prev
+ }
+
+ return prev.concat(curr)
+ }, [])
}
const isFormValid = errors.length === 0
@@ -512,14 +525,6 @@ export class FormApi<
!hasOnMountError) ||
(!isValidating && !currBaseStore.isSubmitting && isValid)
- let errorMap = currBaseStore.errorMap
- if (shouldInvalidateOnMount) {
- errors = errors.filter(
- (err) => err !== currBaseStore.errorMap.onMount,
- )
- errorMap = Object.assign(errorMap, { onMount: undefined })
- }
-
let state = {
...currBaseStore,
errorMap,
@@ -573,7 +578,7 @@ export class FormApi<
: FormAsyncValidateOrFn
value: TValue
type: TType
- }): ReturnType>[TType]> {
+ }): ReturnType>[TType]> {
const adapter = this.options.validatorAdapter
if (
adapter &&
@@ -792,7 +797,8 @@ export class FormApi<
type: 'validate',
})
- const { formError, fieldErrors } = normalizeError(rawError)
+ const { formError, fieldErrors } =
+ normalizeFormError(rawError)
const errorMapKey = getErrorMapKey(validateObj.cause)
@@ -876,7 +882,7 @@ export class FormApi<
const promises: Promise>[] = []
let fieldErrors:
- | Partial, ValidationError>>
+ | Partial, ValidationError[]>>
| undefined
for (const validateObj of validates) {
@@ -894,26 +900,26 @@ export class FormApi<
promises.push(
new Promise>(async (resolve) => {
let rawError!:
- | ValidationError
- | FormValidationError
+ | ValidationResult
+ | FormValidationResult
| undefined
+
try {
rawError = await new Promise((rawResolve, rawReject) => {
setTimeout(async () => {
if (controller.signal.aborted) return rawResolve(undefined)
try {
- rawResolve(
- await this.runValidator({
- validate: validateObj.validate!,
- value: {
- value: this.state.values,
- formApi: this,
- validationSource: 'form',
- signal: controller.signal,
- },
- type: 'validateAsync',
- }),
- )
+ const err = await this.runValidator({
+ validate: validateObj.validate!,
+ value: {
+ value: this.state.values,
+ formApi: this,
+ validationSource: 'form',
+ signal: controller.signal,
+ },
+ type: 'validateAsync',
+ })
+ rawResolve(err)
} catch (e) {
rawReject(e)
}
@@ -923,7 +929,7 @@ export class FormApi<
rawError = e as ValidationError
}
const { formError, fieldErrors: fieldErrorsFromNormalizeError } =
- normalizeError(rawError)
+ normalizeFormError(rawError)
if (fieldErrorsFromNormalizeError) {
fieldErrors = fieldErrors
@@ -1364,25 +1370,40 @@ export class FormApi<
}
}
-function normalizeError(rawError?: FormValidationError): {
- formError: ValidationError
- fieldErrors?: Partial, ValidationError>>
-} {
- if (rawError) {
- if (typeof rawError === 'object') {
- const formError = normalizeError(rawError.form).formError
- const fieldErrors = rawError.fields
- return { formError, fieldErrors } as never
- }
+/**
+ * @private
+ */
+export function normalizeFormError(
+ rawError?: ValidationResult | FormValidationResult,
+): FormValidationError {
+ if (!rawError) {
+ return { formError: undefined }
+ }
- if (typeof rawError !== 'string') {
- return { formError: 'Invalid Form Values' }
+ if (isFormValidationResult(rawError)) {
+ const fieldErrors = Object.entries(rawError.fields).reduce(
+ (acc, [field, error]) => {
+ acc[field as DeepKeys] = normalizeFieldError(error)
+ return acc
+ },
+ {} as Partial, ValidationError[]>>,
+ )
+
+ return {
+ formError: normalizeFormError(rawError.form).formError,
+ fieldErrors,
}
+ }
+ if (Array.isArray(rawError)) {
return { formError: rawError }
}
- return { formError: undefined }
+ if (typeof rawError !== 'string') {
+ return { formError: ['Invalid Form Values'] }
+ }
+
+ return { formError: [rawError] }
}
function getErrorMapKey(cause: ValidationCause) {
diff --git a/packages/form-core/src/standardSchemaValidator.ts b/packages/form-core/src/standardSchemaValidator.ts
index 356e7a579..9b0da8936 100644
--- a/packages/form-core/src/standardSchemaValidator.ts
+++ b/packages/form-core/src/standardSchemaValidator.ts
@@ -28,7 +28,7 @@ function prefixSchemaToErrors(
schema.set(path, (schema.get(path) ?? []).concat(issue))
}
- const transformedSchema = {} as Record
+ const transformedSchema = {} as Record
schema.forEach((value, key) => {
transformedSchema[key] = transformErrors(value)
@@ -50,7 +50,7 @@ export const standardSchemaValidator =
const transformFieldErrors =
params.transformErrors ??
((issues: StandardSchemaV1Issue[]) =>
- issues.map((issue) => issue.message).join(', '))
+ issues.map((issue) => issue.message))
const getTransformStrategy = (validationSource: 'form' | 'field') =>
validationSource === 'form'
diff --git a/packages/form-core/src/types.ts b/packages/form-core/src/types.ts
index cff62ae7c..a91a3108d 100644
--- a/packages/form-core/src/types.ts
+++ b/packages/form-core/src/types.ts
@@ -1,6 +1,13 @@
import type { DeepKeys } from './util-types'
-export type ValidationError = undefined | false | null | string
+export type ValidationError = string
+
+export type ValidationResult =
+ | undefined
+ | false
+ | null
+ | ValidationError
+ | ValidationError[]
export type ValidationSource = 'form' | 'field'
@@ -12,11 +19,11 @@ export type Validator = () => {
validate(
options: { value: Type; validationSource: ValidationSource },
fn: Fn,
- ): ValidationError | FormValidationError
+ ): ValidationResult | FormValidationResult
validateAsync(
options: { value: Type; validationSource: ValidationSource },
fn: Fn,
- ): Promise>
+ ): Promise>
}
/**
@@ -24,7 +31,7 @@ export type Validator = () => {
* @private
*/
export type ValidatorAdapterParams = {
- transformErrors?: (errors: TError[]) => ValidationError
+ transformErrors?: (errors: TError[]) => ValidationError[]
}
/**
@@ -42,14 +49,19 @@ export type ValidationErrorMapKeys = `on${Capitalize}`
* @private
*/
export type ValidationErrorMap = {
- [K in ValidationErrorMapKeys]?: ValidationError
+ [K in ValidationErrorMapKeys]?: ValidationError[]
}
/**
* @private
*/
export type FormValidationErrorMap = {
- [K in ValidationErrorMapKeys]?: ValidationError | FormValidationError
+ [K in ValidationErrorMapKeys]?: ValidationError[]
+}
+
+export type FormValidationError = {
+ formError: ValidationError[] | undefined
+ fieldErrors?: Partial, ValidationError[]>>
}
/**
@@ -65,12 +77,10 @@ export type FormValidationErrorMap = {
* }
* ````
*/
-export type FormValidationError =
- | ValidationError
- | {
- form?: ValidationError
- fields: Partial, ValidationError>>
- }
+export type FormValidationResult = {
+ form?: ValidationResult
+ fields: Partial, ValidationResult>>
+}
/**
* @private
diff --git a/packages/form-core/tests/FieldApi.spec.ts b/packages/form-core/tests/FieldApi.spec.ts
index 157bda920..011fa3c65 100644
--- a/packages/form-core/tests/FieldApi.spec.ts
+++ b/packages/form-core/tests/FieldApi.spec.ts
@@ -212,6 +212,9 @@ describe('field api', () => {
expect(field.getMeta().errors).toStrictEqual([
'At least 3 names are required',
])
+ expect(field.getMeta().errorMap.onChange).toStrictEqual([
+ 'At least 3 names are required',
+ ])
})
it('should insert a value into an array value correctly', () => {
@@ -416,9 +419,9 @@ describe('field api', () => {
await form.handleSubmit()
- expect(subField1.state.meta.errorMap.onChange).toStrictEqual('Required')
+ expect(subField1.state.meta.errorMap.onChange).toStrictEqual(['Required'])
expect(subField2.state.meta.errorMap.onChange).toStrictEqual(undefined)
- expect(subField3.state.meta.errorMap.onChange).toStrictEqual('Required')
+ expect(subField3.state.meta.errorMap.onChange).toStrictEqual(['Required'])
expect(subField4.state.meta.errorMap.onChange).toStrictEqual(undefined)
await field.removeValue(0 /* subField1 */)
@@ -426,7 +429,7 @@ describe('field api', () => {
expect(subField1.state.value).toBe('hello')
expect(subField1.state.meta.errorMap.onChange).toStrictEqual(undefined)
expect(subField2.state.value).toBe('')
- expect(subField2.state.meta.errorMap.onChange).toStrictEqual('Required')
+ expect(subField2.state.meta.errorMap.onChange).toStrictEqual(['Required'])
expect(subField3.state.value).toBe('world')
expect(subField3.state.meta.errorMap.onChange).toStrictEqual(undefined)
expect(form.getFieldInfo('people[0].name').instance?.state.value).toBe(
@@ -468,7 +471,7 @@ describe('field api', () => {
await form.handleSubmit()
- expect(subField1.state.meta.errorMap.onChange).toStrictEqual('Required')
+ expect(subField1.state.meta.errorMap.onChange).toStrictEqual(['Required'])
await field.removeValue(0 /* subField1 */)
@@ -660,7 +663,7 @@ describe('field api', () => {
field.setValue('other')
expect(field.getMeta().errors).toContain('Please enter a different value')
expect(field.getMeta().errorMap).toMatchObject({
- onChange: 'Please enter a different value',
+ onChange: ['Please enter a different value'],
})
field.setValue('nothing')
expect(field.getMeta().errors.length).toBe(0)
@@ -696,7 +699,7 @@ describe('field api', () => {
await vi.runAllTimersAsync()
expect(field.getMeta().errors).toContain('Please enter a different value')
expect(field.getMeta().errorMap).toMatchObject({
- onChange: 'Please enter a different value',
+ onChange: ['Please enter a different value'],
})
})
@@ -737,7 +740,7 @@ describe('field api', () => {
expect(sleepMock).toHaveBeenCalledTimes(1)
expect(field.getMeta().errors).toContain('Please enter a different value')
expect(field.getMeta().errorMap).toMatchObject({
- onChange: 'Please enter a different value',
+ onChange: ['Please enter a different value'],
})
})
@@ -778,7 +781,7 @@ describe('field api', () => {
expect(sleepMock).toHaveBeenCalledTimes(1)
expect(field.getMeta().errors).toContain('Please enter a different value')
expect(field.getMeta().errorMap).toMatchObject({
- onChange: 'Please enter a different value',
+ onChange: ['Please enter a different value'],
})
})
@@ -926,7 +929,7 @@ describe('field api', () => {
field.validate('blur')
expect(field.getMeta().errors).toContain('Please enter a different value')
expect(field.getMeta().errorMap).toMatchObject({
- onBlur: 'Please enter a different value',
+ onBlur: ['Please enter a different value'],
})
})
@@ -961,7 +964,7 @@ describe('field api', () => {
await vi.runAllTimersAsync()
expect(field.getMeta().errors).toContain('Please enter a different value')
expect(field.getMeta().errorMap).toMatchObject({
- onBlur: 'Please enter a different value',
+ onBlur: ['Please enter a different value'],
})
})
@@ -1001,7 +1004,7 @@ describe('field api', () => {
expect(sleepMock).toHaveBeenCalledTimes(1)
expect(field.getMeta().errors).toContain('Please enter a different value')
expect(field.getMeta().errorMap).toMatchObject({
- onBlur: 'Please enter a different value',
+ onBlur: ['Please enter a different value'],
})
})
@@ -1041,7 +1044,7 @@ describe('field api', () => {
expect(sleepMock).toHaveBeenCalledTimes(1)
expect(field.getMeta().errors).toContain('Please enter a different value')
expect(field.getMeta().errorMap).toMatchObject({
- onBlur: 'Please enter a different value',
+ onBlur: ['Please enter a different value'],
})
})
@@ -1076,8 +1079,88 @@ describe('field api', () => {
await vi.runAllTimersAsync()
expect(field.getMeta().errors).toContain('Please enter a different value')
expect(field.getMeta().errorMap).toMatchObject({
- onSubmit: 'Please enter a different value',
+ onSubmit: ['Please enter a different value'],
+ })
+ })
+
+ it("should be able to return an array of errors from a validator's validate function", () => {
+ const form = new FormApi({
+ defaultValues: {
+ name: 'test',
+ },
+ })
+
+ const field = new FieldApi({
+ form,
+ name: 'name',
+ validators: {
+ onChange: ({ value }) => {
+ return value === 'other'
+ ? ['Please enter a different value', 'another error']
+ : undefined
+ },
+ },
+ })
+
+ field.mount()
+
+ field.setValue('other')
+ expect(field.getMeta().errorMap).toEqual({
+ onChange: ['Please enter a different value', 'another error'],
+ })
+ expect(field.getMeta().errors).toStrictEqual([
+ 'Please enter a different value',
+ 'another error',
+ ])
+ })
+
+ it('should merge array of validation errors from different validators', () => {
+ const form = new FormApi({
+ defaultValues: {
+ name: 'test',
+ },
+ })
+
+ const field = new FieldApi({
+ form,
+ name: 'name',
+ validators: {
+ onChange: ({ value }) => {
+ return value === 'other'
+ ? ['Please enter a different value', 'another error']
+ : undefined
+ },
+ onBlur: () => {
+ return 'blurError'
+ },
+ },
})
+
+ field.mount()
+
+ field.setValue('other')
+ expect(field.getMeta().errorMap).toStrictEqual({
+ onChange: ['Please enter a different value', 'another error'],
+ onMount: undefined,
+ })
+ expect(field.getMeta().errors).toStrictEqual([
+ 'Please enter a different value',
+ 'another error',
+ ])
+
+ field.handleBlur()
+
+ expect(field.getMeta().errorMap).toStrictEqual({
+ onBlur: ['blurError'],
+ onChange: ['Please enter a different value', 'another error'],
+ onMount: undefined,
+ })
+
+ expect(field.getMeta().errors).toStrictEqual([
+ 'Please enter a different value',
+ 'another error',
+ 'blurError',
+ ])
})
it('should run listener onChange', () => {
@@ -1266,8 +1349,8 @@ describe('field api', () => {
'Please enter a different value',
])
expect(field.getMeta().errorMap).toEqual({
- onBlur: 'Please enter a different value',
- onChange: 'Please enter a different value',
+ onBlur: ['Please enter a different value'],
+ onChange: ['Please enter a different value'],
})
})
@@ -1298,7 +1381,7 @@ describe('field api', () => {
'Please enter a different value',
])
expect(field.getMeta().errorMap).toEqual({
- onChange: 'Please enter a different value',
+ onChange: ['Please enter a different value'],
})
field.setValue('test')
expect(field.getMeta().errors).toStrictEqual([])
@@ -1447,31 +1530,31 @@ describe('field api', () => {
firstName.mount()
lastName.mount()
- expect(firstName.getMeta().errorMap.onMount).toStrictEqual(
+ expect(firstName.getMeta().errorMap.onMount).toStrictEqual([
'first name is required',
- )
+ ])
expect(firstName.getMeta().errors).toStrictEqual(['first name is required'])
expect(lastName.getMeta().errors).toStrictEqual(['last name is required'])
- expect(lastName.getMeta().errorMap.onMount).toStrictEqual(
+ expect(lastName.getMeta().errorMap.onMount).toStrictEqual([
'last name is required',
- )
+ ])
firstName.setValue('firstName')
expect(firstName.getMeta().errors).toStrictEqual([])
expect(firstName.getMeta().errorMap.onMount).toStrictEqual(undefined)
expect(lastName.getMeta().errors).toStrictEqual(['last name is required'])
- expect(lastName.getMeta().errorMap.onMount).toStrictEqual(
+ expect(lastName.getMeta().errorMap.onMount).toStrictEqual([
'last name is required',
- )
+ ])
firstName.setValue('f')
expect(firstName.getMeta().errors).toStrictEqual([
'first name must be at least 4 chars',
])
expect(firstName.getMeta().errorMap.onMount).toStrictEqual(undefined)
- expect(firstName.getMeta().errorMap.onChange).toStrictEqual(
+ expect(firstName.getMeta().errorMap.onChange).toStrictEqual([
'first name must be at least 4 chars',
- )
+ ])
})
it('should cancel previous functions from an async validator with an abort signal', async () => {
@@ -1689,9 +1772,11 @@ describe('field api', () => {
})
nameField.mount()
nameField.setErrorMap({
- onChange: "name can't be Josh",
+ onChange: ["name can't be Josh"],
})
- expect(nameField.getMeta().errorMap.onChange).toEqual("name can't be Josh")
+ expect(nameField.getMeta().errorMap.onChange).toEqual([
+ "name can't be Josh",
+ ])
})
it('should preserve other values in the fieldApi errorMap when adding other values', () => {
interface Form {
@@ -1705,16 +1790,20 @@ describe('field api', () => {
})
nameField.mount()
nameField.setErrorMap({
- onChange: "name can't be Josh",
+ onChange: ["name can't be Josh"],
})
- expect(nameField.getMeta().errorMap.onChange).toEqual("name can't be Josh")
+ expect(nameField.getMeta().errorMap.onChange).toEqual([
+ "name can't be Josh",
+ ])
nameField.setErrorMap({
- onBlur: 'name must begin with uppercase',
+ onBlur: ['name must begin with uppercase'],
})
- expect(nameField.getMeta().errorMap.onChange).toEqual("name can't be Josh")
- expect(nameField.getMeta().errorMap.onBlur).toEqual(
+ expect(nameField.getMeta().errorMap.onChange).toEqual([
+ "name can't be Josh",
+ ])
+ expect(nameField.getMeta().errorMap.onBlur).toEqual([
'name must begin with uppercase',
- )
+ ])
})
it('should replace errorMap value if it exists in the fieldApi object', () => {
interface Form {
@@ -1728,15 +1817,17 @@ describe('field api', () => {
})
nameField.mount()
nameField.setErrorMap({
- onChange: "name can't be Josh",
+ onChange: ["name can't be Josh"],
})
- expect(nameField.getMeta().errorMap.onChange).toEqual("name can't be Josh")
+ expect(nameField.getMeta().errorMap.onChange).toEqual([
+ "name can't be Josh",
+ ])
nameField.setErrorMap({
- onChange: 'other validation error',
+ onChange: ['other validation error'],
})
- expect(nameField.getMeta().errorMap.onChange).toEqual(
+ expect(nameField.getMeta().errorMap.onChange).toEqual([
'other validation error',
- )
+ ])
})
it('should have derived state on first render given defaultMeta', () => {
@@ -1752,7 +1843,7 @@ describe('field api', () => {
name: 'name',
defaultMeta: {
errorMap: {
- onChange: 'THERE IS AN ERROR',
+ onChange: ['THERE IS AN ERROR'],
},
},
})
diff --git a/packages/form-core/tests/FormApi.spec.ts b/packages/form-core/tests/FormApi.spec.ts
index 1a6570981..ee1cb4d1c 100644
--- a/packages/form-core/tests/FormApi.spec.ts
+++ b/packages/form-core/tests/FormApi.spec.ts
@@ -779,8 +779,8 @@ describe('form api', () => {
expect(form.state.errors.length).toBe(0)
field.setValue('other')
expect(form.state.errors).toContain('Please enter a different value')
- expect(form.state.errorMap).toMatchObject({
- onChange: 'Please enter a different value',
+ expect(form.state.errorMap).toEqual({
+ onChange: ['Please enter a different value'],
})
})
@@ -812,7 +812,7 @@ describe('form api', () => {
await vi.runAllTimersAsync()
expect(form.state.errors).toContain('Please enter a different value')
expect(form.state.errorMap).toMatchObject({
- onChange: 'Please enter a different value',
+ onChange: ['Please enter a different value'],
})
})
@@ -851,7 +851,7 @@ describe('form api', () => {
expect(sleepMock).toHaveBeenCalledTimes(1)
expect(form.state.errors).toContain('Please enter a different value')
expect(form.state.errorMap).toMatchObject({
- onChange: 'Please enter a different value',
+ onChange: ['Please enter a different value'],
})
})
@@ -890,7 +890,7 @@ describe('form api', () => {
expect(sleepMock).toHaveBeenCalledTimes(1)
expect(form.state.errors).toContain('Please enter a different value')
expect(form.state.errorMap).toMatchObject({
- onChange: 'Please enter a different value',
+ onChange: ['Please enter a different value'],
})
})
@@ -918,7 +918,7 @@ describe('form api', () => {
field.validate('blur')
expect(form.state.errors).toContain('Please enter a different value')
expect(form.state.errorMap).toMatchObject({
- onBlur: 'Please enter a different value',
+ onBlur: ['Please enter a different value'],
})
})
@@ -950,7 +950,7 @@ describe('form api', () => {
await vi.runAllTimersAsync()
expect(form.state.errors).toContain('Please enter a different value')
expect(form.state.errorMap).toMatchObject({
- onBlur: 'Please enter a different value',
+ onBlur: ['Please enter a different value'],
})
})
@@ -988,7 +988,7 @@ describe('form api', () => {
expect(sleepMock).toHaveBeenCalledTimes(1)
expect(form.state.errors).toContain('Please enter a different value')
expect(form.state.errorMap).toMatchObject({
- onBlur: 'Please enter a different value',
+ onBlur: ['Please enter a different value'],
})
})
@@ -1026,7 +1026,7 @@ describe('form api', () => {
expect(sleepMock).toHaveBeenCalledTimes(1)
expect(form.state.errors).toContain('Please enter a different value')
expect(form.state.errorMap).toMatchObject({
- onBlur: 'Please enter a different value',
+ onBlur: ['Please enter a different value'],
})
})
@@ -1061,8 +1061,8 @@ describe('form api', () => {
'Please enter a different value',
])
expect(form.state.errorMap).toEqual({
- onBlur: 'Please enter a different value',
- onChange: 'Please enter a different value',
+ onBlur: ['Please enter a different value'],
+ onChange: ['Please enter a different value'],
})
})
@@ -1089,7 +1089,7 @@ describe('form api', () => {
field.setValue('other')
expect(form.state.errors).toStrictEqual(['Please enter a different value'])
expect(form.state.errorMap).toEqual({
- onChange: 'Please enter a different value',
+ onChange: ['Please enter a different value'],
})
field.setValue('test')
expect(form.state.errors).toStrictEqual([])
@@ -1118,7 +1118,7 @@ describe('form api', () => {
expect(form.state.errors).toStrictEqual(['Please enter a different value'])
expect(form.state.errorMap).toEqual({
- onMount: 'Please enter a different value',
+ onMount: ['Please enter a different value'],
})
})
@@ -1144,11 +1144,13 @@ describe('form api', () => {
expect(form.state.errors).toStrictEqual(['Please enter a different value'])
expect(form.state.errorMap).toEqual({
- onMount: 'Please enter a different value',
+ onMount: ['Please enter a different value'],
})
form.setFieldValue('name', 'test')
expect(form.state.errors).toStrictEqual([])
+ expect(form.state.errorMap).toEqual({})
+ expect(form.state.errorMap.onMount).toBeUndefined()
})
it('should validate fields during submit', async () => {
@@ -1343,8 +1345,8 @@ describe('form api', () => {
expect(form.state.isFieldsValid).toEqual(false)
expect(form.state.canSubmit).toEqual(false)
expect(form.state.fieldMeta['firstName'].errorMap).toEqual({
- onChange: 'first name is required',
- onBlur: 'first name must be longer than 3 characters',
+ onChange: ['first name is required'],
+ onBlur: ['first name must be longer than 3 characters'],
})
})
@@ -1369,9 +1371,9 @@ describe('form api', () => {
await form.handleSubmit()
expect(form.state.isFieldsValid).toEqual(false)
expect(form.state.canSubmit).toEqual(false)
- expect(form.state.fieldMeta['firstName'].errorMap['onSubmit']).toEqual(
+ expect(form.state.fieldMeta['firstName'].errorMap['onSubmit']).toEqual([
'first name is required',
- )
+ ])
field.handleChange('test')
expect(form.state.isFieldsValid).toEqual(true)
expect(form.state.canSubmit).toEqual(true)
@@ -1401,9 +1403,13 @@ describe('form api', () => {
field.mount()
await form.validateAllFields('change')
- expect(field.getMeta().errorMap.onChange).toEqual('first name is required')
+ expect(field.getMeta().errorMap.onChange).toEqual([
+ 'first name is required',
+ ])
await form.validateAllFields('change')
- expect(field.getMeta().errorMap.onChange).toEqual('first name is required')
+ expect(field.getMeta().errorMap.onChange).toEqual([
+ 'first name is required',
+ ])
})
it('should validate a single field consistently if touched', async () => {
@@ -1430,9 +1436,13 @@ describe('form api', () => {
field.mount()
await form.validateField('firstName', 'change')
- expect(field.getMeta().errorMap.onChange).toEqual('first name is required')
+ expect(field.getMeta().errorMap.onChange).toEqual([
+ 'first name is required',
+ ])
await form.validateField('firstName', 'change')
- expect(field.getMeta().errorMap.onChange).toEqual('first name is required')
+ expect(field.getMeta().errorMap.onChange).toEqual([
+ 'first name is required',
+ ])
})
it('should show onSubmit errors', async () => {
@@ -1456,7 +1466,7 @@ describe('form api', () => {
field.mount()
await form.handleSubmit()
- expect(form.state.errors).toStrictEqual(['first name is required'])
+ expect(form.state.errors).toEqual(['first name is required'])
})
it('should run onChange validation during submit', async () => {
@@ -1572,9 +1582,9 @@ describe('form api', () => {
const form = new FormApi
)
diff --git a/packages/valibot-form-adapter/src/validator.ts b/packages/valibot-form-adapter/src/validator.ts
index 5349878f3..f25b69a5b 100644
--- a/packages/valibot-form-adapter/src/validator.ts
+++ b/packages/valibot-form-adapter/src/validator.ts
@@ -27,7 +27,7 @@ export function prefixSchemaToErrors(
schema.set(path, (schema.get(path) ?? []).concat(valiError))
}
- const transformedSchema = {} as Record