@tanstack/react-form 0.19.2 → 0.19.4
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/package.json +2 -2
- package/src/tests/useField.test.tsx +83 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tanstack/react-form",
|
|
3
|
-
"version": "0.19.
|
|
3
|
+
"version": "0.19.4",
|
|
4
4
|
"description": "Powerful, type-safe forms for React.",
|
|
5
5
|
"author": "tannerlinsley",
|
|
6
6
|
"license": "MIT",
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
"@tanstack/react-store": "^0.3.1",
|
|
44
44
|
"decode-formdata": "^0.4.0",
|
|
45
45
|
"rehackt": "^0.0.3",
|
|
46
|
-
"@tanstack/form-core": "0.19.
|
|
46
|
+
"@tanstack/form-core": "0.19.4"
|
|
47
47
|
},
|
|
48
48
|
"peerDependencies": {
|
|
49
49
|
"react": "^17.0.0 || ^18.0.0"
|
|
@@ -874,4 +874,87 @@ describe('useField', () => {
|
|
|
874
874
|
await user.type(confirmPasswordInput, '1')
|
|
875
875
|
expect(await findByText('Passwords do not match')).toBeInTheDocument()
|
|
876
876
|
})
|
|
877
|
+
|
|
878
|
+
it('should handle deeply nested values in StrictMode', async () => {
|
|
879
|
+
function Comp() {
|
|
880
|
+
const form = useForm({
|
|
881
|
+
defaultValues: {
|
|
882
|
+
name: { first: 'Test', last: 'User' },
|
|
883
|
+
},
|
|
884
|
+
})
|
|
885
|
+
|
|
886
|
+
return (
|
|
887
|
+
<form.Field
|
|
888
|
+
name="name.last"
|
|
889
|
+
children={(field) => <p>{field.state.value ?? ''}</p>}
|
|
890
|
+
/>
|
|
891
|
+
)
|
|
892
|
+
}
|
|
893
|
+
|
|
894
|
+
const { queryByText, findByText } = render(
|
|
895
|
+
<React.StrictMode>
|
|
896
|
+
<Comp />
|
|
897
|
+
</React.StrictMode>,
|
|
898
|
+
)
|
|
899
|
+
|
|
900
|
+
expect(queryByText('Test')).not.toBeInTheDocument()
|
|
901
|
+
expect(await findByText('User')).toBeInTheDocument()
|
|
902
|
+
})
|
|
903
|
+
|
|
904
|
+
it('should validate async on submit without debounce', async () => {
|
|
905
|
+
type Person = {
|
|
906
|
+
firstName: string
|
|
907
|
+
lastName: string
|
|
908
|
+
}
|
|
909
|
+
const mockFn = vi.fn()
|
|
910
|
+
const error = 'Please enter a different value'
|
|
911
|
+
const formFactory = createFormFactory<Person>()
|
|
912
|
+
|
|
913
|
+
function Comp() {
|
|
914
|
+
const form = formFactory.useForm({
|
|
915
|
+
defaultValues: {
|
|
916
|
+
firstName: '',
|
|
917
|
+
lastName: '',
|
|
918
|
+
},
|
|
919
|
+
validators: {
|
|
920
|
+
onChangeAsyncDebounceMs: 1000000,
|
|
921
|
+
onChangeAsync: async () => {
|
|
922
|
+
mockFn()
|
|
923
|
+
await sleep(10)
|
|
924
|
+
return error
|
|
925
|
+
},
|
|
926
|
+
},
|
|
927
|
+
})
|
|
928
|
+
const errors = form.useStore((s) => s.errors)
|
|
929
|
+
|
|
930
|
+
return (
|
|
931
|
+
<>
|
|
932
|
+
<form.Field
|
|
933
|
+
name="firstName"
|
|
934
|
+
defaultMeta={{ isTouched: true }}
|
|
935
|
+
children={(field) => (
|
|
936
|
+
<div>
|
|
937
|
+
<input
|
|
938
|
+
data-testid="fieldinput"
|
|
939
|
+
name={field.name}
|
|
940
|
+
value={field.state.value}
|
|
941
|
+
onBlur={field.handleBlur}
|
|
942
|
+
onChange={(e) => field.handleChange(e.target.value)}
|
|
943
|
+
/>
|
|
944
|
+
<p>{errors}</p>
|
|
945
|
+
</div>
|
|
946
|
+
)}
|
|
947
|
+
/>
|
|
948
|
+
<button onClick={form.handleSubmit}>Submit</button>
|
|
949
|
+
</>
|
|
950
|
+
)
|
|
951
|
+
}
|
|
952
|
+
|
|
953
|
+
const { getByRole, getByText } = render(<Comp />)
|
|
954
|
+
await user.click(getByRole('button', { name: 'Submit' }))
|
|
955
|
+
|
|
956
|
+
expect(mockFn).toHaveBeenCalledTimes(1)
|
|
957
|
+
await waitFor(() => getByText(error))
|
|
958
|
+
expect(getByText(error)).toBeInTheDocument()
|
|
959
|
+
})
|
|
877
960
|
})
|