@tanstack/form-core 0.42.1 → 0.43.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/FieldApi.cjs +17 -28
- package/dist/cjs/FieldApi.cjs.map +1 -1
- package/dist/cjs/FieldApi.d.cts +91 -79
- package/dist/cjs/FormApi.cjs +50 -53
- package/dist/cjs/FormApi.cjs.map +1 -1
- package/dist/cjs/FormApi.d.cts +74 -67
- package/dist/cjs/formOptions.cjs.map +1 -1
- package/dist/cjs/formOptions.d.cts +2 -3
- package/dist/cjs/index.cjs +2 -1
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/mergeForm.cjs.map +1 -1
- package/dist/cjs/mergeForm.d.cts +1 -2
- package/dist/cjs/metaHelper.cjs.map +1 -1
- package/dist/cjs/metaHelper.d.cts +2 -3
- package/dist/cjs/standardSchemaValidator.cjs +24 -31
- package/dist/cjs/standardSchemaValidator.cjs.map +1 -1
- package/dist/cjs/standardSchemaValidator.d.cts +24 -4
- package/dist/cjs/types.d.cts +15 -27
- package/dist/cjs/util-types.d.cts +1 -0
- package/dist/cjs/utils.cjs +4 -0
- package/dist/cjs/utils.cjs.map +1 -1
- package/dist/cjs/utils.d.cts +4 -3
- package/dist/esm/FieldApi.d.ts +91 -79
- package/dist/esm/FieldApi.js +18 -29
- package/dist/esm/FieldApi.js.map +1 -1
- package/dist/esm/FormApi.d.ts +74 -67
- package/dist/esm/FormApi.js +52 -55
- package/dist/esm/FormApi.js.map +1 -1
- package/dist/esm/formOptions.d.ts +2 -3
- package/dist/esm/formOptions.js.map +1 -1
- package/dist/esm/index.js +4 -3
- package/dist/esm/mergeForm.d.ts +1 -2
- package/dist/esm/mergeForm.js.map +1 -1
- package/dist/esm/metaHelper.d.ts +2 -3
- package/dist/esm/metaHelper.js.map +1 -1
- package/dist/esm/standardSchemaValidator.d.ts +24 -4
- package/dist/esm/standardSchemaValidator.js +24 -31
- package/dist/esm/standardSchemaValidator.js.map +1 -1
- package/dist/esm/types.d.ts +15 -27
- package/dist/esm/util-types.d.ts +1 -0
- package/dist/esm/utils.d.ts +4 -3
- package/dist/esm/utils.js +4 -0
- package/dist/esm/utils.js.map +1 -1
- package/package.json +2 -2
- package/src/FieldApi.ts +803 -273
- package/src/FormApi.ts +613 -183
- package/src/formOptions.ts +26 -4
- package/src/mergeForm.ts +5 -7
- package/src/metaHelper.ts +28 -6
- package/src/standardSchemaValidator.ts +47 -58
- package/src/types.ts +39 -34
- package/src/util-types.ts +2 -0
- package/src/utils.ts +15 -9
package/dist/cjs/FormApi.d.cts
CHANGED
|
@@ -1,26 +1,30 @@
|
|
|
1
1
|
import { Derived, Store } from '@tanstack/store';
|
|
2
|
-
import { StandardSchemaV1 } from './standardSchemaValidator.cjs';
|
|
3
|
-
import {
|
|
4
|
-
import { FormValidationError, FormValidationErrorMap, UpdateMetaOptions, ValidationCause, ValidationError, ValidationErrorMap, ValidationErrorMapKeys
|
|
2
|
+
import { StandardSchemaV1, StandardSchemaV1Issue, TStandardSchemaValidatorValue } from './standardSchemaValidator.cjs';
|
|
3
|
+
import { AnyFieldMeta, AnyFieldMetaBase, FieldApi } from './FieldApi.cjs';
|
|
4
|
+
import { FormValidationError, FormValidationErrorMap, UpdateMetaOptions, ValidationCause, ValidationError, ValidationErrorMap, ValidationErrorMapKeys } from './types.cjs';
|
|
5
5
|
import { DeepKeys, DeepValue } from './util-types.cjs';
|
|
6
6
|
import { Updater } from './utils.cjs';
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
/**
|
|
8
|
+
* @private
|
|
9
|
+
*/
|
|
10
|
+
type FormErrorMapFromValidator<TFormData, TOnMount extends undefined | FormValidateOrFn<TFormData>, TOnChange extends undefined | FormValidateOrFn<TFormData>, TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>, TOnBlur extends undefined | FormValidateOrFn<TFormData>, TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>, TOnSubmit extends undefined | FormValidateOrFn<TFormData>, TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>> = Partial<Record<DeepKeys<TFormData>, ValidationErrorMap<TOnMount, TOnChange, TOnChangeAsync, TOnBlur, TOnBlurAsync, TOnSubmit, TOnSubmitAsync>>>;
|
|
11
|
+
export type FormValidateFn<TFormData> = (props: {
|
|
9
12
|
value: TFormData;
|
|
10
|
-
formApi: FormApi<TFormData,
|
|
11
|
-
}) =>
|
|
13
|
+
formApi: FormApi<TFormData, any, any, any, any, any, any, any, any>;
|
|
14
|
+
}) => unknown;
|
|
12
15
|
/**
|
|
13
16
|
* @private
|
|
14
17
|
*/
|
|
15
|
-
export type FormValidateOrFn<TFormData
|
|
18
|
+
export type FormValidateOrFn<TFormData> = FormValidateFn<TFormData> | StandardSchemaV1<TFormData, unknown>;
|
|
19
|
+
export type UnwrapFormValidateOrFn<TValidateOrFn extends undefined | FormValidateOrFn<any>> = [TValidateOrFn] extends [FormValidateFn<any>] ? ReturnType<TValidateOrFn> : [TValidateOrFn] extends [StandardSchemaV1<any, any>] ? Record<string, StandardSchemaV1Issue[]> : undefined;
|
|
16
20
|
/**
|
|
17
21
|
* @private
|
|
18
22
|
*/
|
|
19
|
-
export type FormValidateAsyncFn<TFormData
|
|
23
|
+
export type FormValidateAsyncFn<TFormData> = (props: {
|
|
20
24
|
value: TFormData;
|
|
21
|
-
formApi: FormApi<TFormData,
|
|
25
|
+
formApi: FormApi<TFormData, any, any, any, any, any, any, any, any>;
|
|
22
26
|
signal: AbortSignal;
|
|
23
|
-
}) =>
|
|
27
|
+
}) => unknown | Promise<unknown>;
|
|
24
28
|
export type FormValidator<TFormData, TType, TFn = unknown> = {
|
|
25
29
|
validate(options: {
|
|
26
30
|
value: TType;
|
|
@@ -32,20 +36,21 @@ export type FormValidator<TFormData, TType, TFn = unknown> = {
|
|
|
32
36
|
/**
|
|
33
37
|
* @private
|
|
34
38
|
*/
|
|
35
|
-
export type FormAsyncValidateOrFn<TFormData
|
|
36
|
-
export
|
|
39
|
+
export type FormAsyncValidateOrFn<TFormData> = FormValidateAsyncFn<TFormData> | StandardSchemaV1<TFormData, unknown>;
|
|
40
|
+
export type UnwrapFormAsyncValidateOrFn<TValidateOrFn extends undefined | FormAsyncValidateOrFn<any>> = [TValidateOrFn] extends [FormValidateAsyncFn<any>] ? Awaited<ReturnType<TValidateOrFn>> : [TValidateOrFn] extends [StandardSchemaV1<any, any>] ? Record<string, StandardSchemaV1Issue[]> : undefined;
|
|
41
|
+
export interface FormValidators<TFormData, TOnMount extends undefined | FormValidateOrFn<TFormData>, TOnChange extends undefined | FormValidateOrFn<TFormData>, TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>, TOnBlur extends undefined | FormValidateOrFn<TFormData>, TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>, TOnSubmit extends undefined | FormValidateOrFn<TFormData>, TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>> {
|
|
37
42
|
/**
|
|
38
43
|
* Optional function that fires as soon as the component mounts.
|
|
39
44
|
*/
|
|
40
|
-
onMount?:
|
|
45
|
+
onMount?: TOnMount;
|
|
41
46
|
/**
|
|
42
47
|
* Optional function that checks the validity of your data whenever a value changes
|
|
43
48
|
*/
|
|
44
|
-
onChange?:
|
|
49
|
+
onChange?: TOnChange;
|
|
45
50
|
/**
|
|
46
51
|
* Optional onChange asynchronous counterpart to onChange. Useful for more complex validation logic that might involve server requests.
|
|
47
52
|
*/
|
|
48
|
-
onChangeAsync?:
|
|
53
|
+
onChangeAsync?: TOnChangeAsync;
|
|
49
54
|
/**
|
|
50
55
|
* The default time in milliseconds that if set to a number larger than 0, will debounce the async validation event by this length of time in milliseconds.
|
|
51
56
|
*/
|
|
@@ -53,29 +58,29 @@ export interface FormValidators<TFormData, TFormValidator extends Validator<TFor
|
|
|
53
58
|
/**
|
|
54
59
|
* Optional function that validates the form data when a field loses focus, returns a `FormValidationError`
|
|
55
60
|
*/
|
|
56
|
-
onBlur?:
|
|
61
|
+
onBlur?: TOnBlur;
|
|
57
62
|
/**
|
|
58
63
|
* Optional onBlur asynchronous validation method for when a field loses focus returns a ` FormValidationError` or a promise of `Promise<FormValidationError>`
|
|
59
64
|
*/
|
|
60
|
-
onBlurAsync?:
|
|
65
|
+
onBlurAsync?: TOnBlurAsync;
|
|
61
66
|
/**
|
|
62
67
|
* The default time in milliseconds that if set to a number larger than 0, will debounce the async validation event by this length of time in milliseconds.
|
|
63
68
|
*/
|
|
64
69
|
onBlurAsyncDebounceMs?: number;
|
|
65
|
-
onSubmit?:
|
|
66
|
-
onSubmitAsync?:
|
|
70
|
+
onSubmit?: TOnSubmit;
|
|
71
|
+
onSubmitAsync?: TOnSubmitAsync;
|
|
67
72
|
}
|
|
68
73
|
/**
|
|
69
74
|
* @private
|
|
70
75
|
*/
|
|
71
|
-
export interface FormTransform<TFormData,
|
|
72
|
-
fn: (formBase: FormApi<TFormData,
|
|
76
|
+
export interface FormTransform<TFormData, TOnMount extends undefined | FormValidateOrFn<TFormData>, TOnChange extends undefined | FormValidateOrFn<TFormData>, TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>, TOnBlur extends undefined | FormValidateOrFn<TFormData>, TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>, TOnSubmit extends undefined | FormValidateOrFn<TFormData>, TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>, TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>> {
|
|
77
|
+
fn: (formBase: FormApi<TFormData, TOnMount, TOnChange, TOnChangeAsync, TOnBlur, TOnBlurAsync, TOnSubmit, TOnSubmitAsync, TOnServer>) => FormApi<TFormData, TOnMount, TOnChange, TOnChangeAsync, TOnBlur, TOnBlurAsync, TOnSubmit, TOnSubmitAsync, TOnServer>;
|
|
73
78
|
deps: unknown[];
|
|
74
79
|
}
|
|
75
80
|
/**
|
|
76
81
|
* An object representing the options for a form.
|
|
77
82
|
*/
|
|
78
|
-
export interface FormOptions<TFormData,
|
|
83
|
+
export interface FormOptions<TFormData, TOnMount extends undefined | FormValidateOrFn<TFormData>, TOnChange extends undefined | FormValidateOrFn<TFormData>, TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>, TOnBlur extends undefined | FormValidateOrFn<TFormData>, TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>, TOnSubmit extends undefined | FormValidateOrFn<TFormData>, TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>, TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>> {
|
|
79
84
|
/**
|
|
80
85
|
* Set initial values for your form.
|
|
81
86
|
*/
|
|
@@ -83,7 +88,7 @@ export interface FormOptions<TFormData, TFormValidator extends Validator<TFormDa
|
|
|
83
88
|
/**
|
|
84
89
|
* The default state for the form.
|
|
85
90
|
*/
|
|
86
|
-
defaultState?: Partial<FormState<TFormData>>;
|
|
91
|
+
defaultState?: Partial<FormState<TFormData, TOnMount, TOnChange, TOnChangeAsync, TOnBlur, TOnBlurAsync, TOnSubmit, TOnSubmitAsync, TOnServer>>;
|
|
87
92
|
/**
|
|
88
93
|
* If true, always run async validation, even when sync validation has produced an error. Defaults to undefined.
|
|
89
94
|
*/
|
|
@@ -92,29 +97,25 @@ export interface FormOptions<TFormData, TFormValidator extends Validator<TFormDa
|
|
|
92
97
|
* Optional time in milliseconds if you want to introduce a delay before firing off an async action.
|
|
93
98
|
*/
|
|
94
99
|
asyncDebounceMs?: number;
|
|
95
|
-
/**
|
|
96
|
-
* A validator adapter to support usage of extra validation types (IE: Zod, Yup, or Valibot usage)
|
|
97
|
-
*/
|
|
98
|
-
validatorAdapter?: TFormValidator;
|
|
99
100
|
/**
|
|
100
101
|
* A list of validators to pass to the form
|
|
101
102
|
*/
|
|
102
|
-
validators?: FormValidators<TFormData,
|
|
103
|
+
validators?: FormValidators<TFormData, TOnMount, TOnChange, TOnChangeAsync, TOnBlur, TOnBlurAsync, TOnSubmit, TOnSubmitAsync>;
|
|
103
104
|
/**
|
|
104
105
|
* A function to be called when the form is submitted, what should happen once the user submits a valid form returns `any` or a promise `Promise<any>`
|
|
105
106
|
*/
|
|
106
107
|
onSubmit?: (props: {
|
|
107
108
|
value: TFormData;
|
|
108
|
-
formApi: FormApi<TFormData,
|
|
109
|
+
formApi: FormApi<TFormData, TOnMount, TOnChange, TOnChangeAsync, TOnBlur, TOnBlurAsync, TOnSubmit, TOnSubmitAsync, TOnServer>;
|
|
109
110
|
}) => any | Promise<any>;
|
|
110
111
|
/**
|
|
111
112
|
* Specify an action for scenarios where the user tries to submit an invalid form.
|
|
112
113
|
*/
|
|
113
114
|
onSubmitInvalid?: (props: {
|
|
114
115
|
value: TFormData;
|
|
115
|
-
formApi: FormApi<TFormData,
|
|
116
|
+
formApi: FormApi<TFormData, TOnMount, TOnChange, TOnChangeAsync, TOnBlur, TOnBlurAsync, TOnSubmit, TOnSubmitAsync, TOnServer>;
|
|
116
117
|
}) => void;
|
|
117
|
-
transform?: FormTransform<TFormData,
|
|
118
|
+
transform?: FormTransform<TFormData, TOnMount, TOnChange, TOnChangeAsync, TOnBlur, TOnBlurAsync, TOnSubmit, TOnSubmitAsync, TOnServer>;
|
|
118
119
|
}
|
|
119
120
|
/**
|
|
120
121
|
* An object representing the validation metadata for a field. Not intended for public usage.
|
|
@@ -128,11 +129,11 @@ export type ValidationMeta = {
|
|
|
128
129
|
/**
|
|
129
130
|
* An object representing the field information for a specific field within the form.
|
|
130
131
|
*/
|
|
131
|
-
export type FieldInfo<TFormData
|
|
132
|
+
export type FieldInfo<TFormData> = {
|
|
132
133
|
/**
|
|
133
134
|
* An instance of the FieldAPI.
|
|
134
135
|
*/
|
|
135
|
-
instance: FieldApi<TFormData, any,
|
|
136
|
+
instance: FieldApi<TFormData, any, any, any, any, any, any, any, any, any, any, any, any, any, any, any, any, any> | null;
|
|
136
137
|
/**
|
|
137
138
|
* A record of field validation internal handling.
|
|
138
139
|
*/
|
|
@@ -141,7 +142,7 @@ export type FieldInfo<TFormData, TFormValidator extends Validator<TFormData, unk
|
|
|
141
142
|
/**
|
|
142
143
|
* An object representing the current state of the form.
|
|
143
144
|
*/
|
|
144
|
-
export type BaseFormState<TFormData
|
|
145
|
+
export type BaseFormState<TFormData, TOnMount extends undefined | FormValidateOrFn<TFormData>, TOnChange extends undefined | FormValidateOrFn<TFormData>, TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>, TOnBlur extends undefined | FormValidateOrFn<TFormData>, TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>, TOnSubmit extends undefined | FormValidateOrFn<TFormData>, TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>, TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>> = {
|
|
145
146
|
/**
|
|
146
147
|
* The current values of the form fields.
|
|
147
148
|
*/
|
|
@@ -149,7 +150,7 @@ export type BaseFormState<TFormData> = {
|
|
|
149
150
|
/**
|
|
150
151
|
* The error map for the form itself.
|
|
151
152
|
*/
|
|
152
|
-
errorMap: FormValidationErrorMap
|
|
153
|
+
errorMap: FormValidationErrorMap<UnwrapFormValidateOrFn<TOnMount>, UnwrapFormValidateOrFn<TOnChange>, UnwrapFormAsyncValidateOrFn<TOnChangeAsync>, UnwrapFormValidateOrFn<TOnBlur>, UnwrapFormAsyncValidateOrFn<TOnBlurAsync>, UnwrapFormValidateOrFn<TOnSubmit>, UnwrapFormAsyncValidateOrFn<TOnSubmitAsync>, UnwrapFormAsyncValidateOrFn<TOnServer>>;
|
|
153
154
|
/**
|
|
154
155
|
* An internal mechanism used for keeping track of validation logic in a form.
|
|
155
156
|
*/
|
|
@@ -157,7 +158,7 @@ export type BaseFormState<TFormData> = {
|
|
|
157
158
|
/**
|
|
158
159
|
* A record of field metadata for each field in the form, not including the derived properties, like `errors` and such
|
|
159
160
|
*/
|
|
160
|
-
fieldMetaBase: Record<DeepKeys<TFormData>,
|
|
161
|
+
fieldMetaBase: Record<DeepKeys<TFormData>, AnyFieldMetaBase>;
|
|
161
162
|
/**
|
|
162
163
|
* A boolean indicating if the form is currently in the process of being submitted after `handleSubmit` is called.
|
|
163
164
|
*
|
|
@@ -184,7 +185,7 @@ export type BaseFormState<TFormData> = {
|
|
|
184
185
|
*/
|
|
185
186
|
submissionAttempts: number;
|
|
186
187
|
};
|
|
187
|
-
export type DerivedFormState<TFormData
|
|
188
|
+
export type DerivedFormState<TFormData, TOnMount extends undefined | FormValidateOrFn<TFormData>, TOnChange extends undefined | FormValidateOrFn<TFormData>, TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>, TOnBlur extends undefined | FormValidateOrFn<TFormData>, TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>, TOnSubmit extends undefined | FormValidateOrFn<TFormData>, TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>, TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>> = {
|
|
188
189
|
/**
|
|
189
190
|
* A boolean indicating if the form is currently validating.
|
|
190
191
|
*/
|
|
@@ -196,7 +197,7 @@ export type DerivedFormState<TFormData> = {
|
|
|
196
197
|
/**
|
|
197
198
|
* The error array for the form itself.
|
|
198
199
|
*/
|
|
199
|
-
errors:
|
|
200
|
+
errors: Array<UnwrapFormValidateOrFn<TOnMount> | UnwrapFormValidateOrFn<TOnChange> | UnwrapFormAsyncValidateOrFn<TOnChangeAsync> | UnwrapFormValidateOrFn<TOnBlur> | UnwrapFormAsyncValidateOrFn<TOnBlurAsync> | UnwrapFormValidateOrFn<TOnSubmit> | UnwrapFormAsyncValidateOrFn<TOnSubmitAsync> | UnwrapFormAsyncValidateOrFn<TOnServer>>;
|
|
200
201
|
/**
|
|
201
202
|
* A boolean indicating if any of the form fields are currently validating.
|
|
202
203
|
*/
|
|
@@ -232,9 +233,16 @@ export type DerivedFormState<TFormData> = {
|
|
|
232
233
|
/**
|
|
233
234
|
* A record of field metadata for each field in the form.
|
|
234
235
|
*/
|
|
235
|
-
fieldMeta: Record<DeepKeys<TFormData>,
|
|
236
|
+
fieldMeta: Record<DeepKeys<TFormData>, AnyFieldMeta>;
|
|
236
237
|
};
|
|
237
|
-
export type FormState<TFormData
|
|
238
|
+
export type FormState<TFormData, TOnMount extends undefined | FormValidateOrFn<TFormData>, TOnChange extends undefined | FormValidateOrFn<TFormData>, TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>, TOnBlur extends undefined | FormValidateOrFn<TFormData>, TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>, TOnSubmit extends undefined | FormValidateOrFn<TFormData>, TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>, TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>> = BaseFormState<TFormData, TOnMount, TOnChange, TOnChangeAsync, TOnBlur, TOnBlurAsync, TOnSubmit, TOnSubmitAsync, TOnServer> & DerivedFormState<TFormData, TOnMount, TOnChange, TOnChangeAsync, TOnBlur, TOnBlurAsync, TOnSubmit, TOnSubmitAsync, TOnServer>;
|
|
239
|
+
export type AnyFormState = FormState<any, any, any, any, any, any, any, any, any>;
|
|
240
|
+
/**
|
|
241
|
+
* @public
|
|
242
|
+
*
|
|
243
|
+
* A type representing the Form API with all generics set to `any` for convenience.
|
|
244
|
+
*/
|
|
245
|
+
export type AnyFormApi = FormApi<any, any, any, any, any, any, any, any, any>;
|
|
238
246
|
/**
|
|
239
247
|
* A class representing the Form API. It handles the logic and interactions with the form state.
|
|
240
248
|
*
|
|
@@ -242,19 +250,19 @@ export type FormState<TFormData> = BaseFormState<TFormData> & DerivedFormState<T
|
|
|
242
250
|
* hook/function like `useForm` or `createForm` to create a new instance for you that uses your framework's reactivity model.
|
|
243
251
|
* However, if you need to create a new instance manually, you can do so by calling the `new FormApi` constructor.
|
|
244
252
|
*/
|
|
245
|
-
export declare class FormApi<TFormData,
|
|
253
|
+
export declare class FormApi<TFormData, TOnMount extends undefined | FormValidateOrFn<TFormData>, TOnChange extends undefined | FormValidateOrFn<TFormData>, TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>, TOnBlur extends undefined | FormValidateOrFn<TFormData>, TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>, TOnSubmit extends undefined | FormValidateOrFn<TFormData>, TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>, TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>> {
|
|
246
254
|
/**
|
|
247
255
|
* The options for the form.
|
|
248
256
|
*/
|
|
249
|
-
options: FormOptions<TFormData,
|
|
250
|
-
baseStore: Store<BaseFormState<TFormData>>;
|
|
251
|
-
fieldMetaDerived: Derived<Record<DeepKeys<TFormData>,
|
|
252
|
-
store: Derived<FormState<TFormData>>;
|
|
257
|
+
options: FormOptions<TFormData, TOnMount, TOnChange, TOnChangeAsync, TOnBlur, TOnBlurAsync, TOnSubmit, TOnSubmitAsync, TOnServer>;
|
|
258
|
+
baseStore: Store<BaseFormState<TFormData, TOnMount, TOnChange, TOnChangeAsync, TOnBlur, TOnBlurAsync, TOnSubmit, TOnSubmitAsync, TOnServer>>;
|
|
259
|
+
fieldMetaDerived: Derived<Record<DeepKeys<TFormData>, AnyFieldMeta>>;
|
|
260
|
+
store: Derived<FormState<TFormData, TOnMount, TOnChange, TOnChangeAsync, TOnBlur, TOnBlurAsync, TOnSubmit, TOnSubmitAsync, TOnServer>>;
|
|
253
261
|
/**
|
|
254
262
|
* A record of field information for each field in the form.
|
|
255
263
|
*/
|
|
256
|
-
fieldInfo: Record<DeepKeys<TFormData>, FieldInfo<TFormData
|
|
257
|
-
get state(): FormState<TFormData>;
|
|
264
|
+
fieldInfo: Record<DeepKeys<TFormData>, FieldInfo<TFormData>>;
|
|
265
|
+
get state(): FormState<TFormData, TOnMount, TOnChange, TOnChangeAsync, TOnBlur, TOnBlurAsync, TOnSubmit, TOnSubmitAsync, TOnServer>;
|
|
258
266
|
/**
|
|
259
267
|
* @private
|
|
260
268
|
*/
|
|
@@ -262,24 +270,22 @@ export declare class FormApi<TFormData, TFormValidator extends Validator<TFormDa
|
|
|
262
270
|
/**
|
|
263
271
|
* Constructs a new `FormApi` instance with the given form options.
|
|
264
272
|
*/
|
|
265
|
-
constructor(opts?: FormOptions<TFormData,
|
|
273
|
+
constructor(opts?: FormOptions<TFormData, TOnMount, TOnChange, TOnChangeAsync, TOnBlur, TOnBlurAsync, TOnSubmit, TOnSubmitAsync, TOnServer>);
|
|
266
274
|
/**
|
|
267
275
|
* @private
|
|
268
276
|
*/
|
|
269
|
-
runValidator<TValue extends {
|
|
270
|
-
|
|
271
|
-
formApi: FormApi<any, any>;
|
|
272
|
-
validationSource: ValidationSource;
|
|
277
|
+
runValidator<TValue extends TStandardSchemaValidatorValue<TFormData> & {
|
|
278
|
+
formApi: AnyFormApi;
|
|
273
279
|
}, TType extends 'validate' | 'validateAsync'>(props: {
|
|
274
|
-
validate: TType extends 'validate' ? FormValidateOrFn<TFormData
|
|
280
|
+
validate: TType extends 'validate' ? FormValidateOrFn<TFormData> : FormAsyncValidateOrFn<TFormData>;
|
|
275
281
|
value: TValue;
|
|
276
282
|
type: TType;
|
|
277
|
-
}):
|
|
283
|
+
}): unknown;
|
|
278
284
|
mount: () => () => void;
|
|
279
285
|
/**
|
|
280
286
|
* Updates the form options and form state.
|
|
281
287
|
*/
|
|
282
|
-
update: (options?: FormOptions<TFormData,
|
|
288
|
+
update: (options?: FormOptions<TFormData, TOnMount, TOnChange, TOnChangeAsync, TOnBlur, TOnBlurAsync, TOnSubmit, TOnSubmitAsync, TOnServer>) => void;
|
|
283
289
|
/**
|
|
284
290
|
* Resets the form state to the default values.
|
|
285
291
|
* If values are provided, the form will be reset to those values instead and the default values will be updated.
|
|
@@ -293,31 +299,31 @@ export declare class FormApi<TFormData, TFormValidator extends Validator<TFormDa
|
|
|
293
299
|
/**
|
|
294
300
|
* Validates all fields using the correct handlers for a given validation cause.
|
|
295
301
|
*/
|
|
296
|
-
validateAllFields: (cause: ValidationCause) => Promise<
|
|
302
|
+
validateAllFields: (cause: ValidationCause) => Promise<unknown[]>;
|
|
297
303
|
/**
|
|
298
304
|
* Validates the children of a specified array in the form starting from a given index until the end using the correct handlers for a given validation type.
|
|
299
305
|
*/
|
|
300
|
-
validateArrayFieldsStartingFrom: <TField extends DeepKeys<TFormData>>(field: TField, index: number, cause: ValidationCause) => Promise<
|
|
306
|
+
validateArrayFieldsStartingFrom: <TField extends DeepKeys<TFormData>>(field: TField, index: number, cause: ValidationCause) => Promise<unknown[]>;
|
|
301
307
|
/**
|
|
302
308
|
* Validates a specified field in the form using the correct handlers for a given validation type.
|
|
303
309
|
*/
|
|
304
|
-
validateField: <TField extends DeepKeys<TFormData>>(field: TField, cause: ValidationCause) =>
|
|
310
|
+
validateField: <TField extends DeepKeys<TFormData>>(field: TField, cause: ValidationCause) => unknown[] | Promise<unknown[]>;
|
|
305
311
|
/**
|
|
306
312
|
* TODO: This code is copied from FieldApi, we should refactor to share
|
|
307
313
|
* @private
|
|
308
314
|
*/
|
|
309
315
|
validateSync: (cause: ValidationCause) => {
|
|
310
316
|
hasErrored: boolean;
|
|
311
|
-
fieldsErrorMap:
|
|
317
|
+
fieldsErrorMap: FormErrorMapFromValidator<TFormData, TOnMount, TOnChange, TOnChangeAsync, TOnBlur, TOnBlurAsync, TOnSubmit, TOnSubmitAsync>;
|
|
312
318
|
};
|
|
313
319
|
/**
|
|
314
320
|
* @private
|
|
315
321
|
*/
|
|
316
|
-
validateAsync: (cause: ValidationCause) => Promise<
|
|
322
|
+
validateAsync: (cause: ValidationCause) => Promise<FormErrorMapFromValidator<TFormData, TOnMount, TOnChange, TOnChangeAsync, TOnBlur, TOnBlurAsync, TOnSubmit, TOnSubmitAsync>>;
|
|
317
323
|
/**
|
|
318
324
|
* @private
|
|
319
325
|
*/
|
|
320
|
-
validate: (cause: ValidationCause) =>
|
|
326
|
+
validate: (cause: ValidationCause) => FormErrorMapFromValidator<TFormData, TOnMount, TOnChange, TOnChangeAsync, TOnBlur, TOnBlurAsync, TOnSubmit, TOnSubmitAsync> | Promise<FormErrorMapFromValidator<TFormData, TOnMount, TOnChange, TOnChangeAsync, TOnBlur, TOnBlurAsync, TOnSubmit, TOnSubmitAsync>>;
|
|
321
327
|
/**
|
|
322
328
|
* Handles the form submission, performs validation, and calls the appropriate onSubmit or onInvalidSubmit callbacks.
|
|
323
329
|
*/
|
|
@@ -329,16 +335,16 @@ export declare class FormApi<TFormData, TFormValidator extends Validator<TFormDa
|
|
|
329
335
|
/**
|
|
330
336
|
* Gets the metadata of the specified field.
|
|
331
337
|
*/
|
|
332
|
-
getFieldMeta: <TField extends DeepKeys<TFormData>>(field: TField) =>
|
|
338
|
+
getFieldMeta: <TField extends DeepKeys<TFormData>>(field: TField) => AnyFieldMeta | undefined;
|
|
333
339
|
/**
|
|
334
340
|
* Gets the field info of the specified field.
|
|
335
341
|
*/
|
|
336
|
-
getFieldInfo: <TField extends DeepKeys<TFormData>>(field: TField) => FieldInfo<TFormData
|
|
342
|
+
getFieldInfo: <TField extends DeepKeys<TFormData>>(field: TField) => FieldInfo<TFormData>;
|
|
337
343
|
/**
|
|
338
344
|
* Updates the metadata of the specified field.
|
|
339
345
|
*/
|
|
340
|
-
setFieldMeta: <TField extends DeepKeys<TFormData>>(field: TField, updater: Updater<
|
|
341
|
-
resetFieldMeta: <TField extends DeepKeys<TFormData>>(fieldMeta: Record<TField,
|
|
346
|
+
setFieldMeta: <TField extends DeepKeys<TFormData>>(field: TField, updater: Updater<AnyFieldMeta>) => void;
|
|
347
|
+
resetFieldMeta: <TField extends DeepKeys<TFormData>>(fieldMeta: Record<TField, AnyFieldMeta>) => Record<TField, AnyFieldMeta>;
|
|
342
348
|
/**
|
|
343
349
|
* Sets the value of the specified field and optionally updates the touched state.
|
|
344
350
|
*/
|
|
@@ -368,5 +374,6 @@ export declare class FormApi<TFormData, TFormValidator extends Validator<TFormDa
|
|
|
368
374
|
/**
|
|
369
375
|
* Updates the form's errorMap
|
|
370
376
|
*/
|
|
371
|
-
setErrorMap(errorMap: ValidationErrorMap): void;
|
|
377
|
+
setErrorMap(errorMap: ValidationErrorMap<TOnMount, TOnChange, TOnChangeAsync, TOnBlur, TOnBlurAsync, TOnSubmit, TOnSubmitAsync>): void;
|
|
372
378
|
}
|
|
379
|
+
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formOptions.cjs","sources":["../../src/formOptions.ts"],"sourcesContent":["import type {
|
|
1
|
+
{"version":3,"file":"formOptions.cjs","sources":["../../src/formOptions.ts"],"sourcesContent":["import type {\n FormAsyncValidateOrFn,\n FormOptions,\n FormValidateOrFn,\n} from './FormApi'\n\nexport function formOptions<\n TFormData,\n TOnMount extends undefined | FormValidateOrFn<TFormData>,\n TOnChange extends undefined | FormValidateOrFn<TFormData>,\n TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n>(\n defaultOpts?: FormOptions<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnServer\n >,\n) {\n return defaultOpts\n}\n"],"names":[],"mappings":";;AAMO,SAAS,YAWd,aAWA;AACO,SAAA;AACT;;"}
|
|
@@ -1,3 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
export declare function formOptions<TFormData, TFormValidator extends Validator<TFormData, unknown> | undefined = undefined>(defaultOpts?: FormOptions<TFormData, TFormValidator>): FormOptions<TFormData, TFormValidator> | undefined;
|
|
1
|
+
import { FormAsyncValidateOrFn, FormOptions, FormValidateOrFn } from './FormApi.cjs';
|
|
2
|
+
export declare function formOptions<TFormData, TOnMount extends undefined | FormValidateOrFn<TFormData>, TOnChange extends undefined | FormValidateOrFn<TFormData>, TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>, TOnBlur extends undefined | FormValidateOrFn<TFormData>, TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>, TOnSubmit extends undefined | FormValidateOrFn<TFormData>, TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>, TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>>(defaultOpts?: FormOptions<TFormData, TOnMount, TOnChange, TOnChangeAsync, TOnBlur, TOnBlurAsync, TOnSubmit, TOnSubmitAsync, TOnServer>): FormOptions<TFormData, TOnMount, TOnChange, TOnChangeAsync, TOnBlur, TOnBlurAsync, TOnSubmit, TOnSubmitAsync, TOnServer> | undefined;
|
package/dist/cjs/index.cjs
CHANGED
|
@@ -13,6 +13,7 @@ exports.functionalUpdate = utils.functionalUpdate;
|
|
|
13
13
|
exports.getAsyncValidatorArray = utils.getAsyncValidatorArray;
|
|
14
14
|
exports.getBy = utils.getBy;
|
|
15
15
|
exports.getSyncValidatorArray = utils.getSyncValidatorArray;
|
|
16
|
+
exports.isGlobalFormValidationError = utils.isGlobalFormValidationError;
|
|
16
17
|
exports.isNonEmptyArray = utils.isNonEmptyArray;
|
|
17
18
|
exports.makePathArray = utils.makePathArray;
|
|
18
19
|
exports.setBy = utils.setBy;
|
|
@@ -21,5 +22,5 @@ exports.mergeForm = mergeForm.mergeForm;
|
|
|
21
22
|
exports.mutateMergeDeep = mergeForm.mutateMergeDeep;
|
|
22
23
|
exports.formOptions = formOptions.formOptions;
|
|
23
24
|
exports.isStandardSchemaValidator = standardSchemaValidator.isStandardSchemaValidator;
|
|
24
|
-
exports.
|
|
25
|
+
exports.standardSchemaValidators = standardSchemaValidator.standardSchemaValidators;
|
|
25
26
|
//# sourceMappingURL=index.cjs.map
|
package/dist/cjs/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mergeForm.cjs","sources":["../../src/mergeForm.ts"],"sourcesContent":["import type { FormApi } from './FormApi'\nimport type {
|
|
1
|
+
{"version":3,"file":"mergeForm.cjs","sources":["../../src/mergeForm.ts"],"sourcesContent":["import type { FormApi } from './FormApi'\nimport type { NoInfer } from './util-types'\n\nfunction isValidKey(key: string | number | symbol): boolean {\n const dangerousProps = ['__proto__', 'constructor', 'prototype']\n return !dangerousProps.includes(String(key))\n}\n\n/**\n * @private\n */\nexport function mutateMergeDeep(\n target: object | null | undefined,\n source: object | null | undefined,\n): object {\n // Early return if either is not an object\n if (target === null || target === undefined || typeof target !== 'object')\n return {} as object\n if (source === null || source === undefined || typeof source !== 'object')\n return target\n\n const targetKeys = Object.keys(target)\n const sourceKeys = Object.keys(source)\n const keySet = new Set([...targetKeys, ...sourceKeys])\n\n for (const key of keySet) {\n if (!isValidKey(key)) continue\n\n const targetKey = key as keyof typeof target\n const sourceKey = key as keyof typeof source\n\n if (!Object.hasOwn(source, sourceKey)) continue\n\n const sourceValue = source[sourceKey] as unknown\n const targetValue = target[targetKey] as unknown\n\n // Handle arrays\n if (Array.isArray(targetValue) && Array.isArray(sourceValue)) {\n Object.defineProperty(target, key, {\n value: [...sourceValue],\n enumerable: true,\n writable: true,\n configurable: true,\n })\n continue\n }\n\n // Handle nested objects (type assertion to satisfy ESLint)\n const isTargetObj = typeof targetValue === 'object' && targetValue !== null\n const isSourceObj = typeof sourceValue === 'object' && sourceValue !== null\n const areObjects =\n isTargetObj &&\n isSourceObj &&\n !Array.isArray(targetValue) &&\n !Array.isArray(sourceValue)\n\n if (areObjects) {\n mutateMergeDeep(targetValue as object, sourceValue as object)\n continue\n }\n\n // Handle all other cases\n Object.defineProperty(target, key, {\n value: sourceValue,\n enumerable: true,\n writable: true,\n configurable: true,\n })\n }\n\n return target\n}\n\nexport function mergeForm<TFormData>(\n baseForm: FormApi<NoInfer<TFormData>, any, any, any, any, any, any, any, any>,\n state: Partial<\n FormApi<TFormData, any, any, any, any, any, any, any, any>['state']\n >,\n) {\n mutateMergeDeep(baseForm.state, state)\n return baseForm\n}\n"],"names":[],"mappings":";;AAGA,SAAS,WAAW,KAAwC;AAC1D,QAAM,iBAAiB,CAAC,aAAa,eAAe,WAAW;AAC/D,SAAO,CAAC,eAAe,SAAS,OAAO,GAAG,CAAC;AAC7C;AAKgB,SAAA,gBACd,QACA,QACQ;AAER,MAAI,WAAW,QAAQ,WAAW,UAAa,OAAO,WAAW;AAC/D,WAAO,CAAC;AACV,MAAI,WAAW,QAAQ,WAAW,UAAa,OAAO,WAAW;AACxD,WAAA;AAEH,QAAA,aAAa,OAAO,KAAK,MAAM;AAC/B,QAAA,aAAa,OAAO,KAAK,MAAM;AAC/B,QAAA,6BAAa,IAAI,CAAC,GAAG,YAAY,GAAG,UAAU,CAAC;AAErD,aAAW,OAAO,QAAQ;AACpB,QAAA,CAAC,WAAW,GAAG,EAAG;AAEtB,UAAM,YAAY;AAClB,UAAM,YAAY;AAElB,QAAI,CAAC,OAAO,OAAO,QAAQ,SAAS,EAAG;AAEjC,UAAA,cAAc,OAAO,SAAS;AAC9B,UAAA,cAAc,OAAO,SAAS;AAGpC,QAAI,MAAM,QAAQ,WAAW,KAAK,MAAM,QAAQ,WAAW,GAAG;AACrD,aAAA,eAAe,QAAQ,KAAK;AAAA,QACjC,OAAO,CAAC,GAAG,WAAW;AAAA,QACtB,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,cAAc;AAAA,MAAA,CACf;AACD;AAAA,IAAA;AAIF,UAAM,cAAc,OAAO,gBAAgB,YAAY,gBAAgB;AACvE,UAAM,cAAc,OAAO,gBAAgB,YAAY,gBAAgB;AACjE,UAAA,aACJ,eACA,eACA,CAAC,MAAM,QAAQ,WAAW,KAC1B,CAAC,MAAM,QAAQ,WAAW;AAE5B,QAAI,YAAY;AACd,sBAAgB,aAAuB,WAAqB;AAC5D;AAAA,IAAA;AAIK,WAAA,eAAe,QAAQ,KAAK;AAAA,MACjC,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,cAAc;AAAA,IAAA,CACf;AAAA,EAAA;AAGI,SAAA;AACT;AAEgB,SAAA,UACd,UACA,OAGA;AACgB,kBAAA,SAAS,OAAO,KAAK;AAC9B,SAAA;AACT;;;"}
|
package/dist/cjs/mergeForm.d.cts
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { FormApi } from './FormApi.cjs';
|
|
2
|
-
import { Validator } from './types.cjs';
|
|
3
2
|
import { NoInfer } from './util-types.cjs';
|
|
4
3
|
/**
|
|
5
4
|
* @private
|
|
6
5
|
*/
|
|
7
6
|
export declare function mutateMergeDeep(target: object | null | undefined, source: object | null | undefined): object;
|
|
8
|
-
export declare function mergeForm<TFormData
|
|
7
|
+
export declare function mergeForm<TFormData>(baseForm: FormApi<NoInfer<TFormData>, any, any, any, any, any, any, any, any>, state: Partial<FormApi<TFormData, any, any, any, any, any, any, any, any>['state']>): FormApi<NoInfer<TFormData>, any, any, any, any, any, any, any, any>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metaHelper.cjs","sources":["../../src/metaHelper.ts"],"sourcesContent":["import type {
|
|
1
|
+
{"version":3,"file":"metaHelper.cjs","sources":["../../src/metaHelper.ts"],"sourcesContent":["import type {\n FormApi,\n FormAsyncValidateOrFn,\n FormValidateOrFn,\n} from './FormApi'\nimport type { AnyFieldMeta } from './FieldApi'\nimport type { DeepKeys } from './util-types'\n\ntype ArrayFieldMode = 'insert' | 'remove' | 'swap' | 'move'\n\nexport function metaHelper<\n TFormData,\n TOnMount extends undefined | FormValidateOrFn<TFormData>,\n TOnChange extends undefined | FormValidateOrFn<TFormData>,\n TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n>(\n formApi: FormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnServer\n >,\n) {\n function handleArrayFieldMetaShift(\n field: DeepKeys<TFormData>,\n index: number,\n mode: ArrayFieldMode,\n secondIndex?: number,\n ) {\n const affectedFields = getAffectedFields(field, index, mode, secondIndex)\n\n const handlers = {\n insert: () => handleInsertMode(affectedFields, field, index),\n remove: () => handleRemoveMode(affectedFields),\n swap: () =>\n secondIndex !== undefined &&\n handleSwapMode(affectedFields, field, index, secondIndex),\n move: () =>\n secondIndex !== undefined &&\n handleMoveMode(affectedFields, field, index, secondIndex),\n }\n\n handlers[mode]()\n }\n\n function getFieldPath(field: DeepKeys<TFormData>, index: number): string {\n return `${field}[${index}]`\n }\n\n function getAffectedFields(\n field: DeepKeys<TFormData>,\n index: number,\n mode: ArrayFieldMode,\n secondIndex?: number,\n ): DeepKeys<TFormData>[] {\n const affectedFieldKeys = [getFieldPath(field, index)]\n\n if (mode === 'swap') {\n affectedFieldKeys.push(getFieldPath(field, secondIndex!))\n } else if (mode === 'move') {\n const [startIndex, endIndex] = [\n Math.min(index, secondIndex!),\n Math.max(index, secondIndex!),\n ]\n for (let i = startIndex; i <= endIndex; i++) {\n affectedFieldKeys.push(getFieldPath(field, i))\n }\n } else {\n const currentValue = formApi.getFieldValue(field)\n const fieldItems = Array.isArray(currentValue) ? currentValue.length : 0\n for (let i = index + 1; i < fieldItems; i++) {\n affectedFieldKeys.push(getFieldPath(field, i))\n }\n }\n\n return Object.keys(formApi.fieldInfo).filter((fieldKey) =>\n affectedFieldKeys.some((key) => fieldKey.startsWith(key)),\n ) as DeepKeys<TFormData>[]\n }\n\n function updateIndex(\n fieldKey: string,\n direction: 'up' | 'down',\n ): DeepKeys<TFormData> {\n return fieldKey.replace(/\\[(\\d+)\\]/, (_, num) => {\n const currIndex = parseInt(num, 10)\n const newIndex =\n direction === 'up' ? currIndex + 1 : Math.max(0, currIndex - 1)\n return `[${newIndex}]`\n }) as DeepKeys<TFormData>\n }\n\n function shiftMeta(fields: DeepKeys<TFormData>[], direction: 'up' | 'down') {\n const sortedFields = direction === 'up' ? fields : [...fields].reverse()\n\n sortedFields.forEach((fieldKey) => {\n const nextFieldKey = updateIndex(fieldKey.toString(), direction)\n const nextFieldMeta = formApi.getFieldMeta(nextFieldKey)\n if (nextFieldMeta) {\n formApi.setFieldMeta(fieldKey, nextFieldMeta)\n }\n })\n }\n\n const getEmptyFieldMeta = (): AnyFieldMeta => ({\n isValidating: false,\n isTouched: false,\n isBlurred: false,\n isDirty: false,\n isPristine: true,\n errors: [],\n errorMap: {},\n })\n\n const handleInsertMode = (\n fields: DeepKeys<TFormData>[],\n field: DeepKeys<TFormData>,\n insertIndex: number,\n ) => {\n shiftMeta(fields, 'down')\n\n fields.forEach((fieldKey) => {\n if (fieldKey.toString().startsWith(getFieldPath(field, insertIndex))) {\n formApi.setFieldMeta(fieldKey, getEmptyFieldMeta())\n }\n })\n }\n\n const handleRemoveMode = (fields: DeepKeys<TFormData>[]) => {\n shiftMeta(fields, 'up')\n }\n\n const handleMoveMode = (\n fields: DeepKeys<TFormData>[],\n field: DeepKeys<TFormData>,\n fromIndex: number,\n toIndex: number,\n ) => {\n // Store the original field meta that will be reapplied at the destination index\n const fromFields = new Map(\n Object.keys(formApi.fieldInfo)\n .filter((fieldKey) =>\n fieldKey.startsWith(getFieldPath(field, fromIndex)),\n )\n .map((fieldKey) => [\n fieldKey as DeepKeys<TFormData>,\n formApi.getFieldMeta(fieldKey as DeepKeys<TFormData>),\n ]),\n )\n\n shiftMeta(fields, fromIndex < toIndex ? 'up' : 'down')\n\n // Reapply the stored field meta at the destination index\n Object.keys(formApi.fieldInfo)\n .filter((fieldKey) => fieldKey.startsWith(getFieldPath(field, toIndex)))\n .forEach((fieldKey) => {\n const fromKey = fieldKey.replace(\n getFieldPath(field, toIndex),\n getFieldPath(field, fromIndex),\n ) as DeepKeys<TFormData>\n\n const fromMeta = fromFields.get(fromKey)\n if (fromMeta) {\n formApi.setFieldMeta(fieldKey as DeepKeys<TFormData>, fromMeta)\n }\n })\n }\n\n const handleSwapMode = (\n fields: DeepKeys<TFormData>[],\n field: DeepKeys<TFormData>,\n index: number,\n secondIndex: number,\n ) => {\n fields.forEach((fieldKey) => {\n if (!fieldKey.toString().startsWith(getFieldPath(field, index))) return\n\n const swappedKey = fieldKey\n .toString()\n .replace(\n getFieldPath(field, index),\n getFieldPath(field, secondIndex),\n ) as DeepKeys<TFormData>\n\n const [meta1, meta2] = [\n formApi.getFieldMeta(fieldKey),\n formApi.getFieldMeta(swappedKey),\n ]\n\n if (meta1) formApi.setFieldMeta(swappedKey, meta1)\n if (meta2) formApi.setFieldMeta(fieldKey, meta2)\n })\n }\n\n return { handleArrayFieldMetaShift }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import { FormApi } from './FormApi.cjs';
|
|
2
|
-
import { Validator } from './types.cjs';
|
|
1
|
+
import { FormApi, FormAsyncValidateOrFn, FormValidateOrFn } from './FormApi.cjs';
|
|
3
2
|
import { DeepKeys } from './util-types.cjs';
|
|
4
3
|
type ArrayFieldMode = 'insert' | 'remove' | 'swap' | 'move';
|
|
5
|
-
export declare function metaHelper<TFormData,
|
|
4
|
+
export declare function metaHelper<TFormData, TOnMount extends undefined | FormValidateOrFn<TFormData>, TOnChange extends undefined | FormValidateOrFn<TFormData>, TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>, TOnBlur extends undefined | FormValidateOrFn<TFormData>, TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>, TOnSubmit extends undefined | FormValidateOrFn<TFormData>, TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>, TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>>(formApi: FormApi<TFormData, TOnMount, TOnChange, TOnChangeAsync, TOnBlur, TOnBlurAsync, TOnSubmit, TOnSubmitAsync, TOnServer>): {
|
|
6
5
|
handleArrayFieldMetaShift: (field: DeepKeys<TFormData>, index: number, mode: ArrayFieldMode, secondIndex?: number) => void;
|
|
7
6
|
};
|
|
8
7
|
export {};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
-
function prefixSchemaToErrors(issues
|
|
3
|
+
function prefixSchemaToErrors(issues) {
|
|
4
4
|
const schema = /* @__PURE__ */ new Map();
|
|
5
5
|
for (const issue of issues) {
|
|
6
6
|
const path = [...issue.path ?? []].map((segment) => {
|
|
@@ -9,40 +9,33 @@ function prefixSchemaToErrors(issues, transformErrors) {
|
|
|
9
9
|
}).join(".").replace(/\.\[/g, "[");
|
|
10
10
|
schema.set(path, (schema.get(path) ?? []).concat(issue));
|
|
11
11
|
}
|
|
12
|
-
|
|
13
|
-
schema.forEach((value, key) => {
|
|
14
|
-
transformedSchema[key] = transformErrors(value);
|
|
15
|
-
});
|
|
16
|
-
return transformedSchema;
|
|
12
|
+
return Object.fromEntries(schema);
|
|
17
13
|
}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
fields: prefixSchemaToErrors(issues, transformErrors)
|
|
22
|
-
});
|
|
23
|
-
}
|
|
24
|
-
const standardSchemaValidator = (params = {}) => () => {
|
|
25
|
-
const transformFieldErrors = params.transformErrors ?? ((issues) => issues.map((issue) => issue.message).join(", "));
|
|
26
|
-
const getTransformStrategy = (validationSource) => validationSource === "form" ? defaultFormTransformer(transformFieldErrors) : transformFieldErrors;
|
|
14
|
+
const defaultFieldTransformer = (issues) => issues;
|
|
15
|
+
const defaultFormTransformer = (issues) => {
|
|
16
|
+
const schemaErrors = prefixSchemaToErrors(issues);
|
|
27
17
|
return {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
if (result instanceof Promise) {
|
|
31
|
-
throw new Error("async function passed to sync validator");
|
|
32
|
-
}
|
|
33
|
-
if (!result.issues) return;
|
|
34
|
-
const transformer = getTransformStrategy(validationSource);
|
|
35
|
-
return transformer(result.issues);
|
|
36
|
-
},
|
|
37
|
-
async validateAsync({ value, validationSource }, fn) {
|
|
38
|
-
const result = await fn["~standard"].validate(value);
|
|
39
|
-
if (!result.issues) return;
|
|
40
|
-
const transformer = getTransformStrategy(validationSource);
|
|
41
|
-
return transformer(result.issues);
|
|
42
|
-
}
|
|
18
|
+
form: schemaErrors,
|
|
19
|
+
fields: schemaErrors
|
|
43
20
|
};
|
|
44
21
|
};
|
|
22
|
+
const transformIssues = (validationSource, issues) => validationSource === "form" ? defaultFormTransformer(issues) : defaultFieldTransformer(issues);
|
|
23
|
+
const standardSchemaValidators = {
|
|
24
|
+
validate({ value, validationSource }, schema) {
|
|
25
|
+
const result = schema["~standard"].validate(value);
|
|
26
|
+
if (result instanceof Promise) {
|
|
27
|
+
throw new Error("async function passed to sync validator");
|
|
28
|
+
}
|
|
29
|
+
if (!result.issues) return;
|
|
30
|
+
return transformIssues(validationSource, result.issues);
|
|
31
|
+
},
|
|
32
|
+
async validateAsync({ value, validationSource }, schema) {
|
|
33
|
+
const result = await schema["~standard"].validate(value);
|
|
34
|
+
if (!result.issues) return;
|
|
35
|
+
return transformIssues(validationSource, result.issues);
|
|
36
|
+
}
|
|
37
|
+
};
|
|
45
38
|
const isStandardSchemaValidator = (validator) => !!validator && "~standard" in validator;
|
|
46
39
|
exports.isStandardSchemaValidator = isStandardSchemaValidator;
|
|
47
|
-
exports.
|
|
40
|
+
exports.standardSchemaValidators = standardSchemaValidators;
|
|
48
41
|
//# sourceMappingURL=standardSchemaValidator.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"standardSchemaValidator.cjs","sources":["../../src/standardSchemaValidator.ts"],"sourcesContent":["import type {
|
|
1
|
+
{"version":3,"file":"standardSchemaValidator.cjs","sources":["../../src/standardSchemaValidator.ts"],"sourcesContent":["import type { ValidationSource } from './types'\n\nexport type TStandardSchemaValidatorValue<TData> = {\n value: TData\n validationSource: ValidationSource\n}\n\nfunction prefixSchemaToErrors(issues: readonly StandardSchemaV1Issue[]) {\n const schema = new Map<string, StandardSchemaV1Issue[]>()\n\n for (const issue of issues) {\n const path = [...(issue.path ?? [])]\n .map((segment) => {\n const normalizedSegment =\n typeof segment === 'object' ? segment.key : segment\n return typeof normalizedSegment === 'number'\n ? `[${normalizedSegment}]`\n : normalizedSegment\n })\n .join('.')\n .replace(/\\.\\[/g, '[')\n\n schema.set(path, (schema.get(path) ?? []).concat(issue))\n }\n\n return Object.fromEntries(schema)\n}\n\nconst defaultFieldTransformer = (issues: readonly StandardSchemaV1Issue[]) =>\n issues\n\nconst defaultFormTransformer = (issues: readonly StandardSchemaV1Issue[]) => {\n const schemaErrors = prefixSchemaToErrors(issues)\n return {\n form: schemaErrors,\n fields: schemaErrors,\n }\n}\n\nconst transformIssues = (\n validationSource: 'form' | 'field',\n issues: readonly StandardSchemaV1Issue[],\n) =>\n validationSource === 'form'\n ? defaultFormTransformer(issues)\n : defaultFieldTransformer(issues)\n\nexport const standardSchemaValidators = {\n validate(\n { value, validationSource }: TStandardSchemaValidatorValue<unknown>,\n schema: StandardSchemaV1,\n ) {\n const result = schema['~standard'].validate(value)\n\n if (result instanceof Promise) {\n throw new Error('async function passed to sync validator')\n }\n\n if (!result.issues) return\n\n return transformIssues(validationSource, result.issues)\n },\n async validateAsync(\n { value, validationSource }: TStandardSchemaValidatorValue<unknown>,\n schema: StandardSchemaV1,\n ) {\n const result = await schema['~standard'].validate(value)\n\n if (!result.issues) return\n\n return transformIssues(validationSource, result.issues)\n },\n}\n\nexport const isStandardSchemaValidator = (\n validator: unknown,\n): validator is StandardSchemaV1 =>\n !!validator && '~standard' in (validator as object)\n\n/**\n * The Standard Schema interface.\n */\nexport type StandardSchemaV1<Input = unknown, Output = Input> = {\n /**\n * The Standard Schema properties.\n */\n readonly '~standard': StandardSchemaV1Props<Input, Output>\n}\n\n/**\n * The Standard Schema properties interface.\n */\ninterface StandardSchemaV1Props<Input = unknown, Output = Input> {\n /**\n * The version number of the standard.\n */\n readonly version: 1\n /**\n * The vendor name of the schema library.\n */\n readonly vendor: string\n /**\n * Validates unknown input values.\n */\n readonly validate: (\n value: unknown,\n ) => StandardSchemaV1Result<Output> | Promise<StandardSchemaV1Result<Output>>\n /**\n * Inferred types associated with the schema.\n */\n readonly types?: StandardSchemaV1Types<Input, Output> | undefined\n}\n/**\n * The result interface of the validate function.\n */\ntype StandardSchemaV1Result<Output> =\n | StandardSchemaV1SuccessResult<Output>\n | StandardSchemaV1FailureResult\n/**\n * The result interface if validation succeeds.\n */\ninterface StandardSchemaV1SuccessResult<Output> {\n /**\n * The typed output value.\n */\n readonly value: Output\n /**\n * The non-existent issues.\n */\n readonly issues?: undefined\n}\n/**\n * The result interface if validation fails.\n */\ninterface StandardSchemaV1FailureResult {\n /**\n * The issues of failed validation.\n */\n readonly issues: ReadonlyArray<StandardSchemaV1Issue>\n}\n/**\n * The issue interface of the failure output.\n */\nexport interface StandardSchemaV1Issue {\n /**\n * The error message of the issue.\n */\n readonly message: string\n /**\n * The path of the issue, if any.\n */\n readonly path?:\n | ReadonlyArray<PropertyKey | StandardSchemaV1PathSegment>\n | undefined\n}\n/**\n * The path segment interface of the issue.\n */\ninterface StandardSchemaV1PathSegment {\n /**\n * The key representing a path segment.\n */\n readonly key: PropertyKey\n}\n/**\n * The Standard Schema types interface.\n */\ninterface StandardSchemaV1Types<Input = unknown, Output = Input> {\n /**\n * The input type of the schema.\n */\n readonly input: Input\n /**\n * The output type of the schema.\n */\n readonly output: Output\n}\n"],"names":[],"mappings":";;AAOA,SAAS,qBAAqB,QAA0C;AAChE,QAAA,6BAAa,IAAqC;AAExD,aAAW,SAAS,QAAQ;AACpB,UAAA,OAAO,CAAC,GAAI,MAAM,QAAQ,CAAA,CAAG,EAChC,IAAI,CAAC,YAAY;AAChB,YAAM,oBACJ,OAAO,YAAY,WAAW,QAAQ,MAAM;AAC9C,aAAO,OAAO,sBAAsB,WAChC,IAAI,iBAAiB,MACrB;AAAA,IAAA,CACL,EACA,KAAK,GAAG,EACR,QAAQ,SAAS,GAAG;AAEhB,WAAA,IAAI,OAAO,OAAO,IAAI,IAAI,KAAK,CAAC,GAAG,OAAO,KAAK,CAAC;AAAA,EAAA;AAGlD,SAAA,OAAO,YAAY,MAAM;AAClC;AAEA,MAAM,0BAA0B,CAAC,WAC/B;AAEF,MAAM,yBAAyB,CAAC,WAA6C;AACrE,QAAA,eAAe,qBAAqB,MAAM;AACzC,SAAA;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,EACV;AACF;AAEA,MAAM,kBAAkB,CACtB,kBACA,WAEA,qBAAqB,SACjB,uBAAuB,MAAM,IAC7B,wBAAwB,MAAM;AAE7B,MAAM,2BAA2B;AAAA,EACtC,SACE,EAAE,OAAO,iBAAA,GACT,QACA;AACA,UAAM,SAAS,OAAO,WAAW,EAAE,SAAS,KAAK;AAEjD,QAAI,kBAAkB,SAAS;AACvB,YAAA,IAAI,MAAM,yCAAyC;AAAA,IAAA;AAGvD,QAAA,CAAC,OAAO,OAAQ;AAEb,WAAA,gBAAgB,kBAAkB,OAAO,MAAM;AAAA,EACxD;AAAA,EACA,MAAM,cACJ,EAAE,OAAO,iBAAA,GACT,QACA;AACA,UAAM,SAAS,MAAM,OAAO,WAAW,EAAE,SAAS,KAAK;AAEnD,QAAA,CAAC,OAAO,OAAQ;AAEb,WAAA,gBAAgB,kBAAkB,OAAO,MAAM;AAAA,EAAA;AAE1D;AAEO,MAAM,4BAA4B,CACvC,cAEA,CAAC,CAAC,aAAa,eAAgB;;;"}
|