@tanstack/solid-form 0.13.7 → 0.16.0
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 +3 -26
- package/dist/cjs/createField.cjs.map +1 -1
- package/dist/cjs/createField.d.cts +4 -10
- package/dist/cjs/createForm.cjs +10 -11
- package/dist/cjs/createForm.cjs.map +1 -1
- package/dist/cjs/createForm.d.cts +2 -5
- package/dist/cjs/createFormFactory.cjs.map +1 -1
- package/dist/cjs/createFormFactory.d.cts +3 -3
- package/dist/cjs/types.d.cts +2 -2
- package/dist/esm/createField.d.ts +4 -10
- package/dist/esm/createField.js +5 -28
- package/dist/esm/createField.js.map +1 -1
- package/dist/esm/createForm.d.ts +2 -5
- package/dist/esm/createForm.js +10 -11
- package/dist/esm/createForm.js.map +1 -1
- package/dist/esm/createFormFactory.d.ts +3 -3
- package/dist/esm/createFormFactory.js.map +1 -1
- package/dist/esm/types.d.ts +2 -2
- package/package.json +3 -3
- package/src/createField.tsx +25 -56
- package/src/createForm.tsx +9 -13
- package/src/createFormFactory.ts +3 -3
- package/src/tests/createField.test-d.tsx +5 -6
- package/src/tests/createField.test.tsx +100 -19
- package/src/tests/createForm.test.tsx +21 -22
- package/src/tests/createFormFactory.test.tsx +3 -4
- package/src/types.ts +8 -2
- package/dist/cjs/formContext.cjs +0 -13
- package/dist/cjs/formContext.cjs.map +0 -1
- package/dist/cjs/formContext.d.cts +0 -11
- package/dist/esm/formContext.d.ts +0 -11
- package/dist/esm/formContext.js +0 -13
- package/dist/esm/formContext.js.map +0 -1
- package/src/formContext.ts +0 -20
package/dist/cjs/createField.cjs
CHANGED
@@ -3,7 +3,6 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const web = require("solid-js/web");
|
4
4
|
const formCore = require("@tanstack/form-core");
|
5
5
|
const solidJs = require("solid-js");
|
6
|
-
const formContext = require("./formContext.cjs");
|
7
6
|
function makeFieldReactive(fieldApi) {
|
8
7
|
const [flag, setFlag] = solidJs.createSignal(false);
|
9
8
|
const fieldApiMemo = solidJs.createMemo(() => [flag(), fieldApi]);
|
@@ -12,22 +11,10 @@ function makeFieldReactive(fieldApi) {
|
|
12
11
|
return () => fieldApiMemo()[1];
|
13
12
|
}
|
14
13
|
function createField(opts) {
|
15
|
-
const {
|
16
|
-
formApi,
|
17
|
-
parentFieldName
|
18
|
-
} = formContext.useFormContext();
|
19
14
|
const options = opts();
|
20
|
-
const
|
21
|
-
const fieldApi = new formCore.FieldApi({
|
22
|
-
...options,
|
23
|
-
form: formApi,
|
24
|
-
name
|
25
|
-
});
|
15
|
+
const fieldApi = new formCore.FieldApi(options);
|
26
16
|
fieldApi.Field = Field;
|
27
|
-
solidJs.createComputed(() => fieldApi.update(
|
28
|
-
...opts(),
|
29
|
-
form: formApi
|
30
|
-
}));
|
17
|
+
solidJs.createComputed(() => fieldApi.update(opts()));
|
31
18
|
solidJs.onMount(() => solidJs.onCleanup(fieldApi.mount()));
|
32
19
|
return makeFieldReactive(fieldApi);
|
33
20
|
}
|
@@ -39,17 +26,7 @@ function Field(props) {
|
|
39
26
|
} = props;
|
40
27
|
return fieldOptions;
|
41
28
|
});
|
42
|
-
return web.createComponent(
|
43
|
-
get value() {
|
44
|
-
return {
|
45
|
-
formApi: fieldApi().form,
|
46
|
-
parentFieldName: String(fieldApi().name)
|
47
|
-
};
|
48
|
-
},
|
49
|
-
get children() {
|
50
|
-
return solidJs.createComponent(() => props.children(fieldApi), {});
|
51
|
-
}
|
52
|
-
});
|
29
|
+
return web.memo(() => solidJs.createComponent(() => props.children(fieldApi), {}));
|
53
30
|
}
|
54
31
|
exports.Field = Field;
|
55
32
|
exports.createField = createField;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"createField.cjs","sources":["../../src/createField.tsx"],"sourcesContent":["import { FieldApi } from '@tanstack/form-core'\nimport {\n createComponent,\n createComputed,\n createMemo,\n createSignal,\n onCleanup,\n onMount,\n} from 'solid-js'\
|
1
|
+
{"version":3,"file":"createField.cjs","sources":["../../src/createField.tsx"],"sourcesContent":["import { FieldApi } from '@tanstack/form-core'\nimport {\n createComponent,\n createComputed,\n createMemo,\n createSignal,\n onCleanup,\n onMount,\n} from 'solid-js'\n\nimport type {\n DeepKeys,\n DeepValue,\n Narrow,\n Validator,\n} from '@tanstack/form-core'\nimport type { JSXElement } from 'solid-js'\nimport type { CreateFieldOptions } from './types'\n\ndeclare module '@tanstack/form-core' {\n // eslint-disable-next-line no-shadow\n interface FieldApi<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TFieldValidator extends\n | Validator<DeepValue<TParentData, TName>, unknown>\n | undefined = undefined,\n TFormValidator extends\n | Validator<TParentData, unknown>\n | undefined = undefined,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n > {\n Field: FieldComponent<TParentData, TFormValidator>\n }\n}\n\nexport type CreateField<\n TParentData,\n TFormValidator extends\n | Validator<TParentData, unknown>\n | undefined = undefined,\n> = <\n TName extends DeepKeys<TParentData>,\n TFieldValidator extends\n | Validator<DeepValue<TParentData, TName>, unknown>\n | undefined = undefined,\n>(\n opts: () => { name: Narrow<TName> } & Omit<\n CreateFieldOptions<TParentData, TName, TFieldValidator, TFormValidator>,\n 'form'\n >,\n) => () => FieldApi<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n DeepValue<TParentData, TName>\n>\n\n// ugly way to trick solid into triggering updates for changes on the fieldApi\nfunction makeFieldReactive<FieldApiT extends FieldApi<any, any, any, any>>(\n fieldApi: FieldApiT,\n): () => FieldApiT {\n const [flag, setFlag] = createSignal(false)\n const fieldApiMemo = createMemo(() => [flag(), fieldApi] as const)\n const unsubscribeStore = fieldApi.store.subscribe(() => setFlag((f) => !f))\n onCleanup(unsubscribeStore)\n return () => fieldApiMemo()[1]\n}\n\nexport function createField<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TFieldValidator extends\n | Validator<DeepValue<TParentData, TName>, unknown>\n | undefined = undefined,\n TFormValidator extends\n | Validator<TParentData, unknown>\n | undefined = undefined,\n>(\n opts: () => CreateFieldOptions<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator\n >,\n): () => FieldApi<TParentData, TName, TFieldValidator, TFormValidator> {\n const options = opts()\n\n const fieldApi = new FieldApi(options)\n fieldApi.Field = Field as never\n\n /**\n * fieldApi.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(() => fieldApi.update(opts()))\n\n // Instantiates field meta and removes it when unrendered\n onMount(() => onCleanup(fieldApi.mount()))\n\n return makeFieldReactive(fieldApi) as never\n}\n\ntype FieldComponentProps<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TFieldValidator extends\n | Validator<DeepValue<TParentData, TName>, unknown>\n | undefined = undefined,\n TFormValidator extends\n | Validator<TParentData, unknown>\n | undefined = undefined,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> = {\n children: (\n fieldApi: () => FieldApi<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >,\n ) => JSXElement\n} & Omit<\n CreateFieldOptions<TParentData, TName, TFieldValidator, TFormValidator>,\n 'form'\n>\n\nexport type FieldComponent<\n TParentData,\n TFormValidator extends\n | Validator<TParentData, unknown>\n | undefined = undefined,\n> = <\n TName extends DeepKeys<TParentData>,\n TFieldValidator extends\n | Validator<DeepValue<TParentData, TName>, unknown>\n | undefined = undefined,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n>({\n children,\n ...fieldOptions\n}: Omit<\n FieldComponentProps<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >,\n 'form'\n>) => JSXElement\n\nexport function Field<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TFieldValidator extends\n | Validator<DeepValue<TParentData, TName>, unknown>\n | undefined = undefined,\n TFormValidator extends\n | Validator<TParentData, unknown>\n | undefined = undefined,\n>(\n props: {\n children: (\n fieldApi: () => FieldApi<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator\n >,\n ) => JSXElement\n } & CreateFieldOptions<TParentData, TName, TFieldValidator, TFormValidator>,\n) {\n const fieldApi = createField<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator\n >(() => {\n const { children, ...fieldOptions } = props\n return fieldOptions\n })\n\n return <>{createComponent(() => props.children(fieldApi), {})}</>\n}\n"],"names":["makeFieldReactive","fieldApi","flag","setFlag","createSignal","fieldApiMemo","createMemo","unsubscribeStore","store","subscribe","f","onCleanup","createField","opts","options","FieldApi","Field","createComputed","update","onMount","mount","props","children","fieldOptions","_$memo","createComponent"],"mappings":";;;;;AA4DA,SAASA,kBACPC,UACiB;AACjB,QAAM,CAACC,MAAMC,OAAO,IAAIC,qBAAa,KAAK;AAC1C,QAAMC,eAAeC,QAAAA,WAAW,MAAM,CAACJ,KAAK,GAAGD,QAAQ,CAAW;AAC5DM,QAAAA,mBAAmBN,SAASO,MAAMC,UAAU,MAAMN,QAASO,CAAAA,MAAM,CAACA,CAAC,CAAC;AAC1EC,UAAAA,UAAUJ,gBAAgB;AACnB,SAAA,MAAMF,eAAe,CAAC;AAC/B;AAEO,SAASO,YAUdC,MAMqE;AACrE,QAAMC,UAAUD;AAEVZ,QAAAA,WAAW,IAAIc,kBAASD,OAAO;AACrCb,WAASe,QAAQA;AAQjBC,UAAAA,eAAe,MAAMhB,SAASiB,OAAOL,KAAAA,CAAM,CAAC;AAG5CM,UAAAA,QAAQ,MAAMR,QAAAA,UAAUV,SAASmB,MAAAA,CAAO,CAAC;AAEzC,SAAOpB,kBAAkBC,QAAQ;AACnC;AAoDO,SAASe,MAUdK,OAUA;AACMpB,QAAAA,WAAWW,YAKf,MAAM;AACA,UAAA;AAAA,MAAEU;AAAAA,MAAU,GAAGC;AAAAA,IAAiBF,IAAAA;AAC/BE,WAAAA;AAAAA,EAAAA,CACR;AAEDC,SAAAA,IAAAA,KAAA,MAAUC,QAAAA,gBAAgB,MAAMJ,MAAMC,SAASrB,QAAQ,GAAG,CAAE,CAAA,CAAC;AAC/D;;;"}
|
@@ -7,20 +7,14 @@ declare module '@tanstack/form-core' {
|
|
7
7
|
Field: FieldComponent<TParentData, TFormValidator>;
|
8
8
|
}
|
9
9
|
}
|
10
|
-
export type CreateField<TParentData> = <TName extends DeepKeys<TParentData>, TFieldValidator extends Validator<DeepValue<TParentData, TName>, unknown> | undefined = undefined
|
10
|
+
export type CreateField<TParentData, TFormValidator extends Validator<TParentData, unknown> | undefined = undefined> = <TName extends DeepKeys<TParentData>, TFieldValidator extends Validator<DeepValue<TParentData, TName>, unknown> | undefined = undefined>(opts: () => {
|
11
11
|
name: Narrow<TName>;
|
12
|
-
} & CreateFieldOptions<TParentData, TName, TFieldValidator, TFormValidator>) => () => FieldApi<TParentData, TName, TFieldValidator, TFormValidator, DeepValue<TParentData, TName>>;
|
12
|
+
} & Omit<CreateFieldOptions<TParentData, TName, TFieldValidator, TFormValidator>, 'form'>) => () => FieldApi<TParentData, TName, TFieldValidator, TFormValidator, DeepValue<TParentData, TName>>;
|
13
13
|
export declare function createField<TParentData, TName extends DeepKeys<TParentData>, TFieldValidator extends Validator<DeepValue<TParentData, TName>, unknown> | undefined = undefined, TFormValidator extends Validator<TParentData, unknown> | undefined = undefined>(opts: () => CreateFieldOptions<TParentData, TName, TFieldValidator, TFormValidator>): () => FieldApi<TParentData, TName, TFieldValidator, TFormValidator>;
|
14
14
|
type FieldComponentProps<TParentData, TName extends DeepKeys<TParentData>, TFieldValidator extends Validator<DeepValue<TParentData, TName>, unknown> | undefined = undefined, TFormValidator extends Validator<TParentData, unknown> | undefined = undefined, TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>> = {
|
15
15
|
children: (fieldApi: () => FieldApi<TParentData, TName, TFieldValidator, TFormValidator, TData>) => JSXElement;
|
16
|
-
} &
|
17
|
-
|
18
|
-
index: number;
|
19
|
-
} : {
|
20
|
-
name: TName;
|
21
|
-
index?: never;
|
22
|
-
}) & Omit<CreateFieldOptions<TParentData, TName, TFieldValidator, TFormValidator>, 'name' | 'index'>;
|
23
|
-
export type FieldComponent<TParentData, TFormValidator extends Validator<TParentData, unknown> | undefined = undefined> = <TName extends DeepKeys<TParentData>, TFieldValidator extends Validator<DeepValue<TParentData, TName>, unknown> | undefined = undefined, TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>>({ children, ...fieldOptions }: FieldComponentProps<TParentData, TName, TFieldValidator, TFormValidator, TData>) => JSXElement;
|
16
|
+
} & Omit<CreateFieldOptions<TParentData, TName, TFieldValidator, TFormValidator>, 'form'>;
|
17
|
+
export type FieldComponent<TParentData, TFormValidator extends Validator<TParentData, unknown> | undefined = undefined> = <TName extends DeepKeys<TParentData>, TFieldValidator extends Validator<DeepValue<TParentData, TName>, unknown> | undefined = undefined, TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>>({ children, ...fieldOptions }: Omit<FieldComponentProps<TParentData, TName, TFieldValidator, TFormValidator, TData>, 'form'>) => JSXElement;
|
24
18
|
export declare function Field<TParentData, TName extends DeepKeys<TParentData>, TFieldValidator extends Validator<DeepValue<TParentData, TName>, unknown> | undefined = undefined, TFormValidator extends Validator<TParentData, unknown> | undefined = undefined>(props: {
|
25
19
|
children: (fieldApi: () => FieldApi<TParentData, TName, TFieldValidator, TFormValidator>) => JSXElement;
|
26
20
|
} & CreateFieldOptions<TParentData, TName, TFieldValidator, TFormValidator>): import("solid-js").JSX.Element;
|
package/dist/cjs/createForm.cjs
CHANGED
@@ -5,22 +5,21 @@ const formCore = require("@tanstack/form-core");
|
|
5
5
|
const solidJs = require("solid-js");
|
6
6
|
const solidStore = require("@tanstack/solid-store");
|
7
7
|
const createField = require("./createField.cjs");
|
8
|
-
const formContext = require("./formContext.cjs");
|
9
8
|
function createForm(opts) {
|
10
9
|
const options = opts == null ? void 0 : opts();
|
11
10
|
const formApi = new formCore.FormApi(options);
|
12
|
-
formApi.
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
formApi.createField = createField.createField;
|
11
|
+
formApi.Field = (props) => web.createComponent(createField.Field, web.mergeProps(props, {
|
12
|
+
form: formApi
|
13
|
+
}));
|
14
|
+
formApi.createField = (props) => createField.createField(() => {
|
15
|
+
return {
|
16
|
+
...props(),
|
17
|
+
form: formApi
|
18
|
+
};
|
19
|
+
});
|
22
20
|
formApi.useStore = (selector) => solidStore.useStore(formApi.store, selector);
|
23
21
|
formApi.Subscribe = (props) => formCore.functionalUpdate(props.children, solidStore.useStore(formApi.store, props.selector));
|
22
|
+
solidJs.onMount(formApi.mount);
|
24
23
|
solidJs.createComputed(() => formApi.update(opts == null ? void 0 : opts()));
|
25
24
|
return formApi;
|
26
25
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"createForm.cjs","sources":["../../src/createForm.tsx"],"sourcesContent":["import { FormApi, functionalUpdate } from '@tanstack/form-core'\nimport { createComputed, onMount } from 'solid-js'\nimport { useStore } from '@tanstack/solid-store'\nimport {\n type CreateField,\n Field,\n type FieldComponent,\n createField,\n} from './createField'\nimport
|
1
|
+
{"version":3,"file":"createForm.cjs","sources":["../../src/createForm.tsx"],"sourcesContent":["import { FormApi, functionalUpdate } from '@tanstack/form-core'\nimport { type JSXElement, createComputed, onMount } from 'solid-js'\nimport { useStore } from '@tanstack/solid-store'\nimport {\n type CreateField,\n Field,\n type FieldComponent,\n createField,\n} from './createField'\nimport type { FormOptions, FormState, Validator } from '@tanstack/form-core'\n\ntype NoInfer<T> = [T][T extends any ? 0 : never]\n\ndeclare module '@tanstack/form-core' {\n // eslint-disable-next-line no-shadow\n interface FormApi<TFormData, TFormValidator> {\n Field: FieldComponent<TFormData, TFormValidator>\n createField: CreateField<TFormData, TFormValidator>\n useStore: <TSelected = NoInfer<FormState<TFormData>>>(\n selector?: (state: NoInfer<FormState<TFormData>>) => TSelected,\n ) => () => TSelected\n Subscribe: <TSelected = NoInfer<FormState<TFormData>>>(props: {\n selector?: (state: NoInfer<FormState<TFormData>>) => TSelected\n children: ((state: () => NoInfer<TSelected>) => JSXElement) | JSXElement\n }) => JSXElement\n }\n}\n\nexport function createForm<\n TParentData,\n TFormValidator extends\n | Validator<TParentData, unknown>\n | undefined = undefined,\n>(\n opts?: () => FormOptions<TParentData, TFormValidator>,\n): FormApi<TParentData, TFormValidator> {\n const options = opts?.()\n const formApi = new FormApi<TParentData, TFormValidator>(options)\n\n formApi.Field = (props) => <Field {...props} form={formApi} />\n formApi.createField = (props) =>\n createField(() => {\n return { ...props(), form: formApi }\n })\n formApi.useStore = (selector) => useStore(formApi.store, selector)\n formApi.Subscribe = (props) =>\n functionalUpdate(props.children, useStore(formApi.store, props.selector))\n\n onMount(formApi.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(() => formApi.update(opts?.()))\n\n return formApi\n}\n"],"names":["createForm","opts","options","formApi","FormApi","Field","props","_$createComponent","_$mergeProps","form","createField","useStore","selector","store","Subscribe","functionalUpdate","children","onMount","mount","createComputed","update"],"mappings":";;;;;;;AA4BO,SAASA,WAMdC,MACsC;AACtC,QAAMC,UAAUD;AACVE,QAAAA,UAAU,IAAIC,iBAAqCF,OAAO;AAEhEC,UAAQE,QAASC,CAAAA,UAAKC,IAAMF,gBAAAA,YAAAA,OAAKG,eAAKF,OAAK;AAAA,IAAEG,MAAMN;AAAAA,EAAW,CAAA,CAAA;AACtDO,UAAAA,cAAeJ,CACrBI,UAAAA,YAAAA,YAAY,MAAM;AACT,WAAA;AAAA,MAAE,GAAGJ,MAAM;AAAA,MAAGG,MAAMN;AAAAA,IAAAA;AAAAA,EAAQ,CACpC;AACHA,UAAQQ,WAAYC,CAAAA,aAAaD,WAASR,SAAAA,QAAQU,OAAOD,QAAQ;AACzDE,UAAAA,YAAaR,CACnBS,UAAAA,SAAAA,iBAAiBT,MAAMU,UAAUL,oBAASR,QAAQU,OAAOP,MAAMM,QAAQ,CAAC;AAE1EK,kBAAQd,QAAQe,KAAK;AAMrBC,UAAAA,eAAe,MAAMhB,QAAQiB,OAAOnB,8BAAQ,CAAC;AAEtCE,SAAAA;AACT;;"}
|
@@ -1,15 +1,12 @@
|
|
1
1
|
import { FormApi } from '@tanstack/form-core';
|
2
|
+
import { type JSXElement } from 'solid-js';
|
2
3
|
import { type CreateField, type FieldComponent } from './createField.cjs';
|
3
|
-
import type { JSXElement } from 'solid-js';
|
4
4
|
import type { FormOptions, FormState, Validator } from '@tanstack/form-core';
|
5
5
|
type NoInfer<T> = [T][T extends any ? 0 : never];
|
6
6
|
declare module '@tanstack/form-core' {
|
7
7
|
interface FormApi<TFormData, TFormValidator> {
|
8
|
-
Provider: (props: {
|
9
|
-
children: any;
|
10
|
-
}) => JSXElement;
|
11
8
|
Field: FieldComponent<TFormData, TFormValidator>;
|
12
|
-
createField: CreateField<TFormData>;
|
9
|
+
createField: CreateField<TFormData, TFormValidator>;
|
13
10
|
useStore: <TSelected = NoInfer<FormState<TFormData>>>(selector?: (state: NoInfer<FormState<TFormData>>) => TSelected) => () => TSelected;
|
14
11
|
Subscribe: <TSelected = NoInfer<FormState<TFormData>>>(props: {
|
15
12
|
selector?: (state: NoInfer<FormState<TFormData>>) => TSelected;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"createFormFactory.cjs","sources":["../../src/createFormFactory.ts"],"sourcesContent":["import { mergeProps } from 'solid-js'\nimport {\n type CreateField,\n Field,\n type FieldComponent,\n createField,\n} from './createField'\nimport { createForm } from './createForm'\nimport type { FormApi, FormOptions, Validator } from '@tanstack/form-core'\n\nexport type FormFactory<\n TFormData,\n TFormValidator extends Validator<TFormData, unknown> | undefined = undefined,\n> = {\n createForm: (\n opts?: () => FormOptions<TFormData, TFormValidator>,\n ) => FormApi<TFormData, TFormValidator>\n createField:
|
1
|
+
{"version":3,"file":"createFormFactory.cjs","sources":["../../src/createFormFactory.ts"],"sourcesContent":["import { mergeProps } from 'solid-js'\nimport {\n type CreateField,\n Field,\n type FieldComponent,\n createField,\n} from './createField'\nimport { createForm } from './createForm'\nimport type { FormApi, FormOptions, Validator } from '@tanstack/form-core'\n\nexport type FormFactory<\n TFormData,\n TFormValidator extends Validator<TFormData, unknown> | undefined = undefined,\n> = {\n createForm: (\n opts?: () => FormOptions<TFormData, TFormValidator>,\n ) => FormApi<TFormData, TFormValidator>\n createField: typeof createField\n Field: typeof Field\n}\n\nexport function createFormFactory<\n TFormData,\n TFormValidator extends Validator<TFormData, unknown> | undefined = undefined,\n>(\n defaultOpts?: () => FormOptions<TFormData, TFormValidator>,\n): FormFactory<TFormData, TFormValidator> {\n return {\n createForm: (opts) =>\n createForm<TFormData, TFormValidator>(() =>\n mergeProps(defaultOpts?.() ?? {}, opts?.() ?? {}),\n ),\n createField,\n Field: Field,\n }\n}\n"],"names":["createForm","mergeProps","createField","Field"],"mappings":";;;;;AAqBO,SAAS,kBAId,aACwC;AACjC,SAAA;AAAA,IACL,YAAY,CAAC,SACXA,WAAA;AAAA,MAAsC,MACpCC,QAAAA,YAAW,iDAAmB,CAAI,IAAA,mCAAY,CAAA,CAAE;AAAA,IAClD;AAAA,IAAA,aACFC,YAAA;AAAA,IAAA,OACAC,YAAA;AAAA,EAAA;AAEJ;;"}
|
@@ -1,8 +1,8 @@
|
|
1
|
-
import {
|
1
|
+
import { Field, createField } from './createField.cjs';
|
2
2
|
import type { FormApi, FormOptions, Validator } from '@tanstack/form-core';
|
3
3
|
export type FormFactory<TFormData, TFormValidator extends Validator<TFormData, unknown> | undefined = undefined> = {
|
4
4
|
createForm: (opts?: () => FormOptions<TFormData, TFormValidator>) => FormApi<TFormData, TFormValidator>;
|
5
|
-
createField:
|
6
|
-
Field:
|
5
|
+
createField: typeof createField;
|
6
|
+
Field: typeof Field;
|
7
7
|
};
|
8
8
|
export declare function createFormFactory<TFormData, TFormValidator extends Validator<TFormData, unknown> | undefined = undefined>(defaultOpts?: () => FormOptions<TFormData, TFormValidator>): FormFactory<TFormData, TFormValidator>;
|
package/dist/cjs/types.d.cts
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
import type { DeepKeys, DeepValue,
|
2
|
-
export type CreateFieldOptions<TParentData, TName extends DeepKeys<TParentData>, TFieldValidator extends Validator<DeepValue<TParentData, TName>, unknown> | undefined = undefined, TFormValidator extends Validator<TParentData, unknown> | undefined = undefined, TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>> =
|
1
|
+
import type { DeepKeys, DeepValue, FieldApiOptions, Validator } from '@tanstack/form-core';
|
2
|
+
export type CreateFieldOptions<TParentData, TName extends DeepKeys<TParentData>, TFieldValidator extends Validator<DeepValue<TParentData, TName>, unknown> | undefined = undefined, TFormValidator extends Validator<TParentData, unknown> | undefined = undefined, TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>> = FieldApiOptions<TParentData, TName, TFieldValidator, TFormValidator, TData> & {
|
3
3
|
mode?: 'value' | 'array';
|
4
4
|
};
|
@@ -7,20 +7,14 @@ declare module '@tanstack/form-core' {
|
|
7
7
|
Field: FieldComponent<TParentData, TFormValidator>;
|
8
8
|
}
|
9
9
|
}
|
10
|
-
export type CreateField<TParentData> = <TName extends DeepKeys<TParentData>, TFieldValidator extends Validator<DeepValue<TParentData, TName>, unknown> | undefined = undefined
|
10
|
+
export type CreateField<TParentData, TFormValidator extends Validator<TParentData, unknown> | undefined = undefined> = <TName extends DeepKeys<TParentData>, TFieldValidator extends Validator<DeepValue<TParentData, TName>, unknown> | undefined = undefined>(opts: () => {
|
11
11
|
name: Narrow<TName>;
|
12
|
-
} & CreateFieldOptions<TParentData, TName, TFieldValidator, TFormValidator>) => () => FieldApi<TParentData, TName, TFieldValidator, TFormValidator, DeepValue<TParentData, TName>>;
|
12
|
+
} & Omit<CreateFieldOptions<TParentData, TName, TFieldValidator, TFormValidator>, 'form'>) => () => FieldApi<TParentData, TName, TFieldValidator, TFormValidator, DeepValue<TParentData, TName>>;
|
13
13
|
export declare function createField<TParentData, TName extends DeepKeys<TParentData>, TFieldValidator extends Validator<DeepValue<TParentData, TName>, unknown> | undefined = undefined, TFormValidator extends Validator<TParentData, unknown> | undefined = undefined>(opts: () => CreateFieldOptions<TParentData, TName, TFieldValidator, TFormValidator>): () => FieldApi<TParentData, TName, TFieldValidator, TFormValidator>;
|
14
14
|
type FieldComponentProps<TParentData, TName extends DeepKeys<TParentData>, TFieldValidator extends Validator<DeepValue<TParentData, TName>, unknown> | undefined = undefined, TFormValidator extends Validator<TParentData, unknown> | undefined = undefined, TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>> = {
|
15
15
|
children: (fieldApi: () => FieldApi<TParentData, TName, TFieldValidator, TFormValidator, TData>) => JSXElement;
|
16
|
-
} &
|
17
|
-
|
18
|
-
index: number;
|
19
|
-
} : {
|
20
|
-
name: TName;
|
21
|
-
index?: never;
|
22
|
-
}) & Omit<CreateFieldOptions<TParentData, TName, TFieldValidator, TFormValidator>, 'name' | 'index'>;
|
23
|
-
export type FieldComponent<TParentData, TFormValidator extends Validator<TParentData, unknown> | undefined = undefined> = <TName extends DeepKeys<TParentData>, TFieldValidator extends Validator<DeepValue<TParentData, TName>, unknown> | undefined = undefined, TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>>({ children, ...fieldOptions }: FieldComponentProps<TParentData, TName, TFieldValidator, TFormValidator, TData>) => JSXElement;
|
16
|
+
} & Omit<CreateFieldOptions<TParentData, TName, TFieldValidator, TFormValidator>, 'form'>;
|
17
|
+
export type FieldComponent<TParentData, TFormValidator extends Validator<TParentData, unknown> | undefined = undefined> = <TName extends DeepKeys<TParentData>, TFieldValidator extends Validator<DeepValue<TParentData, TName>, unknown> | undefined = undefined, TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>>({ children, ...fieldOptions }: Omit<FieldComponentProps<TParentData, TName, TFieldValidator, TFormValidator, TData>, 'form'>) => JSXElement;
|
24
18
|
export declare function Field<TParentData, TName extends DeepKeys<TParentData>, TFieldValidator extends Validator<DeepValue<TParentData, TName>, unknown> | undefined = undefined, TFormValidator extends Validator<TParentData, unknown> | undefined = undefined>(props: {
|
25
19
|
children: (fieldApi: () => FieldApi<TParentData, TName, TFieldValidator, TFormValidator>) => JSXElement;
|
26
20
|
} & CreateFieldOptions<TParentData, TName, TFieldValidator, TFormValidator>): import("solid-js").JSX.Element;
|
package/dist/esm/createField.js
CHANGED
@@ -1,7 +1,6 @@
|
|
1
|
-
import {
|
1
|
+
import { memo } from "solid-js/web";
|
2
2
|
import { FieldApi } from "@tanstack/form-core";
|
3
|
-
import { createComputed, onMount, onCleanup, createComponent
|
4
|
-
import { useFormContext, formContext } from "./formContext.js";
|
3
|
+
import { createComputed, onMount, onCleanup, createComponent, createSignal, createMemo } from "solid-js";
|
5
4
|
function makeFieldReactive(fieldApi) {
|
6
5
|
const [flag, setFlag] = createSignal(false);
|
7
6
|
const fieldApiMemo = createMemo(() => [flag(), fieldApi]);
|
@@ -10,22 +9,10 @@ function makeFieldReactive(fieldApi) {
|
|
10
9
|
return () => fieldApiMemo()[1];
|
11
10
|
}
|
12
11
|
function createField(opts) {
|
13
|
-
const {
|
14
|
-
formApi,
|
15
|
-
parentFieldName
|
16
|
-
} = useFormContext();
|
17
12
|
const options = opts();
|
18
|
-
const
|
19
|
-
const fieldApi = new FieldApi({
|
20
|
-
...options,
|
21
|
-
form: formApi,
|
22
|
-
name
|
23
|
-
});
|
13
|
+
const fieldApi = new FieldApi(options);
|
24
14
|
fieldApi.Field = Field;
|
25
|
-
createComputed(() => fieldApi.update(
|
26
|
-
...opts(),
|
27
|
-
form: formApi
|
28
|
-
}));
|
15
|
+
createComputed(() => fieldApi.update(opts()));
|
29
16
|
onMount(() => onCleanup(fieldApi.mount()));
|
30
17
|
return makeFieldReactive(fieldApi);
|
31
18
|
}
|
@@ -37,17 +24,7 @@ function Field(props) {
|
|
37
24
|
} = props;
|
38
25
|
return fieldOptions;
|
39
26
|
});
|
40
|
-
return createComponent(
|
41
|
-
get value() {
|
42
|
-
return {
|
43
|
-
formApi: fieldApi().form,
|
44
|
-
parentFieldName: String(fieldApi().name)
|
45
|
-
};
|
46
|
-
},
|
47
|
-
get children() {
|
48
|
-
return createComponent$1(() => props.children(fieldApi), {});
|
49
|
-
}
|
50
|
-
});
|
27
|
+
return memo(() => createComponent(() => props.children(fieldApi), {}));
|
51
28
|
}
|
52
29
|
export {
|
53
30
|
Field,
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"createField.js","sources":["../../src/createField.tsx"],"sourcesContent":["import { FieldApi } from '@tanstack/form-core'\nimport {\n createComponent,\n createComputed,\n createMemo,\n createSignal,\n onCleanup,\n onMount,\n} from 'solid-js'\
|
1
|
+
{"version":3,"file":"createField.js","sources":["../../src/createField.tsx"],"sourcesContent":["import { FieldApi } from '@tanstack/form-core'\nimport {\n createComponent,\n createComputed,\n createMemo,\n createSignal,\n onCleanup,\n onMount,\n} from 'solid-js'\n\nimport type {\n DeepKeys,\n DeepValue,\n Narrow,\n Validator,\n} from '@tanstack/form-core'\nimport type { JSXElement } from 'solid-js'\nimport type { CreateFieldOptions } from './types'\n\ndeclare module '@tanstack/form-core' {\n // eslint-disable-next-line no-shadow\n interface FieldApi<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TFieldValidator extends\n | Validator<DeepValue<TParentData, TName>, unknown>\n | undefined = undefined,\n TFormValidator extends\n | Validator<TParentData, unknown>\n | undefined = undefined,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n > {\n Field: FieldComponent<TParentData, TFormValidator>\n }\n}\n\nexport type CreateField<\n TParentData,\n TFormValidator extends\n | Validator<TParentData, unknown>\n | undefined = undefined,\n> = <\n TName extends DeepKeys<TParentData>,\n TFieldValidator extends\n | Validator<DeepValue<TParentData, TName>, unknown>\n | undefined = undefined,\n>(\n opts: () => { name: Narrow<TName> } & Omit<\n CreateFieldOptions<TParentData, TName, TFieldValidator, TFormValidator>,\n 'form'\n >,\n) => () => FieldApi<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n DeepValue<TParentData, TName>\n>\n\n// ugly way to trick solid into triggering updates for changes on the fieldApi\nfunction makeFieldReactive<FieldApiT extends FieldApi<any, any, any, any>>(\n fieldApi: FieldApiT,\n): () => FieldApiT {\n const [flag, setFlag] = createSignal(false)\n const fieldApiMemo = createMemo(() => [flag(), fieldApi] as const)\n const unsubscribeStore = fieldApi.store.subscribe(() => setFlag((f) => !f))\n onCleanup(unsubscribeStore)\n return () => fieldApiMemo()[1]\n}\n\nexport function createField<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TFieldValidator extends\n | Validator<DeepValue<TParentData, TName>, unknown>\n | undefined = undefined,\n TFormValidator extends\n | Validator<TParentData, unknown>\n | undefined = undefined,\n>(\n opts: () => CreateFieldOptions<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator\n >,\n): () => FieldApi<TParentData, TName, TFieldValidator, TFormValidator> {\n const options = opts()\n\n const fieldApi = new FieldApi(options)\n fieldApi.Field = Field as never\n\n /**\n * fieldApi.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(() => fieldApi.update(opts()))\n\n // Instantiates field meta and removes it when unrendered\n onMount(() => onCleanup(fieldApi.mount()))\n\n return makeFieldReactive(fieldApi) as never\n}\n\ntype FieldComponentProps<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TFieldValidator extends\n | Validator<DeepValue<TParentData, TName>, unknown>\n | undefined = undefined,\n TFormValidator extends\n | Validator<TParentData, unknown>\n | undefined = undefined,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> = {\n children: (\n fieldApi: () => FieldApi<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >,\n ) => JSXElement\n} & Omit<\n CreateFieldOptions<TParentData, TName, TFieldValidator, TFormValidator>,\n 'form'\n>\n\nexport type FieldComponent<\n TParentData,\n TFormValidator extends\n | Validator<TParentData, unknown>\n | undefined = undefined,\n> = <\n TName extends DeepKeys<TParentData>,\n TFieldValidator extends\n | Validator<DeepValue<TParentData, TName>, unknown>\n | undefined = undefined,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n>({\n children,\n ...fieldOptions\n}: Omit<\n FieldComponentProps<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >,\n 'form'\n>) => JSXElement\n\nexport function Field<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TFieldValidator extends\n | Validator<DeepValue<TParentData, TName>, unknown>\n | undefined = undefined,\n TFormValidator extends\n | Validator<TParentData, unknown>\n | undefined = undefined,\n>(\n props: {\n children: (\n fieldApi: () => FieldApi<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator\n >,\n ) => JSXElement\n } & CreateFieldOptions<TParentData, TName, TFieldValidator, TFormValidator>,\n) {\n const fieldApi = createField<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator\n >(() => {\n const { children, ...fieldOptions } = props\n return fieldOptions\n })\n\n return <>{createComponent(() => props.children(fieldApi), {})}</>\n}\n"],"names":["makeFieldReactive","fieldApi","flag","setFlag","createSignal","fieldApiMemo","createMemo","unsubscribeStore","store","subscribe","f","onCleanup","createField","opts","options","FieldApi","Field","createComputed","update","onMount","mount","props","children","fieldOptions","_$memo","createComponent"],"mappings":";;;AA4DA,SAASA,kBACPC,UACiB;AACjB,QAAM,CAACC,MAAMC,OAAO,IAAIC,aAAa,KAAK;AAC1C,QAAMC,eAAeC,WAAW,MAAM,CAACJ,KAAK,GAAGD,QAAQ,CAAW;AAC5DM,QAAAA,mBAAmBN,SAASO,MAAMC,UAAU,MAAMN,QAASO,CAAAA,MAAM,CAACA,CAAC,CAAC;AAC1EC,YAAUJ,gBAAgB;AACnB,SAAA,MAAMF,eAAe,CAAC;AAC/B;AAEO,SAASO,YAUdC,MAMqE;AACrE,QAAMC,UAAUD;AAEVZ,QAAAA,WAAW,IAAIc,SAASD,OAAO;AACrCb,WAASe,QAAQA;AAQjBC,iBAAe,MAAMhB,SAASiB,OAAOL,KAAAA,CAAM,CAAC;AAG5CM,UAAQ,MAAMR,UAAUV,SAASmB,MAAAA,CAAO,CAAC;AAEzC,SAAOpB,kBAAkBC,QAAQ;AACnC;AAoDO,SAASe,MAUdK,OAUA;AACMpB,QAAAA,WAAWW,YAKf,MAAM;AACA,UAAA;AAAA,MAAEU;AAAAA,MAAU,GAAGC;AAAAA,IAAiBF,IAAAA;AAC/BE,WAAAA;AAAAA,EAAAA,CACR;AAEDC,SAAAA,KAAA,MAAUC,gBAAgB,MAAMJ,MAAMC,SAASrB,QAAQ,GAAG,CAAE,CAAA,CAAC;AAC/D;"}
|
package/dist/esm/createForm.d.ts
CHANGED
@@ -1,15 +1,12 @@
|
|
1
1
|
import { FormApi } from '@tanstack/form-core';
|
2
|
+
import { type JSXElement } from 'solid-js';
|
2
3
|
import { type CreateField, type FieldComponent } from './createField.js';
|
3
|
-
import type { JSXElement } from 'solid-js';
|
4
4
|
import type { FormOptions, FormState, Validator } from '@tanstack/form-core';
|
5
5
|
type NoInfer<T> = [T][T extends any ? 0 : never];
|
6
6
|
declare module '@tanstack/form-core' {
|
7
7
|
interface FormApi<TFormData, TFormValidator> {
|
8
|
-
Provider: (props: {
|
9
|
-
children: any;
|
10
|
-
}) => JSXElement;
|
11
8
|
Field: FieldComponent<TFormData, TFormValidator>;
|
12
|
-
createField: CreateField<TFormData>;
|
9
|
+
createField: CreateField<TFormData, TFormValidator>;
|
13
10
|
useStore: <TSelected = NoInfer<FormState<TFormData>>>(selector?: (state: NoInfer<FormState<TFormData>>) => TSelected) => () => TSelected;
|
14
11
|
Subscribe: <TSelected = NoInfer<FormState<TFormData>>>(props: {
|
15
12
|
selector?: (state: NoInfer<FormState<TFormData>>) => TSelected;
|
package/dist/esm/createForm.js
CHANGED
@@ -3,22 +3,21 @@ import { FormApi, functionalUpdate } from "@tanstack/form-core";
|
|
3
3
|
import { onMount, createComputed } from "solid-js";
|
4
4
|
import { useStore } from "@tanstack/solid-store";
|
5
5
|
import { Field, createField } from "./createField.js";
|
6
|
-
import { formContext } from "./formContext.js";
|
7
6
|
function createForm(opts) {
|
8
7
|
const options = opts == null ? void 0 : opts();
|
9
8
|
const formApi = new FormApi(options);
|
10
|
-
formApi.
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
formApi.createField = createField;
|
9
|
+
formApi.Field = (props) => createComponent(Field, mergeProps(props, {
|
10
|
+
form: formApi
|
11
|
+
}));
|
12
|
+
formApi.createField = (props) => createField(() => {
|
13
|
+
return {
|
14
|
+
...props(),
|
15
|
+
form: formApi
|
16
|
+
};
|
17
|
+
});
|
20
18
|
formApi.useStore = (selector) => useStore(formApi.store, selector);
|
21
19
|
formApi.Subscribe = (props) => functionalUpdate(props.children, useStore(formApi.store, props.selector));
|
20
|
+
onMount(formApi.mount);
|
22
21
|
createComputed(() => formApi.update(opts == null ? void 0 : opts()));
|
23
22
|
return formApi;
|
24
23
|
}
|
@@ -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 { useStore } from '@tanstack/solid-store'\nimport {\n type CreateField,\n Field,\n type FieldComponent,\n createField,\n} from './createField'\nimport
|
1
|
+
{"version":3,"file":"createForm.js","sources":["../../src/createForm.tsx"],"sourcesContent":["import { FormApi, functionalUpdate } from '@tanstack/form-core'\nimport { type JSXElement, createComputed, onMount } from 'solid-js'\nimport { useStore } from '@tanstack/solid-store'\nimport {\n type CreateField,\n Field,\n type FieldComponent,\n createField,\n} from './createField'\nimport type { FormOptions, FormState, Validator } from '@tanstack/form-core'\n\ntype NoInfer<T> = [T][T extends any ? 0 : never]\n\ndeclare module '@tanstack/form-core' {\n // eslint-disable-next-line no-shadow\n interface FormApi<TFormData, TFormValidator> {\n Field: FieldComponent<TFormData, TFormValidator>\n createField: CreateField<TFormData, TFormValidator>\n useStore: <TSelected = NoInfer<FormState<TFormData>>>(\n selector?: (state: NoInfer<FormState<TFormData>>) => TSelected,\n ) => () => TSelected\n Subscribe: <TSelected = NoInfer<FormState<TFormData>>>(props: {\n selector?: (state: NoInfer<FormState<TFormData>>) => TSelected\n children: ((state: () => NoInfer<TSelected>) => JSXElement) | JSXElement\n }) => JSXElement\n }\n}\n\nexport function createForm<\n TParentData,\n TFormValidator extends\n | Validator<TParentData, unknown>\n | undefined = undefined,\n>(\n opts?: () => FormOptions<TParentData, TFormValidator>,\n): FormApi<TParentData, TFormValidator> {\n const options = opts?.()\n const formApi = new FormApi<TParentData, TFormValidator>(options)\n\n formApi.Field = (props) => <Field {...props} form={formApi} />\n formApi.createField = (props) =>\n createField(() => {\n return { ...props(), form: formApi }\n })\n formApi.useStore = (selector) => useStore(formApi.store, selector)\n formApi.Subscribe = (props) =>\n functionalUpdate(props.children, useStore(formApi.store, props.selector))\n\n onMount(formApi.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(() => formApi.update(opts?.()))\n\n return formApi\n}\n"],"names":["createForm","opts","options","formApi","FormApi","Field","props","_$createComponent","_$mergeProps","form","createField","useStore","selector","store","Subscribe","functionalUpdate","children","onMount","mount","createComputed","update"],"mappings":";;;;;AA4BO,SAASA,WAMdC,MACsC;AACtC,QAAMC,UAAUD;AACVE,QAAAA,UAAU,IAAIC,QAAqCF,OAAO;AAEhEC,UAAQE,QAASC,CAAAA,UAAKC,gBAAMF,OAAKG,WAAKF,OAAK;AAAA,IAAEG,MAAMN;AAAAA,EAAW,CAAA,CAAA;AACtDO,UAAAA,cAAeJ,CACrBI,UAAAA,YAAY,MAAM;AACT,WAAA;AAAA,MAAE,GAAGJ,MAAM;AAAA,MAAGG,MAAMN;AAAAA,IAAAA;AAAAA,EAAQ,CACpC;AACHA,UAAQQ,WAAYC,CAAAA,aAAaD,SAASR,QAAQU,OAAOD,QAAQ;AACzDE,UAAAA,YAAaR,CACnBS,UAAAA,iBAAiBT,MAAMU,UAAUL,SAASR,QAAQU,OAAOP,MAAMM,QAAQ,CAAC;AAE1EK,UAAQd,QAAQe,KAAK;AAMrBC,iBAAe,MAAMhB,QAAQiB,OAAOnB,8BAAQ,CAAC;AAEtCE,SAAAA;AACT;"}
|
@@ -1,8 +1,8 @@
|
|
1
|
-
import {
|
1
|
+
import { Field, createField } from './createField.js';
|
2
2
|
import type { FormApi, FormOptions, Validator } from '@tanstack/form-core';
|
3
3
|
export type FormFactory<TFormData, TFormValidator extends Validator<TFormData, unknown> | undefined = undefined> = {
|
4
4
|
createForm: (opts?: () => FormOptions<TFormData, TFormValidator>) => FormApi<TFormData, TFormValidator>;
|
5
|
-
createField:
|
6
|
-
Field:
|
5
|
+
createField: typeof createField;
|
6
|
+
Field: typeof Field;
|
7
7
|
};
|
8
8
|
export declare function createFormFactory<TFormData, TFormValidator extends Validator<TFormData, unknown> | undefined = undefined>(defaultOpts?: () => FormOptions<TFormData, TFormValidator>): FormFactory<TFormData, TFormValidator>;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"createFormFactory.js","sources":["../../src/createFormFactory.ts"],"sourcesContent":["import { mergeProps } from 'solid-js'\nimport {\n type CreateField,\n Field,\n type FieldComponent,\n createField,\n} from './createField'\nimport { createForm } from './createForm'\nimport type { FormApi, FormOptions, Validator } from '@tanstack/form-core'\n\nexport type FormFactory<\n TFormData,\n TFormValidator extends Validator<TFormData, unknown> | undefined = undefined,\n> = {\n createForm: (\n opts?: () => FormOptions<TFormData, TFormValidator>,\n ) => FormApi<TFormData, TFormValidator>\n createField:
|
1
|
+
{"version":3,"file":"createFormFactory.js","sources":["../../src/createFormFactory.ts"],"sourcesContent":["import { mergeProps } from 'solid-js'\nimport {\n type CreateField,\n Field,\n type FieldComponent,\n createField,\n} from './createField'\nimport { createForm } from './createForm'\nimport type { FormApi, FormOptions, Validator } from '@tanstack/form-core'\n\nexport type FormFactory<\n TFormData,\n TFormValidator extends Validator<TFormData, unknown> | undefined = undefined,\n> = {\n createForm: (\n opts?: () => FormOptions<TFormData, TFormValidator>,\n ) => FormApi<TFormData, TFormValidator>\n createField: typeof createField\n Field: typeof Field\n}\n\nexport function createFormFactory<\n TFormData,\n TFormValidator extends Validator<TFormData, unknown> | undefined = undefined,\n>(\n defaultOpts?: () => FormOptions<TFormData, TFormValidator>,\n): FormFactory<TFormData, TFormValidator> {\n return {\n createForm: (opts) =>\n createForm<TFormData, TFormValidator>(() =>\n mergeProps(defaultOpts?.() ?? {}, opts?.() ?? {}),\n ),\n createField,\n Field: Field,\n }\n}\n"],"names":[],"mappings":";;;AAqBO,SAAS,kBAId,aACwC;AACjC,SAAA;AAAA,IACL,YAAY,CAAC,SACX;AAAA,MAAsC,MACpC,YAAW,iDAAmB,CAAI,IAAA,mCAAY,CAAA,CAAE;AAAA,IAClD;AAAA,IACF;AAAA,IACA;AAAA,EAAA;AAEJ;"}
|
package/dist/esm/types.d.ts
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
import type { DeepKeys, DeepValue,
|
2
|
-
export type CreateFieldOptions<TParentData, TName extends DeepKeys<TParentData>, TFieldValidator extends Validator<DeepValue<TParentData, TName>, unknown> | undefined = undefined, TFormValidator extends Validator<TParentData, unknown> | undefined = undefined, TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>> =
|
1
|
+
import type { DeepKeys, DeepValue, FieldApiOptions, Validator } from '@tanstack/form-core';
|
2
|
+
export type CreateFieldOptions<TParentData, TName extends DeepKeys<TParentData>, TFieldValidator extends Validator<DeepValue<TParentData, TName>, unknown> | undefined = undefined, TFormValidator extends Validator<TParentData, unknown> | undefined = undefined, TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>> = FieldApiOptions<TParentData, TName, TFieldValidator, TFormValidator, TData> & {
|
3
3
|
mode?: 'value' | 'array';
|
4
4
|
};
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@tanstack/solid-form",
|
3
|
-
"version": "0.
|
3
|
+
"version": "0.16.0",
|
4
4
|
"description": "Powerful, type-safe forms for Solid.",
|
5
5
|
"author": "tannerlinsley",
|
6
6
|
"license": "MIT",
|
@@ -34,11 +34,11 @@
|
|
34
34
|
},
|
35
35
|
"devDependencies": {
|
36
36
|
"solid-js": "^1.7.8",
|
37
|
-
"vite-plugin-solid": "^2.
|
37
|
+
"vite-plugin-solid": "^2.10.1"
|
38
38
|
},
|
39
39
|
"dependencies": {
|
40
40
|
"@tanstack/solid-store": "^0.3.1",
|
41
|
-
"@tanstack/form-core": "0.
|
41
|
+
"@tanstack/form-core": "0.16.0"
|
42
42
|
},
|
43
43
|
"peerDependencies": {
|
44
44
|
"solid-js": "^1.6.0"
|
package/src/createField.tsx
CHANGED
@@ -7,7 +7,6 @@ import {
|
|
7
7
|
onCleanup,
|
8
8
|
onMount,
|
9
9
|
} from 'solid-js'
|
10
|
-
import { formContext, useFormContext } from './formContext'
|
11
10
|
|
12
11
|
import type {
|
13
12
|
DeepKeys,
|
@@ -35,20 +34,20 @@ declare module '@tanstack/form-core' {
|
|
35
34
|
}
|
36
35
|
}
|
37
36
|
|
38
|
-
export type CreateField<
|
37
|
+
export type CreateField<
|
38
|
+
TParentData,
|
39
|
+
TFormValidator extends
|
40
|
+
| Validator<TParentData, unknown>
|
41
|
+
| undefined = undefined,
|
42
|
+
> = <
|
39
43
|
TName extends DeepKeys<TParentData>,
|
40
44
|
TFieldValidator extends
|
41
45
|
| Validator<DeepValue<TParentData, TName>, unknown>
|
42
46
|
| undefined = undefined,
|
43
|
-
TFormValidator extends
|
44
|
-
| Validator<TParentData, unknown>
|
45
|
-
| undefined = undefined,
|
46
47
|
>(
|
47
|
-
opts: () => { name: Narrow<TName> } &
|
48
|
-
TParentData,
|
49
|
-
|
50
|
-
TFieldValidator,
|
51
|
-
TFormValidator
|
48
|
+
opts: () => { name: Narrow<TName> } & Omit<
|
49
|
+
CreateFieldOptions<TParentData, TName, TFieldValidator, TFormValidator>,
|
50
|
+
'form'
|
52
51
|
>,
|
53
52
|
) => () => FieldApi<
|
54
53
|
TParentData,
|
@@ -86,23 +85,9 @@ export function createField<
|
|
86
85
|
TFormValidator
|
87
86
|
>,
|
88
87
|
): () => FieldApi<TParentData, TName, TFieldValidator, TFormValidator> {
|
89
|
-
// Get the form API either manually or from context
|
90
|
-
const { formApi, parentFieldName } = useFormContext()
|
91
|
-
|
92
88
|
const options = opts()
|
93
|
-
const name = (
|
94
|
-
typeof options.index === 'number'
|
95
|
-
? [parentFieldName, options.index, options.name]
|
96
|
-
: [parentFieldName, options.name]
|
97
|
-
)
|
98
|
-
.filter((d) => d !== undefined)
|
99
|
-
.join('.')
|
100
89
|
|
101
|
-
const fieldApi = new FieldApi(
|
102
|
-
...options,
|
103
|
-
form: formApi,
|
104
|
-
name: name as typeof options.name as never,
|
105
|
-
})
|
90
|
+
const fieldApi = new FieldApi(options)
|
106
91
|
fieldApi.Field = Field as never
|
107
92
|
|
108
93
|
/**
|
@@ -111,7 +96,7 @@ export function createField<
|
|
111
96
|
*
|
112
97
|
* createComputed to make sure this effect runs before render effects
|
113
98
|
*/
|
114
|
-
createComputed(() => fieldApi.update(
|
99
|
+
createComputed(() => fieldApi.update(opts()))
|
115
100
|
|
116
101
|
// Instantiates field meta and removes it when unrendered
|
117
102
|
onMount(() => onCleanup(fieldApi.mount()))
|
@@ -139,19 +124,10 @@ type FieldComponentProps<
|
|
139
124
|
TData
|
140
125
|
>,
|
141
126
|
) => JSXElement
|
142
|
-
} &
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
}
|
147
|
-
: {
|
148
|
-
name: TName
|
149
|
-
index?: never
|
150
|
-
}) &
|
151
|
-
Omit<
|
152
|
-
CreateFieldOptions<TParentData, TName, TFieldValidator, TFormValidator>,
|
153
|
-
'name' | 'index'
|
154
|
-
>
|
127
|
+
} & Omit<
|
128
|
+
CreateFieldOptions<TParentData, TName, TFieldValidator, TFormValidator>,
|
129
|
+
'form'
|
130
|
+
>
|
155
131
|
|
156
132
|
export type FieldComponent<
|
157
133
|
TParentData,
|
@@ -167,12 +143,15 @@ export type FieldComponent<
|
|
167
143
|
>({
|
168
144
|
children,
|
169
145
|
...fieldOptions
|
170
|
-
}:
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
146
|
+
}: Omit<
|
147
|
+
FieldComponentProps<
|
148
|
+
TParentData,
|
149
|
+
TName,
|
150
|
+
TFieldValidator,
|
151
|
+
TFormValidator,
|
152
|
+
TData
|
153
|
+
>,
|
154
|
+
'form'
|
176
155
|
>) => JSXElement
|
177
156
|
|
178
157
|
export function Field<
|
@@ -206,15 +185,5 @@ export function Field<
|
|
206
185
|
return fieldOptions
|
207
186
|
})
|
208
187
|
|
209
|
-
return (
|
210
|
-
<formContext.Provider
|
211
|
-
value={{
|
212
|
-
formApi: fieldApi().form as never,
|
213
|
-
parentFieldName: String(fieldApi().name),
|
214
|
-
}}
|
215
|
-
>
|
216
|
-
{/* createComponent to make sure the signals in the children component are not tracked */}
|
217
|
-
{createComponent(() => props.children(fieldApi), {})}
|
218
|
-
</formContext.Provider>
|
219
|
-
)
|
188
|
+
return <>{createComponent(() => props.children(fieldApi), {})}</>
|
220
189
|
}
|