Skip to content

Commit cdedc62

Browse files
committed
[core] Add initialDefaultsGenerated option for getDefaultFormState function
1 parent 35dd9a4 commit cdedc62

File tree

2 files changed

+18
-2
lines changed

2 files changed

+18
-2
lines changed

packages/form/src/core/default-state.test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ const defaults = {
5353
experimental_defaultFormStateBehavior: {},
5454
rawFormData: undefined,
5555
shouldMergeDefaultsIntoFormData: false,
56+
initialDefaultsGenerated: false
5657
};
5758

5859
describe("getDefaultFormState()", () => {

packages/form/src/core/default-state.ts

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,8 @@ export function getDefaultFormState(
6060
formData: SchemaValue | undefined = undefined,
6161
rootSchema: Schema = {},
6262
includeUndefinedValues: boolean | "excludeObjectChildren" = false,
63-
experimental_defaultFormStateBehavior: Experimental_DefaultFormStateBehavior = {}
63+
experimental_defaultFormStateBehavior: Experimental_DefaultFormStateBehavior = {},
64+
initialDefaultsGenerated = false
6465
): SchemaValue | undefined {
6566
const schema = retrieveSchema(
6667
validator,
@@ -82,6 +83,7 @@ export function getDefaultFormState(
8283
isSchemaRoot: true,
8384
stack: new Set<string>(),
8485
shouldMergeDefaultsIntoFormData: true,
86+
initialDefaultsGenerated,
8587
});
8688

8789
// WARN: How about fixed arrays?
@@ -210,6 +212,8 @@ interface ComputeDefaultsProps<FormData = SchemaValue | undefined> {
210212
* 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.
211213
*/
212214
shouldMergeDefaultsIntoFormData: boolean;
215+
/** Indicates whether initial defaults have been generated */
216+
initialDefaultsGenerated: boolean;
213217
}
214218

215219
export function computeDefaults(
@@ -228,6 +232,7 @@ export function computeDefaults(
228232
required,
229233
isSchemaRoot,
230234
shouldMergeDefaultsIntoFormData,
235+
initialDefaultsGenerated,
231236
} = computeDefaultsProps;
232237
const rawDataIsObject = isSchemaObjectValue(rawFormData);
233238
const formData: SchemaObjectValue = rawDataIsObject ? rawFormData : {};
@@ -328,6 +333,8 @@ export function computeDefaults(
328333
required,
329334
isSchemaRoot: false,
330335
shouldMergeDefaultsIntoFormData,
336+
// CHANGED: this property is not provided in the original code
337+
initialDefaultsGenerated,
331338
})
332339
);
333340
} else if (schemaOneOf !== undefined) {
@@ -402,6 +409,7 @@ export function computeDefaults(
402409
rawFormData: rawFormData ?? schemaToComputeFormData,
403410
required,
404411
shouldMergeDefaultsIntoFormData,
412+
initialDefaultsGenerated,
405413
});
406414
}
407415

@@ -655,6 +663,7 @@ export function getObjectDefaults(
655663
isSchemaRoot,
656664
rawFormData: formData,
657665
shouldMergeDefaultsIntoFormData,
666+
initialDefaultsGenerated,
658667
}: ComputeDefaultsProps<SchemaObjectValue>,
659668
defaults: SchemaValue | undefined
660669
): SchemaObjectValue | null {
@@ -688,6 +697,7 @@ export function getObjectDefaults(
688697
required: retrievedSchemaRequired.has(key),
689698
isSchemaRoot: false,
690699
shouldMergeDefaultsIntoFormData,
700+
initialDefaultsGenerated,
691701
});
692702
const isConst =
693703
(value.const !== undefined || parentConstObject[key] !== undefined) &&
@@ -706,7 +716,7 @@ export function getObjectDefaults(
706716
}
707717
}
708718
const schemaAdditionalProperties = retrievedSchema.additionalProperties;
709-
if (schemaAdditionalProperties !== undefined) {
719+
if (schemaAdditionalProperties !== undefined && !initialDefaultsGenerated) {
710720
let keys = new Set(
711721
isSchemaObjectValue(defaults)
712722
? schemaProperties === undefined
@@ -740,6 +750,7 @@ export function getObjectDefaults(
740750
required: retrievedSchemaRequired.has(key),
741751
isSchemaRoot,
742752
shouldMergeDefaultsIntoFormData,
753+
initialDefaultsGenerated,
743754
}
744755
);
745756
// Since these are additional properties we don't need to add the `experimental_defaultFormStateBehavior` prop
@@ -773,6 +784,7 @@ export function getArrayDefaults(
773784
experimental_defaultFormStateBehavior,
774785
required,
775786
shouldMergeDefaultsIntoFormData,
787+
initialDefaultsGenerated,
776788
}: ComputeDefaultsProps,
777789
defaults: SchemaArrayValue | undefined
778790
): SchemaArrayValue | null | undefined {
@@ -813,6 +825,7 @@ export function getArrayDefaults(
813825
rawFormData: undefined,
814826
isSchemaRoot: false,
815827
shouldMergeDefaultsIntoFormData,
828+
initialDefaultsGenerated,
816829
});
817830
});
818831
}
@@ -834,6 +847,7 @@ export function getArrayDefaults(
834847
includeUndefinedValues: false,
835848
isSchemaRoot: false,
836849
shouldMergeDefaultsIntoFormData,
850+
initialDefaultsGenerated,
837851
});
838852
});
839853
// 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(
894908
isSchemaRoot: false,
895909
required,
896910
shouldMergeDefaultsIntoFormData,
911+
initialDefaultsGenerated,
897912
})
898913
);
899914
// then fill up the rest with either the item default or empty, up to minItems

0 commit comments

Comments
 (0)