@tanstack/form-core 0.42.0 → 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.
Files changed (55) hide show
  1. package/dist/cjs/FieldApi.cjs +17 -28
  2. package/dist/cjs/FieldApi.cjs.map +1 -1
  3. package/dist/cjs/FieldApi.d.cts +91 -79
  4. package/dist/cjs/FormApi.cjs +50 -53
  5. package/dist/cjs/FormApi.cjs.map +1 -1
  6. package/dist/cjs/FormApi.d.cts +74 -67
  7. package/dist/cjs/formOptions.cjs.map +1 -1
  8. package/dist/cjs/formOptions.d.cts +2 -3
  9. package/dist/cjs/index.cjs +2 -1
  10. package/dist/cjs/index.cjs.map +1 -1
  11. package/dist/cjs/mergeForm.cjs +33 -9
  12. package/dist/cjs/mergeForm.cjs.map +1 -1
  13. package/dist/cjs/mergeForm.d.cts +2 -3
  14. package/dist/cjs/metaHelper.cjs.map +1 -1
  15. package/dist/cjs/metaHelper.d.cts +2 -3
  16. package/dist/cjs/standardSchemaValidator.cjs +24 -31
  17. package/dist/cjs/standardSchemaValidator.cjs.map +1 -1
  18. package/dist/cjs/standardSchemaValidator.d.cts +24 -4
  19. package/dist/cjs/types.d.cts +15 -27
  20. package/dist/cjs/util-types.d.cts +1 -0
  21. package/dist/cjs/utils.cjs +4 -0
  22. package/dist/cjs/utils.cjs.map +1 -1
  23. package/dist/cjs/utils.d.cts +4 -3
  24. package/dist/esm/FieldApi.d.ts +91 -79
  25. package/dist/esm/FieldApi.js +18 -29
  26. package/dist/esm/FieldApi.js.map +1 -1
  27. package/dist/esm/FormApi.d.ts +74 -67
  28. package/dist/esm/FormApi.js +52 -55
  29. package/dist/esm/FormApi.js.map +1 -1
  30. package/dist/esm/formOptions.d.ts +2 -3
  31. package/dist/esm/formOptions.js.map +1 -1
  32. package/dist/esm/index.js +4 -3
  33. package/dist/esm/mergeForm.d.ts +2 -3
  34. package/dist/esm/mergeForm.js +33 -9
  35. package/dist/esm/mergeForm.js.map +1 -1
  36. package/dist/esm/metaHelper.d.ts +2 -3
  37. package/dist/esm/metaHelper.js.map +1 -1
  38. package/dist/esm/standardSchemaValidator.d.ts +24 -4
  39. package/dist/esm/standardSchemaValidator.js +24 -31
  40. package/dist/esm/standardSchemaValidator.js.map +1 -1
  41. package/dist/esm/types.d.ts +15 -27
  42. package/dist/esm/util-types.d.ts +1 -0
  43. package/dist/esm/utils.d.ts +4 -3
  44. package/dist/esm/utils.js +4 -0
  45. package/dist/esm/utils.js.map +1 -1
  46. package/package.json +2 -2
  47. package/src/FieldApi.ts +803 -273
  48. package/src/FormApi.ts +613 -183
  49. package/src/formOptions.ts +26 -4
  50. package/src/mergeForm.ts +63 -26
  51. package/src/metaHelper.ts +28 -6
  52. package/src/standardSchemaValidator.ts +47 -58
  53. package/src/types.ts +39 -34
  54. package/src/util-types.ts +2 -0
  55. package/src/utils.ts +15 -9
@@ -1,26 +1,30 @@
1
1
  import { Derived, Store } from '@tanstack/store';
2
- import { StandardSchemaV1 } from './standardSchemaValidator.cjs';
3
- import { FieldApi, FieldMeta, FieldMetaBase } from './FieldApi.cjs';
4
- import { FormValidationError, FormValidationErrorMap, UpdateMetaOptions, ValidationCause, ValidationError, ValidationErrorMap, ValidationErrorMapKeys, ValidationSource, Validator } from './types.cjs';
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
- export type FieldsErrorMapFromValidator<TFormData> = Partial<Record<DeepKeys<TFormData>, ValidationErrorMap>>;
8
- export type FormValidateFn<TFormData, TFormValidator extends Validator<TFormData, unknown> | undefined = undefined> = (props: {
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, TFormValidator>;
11
- }) => FormValidationError<TFormData>;
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, TFormValidator extends Validator<TFormData, unknown> | undefined = undefined> = TFormValidator extends Validator<TFormData, infer TFN> ? TFN | FormValidateFn<TFormData, TFormValidator> : FormValidateFn<TFormData, TFormValidator> | StandardSchemaV1<TFormData, unknown>;
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, TFormValidator extends Validator<TFormData, unknown> | undefined = undefined> = (props: {
23
+ export type FormValidateAsyncFn<TFormData> = (props: {
20
24
  value: TFormData;
21
- formApi: FormApi<TFormData, TFormValidator>;
25
+ formApi: FormApi<TFormData, any, any, any, any, any, any, any, any>;
22
26
  signal: AbortSignal;
23
- }) => FormValidationError<TFormData> | Promise<FormValidationError<TFormData>>;
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, TFormValidator extends Validator<TFormData, unknown> | undefined = undefined> = TFormValidator extends Validator<TFormData, infer FFN> ? FFN | FormValidateAsyncFn<TFormData, TFormValidator> : FormValidateAsyncFn<TFormData, TFormValidator> | StandardSchemaV1<TFormData, unknown>;
36
- export interface FormValidators<TFormData, TFormValidator extends Validator<TFormData, unknown> | undefined = undefined> {
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?: FormValidateOrFn<TFormData, TFormValidator>;
45
+ onMount?: TOnMount;
41
46
  /**
42
47
  * Optional function that checks the validity of your data whenever a value changes
43
48
  */
44
- onChange?: FormValidateOrFn<TFormData, TFormValidator>;
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?: FormAsyncValidateOrFn<TFormData, TFormValidator>;
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?: FormValidateOrFn<TFormData, TFormValidator>;
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?: FormAsyncValidateOrFn<TFormData, TFormValidator>;
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?: FormValidateOrFn<TFormData, TFormValidator>;
66
- onSubmitAsync?: FormAsyncValidateOrFn<TFormData, TFormValidator>;
70
+ onSubmit?: TOnSubmit;
71
+ onSubmitAsync?: TOnSubmitAsync;
67
72
  }
68
73
  /**
69
74
  * @private
70
75
  */
71
- export interface FormTransform<TFormData, TFormValidator extends Validator<TFormData, unknown> | undefined = undefined> {
72
- fn: (formBase: FormApi<TFormData, TFormValidator>) => FormApi<TFormData, TFormValidator>;
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, TFormValidator extends Validator<TFormData, unknown> | undefined = undefined> {
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, TFormValidator>;
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, TFormValidator>;
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, TFormValidator>;
116
+ formApi: FormApi<TFormData, TOnMount, TOnChange, TOnChangeAsync, TOnBlur, TOnBlurAsync, TOnSubmit, TOnSubmitAsync, TOnServer>;
116
117
  }) => void;
117
- transform?: FormTransform<TFormData, TFormValidator>;
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, TFormValidator extends Validator<TFormData, unknown> | undefined = undefined> = {
132
+ export type FieldInfo<TFormData> = {
132
133
  /**
133
134
  * An instance of the FieldAPI.
134
135
  */
135
- instance: FieldApi<TFormData, any, Validator<unknown, unknown> | undefined, TFormValidator> | null;
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>, FieldMetaBase>;
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: ValidationError[];
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>, FieldMeta>;
236
+ fieldMeta: Record<DeepKeys<TFormData>, AnyFieldMeta>;
236
237
  };
237
- export type FormState<TFormData> = BaseFormState<TFormData> & DerivedFormState<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, TFormValidator extends Validator<TFormData, unknown> | undefined = undefined> {
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, TFormValidator>;
250
- baseStore: Store<BaseFormState<TFormData>>;
251
- fieldMetaDerived: Derived<Record<DeepKeys<TFormData>, FieldMeta>>;
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, TFormValidator>>;
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, TFormValidator>);
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
- value: TFormData;
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, TFormValidator> : FormAsyncValidateOrFn<TFormData, TFormValidator>;
280
+ validate: TType extends 'validate' ? FormValidateOrFn<TFormData> : FormAsyncValidateOrFn<TFormData>;
275
281
  value: TValue;
276
282
  type: TType;
277
- }): ReturnType<ReturnType<Validator<any>>[TType]>;
283
+ }): unknown;
278
284
  mount: () => () => void;
279
285
  /**
280
286
  * Updates the form options and form state.
281
287
  */
282
- update: (options?: FormOptions<TFormData, TFormValidator>) => void;
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<ValidationError[]>;
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<ValidationError[]>;
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) => ValidationError[] | Promise<ValidationError[]>;
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: FieldsErrorMapFromValidator<TFormData>;
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<FieldsErrorMapFromValidator<TFormData>>;
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) => FieldsErrorMapFromValidator<TFormData> | Promise<FieldsErrorMapFromValidator<TFormData>>;
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) => FieldMeta | undefined;
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, TFormValidator>;
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<FieldMeta>) => void;
341
- resetFieldMeta: <TField extends DeepKeys<TFormData>>(fieldMeta: Record<TField, FieldMeta>) => Record<TField, FieldMeta>;
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 { Validator } from './types'\nimport type { FormOptions } from './FormApi'\n\nexport function formOptions<\n TFormData,\n TFormValidator extends Validator<TFormData, unknown> | undefined = undefined,\n>(defaultOpts?: FormOptions<TFormData, TFormValidator>) {\n return defaultOpts\n}\n"],"names":[],"mappings":";;AAGO,SAAS,YAGd,aAAsD;AAC/C,SAAA;AACT;;"}
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 { Validator } from './types.cjs';
2
- import { FormOptions } from './FormApi.cjs';
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;
@@ -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.standardSchemaValidator = standardSchemaValidator.standardSchemaValidator;
25
+ exports.standardSchemaValidators = standardSchemaValidator.standardSchemaValidators;
25
26
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,22 +1,46 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ function isValidKey(key) {
4
+ const dangerousProps = ["__proto__", "constructor", "prototype"];
5
+ return !dangerousProps.includes(String(key));
6
+ }
3
7
  function mutateMergeDeep(target, source) {
8
+ if (target === null || target === void 0 || typeof target !== "object")
9
+ return {};
10
+ if (source === null || source === void 0 || typeof source !== "object")
11
+ return target;
4
12
  const targetKeys = Object.keys(target);
5
13
  const sourceKeys = Object.keys(source);
6
14
  const keySet = /* @__PURE__ */ new Set([...targetKeys, ...sourceKeys]);
7
15
  for (const key of keySet) {
16
+ if (!isValidKey(key)) continue;
8
17
  const targetKey = key;
9
18
  const sourceKey = key;
10
- if (Array.isArray(target[targetKey]) && Array.isArray(source[sourceKey])) {
11
- target[targetKey] = source[sourceKey];
12
- } else if (typeof target[targetKey] === "object" && typeof source[sourceKey] === "object") {
13
- mutateMergeDeep(target[targetKey], source[sourceKey]);
14
- } else {
15
- if (!(sourceKey in source) && source[sourceKey] === void 0) {
16
- continue;
17
- }
18
- target[targetKey] = source[sourceKey];
19
+ if (!Object.hasOwn(source, sourceKey)) continue;
20
+ const sourceValue = source[sourceKey];
21
+ const targetValue = target[targetKey];
22
+ if (Array.isArray(targetValue) && Array.isArray(sourceValue)) {
23
+ Object.defineProperty(target, key, {
24
+ value: [...sourceValue],
25
+ enumerable: true,
26
+ writable: true,
27
+ configurable: true
28
+ });
29
+ continue;
30
+ }
31
+ const isTargetObj = typeof targetValue === "object" && targetValue !== null;
32
+ const isSourceObj = typeof sourceValue === "object" && sourceValue !== null;
33
+ const areObjects = isTargetObj && isSourceObj && !Array.isArray(targetValue) && !Array.isArray(sourceValue);
34
+ if (areObjects) {
35
+ mutateMergeDeep(targetValue, sourceValue);
36
+ continue;
19
37
  }
38
+ Object.defineProperty(target, key, {
39
+ value: sourceValue,
40
+ enumerable: true,
41
+ writable: true,
42
+ configurable: true
43
+ });
20
44
  }
21
45
  return target;
22
46
  }
@@ -1 +1 @@
1
- {"version":3,"file":"mergeForm.cjs","sources":["../../src/mergeForm.ts"],"sourcesContent":["import type { FormApi } from './FormApi'\nimport type { Validator } from './types'\nimport type { NoInfer } from './util-types'\n\n/**\n * @private\n */\nexport function mutateMergeDeep(target: object, source: object): object {\n const targetKeys = Object.keys(target)\n const sourceKeys = Object.keys(source)\n const keySet = new Set([...targetKeys, ...sourceKeys])\n for (const key of keySet) {\n const targetKey = key as never as keyof typeof target\n const sourceKey = key as never as keyof typeof source\n\n if (Array.isArray(target[targetKey]) && Array.isArray(source[sourceKey])) {\n // always use the source array to prevent array fields from multiplying\n target[targetKey] = source[sourceKey] as [] as never\n } else if (\n typeof target[targetKey] === 'object' &&\n typeof source[sourceKey] === 'object'\n ) {\n mutateMergeDeep(target[targetKey] as {}, source[sourceKey] as {})\n } else {\n // Prevent assigning undefined to target, only if undefined is not explicitly set on source\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!(sourceKey in source) && source[sourceKey] === undefined) {\n continue\n }\n target[targetKey] = source[sourceKey] as never\n }\n }\n return target\n}\n\nexport function mergeForm<\n TFormData,\n TFormValidator extends Validator<TFormData, unknown> | undefined = undefined,\n>(\n baseForm: FormApi<NoInfer<TFormData>, NoInfer<TFormValidator>>,\n state: Partial<FormApi<TFormData, TFormValidator>['state']>,\n) {\n mutateMergeDeep(baseForm.state, state)\n return baseForm\n}\n"],"names":[],"mappings":";;AAOgB,SAAA,gBAAgB,QAAgB,QAAwB;AAChE,QAAA,aAAa,OAAO,KAAK,MAAM;AAC/B,QAAA,aAAa,OAAO,KAAK,MAAM;AAC/B,QAAA,6BAAa,IAAI,CAAC,GAAG,YAAY,GAAG,UAAU,CAAC;AACrD,aAAW,OAAO,QAAQ;AACxB,UAAM,YAAY;AAClB,UAAM,YAAY;AAEd,QAAA,MAAM,QAAQ,OAAO,SAAS,CAAC,KAAK,MAAM,QAAQ,OAAO,SAAS,CAAC,GAAG;AAEjE,aAAA,SAAS,IAAI,OAAO,SAAS;AAAA,IAAA,WAEpC,OAAO,OAAO,SAAS,MAAM,YAC7B,OAAO,OAAO,SAAS,MAAM,UAC7B;AACA,sBAAgB,OAAO,SAAS,GAAS,OAAO,SAAS,CAAO;AAAA,IAAA,OAC3D;AAGL,UAAI,EAAE,aAAa,WAAW,OAAO,SAAS,MAAM,QAAW;AAC7D;AAAA,MAAA;AAEK,aAAA,SAAS,IAAI,OAAO,SAAS;AAAA,IAAA;AAAA,EACtC;AAEK,SAAA;AACT;AAEgB,SAAA,UAId,UACA,OACA;AACgB,kBAAA,SAAS,OAAO,KAAK;AAC9B,SAAA;AACT;;;"}
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;;;"}
@@ -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
- export declare function mutateMergeDeep(target: object, source: object): object;
8
- export declare function mergeForm<TFormData, TFormValidator extends Validator<TFormData, unknown> | undefined = undefined>(baseForm: FormApi<NoInfer<TFormData>, NoInfer<TFormValidator>>, state: Partial<FormApi<TFormData, TFormValidator>['state']>): FormApi<NoInfer<TFormData>, NoInfer<TFormValidator>>;
6
+ export declare function mutateMergeDeep(target: object | null | undefined, source: object | null | undefined): object;
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 { FieldMeta } from './FieldApi'\nimport type { FormApi } from './FormApi'\nimport type { Validator } from './types'\nimport type { DeepKeys } from './util-types'\n\ntype ArrayFieldMode = 'insert' | 'remove' | 'swap' | 'move'\n\nexport function metaHelper<\n TFormData,\n TFormValidator extends Validator<TFormData, unknown> | undefined = undefined,\n>(formApi: FormApi<TFormData, TFormValidator>) {\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 = (): FieldMeta => ({\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
+ {"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, TFormValidator extends Validator<TFormData, unknown> | undefined = undefined>(formApi: FormApi<TFormData, TFormValidator>): {
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, transformErrors) {
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
- const transformedSchema = {};
13
- schema.forEach((value, key) => {
14
- transformedSchema[key] = transformErrors(value);
15
- });
16
- return transformedSchema;
12
+ return Object.fromEntries(schema);
17
13
  }
18
- function defaultFormTransformer(transformErrors) {
19
- return (issues) => ({
20
- form: transformErrors(issues),
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
- validate({ value, validationSource }, fn) {
29
- const result = fn["~standard"].validate(value);
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.standardSchemaValidator = standardSchemaValidator;
40
+ exports.standardSchemaValidators = standardSchemaValidators;
48
41
  //# sourceMappingURL=standardSchemaValidator.cjs.map