@tanstack/solid-form 0.24.0 → 0.24.3

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.
@@ -2,15 +2,13 @@ import { FieldApi } from '@tanstack/form-core';
2
2
  import type { DeepKeys, DeepValue, Narrow, Validator } from '@tanstack/form-core';
3
3
  import type { JSXElement } from 'solid-js';
4
4
  import type { CreateFieldOptions } from './types';
5
- declare module '@tanstack/form-core' {
6
- interface FieldApi<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>> {
7
- Field: FieldComponent<TParentData, TFormValidator>;
8
- }
5
+ interface SolidFieldApi<TParentData, TFormValidator extends Validator<TParentData, unknown> | undefined = undefined> {
6
+ Field: FieldComponent<TParentData, TFormValidator>;
9
7
  }
10
8
  export type CreateField<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>>(opts: () => {
11
9
  name: Narrow<TName>;
12
- } & Omit<CreateFieldOptions<TParentData, TName, TFieldValidator, TFormValidator, TData>, 'form'>) => () => FieldApi<TParentData, TName, TFieldValidator, TFormValidator, TData>;
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, TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>>(opts: () => CreateFieldOptions<TParentData, TName, TFieldValidator, TFormValidator, TData>): () => FieldApi<TParentData, TName, TFieldValidator, TFormValidator, TData>;
10
+ } & Omit<CreateFieldOptions<TParentData, TName, TFieldValidator, TFormValidator, TData>, 'form'>) => () => FieldApi<TParentData, TName, TFieldValidator, TFormValidator, TData> & SolidFieldApi<TParentData, TFormValidator>;
11
+ 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, TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>>(opts: () => CreateFieldOptions<TParentData, TName, TFieldValidator, TFormValidator, TData>): () => never;
14
12
  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
13
  children: (fieldApi: () => FieldApi<TParentData, TName, TFieldValidator, TFormValidator, TData>) => JSXElement;
16
14
  } & Omit<CreateFieldOptions<TParentData, TName, TFieldValidator, TFormValidator, TData>, 'form'>;
@@ -10,18 +10,19 @@ function makeFieldReactive(fieldApi) {
10
10
  }
11
11
  export function createField(opts) {
12
12
  const options = opts();
13
- const fieldApi = new FieldApi(options);
14
- fieldApi.Field = Field;
13
+ const api = new FieldApi(options);
14
+ const extendedApi = api;
15
+ extendedApi.Field = Field;
15
16
  /**
16
17
  * fieldApi.update should not have any side effects. Think of it like a `useRef`
17
18
  * that we need to keep updated every render with the most up-to-date information.
18
19
  *
19
20
  * createComputed to make sure this effect runs before render effects
20
21
  */
21
- createComputed(() => fieldApi.update(opts()));
22
+ createComputed(() => api.update(opts()));
22
23
  // Instantiates field meta and removes it when unrendered
23
- onMount(() => onCleanup(fieldApi.mount()));
24
- return makeFieldReactive(fieldApi);
24
+ onMount(() => onCleanup(api.mount()));
25
+ return makeFieldReactive(extendedApi);
25
26
  }
26
27
  export function Field(props) {
27
28
  const fieldApi = createField(() => {
@@ -1 +1 @@
1
- {"version":3,"file":"createField.jsx","sourceRoot":"","sources":["../src/createField.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAC9C,OAAO,EACL,eAAe,EACf,cAAc,EACd,UAAU,EACV,YAAY,EACZ,SAAS,EACT,OAAO,GACR,MAAM,UAAU,CAAA;AAoDjB,8EAA8E;AAC9E,SAAS,iBAAiB,CACxB,QAAmB;IAEnB,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,CAAA;IAC3C,MAAM,YAAY,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,QAAQ,CAAU,CAAC,CAAA;IAClE,MAAM,gBAAgB,GAAG,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAC3E,SAAS,CAAC,gBAAgB,CAAC,CAAA;IAC3B,OAAO,GAAG,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,CAAA;AAChC,CAAC;AAED,MAAM,UAAU,WAAW,CAWzB,IAMC;IAED,MAAM,OAAO,GAAG,IAAI,EAAE,CAAA;IAEtB,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,OAAO,CAAC,CAAA;IACtC,QAAQ,CAAC,KAAK,GAAG,KAAc,CAAA;IAE/B;;;;;OAKG;IACH,cAAc,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;IAE7C,yDAAyD;IACzD,OAAO,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;IAE1C,OAAO,iBAAiB,CAAC,QAAQ,CAAU,CAAA;AAC7C,CAAC;AA0DD,MAAM,UAAU,KAAK,CAWnB,KAgBC;IAED,MAAM,QAAQ,GAAG,WAAW,CAM1B,GAAG,EAAE;QACL,MAAM,EAAE,QAAQ,EAAE,GAAG,YAAY,EAAE,GAAG,KAAK,CAAA;QAC3C,OAAO,YAAY,CAAA;IACrB,CAAC,CAAC,CAAA;IAEF,OAAO,EAAE,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAA;AACnE,CAAC"}
1
+ {"version":3,"file":"createField.jsx","sourceRoot":"","sources":["../src/createField.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAC9C,OAAO,EACL,eAAe,EACf,cAAc,EACd,UAAU,EACV,YAAY,EACZ,SAAS,EACT,OAAO,GACR,MAAM,UAAU,CAAA;AAmDjB,8EAA8E;AAC9E,SAAS,iBAAiB,CAkBxB,QAAmB;IACnB,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,CAAA;IAC3C,MAAM,YAAY,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,QAAQ,CAAU,CAAC,CAAA;IAClE,MAAM,gBAAgB,GAAG,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAC3E,SAAS,CAAC,gBAAgB,CAAC,CAAA;IAC3B,OAAO,GAAG,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,CAAA;AAChC,CAAC;AAED,MAAM,UAAU,WAAW,CAWzB,IAMC;IAED,MAAM,OAAO,GAAG,IAAI,EAAE,CAAA;IAEtB,MAAM,GAAG,GAAG,IAAI,QAAQ,CAAC,OAAO,CAAC,CAAA;IAEjC,MAAM,WAAW,GACf,GAAY,CAAA;IAEd,WAAW,CAAC,KAAK,GAAG,KAAc,CAAA;IAElC;;;;;OAKG;IACH,cAAc,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;IAExC,yDAAyD;IACzD,OAAO,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;IAErC,OAAO,iBAAiB,CAAC,WAAoB,CAAC,CAAA;AAChD,CAAC;AA0DD,MAAM,UAAU,KAAK,CAWnB,KAgBC;IAED,MAAM,QAAQ,GAAG,WAAW,CAM1B,GAAG,EAAE;QACL,MAAM,EAAE,QAAQ,EAAE,GAAG,YAAY,EAAE,GAAG,KAAK,CAAA;QAC3C,OAAO,YAAY,CAAA;IACrB,CAAC,CAAC,CAAA;IAEF,OAAO,EAAE,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAA;AACnE,CAAC"}
@@ -3,16 +3,14 @@ import { type JSXElement } from 'solid-js';
3
3
  import { type CreateField, type FieldComponent } from './createField';
4
4
  import type { FormOptions, FormState, Validator } from '@tanstack/form-core';
5
5
  type NoInfer<T> = [T][T extends any ? 0 : never];
6
- declare module '@tanstack/form-core' {
7
- interface FormApi<TFormData, TFormValidator> {
8
- Field: FieldComponent<TFormData, TFormValidator>;
9
- createField: CreateField<TFormData, TFormValidator>;
10
- useStore: <TSelected = NoInfer<FormState<TFormData>>>(selector?: (state: NoInfer<FormState<TFormData>>) => TSelected) => () => TSelected;
11
- Subscribe: <TSelected = NoInfer<FormState<TFormData>>>(props: {
12
- selector?: (state: NoInfer<FormState<TFormData>>) => TSelected;
13
- children: ((state: () => NoInfer<TSelected>) => JSXElement) | JSXElement;
14
- }) => JSXElement;
15
- }
6
+ interface SolidFormApi<TFormData, TFormValidator extends Validator<TFormData, unknown> | undefined = undefined> {
7
+ Field: FieldComponent<TFormData, TFormValidator>;
8
+ createField: CreateField<TFormData, TFormValidator>;
9
+ useStore: <TSelected = NoInfer<FormState<TFormData>>>(selector?: (state: NoInfer<FormState<TFormData>>) => TSelected) => () => TSelected;
10
+ Subscribe: <TSelected = NoInfer<FormState<TFormData>>>(props: {
11
+ selector?: (state: NoInfer<FormState<TFormData>>) => TSelected;
12
+ children: ((state: () => NoInfer<TSelected>) => JSXElement) | JSXElement;
13
+ }) => JSXElement;
16
14
  }
17
- export declare function createForm<TParentData, TFormValidator extends Validator<TParentData, unknown> | undefined = undefined>(opts?: () => FormOptions<TParentData, TFormValidator>): FormApi<TParentData, TFormValidator>;
15
+ export declare function createForm<TParentData, TFormValidator extends Validator<TParentData, unknown> | undefined = undefined>(opts?: () => FormOptions<TParentData, TFormValidator>): FormApi<TParentData, TFormValidator> & SolidFormApi<TParentData, TFormValidator>;
18
16
  export {};
@@ -4,19 +4,20 @@ import { useStore } from '@tanstack/solid-store';
4
4
  import { Field, createField, } from './createField';
5
5
  export function createForm(opts) {
6
6
  const options = opts?.();
7
- const formApi = new FormApi(options);
8
- formApi.Field = (props) => <Field {...props} form={formApi}/>;
9
- formApi.createField = (props) => createField(() => {
10
- return { ...props(), form: formApi };
7
+ const api = new FormApi(options);
8
+ const extendedApi = api;
9
+ extendedApi.Field = (props) => <Field {...props} form={api}/>;
10
+ extendedApi.createField = (props) => createField(() => {
11
+ return { ...props(), form: api };
11
12
  });
12
- formApi.useStore = (selector) => useStore(formApi.store, selector);
13
- formApi.Subscribe = (props) => functionalUpdate(props.children, useStore(formApi.store, props.selector));
14
- onMount(formApi.mount);
13
+ extendedApi.useStore = (selector) => useStore(api.store, selector);
14
+ extendedApi.Subscribe = (props) => functionalUpdate(props.children, useStore(api.store, props.selector));
15
+ onMount(api.mount);
15
16
  /**
16
17
  * formApi.update should not have any side effects. Think of it like a `useRef`
17
18
  * that we need to keep updated every render with the most up-to-date information.
18
19
  */
19
- createComputed(() => formApi.update(opts?.()));
20
- return formApi;
20
+ createComputed(() => api.update(opts?.()));
21
+ return extendedApi;
21
22
  }
22
23
  //# sourceMappingURL=createForm.jsx.map
@@ -1 +1 @@
1
- {"version":3,"file":"createForm.jsx","sourceRoot":"","sources":["../src/createForm.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAC/D,OAAO,EAAmB,cAAc,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AACnE,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAChD,OAAO,EAEL,KAAK,EAEL,WAAW,GACZ,MAAM,eAAe,CAAA;AAoBtB,MAAM,UAAU,UAAU,CAMxB,IAAqD;IAErD,MAAM,OAAO,GAAG,IAAI,EAAE,EAAE,CAAA;IACxB,MAAM,OAAO,GAAG,IAAI,OAAO,CAA8B,OAAO,CAAC,CAAA;IAEjE,OAAO,CAAC,KAAK,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,EAAG,CAAA;IAC9D,OAAO,CAAC,WAAW,GAAG,CAAC,KAAK,EAAE,EAAE,CAC9B,WAAW,CAAC,GAAG,EAAE;QACf,OAAO,EAAE,GAAG,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAA;IACtC,CAAC,CAAC,CAAA;IACJ,OAAO,CAAC,QAAQ,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;IAClE,OAAO,CAAC,SAAS,GAAG,CAAC,KAAK,EAAE,EAAE,CAC5B,gBAAgB,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAA;IAE3E,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;IAEtB;;;OAGG;IACH,cAAc,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAA;IAE9C,OAAO,OAAO,CAAA;AAChB,CAAC"}
1
+ {"version":3,"file":"createForm.jsx","sourceRoot":"","sources":["../src/createForm.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAC/D,OAAO,EAAmB,cAAc,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AACnE,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAChD,OAAO,EAEL,KAAK,EAEL,WAAW,GACZ,MAAM,eAAe,CAAA;AAoBtB,MAAM,UAAU,UAAU,CAKxB,IAAqD;IACrD,MAAM,OAAO,GAAG,IAAI,EAAE,EAAE,CAAA;IACxB,MAAM,GAAG,GAAG,IAAI,OAAO,CAA8B,OAAO,CAAC,CAAA;IAC7D,MAAM,WAAW,GACf,GAAY,CAAA;IAEd,WAAW,CAAC,KAAK,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,EAAG,CAAA;IAC9D,WAAW,CAAC,WAAW,GAAG,CAAC,KAAK,EAAE,EAAE,CAClC,WAAW,CAAC,GAAG,EAAE;QACf,OAAO,EAAE,GAAG,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAA;IAClC,CAAC,CAAC,CAAA;IACJ,WAAW,CAAC,QAAQ,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;IAClE,WAAW,CAAC,SAAS,GAAG,CAAC,KAAK,EAAE,EAAE,CAChC,gBAAgB,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAA;IAEvE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IAElB;;;OAGG;IACH,cAAc,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAA;IAE1C,OAAO,WAAW,CAAA;AACpB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tanstack/solid-form",
3
- "version": "0.24.0",
3
+ "version": "0.24.3",
4
4
  "description": "Powerful, type-safe forms for Solid.",
5
5
  "author": "tannerlinsley",
6
6
  "license": "MIT",
@@ -43,7 +43,7 @@
43
43
  },
44
44
  "dependencies": {
45
45
  "@tanstack/solid-store": "^0.5.0",
46
- "@tanstack/form-core": "0.24.0"
46
+ "@tanstack/form-core": "0.24.3"
47
47
  },
48
48
  "peerDependencies": {
49
49
  "solid-js": "^1.6.0"
@@ -17,21 +17,13 @@ import type {
17
17
  import type { JSXElement } from 'solid-js'
18
18
  import type { CreateFieldOptions } from './types'
19
19
 
20
- declare module '@tanstack/form-core' {
21
- // eslint-disable-next-line no-shadow
22
- interface FieldApi<
23
- TParentData,
24
- TName extends DeepKeys<TParentData>,
25
- TFieldValidator extends
26
- | Validator<DeepValue<TParentData, TName>, unknown>
27
- | undefined = undefined,
28
- TFormValidator extends
29
- | Validator<TParentData, unknown>
30
- | undefined = undefined,
31
- TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,
32
- > {
33
- Field: FieldComponent<TParentData, TFormValidator>
34
- }
20
+ interface SolidFieldApi<
21
+ TParentData,
22
+ TFormValidator extends
23
+ | Validator<TParentData, unknown>
24
+ | undefined = undefined,
25
+ > {
26
+ Field: FieldComponent<TParentData, TFormValidator>
35
27
  }
36
28
 
37
29
  export type CreateField<
@@ -56,12 +48,35 @@ export type CreateField<
56
48
  >,
57
49
  'form'
58
50
  >,
59
- ) => () => FieldApi<TParentData, TName, TFieldValidator, TFormValidator, TData>
51
+ ) => () => FieldApi<
52
+ TParentData,
53
+ TName,
54
+ TFieldValidator,
55
+ TFormValidator,
56
+ TData
57
+ > &
58
+ SolidFieldApi<TParentData, TFormValidator>
60
59
 
61
60
  // ugly way to trick solid into triggering updates for changes on the fieldApi
62
- function makeFieldReactive<FieldApiT extends FieldApi<any, any, any, any>>(
63
- fieldApi: FieldApiT,
64
- ): () => FieldApiT {
61
+ function makeFieldReactive<
62
+ TParentData,
63
+ TName extends DeepKeys<TParentData>,
64
+ TFieldValidator extends
65
+ | Validator<DeepValue<TParentData, TName>, unknown>
66
+ | undefined = undefined,
67
+ TFormValidator extends
68
+ | Validator<TParentData, unknown>
69
+ | undefined = undefined,
70
+ TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,
71
+ FieldApiT extends FieldApi<
72
+ TParentData,
73
+ TName,
74
+ TFieldValidator,
75
+ TFormValidator,
76
+ TData
77
+ > = FieldApi<TParentData, TName, TFieldValidator, TFormValidator, TData> &
78
+ SolidFieldApi<TParentData, TFormValidator>,
79
+ >(fieldApi: FieldApiT): () => FieldApiT {
65
80
  const [flag, setFlag] = createSignal(false)
66
81
  const fieldApiMemo = createMemo(() => [flag(), fieldApi] as const)
67
82
  const unsubscribeStore = fieldApi.store.subscribe(() => setFlag((f) => !f))
@@ -87,11 +102,15 @@ export function createField<
87
102
  TFormValidator,
88
103
  TData
89
104
  >,
90
- ): () => FieldApi<TParentData, TName, TFieldValidator, TFormValidator, TData> {
105
+ ) {
91
106
  const options = opts()
92
107
 
93
- const fieldApi = new FieldApi(options)
94
- fieldApi.Field = Field as never
108
+ const api = new FieldApi(options)
109
+
110
+ const extendedApi: typeof api & SolidFieldApi<TParentData, TFormValidator> =
111
+ api as never
112
+
113
+ extendedApi.Field = Field as never
95
114
 
96
115
  /**
97
116
  * fieldApi.update should not have any side effects. Think of it like a `useRef`
@@ -99,12 +118,12 @@ export function createField<
99
118
  *
100
119
  * createComputed to make sure this effect runs before render effects
101
120
  */
102
- createComputed(() => fieldApi.update(opts()))
121
+ createComputed(() => api.update(opts()))
103
122
 
104
123
  // Instantiates field meta and removes it when unrendered
105
- onMount(() => onCleanup(fieldApi.mount()))
124
+ onMount(() => onCleanup(api.mount()))
106
125
 
107
- return makeFieldReactive(fieldApi) as never
126
+ return makeFieldReactive(extendedApi as never)
108
127
  }
109
128
 
110
129
  type FieldComponentProps<
@@ -11,19 +11,19 @@ import type { FormOptions, FormState, Validator } from '@tanstack/form-core'
11
11
 
12
12
  type NoInfer<T> = [T][T extends any ? 0 : never]
13
13
 
14
- declare module '@tanstack/form-core' {
15
- // eslint-disable-next-line no-shadow
16
- interface FormApi<TFormData, TFormValidator> {
17
- Field: FieldComponent<TFormData, TFormValidator>
18
- createField: CreateField<TFormData, TFormValidator>
19
- useStore: <TSelected = NoInfer<FormState<TFormData>>>(
20
- selector?: (state: NoInfer<FormState<TFormData>>) => TSelected,
21
- ) => () => TSelected
22
- Subscribe: <TSelected = NoInfer<FormState<TFormData>>>(props: {
23
- selector?: (state: NoInfer<FormState<TFormData>>) => TSelected
24
- children: ((state: () => NoInfer<TSelected>) => JSXElement) | JSXElement
25
- }) => JSXElement
26
- }
14
+ interface SolidFormApi<
15
+ TFormData,
16
+ TFormValidator extends Validator<TFormData, unknown> | undefined = undefined,
17
+ > {
18
+ Field: FieldComponent<TFormData, TFormValidator>
19
+ createField: CreateField<TFormData, TFormValidator>
20
+ useStore: <TSelected = NoInfer<FormState<TFormData>>>(
21
+ selector?: (state: NoInfer<FormState<TFormData>>) => TSelected,
22
+ ) => () => TSelected
23
+ Subscribe: <TSelected = NoInfer<FormState<TFormData>>>(props: {
24
+ selector?: (state: NoInfer<FormState<TFormData>>) => TSelected
25
+ children: ((state: () => NoInfer<TSelected>) => JSXElement) | JSXElement
26
+ }) => JSXElement
27
27
  }
28
28
 
29
29
  export function createForm<
@@ -31,28 +31,28 @@ export function createForm<
31
31
  TFormValidator extends
32
32
  | Validator<TParentData, unknown>
33
33
  | undefined = undefined,
34
- >(
35
- opts?: () => FormOptions<TParentData, TFormValidator>,
36
- ): FormApi<TParentData, TFormValidator> {
34
+ >(opts?: () => FormOptions<TParentData, TFormValidator>) {
37
35
  const options = opts?.()
38
- const formApi = new FormApi<TParentData, TFormValidator>(options)
36
+ const api = new FormApi<TParentData, TFormValidator>(options)
37
+ const extendedApi: typeof api & SolidFormApi<TParentData, TFormValidator> =
38
+ api as never
39
39
 
40
- formApi.Field = (props) => <Field {...props} form={formApi} />
41
- formApi.createField = (props) =>
40
+ extendedApi.Field = (props) => <Field {...props} form={api} />
41
+ extendedApi.createField = (props) =>
42
42
  createField(() => {
43
- return { ...props(), form: formApi }
43
+ return { ...props(), form: api }
44
44
  })
45
- formApi.useStore = (selector) => useStore(formApi.store, selector)
46
- formApi.Subscribe = (props) =>
47
- functionalUpdate(props.children, useStore(formApi.store, props.selector))
45
+ extendedApi.useStore = (selector) => useStore(api.store, selector)
46
+ extendedApi.Subscribe = (props) =>
47
+ functionalUpdate(props.children, useStore(api.store, props.selector))
48
48
 
49
- onMount(formApi.mount)
49
+ onMount(api.mount)
50
50
 
51
51
  /**
52
52
  * formApi.update should not have any side effects. Think of it like a `useRef`
53
53
  * that we need to keep updated every render with the most up-to-date information.
54
54
  */
55
- createComputed(() => formApi.update(opts?.()))
55
+ createComputed(() => api.update(opts?.()))
56
56
 
57
- return formApi
57
+ return extendedApi
58
58
  }