@@ -134,7 +134,9 @@ type FormBuilderRegisterFn<T> = {
134134*/
135135export function createFormBuilder < TFieldValues extends FieldValues > (
136136 methods : UseFormReturn < TFieldValues > ,
137- path : string [ ]
137+ path : string [ ] ,
138+ // Set if created in $useFieldArray()
139+ key ?: string ,
138140) : FormBuilder < TFieldValues > {
139141 const currentPath = path . join ( "." ) as FieldPath < TFieldValues > ;
140142 // Cache generated functions to stabilize references across re-renders.
@@ -160,14 +162,23 @@ export function createFormBuilder<TFieldValues extends FieldValues>(
160162 // Called when used with `String(...)`.
161163 useCached = ( ) => currentPath ;
162164 break ;
165+ case "$key" :
166+ return key ?? currentPath ;
163167 case "$useFieldArray" :
164- useCached = ( props ?: $UseFieldArrayProps < never > ) =>
165- useFieldArray ( {
168+ useCached = ( props ?: $UseFieldArrayProps < never > ) => {
169+ const { fields , ... rest } = useFieldArray ( {
166170 name : currentPath as FieldArrayPath < TFieldValues > ,
167- keyName : "key" as const ,
171+ keyName : "$ key" as const ,
168172 control,
169173 ...props ,
170174 } ) ;
175+ return {
176+ fields : fields . map (
177+ ( { $key } , i ) => createFormBuilder ( methods , [ ...path , i . toString ( ) ] , $key )
178+ ) ,
179+ ...rest
180+ } ;
181+ }
171182 break ;
172183 case "$useController" :
173184 useCached = (
@@ -331,10 +342,12 @@ interface $UseFieldArrayProps<T> {
331342 shouldUnregister ?: boolean ;
332343}
333344
334- type $UseFieldArrayReturn < T > = UseFieldArrayReturn <
345+ type $UseFieldArrayReturn < T > = Omit < UseFieldArrayReturn <
335346 { __ : T [ ] } ,
336347 T extends Primitive | BrowserNativeObject ? never : "__"
337- > ;
348+ > , "fields" > & {
349+ fields : ( FormBuilder < T > & { $key : string } ) [ ] ;
350+ } ;
338351
339352export type UseFormBuilderProps <
340353 TFieldValues extends FieldValues = FieldValues ,
0 commit comments