From 56c0c415d649f12da2dfe8fdee27102a7a7f74a4 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Wed, 6 May 2026 02:50:54 -0700 Subject: [PATCH 01/13] fix(react-form): remove errant `Field.Field` usage --- packages/react-form/src/useField.tsx | 55 ++-------------------------- 1 file changed, 3 insertions(+), 52 deletions(-) diff --git a/packages/react-form/src/useField.tsx b/packages/react-form/src/useField.tsx index 2a3f546cf..76d2bc923 100644 --- a/packages/react-form/src/useField.tsx +++ b/packages/react-form/src/useField.tsx @@ -1,6 +1,6 @@ 'use client' -import { useMemo, useRef, useState } from 'react' +import { useMemo, useState } from 'react' import { useStore } from '@tanstack/react-store' import { FieldApi, functionalUpdate } from '@tanstack/form-core' import { useIsomorphicLayoutEffect } from './useIsomorphicLayoutEffect' @@ -15,42 +15,9 @@ import type { FormAsyncValidateOrFn, FormValidateOrFn, } from '@tanstack/form-core' -import type { FunctionComponent, ReactElement, ReactNode } from 'react' +import type { FunctionComponent, ReactNode } from 'react' import type { UseFieldOptions, UseFieldOptionsBound } from './types' -interface ReactFieldApi< - TParentData, - TFormOnMount extends undefined | FormValidateOrFn, - TFormOnChange extends undefined | FormValidateOrFn, - TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TFormOnBlur extends undefined | FormValidateOrFn, - TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TFormOnSubmit extends undefined | FormValidateOrFn, - TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TFormOnDynamic extends undefined | FormValidateOrFn, - TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TFormOnServer extends undefined | FormAsyncValidateOrFn, - TPatentSubmitMeta, -> { - /** - * A pre-bound and type-safe sub-field component using this field as a root. - */ - Field: FieldComponent< - TParentData, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TPatentSubmitMeta - > -} - /** * A type representing a hook for using a field in a form with the given form data type. * @@ -305,23 +272,7 @@ export function useField< TFormOnDynamicAsync, TFormOnServer, TPatentSubmitMeta - > & - ReactFieldApi< - TParentData, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TPatentSubmitMeta - > = reactiveFieldApi as never - - extendedApi.Field = Field as never + > = reactiveFieldApi as never return extendedApi }, [ From f0bc85d5f08599ce61097157ea573f7b633d62f0 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Thu, 7 May 2026 02:15:08 -0700 Subject: [PATCH 02/13] fix(vue-form): remove errant `Field.Field` usage --- packages/vue-form/src/useField.tsx | 20 +------------------- 1 file changed, 1 insertion(+), 19 deletions(-) diff --git a/packages/vue-form/src/useField.tsx b/packages/vue-form/src/useField.tsx index c9e3b2492..05edf2b56 100644 --- a/packages/vue-form/src/useField.tsx +++ b/packages/vue-form/src/useField.tsx @@ -370,25 +370,7 @@ export function useField< name: opts.name, }) - const extendedApi: typeof api & - VueFieldApi< - TParentData, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TParentSubmitMeta - > = api as never - - extendedApi.Field = Field as never - - return extendedApi + return api })() const fieldState = useStore(fieldApi.store, (state) => state) From 16aab4d7a427e2cfd69762255108f69bedc434c9 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Thu, 7 May 2026 02:15:20 -0700 Subject: [PATCH 03/13] fix(vue-form): remove useField return from useForm --- packages/vue-form/src/useField.tsx | 120 ----------------------------- packages/vue-form/src/useForm.tsx | 22 +----- 2 files changed, 2 insertions(+), 140 deletions(-) diff --git a/packages/vue-form/src/useField.tsx b/packages/vue-form/src/useField.tsx index 05edf2b56..630ae6214 100644 --- a/packages/vue-form/src/useField.tsx +++ b/packages/vue-form/src/useField.tsx @@ -15,7 +15,6 @@ import type { EmitsOptions, EmitsToProps, PublicProps, - Ref, SetupContext, SlotsType, } from 'vue' @@ -185,125 +184,6 @@ export interface VueFieldApi< > } -export type UseField< - TParentData, - TFormOnMount extends undefined | FormValidateOrFn, - TFormOnChange extends undefined | FormValidateOrFn, - TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TFormOnBlur extends undefined | FormValidateOrFn, - TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TFormOnSubmit extends undefined | FormValidateOrFn, - TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TFormOnDynamic extends undefined | FormValidateOrFn, - TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TFormOnServer extends undefined | FormAsyncValidateOrFn, - TParentSubmitMeta, -> = < - TName extends DeepKeys, - TData extends DeepValue, - TOnMount extends undefined | FieldValidateOrFn, - TOnChange extends undefined | FieldValidateOrFn, - TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, - TOnBlur extends undefined | FieldValidateOrFn, - TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, - TOnSubmit extends undefined | FieldValidateOrFn, - TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, - TOnDynamic extends undefined | FieldValidateOrFn, - TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, ->( - opts: UseFieldOptionsBound< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync - >, -) => { - api: FieldApi< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TParentSubmitMeta - > & - VueFieldApi< - TParentData, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TParentSubmitMeta - > - state: Readonly< - Ref< - FieldApi< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TParentSubmitMeta - >['state'] - > - > -} - export function useField< TParentData, TName extends DeepKeys, diff --git a/packages/vue-form/src/useForm.tsx b/packages/vue-form/src/useForm.tsx index 74be6e56a..a4f8f8f49 100644 --- a/packages/vue-form/src/useForm.tsx +++ b/packages/vue-form/src/useForm.tsx @@ -1,7 +1,7 @@ import { FormApi } from '@tanstack/form-core' import { useStore } from '@tanstack/vue-store' import { defineComponent, h, onMounted } from 'vue' -import { Field, useField } from './useField' +import { Field } from './useField' import type { FormAsyncValidateOrFn, FormOptions, @@ -17,7 +17,7 @@ import type { Ref, SlotsType, } from 'vue' -import type { FieldComponent, UseField } from './useField' +import type { FieldComponent } from './useField' type SubscribeComponent< TParentData, @@ -149,20 +149,6 @@ export interface VueFormApi< TFormOnServer, TSubmitMeta > - useField: UseField< - TParentData, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TSubmitMeta - > useStore: < TSelected = NoInfer< FormState< @@ -287,10 +273,6 @@ export function useForm< inheritAttrs: false, }, ) as never - extendedApi.useField = (props) => { - const field = useField({ ...props, form: api }) - return field - } extendedApi.useStore = (selector) => { return useStore(api.store as never, selector as never) as never } From b96cd7df4e2cc8f683ddde27373e669ec3ce9d46 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Thu, 7 May 2026 02:18:35 -0700 Subject: [PATCH 04/13] fix(vue-form): remove errant `Field.Field` usage --- packages/svelte-form/src/Field.svelte | 21 ++----------------- .../src/createFormCreator.svelte.ts | 2 +- 2 files changed, 3 insertions(+), 20 deletions(-) diff --git a/packages/svelte-form/src/Field.svelte b/packages/svelte-form/src/Field.svelte index 57fba2860..9d63c23e4 100644 --- a/packages/svelte-form/src/Field.svelte +++ b/packages/svelte-form/src/Field.svelte @@ -10,8 +10,7 @@ } from '@tanstack/form-core' import { useStore } from '@tanstack/svelte-store' import { onMount, type Snippet } from 'svelte' - import Field from './Field.svelte' - import type { CreateFieldOptions, SvelteFieldApi } from './types.js' + import type { CreateFieldOptions } from './types.js' export function createField< TParentData, @@ -76,23 +75,7 @@ const api = new FieldApi(options) - const extendedApi: typeof api & - SvelteFieldApi< - TParentData, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TParentSubmitMeta - > = api as never - - extendedApi.Field = Field as never + const extendedApi: typeof api = api as never let mounted = false // Instantiates field meta and removes it when unrendered diff --git a/packages/svelte-form/src/createFormCreator.svelte.ts b/packages/svelte-form/src/createFormCreator.svelte.ts index 0637168f9..af4c5fe41 100644 --- a/packages/svelte-form/src/createFormCreator.svelte.ts +++ b/packages/svelte-form/src/createFormCreator.svelte.ts @@ -13,7 +13,7 @@ import type { } from '@tanstack/form-core' import type { FieldComponent } from './types.js' import type { SvelteFormExtendedApi } from './createForm.svelte' -import type { Component, Snippet, SvelteComponent } from 'svelte' +import type { Component, Snippet } from 'svelte' /** * TypeScript inferencing is weird. From 93f4ef0cc71e1dd88b20413350755db001fc1970 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Thu, 7 May 2026 02:18:57 -0700 Subject: [PATCH 05/13] fix(svelte-form): remove createField return from createForm --- packages/svelte-form/src/createForm.svelte.ts | 22 +--- packages/svelte-form/src/index.ts | 2 +- packages/svelte-form/src/types.ts | 103 ------------------ 3 files changed, 3 insertions(+), 124 deletions(-) diff --git a/packages/svelte-form/src/createForm.svelte.ts b/packages/svelte-form/src/createForm.svelte.ts index 5bd92181c..fc770e941 100644 --- a/packages/svelte-form/src/createForm.svelte.ts +++ b/packages/svelte-form/src/createForm.svelte.ts @@ -1,7 +1,7 @@ import { FormApi } from '@tanstack/form-core' import { useStore } from '@tanstack/svelte-store' import { onMount } from 'svelte' -import Field, { createField } from './Field.svelte' +import Field from './Field.svelte' import Subscribe from './Subscribe.svelte' import type { Component, @@ -15,7 +15,7 @@ import type { FormState, FormValidateOrFn, } from '@tanstack/form-core' -import type { CreateField, FieldComponent, WithoutFunction } from './types.js' +import type { FieldComponent, WithoutFunction } from './types.js' export interface SvelteFormApi< TParentData, @@ -45,20 +45,6 @@ export interface SvelteFormApi< TFormOnServer, TSubmitMeta > - createField: CreateField< - TParentData, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TSubmitMeta - > useStore: < TSelected = NoInfer< FormState< @@ -287,10 +273,6 @@ export function createForm< // @ts-expect-error constructor definition exists only on a type level extendedApi.Field = (internal, props) => Field(internal, { ...props, form: api as never } as never) - extendedApi.createField = (props) => - createField(() => { - return { ...props(), form: api } as never - }) as never // Type cast because else "Error: Type instantiation is excessively deep and possibly infinite." extendedApi.useStore = (selector) => useStore(api.store, selector) // @ts-expect-error constructor definition exists only on a type level extendedApi.Subscribe = (internal, props) => diff --git a/packages/svelte-form/src/index.ts b/packages/svelte-form/src/index.ts index 5540f0b85..6001165f2 100644 --- a/packages/svelte-form/src/index.ts +++ b/packages/svelte-form/src/index.ts @@ -6,7 +6,7 @@ export { createForm, type SvelteFormApi } from './createForm.svelte.js' export { default as Field, createField } from './Field.svelte' -export type { CreateField, FieldComponent } from './types.js' +export type { FieldComponent } from './types.js' export { createFormCreator, diff --git a/packages/svelte-form/src/types.ts b/packages/svelte-form/src/types.ts index 853834d0a..67e91171e 100644 --- a/packages/svelte-form/src/types.ts +++ b/packages/svelte-form/src/types.ts @@ -338,106 +338,3 @@ type FieldComponentProps< >, 'form' > - -export type CreateField< - TParentData, - TFormOnMount extends undefined | FormValidateOrFn, - TFormOnChange extends undefined | FormValidateOrFn, - TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TFormOnBlur extends undefined | FormValidateOrFn, - TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TFormOnSubmit extends undefined | FormValidateOrFn, - TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TFormOnDynamic extends undefined | FormValidateOrFn, - TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TFormOnServer extends undefined | FormAsyncValidateOrFn, - TParentSubmitMeta, -> = < - TName extends DeepKeys, - TData extends DeepValue, - TOnMount extends undefined | FieldValidateOrFn, - TOnChange extends undefined | FieldValidateOrFn, - TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, - TOnBlur extends undefined | FieldValidateOrFn, - TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, - TOnSubmit extends undefined | FieldValidateOrFn, - TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, - TOnDynamic extends undefined | FieldValidateOrFn, - TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, - TSubmitMeta, ->( - opts: () => { name: Narrow } & Omit< - CreateFieldOptions< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TSubmitMeta - >, - 'form' - >, -) => FieldApi< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TParentSubmitMeta -> & - SvelteFieldApi< - TParentData, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TParentSubmitMeta - > From 064afe605b35c28c7f5d9642480a185b83d5b6ad Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Thu, 7 May 2026 02:22:24 -0700 Subject: [PATCH 06/13] fix(solid-form): remove createField return from createForm --- packages/solid-form/src/createField.tsx | 88 ------------------------- packages/solid-form/src/createForm.tsx | 20 +----- 2 files changed, 1 insertion(+), 107 deletions(-) diff --git a/packages/solid-form/src/createField.tsx b/packages/solid-form/src/createField.tsx index 504564b03..2c17bee0e 100644 --- a/packages/solid-form/src/createField.tsx +++ b/packages/solid-form/src/createField.tsx @@ -51,94 +51,6 @@ interface SolidFieldApi< > } -export type CreateField< - TParentData, - TFormOnMount extends undefined | FormValidateOrFn, - TFormOnChange extends undefined | FormValidateOrFn, - TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TFormOnBlur extends undefined | FormValidateOrFn, - TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TFormOnSubmit extends undefined | FormValidateOrFn, - TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TFormOnDynamic extends undefined | FormValidateOrFn, - TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TFormOnServer extends undefined | FormAsyncValidateOrFn, - TParentSubmitMeta, -> = < - TName extends DeepKeys, - TData extends DeepValue, - TOnMount extends undefined | FieldValidateOrFn, - TOnChange extends undefined | FieldValidateOrFn, - TOnChangeAsync extends - | undefined - | FieldAsyncValidateOrFn, - TOnBlur extends undefined | FieldValidateOrFn, - TOnBlurAsync extends - | undefined - | FieldAsyncValidateOrFn, - TOnSubmit extends undefined | FieldValidateOrFn, - TOnSubmitAsync extends - | undefined - | FieldAsyncValidateOrFn, - TOnDynamic extends undefined | FieldValidateOrFn, - TOnDynamicAsync extends - | undefined - | FieldAsyncValidateOrFn, ->( - opts: () => { name: Narrow } & CreateFieldOptionsBound< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync - >, -) => () => FieldApi< - TParentData, - TName, - TData, - TOnMount, - TOnChange, - TOnChangeAsync, - TOnBlur, - TOnBlurAsync, - TOnSubmit, - TOnSubmitAsync, - TOnDynamic, - TOnDynamicAsync, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TParentSubmitMeta -> & - SolidFieldApi< - TParentData, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TParentSubmitMeta - > - // ugly way to trick solid into triggering updates for changes on the fieldApi function makeFieldReactive< TParentData, diff --git a/packages/solid-form/src/createForm.tsx b/packages/solid-form/src/createForm.tsx index 383014c09..0c01b193a 100644 --- a/packages/solid-form/src/createForm.tsx +++ b/packages/solid-form/src/createForm.tsx @@ -9,7 +9,7 @@ import type { FormValidateOrFn, } from '@tanstack/form-core' import type { JSXElement } from 'solid-js' -import type { CreateField, FieldComponent } from './createField' +import type { FieldComponent } from './createField' export interface SolidFormApi< TParentData, @@ -39,20 +39,6 @@ export interface SolidFormApi< TFormOnServer, TSubmitMeta > - createField: CreateField< - TParentData, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TSubmitMeta - > useStore: < TSelected = NoInfer< FormState< @@ -231,10 +217,6 @@ export function createForm< > = api as never extendedApi.Field = (props) => - extendedApi.createField = (props) => - createField(() => { - return { ...props(), form: api } - }) as never extendedApi.useStore = (selector) => useStore(api.store, selector) extendedApi.Subscribe = (props) => functionalUpdate(props.children, useStore(api.store, props.selector)) From 898223f41b3475d9159751e7f0709d109cbf678c Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Thu, 7 May 2026 02:24:51 -0700 Subject: [PATCH 07/13] fix(solid-form): remove errant `Field.Field` usage --- packages/solid-form/src/createField.tsx | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) diff --git a/packages/solid-form/src/createField.tsx b/packages/solid-form/src/createField.tsx index 2c17bee0e..1284f0aaf 100644 --- a/packages/solid-form/src/createField.tsx +++ b/packages/solid-form/src/createField.tsx @@ -15,7 +15,6 @@ import type { FieldValidators, FormAsyncValidateOrFn, FormValidateOrFn, - Narrow, } from '@tanstack/form-core' import type { Accessor, JSX, JSXElement } from 'solid-js' @@ -238,23 +237,7 @@ export function createField< const api = new FieldApi(options) - const extendedApi: typeof api & - SolidFieldApi< - TParentData, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TParentSubmitMeta - > = api as never - - extendedApi.Field = Field as never + const extendedApi: typeof api = api as never let mounted = false // Instantiates field meta and removes it when unrendered From e42183758c1aef311d803732763606b3aac6e158 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Thu, 7 May 2026 02:26:58 -0700 Subject: [PATCH 08/13] chore: fix react eslint --- packages/react-form/src/createFormHook.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/react-form/src/createFormHook.tsx b/packages/react-form/src/createFormHook.tsx index 5c0e8b7ad..2954edb31 100644 --- a/packages/react-form/src/createFormHook.tsx +++ b/packages/react-form/src/createFormHook.tsx @@ -1,6 +1,6 @@ 'use client' /* eslint-disable @eslint-react/no-context-provider */ -import { createContext, useContext, useMemo } from 'react' +import { createContext, use, useMemo } from 'react' import { useForm } from './useForm' import { useFieldGroup } from './useFieldGroup' import type { @@ -66,7 +66,7 @@ type UnwrapDefaultOrAny = [DefaultT] extends [T] : T function useFormContext() { - const form = useContext(formContext) + const form = use(formContext) // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition if (!form) { @@ -94,7 +94,7 @@ function useFormContext() { export function createFormHookContexts() { function useFieldContext() { - const field = useContext(fieldContext) + const field = use(fieldContext) // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition if (!field) { @@ -359,7 +359,7 @@ export function createFormHook< return ( {(field) => ( - // eslint-disable-next-line @eslint-react/no-context-provider + {children(Object.assign(field, fieldComponents))} From 348ab8dd741185a3c19908f84e8079841635b539 Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Thu, 7 May 2026 09:27:49 +0000 Subject: [PATCH 09/13] ci: apply automated fixes and generate docs --- packages/react-form/src/createFormHook.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/react-form/src/createFormHook.tsx b/packages/react-form/src/createFormHook.tsx index 2954edb31..53103d121 100644 --- a/packages/react-form/src/createFormHook.tsx +++ b/packages/react-form/src/createFormHook.tsx @@ -359,7 +359,6 @@ export function createFormHook< return ( {(field) => ( - {children(Object.assign(field, fieldComponents))} From 804bc53bbebe7713f392c084bd413da3846baf86 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Thu, 7 May 2026 02:28:45 -0700 Subject: [PATCH 10/13] chore: fix knip --- packages/svelte-form/src/types.ts | 30 ------------------------------ 1 file changed, 30 deletions(-) diff --git a/packages/svelte-form/src/types.ts b/packages/svelte-form/src/types.ts index 67e91171e..c593926ac 100644 --- a/packages/svelte-form/src/types.ts +++ b/packages/svelte-form/src/types.ts @@ -80,36 +80,6 @@ export type WithoutFunction = { [K in keyof T as T[K] extends Function ? never : K]: T[K] } -export interface SvelteFieldApi< - TParentData, - TFormOnMount extends undefined | FormValidateOrFn, - TFormOnChange extends undefined | FormValidateOrFn, - TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn, - TFormOnBlur extends undefined | FormValidateOrFn, - TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn, - TFormOnSubmit extends undefined | FormValidateOrFn, - TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn, - TFormOnDynamic extends undefined | FormValidateOrFn, - TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn, - TFormOnServer extends undefined | FormAsyncValidateOrFn, - TParentSubmitMeta, -> { - Field: FieldComponent< - TParentData, - TFormOnMount, - TFormOnChange, - TFormOnChangeAsync, - TFormOnBlur, - TFormOnBlurAsync, - TFormOnSubmit, - TFormOnSubmitAsync, - TFormOnDynamic, - TFormOnDynamicAsync, - TFormOnServer, - TParentSubmitMeta - > -} - export type FieldComponent< TParentData, TFormOnMount extends undefined | FormValidateOrFn, From a2b80781b1a63342e00e86ac4cf0e2083e80ee9b Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Fri, 8 May 2026 09:28:57 -0400 Subject: [PATCH 11/13] Revert "chore: fix react eslint" This reverts commit e42183758c1aef311d803732763606b3aac6e158. # Conflicts: # packages/react-form/src/createFormHook.tsx --- packages/react-form/src/createFormHook.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/react-form/src/createFormHook.tsx b/packages/react-form/src/createFormHook.tsx index 53103d121..4008c47fc 100644 --- a/packages/react-form/src/createFormHook.tsx +++ b/packages/react-form/src/createFormHook.tsx @@ -1,6 +1,6 @@ 'use client' /* eslint-disable @eslint-react/no-context-provider */ -import { createContext, use, useMemo } from 'react' +import { createContext, useContext, useMemo } from 'react' import { useForm } from './useForm' import { useFieldGroup } from './useFieldGroup' import type { @@ -66,7 +66,7 @@ type UnwrapDefaultOrAny = [DefaultT] extends [T] : T function useFormContext() { - const form = use(formContext) + const form = useContext(formContext) // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition if (!form) { @@ -94,7 +94,7 @@ function useFormContext() { export function createFormHookContexts() { function useFieldContext() { - const field = use(fieldContext) + const field = useContext(fieldContext) // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition if (!field) { From 2e14fe377a6c24e0d39112022191f19ae9b35687 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Fri, 8 May 2026 09:32:38 -0400 Subject: [PATCH 12/13] chore: remove useContext to use migrations in ESLint --- packages/react-form-devtools/eslint.config.js | 2 ++ packages/react-form-nextjs/eslint.config.js | 2 ++ packages/react-form-remix/eslint.config.js | 2 ++ packages/react-form-start/eslint.config.js | 2 ++ packages/react-form/eslint.config.js | 2 ++ 5 files changed, 10 insertions(+) diff --git a/packages/react-form-devtools/eslint.config.js b/packages/react-form-devtools/eslint.config.js index dd590b561..9a8c0ad6e 100644 --- a/packages/react-form-devtools/eslint.config.js +++ b/packages/react-form-devtools/eslint.config.js @@ -20,6 +20,8 @@ export default [ 'react-hooks/exhaustive-deps': 'error', 'react-hooks/rules-of-hooks': 'error', 'react-compiler/react-compiler': 'error', + // Must be "off" to avoid moving `useContext` to `use`, which breaks React 17/18 usage. + '@eslint-react/no-use-context': 'off' }, }, ] diff --git a/packages/react-form-nextjs/eslint.config.js b/packages/react-form-nextjs/eslint.config.js index dd590b561..9a8c0ad6e 100644 --- a/packages/react-form-nextjs/eslint.config.js +++ b/packages/react-form-nextjs/eslint.config.js @@ -20,6 +20,8 @@ export default [ 'react-hooks/exhaustive-deps': 'error', 'react-hooks/rules-of-hooks': 'error', 'react-compiler/react-compiler': 'error', + // Must be "off" to avoid moving `useContext` to `use`, which breaks React 17/18 usage. + '@eslint-react/no-use-context': 'off' }, }, ] diff --git a/packages/react-form-remix/eslint.config.js b/packages/react-form-remix/eslint.config.js index dd590b561..9a8c0ad6e 100644 --- a/packages/react-form-remix/eslint.config.js +++ b/packages/react-form-remix/eslint.config.js @@ -20,6 +20,8 @@ export default [ 'react-hooks/exhaustive-deps': 'error', 'react-hooks/rules-of-hooks': 'error', 'react-compiler/react-compiler': 'error', + // Must be "off" to avoid moving `useContext` to `use`, which breaks React 17/18 usage. + '@eslint-react/no-use-context': 'off' }, }, ] diff --git a/packages/react-form-start/eslint.config.js b/packages/react-form-start/eslint.config.js index dd590b561..9a8c0ad6e 100644 --- a/packages/react-form-start/eslint.config.js +++ b/packages/react-form-start/eslint.config.js @@ -20,6 +20,8 @@ export default [ 'react-hooks/exhaustive-deps': 'error', 'react-hooks/rules-of-hooks': 'error', 'react-compiler/react-compiler': 'error', + // Must be "off" to avoid moving `useContext` to `use`, which breaks React 17/18 usage. + '@eslint-react/no-use-context': 'off' }, }, ] diff --git a/packages/react-form/eslint.config.js b/packages/react-form/eslint.config.js index dd590b561..9a8c0ad6e 100644 --- a/packages/react-form/eslint.config.js +++ b/packages/react-form/eslint.config.js @@ -20,6 +20,8 @@ export default [ 'react-hooks/exhaustive-deps': 'error', 'react-hooks/rules-of-hooks': 'error', 'react-compiler/react-compiler': 'error', + // Must be "off" to avoid moving `useContext` to `use`, which breaks React 17/18 usage. + '@eslint-react/no-use-context': 'off' }, }, ] From 45474c8126f1375ec80eb2015eac93d8400f81f1 Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Fri, 8 May 2026 13:33:36 +0000 Subject: [PATCH 13/13] ci: apply automated fixes and generate docs --- packages/react-form-devtools/eslint.config.js | 2 +- packages/react-form-nextjs/eslint.config.js | 2 +- packages/react-form-remix/eslint.config.js | 2 +- packages/react-form-start/eslint.config.js | 2 +- packages/react-form/eslint.config.js | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/react-form-devtools/eslint.config.js b/packages/react-form-devtools/eslint.config.js index 9a8c0ad6e..66f87d647 100644 --- a/packages/react-form-devtools/eslint.config.js +++ b/packages/react-form-devtools/eslint.config.js @@ -21,7 +21,7 @@ export default [ 'react-hooks/rules-of-hooks': 'error', 'react-compiler/react-compiler': 'error', // Must be "off" to avoid moving `useContext` to `use`, which breaks React 17/18 usage. - '@eslint-react/no-use-context': 'off' + '@eslint-react/no-use-context': 'off', }, }, ] diff --git a/packages/react-form-nextjs/eslint.config.js b/packages/react-form-nextjs/eslint.config.js index 9a8c0ad6e..66f87d647 100644 --- a/packages/react-form-nextjs/eslint.config.js +++ b/packages/react-form-nextjs/eslint.config.js @@ -21,7 +21,7 @@ export default [ 'react-hooks/rules-of-hooks': 'error', 'react-compiler/react-compiler': 'error', // Must be "off" to avoid moving `useContext` to `use`, which breaks React 17/18 usage. - '@eslint-react/no-use-context': 'off' + '@eslint-react/no-use-context': 'off', }, }, ] diff --git a/packages/react-form-remix/eslint.config.js b/packages/react-form-remix/eslint.config.js index 9a8c0ad6e..66f87d647 100644 --- a/packages/react-form-remix/eslint.config.js +++ b/packages/react-form-remix/eslint.config.js @@ -21,7 +21,7 @@ export default [ 'react-hooks/rules-of-hooks': 'error', 'react-compiler/react-compiler': 'error', // Must be "off" to avoid moving `useContext` to `use`, which breaks React 17/18 usage. - '@eslint-react/no-use-context': 'off' + '@eslint-react/no-use-context': 'off', }, }, ] diff --git a/packages/react-form-start/eslint.config.js b/packages/react-form-start/eslint.config.js index 9a8c0ad6e..66f87d647 100644 --- a/packages/react-form-start/eslint.config.js +++ b/packages/react-form-start/eslint.config.js @@ -21,7 +21,7 @@ export default [ 'react-hooks/rules-of-hooks': 'error', 'react-compiler/react-compiler': 'error', // Must be "off" to avoid moving `useContext` to `use`, which breaks React 17/18 usage. - '@eslint-react/no-use-context': 'off' + '@eslint-react/no-use-context': 'off', }, }, ] diff --git a/packages/react-form/eslint.config.js b/packages/react-form/eslint.config.js index 9a8c0ad6e..66f87d647 100644 --- a/packages/react-form/eslint.config.js +++ b/packages/react-form/eslint.config.js @@ -21,7 +21,7 @@ export default [ 'react-hooks/rules-of-hooks': 'error', 'react-compiler/react-compiler': 'error', // Must be "off" to avoid moving `useContext` to `use`, which breaks React 17/18 usage. - '@eslint-react/no-use-context': 'off' + '@eslint-react/no-use-context': 'off', }, }, ]