@octanejs/tanstack-form 0.0.1

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.
@@ -0,0 +1,656 @@
1
+ import { useMemo, useState } from 'octane';
2
+ import { useSelector } from '@octanejs/tanstack-store';
3
+ import { FieldApi, functionalUpdate } from '@tanstack/form-core';
4
+ import { useIsomorphicLayoutEffect } from './useIsomorphicLayoutEffect';
5
+ import type {
6
+ AnyFieldApi,
7
+ AnyFieldMeta,
8
+ DeepKeys,
9
+ DeepValue,
10
+ FieldAsyncValidateOrFn,
11
+ FieldValidateOrFn,
12
+ FieldValidators,
13
+ FormAsyncValidateOrFn,
14
+ FormValidateOrFn,
15
+ } from '@tanstack/form-core';
16
+ import type { UseFieldOptions, UseFieldOptionsBound } from './types';
17
+
18
+ type FieldRenderable = unknown;
19
+ type FieldFunctionComponent<P = object> = (props: P) => FieldRenderable;
20
+
21
+ /**
22
+ * A type representing a hook for using a field in a form with the given form data type.
23
+ *
24
+ * A function that takes an optional object with a `name` property and field options, and returns a `FieldApi` instance for the specified field.
25
+ */
26
+ export type UseField<
27
+ TParentData,
28
+ TFormOnMount extends undefined | FormValidateOrFn<TParentData>,
29
+ TFormOnChange extends undefined | FormValidateOrFn<TParentData>,
30
+ TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
31
+ TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,
32
+ TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
33
+ TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,
34
+ TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
35
+ TFormOnDynamic extends undefined | FormValidateOrFn<TParentData>,
36
+ TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
37
+ TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>,
38
+ TPatentSubmitMeta,
39
+ > = <
40
+ TName extends DeepKeys<TParentData>,
41
+ TData extends DeepValue<TParentData, TName>,
42
+ TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
43
+ TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
44
+ TOnChangeAsync extends undefined | FieldAsyncValidateOrFn<TParentData, TName, TData>,
45
+ TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
46
+ TOnBlurAsync extends undefined | FieldAsyncValidateOrFn<TParentData, TName, TData>,
47
+ TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
48
+ TOnSubmitAsync extends undefined | FieldAsyncValidateOrFn<TParentData, TName, TData>,
49
+ TOnDynamic extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
50
+ TOnDynamicAsync extends undefined | FieldAsyncValidateOrFn<TParentData, TName, TData>,
51
+ >(
52
+ opts: UseFieldOptionsBound<
53
+ TParentData,
54
+ TName,
55
+ TData,
56
+ TOnMount,
57
+ TOnChange,
58
+ TOnChangeAsync,
59
+ TOnBlur,
60
+ TOnBlurAsync,
61
+ TOnSubmit,
62
+ TOnSubmitAsync,
63
+ TOnDynamic,
64
+ TOnDynamicAsync
65
+ >,
66
+ ) => FieldApi<
67
+ TParentData,
68
+ TName,
69
+ TData,
70
+ TOnMount,
71
+ TOnChange,
72
+ TOnChangeAsync,
73
+ TOnBlur,
74
+ TOnBlurAsync,
75
+ TOnSubmit,
76
+ TOnSubmitAsync,
77
+ TOnDynamic,
78
+ TOnDynamicAsync,
79
+ TFormOnMount,
80
+ TFormOnChange,
81
+ TFormOnChangeAsync,
82
+ TFormOnBlur,
83
+ TFormOnBlurAsync,
84
+ TFormOnSubmit,
85
+ TFormOnSubmitAsync,
86
+ TFormOnDynamic,
87
+ TFormOnDynamicAsync,
88
+ TFormOnServer,
89
+ TPatentSubmitMeta
90
+ >;
91
+
92
+ /**
93
+ * A hook for managing a field in a form.
94
+ * @param opts An object with field options.
95
+ *
96
+ * @returns The `FieldApi` instance for the specified field.
97
+ */
98
+ export function useField<
99
+ TParentData,
100
+ TName extends DeepKeys<TParentData>,
101
+ TData extends DeepValue<TParentData, TName>,
102
+ TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
103
+ TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
104
+ TOnChangeAsync extends undefined | FieldAsyncValidateOrFn<TParentData, TName, TData>,
105
+ TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
106
+ TOnBlurAsync extends undefined | FieldAsyncValidateOrFn<TParentData, TName, TData>,
107
+ TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
108
+ TOnSubmitAsync extends undefined | FieldAsyncValidateOrFn<TParentData, TName, TData>,
109
+ TOnDynamic extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
110
+ TOnDynamicAsync extends undefined | FieldAsyncValidateOrFn<TParentData, TName, TData>,
111
+ TFormOnMount extends undefined | FormValidateOrFn<TParentData>,
112
+ TFormOnChange extends undefined | FormValidateOrFn<TParentData>,
113
+ TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
114
+ TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,
115
+ TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
116
+ TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,
117
+ TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
118
+ TFormOnDynamic extends undefined | FormValidateOrFn<TParentData>,
119
+ TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
120
+ TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>,
121
+ TPatentSubmitMeta,
122
+ >(
123
+ opts: UseFieldOptions<
124
+ TParentData,
125
+ TName,
126
+ TData,
127
+ TOnMount,
128
+ TOnChange,
129
+ TOnChangeAsync,
130
+ TOnBlur,
131
+ TOnBlurAsync,
132
+ TOnSubmit,
133
+ TOnSubmitAsync,
134
+ TOnDynamic,
135
+ TOnDynamicAsync,
136
+ TFormOnMount,
137
+ TFormOnChange,
138
+ TFormOnChangeAsync,
139
+ TFormOnBlur,
140
+ TFormOnBlurAsync,
141
+ TFormOnSubmit,
142
+ TFormOnSubmitAsync,
143
+ TFormOnDynamic,
144
+ TFormOnDynamicAsync,
145
+ TFormOnServer,
146
+ TPatentSubmitMeta
147
+ >,
148
+ ) {
149
+ // Keep a snapshot of options so compiler optimizations do not treat
150
+ // fieldApi as immutable.
151
+ const [prevOptions, setPrevOptions] = useState(() => ({
152
+ form: opts.form,
153
+ name: opts.name,
154
+ }));
155
+
156
+ const [fieldApiState, setFieldApi] = useState(() => {
157
+ return new FieldApi({
158
+ ...opts,
159
+ });
160
+ });
161
+
162
+ let fieldApi = fieldApiState;
163
+
164
+ // We only want to
165
+ // update on name changes since those are at risk of becoming stale. The field
166
+ // state must be up to date for the internal JSX render.
167
+ // The other options can freely be in `fieldApi.update`
168
+ if (prevOptions.form !== opts.form || prevOptions.name !== opts.name) {
169
+ // Adjusting state during render: create the new FieldApi and use it for the
170
+ // rest of this render so the render prop reads state at the current `name`.
171
+ // Otherwise the discarded render still runs to completion with the stale
172
+ // instance, briefly surfacing `undefined` for shifted array items on removal.
173
+ // See: https://github.com/TanStack/form/issues/2238
174
+ fieldApi = new FieldApi({
175
+ ...opts,
176
+ });
177
+ setFieldApi(fieldApi);
178
+ setPrevOptions({ form: opts.form, name: opts.name });
179
+ }
180
+
181
+ // For array mode, only track length changes to avoid re-renders when child properties change
182
+ // See: https://github.com/TanStack/form/issues/1925
183
+ const reactiveStateValue = useSelector(
184
+ fieldApi.store,
185
+ (opts.mode === 'array' ? (state) => state.meta._arrayVersion || 0 : (state) => state.value) as (
186
+ state: typeof fieldApi.state,
187
+ ) => TData | number,
188
+ );
189
+ const reactiveMetaIsTouched = useSelector(fieldApi.store, (state) => state.meta.isTouched);
190
+ const reactiveMetaIsBlurred = useSelector(fieldApi.store, (state) => state.meta.isBlurred);
191
+ const reactiveMetaIsDirty = useSelector(fieldApi.store, (state) => state.meta.isDirty);
192
+ const reactiveMetaErrorMap = useSelector(fieldApi.store, (state) => state.meta.errorMap);
193
+ const reactiveMetaErrorSourceMap = useSelector(
194
+ fieldApi.store,
195
+ (state) => state.meta.errorSourceMap,
196
+ );
197
+ const reactiveMetaIsValidating = useSelector(fieldApi.store, (state) => state.meta.isValidating);
198
+
199
+ // Materialize the reactive snapshots in the extended API returned to render callbacks.
200
+ const extendedFieldApi = useMemo(() => {
201
+ const reactiveFieldApi = {
202
+ ...fieldApi,
203
+ get state() {
204
+ return {
205
+ // For array mode, reactiveStateValue is the length (for reactivity tracking),
206
+ // so we need to get the actual value from fieldApi
207
+ value: opts.mode === 'array' ? fieldApi.state.value : reactiveStateValue,
208
+ get meta() {
209
+ return {
210
+ ...fieldApi.state.meta,
211
+ isTouched: reactiveMetaIsTouched,
212
+ isBlurred: reactiveMetaIsBlurred,
213
+ isDirty: reactiveMetaIsDirty,
214
+ errorMap: reactiveMetaErrorMap,
215
+ errorSourceMap: reactiveMetaErrorSourceMap,
216
+ isValidating: reactiveMetaIsValidating,
217
+ } satisfies AnyFieldMeta;
218
+ },
219
+ } satisfies AnyFieldApi['state'];
220
+ },
221
+ };
222
+
223
+ const extendedApi: FieldApi<
224
+ TParentData,
225
+ TName,
226
+ TData,
227
+ TOnMount,
228
+ TOnChange,
229
+ TOnChangeAsync,
230
+ TOnBlur,
231
+ TOnBlurAsync,
232
+ TOnSubmit,
233
+ TOnSubmitAsync,
234
+ TOnDynamic,
235
+ TOnDynamicAsync,
236
+ TFormOnMount,
237
+ TFormOnChange,
238
+ TFormOnChangeAsync,
239
+ TFormOnBlur,
240
+ TFormOnBlurAsync,
241
+ TFormOnSubmit,
242
+ TFormOnSubmitAsync,
243
+ TFormOnDynamic,
244
+ TFormOnDynamicAsync,
245
+ TFormOnServer,
246
+ TPatentSubmitMeta
247
+ > = reactiveFieldApi as never;
248
+
249
+ return extendedApi;
250
+ }, [
251
+ fieldApi,
252
+ opts.mode,
253
+ reactiveStateValue,
254
+ reactiveMetaIsTouched,
255
+ reactiveMetaIsBlurred,
256
+ reactiveMetaIsDirty,
257
+ reactiveMetaErrorMap,
258
+ reactiveMetaErrorSourceMap,
259
+ reactiveMetaIsValidating,
260
+ ]);
261
+
262
+ useIsomorphicLayoutEffect(fieldApi.mount, [fieldApi]);
263
+
264
+ /**
265
+ * fieldApi.update should not have any side effects. Think of it like a `useRef`
266
+ * that we need to keep updated every render with the most up-to-date information.
267
+ */
268
+ useIsomorphicLayoutEffect(() => {
269
+ fieldApi.update(opts);
270
+ });
271
+
272
+ return extendedFieldApi;
273
+ }
274
+
275
+ /**
276
+ * @param children A render function that takes a field API instance and returns a renderable value.
277
+ */
278
+ interface FieldComponentProps<
279
+ TParentData,
280
+ TName extends DeepKeys<TParentData>,
281
+ TData extends DeepValue<TParentData, TName>,
282
+ TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
283
+ TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
284
+ TOnChangeAsync extends undefined | FieldAsyncValidateOrFn<TParentData, TName, TData>,
285
+ TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
286
+ TOnBlurAsync extends undefined | FieldAsyncValidateOrFn<TParentData, TName, TData>,
287
+ TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
288
+ TOnSubmitAsync extends undefined | FieldAsyncValidateOrFn<TParentData, TName, TData>,
289
+ TOnDynamic extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
290
+ TOnDynamicAsync extends undefined | FieldAsyncValidateOrFn<TParentData, TName, TData>,
291
+ TFormOnMount extends undefined | FormValidateOrFn<TParentData>,
292
+ TFormOnChange extends undefined | FormValidateOrFn<TParentData>,
293
+ TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
294
+ TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,
295
+ TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
296
+ TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,
297
+ TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
298
+ TFormOnDynamic extends undefined | FormValidateOrFn<TParentData>,
299
+ TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
300
+ TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>,
301
+ TPatentSubmitMeta,
302
+ ExtendedApi = {},
303
+ > extends UseFieldOptions<
304
+ TParentData,
305
+ TName,
306
+ TData,
307
+ TOnMount,
308
+ TOnChange,
309
+ TOnChangeAsync,
310
+ TOnBlur,
311
+ TOnBlurAsync,
312
+ TOnSubmit,
313
+ TOnSubmitAsync,
314
+ TOnDynamic,
315
+ TOnDynamicAsync,
316
+ TFormOnMount,
317
+ TFormOnChange,
318
+ TFormOnChangeAsync,
319
+ TFormOnBlur,
320
+ TFormOnBlurAsync,
321
+ TFormOnSubmit,
322
+ TFormOnSubmitAsync,
323
+ TFormOnDynamic,
324
+ TFormOnDynamicAsync,
325
+ TFormOnServer,
326
+ TPatentSubmitMeta
327
+ > {
328
+ children: (
329
+ fieldApi: FieldApi<
330
+ TParentData,
331
+ TName,
332
+ TData,
333
+ TOnMount,
334
+ TOnChange,
335
+ TOnChangeAsync,
336
+ TOnBlur,
337
+ TOnBlurAsync,
338
+ TOnSubmit,
339
+ TOnSubmitAsync,
340
+ TOnDynamic,
341
+ TOnDynamicAsync,
342
+ TFormOnMount,
343
+ TFormOnChange,
344
+ TFormOnChangeAsync,
345
+ TFormOnBlur,
346
+ TFormOnBlurAsync,
347
+ TFormOnSubmit,
348
+ TFormOnSubmitAsync,
349
+ TFormOnDynamic,
350
+ TFormOnDynamicAsync,
351
+ TFormOnServer,
352
+ TPatentSubmitMeta
353
+ > &
354
+ ExtendedApi,
355
+ ) => FieldRenderable;
356
+ }
357
+
358
+ interface FieldComponentBoundProps<
359
+ TParentData,
360
+ TName extends DeepKeys<TParentData>,
361
+ TData extends DeepValue<TParentData, TName>,
362
+ TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
363
+ TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
364
+ TOnChangeAsync extends undefined | FieldAsyncValidateOrFn<TParentData, TName, TData>,
365
+ TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
366
+ TOnBlurAsync extends undefined | FieldAsyncValidateOrFn<TParentData, TName, TData>,
367
+ TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
368
+ TOnSubmitAsync extends undefined | FieldAsyncValidateOrFn<TParentData, TName, TData>,
369
+ TOnDynamic extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
370
+ TOnDynamicAsync extends undefined | FieldAsyncValidateOrFn<TParentData, TName, TData>,
371
+ TFormOnMount extends undefined | FormValidateOrFn<TParentData>,
372
+ TFormOnChange extends undefined | FormValidateOrFn<TParentData>,
373
+ TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
374
+ TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,
375
+ TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
376
+ TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,
377
+ TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
378
+ TFormOnDynamic extends undefined | FormValidateOrFn<TParentData>,
379
+ TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
380
+ TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>,
381
+ TPatentSubmitMeta,
382
+ ExtendedApi = {},
383
+ > extends UseFieldOptionsBound<
384
+ TParentData,
385
+ TName,
386
+ TData,
387
+ TOnMount,
388
+ TOnChange,
389
+ TOnChangeAsync,
390
+ TOnBlur,
391
+ TOnBlurAsync,
392
+ TOnSubmit,
393
+ TOnSubmitAsync,
394
+ TOnDynamic,
395
+ TOnDynamicAsync
396
+ > {
397
+ children: (
398
+ fieldApi: FieldApi<
399
+ TParentData,
400
+ TName,
401
+ TData,
402
+ TOnMount,
403
+ TOnChange,
404
+ TOnChangeAsync,
405
+ TOnBlur,
406
+ TOnBlurAsync,
407
+ TOnSubmit,
408
+ TOnSubmitAsync,
409
+ TOnDynamic,
410
+ TOnDynamicAsync,
411
+ TFormOnMount,
412
+ TFormOnChange,
413
+ TFormOnChangeAsync,
414
+ TFormOnBlur,
415
+ TFormOnBlurAsync,
416
+ TFormOnSubmit,
417
+ TFormOnSubmitAsync,
418
+ TFormOnDynamic,
419
+ TFormOnDynamicAsync,
420
+ TFormOnServer,
421
+ TPatentSubmitMeta
422
+ > &
423
+ ExtendedApi,
424
+ ) => FieldRenderable;
425
+ }
426
+
427
+ /**
428
+ * A type alias representing a field component for a specific form data type.
429
+ */
430
+ export type FieldComponent<
431
+ in out TParentData,
432
+ in out TFormOnMount extends undefined | FormValidateOrFn<TParentData>,
433
+ in out TFormOnChange extends undefined | FormValidateOrFn<TParentData>,
434
+ in out TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
435
+ in out TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,
436
+ in out TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
437
+ in out TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,
438
+ in out TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
439
+ in out TFormOnDynamic extends undefined | FormValidateOrFn<TParentData>,
440
+ in out TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
441
+ in out TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>,
442
+ in out TPatentSubmitMeta,
443
+ in out ExtendedApi = {},
444
+ > = <
445
+ TName extends DeepKeys<TParentData>,
446
+ TData extends DeepValue<TParentData, TName>,
447
+ TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
448
+ TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
449
+ TOnChangeAsync extends undefined | FieldAsyncValidateOrFn<TParentData, TName, TData>,
450
+ TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
451
+ TOnBlurAsync extends undefined | FieldAsyncValidateOrFn<TParentData, TName, TData>,
452
+ TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
453
+ TOnSubmitAsync extends undefined | FieldAsyncValidateOrFn<TParentData, TName, TData>,
454
+ TOnDynamic extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
455
+ TOnDynamicAsync extends undefined | FieldAsyncValidateOrFn<TParentData, TName, TData>,
456
+ >({
457
+ children,
458
+ ...fieldOptions
459
+ }: FieldComponentBoundProps<
460
+ TParentData,
461
+ TName,
462
+ TData,
463
+ TOnMount,
464
+ TOnChange,
465
+ TOnChangeAsync,
466
+ TOnBlur,
467
+ TOnBlurAsync,
468
+ TOnSubmit,
469
+ TOnSubmitAsync,
470
+ TOnDynamic,
471
+ TOnDynamicAsync,
472
+ TFormOnMount,
473
+ TFormOnChange,
474
+ TFormOnChangeAsync,
475
+ TFormOnBlur,
476
+ TFormOnBlurAsync,
477
+ TFormOnSubmit,
478
+ TFormOnSubmitAsync,
479
+ TFormOnDynamic,
480
+ TFormOnDynamicAsync,
481
+ TFormOnServer,
482
+ TPatentSubmitMeta,
483
+ ExtendedApi
484
+ >) => ReturnType<FieldFunctionComponent>;
485
+
486
+ /**
487
+ * A type alias representing a field component for a form lens data type.
488
+ */
489
+ export type LensFieldComponent<
490
+ in out TLensData,
491
+ in out TParentSubmitMeta,
492
+ in out ExtendedApi = {},
493
+ > = <
494
+ TName extends DeepKeys<TLensData>,
495
+ TData extends DeepValue<TLensData, TName>,
496
+ TOnMount extends undefined | FieldValidateOrFn<unknown, string, TData>,
497
+ TOnChange extends undefined | FieldValidateOrFn<unknown, string, TData>,
498
+ TOnChangeAsync extends undefined | FieldAsyncValidateOrFn<unknown, string, TData>,
499
+ TOnBlur extends undefined | FieldValidateOrFn<unknown, string, TData>,
500
+ TOnBlurAsync extends undefined | FieldAsyncValidateOrFn<unknown, string, TData>,
501
+ TOnSubmit extends undefined | FieldValidateOrFn<unknown, string, TData>,
502
+ TOnSubmitAsync extends undefined | FieldAsyncValidateOrFn<unknown, string, TData>,
503
+ TOnDynamic extends undefined | FieldValidateOrFn<unknown, string, TData>,
504
+ TOnDynamicAsync extends undefined | FieldAsyncValidateOrFn<unknown, string, TData>,
505
+ >({
506
+ children,
507
+ ...fieldOptions
508
+ }: Omit<
509
+ FieldComponentBoundProps<
510
+ unknown,
511
+ string,
512
+ TData,
513
+ TOnMount,
514
+ TOnChange,
515
+ TOnChangeAsync,
516
+ TOnBlur,
517
+ TOnBlurAsync,
518
+ TOnSubmit,
519
+ TOnSubmitAsync,
520
+ TOnDynamic,
521
+ TOnDynamicAsync,
522
+ undefined | FormValidateOrFn<unknown>,
523
+ undefined | FormValidateOrFn<unknown>,
524
+ undefined | FormAsyncValidateOrFn<unknown>,
525
+ undefined | FormValidateOrFn<unknown>,
526
+ undefined | FormAsyncValidateOrFn<unknown>,
527
+ undefined | FormValidateOrFn<unknown>,
528
+ undefined | FormAsyncValidateOrFn<unknown>,
529
+ undefined | FormValidateOrFn<unknown>,
530
+ undefined | FormAsyncValidateOrFn<unknown>,
531
+ undefined | FormAsyncValidateOrFn<unknown>,
532
+ TParentSubmitMeta,
533
+ ExtendedApi
534
+ >,
535
+ 'name' | 'validators'
536
+ > & {
537
+ name: TName;
538
+ validators?: Omit<
539
+ FieldValidators<
540
+ unknown,
541
+ string,
542
+ TData,
543
+ TOnMount,
544
+ TOnChange,
545
+ TOnChangeAsync,
546
+ TOnBlur,
547
+ TOnBlurAsync,
548
+ TOnSubmit,
549
+ TOnSubmitAsync,
550
+ TOnDynamic,
551
+ TOnDynamicAsync
552
+ >,
553
+ 'onChangeListenTo' | 'onBlurListenTo'
554
+ > & {
555
+ /**
556
+ * An optional list of field names that should trigger this field's `onChange` and `onChangeAsync` events when its value changes
557
+ */
558
+ onChangeListenTo?: DeepKeys<TLensData>[];
559
+ /**
560
+ * An optional list of field names that should trigger this field's `onBlur` and `onBlurAsync` events when its value changes
561
+ */
562
+ onBlurListenTo?: DeepKeys<TLensData>[];
563
+ };
564
+ }) => ReturnType<FieldFunctionComponent>;
565
+
566
+ /**
567
+ * A function component that takes field options and a render function as children.
568
+ *
569
+ * The `Field` component uses the `useField` hook internally to manage the field instance.
570
+ */
571
+ export const Field = (<
572
+ TParentData,
573
+ TName extends DeepKeys<TParentData>,
574
+ TData extends DeepValue<TParentData, TName>,
575
+ TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
576
+ TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
577
+ TOnChangeAsync extends undefined | FieldAsyncValidateOrFn<TParentData, TName, TData>,
578
+ TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
579
+ TOnBlurAsync extends undefined | FieldAsyncValidateOrFn<TParentData, TName, TData>,
580
+ TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
581
+ TOnSubmitAsync extends undefined | FieldAsyncValidateOrFn<TParentData, TName, TData>,
582
+ TOnDynamic extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
583
+ TOnDynamicAsync extends undefined | FieldAsyncValidateOrFn<TParentData, TName, TData>,
584
+ TFormOnMount extends undefined | FormValidateOrFn<TParentData>,
585
+ TFormOnChange extends undefined | FormValidateOrFn<TParentData>,
586
+ TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
587
+ TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,
588
+ TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
589
+ TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,
590
+ TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
591
+ TFormOnDynamic extends undefined | FormValidateOrFn<TParentData>,
592
+ TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
593
+ TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>,
594
+ TPatentSubmitMeta,
595
+ >({
596
+ children,
597
+ ...fieldOptions
598
+ }: FieldComponentProps<
599
+ TParentData,
600
+ TName,
601
+ TData,
602
+ TOnMount,
603
+ TOnChange,
604
+ TOnChangeAsync,
605
+ TOnBlur,
606
+ TOnBlurAsync,
607
+ TOnSubmit,
608
+ TOnSubmitAsync,
609
+ TOnDynamic,
610
+ TOnDynamicAsync,
611
+ TFormOnMount,
612
+ TFormOnChange,
613
+ TFormOnChangeAsync,
614
+ TFormOnBlur,
615
+ TFormOnBlurAsync,
616
+ TFormOnSubmit,
617
+ TFormOnSubmitAsync,
618
+ TFormOnDynamic,
619
+ TFormOnDynamicAsync,
620
+ TFormOnServer,
621
+ TPatentSubmitMeta
622
+ >): ReturnType<FieldFunctionComponent> => {
623
+ const fieldApi = useField(fieldOptions as any);
624
+
625
+ const jsxToDisplay = useMemo(
626
+ () => functionalUpdate(children, fieldApi as any),
627
+ [children, fieldApi],
628
+ );
629
+ return (<>{jsxToDisplay}</>) as never;
630
+ }) satisfies FieldFunctionComponent<
631
+ FieldComponentProps<
632
+ any,
633
+ any,
634
+ any,
635
+ any,
636
+ any,
637
+ any,
638
+ any,
639
+ any,
640
+ any,
641
+ any,
642
+ any,
643
+ any,
644
+ any,
645
+ any,
646
+ any,
647
+ any,
648
+ any,
649
+ any,
650
+ any,
651
+ any,
652
+ any,
653
+ any,
654
+ any
655
+ >
656
+ >;