@tanstack/solid-form 1.28.3 → 1.28.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -62,10 +62,7 @@ function createFormHook(opts) {
62
62
  render,
63
63
  props
64
64
  }) {
65
- return (innerProps) => render({
66
- ...props,
67
- ...innerProps
68
- });
65
+ return (innerProps) => solidJs.createComponent(render, solidJs.mergeProps(props ?? {}, innerProps));
69
66
  }
70
67
  function withFieldGroup({
71
68
  render,
@@ -80,11 +77,9 @@ function createFormHook(opts) {
80
77
  formComponents: opts.formComponents
81
78
  };
82
79
  const fieldGroupApi = createFieldGroup.createFieldGroup(() => fieldGroupProps);
83
- return render({
84
- ...props,
85
- ...innerProps,
80
+ return solidJs.createComponent(render, solidJs.mergeProps(props ?? {}, innerProps, {
86
81
  group: fieldGroupApi
87
- });
82
+ }));
88
83
  };
89
84
  }
90
85
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"createFormHook.cjs","sources":["../../src/createFormHook.tsx"],"sourcesContent":["import {\n createComponent,\n createContext,\n splitProps,\n useContext,\n} from 'solid-js'\nimport { createFieldGroup } from './createFieldGroup'\nimport { createForm } from './createForm'\nimport type {\n AnyFieldApi,\n AnyFormApi,\n BaseFormOptions,\n DeepKeysOfType,\n FieldApi,\n FieldsMap,\n FormAsyncValidateOrFn,\n FormOptions,\n FormValidateOrFn,\n} from '@tanstack/form-core'\nimport type {\n Accessor,\n Component,\n Context,\n JSXElement,\n ParentProps,\n} from 'solid-js'\nimport type { FieldComponent } from './createField'\nimport type { AppFieldExtendedSolidFieldGroupApi } from './createFieldGroup'\nimport type { SolidFormExtendedApi } from './createForm'\n\n/**\n * TypeScript inferencing is weird.\n *\n * If you have:\n *\n * @example\n *\n * interface Args<T> {\n * arg?: T\n * }\n *\n * function test<T>(arg?: Partial<Args<T>>): T {\n * return 0 as any;\n * }\n *\n * const a = test({});\n *\n * Then `T` will default to `unknown`.\n *\n * However, if we change `test` to be:\n *\n * @example\n *\n * function test<T extends undefined>(arg?: Partial<Args<T>>): T;\n *\n * Then `T` becomes `undefined`.\n *\n * Here, we are checking if the passed type `T` extends `DefaultT` and **only**\n * `DefaultT`, as if that's the case we assume that inferencing has not occurred.\n */\ntype UnwrapOrAny<T> = [unknown] extends [T] ? any : T\ntype UnwrapDefaultOrAny<DefaultT, T> = [DefaultT] extends [T]\n ? [T] extends [DefaultT]\n ? any\n : T\n : T\n\nexport function createFormHookContexts() {\n // We should never hit the `null` case here\n const fieldContext = createContext<Accessor<AnyFieldApi>>(\n null as unknown as Accessor<AnyFieldApi>,\n )\n\n function useFieldContext<TData>() {\n const field = useContext(fieldContext)\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!field) {\n throw new Error(\n '`fieldContext` only works when within a `fieldComponent` passed to `createFormHook`',\n )\n }\n\n return field as Accessor<\n FieldApi<\n any,\n string,\n TData,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n >\n >\n }\n\n // We should never hit the `null` case here\n const formContext = createContext<AnyFormApi>(null as unknown as AnyFormApi)\n\n function useFormContext() {\n const form = useContext(formContext)\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!form) {\n throw new Error(\n '`formContext` only works when within a `formComponent` passed to `createFormHook`',\n )\n }\n\n return form as SolidFormExtendedApi<\n // If you need access to the form data, you need to use `withForm` instead\n Record<string, never>,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n >\n }\n\n return { fieldContext, useFieldContext, useFormContext, formContext }\n}\n\ninterface CreateFormHookProps<\n TFieldComponents extends Record<string, Component<any>>,\n TFormComponents extends Record<string, Component<any>>,\n> {\n fieldComponents: TFieldComponents\n fieldContext: Context<Accessor<AnyFieldApi>>\n formComponents: TFormComponents\n formContext: Context<AnyFormApi>\n}\n/**\n * @private\n */\nexport type AppFieldExtendedSolidFormApi<\n TFormData,\n TOnMount extends undefined | FormValidateOrFn<TFormData>,\n TOnChange extends undefined | FormValidateOrFn<TFormData>,\n TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n TSubmitMeta,\n TFieldComponents extends Record<string, Component<any>>,\n TFormComponents extends Record<string, Component<any>>,\n> = SolidFormExtendedApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n> &\n NoInfer<TFormComponents> & {\n AppField: FieldComponent<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta,\n NoInfer<TFieldComponents>\n >\n AppForm: Component<ParentProps>\n }\n\nexport interface WithFormProps<\n TFormData,\n TOnMount extends undefined | FormValidateOrFn<TFormData>,\n TOnChange extends undefined | FormValidateOrFn<TFormData>,\n TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n TSubmitMeta,\n TFieldComponents extends Record<string, Component<any>>,\n TFormComponents extends Record<string, Component<any>>,\n TRenderProps extends Record<string, unknown> = Record<string, never>,\n> extends FormOptions<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n> {\n // Optional, but adds props to the `render` function outside of `form`\n props?: TRenderProps\n render: (\n props: ParentProps<\n NoInfer<TRenderProps> & {\n form: AppFieldExtendedSolidFormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta,\n TFieldComponents,\n TFormComponents\n >\n }\n >,\n ) => JSXElement\n}\n\nexport interface WithFieldGroupProps<\n TFieldGroupData,\n TFieldComponents extends Record<string, Component<any>>,\n TFormComponents extends Record<string, Component<any>>,\n TSubmitMeta,\n TRenderProps extends Record<string, unknown> = Record<string, never>,\n> extends BaseFormOptions<TFieldGroupData, TSubmitMeta> {\n // Optional, but adds props to the `render` function outside of `form`\n props?: TRenderProps\n render: (\n props: ParentProps<\n NoInfer<TRenderProps> & {\n group: AppFieldExtendedSolidFieldGroupApi<\n unknown,\n TFieldGroupData,\n string | FieldsMap<unknown, TFieldGroupData>,\n undefined | FormValidateOrFn<unknown>,\n undefined | FormValidateOrFn<unknown>,\n undefined | FormAsyncValidateOrFn<unknown>,\n undefined | FormValidateOrFn<unknown>,\n undefined | FormAsyncValidateOrFn<unknown>,\n undefined | FormValidateOrFn<unknown>,\n undefined | FormAsyncValidateOrFn<unknown>,\n undefined | FormValidateOrFn<unknown>,\n undefined | FormAsyncValidateOrFn<unknown>,\n undefined | FormAsyncValidateOrFn<unknown>,\n // this types it as 'never' in the render prop. It should prevent any\n // untyped meta passed to the handleSubmit by accident.\n unknown extends TSubmitMeta ? never : TSubmitMeta,\n TFieldComponents,\n TFormComponents\n >\n }\n >,\n ) => JSXElement\n}\n\nexport function createFormHook<\n const TComponents extends Record<string, Component<any>>,\n const TFormComponents extends Record<string, Component<any>>,\n>(opts: CreateFormHookProps<TComponents, TFormComponents>) {\n function useAppForm<\n TFormData,\n TOnMount extends undefined | FormValidateOrFn<TFormData>,\n TOnChange extends undefined | FormValidateOrFn<TFormData>,\n TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n TSubmitMeta,\n >(\n props: Accessor<\n FormOptions<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >\n >,\n ): AppFieldExtendedSolidFormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta,\n TComponents,\n TFormComponents\n > {\n const form = createForm(props)\n\n const AppForm = ((formProps) => {\n return (\n <opts.formContext.Provider value={form}>\n {formProps.children}\n </opts.formContext.Provider>\n )\n }) as Component<ParentProps>\n\n const AppField = ((_props) => {\n const [childProps, fieldProps] = splitProps(_props, ['children'])\n return (\n <form.Field {...fieldProps}>\n {(field) => (\n <opts.fieldContext.Provider value={field}>\n {createComponent(\n () =>\n childProps.children(\n Object.assign(field, opts.fieldComponents),\n ),\n {},\n )}\n </opts.fieldContext.Provider>\n )}\n </form.Field>\n )\n }) as FieldComponent<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta,\n TComponents\n >\n\n const extendedForm: AppFieldExtendedSolidFormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta,\n TComponents,\n TFormComponents\n > = form as never\n extendedForm.AppField = AppField\n extendedForm.AppForm = AppForm\n for (const [key, value] of Object.entries(opts.formComponents)) {\n // Since it's a generic I need to cast it to an object\n ;(extendedForm as Record<string, any>)[key] = value\n }\n\n return extendedForm\n }\n\n function withForm<\n TFormData,\n TOnMount extends undefined | FormValidateOrFn<TFormData>,\n TOnChange extends undefined | FormValidateOrFn<TFormData>,\n TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n TSubmitMeta,\n TRenderProps extends Record<string, unknown> = {},\n >({\n render,\n props,\n }: WithFormProps<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta,\n TComponents,\n TFormComponents,\n TRenderProps\n >): WithFormProps<\n UnwrapOrAny<TFormData>,\n UnwrapDefaultOrAny<undefined | FormValidateOrFn<TFormData>, TOnMount>,\n UnwrapDefaultOrAny<undefined | FormValidateOrFn<TFormData>, TOnChange>,\n UnwrapDefaultOrAny<undefined | FormValidateOrFn<TFormData>, TOnChangeAsync>,\n UnwrapDefaultOrAny<undefined | FormValidateOrFn<TFormData>, TOnBlur>,\n UnwrapDefaultOrAny<undefined | FormValidateOrFn<TFormData>, TOnBlurAsync>,\n UnwrapDefaultOrAny<undefined | FormValidateOrFn<TFormData>, TOnSubmit>,\n UnwrapDefaultOrAny<undefined | FormValidateOrFn<TFormData>, TOnSubmitAsync>,\n UnwrapDefaultOrAny<undefined | FormValidateOrFn<TFormData>, TOnDynamic>,\n UnwrapDefaultOrAny<\n undefined | FormValidateOrFn<TFormData>,\n TOnDynamicAsync\n >,\n UnwrapDefaultOrAny<undefined | FormValidateOrFn<TFormData>, TOnServer>,\n UnwrapOrAny<TSubmitMeta>,\n UnwrapOrAny<TComponents>,\n UnwrapOrAny<TFormComponents>,\n UnwrapOrAny<TRenderProps>\n >['render'] {\n return (innerProps) => render({ ...props, ...innerProps })\n }\n\n function withFieldGroup<\n TFieldGroupData,\n TSubmitMeta,\n TRenderProps extends Record<string, unknown> = {},\n >({\n render,\n props,\n defaultValues,\n }: WithFieldGroupProps<\n TFieldGroupData,\n TComponents,\n TFormComponents,\n TSubmitMeta,\n TRenderProps\n >): <\n TFormData,\n TFields extends\n | DeepKeysOfType<TFormData, TFieldGroupData | null | undefined>\n | FieldsMap<TFormData, TFieldGroupData>,\n TOnMount extends undefined | FormValidateOrFn<TFormData>,\n TOnChange extends undefined | FormValidateOrFn<TFormData>,\n TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n TFormSubmitMeta,\n >(\n params: ParentProps<\n NoInfer<TRenderProps> & {\n form:\n | AppFieldExtendedSolidFormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n unknown extends TSubmitMeta ? TFormSubmitMeta : TSubmitMeta,\n TComponents,\n TFormComponents\n >\n | AppFieldExtendedSolidFieldGroupApi<\n // Since this only occurs if you nest it within other field groups, it can be more\n // lenient with the types.\n unknown,\n TFormData,\n string | FieldsMap<unknown, TFormData>,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n unknown extends TSubmitMeta ? TFormSubmitMeta : TSubmitMeta,\n TComponents,\n TFormComponents\n >\n fields: TFields\n }\n >,\n ) => JSXElement {\n return function Render(innerProps) {\n const fieldGroupProps = {\n form: innerProps.form,\n fields: innerProps.fields,\n defaultValues,\n formComponents: opts.formComponents,\n }\n const fieldGroupApi = createFieldGroup(() => fieldGroupProps)\n\n return render({ ...props, ...innerProps, group: fieldGroupApi as any })\n }\n }\n\n return {\n useAppForm,\n withForm,\n withFieldGroup,\n }\n}\n"],"names":["createFormHookContexts","fieldContext","createContext","useFieldContext","field","useContext","Error","formContext","useFormContext","form","createFormHook","opts","useAppForm","props","createForm","AppForm","formProps","_$createComponent","Provider","value","children","AppField","_props","childProps","fieldProps","splitProps","Field","_$mergeProps","createComponent","Object","assign","fieldComponents","extendedForm","key","entries","formComponents","withForm","render","innerProps","withFieldGroup","defaultValues","Render","fieldGroupProps","fields","fieldGroupApi","createFieldGroup","group"],"mappings":";;;;;;AAmEO,SAASA,yBAAyB;AAEvC,QAAMC,eAAeC,QAAAA,cACnB,IACF;AAEA,WAASC,kBAAyB;AAChC,UAAMC,QAAQC,QAAAA,WAAWJ,YAAY;AAGrC,QAAI,CAACG,OAAO;AACV,YAAM,IAAIE,MACR,qFACF;AAAA,IACF;AAEA,WAAOF;AAAAA,EA2BT;AAGA,QAAMG,cAAcL,QAAAA,cAA0B,IAA6B;AAE3E,WAASM,iBAAiB;AACxB,UAAMC,OAAOJ,QAAAA,WAAWE,WAAW;AAGnC,QAAI,CAACE,MAAM;AACT,YAAM,IAAIH,MACR,mFACF;AAAA,IACF;AAEA,WAAOG;AAAAA,EAeT;AAEA,SAAO;AAAA,IAAER;AAAAA,IAAcE;AAAAA,IAAiBK;AAAAA,IAAgBD;AAAAA,EAAAA;AAC1D;AA2JO,SAASG,eAGdC,MAAyD;AACzD,WAASC,WAcPC,OA+BA;AACA,UAAMJ,OAAOK,WAAAA,WAAWD,KAAK;AAE7B,UAAME,WAAYC,CAAAA,cAAc;AAC9B,aAAAC,oBACGN,KAAKJ,YAAYW,UAAQ;AAAA,QAACC,OAAOV;AAAAA,QAAI,IAAAW,WAAA;AAAA,iBACnCJ,UAAUI;AAAAA,QAAQ;AAAA,MAAA,CAAA;AAAA,IAGzB;AAEA,UAAMC,YAAaC,CAAAA,WAAW;AAC5B,YAAM,CAACC,YAAYC,UAAU,IAAIC,QAAAA,WAAWH,QAAQ,CAAC,UAAU,CAAC;AAChE,aAAAL,IAAAA,gBACGR,KAAKiB,OAAKC,IAAAA,WAAKH,YAAU;AAAA,QAAAJ,UACtBhB,CAAAA,UAAKa,IAAAA,gBACJN,KAAKV,aAAaiB,UAAQ;AAAA,UAACC,OAAOf;AAAAA,UAAK,IAAAgB,WAAA;AAAA,mBACrCQ,wBACC,MACEL,WAAWH,SACTS,OAAOC,OAAO1B,OAAOO,KAAKoB,eAAe,CAC3C,GACF,CAAA,CACF;AAAA,UAAC;AAAA,QAAA,CAAA;AAAA,MAAA,CAEJ,CAAA;AAAA,IAGP;AAgBA,UAAMC,eAeFvB;AACJuB,iBAAaX,WAAWA;AACxBW,iBAAajB,UAAUA;AACvB,eAAW,CAACkB,KAAKd,KAAK,KAAKU,OAAOK,QAAQvB,KAAKwB,cAAc,GAAG;AAE5DH,mBAAqCC,GAAG,IAAId;AAAAA,IAChD;AAEA,WAAOa;AAAAA,EACT;AAEA,WAASI,SAcP;AAAA,IACAC;AAAAA,IACAxB;AAAAA,EAAAA,GAoCU;AACV,WAAQyB,gBAAeD,OAAO;AAAA,MAAE,GAAGxB;AAAAA,MAAO,GAAGyB;AAAAA,IAAAA,CAAY;AAAA,EAC3D;AAEA,WAASC,eAIP;AAAA,IACAF;AAAAA,IACAxB;AAAAA,IACA2B;AAAAA,EAAAA,GAkEc;AACd,WAAO,SAASC,OAAOH,YAAY;AACjC,YAAMI,kBAAkB;AAAA,QACtBjC,MAAM6B,WAAW7B;AAAAA,QACjBkC,QAAQL,WAAWK;AAAAA,QACnBH;AAAAA,QACAL,gBAAgBxB,KAAKwB;AAAAA,MAAAA;AAEvB,YAAMS,gBAAgBC,kCAAiB,MAAMH,eAAe;AAE5D,aAAOL,OAAO;AAAA,QAAE,GAAGxB;AAAAA,QAAO,GAAGyB;AAAAA,QAAYQ,OAAOF;AAAAA,MAAAA,CAAsB;AAAA,IACxE;AAAA,EACF;AAEA,SAAO;AAAA,IACLhC;AAAAA,IACAwB;AAAAA,IACAG;AAAAA,EAAAA;AAEJ;;;"}
1
+ {"version":3,"file":"createFormHook.cjs","sources":["../../src/createFormHook.tsx"],"sourcesContent":["import {\n createComponent,\n createContext,\n mergeProps,\n splitProps,\n useContext,\n} from 'solid-js'\nimport { createFieldGroup } from './createFieldGroup'\nimport { createForm } from './createForm'\nimport type {\n AnyFieldApi,\n AnyFormApi,\n BaseFormOptions,\n DeepKeysOfType,\n FieldApi,\n FieldsMap,\n FormAsyncValidateOrFn,\n FormOptions,\n FormValidateOrFn,\n} from '@tanstack/form-core'\nimport type {\n Accessor,\n Component,\n Context,\n JSXElement,\n ParentProps,\n} from 'solid-js'\nimport type { FieldComponent } from './createField'\nimport type { AppFieldExtendedSolidFieldGroupApi } from './createFieldGroup'\nimport type { SolidFormExtendedApi } from './createForm'\n\n/**\n * TypeScript inferencing is weird.\n *\n * If you have:\n *\n * @example\n *\n * interface Args<T> {\n * arg?: T\n * }\n *\n * function test<T>(arg?: Partial<Args<T>>): T {\n * return 0 as any;\n * }\n *\n * const a = test({});\n *\n * Then `T` will default to `unknown`.\n *\n * However, if we change `test` to be:\n *\n * @example\n *\n * function test<T extends undefined>(arg?: Partial<Args<T>>): T;\n *\n * Then `T` becomes `undefined`.\n *\n * Here, we are checking if the passed type `T` extends `DefaultT` and **only**\n * `DefaultT`, as if that's the case we assume that inferencing has not occurred.\n */\ntype UnwrapOrAny<T> = [unknown] extends [T] ? any : T\ntype UnwrapDefaultOrAny<DefaultT, T> = [DefaultT] extends [T]\n ? [T] extends [DefaultT]\n ? any\n : T\n : T\n\nexport function createFormHookContexts() {\n // We should never hit the `null` case here\n const fieldContext = createContext<Accessor<AnyFieldApi>>(\n null as unknown as Accessor<AnyFieldApi>,\n )\n\n function useFieldContext<TData>() {\n const field = useContext(fieldContext)\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!field) {\n throw new Error(\n '`fieldContext` only works when within a `fieldComponent` passed to `createFormHook`',\n )\n }\n\n return field as Accessor<\n FieldApi<\n any,\n string,\n TData,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n >\n >\n }\n\n // We should never hit the `null` case here\n const formContext = createContext<AnyFormApi>(null as unknown as AnyFormApi)\n\n function useFormContext() {\n const form = useContext(formContext)\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!form) {\n throw new Error(\n '`formContext` only works when within a `formComponent` passed to `createFormHook`',\n )\n }\n\n return form as SolidFormExtendedApi<\n // If you need access to the form data, you need to use `withForm` instead\n Record<string, never>,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n >\n }\n\n return { fieldContext, useFieldContext, useFormContext, formContext }\n}\n\ninterface CreateFormHookProps<\n TFieldComponents extends Record<string, Component<any>>,\n TFormComponents extends Record<string, Component<any>>,\n> {\n fieldComponents: TFieldComponents\n fieldContext: Context<Accessor<AnyFieldApi>>\n formComponents: TFormComponents\n formContext: Context<AnyFormApi>\n}\n/**\n * @private\n */\nexport type AppFieldExtendedSolidFormApi<\n TFormData,\n TOnMount extends undefined | FormValidateOrFn<TFormData>,\n TOnChange extends undefined | FormValidateOrFn<TFormData>,\n TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n TSubmitMeta,\n TFieldComponents extends Record<string, Component<any>>,\n TFormComponents extends Record<string, Component<any>>,\n> = SolidFormExtendedApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n> &\n NoInfer<TFormComponents> & {\n AppField: FieldComponent<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta,\n NoInfer<TFieldComponents>\n >\n AppForm: Component<ParentProps>\n }\n\nexport interface WithFormProps<\n TFormData,\n TOnMount extends undefined | FormValidateOrFn<TFormData>,\n TOnChange extends undefined | FormValidateOrFn<TFormData>,\n TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n TSubmitMeta,\n TFieldComponents extends Record<string, Component<any>>,\n TFormComponents extends Record<string, Component<any>>,\n TRenderProps extends Record<string, unknown> = Record<string, never>,\n> extends FormOptions<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n> {\n // Optional, but adds props to the `render` function outside of `form`\n props?: TRenderProps\n render: (\n props: ParentProps<\n NoInfer<TRenderProps> & {\n form: AppFieldExtendedSolidFormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta,\n TFieldComponents,\n TFormComponents\n >\n }\n >,\n ) => JSXElement\n}\n\nexport interface WithFieldGroupProps<\n TFieldGroupData,\n TFieldComponents extends Record<string, Component<any>>,\n TFormComponents extends Record<string, Component<any>>,\n TSubmitMeta,\n TRenderProps extends Record<string, unknown> = Record<string, never>,\n> extends BaseFormOptions<TFieldGroupData, TSubmitMeta> {\n // Optional, but adds props to the `render` function outside of `form`\n props?: TRenderProps\n render: (\n props: ParentProps<\n NoInfer<TRenderProps> & {\n group: AppFieldExtendedSolidFieldGroupApi<\n unknown,\n TFieldGroupData,\n string | FieldsMap<unknown, TFieldGroupData>,\n undefined | FormValidateOrFn<unknown>,\n undefined | FormValidateOrFn<unknown>,\n undefined | FormAsyncValidateOrFn<unknown>,\n undefined | FormValidateOrFn<unknown>,\n undefined | FormAsyncValidateOrFn<unknown>,\n undefined | FormValidateOrFn<unknown>,\n undefined | FormAsyncValidateOrFn<unknown>,\n undefined | FormValidateOrFn<unknown>,\n undefined | FormAsyncValidateOrFn<unknown>,\n undefined | FormAsyncValidateOrFn<unknown>,\n // this types it as 'never' in the render prop. It should prevent any\n // untyped meta passed to the handleSubmit by accident.\n unknown extends TSubmitMeta ? never : TSubmitMeta,\n TFieldComponents,\n TFormComponents\n >\n }\n >,\n ) => JSXElement\n}\n\nexport function createFormHook<\n const TComponents extends Record<string, Component<any>>,\n const TFormComponents extends Record<string, Component<any>>,\n>(opts: CreateFormHookProps<TComponents, TFormComponents>) {\n function useAppForm<\n TFormData,\n TOnMount extends undefined | FormValidateOrFn<TFormData>,\n TOnChange extends undefined | FormValidateOrFn<TFormData>,\n TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n TSubmitMeta,\n >(\n props: Accessor<\n FormOptions<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >\n >,\n ): AppFieldExtendedSolidFormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta,\n TComponents,\n TFormComponents\n > {\n const form = createForm(props)\n\n const AppForm = ((formProps) => {\n return (\n <opts.formContext.Provider value={form}>\n {formProps.children}\n </opts.formContext.Provider>\n )\n }) as Component<ParentProps>\n\n const AppField = ((_props) => {\n const [childProps, fieldProps] = splitProps(_props, ['children'])\n return (\n <form.Field {...fieldProps}>\n {(field) => (\n <opts.fieldContext.Provider value={field}>\n {createComponent(\n () =>\n childProps.children(\n Object.assign(field, opts.fieldComponents),\n ),\n {},\n )}\n </opts.fieldContext.Provider>\n )}\n </form.Field>\n )\n }) as FieldComponent<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta,\n TComponents\n >\n\n const extendedForm: AppFieldExtendedSolidFormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta,\n TComponents,\n TFormComponents\n > = form as never\n extendedForm.AppField = AppField\n extendedForm.AppForm = AppForm\n for (const [key, value] of Object.entries(opts.formComponents)) {\n // Since it's a generic I need to cast it to an object\n ;(extendedForm as Record<string, any>)[key] = value\n }\n\n return extendedForm\n }\n\n function withForm<\n TFormData,\n TOnMount extends undefined | FormValidateOrFn<TFormData>,\n TOnChange extends undefined | FormValidateOrFn<TFormData>,\n TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n TSubmitMeta,\n TRenderProps extends Record<string, unknown> = {},\n >({\n render,\n props,\n }: WithFormProps<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta,\n TComponents,\n TFormComponents,\n TRenderProps\n >): WithFormProps<\n UnwrapOrAny<TFormData>,\n UnwrapDefaultOrAny<undefined | FormValidateOrFn<TFormData>, TOnMount>,\n UnwrapDefaultOrAny<undefined | FormValidateOrFn<TFormData>, TOnChange>,\n UnwrapDefaultOrAny<undefined | FormValidateOrFn<TFormData>, TOnChangeAsync>,\n UnwrapDefaultOrAny<undefined | FormValidateOrFn<TFormData>, TOnBlur>,\n UnwrapDefaultOrAny<undefined | FormValidateOrFn<TFormData>, TOnBlurAsync>,\n UnwrapDefaultOrAny<undefined | FormValidateOrFn<TFormData>, TOnSubmit>,\n UnwrapDefaultOrAny<undefined | FormValidateOrFn<TFormData>, TOnSubmitAsync>,\n UnwrapDefaultOrAny<undefined | FormValidateOrFn<TFormData>, TOnDynamic>,\n UnwrapDefaultOrAny<\n undefined | FormValidateOrFn<TFormData>,\n TOnDynamicAsync\n >,\n UnwrapDefaultOrAny<undefined | FormValidateOrFn<TFormData>, TOnServer>,\n UnwrapOrAny<TSubmitMeta>,\n UnwrapOrAny<TComponents>,\n UnwrapOrAny<TFormComponents>,\n UnwrapOrAny<TRenderProps>\n >['render'] {\n return (innerProps) =>\n createComponent(\n render as Component<any>,\n mergeProps(props ?? {}, innerProps),\n )\n }\n\n function withFieldGroup<\n TFieldGroupData,\n TSubmitMeta,\n TRenderProps extends Record<string, unknown> = {},\n >({\n render,\n props,\n defaultValues,\n }: WithFieldGroupProps<\n TFieldGroupData,\n TComponents,\n TFormComponents,\n TSubmitMeta,\n TRenderProps\n >): <\n TFormData,\n TFields extends\n | DeepKeysOfType<TFormData, TFieldGroupData | null | undefined>\n | FieldsMap<TFormData, TFieldGroupData>,\n TOnMount extends undefined | FormValidateOrFn<TFormData>,\n TOnChange extends undefined | FormValidateOrFn<TFormData>,\n TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n TFormSubmitMeta,\n >(\n params: ParentProps<\n NoInfer<TRenderProps> & {\n form:\n | AppFieldExtendedSolidFormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n unknown extends TSubmitMeta ? TFormSubmitMeta : TSubmitMeta,\n TComponents,\n TFormComponents\n >\n | AppFieldExtendedSolidFieldGroupApi<\n // Since this only occurs if you nest it within other field groups, it can be more\n // lenient with the types.\n unknown,\n TFormData,\n string | FieldsMap<unknown, TFormData>,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n unknown extends TSubmitMeta ? TFormSubmitMeta : TSubmitMeta,\n TComponents,\n TFormComponents\n >\n fields: TFields\n }\n >,\n ) => JSXElement {\n return function Render(innerProps) {\n const fieldGroupProps = {\n form: innerProps.form,\n fields: innerProps.fields,\n defaultValues,\n formComponents: opts.formComponents,\n }\n const fieldGroupApi = createFieldGroup(() => fieldGroupProps)\n return createComponent(\n render as Component<any>,\n mergeProps(props ?? {}, innerProps, { group: fieldGroupApi as any }),\n )\n }\n }\n\n return {\n useAppForm,\n withForm,\n withFieldGroup,\n }\n}\n"],"names":["createFormHookContexts","fieldContext","createContext","useFieldContext","field","useContext","Error","formContext","useFormContext","form","createFormHook","opts","useAppForm","props","createForm","AppForm","formProps","_$createComponent","Provider","value","children","AppField","_props","childProps","fieldProps","splitProps","Field","_$mergeProps","createComponent","Object","assign","fieldComponents","extendedForm","key","entries","formComponents","withForm","render","innerProps","mergeProps","withFieldGroup","defaultValues","Render","fieldGroupProps","fields","fieldGroupApi","createFieldGroup","group"],"mappings":";;;;;;AAoEO,SAASA,yBAAyB;AAEvC,QAAMC,eAAeC,QAAAA,cACnB,IACF;AAEA,WAASC,kBAAyB;AAChC,UAAMC,QAAQC,QAAAA,WAAWJ,YAAY;AAGrC,QAAI,CAACG,OAAO;AACV,YAAM,IAAIE,MACR,qFACF;AAAA,IACF;AAEA,WAAOF;AAAAA,EA2BT;AAGA,QAAMG,cAAcL,QAAAA,cAA0B,IAA6B;AAE3E,WAASM,iBAAiB;AACxB,UAAMC,OAAOJ,QAAAA,WAAWE,WAAW;AAGnC,QAAI,CAACE,MAAM;AACT,YAAM,IAAIH,MACR,mFACF;AAAA,IACF;AAEA,WAAOG;AAAAA,EAeT;AAEA,SAAO;AAAA,IAAER;AAAAA,IAAcE;AAAAA,IAAiBK;AAAAA,IAAgBD;AAAAA,EAAAA;AAC1D;AA2JO,SAASG,eAGdC,MAAyD;AACzD,WAASC,WAcPC,OA+BA;AACA,UAAMJ,OAAOK,WAAAA,WAAWD,KAAK;AAE7B,UAAME,WAAYC,CAAAA,cAAc;AAC9B,aAAAC,oBACGN,KAAKJ,YAAYW,UAAQ;AAAA,QAACC,OAAOV;AAAAA,QAAI,IAAAW,WAAA;AAAA,iBACnCJ,UAAUI;AAAAA,QAAQ;AAAA,MAAA,CAAA;AAAA,IAGzB;AAEA,UAAMC,YAAaC,CAAAA,WAAW;AAC5B,YAAM,CAACC,YAAYC,UAAU,IAAIC,QAAAA,WAAWH,QAAQ,CAAC,UAAU,CAAC;AAChE,aAAAL,IAAAA,gBACGR,KAAKiB,OAAKC,IAAAA,WAAKH,YAAU;AAAA,QAAAJ,UACtBhB,CAAAA,UAAKa,IAAAA,gBACJN,KAAKV,aAAaiB,UAAQ;AAAA,UAACC,OAAOf;AAAAA,UAAK,IAAAgB,WAAA;AAAA,mBACrCQ,wBACC,MACEL,WAAWH,SACTS,OAAOC,OAAO1B,OAAOO,KAAKoB,eAAe,CAC3C,GACF,CAAA,CACF;AAAA,UAAC;AAAA,QAAA,CAAA;AAAA,MAAA,CAEJ,CAAA;AAAA,IAGP;AAgBA,UAAMC,eAeFvB;AACJuB,iBAAaX,WAAWA;AACxBW,iBAAajB,UAAUA;AACvB,eAAW,CAACkB,KAAKd,KAAK,KAAKU,OAAOK,QAAQvB,KAAKwB,cAAc,GAAG;AAE5DH,mBAAqCC,GAAG,IAAId;AAAAA,IAChD;AAEA,WAAOa;AAAAA,EACT;AAEA,WAASI,SAcP;AAAA,IACAC;AAAAA,IACAxB;AAAAA,EAAAA,GAoCU;AACV,WAAQyB,CAAAA,eACNV,QAAAA,gBACES,QACAE,QAAAA,WAAW1B,SAAS,CAAA,GAAIyB,UAAU,CACpC;AAAA,EACJ;AAEA,WAASE,eAIP;AAAA,IACAH;AAAAA,IACAxB;AAAAA,IACA4B;AAAAA,EAAAA,GAkEc;AACd,WAAO,SAASC,OAAOJ,YAAY;AACjC,YAAMK,kBAAkB;AAAA,QACtBlC,MAAM6B,WAAW7B;AAAAA,QACjBmC,QAAQN,WAAWM;AAAAA,QACnBH;AAAAA,QACAN,gBAAgBxB,KAAKwB;AAAAA,MAAAA;AAEvB,YAAMU,gBAAgBC,kCAAiB,MAAMH,eAAe;AAC5D,aAAOf,QAAAA,gBACLS,QACAE,QAAAA,WAAW1B,SAAS,CAAA,GAAIyB,YAAY;AAAA,QAAES,OAAOF;AAAAA,MAAAA,CAAsB,CACrE;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACLjC;AAAAA,IACAwB;AAAAA,IACAI;AAAAA,EAAAA;AAEJ;;;"}
@@ -1,5 +1,5 @@
1
- import { createComponent, mergeProps } from "solid-js/web";
2
- import { createContext, useContext, splitProps, createComponent as createComponent$1 } from "solid-js";
1
+ import { createComponent as createComponent$1, mergeProps as mergeProps$1 } from "solid-js/web";
2
+ import { createContext, useContext, createComponent, mergeProps, splitProps } from "solid-js";
3
3
  import { createFieldGroup } from "./createFieldGroup.js";
4
4
  import { createForm } from "./createForm.js";
5
5
  function createFormHookContexts() {
@@ -30,7 +30,7 @@ function createFormHook(opts) {
30
30
  function useAppForm(props) {
31
31
  const form = createForm(props);
32
32
  const AppForm = ((formProps) => {
33
- return createComponent(opts.formContext.Provider, {
33
+ return createComponent$1(opts.formContext.Provider, {
34
34
  value: form,
35
35
  get children() {
36
36
  return formProps.children;
@@ -39,11 +39,11 @@ function createFormHook(opts) {
39
39
  });
40
40
  const AppField = ((_props) => {
41
41
  const [childProps, fieldProps] = splitProps(_props, ["children"]);
42
- return createComponent(form.Field, mergeProps(fieldProps, {
43
- children: (field) => createComponent(opts.fieldContext.Provider, {
42
+ return createComponent$1(form.Field, mergeProps$1(fieldProps, {
43
+ children: (field) => createComponent$1(opts.fieldContext.Provider, {
44
44
  value: field,
45
45
  get children() {
46
- return createComponent$1(() => childProps.children(Object.assign(field, opts.fieldComponents)), {});
46
+ return createComponent(() => childProps.children(Object.assign(field, opts.fieldComponents)), {});
47
47
  }
48
48
  })
49
49
  }));
@@ -60,10 +60,7 @@ function createFormHook(opts) {
60
60
  render,
61
61
  props
62
62
  }) {
63
- return (innerProps) => render({
64
- ...props,
65
- ...innerProps
66
- });
63
+ return (innerProps) => createComponent(render, mergeProps(props ?? {}, innerProps));
67
64
  }
68
65
  function withFieldGroup({
69
66
  render,
@@ -78,11 +75,9 @@ function createFormHook(opts) {
78
75
  formComponents: opts.formComponents
79
76
  };
80
77
  const fieldGroupApi = createFieldGroup(() => fieldGroupProps);
81
- return render({
82
- ...props,
83
- ...innerProps,
78
+ return createComponent(render, mergeProps(props ?? {}, innerProps, {
84
79
  group: fieldGroupApi
85
- });
80
+ }));
86
81
  };
87
82
  }
88
83
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"createFormHook.js","sources":["../../src/createFormHook.tsx"],"sourcesContent":["import {\n createComponent,\n createContext,\n splitProps,\n useContext,\n} from 'solid-js'\nimport { createFieldGroup } from './createFieldGroup'\nimport { createForm } from './createForm'\nimport type {\n AnyFieldApi,\n AnyFormApi,\n BaseFormOptions,\n DeepKeysOfType,\n FieldApi,\n FieldsMap,\n FormAsyncValidateOrFn,\n FormOptions,\n FormValidateOrFn,\n} from '@tanstack/form-core'\nimport type {\n Accessor,\n Component,\n Context,\n JSXElement,\n ParentProps,\n} from 'solid-js'\nimport type { FieldComponent } from './createField'\nimport type { AppFieldExtendedSolidFieldGroupApi } from './createFieldGroup'\nimport type { SolidFormExtendedApi } from './createForm'\n\n/**\n * TypeScript inferencing is weird.\n *\n * If you have:\n *\n * @example\n *\n * interface Args<T> {\n * arg?: T\n * }\n *\n * function test<T>(arg?: Partial<Args<T>>): T {\n * return 0 as any;\n * }\n *\n * const a = test({});\n *\n * Then `T` will default to `unknown`.\n *\n * However, if we change `test` to be:\n *\n * @example\n *\n * function test<T extends undefined>(arg?: Partial<Args<T>>): T;\n *\n * Then `T` becomes `undefined`.\n *\n * Here, we are checking if the passed type `T` extends `DefaultT` and **only**\n * `DefaultT`, as if that's the case we assume that inferencing has not occurred.\n */\ntype UnwrapOrAny<T> = [unknown] extends [T] ? any : T\ntype UnwrapDefaultOrAny<DefaultT, T> = [DefaultT] extends [T]\n ? [T] extends [DefaultT]\n ? any\n : T\n : T\n\nexport function createFormHookContexts() {\n // We should never hit the `null` case here\n const fieldContext = createContext<Accessor<AnyFieldApi>>(\n null as unknown as Accessor<AnyFieldApi>,\n )\n\n function useFieldContext<TData>() {\n const field = useContext(fieldContext)\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!field) {\n throw new Error(\n '`fieldContext` only works when within a `fieldComponent` passed to `createFormHook`',\n )\n }\n\n return field as Accessor<\n FieldApi<\n any,\n string,\n TData,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n >\n >\n }\n\n // We should never hit the `null` case here\n const formContext = createContext<AnyFormApi>(null as unknown as AnyFormApi)\n\n function useFormContext() {\n const form = useContext(formContext)\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!form) {\n throw new Error(\n '`formContext` only works when within a `formComponent` passed to `createFormHook`',\n )\n }\n\n return form as SolidFormExtendedApi<\n // If you need access to the form data, you need to use `withForm` instead\n Record<string, never>,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n >\n }\n\n return { fieldContext, useFieldContext, useFormContext, formContext }\n}\n\ninterface CreateFormHookProps<\n TFieldComponents extends Record<string, Component<any>>,\n TFormComponents extends Record<string, Component<any>>,\n> {\n fieldComponents: TFieldComponents\n fieldContext: Context<Accessor<AnyFieldApi>>\n formComponents: TFormComponents\n formContext: Context<AnyFormApi>\n}\n/**\n * @private\n */\nexport type AppFieldExtendedSolidFormApi<\n TFormData,\n TOnMount extends undefined | FormValidateOrFn<TFormData>,\n TOnChange extends undefined | FormValidateOrFn<TFormData>,\n TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n TSubmitMeta,\n TFieldComponents extends Record<string, Component<any>>,\n TFormComponents extends Record<string, Component<any>>,\n> = SolidFormExtendedApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n> &\n NoInfer<TFormComponents> & {\n AppField: FieldComponent<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta,\n NoInfer<TFieldComponents>\n >\n AppForm: Component<ParentProps>\n }\n\nexport interface WithFormProps<\n TFormData,\n TOnMount extends undefined | FormValidateOrFn<TFormData>,\n TOnChange extends undefined | FormValidateOrFn<TFormData>,\n TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n TSubmitMeta,\n TFieldComponents extends Record<string, Component<any>>,\n TFormComponents extends Record<string, Component<any>>,\n TRenderProps extends Record<string, unknown> = Record<string, never>,\n> extends FormOptions<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n> {\n // Optional, but adds props to the `render` function outside of `form`\n props?: TRenderProps\n render: (\n props: ParentProps<\n NoInfer<TRenderProps> & {\n form: AppFieldExtendedSolidFormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta,\n TFieldComponents,\n TFormComponents\n >\n }\n >,\n ) => JSXElement\n}\n\nexport interface WithFieldGroupProps<\n TFieldGroupData,\n TFieldComponents extends Record<string, Component<any>>,\n TFormComponents extends Record<string, Component<any>>,\n TSubmitMeta,\n TRenderProps extends Record<string, unknown> = Record<string, never>,\n> extends BaseFormOptions<TFieldGroupData, TSubmitMeta> {\n // Optional, but adds props to the `render` function outside of `form`\n props?: TRenderProps\n render: (\n props: ParentProps<\n NoInfer<TRenderProps> & {\n group: AppFieldExtendedSolidFieldGroupApi<\n unknown,\n TFieldGroupData,\n string | FieldsMap<unknown, TFieldGroupData>,\n undefined | FormValidateOrFn<unknown>,\n undefined | FormValidateOrFn<unknown>,\n undefined | FormAsyncValidateOrFn<unknown>,\n undefined | FormValidateOrFn<unknown>,\n undefined | FormAsyncValidateOrFn<unknown>,\n undefined | FormValidateOrFn<unknown>,\n undefined | FormAsyncValidateOrFn<unknown>,\n undefined | FormValidateOrFn<unknown>,\n undefined | FormAsyncValidateOrFn<unknown>,\n undefined | FormAsyncValidateOrFn<unknown>,\n // this types it as 'never' in the render prop. It should prevent any\n // untyped meta passed to the handleSubmit by accident.\n unknown extends TSubmitMeta ? never : TSubmitMeta,\n TFieldComponents,\n TFormComponents\n >\n }\n >,\n ) => JSXElement\n}\n\nexport function createFormHook<\n const TComponents extends Record<string, Component<any>>,\n const TFormComponents extends Record<string, Component<any>>,\n>(opts: CreateFormHookProps<TComponents, TFormComponents>) {\n function useAppForm<\n TFormData,\n TOnMount extends undefined | FormValidateOrFn<TFormData>,\n TOnChange extends undefined | FormValidateOrFn<TFormData>,\n TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n TSubmitMeta,\n >(\n props: Accessor<\n FormOptions<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >\n >,\n ): AppFieldExtendedSolidFormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta,\n TComponents,\n TFormComponents\n > {\n const form = createForm(props)\n\n const AppForm = ((formProps) => {\n return (\n <opts.formContext.Provider value={form}>\n {formProps.children}\n </opts.formContext.Provider>\n )\n }) as Component<ParentProps>\n\n const AppField = ((_props) => {\n const [childProps, fieldProps] = splitProps(_props, ['children'])\n return (\n <form.Field {...fieldProps}>\n {(field) => (\n <opts.fieldContext.Provider value={field}>\n {createComponent(\n () =>\n childProps.children(\n Object.assign(field, opts.fieldComponents),\n ),\n {},\n )}\n </opts.fieldContext.Provider>\n )}\n </form.Field>\n )\n }) as FieldComponent<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta,\n TComponents\n >\n\n const extendedForm: AppFieldExtendedSolidFormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta,\n TComponents,\n TFormComponents\n > = form as never\n extendedForm.AppField = AppField\n extendedForm.AppForm = AppForm\n for (const [key, value] of Object.entries(opts.formComponents)) {\n // Since it's a generic I need to cast it to an object\n ;(extendedForm as Record<string, any>)[key] = value\n }\n\n return extendedForm\n }\n\n function withForm<\n TFormData,\n TOnMount extends undefined | FormValidateOrFn<TFormData>,\n TOnChange extends undefined | FormValidateOrFn<TFormData>,\n TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n TSubmitMeta,\n TRenderProps extends Record<string, unknown> = {},\n >({\n render,\n props,\n }: WithFormProps<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta,\n TComponents,\n TFormComponents,\n TRenderProps\n >): WithFormProps<\n UnwrapOrAny<TFormData>,\n UnwrapDefaultOrAny<undefined | FormValidateOrFn<TFormData>, TOnMount>,\n UnwrapDefaultOrAny<undefined | FormValidateOrFn<TFormData>, TOnChange>,\n UnwrapDefaultOrAny<undefined | FormValidateOrFn<TFormData>, TOnChangeAsync>,\n UnwrapDefaultOrAny<undefined | FormValidateOrFn<TFormData>, TOnBlur>,\n UnwrapDefaultOrAny<undefined | FormValidateOrFn<TFormData>, TOnBlurAsync>,\n UnwrapDefaultOrAny<undefined | FormValidateOrFn<TFormData>, TOnSubmit>,\n UnwrapDefaultOrAny<undefined | FormValidateOrFn<TFormData>, TOnSubmitAsync>,\n UnwrapDefaultOrAny<undefined | FormValidateOrFn<TFormData>, TOnDynamic>,\n UnwrapDefaultOrAny<\n undefined | FormValidateOrFn<TFormData>,\n TOnDynamicAsync\n >,\n UnwrapDefaultOrAny<undefined | FormValidateOrFn<TFormData>, TOnServer>,\n UnwrapOrAny<TSubmitMeta>,\n UnwrapOrAny<TComponents>,\n UnwrapOrAny<TFormComponents>,\n UnwrapOrAny<TRenderProps>\n >['render'] {\n return (innerProps) => render({ ...props, ...innerProps })\n }\n\n function withFieldGroup<\n TFieldGroupData,\n TSubmitMeta,\n TRenderProps extends Record<string, unknown> = {},\n >({\n render,\n props,\n defaultValues,\n }: WithFieldGroupProps<\n TFieldGroupData,\n TComponents,\n TFormComponents,\n TSubmitMeta,\n TRenderProps\n >): <\n TFormData,\n TFields extends\n | DeepKeysOfType<TFormData, TFieldGroupData | null | undefined>\n | FieldsMap<TFormData, TFieldGroupData>,\n TOnMount extends undefined | FormValidateOrFn<TFormData>,\n TOnChange extends undefined | FormValidateOrFn<TFormData>,\n TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n TFormSubmitMeta,\n >(\n params: ParentProps<\n NoInfer<TRenderProps> & {\n form:\n | AppFieldExtendedSolidFormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n unknown extends TSubmitMeta ? TFormSubmitMeta : TSubmitMeta,\n TComponents,\n TFormComponents\n >\n | AppFieldExtendedSolidFieldGroupApi<\n // Since this only occurs if you nest it within other field groups, it can be more\n // lenient with the types.\n unknown,\n TFormData,\n string | FieldsMap<unknown, TFormData>,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n unknown extends TSubmitMeta ? TFormSubmitMeta : TSubmitMeta,\n TComponents,\n TFormComponents\n >\n fields: TFields\n }\n >,\n ) => JSXElement {\n return function Render(innerProps) {\n const fieldGroupProps = {\n form: innerProps.form,\n fields: innerProps.fields,\n defaultValues,\n formComponents: opts.formComponents,\n }\n const fieldGroupApi = createFieldGroup(() => fieldGroupProps)\n\n return render({ ...props, ...innerProps, group: fieldGroupApi as any })\n }\n }\n\n return {\n useAppForm,\n withForm,\n withFieldGroup,\n }\n}\n"],"names":["createFormHookContexts","fieldContext","createContext","useFieldContext","field","useContext","Error","formContext","useFormContext","form","createFormHook","opts","useAppForm","props","createForm","AppForm","formProps","_$createComponent","Provider","value","children","AppField","_props","childProps","fieldProps","splitProps","Field","_$mergeProps","createComponent","Object","assign","fieldComponents","extendedForm","key","entries","formComponents","withForm","render","innerProps","withFieldGroup","defaultValues","Render","fieldGroupProps","fields","fieldGroupApi","createFieldGroup","group"],"mappings":";;;;AAmEO,SAASA,yBAAyB;AAEvC,QAAMC,eAAeC,cACnB,IACF;AAEA,WAASC,kBAAyB;AAChC,UAAMC,QAAQC,WAAWJ,YAAY;AAGrC,QAAI,CAACG,OAAO;AACV,YAAM,IAAIE,MACR,qFACF;AAAA,IACF;AAEA,WAAOF;AAAAA,EA2BT;AAGA,QAAMG,cAAcL,cAA0B,IAA6B;AAE3E,WAASM,iBAAiB;AACxB,UAAMC,OAAOJ,WAAWE,WAAW;AAGnC,QAAI,CAACE,MAAM;AACT,YAAM,IAAIH,MACR,mFACF;AAAA,IACF;AAEA,WAAOG;AAAAA,EAeT;AAEA,SAAO;AAAA,IAAER;AAAAA,IAAcE;AAAAA,IAAiBK;AAAAA,IAAgBD;AAAAA,EAAAA;AAC1D;AA2JO,SAASG,eAGdC,MAAyD;AACzD,WAASC,WAcPC,OA+BA;AACA,UAAMJ,OAAOK,WAAWD,KAAK;AAE7B,UAAME,WAAYC,CAAAA,cAAc;AAC9B,aAAAC,gBACGN,KAAKJ,YAAYW,UAAQ;AAAA,QAACC,OAAOV;AAAAA,QAAI,IAAAW,WAAA;AAAA,iBACnCJ,UAAUI;AAAAA,QAAQ;AAAA,MAAA,CAAA;AAAA,IAGzB;AAEA,UAAMC,YAAaC,CAAAA,WAAW;AAC5B,YAAM,CAACC,YAAYC,UAAU,IAAIC,WAAWH,QAAQ,CAAC,UAAU,CAAC;AAChE,aAAAL,gBACGR,KAAKiB,OAAKC,WAAKH,YAAU;AAAA,QAAAJ,UACtBhB,CAAAA,UAAKa,gBACJN,KAAKV,aAAaiB,UAAQ;AAAA,UAACC,OAAOf;AAAAA,UAAK,IAAAgB,WAAA;AAAA,mBACrCQ,kBACC,MACEL,WAAWH,SACTS,OAAOC,OAAO1B,OAAOO,KAAKoB,eAAe,CAC3C,GACF,CAAA,CACF;AAAA,UAAC;AAAA,QAAA,CAAA;AAAA,MAAA,CAEJ,CAAA;AAAA,IAGP;AAgBA,UAAMC,eAeFvB;AACJuB,iBAAaX,WAAWA;AACxBW,iBAAajB,UAAUA;AACvB,eAAW,CAACkB,KAAKd,KAAK,KAAKU,OAAOK,QAAQvB,KAAKwB,cAAc,GAAG;AAE5DH,mBAAqCC,GAAG,IAAId;AAAAA,IAChD;AAEA,WAAOa;AAAAA,EACT;AAEA,WAASI,SAcP;AAAA,IACAC;AAAAA,IACAxB;AAAAA,EAAAA,GAoCU;AACV,WAAQyB,gBAAeD,OAAO;AAAA,MAAE,GAAGxB;AAAAA,MAAO,GAAGyB;AAAAA,IAAAA,CAAY;AAAA,EAC3D;AAEA,WAASC,eAIP;AAAA,IACAF;AAAAA,IACAxB;AAAAA,IACA2B;AAAAA,EAAAA,GAkEc;AACd,WAAO,SAASC,OAAOH,YAAY;AACjC,YAAMI,kBAAkB;AAAA,QACtBjC,MAAM6B,WAAW7B;AAAAA,QACjBkC,QAAQL,WAAWK;AAAAA,QACnBH;AAAAA,QACAL,gBAAgBxB,KAAKwB;AAAAA,MAAAA;AAEvB,YAAMS,gBAAgBC,iBAAiB,MAAMH,eAAe;AAE5D,aAAOL,OAAO;AAAA,QAAE,GAAGxB;AAAAA,QAAO,GAAGyB;AAAAA,QAAYQ,OAAOF;AAAAA,MAAAA,CAAsB;AAAA,IACxE;AAAA,EACF;AAEA,SAAO;AAAA,IACLhC;AAAAA,IACAwB;AAAAA,IACAG;AAAAA,EAAAA;AAEJ;"}
1
+ {"version":3,"file":"createFormHook.js","sources":["../../src/createFormHook.tsx"],"sourcesContent":["import {\n createComponent,\n createContext,\n mergeProps,\n splitProps,\n useContext,\n} from 'solid-js'\nimport { createFieldGroup } from './createFieldGroup'\nimport { createForm } from './createForm'\nimport type {\n AnyFieldApi,\n AnyFormApi,\n BaseFormOptions,\n DeepKeysOfType,\n FieldApi,\n FieldsMap,\n FormAsyncValidateOrFn,\n FormOptions,\n FormValidateOrFn,\n} from '@tanstack/form-core'\nimport type {\n Accessor,\n Component,\n Context,\n JSXElement,\n ParentProps,\n} from 'solid-js'\nimport type { FieldComponent } from './createField'\nimport type { AppFieldExtendedSolidFieldGroupApi } from './createFieldGroup'\nimport type { SolidFormExtendedApi } from './createForm'\n\n/**\n * TypeScript inferencing is weird.\n *\n * If you have:\n *\n * @example\n *\n * interface Args<T> {\n * arg?: T\n * }\n *\n * function test<T>(arg?: Partial<Args<T>>): T {\n * return 0 as any;\n * }\n *\n * const a = test({});\n *\n * Then `T` will default to `unknown`.\n *\n * However, if we change `test` to be:\n *\n * @example\n *\n * function test<T extends undefined>(arg?: Partial<Args<T>>): T;\n *\n * Then `T` becomes `undefined`.\n *\n * Here, we are checking if the passed type `T` extends `DefaultT` and **only**\n * `DefaultT`, as if that's the case we assume that inferencing has not occurred.\n */\ntype UnwrapOrAny<T> = [unknown] extends [T] ? any : T\ntype UnwrapDefaultOrAny<DefaultT, T> = [DefaultT] extends [T]\n ? [T] extends [DefaultT]\n ? any\n : T\n : T\n\nexport function createFormHookContexts() {\n // We should never hit the `null` case here\n const fieldContext = createContext<Accessor<AnyFieldApi>>(\n null as unknown as Accessor<AnyFieldApi>,\n )\n\n function useFieldContext<TData>() {\n const field = useContext(fieldContext)\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!field) {\n throw new Error(\n '`fieldContext` only works when within a `fieldComponent` passed to `createFormHook`',\n )\n }\n\n return field as Accessor<\n FieldApi<\n any,\n string,\n TData,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n >\n >\n }\n\n // We should never hit the `null` case here\n const formContext = createContext<AnyFormApi>(null as unknown as AnyFormApi)\n\n function useFormContext() {\n const form = useContext(formContext)\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!form) {\n throw new Error(\n '`formContext` only works when within a `formComponent` passed to `createFormHook`',\n )\n }\n\n return form as SolidFormExtendedApi<\n // If you need access to the form data, you need to use `withForm` instead\n Record<string, never>,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n >\n }\n\n return { fieldContext, useFieldContext, useFormContext, formContext }\n}\n\ninterface CreateFormHookProps<\n TFieldComponents extends Record<string, Component<any>>,\n TFormComponents extends Record<string, Component<any>>,\n> {\n fieldComponents: TFieldComponents\n fieldContext: Context<Accessor<AnyFieldApi>>\n formComponents: TFormComponents\n formContext: Context<AnyFormApi>\n}\n/**\n * @private\n */\nexport type AppFieldExtendedSolidFormApi<\n TFormData,\n TOnMount extends undefined | FormValidateOrFn<TFormData>,\n TOnChange extends undefined | FormValidateOrFn<TFormData>,\n TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n TSubmitMeta,\n TFieldComponents extends Record<string, Component<any>>,\n TFormComponents extends Record<string, Component<any>>,\n> = SolidFormExtendedApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n> &\n NoInfer<TFormComponents> & {\n AppField: FieldComponent<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta,\n NoInfer<TFieldComponents>\n >\n AppForm: Component<ParentProps>\n }\n\nexport interface WithFormProps<\n TFormData,\n TOnMount extends undefined | FormValidateOrFn<TFormData>,\n TOnChange extends undefined | FormValidateOrFn<TFormData>,\n TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n TSubmitMeta,\n TFieldComponents extends Record<string, Component<any>>,\n TFormComponents extends Record<string, Component<any>>,\n TRenderProps extends Record<string, unknown> = Record<string, never>,\n> extends FormOptions<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n> {\n // Optional, but adds props to the `render` function outside of `form`\n props?: TRenderProps\n render: (\n props: ParentProps<\n NoInfer<TRenderProps> & {\n form: AppFieldExtendedSolidFormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta,\n TFieldComponents,\n TFormComponents\n >\n }\n >,\n ) => JSXElement\n}\n\nexport interface WithFieldGroupProps<\n TFieldGroupData,\n TFieldComponents extends Record<string, Component<any>>,\n TFormComponents extends Record<string, Component<any>>,\n TSubmitMeta,\n TRenderProps extends Record<string, unknown> = Record<string, never>,\n> extends BaseFormOptions<TFieldGroupData, TSubmitMeta> {\n // Optional, but adds props to the `render` function outside of `form`\n props?: TRenderProps\n render: (\n props: ParentProps<\n NoInfer<TRenderProps> & {\n group: AppFieldExtendedSolidFieldGroupApi<\n unknown,\n TFieldGroupData,\n string | FieldsMap<unknown, TFieldGroupData>,\n undefined | FormValidateOrFn<unknown>,\n undefined | FormValidateOrFn<unknown>,\n undefined | FormAsyncValidateOrFn<unknown>,\n undefined | FormValidateOrFn<unknown>,\n undefined | FormAsyncValidateOrFn<unknown>,\n undefined | FormValidateOrFn<unknown>,\n undefined | FormAsyncValidateOrFn<unknown>,\n undefined | FormValidateOrFn<unknown>,\n undefined | FormAsyncValidateOrFn<unknown>,\n undefined | FormAsyncValidateOrFn<unknown>,\n // this types it as 'never' in the render prop. It should prevent any\n // untyped meta passed to the handleSubmit by accident.\n unknown extends TSubmitMeta ? never : TSubmitMeta,\n TFieldComponents,\n TFormComponents\n >\n }\n >,\n ) => JSXElement\n}\n\nexport function createFormHook<\n const TComponents extends Record<string, Component<any>>,\n const TFormComponents extends Record<string, Component<any>>,\n>(opts: CreateFormHookProps<TComponents, TFormComponents>) {\n function useAppForm<\n TFormData,\n TOnMount extends undefined | FormValidateOrFn<TFormData>,\n TOnChange extends undefined | FormValidateOrFn<TFormData>,\n TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n TSubmitMeta,\n >(\n props: Accessor<\n FormOptions<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >\n >,\n ): AppFieldExtendedSolidFormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta,\n TComponents,\n TFormComponents\n > {\n const form = createForm(props)\n\n const AppForm = ((formProps) => {\n return (\n <opts.formContext.Provider value={form}>\n {formProps.children}\n </opts.formContext.Provider>\n )\n }) as Component<ParentProps>\n\n const AppField = ((_props) => {\n const [childProps, fieldProps] = splitProps(_props, ['children'])\n return (\n <form.Field {...fieldProps}>\n {(field) => (\n <opts.fieldContext.Provider value={field}>\n {createComponent(\n () =>\n childProps.children(\n Object.assign(field, opts.fieldComponents),\n ),\n {},\n )}\n </opts.fieldContext.Provider>\n )}\n </form.Field>\n )\n }) as FieldComponent<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta,\n TComponents\n >\n\n const extendedForm: AppFieldExtendedSolidFormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta,\n TComponents,\n TFormComponents\n > = form as never\n extendedForm.AppField = AppField\n extendedForm.AppForm = AppForm\n for (const [key, value] of Object.entries(opts.formComponents)) {\n // Since it's a generic I need to cast it to an object\n ;(extendedForm as Record<string, any>)[key] = value\n }\n\n return extendedForm\n }\n\n function withForm<\n TFormData,\n TOnMount extends undefined | FormValidateOrFn<TFormData>,\n TOnChange extends undefined | FormValidateOrFn<TFormData>,\n TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n TSubmitMeta,\n TRenderProps extends Record<string, unknown> = {},\n >({\n render,\n props,\n }: WithFormProps<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta,\n TComponents,\n TFormComponents,\n TRenderProps\n >): WithFormProps<\n UnwrapOrAny<TFormData>,\n UnwrapDefaultOrAny<undefined | FormValidateOrFn<TFormData>, TOnMount>,\n UnwrapDefaultOrAny<undefined | FormValidateOrFn<TFormData>, TOnChange>,\n UnwrapDefaultOrAny<undefined | FormValidateOrFn<TFormData>, TOnChangeAsync>,\n UnwrapDefaultOrAny<undefined | FormValidateOrFn<TFormData>, TOnBlur>,\n UnwrapDefaultOrAny<undefined | FormValidateOrFn<TFormData>, TOnBlurAsync>,\n UnwrapDefaultOrAny<undefined | FormValidateOrFn<TFormData>, TOnSubmit>,\n UnwrapDefaultOrAny<undefined | FormValidateOrFn<TFormData>, TOnSubmitAsync>,\n UnwrapDefaultOrAny<undefined | FormValidateOrFn<TFormData>, TOnDynamic>,\n UnwrapDefaultOrAny<\n undefined | FormValidateOrFn<TFormData>,\n TOnDynamicAsync\n >,\n UnwrapDefaultOrAny<undefined | FormValidateOrFn<TFormData>, TOnServer>,\n UnwrapOrAny<TSubmitMeta>,\n UnwrapOrAny<TComponents>,\n UnwrapOrAny<TFormComponents>,\n UnwrapOrAny<TRenderProps>\n >['render'] {\n return (innerProps) =>\n createComponent(\n render as Component<any>,\n mergeProps(props ?? {}, innerProps),\n )\n }\n\n function withFieldGroup<\n TFieldGroupData,\n TSubmitMeta,\n TRenderProps extends Record<string, unknown> = {},\n >({\n render,\n props,\n defaultValues,\n }: WithFieldGroupProps<\n TFieldGroupData,\n TComponents,\n TFormComponents,\n TSubmitMeta,\n TRenderProps\n >): <\n TFormData,\n TFields extends\n | DeepKeysOfType<TFormData, TFieldGroupData | null | undefined>\n | FieldsMap<TFormData, TFieldGroupData>,\n TOnMount extends undefined | FormValidateOrFn<TFormData>,\n TOnChange extends undefined | FormValidateOrFn<TFormData>,\n TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n TFormSubmitMeta,\n >(\n params: ParentProps<\n NoInfer<TRenderProps> & {\n form:\n | AppFieldExtendedSolidFormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n unknown extends TSubmitMeta ? TFormSubmitMeta : TSubmitMeta,\n TComponents,\n TFormComponents\n >\n | AppFieldExtendedSolidFieldGroupApi<\n // Since this only occurs if you nest it within other field groups, it can be more\n // lenient with the types.\n unknown,\n TFormData,\n string | FieldsMap<unknown, TFormData>,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n unknown extends TSubmitMeta ? TFormSubmitMeta : TSubmitMeta,\n TComponents,\n TFormComponents\n >\n fields: TFields\n }\n >,\n ) => JSXElement {\n return function Render(innerProps) {\n const fieldGroupProps = {\n form: innerProps.form,\n fields: innerProps.fields,\n defaultValues,\n formComponents: opts.formComponents,\n }\n const fieldGroupApi = createFieldGroup(() => fieldGroupProps)\n return createComponent(\n render as Component<any>,\n mergeProps(props ?? {}, innerProps, { group: fieldGroupApi as any }),\n )\n }\n }\n\n return {\n useAppForm,\n withForm,\n withFieldGroup,\n }\n}\n"],"names":["createFormHookContexts","fieldContext","createContext","useFieldContext","field","useContext","Error","formContext","useFormContext","form","createFormHook","opts","useAppForm","props","createForm","AppForm","formProps","_$createComponent","Provider","value","children","AppField","_props","childProps","fieldProps","splitProps","Field","_$mergeProps","createComponent","Object","assign","fieldComponents","extendedForm","key","entries","formComponents","withForm","render","innerProps","mergeProps","withFieldGroup","defaultValues","Render","fieldGroupProps","fields","fieldGroupApi","createFieldGroup","group"],"mappings":";;;;AAoEO,SAASA,yBAAyB;AAEvC,QAAMC,eAAeC,cACnB,IACF;AAEA,WAASC,kBAAyB;AAChC,UAAMC,QAAQC,WAAWJ,YAAY;AAGrC,QAAI,CAACG,OAAO;AACV,YAAM,IAAIE,MACR,qFACF;AAAA,IACF;AAEA,WAAOF;AAAAA,EA2BT;AAGA,QAAMG,cAAcL,cAA0B,IAA6B;AAE3E,WAASM,iBAAiB;AACxB,UAAMC,OAAOJ,WAAWE,WAAW;AAGnC,QAAI,CAACE,MAAM;AACT,YAAM,IAAIH,MACR,mFACF;AAAA,IACF;AAEA,WAAOG;AAAAA,EAeT;AAEA,SAAO;AAAA,IAAER;AAAAA,IAAcE;AAAAA,IAAiBK;AAAAA,IAAgBD;AAAAA,EAAAA;AAC1D;AA2JO,SAASG,eAGdC,MAAyD;AACzD,WAASC,WAcPC,OA+BA;AACA,UAAMJ,OAAOK,WAAWD,KAAK;AAE7B,UAAME,WAAYC,CAAAA,cAAc;AAC9B,aAAAC,kBACGN,KAAKJ,YAAYW,UAAQ;AAAA,QAACC,OAAOV;AAAAA,QAAI,IAAAW,WAAA;AAAA,iBACnCJ,UAAUI;AAAAA,QAAQ;AAAA,MAAA,CAAA;AAAA,IAGzB;AAEA,UAAMC,YAAaC,CAAAA,WAAW;AAC5B,YAAM,CAACC,YAAYC,UAAU,IAAIC,WAAWH,QAAQ,CAAC,UAAU,CAAC;AAChE,aAAAL,kBACGR,KAAKiB,OAAKC,aAAKH,YAAU;AAAA,QAAAJ,UACtBhB,CAAAA,UAAKa,kBACJN,KAAKV,aAAaiB,UAAQ;AAAA,UAACC,OAAOf;AAAAA,UAAK,IAAAgB,WAAA;AAAA,mBACrCQ,gBACC,MACEL,WAAWH,SACTS,OAAOC,OAAO1B,OAAOO,KAAKoB,eAAe,CAC3C,GACF,CAAA,CACF;AAAA,UAAC;AAAA,QAAA,CAAA;AAAA,MAAA,CAEJ,CAAA;AAAA,IAGP;AAgBA,UAAMC,eAeFvB;AACJuB,iBAAaX,WAAWA;AACxBW,iBAAajB,UAAUA;AACvB,eAAW,CAACkB,KAAKd,KAAK,KAAKU,OAAOK,QAAQvB,KAAKwB,cAAc,GAAG;AAE5DH,mBAAqCC,GAAG,IAAId;AAAAA,IAChD;AAEA,WAAOa;AAAAA,EACT;AAEA,WAASI,SAcP;AAAA,IACAC;AAAAA,IACAxB;AAAAA,EAAAA,GAoCU;AACV,WAAQyB,CAAAA,eACNV,gBACES,QACAE,WAAW1B,SAAS,CAAA,GAAIyB,UAAU,CACpC;AAAA,EACJ;AAEA,WAASE,eAIP;AAAA,IACAH;AAAAA,IACAxB;AAAAA,IACA4B;AAAAA,EAAAA,GAkEc;AACd,WAAO,SAASC,OAAOJ,YAAY;AACjC,YAAMK,kBAAkB;AAAA,QACtBlC,MAAM6B,WAAW7B;AAAAA,QACjBmC,QAAQN,WAAWM;AAAAA,QACnBH;AAAAA,QACAN,gBAAgBxB,KAAKwB;AAAAA,MAAAA;AAEvB,YAAMU,gBAAgBC,iBAAiB,MAAMH,eAAe;AAC5D,aAAOf,gBACLS,QACAE,WAAW1B,SAAS,CAAA,GAAIyB,YAAY;AAAA,QAAES,OAAOF;AAAAA,MAAAA,CAAsB,CACrE;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACLjC;AAAAA,IACAwB;AAAAA,IACAI;AAAAA,EAAAA;AAEJ;"}
@@ -1,4 +1,4 @@
1
- import { createComponent, createContext, splitProps, useContext, } from 'solid-js';
1
+ import { createComponent, createContext, mergeProps, splitProps, useContext, } from 'solid-js';
2
2
  import { createFieldGroup } from './createFieldGroup';
3
3
  import { createForm } from './createForm';
4
4
  export function createFormHookContexts() {
@@ -51,7 +51,7 @@ export function createFormHook(opts) {
51
51
  return extendedForm;
52
52
  }
53
53
  function withForm({ render, props, }) {
54
- return (innerProps) => render({ ...props, ...innerProps });
54
+ return (innerProps) => createComponent(render, mergeProps(props ?? {}, innerProps));
55
55
  }
56
56
  function withFieldGroup({ render, props, defaultValues, }) {
57
57
  return function Render(innerProps) {
@@ -62,7 +62,7 @@ export function createFormHook(opts) {
62
62
  formComponents: opts.formComponents,
63
63
  };
64
64
  const fieldGroupApi = createFieldGroup(() => fieldGroupProps);
65
- return render({ ...props, ...innerProps, group: fieldGroupApi });
65
+ return createComponent(render, mergeProps(props ?? {}, innerProps, { group: fieldGroupApi }));
66
66
  };
67
67
  }
68
68
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"createFormHook.jsx","sourceRoot":"","sources":["../../src/createFormHook.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"createFormHook.jsx","sourceRoot":"","sources":["../../src/createFormHook.tsx"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tanstack/solid-form",
3
- "version": "1.28.3",
3
+ "version": "1.28.5",
4
4
  "description": "Powerful, type-safe forms for Solid.",
5
5
  "author": "tannerlinsley",
6
6
  "license": "MIT",
@@ -41,8 +41,8 @@
41
41
  "src"
42
42
  ],
43
43
  "dependencies": {
44
- "@tanstack/solid-store": "^0.8.1",
45
- "@tanstack/form-core": "1.28.3"
44
+ "@tanstack/solid-store": "^0.9.1",
45
+ "@tanstack/form-core": "1.28.5"
46
46
  },
47
47
  "devDependencies": {
48
48
  "solid-js": "^1.9.9",
@@ -1,6 +1,7 @@
1
1
  import {
2
2
  createComponent,
3
3
  createContext,
4
+ mergeProps,
4
5
  splitProps,
5
6
  useContext,
6
7
  } from 'solid-js'
@@ -468,7 +469,11 @@ export function createFormHook<
468
469
  UnwrapOrAny<TFormComponents>,
469
470
  UnwrapOrAny<TRenderProps>
470
471
  >['render'] {
471
- return (innerProps) => render({ ...props, ...innerProps })
472
+ return (innerProps) =>
473
+ createComponent(
474
+ render as Component<any>,
475
+ mergeProps(props ?? {}, innerProps),
476
+ )
472
477
  }
473
478
 
474
479
  function withFieldGroup<
@@ -553,8 +558,10 @@ export function createFormHook<
553
558
  formComponents: opts.formComponents,
554
559
  }
555
560
  const fieldGroupApi = createFieldGroup(() => fieldGroupProps)
556
-
557
- return render({ ...props, ...innerProps, group: fieldGroupApi as any })
561
+ return createComponent(
562
+ render as Component<any>,
563
+ mergeProps(props ?? {}, innerProps, { group: fieldGroupApi as any }),
564
+ )
558
565
  }
559
566
  }
560
567