From d6a7af9e306aca34c88e899dc596df811e09bf09 Mon Sep 17 00:00:00 2001 From: Mishra-coder Date: Fri, 27 Mar 2026 00:14:59 +0530 Subject: [PATCH 1/2] fix: prevent initialFormState from overriding client state Closes #2089 --- packages/react-form-nextjs/src/createServerValidate.ts | 3 +-- packages/react-form-remix/src/createServerValidate.ts | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/react-form-nextjs/src/createServerValidate.ts b/packages/react-form-nextjs/src/createServerValidate.ts index b936f1e8e..41ddc4cb7 100644 --- a/packages/react-form-nextjs/src/createServerValidate.ts +++ b/packages/react-form-nextjs/src/createServerValidate.ts @@ -133,6 +133,5 @@ export const initialFormState: ServerFormState = { errorMap: { onServer: undefined, }, - values: undefined, errors: [], -} +} as unknown as ServerFormState diff --git a/packages/react-form-remix/src/createServerValidate.ts b/packages/react-form-remix/src/createServerValidate.ts index b936f1e8e..41ddc4cb7 100644 --- a/packages/react-form-remix/src/createServerValidate.ts +++ b/packages/react-form-remix/src/createServerValidate.ts @@ -133,6 +133,5 @@ export const initialFormState: ServerFormState = { errorMap: { onServer: undefined, }, - values: undefined, errors: [], -} +} as unknown as ServerFormState From 4d8e0abf2740fea8c6a2245479a4845a8ab8abb7 Mon Sep 17 00:00:00 2001 From: Mishra-coder Date: Mon, 30 Mar 2026 00:13:01 +0530 Subject: [PATCH 2/2] test: add regression tests for initialFormState override fix --- .../tests/createServerValidate.spec.tsx | 22 +++++++++++++++++++ .../tests/createServerValidate.spec.tsx | 22 +++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 packages/react-form-nextjs/tests/createServerValidate.spec.tsx create mode 100644 packages/react-form-remix/tests/createServerValidate.spec.tsx diff --git a/packages/react-form-nextjs/tests/createServerValidate.spec.tsx b/packages/react-form-nextjs/tests/createServerValidate.spec.tsx new file mode 100644 index 000000000..a26db617c --- /dev/null +++ b/packages/react-form-nextjs/tests/createServerValidate.spec.tsx @@ -0,0 +1,22 @@ +import { describe, expect, it } from 'vitest' +import { mutateMergeDeep } from '@tanstack/react-form' +import { initialFormState } from '../src/createServerValidate' + +describe('initialFormState', () => { + it('should not contain values property', () => { + expect(initialFormState).not.toHaveProperty('values') + }) + + it('should not override client values when merged', () => { + const clientState = { + values: { name: 'client-name' }, + errors: [], + errorMap: {} + } + + // @ts-ignore + mutateMergeDeep(clientState, initialFormState) + + expect(clientState.values).toEqual({ name: 'client-name' }) + }) +}) diff --git a/packages/react-form-remix/tests/createServerValidate.spec.tsx b/packages/react-form-remix/tests/createServerValidate.spec.tsx new file mode 100644 index 000000000..a26db617c --- /dev/null +++ b/packages/react-form-remix/tests/createServerValidate.spec.tsx @@ -0,0 +1,22 @@ +import { describe, expect, it } from 'vitest' +import { mutateMergeDeep } from '@tanstack/react-form' +import { initialFormState } from '../src/createServerValidate' + +describe('initialFormState', () => { + it('should not contain values property', () => { + expect(initialFormState).not.toHaveProperty('values') + }) + + it('should not override client values when merged', () => { + const clientState = { + values: { name: 'client-name' }, + errors: [], + errorMap: {} + } + + // @ts-ignore + mutateMergeDeep(clientState, initialFormState) + + expect(clientState.values).toEqual({ name: 'client-name' }) + }) +})