Skip to content

Commit b5a5c86

Browse files
committed
[form] Refactor field default state generation
1 parent ed0a797 commit b5a5c86

File tree

9 files changed

+37
-26
lines changed

9 files changed

+37
-26
lines changed

.changeset/ten-lines-prove.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
"@sjsf/form": major
3+
---
4+
5+
- Reuse merger options definition in `getDefaultFieldState` parameters
6+
- Move `includeUndefinedValues` option from merger instance to `mergeFormDataAndSchemaDefaults` method options

packages/form/src/fields/array/context.svelte.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ function createItems<T>({
118118
return;
119119
}
120120
keyed.push(
121-
getDefaultFieldState(ctx, schema, undefined) ??
121+
getDefaultFieldState(ctx, { schema, formData: undefined }) ??
122122
getDefaultValueForType(getSimpleSchemaType(schema))
123123
);
124124
onChange();

packages/form/src/fields/combination.svelte

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -100,13 +100,14 @@
100100
previousSelectedOption !== undefined
101101
? retrievedOptions[previousSelectedOption]
102102
: undefined;
103-
return getDefaultFieldState(
104-
ctx,
105-
nextSchema,
106-
oldSchema !== undefined
107-
? sanitizeDataForNewSchema(ctx, nextSchema, oldSchema, value)
108-
: value
109-
);
103+
return getDefaultFieldState(ctx, {
104+
schema: nextSchema,
105+
formData:
106+
oldSchema !== undefined
107+
? sanitizeDataForNewSchema(ctx, nextSchema, oldSchema, value)
108+
: value,
109+
includeUndefinedValues: "excludeObjectChildren",
110+
});
110111
});
111112
previousSelectedOption = nextSelected;
112113
});

packages/form/src/fields/object/context.svelte.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ export interface ObjectContext {
5454
property: string,
5555
isAdditional: boolean
5656
) => Config;
57-
};
57+
}
5858

5959
export const [getObjectContext, setObjectContext] =
6060
createContext<ObjectContext>();
@@ -208,7 +208,10 @@ export function createObjectContext<T>({
208208
: additionalPropertyKey(newKeyPrefix, 0);
209209
const additionalPropertySchema = getAdditionalPropertySchema(val, newKey);
210210
const propValue =
211-
getDefaultFieldState(ctx, additionalPropertySchema, undefined) ??
211+
getDefaultFieldState(ctx, {
212+
schema: additionalPropertySchema,
213+
formData: undefined,
214+
}) ??
212215
getDefaultValueForType(getSimpleSchemaType(additionalPropertySchema));
213216
if (val) {
214217
val[newKey] = propValue;

packages/form/src/form/create-form.svelte.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,6 @@ export function createForm<T>(options: FormOptions<T>): FormState<T> {
311311
merger.mergeFormDataAndSchemaDefaults({
312312
formData: options.initialValue as FormValue,
313313
schema: options.schema,
314-
initialDefaultsGenerated: false,
315314
})
316315
)
317316
);
@@ -519,7 +518,6 @@ export function createForm<T>(options: FormOptions<T>): FormState<T> {
519518
valueRef.current = merger.mergeFormDataAndSchemaDefaults({
520519
formData: options.initialValue as FormValue,
521520
schema: options.schema,
522-
initialDefaultsGenerated: false,
523521
});
524522
options.onReset?.(e);
525523
}

packages/form/src/form/merger.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,14 @@ import type { Merger, Schema, SchemaValue } from "@/core/index.js";
33
export interface MergeFormDataAndSchemaDefaultsOptions {
44
schema: Schema;
55
formData: SchemaValue | undefined;
6-
initialDefaultsGenerated: boolean;
6+
/**
7+
* @default false
8+
*/
9+
initialDefaultsGenerated?: boolean;
10+
/**
11+
* @default false
12+
*/
13+
includeUndefinedValues?: boolean | "excludeObjectChildren";
714
}
815

916
export interface FormMerger extends Merger {

packages/form/src/form/state/schema.ts

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99
getClosestMatchingOption as getClosestMatchingOptionInternal,
1010
} from "@/core/index.js";
1111

12+
import type { MergeFormDataAndSchemaDefaultsOptions } from "../merger.js";
1213
import {
1314
FORM_MARK_SCHEMA_CHANGE,
1415
FORM_MERGER,
@@ -115,14 +116,9 @@ export function getClosestMatchingOption<T>(
115116
*/
116117
export function getDefaultFieldState<T>(
117118
ctx: FormState<T>,
118-
schema: Schema,
119-
formData: SchemaValue | undefined
119+
options: MergeFormDataAndSchemaDefaultsOptions
120120
) {
121-
return ctx[FORM_MERGER].mergeFormDataAndSchemaDefaults({
122-
formData,
123-
schema,
124-
initialDefaultsGenerated: false,
125-
});
121+
return ctx[FORM_MERGER].mergeFormDataAndSchemaDefaults(options);
126122
}
127123

128124
export function markSchemaChange<T>(ctx: FormState<T>) {

packages/form/src/mergers/legacy.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,6 @@ export function createMerger(): Merger {
174174
export type FormMergerOptions = Experimental_DefaultFormStateBehavior & {
175175
validator: Validator;
176176
schema: Schema;
177-
includeUndefinedValues?: boolean | "excludeObjectChildren";
178177
};
179178

180179
export function createFormMerger(options: FormMergerOptions): FormMerger {
@@ -184,15 +183,16 @@ export function createFormMerger(options: FormMergerOptions): FormMerger {
184183
mergeFormDataAndSchemaDefaults({
185184
formData,
186185
schema,
187-
initialDefaultsGenerated,
186+
initialDefaultsGenerated = false,
187+
includeUndefinedValues = false
188188
}) {
189189
return getDefaultFormState(
190190
options.validator,
191191
merger,
192192
schema,
193193
formData,
194194
options.schema,
195-
options.includeUndefinedValues,
195+
includeUndefinedValues,
196196
options,
197197
initialDefaultsGenerated
198198
);

packages/form/src/mergers/modern.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ export interface FormMergerOptions
3737
MergerOptions {
3838
validator: Validator;
3939
schema: Schema;
40-
includeUndefinedValues?: boolean | "excludeObjectChildren";
4140
}
4241

4342
export function createFormMerger(options: FormMergerOptions): FormMerger {
@@ -47,15 +46,16 @@ export function createFormMerger(options: FormMergerOptions): FormMerger {
4746
mergeFormDataAndSchemaDefaults({
4847
formData,
4948
schema,
50-
initialDefaultsGenerated,
49+
initialDefaultsGenerated = false,
50+
includeUndefinedValues = false
5151
}) {
5252
return getDefaultFormState(
5353
options.validator,
5454
merger,
5555
schema,
5656
formData,
5757
options.schema,
58-
options.includeUndefinedValues,
58+
includeUndefinedValues,
5959
options,
6060
initialDefaultsGenerated
6161
);

0 commit comments

Comments
 (0)