@tanstack/react-form 0.10.3 → 0.12.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.
Files changed (140) hide show
  1. package/dist/cjs/createFormFactory.d.ts +11 -0
  2. package/dist/cjs/formContext.d.ts +10 -0
  3. package/dist/cjs/index.cjs +181 -0
  4. package/dist/cjs/index.cjs.map +1 -0
  5. package/dist/cjs/index.d.cts +8 -0
  6. package/dist/cjs/index.d.ts +8 -0
  7. package/dist/cjs/index.js +181 -0
  8. package/dist/cjs/tests/createFormFactory.test.d.ts +1 -0
  9. package/dist/cjs/tests/useField.test-d.d.ts +1 -0
  10. package/dist/cjs/tests/useField.test.d.ts +1 -0
  11. package/dist/cjs/tests/useForm.test-d.d.ts +1 -0
  12. package/dist/cjs/tests/useForm.test.d.ts +1 -0
  13. package/dist/cjs/tests/utils.d.ts +1 -0
  14. package/dist/cjs/types.d.ts +4 -0
  15. package/dist/cjs/useField.d.ts +28 -0
  16. package/dist/cjs/useForm.d.ts +19 -0
  17. package/dist/cjs/useIsomorphicEffectOnce.d.ts +5 -0
  18. package/dist/cjs/useIsomorphicLayoutEffect.d.ts +3 -0
  19. package/dist/cjs/useTransform.d.ts +5 -0
  20. package/dist/cjs/validateFormData.d.ts +14 -0
  21. package/dist/mjs/createFormFactory.d.ts +11 -0
  22. package/dist/mjs/formContext.d.ts +10 -0
  23. package/dist/mjs/index.d.mts +8 -0
  24. package/dist/mjs/index.d.ts +8 -0
  25. package/dist/mjs/index.js +170 -0
  26. package/dist/mjs/index.mjs +170 -0
  27. package/dist/mjs/index.mjs.map +1 -0
  28. package/dist/mjs/tests/createFormFactory.test.d.ts +1 -0
  29. package/dist/mjs/tests/useField.test-d.d.ts +1 -0
  30. package/dist/mjs/tests/useField.test.d.ts +1 -0
  31. package/dist/mjs/tests/useForm.test-d.d.ts +1 -0
  32. package/dist/mjs/tests/useForm.test.d.ts +1 -0
  33. package/dist/mjs/tests/utils.d.ts +1 -0
  34. package/dist/mjs/types.d.ts +4 -0
  35. package/dist/mjs/useField.d.ts +28 -0
  36. package/dist/mjs/useForm.d.ts +19 -0
  37. package/dist/mjs/useIsomorphicEffectOnce.d.ts +5 -0
  38. package/dist/mjs/useIsomorphicLayoutEffect.d.ts +3 -0
  39. package/dist/mjs/useTransform.d.ts +5 -0
  40. package/dist/mjs/validateFormData.d.ts +14 -0
  41. package/package.json +21 -24
  42. package/src/createFormFactory.ts +25 -9
  43. package/src/formContext.ts +5 -5
  44. package/src/index.ts +7 -1
  45. package/src/tests/createFormFactory.test.tsx +1 -1
  46. package/src/tests/useField.test-d.tsx +12 -8
  47. package/src/tests/useField.test.tsx +45 -33
  48. package/src/tests/useForm.test-d.tsx +36 -0
  49. package/src/tests/useForm.test.tsx +59 -42
  50. package/src/types.ts +13 -4
  51. package/src/useField.tsx +82 -40
  52. package/src/useForm.tsx +20 -11
  53. package/src/useIsomorphicEffectOnce.ts +38 -0
  54. package/src/useIsomorphicLayoutEffect.ts +1 -1
  55. package/src/useTransform.ts +16 -0
  56. package/src/validateFormData.ts +70 -0
  57. package/build/legacy/createFormFactory.cjs +0 -42
  58. package/build/legacy/createFormFactory.cjs.map +0 -1
  59. package/build/legacy/createFormFactory.d.cts +0 -12
  60. package/build/legacy/createFormFactory.d.ts +0 -12
  61. package/build/legacy/createFormFactory.js +0 -17
  62. package/build/legacy/createFormFactory.js.map +0 -1
  63. package/build/legacy/formContext.cjs +0 -51
  64. package/build/legacy/formContext.cjs.map +0 -1
  65. package/build/legacy/formContext.d.cts +0 -13
  66. package/build/legacy/formContext.d.ts +0 -13
  67. package/build/legacy/formContext.js +0 -15
  68. package/build/legacy/formContext.js.map +0 -1
  69. package/build/legacy/index.cjs +0 -46
  70. package/build/legacy/index.cjs.map +0 -1
  71. package/build/legacy/index.d.cts +0 -7
  72. package/build/legacy/index.d.ts +0 -7
  73. package/build/legacy/index.js +0 -15
  74. package/build/legacy/index.js.map +0 -1
  75. package/build/legacy/types.cjs +0 -19
  76. package/build/legacy/types.cjs.map +0 -1
  77. package/build/legacy/types.d.cts +0 -7
  78. package/build/legacy/types.d.ts +0 -7
  79. package/build/legacy/types.js +0 -1
  80. package/build/legacy/types.js.map +0 -1
  81. package/build/legacy/useField.cjs +0 -88
  82. package/build/legacy/useField.cjs.map +0 -1
  83. package/build/legacy/useField.d.cts +0 -27
  84. package/build/legacy/useField.d.ts +0 -27
  85. package/build/legacy/useField.js +0 -52
  86. package/build/legacy/useField.js.map +0 -1
  87. package/build/legacy/useForm.cjs +0 -73
  88. package/build/legacy/useForm.cjs.map +0 -1
  89. package/build/legacy/useForm.d.cts +0 -23
  90. package/build/legacy/useForm.d.ts +0 -23
  91. package/build/legacy/useForm.js +0 -38
  92. package/build/legacy/useForm.js.map +0 -1
  93. package/build/legacy/useIsomorphicLayoutEffect.cjs +0 -35
  94. package/build/legacy/useIsomorphicLayoutEffect.cjs.map +0 -1
  95. package/build/legacy/useIsomorphicLayoutEffect.d.cts +0 -5
  96. package/build/legacy/useIsomorphicLayoutEffect.d.ts +0 -5
  97. package/build/legacy/useIsomorphicLayoutEffect.js +0 -10
  98. package/build/legacy/useIsomorphicLayoutEffect.js.map +0 -1
  99. package/build/modern/createFormFactory.cjs +0 -42
  100. package/build/modern/createFormFactory.cjs.map +0 -1
  101. package/build/modern/createFormFactory.d.cts +0 -12
  102. package/build/modern/createFormFactory.d.ts +0 -12
  103. package/build/modern/createFormFactory.js +0 -17
  104. package/build/modern/createFormFactory.js.map +0 -1
  105. package/build/modern/formContext.cjs +0 -51
  106. package/build/modern/formContext.cjs.map +0 -1
  107. package/build/modern/formContext.d.cts +0 -13
  108. package/build/modern/formContext.d.ts +0 -13
  109. package/build/modern/formContext.js +0 -15
  110. package/build/modern/formContext.js.map +0 -1
  111. package/build/modern/index.cjs +0 -46
  112. package/build/modern/index.cjs.map +0 -1
  113. package/build/modern/index.d.cts +0 -7
  114. package/build/modern/index.d.ts +0 -7
  115. package/build/modern/index.js +0 -15
  116. package/build/modern/index.js.map +0 -1
  117. package/build/modern/types.cjs +0 -19
  118. package/build/modern/types.cjs.map +0 -1
  119. package/build/modern/types.d.cts +0 -7
  120. package/build/modern/types.d.ts +0 -7
  121. package/build/modern/types.js +0 -1
  122. package/build/modern/types.js.map +0 -1
  123. package/build/modern/useField.cjs +0 -88
  124. package/build/modern/useField.cjs.map +0 -1
  125. package/build/modern/useField.d.cts +0 -27
  126. package/build/modern/useField.d.ts +0 -27
  127. package/build/modern/useField.js +0 -52
  128. package/build/modern/useField.js.map +0 -1
  129. package/build/modern/useForm.cjs +0 -73
  130. package/build/modern/useForm.cjs.map +0 -1
  131. package/build/modern/useForm.d.cts +0 -23
  132. package/build/modern/useForm.d.ts +0 -23
  133. package/build/modern/useForm.js +0 -38
  134. package/build/modern/useForm.js.map +0 -1
  135. package/build/modern/useIsomorphicLayoutEffect.cjs +0 -35
  136. package/build/modern/useIsomorphicLayoutEffect.cjs.map +0 -1
  137. package/build/modern/useIsomorphicLayoutEffect.d.cts +0 -5
  138. package/build/modern/useIsomorphicLayoutEffect.d.ts +0 -5
  139. package/build/modern/useIsomorphicLayoutEffect.js +0 -10
  140. package/build/modern/useIsomorphicLayoutEffect.js.map +0 -1
package/src/index.ts CHANGED
@@ -16,7 +16,12 @@ export type {
16
16
  ValidationMeta,
17
17
  } from '@tanstack/form-core'
18
18
 
19
- export { FormApi, FieldApi, functionalUpdate } from '@tanstack/form-core'
19
+ export {
20
+ FormApi,
21
+ FieldApi,
22
+ functionalUpdate,
23
+ mergeForm,
24
+ } from '@tanstack/form-core'
20
25
 
21
26
  export { useForm } from './useForm'
22
27
 
@@ -25,3 +30,4 @@ export { useField, Field } from './useField'
25
30
 
26
31
  export type { FormFactory } from './createFormFactory'
27
32
  export { createFormFactory } from './createFormFactory'
33
+ export { useTransform } from './useTransform'
@@ -11,7 +11,7 @@ describe('createFormFactory', () => {
11
11
  lastName: string
12
12
  }
13
13
 
14
- const formFactory = createFormFactory<Person, unknown>({
14
+ const formFactory = createFormFactory<Person>({
15
15
  defaultValues: {
16
16
  firstName: 'FirstName',
17
17
  lastName: 'LastName',
@@ -43,19 +43,23 @@ it('should type onChange properly', () => {
43
43
  <form.Provider>
44
44
  <form.Field
45
45
  name="firstName"
46
- onChange={(val) => {
47
- assertType<'test'>(val)
48
- return null
46
+ validators={{
47
+ onChange: ({ value }) => {
48
+ assertType<'test'>(value)
49
+ return null
50
+ },
49
51
  }}
50
- children={(field) => null}
52
+ children={() => null}
51
53
  />
52
54
  <form.Field
53
55
  name="age"
54
- onChange={(val) => {
55
- assertType<84>(val)
56
- return null
56
+ validators={{
57
+ onChange: ({ value }) => {
58
+ assertType<84>(value)
59
+ return null
60
+ },
57
61
  }}
58
- children={(field) => null}
62
+ children={() => null}
59
63
  />
60
64
  </form.Provider>
61
65
  )
@@ -15,7 +15,7 @@ describe('useField', () => {
15
15
  lastName: string
16
16
  }
17
17
 
18
- const formFactory = createFormFactory<Person, unknown>()
18
+ const formFactory = createFormFactory<Person>()
19
19
 
20
20
  function Comp() {
21
21
  const form = formFactory.useForm({
@@ -55,7 +55,7 @@ describe('useField', () => {
55
55
  lastName: string
56
56
  }
57
57
 
58
- const formFactory = createFormFactory<Person, unknown>()
58
+ const formFactory = createFormFactory<Person>()
59
59
 
60
60
  function Comp() {
61
61
  const form = formFactory.useForm({
@@ -97,7 +97,7 @@ describe('useField', () => {
97
97
  }
98
98
  const error = 'Please enter a different value'
99
99
 
100
- const formFactory = createFormFactory<Person, unknown>()
100
+ const formFactory = createFormFactory<Person>()
101
101
 
102
102
  function Comp() {
103
103
  const form = formFactory.useForm()
@@ -106,7 +106,9 @@ describe('useField', () => {
106
106
  <form.Provider>
107
107
  <form.Field
108
108
  name="firstName"
109
- onChange={(value) => (value === 'other' ? error : undefined)}
109
+ validators={{
110
+ onChange: ({ value }) => (value === 'other' ? error : undefined),
111
+ }}
110
112
  children={(field) => (
111
113
  <div>
112
114
  <input
@@ -137,7 +139,7 @@ describe('useField', () => {
137
139
  }
138
140
  const error = 'Please enter a different value'
139
141
 
140
- const formFactory = createFormFactory<Person, unknown>()
142
+ const formFactory = createFormFactory<Person>()
141
143
 
142
144
  function Comp() {
143
145
  const form = formFactory.useForm()
@@ -147,7 +149,9 @@ describe('useField', () => {
147
149
  <form.Field
148
150
  name="firstName"
149
151
  defaultMeta={{ isTouched: true }}
150
- onChange={(value) => (value === 'other' ? error : undefined)}
152
+ validators={{
153
+ onChange: ({ value }) => (value === 'other' ? error : undefined),
154
+ }}
151
155
  children={(field) => (
152
156
  <div>
153
157
  <input
@@ -180,7 +184,7 @@ describe('useField', () => {
180
184
  const onChangeError = 'Please enter a different value (onChangeError)'
181
185
  const onBlurError = 'Please enter a different value (onBlurError)'
182
186
 
183
- const formFactory = createFormFactory<Person, unknown>()
187
+ const formFactory = createFormFactory<Person>()
184
188
 
185
189
  function Comp() {
186
190
  const form = formFactory.useForm()
@@ -190,10 +194,12 @@ describe('useField', () => {
190
194
  <form.Field
191
195
  name="firstName"
192
196
  defaultMeta={{ isTouched: true }}
193
- onChange={(value) =>
194
- value === 'other' ? onChangeError : undefined
195
- }
196
- onBlur={(value) => (value === 'other' ? onBlurError : undefined)}
197
+ validators={{
198
+ onChange: ({ value }) =>
199
+ value === 'other' ? onChangeError : undefined,
200
+ onBlur: ({ value }) =>
201
+ value === 'other' ? onBlurError : undefined,
202
+ }}
197
203
  children={(field) => (
198
204
  <div>
199
205
  <input
@@ -229,7 +235,7 @@ describe('useField', () => {
229
235
  }
230
236
  const error = 'Please enter a different value'
231
237
 
232
- const formFactory = createFormFactory<Person, unknown>()
238
+ const formFactory = createFormFactory<Person>()
233
239
 
234
240
  function Comp() {
235
241
  const form = formFactory.useForm()
@@ -239,9 +245,11 @@ describe('useField', () => {
239
245
  <form.Field
240
246
  name="firstName"
241
247
  defaultMeta={{ isTouched: true }}
242
- onChangeAsync={async () => {
243
- await sleep(10)
244
- return error
248
+ validators={{
249
+ onChangeAsync: async () => {
250
+ await sleep(10)
251
+ return error
252
+ },
245
253
  }}
246
254
  children={(field) => (
247
255
  <div>
@@ -276,7 +284,7 @@ describe('useField', () => {
276
284
  const onChangeError = 'Please enter a different value (onChangeError)'
277
285
  const onBlurError = 'Please enter a different value (onBlurError)'
278
286
 
279
- const formFactory = createFormFactory<Person, unknown>()
287
+ const formFactory = createFormFactory<Person>()
280
288
 
281
289
  function Comp() {
282
290
  const form = formFactory.useForm()
@@ -286,13 +294,15 @@ describe('useField', () => {
286
294
  <form.Field
287
295
  name="firstName"
288
296
  defaultMeta={{ isTouched: true }}
289
- onChangeAsync={async () => {
290
- await sleep(10)
291
- return onChangeError
292
- }}
293
- onBlurAsync={async () => {
294
- await sleep(10)
295
- return onBlurError
297
+ validators={{
298
+ onChangeAsync: async () => {
299
+ await sleep(10)
300
+ return onChangeError
301
+ },
302
+ onBlurAsync: async () => {
303
+ await sleep(10)
304
+ return onBlurError
305
+ },
296
306
  }}
297
307
  children={(field) => (
298
308
  <div>
@@ -332,7 +342,7 @@ describe('useField', () => {
332
342
  }
333
343
  const mockFn = vi.fn()
334
344
  const error = 'Please enter a different value'
335
- const formFactory = createFormFactory<Person, unknown>()
345
+ const formFactory = createFormFactory<Person>()
336
346
 
337
347
  function Comp() {
338
348
  const form = formFactory.useForm()
@@ -342,11 +352,13 @@ describe('useField', () => {
342
352
  <form.Field
343
353
  name="firstName"
344
354
  defaultMeta={{ isTouched: true }}
345
- onChangeAsyncDebounceMs={100}
346
- onChangeAsync={async () => {
347
- mockFn()
348
- await sleep(10)
349
- return error
355
+ validators={{
356
+ onChangeAsyncDebounceMs: 100,
357
+ onChangeAsync: async () => {
358
+ mockFn()
359
+ await sleep(10)
360
+ return error
361
+ },
350
362
  }}
351
363
  children={(field) => (
352
364
  <div>
@@ -379,8 +391,8 @@ describe('useField', () => {
379
391
  firstName: string
380
392
  lastName: string
381
393
  }
382
- const formFactory = createFormFactory<Person, unknown>()
383
- let form: FormApi<Person, unknown> | null = null
394
+ const formFactory = createFormFactory<Person>()
395
+ let form: FormApi<Person> | null = null
384
396
  function Comp() {
385
397
  form = formFactory.useForm()
386
398
  return (
@@ -417,8 +429,8 @@ describe('useField', () => {
417
429
  firstName: string
418
430
  lastName: string
419
431
  }
420
- const formFactory = createFormFactory<Person, unknown>()
421
- let form: FormApi<Person, unknown> | null = null
432
+ const formFactory = createFormFactory<Person>()
433
+ let form: FormApi<Person> | null = null
422
434
  function Comp() {
423
435
  form = formFactory.useForm()
424
436
  return (
@@ -0,0 +1,36 @@
1
+ import { assertType } from 'vitest'
2
+ import * as React from 'react'
3
+ import { useForm } from '../useForm'
4
+
5
+ it('should type onSubmit properly', () => {
6
+ function Comp() {
7
+ const form = useForm({
8
+ defaultValues: {
9
+ firstName: 'test',
10
+ age: 84,
11
+ // as const is required here
12
+ } as const,
13
+ onSubmit({ value }) {
14
+ assertType<84>(value.age)
15
+ },
16
+ })
17
+ }
18
+ })
19
+
20
+ it('should type a validator properly', () => {
21
+ function Comp() {
22
+ const form = useForm({
23
+ defaultValues: {
24
+ firstName: 'test',
25
+ age: 84,
26
+ // as const is required here
27
+ } as const,
28
+ validators: {
29
+ onChange({ value }) {
30
+ assertType<84>(value.age)
31
+ return undefined
32
+ },
33
+ },
34
+ })
35
+ }
36
+ })
@@ -15,7 +15,7 @@ describe('useForm', () => {
15
15
  lastName: string
16
16
  }
17
17
 
18
- const formFactory = createFormFactory<Person, unknown>()
18
+ const formFactory = createFormFactory<Person>()
19
19
 
20
20
  function Comp() {
21
21
  const form = formFactory.useForm()
@@ -53,7 +53,7 @@ describe('useForm', () => {
53
53
  lastName: string
54
54
  }
55
55
 
56
- const formFactory = createFormFactory<Person, unknown>()
56
+ const formFactory = createFormFactory<Person>()
57
57
 
58
58
  function Comp() {
59
59
  const form = formFactory.useForm({
@@ -90,8 +90,8 @@ describe('useForm', () => {
90
90
  defaultValues: {
91
91
  firstName: 'FirstName',
92
92
  },
93
- onSubmit: (data) => {
94
- setSubmittedData(data)
93
+ onSubmit: ({ value }) => {
94
+ setSubmittedData(value)
95
95
  },
96
96
  })
97
97
 
@@ -135,9 +135,11 @@ describe('useForm', () => {
135
135
  defaultValues: {
136
136
  firstName: 'FirstName',
137
137
  },
138
- onMount: () => {
139
- setFormMounted(true)
140
- return undefined
138
+ validators: {
139
+ onMount: () => {
140
+ setFormMounted(true)
141
+ return undefined
142
+ },
141
143
  },
142
144
  })
143
145
 
@@ -166,14 +168,17 @@ describe('useForm', () => {
166
168
  }
167
169
  const error = 'Please enter a different value'
168
170
 
169
- const formFactory = createFormFactory<Person, unknown>()
171
+ const formFactory = createFormFactory<Person>()
170
172
 
171
173
  function Comp() {
172
174
  const form = formFactory.useForm({
173
- onChange() {
174
- return error
175
+ validators: {
176
+ onChange() {
177
+ return error
178
+ },
175
179
  },
176
180
  })
181
+ const onChangeError = form.useStore((s) => s.errorMap.onChange)
177
182
  return (
178
183
  <form.Provider>
179
184
  <form.Field
@@ -188,9 +193,7 @@ describe('useForm', () => {
188
193
  />
189
194
  )}
190
195
  />
191
- <form.Subscribe selector={(state) => state.errorMap}>
192
- {(errorMap) => <p>{errorMap.onChange}</p>}
193
- </form.Subscribe>
196
+ <p>{onChangeError}</p>
194
197
  </form.Provider>
195
198
  )
196
199
  }
@@ -210,11 +213,14 @@ describe('useForm', () => {
210
213
  }
211
214
  const error = 'Please enter a different value'
212
215
 
213
- const formFactory = createFormFactory<Person, unknown>()
216
+ const formFactory = createFormFactory<Person>()
214
217
 
215
218
  function Comp() {
216
219
  const form = formFactory.useForm({
217
- onChange: (value) => (value.firstName === 'other' ? error : undefined),
220
+ validators: {
221
+ onChange: ({ value }) =>
222
+ value.firstName === 'other' ? error : undefined,
223
+ },
218
224
  })
219
225
 
220
226
  const errors = form.useStore((s) => s.errors)
@@ -252,11 +258,14 @@ describe('useForm', () => {
252
258
  }
253
259
  const error = 'Please enter a different value'
254
260
 
255
- const formFactory = createFormFactory<Person, unknown>()
261
+ const formFactory = createFormFactory<Person>()
256
262
 
257
263
  function Comp() {
258
264
  const form = formFactory.useForm({
259
- onChange: (value) => (value.firstName === 'other' ? error : undefined),
265
+ validators: {
266
+ onChange: ({ value }) =>
267
+ value.firstName === 'other' ? error : undefined,
268
+ },
260
269
  })
261
270
  const errors = form.useStore((s) => s.errorMap)
262
271
  return (
@@ -297,13 +306,15 @@ describe('useForm', () => {
297
306
  defaultValues: {
298
307
  firstName: '',
299
308
  },
300
- onChange: (vals) => {
301
- if (vals.firstName === 'other') return onChangeError
302
- return undefined
303
- },
304
- onBlur: (vals) => {
305
- if (vals.firstName === 'other') return onBlurError
306
- return undefined
309
+ validators: {
310
+ onChange: ({ value }) => {
311
+ if (value.firstName === 'other') return onChangeError
312
+ return undefined
313
+ },
314
+ onBlur: ({ value }) => {
315
+ if (value.firstName === 'other') return onBlurError
316
+ return undefined
317
+ },
307
318
  },
308
319
  })
309
320
 
@@ -347,13 +358,15 @@ describe('useForm', () => {
347
358
  }
348
359
  const error = 'Please enter a different value'
349
360
 
350
- const formFactory = createFormFactory<Person, unknown>()
361
+ const formFactory = createFormFactory<Person>()
351
362
 
352
363
  function Comp() {
353
364
  const form = formFactory.useForm({
354
- onChangeAsync: async () => {
355
- await sleep(10)
356
- return error
365
+ validators: {
366
+ onChangeAsync: async () => {
367
+ await sleep(10)
368
+ return error
369
+ },
357
370
  },
358
371
  })
359
372
  const errors = form.useStore((s) => s.errorMap)
@@ -395,17 +408,19 @@ describe('useForm', () => {
395
408
  const onChangeError = 'Please enter a different value (onChangeError)'
396
409
  const onBlurError = 'Please enter a different value (onBlurError)'
397
410
 
398
- const formFactory = createFormFactory<Person, unknown>()
411
+ const formFactory = createFormFactory<Person>()
399
412
 
400
413
  function Comp() {
401
414
  const form = formFactory.useForm({
402
- onChangeAsync: async () => {
403
- await sleep(10)
404
- return onChangeError
405
- },
406
- onBlurAsync: async () => {
407
- await sleep(10)
408
- return onBlurError
415
+ validators: {
416
+ onChangeAsync: async () => {
417
+ await sleep(10)
418
+ return onChangeError
419
+ },
420
+ onBlurAsync: async () => {
421
+ await sleep(10)
422
+ return onBlurError
423
+ },
409
424
  },
410
425
  })
411
426
  const errors = form.useStore((s) => s.errorMap)
@@ -453,15 +468,17 @@ describe('useForm', () => {
453
468
  }
454
469
  const mockFn = vi.fn()
455
470
  const error = 'Please enter a different value'
456
- const formFactory = createFormFactory<Person, unknown>()
471
+ const formFactory = createFormFactory<Person>()
457
472
 
458
473
  function Comp() {
459
474
  const form = formFactory.useForm({
460
- onChangeAsyncDebounceMs: 100,
461
- onChangeAsync: async () => {
462
- mockFn()
463
- await sleep(10)
464
- return error
475
+ validators: {
476
+ onChangeAsyncDebounceMs: 100,
477
+ onChangeAsync: async () => {
478
+ mockFn()
479
+ await sleep(10)
480
+ return error
481
+ },
465
482
  },
466
483
  })
467
484
  const errors = form.useStore((s) => s.errors)
package/src/types.ts CHANGED
@@ -1,11 +1,20 @@
1
- import type { FieldOptions, DeepKeys, DeepValue } from '@tanstack/form-core'
1
+ import type {
2
+ FieldOptions,
3
+ DeepKeys,
4
+ DeepValue,
5
+ Validator,
6
+ } from '@tanstack/form-core'
2
7
 
3
8
  export type UseFieldOptions<
4
9
  TParentData,
5
10
  TName extends DeepKeys<TParentData>,
6
- ValidatorType,
7
- FormValidator,
11
+ TFieldValidator extends
12
+ | Validator<DeepValue<TParentData, TName>, unknown>
13
+ | undefined = undefined,
14
+ TFormValidator extends
15
+ | Validator<TParentData, unknown>
16
+ | undefined = undefined,
8
17
  TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,
9
- > = FieldOptions<TParentData, TName, ValidatorType, FormValidator, TData> & {
18
+ > = FieldOptions<TParentData, TName, TFieldValidator, TFormValidator, TData> & {
10
19
  mode?: 'value' | 'array'
11
20
  }