From e3af2cde02a85bfe8656d0ae6fdbf68d4d6680d9 Mon Sep 17 00:00:00 2001 From: Muhammad Amin Saffari Taheri Date: Fri, 24 May 2024 19:31:22 +0330 Subject: [PATCH] fix: updating a nullable object should work now. --- packages/form-core/src/tests/FormApi.spec.ts | 56 ++++++++++++++++++++ packages/form-core/src/utils.ts | 3 ++ 2 files changed, 59 insertions(+) diff --git a/packages/form-core/src/tests/FormApi.spec.ts b/packages/form-core/src/tests/FormApi.spec.ts index aa414314f..c9f402b6f 100644 --- a/packages/form-core/src/tests/FormApi.spec.ts +++ b/packages/form-core/src/tests/FormApi.spec.ts @@ -1095,4 +1095,60 @@ describe('form api', () => { await form.handleSubmit() expect(form.state.errors).toStrictEqual(['first name is required']) }) + + it('should update a nullable object', async () => { + const form = new FormApi({ + defaultValues: { + person: null, + } as { person: { firstName: string } | null }, + }) + + const field = new FieldApi({ + form, + name: 'person.firstName', + }) + + field.mount() + + field.setValue('firstName') + expect(form.state.values.person?.firstName).toStrictEqual('firstName') + }) + + it('should update a deep nullable object', async () => { + const form = new FormApi({ + defaultValues: { + person: null, + } as { person: { nameInfo: { first: string } | null } | null }, + }) + + const field = new FieldApi({ + form, + name: 'person.nameInfo.first', + }) + + field.mount() + + field.setValue('firstName') + expect(form.state.values.person?.nameInfo?.first).toStrictEqual('firstName') + }) + + it('should update a nullable array', async () => { + const form = new FormApi({ + defaultValues: { + persons: null, + } as { persons: Array<{ nameInfo: { first: string } }> | null }, + }) + + const field = new FieldApi({ + form, + name: 'persons', + }) + + field.mount() + + field.pushValue({ nameInfo: { first: 'firstName' } }) + expect(form.state.values.persons).toStrictEqual([ + { nameInfo: { first: 'firstName' } }, + ]) + }) }) diff --git a/packages/form-core/src/utils.ts b/packages/form-core/src/utils.ts index 7297defb3..e6c554b36 100644 --- a/packages/form-core/src/utils.ts +++ b/packages/form-core/src/utils.ts @@ -46,6 +46,9 @@ export function setBy(obj: any, _path: any, updater: Updater) { if (typeof key === 'string') { if (typeof parent === 'object') { + if (parent === null) { + parent = {} + } return { ...parent, [key]: doSet(parent[key]),