@tanstack/vue-form 1.33.3 → 2.0.0-alpha.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 (93) hide show
  1. package/README.md +15 -1
  2. package/dist/AppForm/Components.lib.js +16 -0
  3. package/dist/AppForm/VueAppFormApi.public.d.ts +14 -0
  4. package/dist/AppForm/appFormOptions.public.d.ts +14 -0
  5. package/dist/AppForm/componentMap.public.d.ts +10 -0
  6. package/dist/AppForm/contexts.lib.js +18 -0
  7. package/dist/AppForm/createFormHook.public.d.ts +6 -0
  8. package/dist/AppForm/createFormHook.public.js +24 -0
  9. package/dist/AppForm/createFormHookTypes.public.d.ts +15 -0
  10. package/dist/AppForm/fieldComponentHelpers.lib.js +22 -0
  11. package/dist/AppForm/getFormHookHelpers.public.d.ts +37 -0
  12. package/dist/AppForm/getFormHookHelpers.public.js +18 -0
  13. package/dist/AppForm/initializeAppForm.lib.js +10 -0
  14. package/dist/FieldGroup/FieldGroupApi.public.d.ts +30 -0
  15. package/dist/FieldGroup/withFields.lib.js +62 -0
  16. package/dist/FieldGroup/withFields.public.d.ts +57 -0
  17. package/dist/FieldGroup/withFields.public.js +8 -0
  18. package/dist/Subscribe.public.d.ts +15 -0
  19. package/dist/Subscribe.public.js +22 -0
  20. package/dist/VueForm/Components.lib.js +94 -0
  21. package/dist/VueForm/Components.public.d.ts +71 -0
  22. package/dist/VueForm/VueFormApi.lib.js +26 -0
  23. package/dist/VueForm/fieldSubscriptions.lib.js +34 -0
  24. package/dist/VueForm/formApiTypes.public.d.ts +10 -0
  25. package/dist/VueForm/formType.public.d.ts +9 -0
  26. package/dist/VueForm/useField.lib.js +44 -0
  27. package/dist/VueForm/useForm.public.d.ts +8 -0
  28. package/dist/VueForm/useForm.public.js +10 -0
  29. package/dist/index.d.ts +16 -0
  30. package/dist/index.js +11 -0
  31. package/dist/vueTypes.lib.d.ts +6 -0
  32. package/package.json +13 -29
  33. package/src/AppForm/Components.lib.ts +31 -0
  34. package/src/AppForm/VueAppFormApi.public.ts +17 -0
  35. package/src/AppForm/appFormOptions.public.ts +55 -0
  36. package/src/AppForm/componentMap.public.ts +19 -0
  37. package/src/AppForm/contexts.lib.ts +31 -0
  38. package/src/AppForm/createFormHook.public.ts +32 -0
  39. package/src/AppForm/createFormHookTypes.public.ts +28 -0
  40. package/src/AppForm/fieldComponentHelpers.lib.ts +21 -0
  41. package/src/AppForm/getFormHookHelpers.public.ts +109 -0
  42. package/src/AppForm/initializeAppForm.lib.ts +18 -0
  43. package/src/FieldGroup/FieldGroupApi.public.ts +148 -0
  44. package/src/FieldGroup/withFields.lib.ts +103 -0
  45. package/src/FieldGroup/withFields.public.ts +191 -0
  46. package/src/Subscribe.public.ts +46 -0
  47. package/src/VueForm/Components.lib.ts +182 -0
  48. package/src/VueForm/Components.public.ts +451 -0
  49. package/src/VueForm/VueFormApi.lib.ts +35 -0
  50. package/src/VueForm/fieldSubscriptions.lib.ts +47 -0
  51. package/src/VueForm/formApiTypes.public.ts +32 -0
  52. package/src/VueForm/formType.public.ts +46 -0
  53. package/src/VueForm/useField.lib.ts +64 -0
  54. package/src/VueForm/useForm.public.ts +30 -0
  55. package/src/index.ts +15 -4
  56. package/src/vueTypes.lib.ts +31 -0
  57. package/dist/cjs/index.cjs +0 -27
  58. package/dist/cjs/index.cjs.map +0 -1
  59. package/dist/cjs/index.d.cts +0 -5
  60. package/dist/cjs/types.d.cts +0 -9
  61. package/dist/cjs/useField.cjs +0 -106
  62. package/dist/cjs/useField.cjs.map +0 -1
  63. package/dist/cjs/useField.d.cts +0 -54
  64. package/dist/cjs/useForm.cjs +0 -62
  65. package/dist/cjs/useForm.cjs.map +0 -1
  66. package/dist/cjs/useForm.d.cts +0 -23
  67. package/dist/cjs/useFormGroup.cjs +0 -41
  68. package/dist/cjs/useFormGroup.cjs.map +0 -1
  69. package/dist/cjs/useFormGroup.d.cts +0 -37
  70. package/dist/cjs/useFormId.cjs +0 -31
  71. package/dist/cjs/useFormId.cjs.map +0 -1
  72. package/dist/cjs/useFormId.d.cts +0 -7
  73. package/dist/esm/index.d.ts +0 -5
  74. package/dist/esm/index.js +0 -15
  75. package/dist/esm/index.js.map +0 -1
  76. package/dist/esm/types.d.ts +0 -9
  77. package/dist/esm/useField.d.ts +0 -54
  78. package/dist/esm/useField.js +0 -106
  79. package/dist/esm/useField.js.map +0 -1
  80. package/dist/esm/useForm.d.ts +0 -23
  81. package/dist/esm/useForm.js +0 -62
  82. package/dist/esm/useForm.js.map +0 -1
  83. package/dist/esm/useFormGroup.d.ts +0 -37
  84. package/dist/esm/useFormGroup.js +0 -41
  85. package/dist/esm/useFormGroup.js.map +0 -1
  86. package/dist/esm/useFormId.d.ts +0 -7
  87. package/dist/esm/useFormId.js +0 -14
  88. package/dist/esm/useFormId.js.map +0 -1
  89. package/src/types.ts +0 -114
  90. package/src/useField.tsx +0 -550
  91. package/src/useForm.tsx +0 -360
  92. package/src/useFormGroup.tsx +0 -532
  93. package/src/useFormId.ts +0 -24
@@ -1 +0,0 @@
1
- {"version":3,"file":"useFormId.js","sources":["../../src/useFormId.ts"],"sourcesContent":["import * as Vue from 'vue'\nimport { uuid } from '@tanstack/form-core'\n\n/**\n * `useId` was added in vue@3.5, but this package supports `vue@^3.4.0`. It is\n * read off the namespace, typed as optional, rather than imported by name: a\n * named import would make bundlers fail to resolve it on 3.4.\n * Read more: https://github.com/webpack/webpack/issues/14814\n */\nconst vueUseId: { useId?: () => string } = Vue\n\n/**\n * Returns an SSR-safe id for the form, so the server-rendered markup and the\n * client hydration agree on it. Falls back to a random uuid when `useId` is\n * unavailable, or when called outside of a component instance, where `useId`\n * cannot produce a stable value.\n */\nexport function useFormId(): string {\n const useId = vueUseId.useId\n if (useId && Vue.getCurrentInstance()) {\n return useId()\n }\n return uuid()\n}\n"],"names":[],"mappings":";;AASA,MAAM,WAAqC;AAQpC,SAAS,YAAoB;AAClC,QAAM,QAAQ,SAAS;AACvB,MAAI,SAAS,IAAI,sBAAsB;AACrC,WAAO,MAAA;AAAA,EACT;AACA,SAAO,KAAA;AACT;"}
package/src/types.ts DELETED
@@ -1,114 +0,0 @@
1
- import type {
2
- DeepKeys,
3
- DeepValue,
4
- FieldApiOptions,
5
- FieldAsyncValidateOrFn,
6
- FieldOptions,
7
- FieldValidateOrFn,
8
- FormAsyncValidateOrFn,
9
- FormValidateOrFn,
10
- } from '@tanstack/form-core'
11
-
12
- interface FieldOptionsMode {
13
- mode?: 'value' | 'array'
14
- }
15
-
16
- export interface UseFieldOptions<
17
- TParentData,
18
- TName extends DeepKeys<TParentData>,
19
- TData extends DeepValue<TParentData, TName>,
20
- TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
21
- TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
22
- TOnChangeAsync extends
23
- | undefined
24
- | FieldAsyncValidateOrFn<TParentData, TName, TData>,
25
- TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
26
- TOnBlurAsync extends
27
- | undefined
28
- | FieldAsyncValidateOrFn<TParentData, TName, TData>,
29
- TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
30
- TOnSubmitAsync extends
31
- | undefined
32
- | FieldAsyncValidateOrFn<TParentData, TName, TData>,
33
- TOnDynamic extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
34
- TOnDynamicAsync extends
35
- | undefined
36
- | FieldAsyncValidateOrFn<TParentData, TName, TData>,
37
- TFormOnMount extends undefined | FormValidateOrFn<TParentData>,
38
- TFormOnChange extends undefined | FormValidateOrFn<TParentData>,
39
- TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
40
- TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,
41
- TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
42
- TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,
43
- TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
44
- TFormOnDynamic extends undefined | FormValidateOrFn<TParentData>,
45
- TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
46
- TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>,
47
- TSubmitMeta,
48
- >
49
- extends
50
- FieldApiOptions<
51
- TParentData,
52
- TName,
53
- TData,
54
- TOnMount,
55
- TOnChange,
56
- TOnChangeAsync,
57
- TOnBlur,
58
- TOnBlurAsync,
59
- TOnSubmit,
60
- TOnSubmitAsync,
61
- TOnDynamic,
62
- TOnDynamicAsync,
63
- TFormOnMount,
64
- TFormOnChange,
65
- TFormOnChangeAsync,
66
- TFormOnBlur,
67
- TFormOnBlurAsync,
68
- TFormOnSubmit,
69
- TFormOnSubmitAsync,
70
- TFormOnDynamic,
71
- TFormOnDynamicAsync,
72
- TFormOnServer,
73
- TSubmitMeta
74
- >,
75
- FieldOptionsMode {}
76
-
77
- export interface UseFieldOptionsBound<
78
- TParentData,
79
- TName extends DeepKeys<TParentData>,
80
- TData extends DeepValue<TParentData, TName>,
81
- TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
82
- TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
83
- TOnChangeAsync extends
84
- | undefined
85
- | FieldAsyncValidateOrFn<TParentData, TName, TData>,
86
- TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
87
- TOnBlurAsync extends
88
- | undefined
89
- | FieldAsyncValidateOrFn<TParentData, TName, TData>,
90
- TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
91
- TOnSubmitAsync extends
92
- | undefined
93
- | FieldAsyncValidateOrFn<TParentData, TName, TData>,
94
- TOnDynamic extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
95
- TOnDynamicAsync extends
96
- | undefined
97
- | FieldAsyncValidateOrFn<TParentData, TName, TData>,
98
- >
99
- extends
100
- FieldOptions<
101
- TParentData,
102
- TName,
103
- TData,
104
- TOnMount,
105
- TOnChange,
106
- TOnChangeAsync,
107
- TOnBlur,
108
- TOnBlurAsync,
109
- TOnSubmit,
110
- TOnSubmitAsync,
111
- TOnDynamic,
112
- TOnDynamicAsync
113
- >,
114
- FieldOptionsMode {}
package/src/useField.tsx DELETED
@@ -1,550 +0,0 @@
1
- import { FieldApi } from '@tanstack/form-core'
2
- import { useSelector } from '@tanstack/vue-store'
3
- import { computed, defineComponent, onMounted, onUnmounted, watch } from 'vue'
4
- import type {
5
- AnyFieldApi,
6
- AnyFieldMeta,
7
- DeepKeys,
8
- DeepValue,
9
- FieldAsyncValidateOrFn,
10
- FieldValidateOrFn,
11
- FormAsyncValidateOrFn,
12
- FormValidateOrFn,
13
- } from '@tanstack/form-core'
14
- import type {
15
- ComponentOptionsMixin,
16
- CreateComponentPublicInstanceWithMixins,
17
- EmitsOptions,
18
- EmitsToProps,
19
- PublicProps,
20
- SetupContext,
21
- SlotsType,
22
- } from 'vue'
23
- import type { UseFieldOptions, UseFieldOptionsBound } from './types'
24
-
25
- export type FieldComponent<
26
- TParentData,
27
- TFormOnMount extends undefined | FormValidateOrFn<TParentData>,
28
- TFormOnChange extends undefined | FormValidateOrFn<TParentData>,
29
- TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
30
- TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,
31
- TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
32
- TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,
33
- TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
34
- TFormOnDynamic extends undefined | FormValidateOrFn<TParentData>,
35
- TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
36
- TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>,
37
- TParentSubmitMeta,
38
- // This complex type comes from Vue's return type for `DefineSetupFnComponent` but with our own types sprinkled in
39
- // This allows us to pre-bind some generics while keeping the props type unbound generics for props-based inferencing
40
- > = new <
41
- TName extends DeepKeys<TParentData>,
42
- TData extends DeepValue<TParentData, TName>,
43
- TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
44
- TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
45
- TOnChangeAsync extends
46
- | undefined
47
- | FieldAsyncValidateOrFn<TParentData, TName, TData>,
48
- TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
49
- TOnBlurAsync extends
50
- | undefined
51
- | FieldAsyncValidateOrFn<TParentData, TName, TData>,
52
- TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
53
- TOnSubmitAsync extends
54
- | undefined
55
- | FieldAsyncValidateOrFn<TParentData, TName, TData>,
56
- TOnDynamic extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
57
- TOnDynamicAsync extends
58
- | undefined
59
- | FieldAsyncValidateOrFn<TParentData, TName, TData>,
60
- >(
61
- props: FieldComponentBoundProps<
62
- TParentData,
63
- TName,
64
- TData,
65
- TOnMount,
66
- TOnChange,
67
- TOnChangeAsync,
68
- TOnBlur,
69
- TOnBlurAsync,
70
- TOnSubmit,
71
- TOnSubmitAsync,
72
- TOnDynamic,
73
- TOnDynamicAsync
74
- > &
75
- EmitsToProps<EmitsOptions> &
76
- PublicProps,
77
- ) => CreateComponentPublicInstanceWithMixins<
78
- FieldComponentBoundProps<
79
- TParentData,
80
- TName,
81
- TData,
82
- TOnMount,
83
- TOnChange,
84
- TOnChangeAsync,
85
- TOnBlur,
86
- TOnBlurAsync,
87
- TOnSubmit,
88
- TOnSubmitAsync,
89
- TOnDynamic,
90
- TOnDynamicAsync
91
- >,
92
- {},
93
- {},
94
- {},
95
- {},
96
- ComponentOptionsMixin,
97
- ComponentOptionsMixin,
98
- EmitsOptions,
99
- PublicProps,
100
- {},
101
- false,
102
- {},
103
- SlotsType<{
104
- default: {
105
- field: FieldApi<
106
- TParentData,
107
- TName,
108
- TData,
109
- TOnMount,
110
- TOnChange,
111
- TOnChangeAsync,
112
- TOnBlur,
113
- TOnBlurAsync,
114
- TOnSubmit,
115
- TOnSubmitAsync,
116
- TOnDynamic,
117
- TOnDynamicAsync,
118
- TFormOnMount,
119
- TFormOnChange,
120
- TFormOnChangeAsync,
121
- TFormOnBlur,
122
- TFormOnBlurAsync,
123
- TFormOnSubmit,
124
- TFormOnSubmitAsync,
125
- TFormOnDynamic,
126
- TFormOnDynamicAsync,
127
- TFormOnServer,
128
- TParentSubmitMeta
129
- >
130
- state: FieldApi<
131
- TParentData,
132
- TName,
133
- TData,
134
- TOnMount,
135
- TOnChange,
136
- TOnChangeAsync,
137
- TOnBlur,
138
- TOnBlurAsync,
139
- TOnSubmit,
140
- TOnSubmitAsync,
141
- TOnDynamic,
142
- TOnDynamicAsync,
143
- TFormOnMount,
144
- TFormOnChange,
145
- TFormOnChangeAsync,
146
- TFormOnBlur,
147
- TFormOnBlurAsync,
148
- TFormOnSubmit,
149
- TFormOnSubmitAsync,
150
- TFormOnDynamic,
151
- TFormOnDynamicAsync,
152
- TFormOnServer,
153
- TParentSubmitMeta
154
- >['state']
155
- }
156
- }>
157
- >
158
-
159
- export interface VueFieldApi<
160
- TParentData,
161
- TFormOnMount extends undefined | FormValidateOrFn<TParentData>,
162
- TFormOnChange extends undefined | FormValidateOrFn<TParentData>,
163
- TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
164
- TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,
165
- TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
166
- TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,
167
- TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
168
- TFormOnDynamic extends undefined | FormValidateOrFn<TParentData>,
169
- TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
170
- TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>,
171
- TParentSubmitMeta,
172
- > {
173
- Field: FieldComponent<
174
- TParentData,
175
- TFormOnMount,
176
- TFormOnChange,
177
- TFormOnChangeAsync,
178
- TFormOnBlur,
179
- TFormOnBlurAsync,
180
- TFormOnSubmit,
181
- TFormOnSubmitAsync,
182
- TFormOnDynamic,
183
- TFormOnDynamicAsync,
184
- TFormOnServer,
185
- TParentSubmitMeta
186
- >
187
- }
188
-
189
- export function useField<
190
- TParentData,
191
- TName extends DeepKeys<TParentData>,
192
- TData extends DeepValue<TParentData, TName>,
193
- TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
194
- TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
195
- TOnChangeAsync extends
196
- | undefined
197
- | FieldAsyncValidateOrFn<TParentData, TName, TData>,
198
- TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
199
- TOnBlurAsync extends
200
- | undefined
201
- | FieldAsyncValidateOrFn<TParentData, TName, TData>,
202
- TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
203
- TOnSubmitAsync extends
204
- | undefined
205
- | FieldAsyncValidateOrFn<TParentData, TName, TData>,
206
- TOnDynamic extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
207
- TOnDynamicAsync extends
208
- | undefined
209
- | FieldAsyncValidateOrFn<TParentData, TName, TData>,
210
- TFormOnMount extends undefined | FormValidateOrFn<TParentData>,
211
- TFormOnChange extends undefined | FormValidateOrFn<TParentData>,
212
- TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
213
- TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,
214
- TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
215
- TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,
216
- TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
217
- TFormOnDynamic extends undefined | FormValidateOrFn<TParentData>,
218
- TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
219
- TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>,
220
- TParentSubmitMeta,
221
- >(
222
- opts: UseFieldOptions<
223
- TParentData,
224
- TName,
225
- TData,
226
- TOnMount,
227
- TOnChange,
228
- TOnChangeAsync,
229
- TOnBlur,
230
- TOnBlurAsync,
231
- TOnSubmit,
232
- TOnSubmitAsync,
233
- TOnDynamic,
234
- TOnDynamicAsync,
235
- TFormOnMount,
236
- TFormOnChange,
237
- TFormOnChangeAsync,
238
- TFormOnBlur,
239
- TFormOnBlurAsync,
240
- TFormOnSubmit,
241
- TFormOnSubmitAsync,
242
- TFormOnDynamic,
243
- TFormOnDynamicAsync,
244
- TFormOnServer,
245
- TParentSubmitMeta
246
- >,
247
- ) {
248
- const fieldApi = (() => {
249
- const api = new FieldApi({
250
- ...opts,
251
- form: opts.form,
252
- name: opts.name,
253
- })
254
-
255
- return api
256
- })()
257
-
258
- // For array mode, only track length changes to avoid re-renders when child properties change
259
- // See: https://github.com/TanStack/form/issues/1925
260
- const reactiveStateValue = useSelector(
261
- fieldApi.store,
262
- (opts.mode === 'array'
263
- ? (state) => state.meta._arrayVersion || 0
264
- : (state) => state.value) as (
265
- state: typeof fieldApi.state,
266
- ) => TData | number,
267
- )
268
- const reactiveMetaIsTouched = useSelector(
269
- fieldApi.store,
270
- (state) => state.meta.isTouched,
271
- )
272
- const reactiveMetaIsBlurred = useSelector(
273
- fieldApi.store,
274
- (state) => state.meta.isBlurred,
275
- )
276
- const reactiveMetaIsDirty = useSelector(
277
- fieldApi.store,
278
- (state) => state.meta.isDirty,
279
- )
280
- const reactiveMetaErrorMap = useSelector(
281
- fieldApi.store,
282
- (state) => state.meta.errorMap,
283
- )
284
- const reactiveMetaErrorSourceMap = useSelector(
285
- fieldApi.store,
286
- (state) => state.meta.errorSourceMap,
287
- )
288
- const reactiveMetaIsValidating = useSelector(
289
- fieldApi.store,
290
- (state) => state.meta.isValidating,
291
- )
292
-
293
- const fieldState = computed(() => {
294
- // For array mode, reactiveStateValue is the length (for reactivity tracking),
295
- // so we need to read it to register the dependency, then return the actual
296
- // value from fieldApi.
297
- const trackedValue = reactiveStateValue.value
298
- // Read all reactive meta refs eagerly so that fieldState recomputes (and
299
- // dependent renders re-run) whenever any of them change. Without this, a
300
- // consumer reading `field.getMeta()` or `field.state.meta` from a render
301
- // function would not re-render on meta updates, since the meta getter
302
- // would never have registered those dependencies.
303
- const isTouched = reactiveMetaIsTouched.value
304
- const isBlurred = reactiveMetaIsBlurred.value
305
- const isDirty = reactiveMetaIsDirty.value
306
- const errorMap = reactiveMetaErrorMap.value
307
- const errorSourceMap = reactiveMetaErrorSourceMap.value
308
- const isValidating = reactiveMetaIsValidating.value
309
- return {
310
- value:
311
- opts.mode === 'array' ? fieldApi.state.value : (trackedValue as TData),
312
- meta: {
313
- ...fieldApi.state.meta,
314
- isTouched,
315
- isBlurred,
316
- isDirty,
317
- errorMap,
318
- errorSourceMap,
319
- isValidating,
320
- } satisfies AnyFieldMeta,
321
- } satisfies AnyFieldApi['state']
322
- })
323
-
324
- const extendedFieldApi = computed(() => {
325
- const reactiveFieldApi = {
326
- ...fieldApi,
327
- get state() {
328
- return fieldState.value
329
- },
330
- }
331
-
332
- const extendedApi: FieldApi<
333
- TParentData,
334
- TName,
335
- TData,
336
- TOnMount,
337
- TOnChange,
338
- TOnChangeAsync,
339
- TOnBlur,
340
- TOnBlurAsync,
341
- TOnSubmit,
342
- TOnSubmitAsync,
343
- TOnDynamic,
344
- TOnDynamicAsync,
345
- TFormOnMount,
346
- TFormOnChange,
347
- TFormOnChangeAsync,
348
- TFormOnBlur,
349
- TFormOnBlurAsync,
350
- TFormOnSubmit,
351
- TFormOnSubmitAsync,
352
- TFormOnDynamic,
353
- TFormOnDynamicAsync,
354
- TFormOnServer,
355
- TParentSubmitMeta
356
- > = reactiveFieldApi as never
357
-
358
- return extendedApi
359
- })
360
-
361
- let cleanup!: () => void
362
- onMounted(() => {
363
- cleanup = fieldApi.mount()
364
- })
365
-
366
- onUnmounted(() => {
367
- cleanup()
368
- })
369
-
370
- watch(
371
- () => opts,
372
- () => {
373
- // Keep options up to date as they are rendered
374
- fieldApi.update({ ...opts, form: opts.form } as never)
375
- },
376
- )
377
-
378
- return {
379
- api: extendedFieldApi.value,
380
- get state() {
381
- return fieldState.value
382
- },
383
- } as const
384
- }
385
-
386
- export type FieldComponentProps<
387
- TParentData,
388
- TName extends DeepKeys<TParentData>,
389
- TData extends DeepValue<TParentData, TName>,
390
- TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
391
- TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
392
- TOnChangeAsync extends
393
- | undefined
394
- | FieldAsyncValidateOrFn<TParentData, TName, TData>,
395
- TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
396
- TOnBlurAsync extends
397
- | undefined
398
- | FieldAsyncValidateOrFn<TParentData, TName, TData>,
399
- TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
400
- TOnSubmitAsync extends
401
- | undefined
402
- | FieldAsyncValidateOrFn<TParentData, TName, TData>,
403
- TOnDynamic extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
404
- TOnDynamicAsync extends
405
- | undefined
406
- | FieldAsyncValidateOrFn<TParentData, TName, TData>,
407
- TFormOnMount extends undefined | FormValidateOrFn<TParentData>,
408
- TFormOnChange extends undefined | FormValidateOrFn<TParentData>,
409
- TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
410
- TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,
411
- TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
412
- TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,
413
- TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
414
- TFormOnDynamic extends undefined | FormValidateOrFn<TParentData>,
415
- TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
416
- TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>,
417
- TParentSubmitMeta,
418
- > = UseFieldOptions<
419
- TParentData,
420
- TName,
421
- TData,
422
- TOnMount,
423
- TOnChange,
424
- TOnChangeAsync,
425
- TOnBlur,
426
- TOnBlurAsync,
427
- TOnSubmit,
428
- TOnSubmitAsync,
429
- TOnDynamic,
430
- TOnDynamicAsync,
431
- TFormOnMount,
432
- TFormOnChange,
433
- TFormOnChangeAsync,
434
- TFormOnBlur,
435
- TFormOnBlurAsync,
436
- TFormOnSubmit,
437
- TFormOnSubmitAsync,
438
- TFormOnDynamic,
439
- TFormOnDynamicAsync,
440
- TFormOnServer,
441
- TParentSubmitMeta
442
- >
443
-
444
- export type FieldComponentBoundProps<
445
- TParentData,
446
- TName extends DeepKeys<TParentData>,
447
- TData extends DeepValue<TParentData, TName>,
448
- TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
449
- TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
450
- TOnChangeAsync extends
451
- | undefined
452
- | FieldAsyncValidateOrFn<TParentData, TName, TData>,
453
- TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
454
- TOnBlurAsync extends
455
- | undefined
456
- | FieldAsyncValidateOrFn<TParentData, TName, TData>,
457
- TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
458
- TOnSubmitAsync extends
459
- | undefined
460
- | FieldAsyncValidateOrFn<TParentData, TName, TData>,
461
- TOnDynamic extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
462
- TOnDynamicAsync extends
463
- | undefined
464
- | FieldAsyncValidateOrFn<TParentData, TName, TData>,
465
- > = UseFieldOptionsBound<
466
- TParentData,
467
- TName,
468
- TData,
469
- TOnMount,
470
- TOnChange,
471
- TOnChangeAsync,
472
- TOnBlur,
473
- TOnBlurAsync,
474
- TOnSubmit,
475
- TOnSubmitAsync,
476
- TOnDynamic,
477
- TOnDynamicAsync
478
- >
479
-
480
- export const Field = defineComponent(
481
- <
482
- TParentData,
483
- TName extends DeepKeys<TParentData>,
484
- TData extends DeepValue<TParentData, TName>,
485
- TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
486
- TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
487
- TOnChangeAsync extends
488
- | undefined
489
- | FieldAsyncValidateOrFn<TParentData, TName, TData>,
490
- TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
491
- TOnBlurAsync extends
492
- | undefined
493
- | FieldAsyncValidateOrFn<TParentData, TName, TData>,
494
- TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
495
- TOnSubmitAsync extends
496
- | undefined
497
- | FieldAsyncValidateOrFn<TParentData, TName, TData>,
498
- TOnDynamic extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
499
- TOnDynamicAsync extends
500
- | undefined
501
- | FieldAsyncValidateOrFn<TParentData, TName, TData>,
502
- TFormOnMount extends undefined | FormValidateOrFn<TParentData>,
503
- TFormOnChange extends undefined | FormValidateOrFn<TParentData>,
504
- TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
505
- TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,
506
- TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
507
- TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,
508
- TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
509
- TFormOnDynamic extends undefined | FormValidateOrFn<TParentData>,
510
- TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
511
- TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>,
512
- TParentSubmitMeta,
513
- >(
514
- fieldOptions: UseFieldOptions<
515
- TParentData,
516
- TName,
517
- TData,
518
- TOnMount,
519
- TOnChange,
520
- TOnChangeAsync,
521
- TOnBlur,
522
- TOnBlurAsync,
523
- TOnSubmit,
524
- TOnSubmitAsync,
525
- TOnDynamic,
526
- TOnDynamicAsync,
527
- TFormOnMount,
528
- TFormOnChange,
529
- TFormOnChangeAsync,
530
- TFormOnBlur,
531
- TFormOnBlurAsync,
532
- TFormOnSubmit,
533
- TFormOnSubmitAsync,
534
- TFormOnDynamic,
535
- TFormOnDynamicAsync,
536
- TFormOnServer,
537
- TParentSubmitMeta
538
- >,
539
- context: SetupContext,
540
- ) => {
541
- const fieldApi = useField({ ...fieldOptions, ...context.attrs })
542
-
543
- return () =>
544
- context.slots.default!({
545
- field: fieldApi.api,
546
- state: fieldApi.state,
547
- })
548
- },
549
- { name: 'Field', inheritAttrs: false },
550
- )