From bd761636c8fd8d94c66212853282fe09dba373a4 Mon Sep 17 00:00:00 2001 From: Rainer Burgstaller Date: Mon, 28 Oct 2024 07:10:04 +0100 Subject: [PATCH 1/4] fix: dont merge arrays in `mergeForm` - this causes form submissions to be duplicated when having an array field in your form --- packages/form-core/src/mergeForm.ts | 6 ++---- packages/form-core/tests/mutateMergeDeep.spec.ts | 10 +++++----- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/packages/form-core/src/mergeForm.ts b/packages/form-core/src/mergeForm.ts index 202e307af..3a2354d11 100644 --- a/packages/form-core/src/mergeForm.ts +++ b/packages/form-core/src/mergeForm.ts @@ -13,10 +13,8 @@ export function mutateMergeDeep(target: object, source: object): object { const targetKey = key as never as keyof typeof target const sourceKey = key as never as keyof typeof source if (Array.isArray(target[targetKey]) && Array.isArray(source[sourceKey])) { - target[targetKey] = [ - ...(target[targetKey] as []), - ...(source[sourceKey] as []), - ] as never + target[targetKey] = ((source[sourceKey] as [] | undefined) ?? + (target[targetKey] as [] | undefined)) as never } else if ( typeof target[targetKey] === 'object' && typeof source[sourceKey] === 'object' diff --git a/packages/form-core/tests/mutateMergeDeep.spec.ts b/packages/form-core/tests/mutateMergeDeep.spec.ts index c5193adef..1039e72ae 100644 --- a/packages/form-core/tests/mutateMergeDeep.spec.ts +++ b/packages/form-core/tests/mutateMergeDeep.spec.ts @@ -16,11 +16,11 @@ describe('mutateMergeDeep', () => { expect(a).toStrictEqual({ a: undefined }) }) - test('Should merge two object by merging arrays', () => { - const a = { a: [1] } - const b = { a: [2] } - mutateMergeDeep(a, b) - expect(a).toStrictEqual({ a: [1, 2] }) + test('Should merge two object by overriding arrays', () => { + const target = { a: [1] } + const source = { a: [2] } + mutateMergeDeep(target, source) + expect(target).toStrictEqual({ a: [2] }) }) test('Should merge two deeply nested objects', () => { From 9ad0985314e703b03fb4203e858d5c0da978c8ab Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Mon, 28 Oct 2024 06:28:28 +0000 Subject: [PATCH 2/4] ci: apply automated fixes and generate docs --- docs/reference/functions/mergeform.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/reference/functions/mergeform.md b/docs/reference/functions/mergeform.md index 395c40c15..96af11c34 100644 --- a/docs/reference/functions/mergeform.md +++ b/docs/reference/functions/mergeform.md @@ -27,4 +27,4 @@ function mergeForm(baseForm, state): FormApi Date: Mon, 28 Oct 2024 07:59:32 +0100 Subject: [PATCH 3/4] test: add more tests --- packages/form-core/src/mergeForm.ts | 5 +++-- .../form-core/tests/mutateMergeDeep.spec.ts | 21 +++++++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/packages/form-core/src/mergeForm.ts b/packages/form-core/src/mergeForm.ts index 3a2354d11..992301951 100644 --- a/packages/form-core/src/mergeForm.ts +++ b/packages/form-core/src/mergeForm.ts @@ -12,9 +12,10 @@ export function mutateMergeDeep(target: object, source: object): object { for (const key of keySet) { const targetKey = key as never as keyof typeof target const sourceKey = key as never as keyof typeof source + if (Array.isArray(target[targetKey]) && Array.isArray(source[sourceKey])) { - target[targetKey] = ((source[sourceKey] as [] | undefined) ?? - (target[targetKey] as [] | undefined)) as never + // always use the source array to prevent array fields from multiplying + target[targetKey] = source[sourceKey] as [] as never } else if ( typeof target[targetKey] === 'object' && typeof source[sourceKey] === 'object' diff --git a/packages/form-core/tests/mutateMergeDeep.spec.ts b/packages/form-core/tests/mutateMergeDeep.spec.ts index 1039e72ae..0af6b25ee 100644 --- a/packages/form-core/tests/mutateMergeDeep.spec.ts +++ b/packages/form-core/tests/mutateMergeDeep.spec.ts @@ -23,6 +23,27 @@ describe('mutateMergeDeep', () => { expect(target).toStrictEqual({ a: [2] }) }) + test('Should merge add array element when it does not exist in target', () => { + const target = { a: [] } + const source = { a: [2] } + mutateMergeDeep(target, source) + expect(target).toStrictEqual({ a: [2] }) + }) + + test('Should override the target array if source is undefined', () => { + const target = { a: [2] } + const source = { a: undefined } + mutateMergeDeep(target, source) + expect(target).toStrictEqual({ a: undefined }) + }) + + test('Should merge update array element when it does not exist in source', () => { + const target = { a: [2] } + const source = { a: [] } + mutateMergeDeep(target, source) + expect(target).toStrictEqual({ a: [] }) + }) + test('Should merge two deeply nested objects', () => { const a = { a: { a: 1 } } const b = { a: { b: 2 } } From a4bee413ac1ad9ea48aca25f09f8035ec11ea0ec Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Tue, 29 Oct 2024 06:21:47 +0000 Subject: [PATCH 4/4] ci: apply automated fixes and generate docs --- docs/reference/functions/mergeform.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/reference/functions/mergeform.md b/docs/reference/functions/mergeform.md index 96af11c34..16c15c5f6 100644 --- a/docs/reference/functions/mergeform.md +++ b/docs/reference/functions/mergeform.md @@ -27,4 +27,4 @@ function mergeForm(baseForm, state): FormApi