@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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tanstack/react-form",
3
- "version": "0.19.2",
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.2"
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
  })