@@ -60,7 +60,8 @@ export function getDefaultFormState(
60
60
formData : SchemaValue | undefined = undefined ,
61
61
rootSchema : Schema = { } ,
62
62
includeUndefinedValues : boolean | "excludeObjectChildren" = false ,
63
- experimental_defaultFormStateBehavior : Experimental_DefaultFormStateBehavior = { }
63
+ experimental_defaultFormStateBehavior : Experimental_DefaultFormStateBehavior = { } ,
64
+ initialDefaultsGenerated = false
64
65
) : SchemaValue | undefined {
65
66
const schema = retrieveSchema (
66
67
validator ,
@@ -82,6 +83,7 @@ export function getDefaultFormState(
82
83
isSchemaRoot : true ,
83
84
stack : new Set < string > ( ) ,
84
85
shouldMergeDefaultsIntoFormData : true ,
86
+ initialDefaultsGenerated,
85
87
} ) ;
86
88
87
89
// WARN: How about fixed arrays?
@@ -210,6 +212,8 @@ interface ComputeDefaultsProps<FormData = SchemaValue | undefined> {
210
212
* The formData should take precedence unless it's not valid. This is useful when for example the value from formData does not exist in the schema 'enum' property, in such cases we take the value from the defaults because the value from the formData is not valid.
211
213
*/
212
214
shouldMergeDefaultsIntoFormData : boolean ;
215
+ /** Indicates whether initial defaults have been generated */
216
+ initialDefaultsGenerated : boolean ;
213
217
}
214
218
215
219
export function computeDefaults (
@@ -228,6 +232,7 @@ export function computeDefaults(
228
232
required,
229
233
isSchemaRoot,
230
234
shouldMergeDefaultsIntoFormData,
235
+ initialDefaultsGenerated,
231
236
} = computeDefaultsProps ;
232
237
const rawDataIsObject = isSchemaObjectValue ( rawFormData ) ;
233
238
const formData : SchemaObjectValue = rawDataIsObject ? rawFormData : { } ;
@@ -328,6 +333,8 @@ export function computeDefaults(
328
333
required,
329
334
isSchemaRoot : false ,
330
335
shouldMergeDefaultsIntoFormData,
336
+ // CHANGED: this property is not provided in the original code
337
+ initialDefaultsGenerated,
331
338
} )
332
339
) ;
333
340
} else if ( schemaOneOf !== undefined ) {
@@ -402,6 +409,7 @@ export function computeDefaults(
402
409
rawFormData : rawFormData ?? schemaToComputeFormData ,
403
410
required,
404
411
shouldMergeDefaultsIntoFormData,
412
+ initialDefaultsGenerated,
405
413
} ) ;
406
414
}
407
415
@@ -655,6 +663,7 @@ export function getObjectDefaults(
655
663
isSchemaRoot,
656
664
rawFormData : formData ,
657
665
shouldMergeDefaultsIntoFormData,
666
+ initialDefaultsGenerated,
658
667
} : ComputeDefaultsProps < SchemaObjectValue > ,
659
668
defaults : SchemaValue | undefined
660
669
) : SchemaObjectValue | null {
@@ -688,6 +697,7 @@ export function getObjectDefaults(
688
697
required : retrievedSchemaRequired . has ( key ) ,
689
698
isSchemaRoot : false ,
690
699
shouldMergeDefaultsIntoFormData,
700
+ initialDefaultsGenerated,
691
701
} ) ;
692
702
const isConst =
693
703
( value . const !== undefined || parentConstObject [ key ] !== undefined ) &&
@@ -706,7 +716,7 @@ export function getObjectDefaults(
706
716
}
707
717
}
708
718
const schemaAdditionalProperties = retrievedSchema . additionalProperties ;
709
- if ( schemaAdditionalProperties !== undefined ) {
719
+ if ( schemaAdditionalProperties !== undefined && ! initialDefaultsGenerated ) {
710
720
let keys = new Set (
711
721
isSchemaObjectValue ( defaults )
712
722
? schemaProperties === undefined
@@ -740,6 +750,7 @@ export function getObjectDefaults(
740
750
required : retrievedSchemaRequired . has ( key ) ,
741
751
isSchemaRoot,
742
752
shouldMergeDefaultsIntoFormData,
753
+ initialDefaultsGenerated,
743
754
}
744
755
) ;
745
756
// Since these are additional properties we don't need to add the `experimental_defaultFormStateBehavior` prop
@@ -773,6 +784,7 @@ export function getArrayDefaults(
773
784
experimental_defaultFormStateBehavior,
774
785
required,
775
786
shouldMergeDefaultsIntoFormData,
787
+ initialDefaultsGenerated,
776
788
} : ComputeDefaultsProps ,
777
789
defaults : SchemaArrayValue | undefined
778
790
) : SchemaArrayValue | null | undefined {
@@ -813,6 +825,7 @@ export function getArrayDefaults(
813
825
rawFormData : undefined ,
814
826
isSchemaRoot : false ,
815
827
shouldMergeDefaultsIntoFormData,
828
+ initialDefaultsGenerated,
816
829
} ) ;
817
830
} ) ;
818
831
}
@@ -834,6 +847,7 @@ export function getArrayDefaults(
834
847
includeUndefinedValues : false ,
835
848
isSchemaRoot : false ,
836
849
shouldMergeDefaultsIntoFormData,
850
+ initialDefaultsGenerated,
837
851
} ) ;
838
852
} ) ;
839
853
// If the populate 'requiredOnly' flag is set then we only merge and include extra defaults if they are required.
@@ -894,6 +908,7 @@ export function getArrayDefaults(
894
908
isSchemaRoot : false ,
895
909
required,
896
910
shouldMergeDefaultsIntoFormData,
911
+ initialDefaultsGenerated,
897
912
} )
898
913
) ;
899
914
// then fill up the rest with either the item default or empty, up to minItems
0 commit comments