@@ -25,7 +25,7 @@ import {
2525import { getSimpleSchemaType } from "./type.js" ;
2626import { isMultiSelect2 } from "./is-select.js" ;
2727import { getClosestMatchingOption2 } from "./matching.js" ;
28- import { defaultMerger } from './default-merger.js' ;
28+ import { DefaultMerger } from './default-merger.js' ;
2929import type { Merger } from './merger.js' ;
3030
3131export function getDefaultValueForType ( type : SchemaType ) {
@@ -59,7 +59,7 @@ export function getDefaultFormState(
5959 rootSchema ?: Schema ,
6060 includeUndefinedValues : boolean | "excludeObjectChildren" = false ,
6161 experimental_defaultFormStateBehavior ?: Experimental_DefaultFormStateBehavior ,
62- merger : Merger = defaultMerger
62+ merger : Merger = new DefaultMerger ( validator , rootSchema ?? theSchema )
6363) : SchemaValue | undefined {
6464 return getDefaultFormState2 (
6565 validator ,
@@ -100,7 +100,8 @@ export function getDefaultFormState2(
100100 return mergeDefaultsWithFormData (
101101 defaults ,
102102 formData ,
103- experimental_defaultFormStateBehavior ?. arrayMinItems ?. mergeExtraDefaults
103+ experimental_defaultFormStateBehavior ?. arrayMinItems ?. mergeExtraDefaults ,
104+ experimental_defaultFormStateBehavior ?. mergeDefaultsIntoFormData === "useDefaultIfFormDataUndefined"
104105 ) ;
105106 }
106107 return formData ;
@@ -159,6 +160,15 @@ type Experimental_DefaultFormStateBehavior = {
159160 * Optional flag to compute the default form state using allOf and if/then/else schemas. Defaults to `skipDefaults'.
160161 */
161162 allOf ?: "populateDefaults" | "skipDefaults" ;
163+ /** Optional enumerated flag controlling how the defaults are merged into the form data when dealing with undefined
164+ * values, defaulting to `useFormDataIfPresent`.
165+ * NOTE: If there is a default for a field and the `formData` is unspecified, the default ALWAYS merges.
166+ * - `useFormDataIfPresent`: Legacy behavior - Do not merge defaults if there is a value for a field in `formData`,
167+ * even if that value is explicitly set to `undefined`
168+ * - `useDefaultIfFormDataUndefined`: - If the value of a field within the `formData` is `undefined`, then use the
169+ * default value instead
170+ */
171+ mergeDefaultsIntoFormData ?: 'useFormDataIfPresent' | 'useDefaultIfFormDataUndefined' ;
162172} ;
163173
164174interface ComputeDefaultsProps {
@@ -178,7 +188,7 @@ export function computeDefaults<T extends SchemaValue>(
178188 validator : Validator ,
179189 rawSchema : Schema ,
180190 computeDefaultsProps ?: ComputeDefaultsProps ,
181- merger : Merger = defaultMerger
191+ merger : Merger = new DefaultMerger ( validator , rawSchema )
182192) : SchemaValue | undefined {
183193 return computeDefaults2 < T > (
184194 validator ,
0 commit comments