@tanstack/solid-form 0.13.6 → 0.14.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.
@@ -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 name = (typeof options.index === "number" ? [parentFieldName, options.index, options.name] : [parentFieldName, options.name]).filter((d) => d !== void 0).join(".");
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(formContext.formContext.Provider, {
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'\nimport { formContext, useFormContext } from './formContext'\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<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: () => { name: Narrow<TName> } & CreateFieldOptions<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator\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 // Get the form API either manually or from context\n const { formApi, parentFieldName } = useFormContext()\n\n const options = opts()\n const name = (\n typeof options.index === 'number'\n ? [parentFieldName, options.index, options.name]\n : [parentFieldName, options.name]\n )\n .filter((d) => d !== undefined)\n .join('.')\n\n const fieldApi = new FieldApi({\n ...options,\n form: formApi,\n name: name as typeof options.name as never,\n })\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(), form: formApi } as never))\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} & (TParentData extends any[]\n ? {\n name?: TName\n index: number\n }\n : {\n name: TName\n index?: never\n }) &\n Omit<\n CreateFieldOptions<TParentData, TName, TFieldValidator, TFormValidator>,\n 'name' | 'index'\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}: FieldComponentProps<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\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 (\n <formContext.Provider\n value={{\n formApi: fieldApi().form as never,\n parentFieldName: String(fieldApi().name),\n }}\n >\n {/* createComponent to make sure the signals in the children component are not tracked */}\n {createComponent(() => props.children(fieldApi), {})}\n </formContext.Provider>\n )\n}\n"],"names":["makeFieldReactive","fieldApi","flag","setFlag","createSignal","fieldApiMemo","createMemo","unsubscribeStore","store","subscribe","f","onCleanup","createField","opts","formApi","parentFieldName","useFormContext","options","name","index","filter","d","undefined","join","FieldApi","form","Field","createComputed","update","onMount","mount","props","children","fieldOptions","_$createComponent","formContext","Provider","value","String","createComponent"],"mappings":";;;;;;AA6DA,SAASA,kBACPC,UACiB;AACjB,QAAM,CAACC,MAAMC,OAAO,IAAIC,QAAY,aAAC,KAAK;AAC1C,QAAMC,eAAeC,QAAAA,WAAW,MAAM,CAACJ,KAAM,GAAED,QAAQ,CAAU;AACjE,QAAMM,mBAAmBN,SAASO,MAAMC,UAAU,MAAMN,QAASO,OAAM,CAACA,CAAC,CAAC;AAC1EC,UAAS,UAACJ,gBAAgB;AAC1B,SAAO,MAAMF,eAAe,CAAC;AAC/B;AAEO,SAASO,YAUdC,MAMqE;AAErE,QAAM;AAAA,IAAEC;AAAAA,IAASC;AAAAA,EAAiB,IAAGC,YAAc,eAAA;AAEnD,QAAMC,UAAUJ;AAChB,QAAMK,QACJ,OAAOD,QAAQE,UAAU,WACrB,CAACJ,iBAAiBE,QAAQE,OAAOF,QAAQC,IAAI,IAC7C,CAACH,iBAAiBE,QAAQC,IAAI,GAEjCE,OAAQC,OAAMA,MAAMC,MAAS,EAC7BC,KAAK,GAAG;AAEX,QAAMtB,WAAW,IAAIuB,kBAAS;AAAA,IAC5B,GAAGP;AAAAA,IACHQ,MAAMX;AAAAA,IACNI;AAAAA,EACF,CAAC;AACDjB,WAASyB,QAAQA;AAQjBC,yBAAe,MAAM1B,SAAS2B,OAAO;AAAA,IAAE,GAAGf,KAAM;AAAA,IAAEY,MAAMX;AAAAA,EAAkB,CAAA,CAAC;AAG3Ee,UAAAA,QAAQ,MAAMlB,QAAS,UAACV,SAAS6B,MAAK,CAAE,CAAC;AAEzC,SAAO9B,kBAAkBC,QAAQ;AACnC;AA0DO,SAASyB,MAUdK,OAUA;AACA,QAAM9B,WAAWW,YAKf,MAAM;AACN,UAAM;AAAA,MAAEoB;AAAAA,MAAU,GAAGC;AAAAA,IAAc,IAAGF;AACtC,WAAOE;AAAAA,EACT,CAAC;AAED,SAAAC,IAAA,gBACGC,YAAW,YAACC,UAAQ;AAAA,IAAA,IACnBC,QAAK;AAAA,aAAE;AAAA,QACLvB,SAASb,SAAQ,EAAGwB;AAAAA,QACpBV,iBAAiBuB,OAAOrC,SAAU,EAACiB,IAAI;AAAA;IACxC;AAAA,IAAA,IAAAc,WAAA;AAAA,aAGAO,QAAAA,gBAAgB,MAAMR,MAAMC,SAAS/B,QAAQ,GAAG,CAAA,CAAE;AAAA,IAAC;AAAA,EAAA,CAAA;AAG1D;;;"}
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, TFormValidator extends Validator<TParentData, unknown> | undefined = undefined>(opts: () => {
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
- } & (TParentData extends any[] ? {
17
- name?: TName;
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;
@@ -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.Provider = function Provider(props) {
13
- solidJs.onMount(formApi.mount);
14
- return web.createComponent(formContext.formContext.Provider, web.mergeProps(props, {
15
- value: {
16
- formApi
17
- }
18
- }));
19
- };
20
- formApi.Field = createField.Field;
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 { formContext } from './formContext'\nimport type { JSXElement } from 'solid-js'\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 Provider: (props: { children: any }) => JSXElement\n Field: FieldComponent<TFormData, TFormValidator>\n createField: CreateField<TFormData>\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.Provider = function Provider(props) {\n onMount(formApi.mount)\n return (\n <formContext.Provider {...props} value={{ formApi: formApi as never }} />\n )\n }\n formApi.Field = Field as any\n formApi.createField = createField as CreateField<TParentData>\n formApi.useStore = (selector) => useStore(formApi.store, selector)\n formApi.Subscribe = (props) =>\n functionalUpdate(props.children, useStore(formApi.store, props.selector))\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","Provider","props","onMount","mount","_$createComponent","formContext","_$mergeProps","value","Field","createField","useStore","selector","store","Subscribe","functionalUpdate","children","createComputed","update"],"mappings":";;;;;;;;AA+BO,SAASA,WAMdC,MACsC;AACtC,QAAMC,UAAUD;AAChB,QAAME,UAAU,IAAIC,iBAAqCF,OAAO;AAEhEC,UAAQE,WAAW,SAASA,SAASC,OAAO;AAC1CC,oBAAQJ,QAAQK,KAAK;AACrB,WAAAC,IAAA,gBACGC,YAAW,YAACL,UAAQM,IAAAA,WAAKL,OAAK;AAAA,MAAEM,OAAO;AAAA,QAAET;AAAAA,MAA0B;AAAA,IAAC,CAAA,CAAA;AAAA;AAGzEA,UAAQU,QAAQA;AAChBV,UAAQW,cAAcA;AACtBX,UAAQY,WAAYC,cAAaD,WAAAA,SAASZ,QAAQc,OAAOD,QAAQ;AACjEb,UAAQe,YAAaZ,WACnBa,SAAAA,iBAAiBb,MAAMc,UAAUL,WAAQ,SAACZ,QAAQc,OAAOX,MAAMU,QAAQ,CAAC;AAM1EK,UAAAA,eAAe,MAAMlB,QAAQmB,OAAOrB,8BAAQ,CAAC;AAE7C,SAAOE;AACT;;"}
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: CreateField<TFormData>\n Field: FieldComponent<TFormData, TFormValidator>\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 as never,\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
+ {"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 { type CreateField, type FieldComponent } from './createField.cjs';
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: CreateField<TFormData>;
6
- Field: FieldComponent<TFormData, TFormValidator>;
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,4 +1,4 @@
1
- import type { DeepKeys, DeepValue, FieldOptions, 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>> = FieldOptions<TParentData, TName, TFieldValidator, TFormValidator, TData> & {
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, TFormValidator extends Validator<TParentData, unknown> | undefined = undefined>(opts: () => {
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
- } & (TParentData extends any[] ? {
17
- name?: TName;
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;
@@ -1,7 +1,6 @@
1
- import { createComponent } from "solid-js/web";
1
+ import { memo } from "solid-js/web";
2
2
  import { FieldApi } from "@tanstack/form-core";
3
- import { createComputed, onMount, onCleanup, createComponent as createComponent$1, createSignal, createMemo } from "solid-js";
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 name = (typeof options.index === "number" ? [parentFieldName, options.index, options.name] : [parentFieldName, options.name]).filter((d) => d !== void 0).join(".");
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(formContext.Provider, {
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'\nimport { formContext, useFormContext } from './formContext'\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<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: () => { name: Narrow<TName> } & CreateFieldOptions<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator\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 // Get the form API either manually or from context\n const { formApi, parentFieldName } = useFormContext()\n\n const options = opts()\n const name = (\n typeof options.index === 'number'\n ? [parentFieldName, options.index, options.name]\n : [parentFieldName, options.name]\n )\n .filter((d) => d !== undefined)\n .join('.')\n\n const fieldApi = new FieldApi({\n ...options,\n form: formApi,\n name: name as typeof options.name as never,\n })\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(), form: formApi } as never))\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} & (TParentData extends any[]\n ? {\n name?: TName\n index: number\n }\n : {\n name: TName\n index?: never\n }) &\n Omit<\n CreateFieldOptions<TParentData, TName, TFieldValidator, TFormValidator>,\n 'name' | 'index'\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}: FieldComponentProps<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\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 (\n <formContext.Provider\n value={{\n formApi: fieldApi().form as never,\n parentFieldName: String(fieldApi().name),\n }}\n >\n {/* createComponent to make sure the signals in the children component are not tracked */}\n {createComponent(() => props.children(fieldApi), {})}\n </formContext.Provider>\n )\n}\n"],"names":["makeFieldReactive","fieldApi","flag","setFlag","createSignal","fieldApiMemo","createMemo","unsubscribeStore","store","subscribe","f","onCleanup","createField","opts","formApi","parentFieldName","useFormContext","options","name","index","filter","d","undefined","join","FieldApi","form","Field","createComputed","update","onMount","mount","props","children","fieldOptions","_$createComponent","formContext","Provider","value","String","createComponent"],"mappings":";;;;AA6DA,SAASA,kBACPC,UACiB;AACjB,QAAM,CAACC,MAAMC,OAAO,IAAIC,aAAa,KAAK;AAC1C,QAAMC,eAAeC,WAAW,MAAM,CAACJ,KAAM,GAAED,QAAQ,CAAU;AACjE,QAAMM,mBAAmBN,SAASO,MAAMC,UAAU,MAAMN,QAASO,OAAM,CAACA,CAAC,CAAC;AAC1EC,YAAUJ,gBAAgB;AAC1B,SAAO,MAAMF,eAAe,CAAC;AAC/B;AAEO,SAASO,YAUdC,MAMqE;AAErE,QAAM;AAAA,IAAEC;AAAAA,IAASC;AAAAA,EAAiB,IAAGC,eAAc;AAEnD,QAAMC,UAAUJ;AAChB,QAAMK,QACJ,OAAOD,QAAQE,UAAU,WACrB,CAACJ,iBAAiBE,QAAQE,OAAOF,QAAQC,IAAI,IAC7C,CAACH,iBAAiBE,QAAQC,IAAI,GAEjCE,OAAQC,OAAMA,MAAMC,MAAS,EAC7BC,KAAK,GAAG;AAEX,QAAMtB,WAAW,IAAIuB,SAAS;AAAA,IAC5B,GAAGP;AAAAA,IACHQ,MAAMX;AAAAA,IACNI;AAAAA,EACF,CAAC;AACDjB,WAASyB,QAAQA;AAQjBC,iBAAe,MAAM1B,SAAS2B,OAAO;AAAA,IAAE,GAAGf,KAAM;AAAA,IAAEY,MAAMX;AAAAA,EAAkB,CAAA,CAAC;AAG3Ee,UAAQ,MAAMlB,UAAUV,SAAS6B,MAAK,CAAE,CAAC;AAEzC,SAAO9B,kBAAkBC,QAAQ;AACnC;AA0DO,SAASyB,MAUdK,OAUA;AACA,QAAM9B,WAAWW,YAKf,MAAM;AACN,UAAM;AAAA,MAAEoB;AAAAA,MAAU,GAAGC;AAAAA,IAAc,IAAGF;AACtC,WAAOE;AAAAA,EACT,CAAC;AAED,SAAAC,gBACGC,YAAYC,UAAQ;AAAA,IAAA,IACnBC,QAAK;AAAA,aAAE;AAAA,QACLvB,SAASb,SAAQ,EAAGwB;AAAAA,QACpBV,iBAAiBuB,OAAOrC,SAAU,EAACiB,IAAI;AAAA;IACxC;AAAA,IAAA,IAAAc,WAAA;AAAA,aAGAO,kBAAgB,MAAMR,MAAMC,SAAS/B,QAAQ,GAAG,CAAA,CAAE;AAAA,IAAC;AAAA,EAAA,CAAA;AAG1D;"}
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;"}
@@ -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;
@@ -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.Provider = function Provider(props) {
11
- onMount(formApi.mount);
12
- return createComponent(formContext.Provider, mergeProps(props, {
13
- value: {
14
- formApi
15
- }
16
- }));
17
- };
18
- formApi.Field = Field;
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 { formContext } from './formContext'\nimport type { JSXElement } from 'solid-js'\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 Provider: (props: { children: any }) => JSXElement\n Field: FieldComponent<TFormData, TFormValidator>\n createField: CreateField<TFormData>\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.Provider = function Provider(props) {\n onMount(formApi.mount)\n return (\n <formContext.Provider {...props} value={{ formApi: formApi as never }} />\n )\n }\n formApi.Field = Field as any\n formApi.createField = createField as CreateField<TParentData>\n formApi.useStore = (selector) => useStore(formApi.store, selector)\n formApi.Subscribe = (props) =>\n functionalUpdate(props.children, useStore(formApi.store, props.selector))\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","Provider","props","onMount","mount","_$createComponent","formContext","_$mergeProps","value","Field","createField","useStore","selector","store","Subscribe","functionalUpdate","children","createComputed","update"],"mappings":";;;;;;AA+BO,SAASA,WAMdC,MACsC;AACtC,QAAMC,UAAUD;AAChB,QAAME,UAAU,IAAIC,QAAqCF,OAAO;AAEhEC,UAAQE,WAAW,SAASA,SAASC,OAAO;AAC1CC,YAAQJ,QAAQK,KAAK;AACrB,WAAAC,gBACGC,YAAYL,UAAQM,WAAKL,OAAK;AAAA,MAAEM,OAAO;AAAA,QAAET;AAAAA,MAA0B;AAAA,IAAC,CAAA,CAAA;AAAA;AAGzEA,UAAQU,QAAQA;AAChBV,UAAQW,cAAcA;AACtBX,UAAQY,WAAYC,cAAaD,SAASZ,QAAQc,OAAOD,QAAQ;AACjEb,UAAQe,YAAaZ,WACnBa,iBAAiBb,MAAMc,UAAUL,SAASZ,QAAQc,OAAOX,MAAMU,QAAQ,CAAC;AAM1EK,iBAAe,MAAMlB,QAAQmB,OAAOrB,8BAAQ,CAAC;AAE7C,SAAOE;AACT;"}
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 { type CreateField, type FieldComponent } from './createField.js';
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: CreateField<TFormData>;
6
- Field: FieldComponent<TFormData, TFormValidator>;
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: CreateField<TFormData>\n Field: FieldComponent<TFormData, TFormValidator>\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 as never,\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;"}
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;"}
@@ -1,4 +1,4 @@
1
- import type { DeepKeys, DeepValue, FieldOptions, 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>> = FieldOptions<TParentData, TName, TFieldValidator, TFormValidator, TData> & {
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.13.6",
3
+ "version": "0.14.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.8.0"
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.13.6"
41
+ "@tanstack/form-core": "0.14.0"
42
42
  },
43
43
  "peerDependencies": {
44
44
  "solid-js": "^1.6.0"
@@ -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<TParentData> = <
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> } & CreateFieldOptions<
48
- TParentData,
49
- TName,
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({ ...opts(), form: formApi } as never))
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
- } & (TParentData extends any[]
143
- ? {
144
- name?: TName
145
- index: number
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
- }: FieldComponentProps<
171
- TParentData,
172
- TName,
173
- TFieldValidator,
174
- TFormValidator,
175
- TData
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
  }