@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.
- package/dist/createField.d.ts +4 -6
- package/dist/createField.jsx +6 -5
- package/dist/createField.jsx.map +1 -1
- package/dist/createForm.d.ts +9 -11
- package/dist/createForm.jsx +10 -9
- package/dist/createForm.jsx.map +1 -1
- package/package.json +2 -2
- package/src/createField.tsx +44 -25
- package/src/createForm.tsx +26 -26
package/dist/createField.d.ts
CHANGED
@@ -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
|
-
|
6
|
-
|
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>): () =>
|
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'>;
|
package/dist/createField.jsx
CHANGED
@@ -10,18 +10,19 @@ function makeFieldReactive(fieldApi) {
|
|
10
10
|
}
|
11
11
|
export function createField(opts) {
|
12
12
|
const options = opts();
|
13
|
-
const
|
14
|
-
|
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(() =>
|
22
|
+
createComputed(() => api.update(opts()));
|
22
23
|
// Instantiates field meta and removes it when unrendered
|
23
|
-
onMount(() => onCleanup(
|
24
|
-
return makeFieldReactive(
|
24
|
+
onMount(() => onCleanup(api.mount()));
|
25
|
+
return makeFieldReactive(extendedApi);
|
25
26
|
}
|
26
27
|
export function Field(props) {
|
27
28
|
const fieldApi = createField(() => {
|
package/dist/createField.jsx.map
CHANGED
@@ -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;
|
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"}
|
package/dist/createForm.d.ts
CHANGED
@@ -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
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
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 {};
|
package/dist/createForm.jsx
CHANGED
@@ -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
|
8
|
-
|
9
|
-
|
10
|
-
|
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
|
-
|
13
|
-
|
14
|
-
onMount(
|
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(() =>
|
20
|
-
return
|
20
|
+
createComputed(() => api.update(opts?.()));
|
21
|
+
return extendedApi;
|
21
22
|
}
|
22
23
|
//# sourceMappingURL=createForm.jsx.map
|
package/dist/createForm.jsx.map
CHANGED
@@ -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,
|
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.
|
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.
|
46
|
+
"@tanstack/form-core": "0.24.3"
|
47
47
|
},
|
48
48
|
"peerDependencies": {
|
49
49
|
"solid-js": "^1.6.0"
|
package/src/createField.tsx
CHANGED
@@ -17,21 +17,13 @@ import type {
|
|
17
17
|
import type { JSXElement } from 'solid-js'
|
18
18
|
import type { CreateFieldOptions } from './types'
|
19
19
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
TParentData,
|
24
|
-
|
25
|
-
|
26
|
-
|
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<
|
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<
|
63
|
-
|
64
|
-
|
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
|
-
)
|
105
|
+
) {
|
91
106
|
const options = opts()
|
92
107
|
|
93
|
-
const
|
94
|
-
|
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(() =>
|
121
|
+
createComputed(() => api.update(opts()))
|
103
122
|
|
104
123
|
// Instantiates field meta and removes it when unrendered
|
105
|
-
onMount(() => onCleanup(
|
124
|
+
onMount(() => onCleanup(api.mount()))
|
106
125
|
|
107
|
-
return makeFieldReactive(
|
126
|
+
return makeFieldReactive(extendedApi as never)
|
108
127
|
}
|
109
128
|
|
110
129
|
type FieldComponentProps<
|
package/src/createForm.tsx
CHANGED
@@ -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
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
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
|
36
|
+
const api = new FormApi<TParentData, TFormValidator>(options)
|
37
|
+
const extendedApi: typeof api & SolidFormApi<TParentData, TFormValidator> =
|
38
|
+
api as never
|
39
39
|
|
40
|
-
|
41
|
-
|
40
|
+
extendedApi.Field = (props) => <Field {...props} form={api} />
|
41
|
+
extendedApi.createField = (props) =>
|
42
42
|
createField(() => {
|
43
|
-
return { ...props(), form:
|
43
|
+
return { ...props(), form: api }
|
44
44
|
})
|
45
|
-
|
46
|
-
|
47
|
-
functionalUpdate(props.children, useStore(
|
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(
|
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(() =>
|
55
|
+
createComputed(() => api.update(opts?.()))
|
56
56
|
|
57
|
-
return
|
57
|
+
return extendedApi
|
58
58
|
}
|