@tanstack/solid-form 1.33.0 → 1.33.2
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.
- package/dist/cjs/createField.cjs +7 -7
- package/dist/cjs/createField.cjs.map +1 -1
- package/dist/cjs/createFieldGroup.cjs +1 -1
- package/dist/cjs/createFieldGroup.cjs.map +1 -1
- package/dist/cjs/createForm.cjs +3 -2
- package/dist/cjs/createForm.cjs.map +1 -1
- package/dist/cjs/createForm.d.cts +4 -0
- package/dist/cjs/createFormGroup.cjs +1 -1
- package/dist/cjs/createFormGroup.cjs.map +1 -1
- package/dist/cjs/index.cjs +4 -0
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.d.cts +1 -1
- package/dist/esm/createField.js +8 -8
- package/dist/esm/createField.js.map +1 -1
- package/dist/esm/createFieldGroup.js +2 -2
- package/dist/esm/createFieldGroup.js.map +1 -1
- package/dist/esm/createForm.d.ts +4 -0
- package/dist/esm/createForm.js +4 -3
- package/dist/esm/createForm.js.map +1 -1
- package/dist/esm/createFormGroup.js +2 -2
- package/dist/esm/createFormGroup.js.map +1 -1
- package/dist/esm/index.d.ts +1 -1
- package/dist/esm/index.js +2 -1
- package/dist/source/createField.jsx +8 -8
- package/dist/source/createField.jsx.map +1 -1
- package/dist/source/createFieldGroup.jsx +2 -2
- package/dist/source/createFieldGroup.jsx.map +1 -1
- package/dist/source/createForm.d.ts +4 -0
- package/dist/source/createForm.jsx +5 -3
- package/dist/source/createForm.jsx.map +1 -1
- package/dist/source/createFormGroup.jsx +2 -2
- package/dist/source/createFormGroup.jsx.map +1 -1
- package/dist/source/index.d.ts +1 -1
- package/dist/source/index.jsx +1 -1
- package/dist/source/index.jsx.map +1 -1
- package/package.json +2 -2
- package/src/createField.tsx +8 -8
- package/src/createFieldGroup.tsx +2 -2
- package/src/createForm.tsx +43 -3
- package/src/createFormGroup.tsx +2 -2
- package/src/index.tsx +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createComponent, mergeProps } from "solid-js/web";
|
|
2
2
|
import { FieldGroupApi, functionalUpdate } from "@tanstack/form-core";
|
|
3
|
-
import {
|
|
3
|
+
import { useSelector } from "@tanstack/solid-store";
|
|
4
4
|
import { onMount, onCleanup } from "solid-js";
|
|
5
5
|
function createFieldGroup(opts) {
|
|
6
6
|
const options = opts();
|
|
@@ -11,7 +11,7 @@ function createFieldGroup(opts) {
|
|
|
11
11
|
extendedApi.AppField = (props) => createComponent(form.AppField, mergeProps(() => api.getFormFieldOptions(props)));
|
|
12
12
|
extendedApi.Field = (props) => createComponent(form.Field, mergeProps(() => api.getFormFieldOptions(props)));
|
|
13
13
|
extendedApi.Subscribe = (props) => {
|
|
14
|
-
const data =
|
|
14
|
+
const data = useSelector(api.store, props.selector);
|
|
15
15
|
return functionalUpdate(props.children, data());
|
|
16
16
|
};
|
|
17
17
|
onMount(() => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createFieldGroup.js","sources":["../../src/createFieldGroup.tsx"],"sourcesContent":["import { FieldGroupApi, functionalUpdate } from '@tanstack/form-core'\nimport {
|
|
1
|
+
{"version":3,"file":"createFieldGroup.js","sources":["../../src/createFieldGroup.tsx"],"sourcesContent":["import { FieldGroupApi, functionalUpdate } from '@tanstack/form-core'\nimport { useSelector } from '@tanstack/solid-store'\nimport { onCleanup, onMount } from 'solid-js'\nimport type { Component, JSX, ParentProps } from 'solid-js'\nimport type {\n DeepKeysOfType,\n FieldGroupState,\n FieldsMap,\n FormAsyncValidateOrFn,\n FormValidateOrFn,\n} from '@tanstack/form-core'\nimport type { LensFieldComponent } from './createField'\nimport type { AppFieldExtendedSolidFormApi } from './createFormHook'\n\n/**\n * @private\n */\nexport type AppFieldExtendedSolidFieldGroupApi<\n TFormData,\n TFieldGroupData,\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 TSubmitMeta,\n TFieldComponents extends Record<string, Component<any>>,\n TFormComponents extends Record<string, Component<any>>,\n> = FieldGroupApi<\n TFormData,\n TFieldGroupData,\n TFields,\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: LensFieldComponent<\n TFieldGroupData,\n TSubmitMeta,\n NoInfer<TFieldComponents>\n >\n AppForm: Component<ParentProps>\n /**\n * A solid component to render form fields. With this, you can render and manage individual form fields.\n */\n Field: LensFieldComponent<TFieldGroupData, TSubmitMeta>\n\n /**\n * A `Subscribe` function that allows you to listen and solid to changes in the form's state. It's especially useful when you need to execute side effects or render specific components in response to state updates.\n */\n Subscribe: <TSelected = NoInfer<FieldGroupState<TFieldGroupData>>>(props: {\n selector?: (state: NoInfer<FieldGroupState<TFieldGroupData>>) => TSelected\n children: ((state: NoInfer<TSelected>) => JSX.Element) | JSX.Element\n }) => JSX.Element\n }\n\nexport function createFieldGroup<\n TFormData,\n TFieldGroupData,\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 TComponents extends Record<string, Component<any>>,\n TFormComponents extends Record<string, Component<any>>,\n TSubmitMeta = never,\n>(\n opts: () => {\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 TSubmitMeta,\n TComponents,\n TFormComponents\n >\n | AppFieldExtendedSolidFieldGroupApi<\n // Since this only occurs if you nest it within other form lenses, 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 TSubmitMeta,\n TComponents,\n TFormComponents\n >\n fields: TFields\n defaultValues?: TFieldGroupData\n onSubmitMeta?: TSubmitMeta\n formComponents: TFormComponents\n },\n): AppFieldExtendedSolidFieldGroupApi<\n TFormData,\n TFieldGroupData,\n TFields,\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 options = opts()\n const api = new FieldGroupApi(options)\n const form =\n options.form instanceof FieldGroupApi\n ? (options.form.form as 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 : options.form\n\n const extendedApi: AppFieldExtendedSolidFieldGroupApi<\n TFormData,\n TFieldGroupData,\n TFields,\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 > = api as never\n\n extendedApi.AppForm = (appFormProps) => <form.AppForm {...appFormProps} />\n extendedApi.AppField = (props) => (\n <form.AppField {...(api.getFormFieldOptions(props) as any)} />\n )\n extendedApi.Field = (props) => (\n <form.Field {...(api.getFormFieldOptions(props) as any)} />\n )\n extendedApi.Subscribe = (props) => {\n const data = useSelector(api.store, props.selector)\n\n return functionalUpdate(props.children, data()) as Element\n }\n\n let mounted = false\n onMount(() => {\n const cleanupFn = api.mount()\n mounted = true\n onCleanup(() => {\n cleanupFn()\n mounted = false\n })\n })\n\n return Object.assign(extendedApi, {\n ...options.formComponents,\n }) as AppFieldExtendedSolidFieldGroupApi<\n TFormData,\n TFieldGroupData,\n TFields,\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}\n"],"names":["createFieldGroup","opts","options","api","FieldGroupApi","form","extendedApi","AppForm","appFormProps","_$createComponent","AppField","props","_$mergeProps","getFormFieldOptions","Field","Subscribe","data","useSelector","store","selector","functionalUpdate","children","onMount","cleanupFn","mount","onCleanup","Object","assign","formComponents"],"mappings":";;;;AAyEO,SAASA,iBAoBdC,MA4DA;AACA,QAAMC,UAAUD,KAAAA;AAChB,QAAME,MAAM,IAAIC,cAAcF,OAAO;AACrC,QAAMG,OACJH,QAAQG,gBAAgBD,gBACnBF,QAAQG,KAAKA,OAgBdH,QAAQG;AAEd,QAAMC,cAiBFH;AAEJG,cAAYC,UAAWC,CAAAA,iBAAYC,gBAAMJ,KAAKE,SAAYC,YAAY;AACtEF,cAAYI,WAAYC,CAAAA,UAAKF,gBAC1BJ,KAAKK,UAAQE,WAAA,MAAMT,IAAIU,oBAAoBF,KAAK,CAAQ,CAAA;AAE3DL,cAAYQ,QAASH,CAAAA,UAAKF,gBACvBJ,KAAKS,OAAKF,WAAA,MAAMT,IAAIU,oBAAoBF,KAAK,CAAQ,CAAA;AAExDL,cAAYS,YAAaJ,CAAAA,UAAU;AACjC,UAAMK,OAAOC,YAAYd,IAAIe,OAAOP,MAAMQ,QAAQ;AAElD,WAAOC,iBAAiBT,MAAMU,UAAUL,KAAAA,CAAM;AAAA,EAChD;AAGAM,UAAQ,MAAM;AACZ,UAAMC,YAAYpB,IAAIqB,MAAAA;AAEtBC,cAAU,MAAM;AACdF,gBAAAA;AAAAA,IAEF,CAAC;AAAA,EACH,CAAC;AAED,SAAOG,OAAOC,OAAOrB,aAAa;AAAA,IAChC,GAAGJ,QAAQ0B;AAAAA,EAAAA,CACZ;AAkBH;"}
|
package/dist/esm/createForm.d.ts
CHANGED
|
@@ -5,6 +5,10 @@ import { FormGroupComponent } from './createFormGroup.js';
|
|
|
5
5
|
export interface SolidFormApi<TParentData, TFormOnMount extends undefined | FormValidateOrFn<TParentData>, TFormOnChange extends undefined | FormValidateOrFn<TParentData>, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>, TFormOnBlur extends undefined | FormValidateOrFn<TParentData>, TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>, TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>, TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>, TFormOnDynamic extends undefined | FormValidateOrFn<TParentData>, TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TParentData>, TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>, TSubmitMeta> {
|
|
6
6
|
Field: FieldComponent<TParentData, TFormOnMount, TFormOnChange, TFormOnChangeAsync, TFormOnBlur, TFormOnBlurAsync, TFormOnSubmit, TFormOnSubmitAsync, TFormOnDynamic, TFormOnDynamicAsync, TFormOnServer, TSubmitMeta>;
|
|
7
7
|
FormGroup: FormGroupComponent<TParentData, TFormOnMount, TFormOnChange, TFormOnChangeAsync, TFormOnBlur, TFormOnBlurAsync, TFormOnSubmit, TFormOnSubmitAsync, TFormOnDynamic, TFormOnDynamicAsync, TFormOnServer, TSubmitMeta>;
|
|
8
|
+
useSelector: <TSelected = NoInfer<FormState<TParentData, TFormOnMount, TFormOnChange, TFormOnChangeAsync, TFormOnBlur, TFormOnBlurAsync, TFormOnSubmit, TFormOnSubmitAsync, TFormOnDynamic, TFormOnDynamicAsync, TFormOnServer>>>(selector?: (state: NoInfer<FormState<TParentData, TFormOnMount, TFormOnChange, TFormOnChangeAsync, TFormOnBlur, TFormOnBlurAsync, TFormOnSubmit, TFormOnSubmitAsync, TFormOnDynamic, TFormOnDynamicAsync, TFormOnServer>>) => TSelected) => () => TSelected;
|
|
9
|
+
/**
|
|
10
|
+
* @deprecated Use `form.useSelector` instead.
|
|
11
|
+
*/
|
|
8
12
|
useStore: <TSelected = NoInfer<FormState<TParentData, TFormOnMount, TFormOnChange, TFormOnChangeAsync, TFormOnBlur, TFormOnBlurAsync, TFormOnSubmit, TFormOnSubmitAsync, TFormOnDynamic, TFormOnDynamicAsync, TFormOnServer>>>(selector?: (state: NoInfer<FormState<TParentData, TFormOnMount, TFormOnChange, TFormOnChangeAsync, TFormOnBlur, TFormOnBlurAsync, TFormOnSubmit, TFormOnSubmitAsync, TFormOnDynamic, TFormOnDynamicAsync, TFormOnServer>>) => TSelected) => () => TSelected;
|
|
9
13
|
Subscribe: <TSelected = NoInfer<FormState<TParentData, TFormOnMount, TFormOnChange, TFormOnChangeAsync, TFormOnBlur, TFormOnBlurAsync, TFormOnSubmit, TFormOnSubmitAsync, TFormOnDynamic, TFormOnDynamicAsync, TFormOnServer>>>(props: {
|
|
10
14
|
selector?: (state: NoInfer<FormState<TParentData, TFormOnMount, TFormOnChange, TFormOnChangeAsync, TFormOnBlur, TFormOnBlurAsync, TFormOnSubmit, TFormOnSubmitAsync, TFormOnDynamic, TFormOnDynamicAsync, TFormOnServer>>) => TSelected;
|
package/dist/esm/createForm.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createComponent, mergeProps } from "solid-js/web";
|
|
2
2
|
import { FormApi, functionalUpdate } from "@tanstack/form-core";
|
|
3
3
|
import { onMount, createComputed } from "solid-js";
|
|
4
|
-
import {
|
|
4
|
+
import { useSelector } from "@tanstack/solid-store";
|
|
5
5
|
import { Field } from "./createField.js";
|
|
6
6
|
import { FormGroup } from "./createFormGroup.js";
|
|
7
7
|
function createForm(opts) {
|
|
@@ -14,8 +14,9 @@ function createForm(opts) {
|
|
|
14
14
|
extendedApi.FormGroup = (props) => createComponent(FormGroup, mergeProps(props, {
|
|
15
15
|
form: api
|
|
16
16
|
}));
|
|
17
|
-
extendedApi.
|
|
18
|
-
extendedApi.
|
|
17
|
+
extendedApi.useSelector = (selector) => useSelector(api.store, selector);
|
|
18
|
+
extendedApi.useStore = extendedApi.useSelector;
|
|
19
|
+
extendedApi.Subscribe = (props) => functionalUpdate(props.children, useSelector(api.store, props.selector));
|
|
19
20
|
onMount(api.mount);
|
|
20
21
|
createComputed(() => api.update(opts?.()));
|
|
21
22
|
return extendedApi;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createForm.js","sources":["../../src/createForm.tsx"],"sourcesContent":["import { FormApi, functionalUpdate } from '@tanstack/form-core'\nimport { createComputed, onMount } from 'solid-js'\nimport {
|
|
1
|
+
{"version":3,"file":"createForm.js","sources":["../../src/createForm.tsx"],"sourcesContent":["import { FormApi, functionalUpdate } from '@tanstack/form-core'\nimport { createComputed, onMount } from 'solid-js'\nimport { useSelector } from '@tanstack/solid-store'\nimport { Field, createField } from './createField'\nimport { FormGroup } from './createFormGroup'\nimport type {\n FormAsyncValidateOrFn,\n FormOptions,\n FormState,\n FormValidateOrFn,\n} from '@tanstack/form-core'\nimport type { JSXElement } from 'solid-js'\nimport type { FieldComponent } from './createField'\nimport type { FormGroupComponent } from './createFormGroup'\n\nexport interface SolidFormApi<\n TParentData,\n TFormOnMount extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChange extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,\n TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,\n TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnDynamic extends undefined | FormValidateOrFn<TParentData>,\n TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>,\n TSubmitMeta,\n> {\n Field: FieldComponent<\n TParentData,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnDynamic,\n TFormOnDynamicAsync,\n TFormOnServer,\n TSubmitMeta\n >\n FormGroup: FormGroupComponent<\n TParentData,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnDynamic,\n TFormOnDynamicAsync,\n TFormOnServer,\n TSubmitMeta\n >\n useSelector: <\n TSelected = NoInfer<\n FormState<\n TParentData,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnDynamic,\n TFormOnDynamicAsync,\n TFormOnServer\n >\n >,\n >(\n selector?: (\n state: NoInfer<\n FormState<\n TParentData,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnDynamic,\n TFormOnDynamicAsync,\n TFormOnServer\n >\n >,\n ) => TSelected,\n ) => () => TSelected\n /**\n * @deprecated Use `form.useSelector` instead.\n */\n useStore: <\n TSelected = NoInfer<\n FormState<\n TParentData,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnDynamic,\n TFormOnDynamicAsync,\n TFormOnServer\n >\n >,\n >(\n selector?: (\n state: NoInfer<\n FormState<\n TParentData,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnDynamic,\n TFormOnDynamicAsync,\n TFormOnServer\n >\n >,\n ) => TSelected,\n ) => () => TSelected\n Subscribe: <\n TSelected = NoInfer<\n FormState<\n TParentData,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnDynamic,\n TFormOnDynamicAsync,\n TFormOnServer\n >\n >,\n >(props: {\n selector?: (\n state: NoInfer<\n FormState<\n TParentData,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnDynamic,\n TFormOnDynamicAsync,\n TFormOnServer\n >\n >,\n ) => TSelected\n children: ((state: () => NoInfer<TSelected>) => JSXElement) | JSXElement\n }) => JSXElement\n}\n\n/**\n * An extended version of the `FormApi` class that includes React-specific functionalities from `ReactFormApi`\n */\nexport type SolidFormExtendedApi<\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> = FormApi<\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 SolidFormApi<\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 >\nexport function createForm<\n TParentData,\n TFormOnMount extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChange extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,\n TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,\n TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnDynamic extends undefined | FormValidateOrFn<TParentData>,\n TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>,\n TSubmitMeta,\n>(\n opts?: () => FormOptions<\n TParentData,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnDynamic,\n TFormOnDynamicAsync,\n TFormOnServer,\n TSubmitMeta\n >,\n) {\n const options = opts?.()\n const api = new FormApi<\n TParentData,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnDynamic,\n TFormOnDynamicAsync,\n TFormOnServer,\n TSubmitMeta\n >(options)\n const extendedApi: typeof api &\n SolidFormApi<\n TParentData,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnDynamic,\n TFormOnDynamicAsync,\n TFormOnServer,\n TSubmitMeta\n > = api as never\n\n extendedApi.Field = (props) => <Field {...props} form={api} />\n extendedApi.FormGroup = (props) => <FormGroup {...props} form={api} />\n extendedApi.useSelector = (selector) => useSelector(api.store, selector)\n /** @deprecated Use `form.useSelector` instead. */\n extendedApi.useStore = extendedApi.useSelector\n extendedApi.Subscribe = (props) =>\n functionalUpdate(props.children, useSelector(api.store, props.selector))\n\n onMount(api.mount)\n\n /**\n * formApi.update should not have any side effects. Think of it like a `useRef`\n * that we need to keep updated every render with the most up-to-date information.\n */\n createComputed(() => api.update(opts?.()))\n\n return extendedApi\n}\n"],"names":["createForm","opts","options","api","FormApi","extendedApi","Field","props","_$createComponent","_$mergeProps","form","FormGroup","useSelector","selector","store","useStore","Subscribe","functionalUpdate","children","onMount","mount","createComputed","update"],"mappings":";;;;;;AAoNO,SAASA,WAcdC,MAcA;AACA,QAAMC,UAAUD,OAAAA;AAChB,QAAME,MAAM,IAAIC,QAadF,OAAO;AACT,QAAMG,cAcAF;AAENE,cAAYC,QAASC,CAAAA,UAAKC,gBAAMF,OAAKG,WAAKF,OAAK;AAAA,IAAEG,MAAMP;AAAAA,EAAAA,CAAG,CAAA;AAC1DE,cAAYM,YAAaJ,CAAAA,UAAKC,gBAAMG,WAASF,WAAKF,OAAK;AAAA,IAAEG,MAAMP;AAAAA,EAAAA,CAAG,CAAA;AAClEE,cAAYO,cAAeC,CAAAA,aAAaD,YAAYT,IAAIW,OAAOD,QAAQ;AAEvER,cAAYU,WAAWV,YAAYO;AACnCP,cAAYW,YAAaT,CAAAA,UACvBU,iBAAiBV,MAAMW,UAAUN,YAAYT,IAAIW,OAAOP,MAAMM,QAAQ,CAAC;AAEzEM,UAAQhB,IAAIiB,KAAK;AAMjBC,iBAAe,MAAMlB,IAAImB,OAAOrB,OAAAA,CAAQ,CAAC;AAEzC,SAAOI;AACT;"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { memo } from "solid-js/web";
|
|
2
2
|
import { FormGroupApi } from "@tanstack/form-core";
|
|
3
3
|
import { createComponent, onMount, onCleanup, createComputed, createSignal } from "solid-js";
|
|
4
|
-
import {
|
|
4
|
+
import { useSelector } from "@tanstack/solid-store";
|
|
5
5
|
function makeFormGroupReactive(formGroupApi) {
|
|
6
6
|
const [group, setGroup] = createSignal(formGroupApi, {
|
|
7
7
|
equals: false
|
|
8
8
|
});
|
|
9
|
-
const store =
|
|
9
|
+
const store = useSelector(formGroupApi.store, (store2) => store2);
|
|
10
10
|
createComputed(() => {
|
|
11
11
|
store();
|
|
12
12
|
setGroup(formGroupApi);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createFormGroup.js","sources":["../../src/createFormGroup.tsx"],"sourcesContent":["import { FormGroupApi, functionalUpdate } from '@tanstack/form-core'\nimport {\n createComponent,\n createComputed,\n createSignal,\n onCleanup,\n onMount,\n} from 'solid-js'\nimport { useStore } from '@tanstack/solid-store'\nimport type {\n DeepKeys,\n DeepValue,\n FormAsyncValidateOrFn,\n FormGroupApiOptions,\n FormGroupAsyncValidateOrFn,\n FormGroupOptions,\n FormGroupValidateOrFn,\n FormValidateOrFn,\n} from '@tanstack/form-core'\nimport type { Accessor, JSX, JSXElement } from 'solid-js'\n\n// ugly way to trick solid into triggering updates for changes on the formGroupApi\nfunction makeFormGroupReactive<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName>,\n TOnMount extends undefined | FormGroupValidateOrFn<TParentData, TName, TData>,\n TOnChange extends\n | undefined\n | FormGroupValidateOrFn<TParentData, TName, TData>,\n TOnChangeAsync extends\n | undefined\n | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n TOnBlur extends undefined | FormGroupValidateOrFn<TParentData, TName, TData>,\n TOnBlurAsync extends\n | undefined\n | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n TOnSubmit extends\n | undefined\n | FormGroupValidateOrFn<TParentData, TName, TData>,\n TOnSubmitAsync extends\n | undefined\n | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n TOnDynamic extends\n | undefined\n | FormGroupValidateOrFn<TParentData, TName, TData>,\n TOnDynamicAsync extends\n | undefined\n | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n TSubmitMeta,\n TFormOnMount extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChange extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,\n TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,\n TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnDynamic extends undefined | FormValidateOrFn<TParentData>,\n TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>,\n TParentSubmitMeta,\n>(\n formGroupApi: FormGroupApi<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TSubmitMeta,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnDynamic,\n TFormOnDynamicAsync,\n TFormOnServer,\n TParentSubmitMeta\n >,\n): () => FormGroupApi<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TSubmitMeta,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnDynamic,\n TFormOnDynamicAsync,\n TFormOnServer,\n TParentSubmitMeta\n> {\n const [group, setGroup] = createSignal(formGroupApi, { equals: false })\n // Handle shallow comparison to make sure that Derived doesn't create a new setGroup call every time\n const store = useStore(formGroupApi.store, (store) => store)\n // Run before initial render\n createComputed(() => {\n // Use the store to track dependencies\n store()\n setGroup(formGroupApi)\n })\n return group\n}\n\nexport function createFormGroup<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName>,\n TOnMount extends undefined | FormGroupValidateOrFn<TParentData, TName, TData>,\n TOnChange extends\n | undefined\n | FormGroupValidateOrFn<TParentData, TName, TData>,\n TOnChangeAsync extends\n | undefined\n | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n TOnBlur extends undefined | FormGroupValidateOrFn<TParentData, TName, TData>,\n TOnBlurAsync extends\n | undefined\n | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n TOnSubmit extends\n | undefined\n | FormGroupValidateOrFn<TParentData, TName, TData>,\n TOnSubmitAsync extends\n | undefined\n | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n TOnDynamic extends\n | undefined\n | FormGroupValidateOrFn<TParentData, TName, TData>,\n TOnDynamicAsync extends\n | undefined\n | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n TSubmitMeta,\n TFormOnMount extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChange extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,\n TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,\n TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnDynamic extends undefined | FormValidateOrFn<TParentData>,\n TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>,\n TParentSubmitMeta,\n>(\n opts: () => FormGroupApiOptions<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TSubmitMeta,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnDynamic,\n TFormOnDynamicAsync,\n TFormOnServer,\n TParentSubmitMeta\n >,\n) {\n const options = opts()\n\n const api = new FormGroupApi(options)\n\n let mounted = false\n // Instantiates form group meta and removes it when unrendered\n onMount(() => {\n const cleanupFn = api.mount()\n mounted = true\n onCleanup(() => {\n cleanupFn()\n mounted = false\n })\n })\n\n /**\n * formGroupApi.update should not have any side effects. Think of it like a `useRef`\n * that we need to keep updated every render with the most up-to-date information.\n *\n * createComputed to make sure this effect runs before render effects\n */\n createComputed(() => {\n if (!mounted) return\n api.update(opts())\n })\n\n return makeFormGroupReactive<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TSubmitMeta,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnDynamic,\n TFormOnDynamicAsync,\n TFormOnServer,\n TParentSubmitMeta\n >(api)\n}\n\ninterface FormGroupComponentBoundProps<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName>,\n TOnMount extends undefined | FormGroupValidateOrFn<TParentData, TName, TData>,\n TOnChange extends\n | undefined\n | FormGroupValidateOrFn<TParentData, TName, TData>,\n TOnChangeAsync extends\n | undefined\n | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n TOnBlur extends undefined | FormGroupValidateOrFn<TParentData, TName, TData>,\n TOnBlurAsync extends\n | undefined\n | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n TOnSubmit extends\n | undefined\n | FormGroupValidateOrFn<TParentData, TName, TData>,\n TOnSubmitAsync extends\n | undefined\n | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n TOnDynamic extends\n | undefined\n | FormGroupValidateOrFn<TParentData, TName, TData>,\n TOnDynamicAsync extends\n | undefined\n | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n TSubmitMeta,\n TFormOnMount extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChange extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,\n TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,\n TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnDynamic extends undefined | FormValidateOrFn<TParentData>,\n TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>,\n TParentSubmitMeta,\n ExtendedApi = {},\n> extends FormGroupOptions<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TSubmitMeta,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnDynamic,\n TFormOnDynamicAsync,\n TFormOnServer,\n TParentSubmitMeta\n> {\n children: (\n formGroupApi: Accessor<\n FormGroupApi<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TSubmitMeta,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnDynamic,\n TFormOnDynamicAsync,\n TFormOnServer,\n TParentSubmitMeta\n >\n > &\n ExtendedApi,\n ) => JSX.Element\n}\n\n/**\n * A type alias representing a form group component for a specific form data type.\n */\nexport type FormGroupComponent<\n in out TParentData,\n in out TFormOnMount extends undefined | FormValidateOrFn<TParentData>,\n in out TFormOnChange extends undefined | FormValidateOrFn<TParentData>,\n in out TFormOnChangeAsync extends\n | undefined\n | FormAsyncValidateOrFn<TParentData>,\n in out TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,\n in out TFormOnBlurAsync extends\n | undefined\n | FormAsyncValidateOrFn<TParentData>,\n in out TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,\n in out TFormOnSubmitAsync extends\n | undefined\n | FormAsyncValidateOrFn<TParentData>,\n in out TFormOnDynamic extends undefined | FormValidateOrFn<TParentData>,\n in out TFormOnDynamicAsync extends\n | undefined\n | FormAsyncValidateOrFn<TParentData>,\n in out TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>,\n in out TParentSubmitMeta,\n in out ExtendedApi = {},\n> = <\n const TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName>,\n TOnMount extends undefined | FormGroupValidateOrFn<TParentData, TName, TData>,\n TOnChange extends\n | undefined\n | FormGroupValidateOrFn<TParentData, TName, TData>,\n TOnChangeAsync extends\n | undefined\n | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n TOnBlur extends undefined | FormGroupValidateOrFn<TParentData, TName, TData>,\n TOnBlurAsync extends\n | undefined\n | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n TOnSubmit extends\n | undefined\n | FormGroupValidateOrFn<TParentData, TName, TData>,\n TOnSubmitAsync extends\n | undefined\n | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n TOnDynamic extends\n | undefined\n | FormGroupValidateOrFn<TParentData, TName, TData>,\n TOnDynamicAsync extends\n | undefined\n | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n TSubmitMeta,\n>(\n props: FormGroupComponentBoundProps<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TSubmitMeta,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnDynamic,\n TFormOnDynamicAsync,\n TFormOnServer,\n TParentSubmitMeta,\n ExtendedApi\n >,\n) => JSXElement\n\ninterface FormGroupComponentProps<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName>,\n TOnMount extends undefined | FormGroupValidateOrFn<TParentData, TName, TData>,\n TOnChange extends\n | undefined\n | FormGroupValidateOrFn<TParentData, TName, TData>,\n TOnChangeAsync extends\n | undefined\n | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n TOnBlur extends undefined | FormGroupValidateOrFn<TParentData, TName, TData>,\n TOnBlurAsync extends\n | undefined\n | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n TOnSubmit extends\n | undefined\n | FormGroupValidateOrFn<TParentData, TName, TData>,\n TOnSubmitAsync extends\n | undefined\n | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n TOnDynamic extends\n | undefined\n | FormGroupValidateOrFn<TParentData, TName, TData>,\n TOnDynamicAsync extends\n | undefined\n | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n TSubmitMeta,\n TFormOnMount extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChange extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,\n TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,\n TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnDynamic extends undefined | FormValidateOrFn<TParentData>,\n TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>,\n TParentSubmitMeta,\n> extends FormGroupApiOptions<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TSubmitMeta,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnDynamic,\n TFormOnDynamicAsync,\n TFormOnServer,\n TParentSubmitMeta\n> {\n children: (\n formGroupApi: () => FormGroupApi<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TSubmitMeta,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnDynamic,\n TFormOnDynamicAsync,\n TFormOnServer,\n TParentSubmitMeta\n >,\n ) => JSXElement\n}\n\nexport function FormGroup<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName>,\n TOnMount extends undefined | FormGroupValidateOrFn<TParentData, TName, TData>,\n TOnChange extends\n | undefined\n | FormGroupValidateOrFn<TParentData, TName, TData>,\n TOnChangeAsync extends\n | undefined\n | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n TOnBlur extends undefined | FormGroupValidateOrFn<TParentData, TName, TData>,\n TOnBlurAsync extends\n | undefined\n | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n TOnSubmit extends\n | undefined\n | FormGroupValidateOrFn<TParentData, TName, TData>,\n TOnSubmitAsync extends\n | undefined\n | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n TOnDynamic extends\n | undefined\n | FormGroupValidateOrFn<TParentData, TName, TData>,\n TOnDynamicAsync extends\n | undefined\n | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n TSubmitMeta,\n TFormOnMount extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChange extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,\n TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,\n TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnDynamic extends undefined | FormValidateOrFn<TParentData>,\n TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>,\n TParentSubmitMeta,\n>(\n props: FormGroupComponentProps<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TSubmitMeta,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnDynamic,\n TFormOnDynamicAsync,\n TFormOnServer,\n TParentSubmitMeta\n >,\n) {\n const formGroupApi = createFormGroup<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TSubmitMeta,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnDynamic,\n TFormOnDynamicAsync,\n TFormOnServer,\n TParentSubmitMeta\n >(() => {\n const { children, ...formGroupOptions } = props\n return formGroupOptions\n })\n\n return <>{createComponent(() => props.children(formGroupApi), {})}</>\n}\n"],"names":["makeFormGroupReactive","formGroupApi","group","setGroup","createSignal","equals","store","useStore","createComputed","createFormGroup","opts","options","api","FormGroupApi","mounted","onMount","cleanupFn","mount","onCleanup","update","FormGroup","props","children","formGroupOptions","_$memo","createComponent"],"mappings":";;;;AAsBA,SAASA,sBAwCPC,cAmDA;AACA,QAAM,CAACC,OAAOC,QAAQ,IAAIC,aAAaH,cAAc;AAAA,IAAEI,QAAQ;AAAA,EAAA,CAAO;AAEtE,QAAMC,QAAQC,SAASN,aAAaK,OAAQA,CAAAA,WAAUA,MAAK;AAE3DE,iBAAe,MAAM;AAEnBF,UAAAA;AACAH,aAASF,YAAY;AAAA,EACvB,CAAC;AACD,SAAOC;AACT;AAEO,SAASO,gBAwCdC,MA0BA;AACA,QAAMC,UAAUD,KAAAA;AAEhB,QAAME,MAAM,IAAIC,aAAaF,OAAO;AAEpC,MAAIG,UAAU;AAEdC,UAAQ,MAAM;AACZ,UAAMC,YAAYJ,IAAIK,MAAAA;AACtBH,cAAU;AACVI,cAAU,MAAM;AACdF,gBAAAA;AACAF,gBAAU;AAAA,IACZ,CAAC;AAAA,EACH,CAAC;AAQDN,iBAAe,MAAM;AACnB,QAAI,CAACM,QAAS;AACdF,QAAIO,OAAOT,MAAM;AAAA,EACnB,CAAC;AAED,SAAOV,sBAyBLY,GAAG;AACP;AAsRO,SAASQ,UAwCdC,OA0BA;AACA,QAAMpB,eAAeQ,gBAyBnB,MAAM;AACN,UAAM;AAAA,MAAEa;AAAAA,MAAU,GAAGC;AAAAA,IAAAA,IAAqBF;AAC1C,WAAOE;AAAAA,EACT,CAAC;AAED,SAAAC,KAAA,MAAUC,gBAAgB,MAAMJ,MAAMC,SAASrB,YAAY,GAAG,CAAA,CAAE,CAAC;AACnE;"}
|
|
1
|
+
{"version":3,"file":"createFormGroup.js","sources":["../../src/createFormGroup.tsx"],"sourcesContent":["import { FormGroupApi, functionalUpdate } from '@tanstack/form-core'\nimport {\n createComponent,\n createComputed,\n createSignal,\n onCleanup,\n onMount,\n} from 'solid-js'\nimport { useSelector } from '@tanstack/solid-store'\nimport type {\n DeepKeys,\n DeepValue,\n FormAsyncValidateOrFn,\n FormGroupApiOptions,\n FormGroupAsyncValidateOrFn,\n FormGroupOptions,\n FormGroupValidateOrFn,\n FormValidateOrFn,\n} from '@tanstack/form-core'\nimport type { Accessor, JSX, JSXElement } from 'solid-js'\n\n// ugly way to trick solid into triggering updates for changes on the formGroupApi\nfunction makeFormGroupReactive<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName>,\n TOnMount extends undefined | FormGroupValidateOrFn<TParentData, TName, TData>,\n TOnChange extends\n | undefined\n | FormGroupValidateOrFn<TParentData, TName, TData>,\n TOnChangeAsync extends\n | undefined\n | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n TOnBlur extends undefined | FormGroupValidateOrFn<TParentData, TName, TData>,\n TOnBlurAsync extends\n | undefined\n | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n TOnSubmit extends\n | undefined\n | FormGroupValidateOrFn<TParentData, TName, TData>,\n TOnSubmitAsync extends\n | undefined\n | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n TOnDynamic extends\n | undefined\n | FormGroupValidateOrFn<TParentData, TName, TData>,\n TOnDynamicAsync extends\n | undefined\n | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n TSubmitMeta,\n TFormOnMount extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChange extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,\n TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,\n TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnDynamic extends undefined | FormValidateOrFn<TParentData>,\n TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>,\n TParentSubmitMeta,\n>(\n formGroupApi: FormGroupApi<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TSubmitMeta,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnDynamic,\n TFormOnDynamicAsync,\n TFormOnServer,\n TParentSubmitMeta\n >,\n): () => FormGroupApi<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TSubmitMeta,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnDynamic,\n TFormOnDynamicAsync,\n TFormOnServer,\n TParentSubmitMeta\n> {\n const [group, setGroup] = createSignal(formGroupApi, { equals: false })\n // Handle shallow comparison to make sure that Derived doesn't create a new setGroup call every time\n const store = useSelector(formGroupApi.store, (store) => store)\n // Run before initial render\n createComputed(() => {\n // Use the store to track dependencies\n store()\n setGroup(formGroupApi)\n })\n return group\n}\n\nexport function createFormGroup<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName>,\n TOnMount extends undefined | FormGroupValidateOrFn<TParentData, TName, TData>,\n TOnChange extends\n | undefined\n | FormGroupValidateOrFn<TParentData, TName, TData>,\n TOnChangeAsync extends\n | undefined\n | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n TOnBlur extends undefined | FormGroupValidateOrFn<TParentData, TName, TData>,\n TOnBlurAsync extends\n | undefined\n | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n TOnSubmit extends\n | undefined\n | FormGroupValidateOrFn<TParentData, TName, TData>,\n TOnSubmitAsync extends\n | undefined\n | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n TOnDynamic extends\n | undefined\n | FormGroupValidateOrFn<TParentData, TName, TData>,\n TOnDynamicAsync extends\n | undefined\n | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n TSubmitMeta,\n TFormOnMount extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChange extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,\n TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,\n TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnDynamic extends undefined | FormValidateOrFn<TParentData>,\n TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>,\n TParentSubmitMeta,\n>(\n opts: () => FormGroupApiOptions<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TSubmitMeta,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnDynamic,\n TFormOnDynamicAsync,\n TFormOnServer,\n TParentSubmitMeta\n >,\n) {\n const options = opts()\n\n const api = new FormGroupApi(options)\n\n let mounted = false\n // Instantiates form group meta and removes it when unrendered\n onMount(() => {\n const cleanupFn = api.mount()\n mounted = true\n onCleanup(() => {\n cleanupFn()\n mounted = false\n })\n })\n\n /**\n * formGroupApi.update should not have any side effects. Think of it like a `useRef`\n * that we need to keep updated every render with the most up-to-date information.\n *\n * createComputed to make sure this effect runs before render effects\n */\n createComputed(() => {\n if (!mounted) return\n api.update(opts())\n })\n\n return makeFormGroupReactive<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TSubmitMeta,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnDynamic,\n TFormOnDynamicAsync,\n TFormOnServer,\n TParentSubmitMeta\n >(api)\n}\n\ninterface FormGroupComponentBoundProps<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName>,\n TOnMount extends undefined | FormGroupValidateOrFn<TParentData, TName, TData>,\n TOnChange extends\n | undefined\n | FormGroupValidateOrFn<TParentData, TName, TData>,\n TOnChangeAsync extends\n | undefined\n | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n TOnBlur extends undefined | FormGroupValidateOrFn<TParentData, TName, TData>,\n TOnBlurAsync extends\n | undefined\n | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n TOnSubmit extends\n | undefined\n | FormGroupValidateOrFn<TParentData, TName, TData>,\n TOnSubmitAsync extends\n | undefined\n | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n TOnDynamic extends\n | undefined\n | FormGroupValidateOrFn<TParentData, TName, TData>,\n TOnDynamicAsync extends\n | undefined\n | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n TSubmitMeta,\n TFormOnMount extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChange extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,\n TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,\n TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnDynamic extends undefined | FormValidateOrFn<TParentData>,\n TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>,\n TParentSubmitMeta,\n ExtendedApi = {},\n> extends FormGroupOptions<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TSubmitMeta,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnDynamic,\n TFormOnDynamicAsync,\n TFormOnServer,\n TParentSubmitMeta\n> {\n children: (\n formGroupApi: Accessor<\n FormGroupApi<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TSubmitMeta,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnDynamic,\n TFormOnDynamicAsync,\n TFormOnServer,\n TParentSubmitMeta\n >\n > &\n ExtendedApi,\n ) => JSX.Element\n}\n\n/**\n * A type alias representing a form group component for a specific form data type.\n */\nexport type FormGroupComponent<\n in out TParentData,\n in out TFormOnMount extends undefined | FormValidateOrFn<TParentData>,\n in out TFormOnChange extends undefined | FormValidateOrFn<TParentData>,\n in out TFormOnChangeAsync extends\n | undefined\n | FormAsyncValidateOrFn<TParentData>,\n in out TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,\n in out TFormOnBlurAsync extends\n | undefined\n | FormAsyncValidateOrFn<TParentData>,\n in out TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,\n in out TFormOnSubmitAsync extends\n | undefined\n | FormAsyncValidateOrFn<TParentData>,\n in out TFormOnDynamic extends undefined | FormValidateOrFn<TParentData>,\n in out TFormOnDynamicAsync extends\n | undefined\n | FormAsyncValidateOrFn<TParentData>,\n in out TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>,\n in out TParentSubmitMeta,\n in out ExtendedApi = {},\n> = <\n const TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName>,\n TOnMount extends undefined | FormGroupValidateOrFn<TParentData, TName, TData>,\n TOnChange extends\n | undefined\n | FormGroupValidateOrFn<TParentData, TName, TData>,\n TOnChangeAsync extends\n | undefined\n | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n TOnBlur extends undefined | FormGroupValidateOrFn<TParentData, TName, TData>,\n TOnBlurAsync extends\n | undefined\n | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n TOnSubmit extends\n | undefined\n | FormGroupValidateOrFn<TParentData, TName, TData>,\n TOnSubmitAsync extends\n | undefined\n | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n TOnDynamic extends\n | undefined\n | FormGroupValidateOrFn<TParentData, TName, TData>,\n TOnDynamicAsync extends\n | undefined\n | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n TSubmitMeta,\n>(\n props: FormGroupComponentBoundProps<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TSubmitMeta,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnDynamic,\n TFormOnDynamicAsync,\n TFormOnServer,\n TParentSubmitMeta,\n ExtendedApi\n >,\n) => JSXElement\n\ninterface FormGroupComponentProps<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName>,\n TOnMount extends undefined | FormGroupValidateOrFn<TParentData, TName, TData>,\n TOnChange extends\n | undefined\n | FormGroupValidateOrFn<TParentData, TName, TData>,\n TOnChangeAsync extends\n | undefined\n | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n TOnBlur extends undefined | FormGroupValidateOrFn<TParentData, TName, TData>,\n TOnBlurAsync extends\n | undefined\n | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n TOnSubmit extends\n | undefined\n | FormGroupValidateOrFn<TParentData, TName, TData>,\n TOnSubmitAsync extends\n | undefined\n | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n TOnDynamic extends\n | undefined\n | FormGroupValidateOrFn<TParentData, TName, TData>,\n TOnDynamicAsync extends\n | undefined\n | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n TSubmitMeta,\n TFormOnMount extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChange extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,\n TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,\n TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnDynamic extends undefined | FormValidateOrFn<TParentData>,\n TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>,\n TParentSubmitMeta,\n> extends FormGroupApiOptions<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TSubmitMeta,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnDynamic,\n TFormOnDynamicAsync,\n TFormOnServer,\n TParentSubmitMeta\n> {\n children: (\n formGroupApi: () => FormGroupApi<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TSubmitMeta,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnDynamic,\n TFormOnDynamicAsync,\n TFormOnServer,\n TParentSubmitMeta\n >,\n ) => JSXElement\n}\n\nexport function FormGroup<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName>,\n TOnMount extends undefined | FormGroupValidateOrFn<TParentData, TName, TData>,\n TOnChange extends\n | undefined\n | FormGroupValidateOrFn<TParentData, TName, TData>,\n TOnChangeAsync extends\n | undefined\n | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n TOnBlur extends undefined | FormGroupValidateOrFn<TParentData, TName, TData>,\n TOnBlurAsync extends\n | undefined\n | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n TOnSubmit extends\n | undefined\n | FormGroupValidateOrFn<TParentData, TName, TData>,\n TOnSubmitAsync extends\n | undefined\n | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n TOnDynamic extends\n | undefined\n | FormGroupValidateOrFn<TParentData, TName, TData>,\n TOnDynamicAsync extends\n | undefined\n | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n TSubmitMeta,\n TFormOnMount extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChange extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,\n TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,\n TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnDynamic extends undefined | FormValidateOrFn<TParentData>,\n TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>,\n TParentSubmitMeta,\n>(\n props: FormGroupComponentProps<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TSubmitMeta,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnDynamic,\n TFormOnDynamicAsync,\n TFormOnServer,\n TParentSubmitMeta\n >,\n) {\n const formGroupApi = createFormGroup<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TSubmitMeta,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnDynamic,\n TFormOnDynamicAsync,\n TFormOnServer,\n TParentSubmitMeta\n >(() => {\n const { children, ...formGroupOptions } = props\n return formGroupOptions\n })\n\n return <>{createComponent(() => props.children(formGroupApi), {})}</>\n}\n"],"names":["makeFormGroupReactive","formGroupApi","group","setGroup","createSignal","equals","store","useSelector","createComputed","createFormGroup","opts","options","api","FormGroupApi","mounted","onMount","cleanupFn","mount","onCleanup","update","FormGroup","props","children","formGroupOptions","_$memo","createComponent"],"mappings":";;;;AAsBA,SAASA,sBAwCPC,cAmDA;AACA,QAAM,CAACC,OAAOC,QAAQ,IAAIC,aAAaH,cAAc;AAAA,IAAEI,QAAQ;AAAA,EAAA,CAAO;AAEtE,QAAMC,QAAQC,YAAYN,aAAaK,OAAQA,CAAAA,WAAUA,MAAK;AAE9DE,iBAAe,MAAM;AAEnBF,UAAAA;AACAH,aAASF,YAAY;AAAA,EACvB,CAAC;AACD,SAAOC;AACT;AAEO,SAASO,gBAwCdC,MA0BA;AACA,QAAMC,UAAUD,KAAAA;AAEhB,QAAME,MAAM,IAAIC,aAAaF,OAAO;AAEpC,MAAIG,UAAU;AAEdC,UAAQ,MAAM;AACZ,UAAMC,YAAYJ,IAAIK,MAAAA;AACtBH,cAAU;AACVI,cAAU,MAAM;AACdF,gBAAAA;AACAF,gBAAU;AAAA,IACZ,CAAC;AAAA,EACH,CAAC;AAQDN,iBAAe,MAAM;AACnB,QAAI,CAACM,QAAS;AACdF,QAAIO,OAAOT,MAAM;AAAA,EACnB,CAAC;AAED,SAAOV,sBAyBLY,GAAG;AACP;AAsRO,SAASQ,UAwCdC,OA0BA;AACA,QAAMpB,eAAeQ,gBAyBnB,MAAM;AACN,UAAM;AAAA,MAAEa;AAAAA,MAAU,GAAGC;AAAAA,IAAAA,IAAqBF;AAC1C,WAAOE;AAAAA,EACT,CAAC;AAED,SAAAC,KAAA,MAAUC,gBAAgB,MAAMJ,MAAMC,SAASrB,YAAY,GAAG,CAAA,CAAE,CAAC;AACnE;"}
|
package/dist/esm/index.d.ts
CHANGED
package/dist/esm/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export * from "@tanstack/form-core";
|
|
2
|
-
import { useStore } from "@tanstack/solid-store";
|
|
2
|
+
import { useSelector, useStore } from "@tanstack/solid-store";
|
|
3
3
|
import { Field, createField } from "./createField.js";
|
|
4
4
|
import { createForm } from "./createForm.js";
|
|
5
5
|
import { createFieldGroup } from "./createFieldGroup.js";
|
|
@@ -14,6 +14,7 @@ export {
|
|
|
14
14
|
createFormGroup,
|
|
15
15
|
createFormHook,
|
|
16
16
|
createFormHookContexts,
|
|
17
|
+
useSelector,
|
|
17
18
|
useStore
|
|
18
19
|
};
|
|
19
20
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { FieldApi } from '@tanstack/form-core';
|
|
2
2
|
import { createComponent, createComputed, createSignal, onCleanup, onMount, } from 'solid-js';
|
|
3
|
-
import {
|
|
3
|
+
import { useSelector } from '@tanstack/solid-store';
|
|
4
4
|
// ugly way to trick solid into triggering updates for changes on the fieldApi
|
|
5
5
|
function makeFieldReactive(fieldApi, { mode }) {
|
|
6
6
|
const [field, setField] = createSignal(fieldApi, { equals: false });
|
|
@@ -9,13 +9,13 @@ function makeFieldReactive(fieldApi, { mode }) {
|
|
|
9
9
|
// avoid re-renders when child properties change. Meta is tracked piece by
|
|
10
10
|
// piece so that consumers re-render when any meta property updates.
|
|
11
11
|
// See: https://github.com/TanStack/form/issues/1961
|
|
12
|
-
const reactiveStateValue =
|
|
13
|
-
const reactiveMetaIsTouched =
|
|
14
|
-
const reactiveMetaIsBlurred =
|
|
15
|
-
const reactiveMetaIsDirty =
|
|
16
|
-
const reactiveMetaErrorMap =
|
|
17
|
-
const reactiveMetaErrorSourceMap =
|
|
18
|
-
const reactiveMetaIsValidating =
|
|
12
|
+
const reactiveStateValue = useSelector(fieldApi.store, (state) => mode === 'array' ? state.meta._arrayVersion || 0 : state.value);
|
|
13
|
+
const reactiveMetaIsTouched = useSelector(fieldApi.store, (state) => state.meta.isTouched);
|
|
14
|
+
const reactiveMetaIsBlurred = useSelector(fieldApi.store, (state) => state.meta.isBlurred);
|
|
15
|
+
const reactiveMetaIsDirty = useSelector(fieldApi.store, (state) => state.meta.isDirty);
|
|
16
|
+
const reactiveMetaErrorMap = useSelector(fieldApi.store, (state) => state.meta.errorMap);
|
|
17
|
+
const reactiveMetaErrorSourceMap = useSelector(fieldApi.store, (state) => state.meta.errorSourceMap);
|
|
18
|
+
const reactiveMetaIsValidating = useSelector(fieldApi.store, (state) => state.meta.isValidating);
|
|
19
19
|
// Run before initial render
|
|
20
20
|
createComputed(() => {
|
|
21
21
|
// Read all reactive sources to track them as dependencies
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createField.jsx","sourceRoot":"","sources":["../../src/createField.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAC9C,OAAO,EACL,eAAe,EACf,cAAc,EACd,YAAY,EACZ,SAAS,EACT,OAAO,GACR,MAAM,UAAU,CAAA;AACjB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"createField.jsx","sourceRoot":"","sources":["../../src/createField.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAC9C,OAAO,EACL,eAAe,EACf,cAAc,EACd,YAAY,EACZ,SAAS,EACT,OAAO,GACR,MAAM,UAAU,CAAA;AACjB,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAgDnD,8EAA8E;AAC9E,SAAS,iBAAiB,CAiCxB,QAsCG,EACH,EAAE,IAAI,EAAoB;IAwC1B,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,YAAY,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAA;IACnE,0EAA0E;IAC1E,wEAAwE;IACxE,0EAA0E;IAC1E,oEAAoE;IACpE,oDAAoD;IACpD,MAAM,kBAAkB,GAAG,WAAW,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAC/D,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAC/D,CAAA;IACD,MAAM,qBAAqB,GAAG,WAAW,CACvC,QAAQ,CAAC,KAAK,EACd,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAChC,CAAA;IACD,MAAM,qBAAqB,GAAG,WAAW,CACvC,QAAQ,CAAC,KAAK,EACd,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAChC,CAAA;IACD,MAAM,mBAAmB,GAAG,WAAW,CACrC,QAAQ,CAAC,KAAK,EACd,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAC9B,CAAA;IACD,MAAM,oBAAoB,GAAG,WAAW,CACtC,QAAQ,CAAC,KAAK,EACd,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAC/B,CAAA;IACD,MAAM,0BAA0B,GAAG,WAAW,CAC5C,QAAQ,CAAC,KAAK,EACd,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CACrC,CAAA;IACD,MAAM,wBAAwB,GAAG,WAAW,CAC1C,QAAQ,CAAC,KAAK,EACd,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CACnC,CAAA;IACD,4BAA4B;IAC5B,cAAc,CAAC,GAAG,EAAE;QAClB,0DAA0D;QAC1D,kBAAkB,EAAE,CAAA;QACpB,qBAAqB,EAAE,CAAA;QACvB,qBAAqB,EAAE,CAAA;QACvB,mBAAmB,EAAE,CAAA;QACrB,oBAAoB,EAAE,CAAA;QACtB,0BAA0B,EAAE,CAAA;QAC5B,wBAAwB,EAAE,CAAA;QAC1B,QAAQ,CAAC,QAAQ,CAAC,CAAA;IACpB,CAAC,CAAC,CAAA;IACF,OAAO,KAAK,CAAA;AACd,CAAC;AAED,MAAM,UAAU,WAAW,CAiCzB,IAwBC;IAED,MAAM,OAAO,GAAG,IAAI,EAAE,CAAA;IAEtB,MAAM,GAAG,GAAG,IAAI,QAAQ,CAAC,OAAO,CAAC,CAAA;IAEjC,MAAM,WAAW,GAAe,GAAY,CAAA;IAE5C,IAAI,OAAO,GAAG,KAAK,CAAA;IACnB,yDAAyD;IACzD,OAAO,CAAC,GAAG,EAAE;QACX,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,EAAE,CAAA;QAC7B,OAAO,GAAG,IAAI,CAAA;QACd,SAAS,CAAC,GAAG,EAAE;YACb,SAAS,EAAE,CAAA;YACX,OAAO,GAAG,KAAK,CAAA;QACjB,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF;;;;;OAKG;IACH,cAAc,CAAC,GAAG,EAAE;QAClB,IAAI,CAAC,OAAO;YAAE,OAAM;QACpB,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAA;IACpB,CAAC,CAAC,CAAA;IAEF,OAAO,iBAAiB,CAwBtB,WAAoB,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAA;AACjD,CAAC;AA0UD,MAAM,UAAU,KAAK,CAiCnB,KAwBC;IAED,MAAM,QAAQ,GAAG,WAAW,CAwB1B,GAAG,EAAE;QACL,MAAM,EAAE,QAAQ,EAAE,GAAG,YAAY,EAAE,GAAG,KAAK,CAAA;QAC3C,OAAO,YAAY,CAAA;IACrB,CAAC,CAAC,CAAA;IAEF,OAAO,EAAE,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAA;AACnE,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { FieldGroupApi, functionalUpdate } from '@tanstack/form-core';
|
|
2
|
-
import {
|
|
2
|
+
import { useSelector } from '@tanstack/solid-store';
|
|
3
3
|
import { onCleanup, onMount } from 'solid-js';
|
|
4
4
|
export function createFieldGroup(opts) {
|
|
5
5
|
const options = opts();
|
|
@@ -12,7 +12,7 @@ export function createFieldGroup(opts) {
|
|
|
12
12
|
extendedApi.AppField = (props) => (<form.AppField {...api.getFormFieldOptions(props)}/>);
|
|
13
13
|
extendedApi.Field = (props) => (<form.Field {...api.getFormFieldOptions(props)}/>);
|
|
14
14
|
extendedApi.Subscribe = (props) => {
|
|
15
|
-
const data =
|
|
15
|
+
const data = useSelector(api.store, props.selector);
|
|
16
16
|
return functionalUpdate(props.children, data());
|
|
17
17
|
};
|
|
18
18
|
let mounted = false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createFieldGroup.jsx","sourceRoot":"","sources":["../../src/createFieldGroup.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AACrE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"createFieldGroup.jsx","sourceRoot":"","sources":["../../src/createFieldGroup.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACnD,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAuE7C,MAAM,UAAU,gBAAgB,CAoB9B,IA0CC;IAmBD,MAAM,OAAO,GAAG,IAAI,EAAE,CAAA;IACtB,MAAM,GAAG,GAAG,IAAI,aAAa,CAAC,OAAO,CAAC,CAAA;IACtC,MAAM,IAAI,GACR,OAAO,CAAC,IAAI,YAAY,aAAa;QACnC,CAAC,CAAE,OAAO,CAAC,IAAI,CAAC,IAeZ;QACJ,CAAC,CAAC,OAAO,CAAC,IAAI,CAAA;IAElB,MAAM,WAAW,GAiBb,GAAY,CAAA;IAEhB,WAAW,CAAC,OAAO,GAAG,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,YAAY,CAAC,EAAG,CAAA;IAC1E,WAAW,CAAC,QAAQ,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAChC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAK,GAAG,CAAC,mBAAmB,CAAC,KAAK,CAAS,CAAC,EAAG,CAC/D,CAAA;IACD,WAAW,CAAC,KAAK,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAC7B,CAAC,IAAI,CAAC,KAAK,CAAC,IAAK,GAAG,CAAC,mBAAmB,CAAC,KAAK,CAAS,CAAC,EAAG,CAC5D,CAAA;IACD,WAAW,CAAC,SAAS,GAAG,CAAC,KAAK,EAAE,EAAE;QAChC,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAA;QAEnD,OAAO,gBAAgB,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAY,CAAA;IAC5D,CAAC,CAAA;IAED,IAAI,OAAO,GAAG,KAAK,CAAA;IACnB,OAAO,CAAC,GAAG,EAAE;QACX,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,EAAE,CAAA;QAC7B,OAAO,GAAG,IAAI,CAAA;QACd,SAAS,CAAC,GAAG,EAAE;YACb,SAAS,EAAE,CAAA;YACX,OAAO,GAAG,KAAK,CAAA;QACjB,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,OAAO,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE;QAChC,GAAG,OAAO,CAAC,cAAc;KAC1B,CAiBA,CAAA;AACH,CAAC"}
|
|
@@ -6,6 +6,10 @@ import type { FormGroupComponent } from './createFormGroup';
|
|
|
6
6
|
export interface SolidFormApi<TParentData, TFormOnMount extends undefined | FormValidateOrFn<TParentData>, TFormOnChange extends undefined | FormValidateOrFn<TParentData>, TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>, TFormOnBlur extends undefined | FormValidateOrFn<TParentData>, TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>, TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>, TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>, TFormOnDynamic extends undefined | FormValidateOrFn<TParentData>, TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TParentData>, TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>, TSubmitMeta> {
|
|
7
7
|
Field: FieldComponent<TParentData, TFormOnMount, TFormOnChange, TFormOnChangeAsync, TFormOnBlur, TFormOnBlurAsync, TFormOnSubmit, TFormOnSubmitAsync, TFormOnDynamic, TFormOnDynamicAsync, TFormOnServer, TSubmitMeta>;
|
|
8
8
|
FormGroup: FormGroupComponent<TParentData, TFormOnMount, TFormOnChange, TFormOnChangeAsync, TFormOnBlur, TFormOnBlurAsync, TFormOnSubmit, TFormOnSubmitAsync, TFormOnDynamic, TFormOnDynamicAsync, TFormOnServer, TSubmitMeta>;
|
|
9
|
+
useSelector: <TSelected = NoInfer<FormState<TParentData, TFormOnMount, TFormOnChange, TFormOnChangeAsync, TFormOnBlur, TFormOnBlurAsync, TFormOnSubmit, TFormOnSubmitAsync, TFormOnDynamic, TFormOnDynamicAsync, TFormOnServer>>>(selector?: (state: NoInfer<FormState<TParentData, TFormOnMount, TFormOnChange, TFormOnChangeAsync, TFormOnBlur, TFormOnBlurAsync, TFormOnSubmit, TFormOnSubmitAsync, TFormOnDynamic, TFormOnDynamicAsync, TFormOnServer>>) => TSelected) => () => TSelected;
|
|
10
|
+
/**
|
|
11
|
+
* @deprecated Use `form.useSelector` instead.
|
|
12
|
+
*/
|
|
9
13
|
useStore: <TSelected = NoInfer<FormState<TParentData, TFormOnMount, TFormOnChange, TFormOnChangeAsync, TFormOnBlur, TFormOnBlurAsync, TFormOnSubmit, TFormOnSubmitAsync, TFormOnDynamic, TFormOnDynamicAsync, TFormOnServer>>>(selector?: (state: NoInfer<FormState<TParentData, TFormOnMount, TFormOnChange, TFormOnChangeAsync, TFormOnBlur, TFormOnBlurAsync, TFormOnSubmit, TFormOnSubmitAsync, TFormOnDynamic, TFormOnDynamicAsync, TFormOnServer>>) => TSelected) => () => TSelected;
|
|
10
14
|
Subscribe: <TSelected = NoInfer<FormState<TParentData, TFormOnMount, TFormOnChange, TFormOnChangeAsync, TFormOnBlur, TFormOnBlurAsync, TFormOnSubmit, TFormOnSubmitAsync, TFormOnDynamic, TFormOnDynamicAsync, TFormOnServer>>>(props: {
|
|
11
15
|
selector?: (state: NoInfer<FormState<TParentData, TFormOnMount, TFormOnChange, TFormOnChangeAsync, TFormOnBlur, TFormOnBlurAsync, TFormOnSubmit, TFormOnSubmitAsync, TFormOnDynamic, TFormOnDynamicAsync, TFormOnServer>>) => TSelected;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { FormApi, functionalUpdate } from '@tanstack/form-core';
|
|
2
2
|
import { createComputed, onMount } from 'solid-js';
|
|
3
|
-
import {
|
|
3
|
+
import { useSelector } from '@tanstack/solid-store';
|
|
4
4
|
import { Field } from './createField';
|
|
5
5
|
import { FormGroup } from './createFormGroup';
|
|
6
6
|
export function createForm(opts) {
|
|
@@ -9,8 +9,10 @@ export function createForm(opts) {
|
|
|
9
9
|
const extendedApi = api;
|
|
10
10
|
extendedApi.Field = (props) => <Field {...props} form={api}/>;
|
|
11
11
|
extendedApi.FormGroup = (props) => <FormGroup {...props} form={api}/>;
|
|
12
|
-
extendedApi.
|
|
13
|
-
|
|
12
|
+
extendedApi.useSelector = (selector) => useSelector(api.store, selector);
|
|
13
|
+
/** @deprecated Use `form.useSelector` instead. */
|
|
14
|
+
extendedApi.useStore = extendedApi.useSelector;
|
|
15
|
+
extendedApi.Subscribe = (props) => functionalUpdate(props.children, useSelector(api.store, props.selector));
|
|
14
16
|
onMount(api.mount);
|
|
15
17
|
/**
|
|
16
18
|
* formApi.update should not have any side effects. Think of it like a `useRef`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createForm.jsx","sourceRoot":"","sources":["../../src/createForm.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAC/D,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAClD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"createForm.jsx","sourceRoot":"","sources":["../../src/createForm.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAC/D,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACnD,OAAO,EAAE,KAAK,EAAe,MAAM,eAAe,CAAA;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAgN7C,MAAM,UAAU,UAAU,CAcxB,IAaC;IAED,MAAM,OAAO,GAAG,IAAI,EAAE,EAAE,CAAA;IACxB,MAAM,GAAG,GAAG,IAAI,OAAO,CAarB,OAAO,CAAC,CAAA;IACV,MAAM,WAAW,GAcX,GAAY,CAAA;IAElB,WAAW,CAAC,KAAK,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,EAAG,CAAA;IAC9D,WAAW,CAAC,SAAS,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,EAAG,CAAA;IACtE,WAAW,CAAC,WAAW,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;IACxE,kDAAkD;IAClD,WAAW,CAAC,QAAQ,GAAG,WAAW,CAAC,WAAW,CAAA;IAC9C,WAAW,CAAC,SAAS,GAAG,CAAC,KAAK,EAAE,EAAE,CAChC,gBAAgB,CAAC,KAAK,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAA;IAE1E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IAElB;;;OAGG;IACH,cAAc,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAA;IAE1C,OAAO,WAAW,CAAA;AACpB,CAAC"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { FormGroupApi } from '@tanstack/form-core';
|
|
2
2
|
import { createComponent, createComputed, createSignal, onCleanup, onMount, } from 'solid-js';
|
|
3
|
-
import {
|
|
3
|
+
import { useSelector } from '@tanstack/solid-store';
|
|
4
4
|
// ugly way to trick solid into triggering updates for changes on the formGroupApi
|
|
5
5
|
function makeFormGroupReactive(formGroupApi) {
|
|
6
6
|
const [group, setGroup] = createSignal(formGroupApi, { equals: false });
|
|
7
7
|
// Handle shallow comparison to make sure that Derived doesn't create a new setGroup call every time
|
|
8
|
-
const store =
|
|
8
|
+
const store = useSelector(formGroupApi.store, (store) => store);
|
|
9
9
|
// Run before initial render
|
|
10
10
|
createComputed(() => {
|
|
11
11
|
// Use the store to track dependencies
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createFormGroup.jsx","sourceRoot":"","sources":["../../src/createFormGroup.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAoB,MAAM,qBAAqB,CAAA;AACpE,OAAO,EACL,eAAe,EACf,cAAc,EACd,YAAY,EACZ,SAAS,EACT,OAAO,GACR,MAAM,UAAU,CAAA;AACjB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"createFormGroup.jsx","sourceRoot":"","sources":["../../src/createFormGroup.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAoB,MAAM,qBAAqB,CAAA;AACpE,OAAO,EACL,eAAe,EACf,cAAc,EACd,YAAY,EACZ,SAAS,EACT,OAAO,GACR,MAAM,UAAU,CAAA;AACjB,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAanD,kFAAkF;AAClF,SAAS,qBAAqB,CAwC5B,YAyBC;IA2BD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,YAAY,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAA;IACvE,oGAAoG;IACpG,MAAM,KAAK,GAAG,WAAW,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAA;IAC/D,4BAA4B;IAC5B,cAAc,CAAC,GAAG,EAAE;QAClB,sCAAsC;QACtC,KAAK,EAAE,CAAA;QACP,QAAQ,CAAC,YAAY,CAAC,CAAA;IACxB,CAAC,CAAC,CAAA;IACF,OAAO,KAAK,CAAA;AACd,CAAC;AAED,MAAM,UAAU,eAAe,CAwC7B,IAyBC;IAED,MAAM,OAAO,GAAG,IAAI,EAAE,CAAA;IAEtB,MAAM,GAAG,GAAG,IAAI,YAAY,CAAC,OAAO,CAAC,CAAA;IAErC,IAAI,OAAO,GAAG,KAAK,CAAA;IACnB,8DAA8D;IAC9D,OAAO,CAAC,GAAG,EAAE;QACX,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,EAAE,CAAA;QAC7B,OAAO,GAAG,IAAI,CAAA;QACd,SAAS,CAAC,GAAG,EAAE;YACb,SAAS,EAAE,CAAA;YACX,OAAO,GAAG,KAAK,CAAA;QACjB,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF;;;;;OAKG;IACH,cAAc,CAAC,GAAG,EAAE;QAClB,IAAI,CAAC,OAAO;YAAE,OAAM;QACpB,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAA;IACpB,CAAC,CAAC,CAAA;IAEF,OAAO,qBAAqB,CAyB1B,GAAG,CAAC,CAAA;AACR,CAAC;AAsRD,MAAM,UAAU,SAAS,CAwCvB,KAyBC;IAED,MAAM,YAAY,GAAG,eAAe,CAyBlC,GAAG,EAAE;QACL,MAAM,EAAE,QAAQ,EAAE,GAAG,gBAAgB,EAAE,GAAG,KAAK,CAAA;QAC/C,OAAO,gBAAgB,CAAA;IACzB,CAAC,CAAC,CAAA;IAEF,OAAO,EAAE,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAA;AACvE,CAAC"}
|
package/dist/source/index.d.ts
CHANGED
package/dist/source/index.jsx
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.jsx","sourceRoot":"","sources":["../../src/index.tsx"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAA;AAEnC,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.jsx","sourceRoot":"","sources":["../../src/index.tsx"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAA;AAEnC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAE7D,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA;AAC5B,cAAc,oBAAoB,CAAA;AAClC,cAAc,mBAAmB,CAAA;AACjC,cAAc,kBAAkB,CAAA;AAChC,cAAc,SAAS,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tanstack/solid-form",
|
|
3
|
-
"version": "1.33.
|
|
3
|
+
"version": "1.33.2",
|
|
4
4
|
"description": "Powerful, type-safe forms for Solid.",
|
|
5
5
|
"author": "tannerlinsley",
|
|
6
6
|
"license": "MIT",
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
],
|
|
43
43
|
"dependencies": {
|
|
44
44
|
"@tanstack/solid-store": "^0.11.0",
|
|
45
|
-
"@tanstack/form-core": "1.33.
|
|
45
|
+
"@tanstack/form-core": "1.33.2"
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|
|
48
48
|
"solid-js": "^1.9.9",
|
package/src/createField.tsx
CHANGED
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
onCleanup,
|
|
7
7
|
onMount,
|
|
8
8
|
} from 'solid-js'
|
|
9
|
-
import {
|
|
9
|
+
import { useSelector } from '@tanstack/solid-store'
|
|
10
10
|
import type {
|
|
11
11
|
DeepKeys,
|
|
12
12
|
DeepValue,
|
|
@@ -173,30 +173,30 @@ function makeFieldReactive<
|
|
|
173
173
|
// avoid re-renders when child properties change. Meta is tracked piece by
|
|
174
174
|
// piece so that consumers re-render when any meta property updates.
|
|
175
175
|
// See: https://github.com/TanStack/form/issues/1961
|
|
176
|
-
const reactiveStateValue =
|
|
176
|
+
const reactiveStateValue = useSelector(fieldApi.store, (state) =>
|
|
177
177
|
mode === 'array' ? state.meta._arrayVersion || 0 : state.value,
|
|
178
178
|
)
|
|
179
|
-
const reactiveMetaIsTouched =
|
|
179
|
+
const reactiveMetaIsTouched = useSelector(
|
|
180
180
|
fieldApi.store,
|
|
181
181
|
(state) => state.meta.isTouched,
|
|
182
182
|
)
|
|
183
|
-
const reactiveMetaIsBlurred =
|
|
183
|
+
const reactiveMetaIsBlurred = useSelector(
|
|
184
184
|
fieldApi.store,
|
|
185
185
|
(state) => state.meta.isBlurred,
|
|
186
186
|
)
|
|
187
|
-
const reactiveMetaIsDirty =
|
|
187
|
+
const reactiveMetaIsDirty = useSelector(
|
|
188
188
|
fieldApi.store,
|
|
189
189
|
(state) => state.meta.isDirty,
|
|
190
190
|
)
|
|
191
|
-
const reactiveMetaErrorMap =
|
|
191
|
+
const reactiveMetaErrorMap = useSelector(
|
|
192
192
|
fieldApi.store,
|
|
193
193
|
(state) => state.meta.errorMap,
|
|
194
194
|
)
|
|
195
|
-
const reactiveMetaErrorSourceMap =
|
|
195
|
+
const reactiveMetaErrorSourceMap = useSelector(
|
|
196
196
|
fieldApi.store,
|
|
197
197
|
(state) => state.meta.errorSourceMap,
|
|
198
198
|
)
|
|
199
|
-
const reactiveMetaIsValidating =
|
|
199
|
+
const reactiveMetaIsValidating = useSelector(
|
|
200
200
|
fieldApi.store,
|
|
201
201
|
(state) => state.meta.isValidating,
|
|
202
202
|
)
|
package/src/createFieldGroup.tsx
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { FieldGroupApi, functionalUpdate } from '@tanstack/form-core'
|
|
2
|
-
import {
|
|
2
|
+
import { useSelector } from '@tanstack/solid-store'
|
|
3
3
|
import { onCleanup, onMount } from 'solid-js'
|
|
4
4
|
import type { Component, JSX, ParentProps } from 'solid-js'
|
|
5
5
|
import type {
|
|
@@ -201,7 +201,7 @@ export function createFieldGroup<
|
|
|
201
201
|
<form.Field {...(api.getFormFieldOptions(props) as any)} />
|
|
202
202
|
)
|
|
203
203
|
extendedApi.Subscribe = (props) => {
|
|
204
|
-
const data =
|
|
204
|
+
const data = useSelector(api.store, props.selector)
|
|
205
205
|
|
|
206
206
|
return functionalUpdate(props.children, data()) as Element
|
|
207
207
|
}
|
package/src/createForm.tsx
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { FormApi, functionalUpdate } from '@tanstack/form-core'
|
|
2
2
|
import { createComputed, onMount } from 'solid-js'
|
|
3
|
-
import {
|
|
3
|
+
import { useSelector } from '@tanstack/solid-store'
|
|
4
4
|
import { Field, createField } from './createField'
|
|
5
5
|
import { FormGroup } from './createFormGroup'
|
|
6
6
|
import type {
|
|
@@ -55,6 +55,44 @@ export interface SolidFormApi<
|
|
|
55
55
|
TFormOnServer,
|
|
56
56
|
TSubmitMeta
|
|
57
57
|
>
|
|
58
|
+
useSelector: <
|
|
59
|
+
TSelected = NoInfer<
|
|
60
|
+
FormState<
|
|
61
|
+
TParentData,
|
|
62
|
+
TFormOnMount,
|
|
63
|
+
TFormOnChange,
|
|
64
|
+
TFormOnChangeAsync,
|
|
65
|
+
TFormOnBlur,
|
|
66
|
+
TFormOnBlurAsync,
|
|
67
|
+
TFormOnSubmit,
|
|
68
|
+
TFormOnSubmitAsync,
|
|
69
|
+
TFormOnDynamic,
|
|
70
|
+
TFormOnDynamicAsync,
|
|
71
|
+
TFormOnServer
|
|
72
|
+
>
|
|
73
|
+
>,
|
|
74
|
+
>(
|
|
75
|
+
selector?: (
|
|
76
|
+
state: NoInfer<
|
|
77
|
+
FormState<
|
|
78
|
+
TParentData,
|
|
79
|
+
TFormOnMount,
|
|
80
|
+
TFormOnChange,
|
|
81
|
+
TFormOnChangeAsync,
|
|
82
|
+
TFormOnBlur,
|
|
83
|
+
TFormOnBlurAsync,
|
|
84
|
+
TFormOnSubmit,
|
|
85
|
+
TFormOnSubmitAsync,
|
|
86
|
+
TFormOnDynamic,
|
|
87
|
+
TFormOnDynamicAsync,
|
|
88
|
+
TFormOnServer
|
|
89
|
+
>
|
|
90
|
+
>,
|
|
91
|
+
) => TSelected,
|
|
92
|
+
) => () => TSelected
|
|
93
|
+
/**
|
|
94
|
+
* @deprecated Use `form.useSelector` instead.
|
|
95
|
+
*/
|
|
58
96
|
useStore: <
|
|
59
97
|
TSelected = NoInfer<
|
|
60
98
|
FormState<
|
|
@@ -234,9 +272,11 @@ export function createForm<
|
|
|
234
272
|
|
|
235
273
|
extendedApi.Field = (props) => <Field {...props} form={api} />
|
|
236
274
|
extendedApi.FormGroup = (props) => <FormGroup {...props} form={api} />
|
|
237
|
-
extendedApi.
|
|
275
|
+
extendedApi.useSelector = (selector) => useSelector(api.store, selector)
|
|
276
|
+
/** @deprecated Use `form.useSelector` instead. */
|
|
277
|
+
extendedApi.useStore = extendedApi.useSelector
|
|
238
278
|
extendedApi.Subscribe = (props) =>
|
|
239
|
-
functionalUpdate(props.children,
|
|
279
|
+
functionalUpdate(props.children, useSelector(api.store, props.selector))
|
|
240
280
|
|
|
241
281
|
onMount(api.mount)
|
|
242
282
|
|