@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.
- package/dist/cjs/createFormFactory.d.ts +11 -0
- package/dist/cjs/formContext.d.ts +10 -0
- package/dist/cjs/index.cjs +181 -0
- package/dist/cjs/index.cjs.map +1 -0
- package/dist/cjs/index.d.cts +8 -0
- package/dist/cjs/index.d.ts +8 -0
- package/dist/cjs/index.js +181 -0
- package/dist/cjs/tests/createFormFactory.test.d.ts +1 -0
- package/dist/cjs/tests/useField.test-d.d.ts +1 -0
- package/dist/cjs/tests/useField.test.d.ts +1 -0
- package/dist/cjs/tests/useForm.test-d.d.ts +1 -0
- package/dist/cjs/tests/useForm.test.d.ts +1 -0
- package/dist/cjs/tests/utils.d.ts +1 -0
- package/dist/cjs/types.d.ts +4 -0
- package/dist/cjs/useField.d.ts +28 -0
- package/dist/cjs/useForm.d.ts +19 -0
- package/dist/cjs/useIsomorphicEffectOnce.d.ts +5 -0
- package/dist/cjs/useIsomorphicLayoutEffect.d.ts +3 -0
- package/dist/cjs/useTransform.d.ts +5 -0
- package/dist/cjs/validateFormData.d.ts +14 -0
- package/dist/mjs/createFormFactory.d.ts +11 -0
- package/dist/mjs/formContext.d.ts +10 -0
- package/dist/mjs/index.d.mts +8 -0
- package/dist/mjs/index.d.ts +8 -0
- package/dist/mjs/index.js +170 -0
- package/dist/mjs/index.mjs +170 -0
- package/dist/mjs/index.mjs.map +1 -0
- package/dist/mjs/tests/createFormFactory.test.d.ts +1 -0
- package/dist/mjs/tests/useField.test-d.d.ts +1 -0
- package/dist/mjs/tests/useField.test.d.ts +1 -0
- package/dist/mjs/tests/useForm.test-d.d.ts +1 -0
- package/dist/mjs/tests/useForm.test.d.ts +1 -0
- package/dist/mjs/tests/utils.d.ts +1 -0
- package/dist/mjs/types.d.ts +4 -0
- package/dist/mjs/useField.d.ts +28 -0
- package/dist/mjs/useForm.d.ts +19 -0
- package/dist/mjs/useIsomorphicEffectOnce.d.ts +5 -0
- package/dist/mjs/useIsomorphicLayoutEffect.d.ts +3 -0
- package/dist/mjs/useTransform.d.ts +5 -0
- package/dist/mjs/validateFormData.d.ts +14 -0
- package/package.json +21 -24
- package/src/createFormFactory.ts +25 -9
- package/src/formContext.ts +5 -5
- package/src/index.ts +7 -1
- package/src/tests/createFormFactory.test.tsx +1 -1
- package/src/tests/useField.test-d.tsx +12 -8
- package/src/tests/useField.test.tsx +45 -33
- package/src/tests/useForm.test-d.tsx +36 -0
- package/src/tests/useForm.test.tsx +59 -42
- package/src/types.ts +13 -4
- package/src/useField.tsx +82 -40
- package/src/useForm.tsx +20 -11
- package/src/useIsomorphicEffectOnce.ts +38 -0
- package/src/useIsomorphicLayoutEffect.ts +1 -1
- package/src/useTransform.ts +16 -0
- package/src/validateFormData.ts +70 -0
- package/build/legacy/createFormFactory.cjs +0 -42
- package/build/legacy/createFormFactory.cjs.map +0 -1
- package/build/legacy/createFormFactory.d.cts +0 -12
- package/build/legacy/createFormFactory.d.ts +0 -12
- package/build/legacy/createFormFactory.js +0 -17
- package/build/legacy/createFormFactory.js.map +0 -1
- package/build/legacy/formContext.cjs +0 -51
- package/build/legacy/formContext.cjs.map +0 -1
- package/build/legacy/formContext.d.cts +0 -13
- package/build/legacy/formContext.d.ts +0 -13
- package/build/legacy/formContext.js +0 -15
- package/build/legacy/formContext.js.map +0 -1
- package/build/legacy/index.cjs +0 -46
- package/build/legacy/index.cjs.map +0 -1
- package/build/legacy/index.d.cts +0 -7
- package/build/legacy/index.d.ts +0 -7
- package/build/legacy/index.js +0 -15
- package/build/legacy/index.js.map +0 -1
- package/build/legacy/types.cjs +0 -19
- package/build/legacy/types.cjs.map +0 -1
- package/build/legacy/types.d.cts +0 -7
- package/build/legacy/types.d.ts +0 -7
- package/build/legacy/types.js +0 -1
- package/build/legacy/types.js.map +0 -1
- package/build/legacy/useField.cjs +0 -88
- package/build/legacy/useField.cjs.map +0 -1
- package/build/legacy/useField.d.cts +0 -27
- package/build/legacy/useField.d.ts +0 -27
- package/build/legacy/useField.js +0 -52
- package/build/legacy/useField.js.map +0 -1
- package/build/legacy/useForm.cjs +0 -73
- package/build/legacy/useForm.cjs.map +0 -1
- package/build/legacy/useForm.d.cts +0 -23
- package/build/legacy/useForm.d.ts +0 -23
- package/build/legacy/useForm.js +0 -38
- package/build/legacy/useForm.js.map +0 -1
- package/build/legacy/useIsomorphicLayoutEffect.cjs +0 -35
- package/build/legacy/useIsomorphicLayoutEffect.cjs.map +0 -1
- package/build/legacy/useIsomorphicLayoutEffect.d.cts +0 -5
- package/build/legacy/useIsomorphicLayoutEffect.d.ts +0 -5
- package/build/legacy/useIsomorphicLayoutEffect.js +0 -10
- package/build/legacy/useIsomorphicLayoutEffect.js.map +0 -1
- package/build/modern/createFormFactory.cjs +0 -42
- package/build/modern/createFormFactory.cjs.map +0 -1
- package/build/modern/createFormFactory.d.cts +0 -12
- package/build/modern/createFormFactory.d.ts +0 -12
- package/build/modern/createFormFactory.js +0 -17
- package/build/modern/createFormFactory.js.map +0 -1
- package/build/modern/formContext.cjs +0 -51
- package/build/modern/formContext.cjs.map +0 -1
- package/build/modern/formContext.d.cts +0 -13
- package/build/modern/formContext.d.ts +0 -13
- package/build/modern/formContext.js +0 -15
- package/build/modern/formContext.js.map +0 -1
- package/build/modern/index.cjs +0 -46
- package/build/modern/index.cjs.map +0 -1
- package/build/modern/index.d.cts +0 -7
- package/build/modern/index.d.ts +0 -7
- package/build/modern/index.js +0 -15
- package/build/modern/index.js.map +0 -1
- package/build/modern/types.cjs +0 -19
- package/build/modern/types.cjs.map +0 -1
- package/build/modern/types.d.cts +0 -7
- package/build/modern/types.d.ts +0 -7
- package/build/modern/types.js +0 -1
- package/build/modern/types.js.map +0 -1
- package/build/modern/useField.cjs +0 -88
- package/build/modern/useField.cjs.map +0 -1
- package/build/modern/useField.d.cts +0 -27
- package/build/modern/useField.d.ts +0 -27
- package/build/modern/useField.js +0 -52
- package/build/modern/useField.js.map +0 -1
- package/build/modern/useForm.cjs +0 -73
- package/build/modern/useForm.cjs.map +0 -1
- package/build/modern/useForm.d.cts +0 -23
- package/build/modern/useForm.d.ts +0 -23
- package/build/modern/useForm.js +0 -38
- package/build/modern/useForm.js.map +0 -1
- package/build/modern/useIsomorphicLayoutEffect.cjs +0 -35
- package/build/modern/useIsomorphicLayoutEffect.cjs.map +0 -1
- package/build/modern/useIsomorphicLayoutEffect.d.cts +0 -5
- package/build/modern/useIsomorphicLayoutEffect.d.ts +0 -5
- package/build/modern/useIsomorphicLayoutEffect.js +0 -10
- 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 {
|
|
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'
|
|
@@ -43,19 +43,23 @@ it('should type onChange properly', () => {
|
|
|
43
43
|
<form.Provider>
|
|
44
44
|
<form.Field
|
|
45
45
|
name="firstName"
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
46
|
+
validators={{
|
|
47
|
+
onChange: ({ value }) => {
|
|
48
|
+
assertType<'test'>(value)
|
|
49
|
+
return null
|
|
50
|
+
},
|
|
49
51
|
}}
|
|
50
|
-
children={(
|
|
52
|
+
children={() => null}
|
|
51
53
|
/>
|
|
52
54
|
<form.Field
|
|
53
55
|
name="age"
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
56
|
+
validators={{
|
|
57
|
+
onChange: ({ value }) => {
|
|
58
|
+
assertType<84>(value)
|
|
59
|
+
return null
|
|
60
|
+
},
|
|
57
61
|
}}
|
|
58
|
-
children={(
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
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
|
|
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
|
-
|
|
243
|
-
|
|
244
|
-
|
|
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
|
|
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
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
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
|
|
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
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
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
|
|
383
|
-
let form: FormApi<Person
|
|
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
|
|
421
|
-
let form: FormApi<Person
|
|
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
|
|
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
|
|
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: (
|
|
94
|
-
setSubmittedData(
|
|
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
|
-
|
|
139
|
-
|
|
140
|
-
|
|
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
|
|
171
|
+
const formFactory = createFormFactory<Person>()
|
|
170
172
|
|
|
171
173
|
function Comp() {
|
|
172
174
|
const form = formFactory.useForm({
|
|
173
|
-
|
|
174
|
-
|
|
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
|
-
<
|
|
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
|
|
216
|
+
const formFactory = createFormFactory<Person>()
|
|
214
217
|
|
|
215
218
|
function Comp() {
|
|
216
219
|
const form = formFactory.useForm({
|
|
217
|
-
|
|
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
|
|
261
|
+
const formFactory = createFormFactory<Person>()
|
|
256
262
|
|
|
257
263
|
function Comp() {
|
|
258
264
|
const form = formFactory.useForm({
|
|
259
|
-
|
|
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
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
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
|
|
361
|
+
const formFactory = createFormFactory<Person>()
|
|
351
362
|
|
|
352
363
|
function Comp() {
|
|
353
364
|
const form = formFactory.useForm({
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
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
|
|
411
|
+
const formFactory = createFormFactory<Person>()
|
|
399
412
|
|
|
400
413
|
function Comp() {
|
|
401
414
|
const form = formFactory.useForm({
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
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
|
|
471
|
+
const formFactory = createFormFactory<Person>()
|
|
457
472
|
|
|
458
473
|
function Comp() {
|
|
459
474
|
const form = formFactory.useForm({
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
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 {
|
|
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
|
-
|
|
7
|
-
|
|
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,
|
|
18
|
+
> = FieldOptions<TParentData, TName, TFieldValidator, TFormValidator, TData> & {
|
|
10
19
|
mode?: 'value' | 'array'
|
|
11
20
|
}
|