Skip to content

Commit bc7b50b

Browse files
committed
1 parent cdedc62 commit bc7b50b

File tree

6 files changed

+61
-24
lines changed

6 files changed

+61
-24
lines changed

.changeset/fuzzy-papayas-serve.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@sjsf/form": major
3+
---
4+
5+
Port https://github.com/rjsf-team/react-jsonschema-form/pull/4490

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

Lines changed: 29 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -316,10 +316,11 @@ export function createForm<T>(options: FormOptions<T>): FormState<T> {
316316
options.value
317317
? refFromBind(options.value as unknown as Bind<FormValue>)
318318
: createValueRef(
319-
merger.mergeFormDataAndSchemaDefaults(
320-
options.initialValue as FormValue,
321-
options.schema
322-
)
319+
merger.mergeFormDataAndSchemaDefaults({
320+
formData: options.initialValue as FormValue,
321+
schema: options.schema,
322+
initialDefaultsGenerated: false,
323+
})
323324
)
324325
);
325326
const errors = $derived(
@@ -383,6 +384,14 @@ export function createForm<T>(options: FormOptions<T>): FormState<T> {
383384
const isSubmitted = $derived(
384385
internalHasFieldState(fieldsStateMap, rootPath, FIELD_SUBMITTED)
385386
);
387+
let isFirstRender = true
388+
let initialDefaultsGenerated = $derived.by(() => {
389+
// eslint-disable-next-line @typescript-eslint/no-unused-expressions
390+
options.schema;
391+
const result = isFirstRender
392+
isFirstRender = false
393+
return result
394+
});
386395
// STATE END
387396

388397
const validateForm: AsyncFormValueValidator["validateFormValueAsync"] =
@@ -500,10 +509,11 @@ export function createForm<T>(options: FormOptions<T>): FormState<T> {
500509
e.preventDefault();
501510
fieldsStateMap.clear();
502511
errors.clear();
503-
valueRef.current = merger.mergeFormDataAndSchemaDefaults(
504-
options.initialValue as FormValue,
505-
options.schema
506-
);
512+
valueRef.current = merger.mergeFormDataAndSchemaDefaults({
513+
formData: options.initialValue as FormValue,
514+
schema: options.schema,
515+
initialDefaultsGenerated: false,
516+
});
507517
options.onReset?.(e);
508518
}
509519

@@ -514,10 +524,11 @@ export function createForm<T>(options: FormOptions<T>): FormState<T> {
514524
return getSnapshot() as T | undefined;
515525
},
516526
set value(v) {
517-
valueRef.current = merger.mergeFormDataAndSchemaDefaults(
518-
v as FormValue,
519-
options.schema
520-
);
527+
valueRef.current = merger.mergeFormDataAndSchemaDefaults({
528+
formData: v as FormValue,
529+
schema: options.schema,
530+
initialDefaultsGenerated: true,
531+
});
521532
},
522533
get isSubmitted() {
523534
return isSubmitted;
@@ -606,10 +617,12 @@ export function createForm<T>(options: FormOptions<T>): FormState<T> {
606617
let isDefaultsInjectionQueued = false;
607618
function injectSchemaDefaults() {
608619
isDefaultsInjectionQueued = false;
609-
const nextValue = merger.mergeFormDataAndSchemaDefaults(
610-
valueRef.current,
611-
options.schema
612-
);
620+
const nextValue = merger.mergeFormDataAndSchemaDefaults({
621+
formData: valueRef.current,
622+
schema: options.schema,
623+
initialDefaultsGenerated,
624+
});
625+
initialDefaultsGenerated = true;
613626
const change = reconcileSchemaValues(valueRef.current, nextValue);
614627
if (change !== UNCHANGED) {
615628
valueRef.current = change;

packages/form/src/form/merger.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
1-
import { type Merger, type Schema, type SchemaValue } from "@/core/index.js";
1+
import type { Merger, Schema, SchemaValue } from "@/core/index.js";
2+
3+
export interface MergeFormDataAndSchemaDefaultsOptions {
4+
schema: Schema;
5+
formData: SchemaValue | undefined;
6+
initialDefaultsGenerated: boolean;
7+
}
28

39
export interface FormMerger extends Merger {
410
/**
511
* Merges defaults of `schema` into `formData`
612
*/
713
mergeFormDataAndSchemaDefaults(
8-
formData: SchemaValue | undefined,
9-
schema: Schema
14+
options: MergeFormDataAndSchemaDefaultsOptions
1015
): SchemaValue | undefined;
1116
}

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,11 @@ export function getDefaultFieldState<T>(
118118
schema: Schema,
119119
formData: SchemaValue | undefined
120120
) {
121-
return ctx[FORM_MERGER].mergeFormDataAndSchemaDefaults(formData, schema);
121+
return ctx[FORM_MERGER].mergeFormDataAndSchemaDefaults({
122+
formData,
123+
schema,
124+
initialDefaultsGenerated: false,
125+
});
122126
}
123127

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

packages/form/src/mergers/legacy.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -181,15 +181,20 @@ export function createFormMerger(options: FormMergerOptions): FormMerger {
181181
const merger = createMerger();
182182
return {
183183
...merger,
184-
mergeFormDataAndSchemaDefaults(formData, schema) {
184+
mergeFormDataAndSchemaDefaults({
185+
formData,
186+
schema,
187+
initialDefaultsGenerated,
188+
}) {
185189
return getDefaultFormState(
186190
options.validator,
187191
merger,
188192
schema,
189193
formData,
190194
options.schema,
191195
options.includeUndefinedValues,
192-
options
196+
options,
197+
initialDefaultsGenerated
193198
);
194199
},
195200
};

packages/form/src/mergers/modern.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,15 +44,20 @@ export function createFormMerger(options: FormMergerOptions): FormMerger {
4444
const merger = createMerger(options);
4545
return {
4646
...merger,
47-
mergeFormDataAndSchemaDefaults(formData, schema) {
47+
mergeFormDataAndSchemaDefaults({
48+
formData,
49+
schema,
50+
initialDefaultsGenerated,
51+
}) {
4852
return getDefaultFormState(
4953
options.validator,
5054
merger,
5155
schema,
5256
formData,
5357
options.schema,
5458
options.includeUndefinedValues,
55-
options
59+
options,
60+
initialDefaultsGenerated
5661
);
5762
},
5863
};

0 commit comments

Comments
 (0)