@tanstack/form-core 0.10.3 → 0.11.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/build/legacy/FieldApi.cjs +91 -118
  2. package/build/legacy/FieldApi.cjs.map +1 -1
  3. package/build/legacy/FieldApi.d.cts +1 -2
  4. package/build/legacy/FieldApi.d.ts +1 -2
  5. package/build/legacy/FieldApi.js +91 -118
  6. package/build/legacy/FieldApi.js.map +1 -1
  7. package/build/legacy/FormApi.cjs +125 -118
  8. package/build/legacy/FormApi.cjs.map +1 -1
  9. package/build/legacy/FormApi.d.cts +1 -2
  10. package/build/legacy/FormApi.d.ts +1 -2
  11. package/build/legacy/FormApi.js +127 -118
  12. package/build/legacy/FormApi.js.map +1 -1
  13. package/build/legacy/index.d.cts +160 -73
  14. package/build/legacy/index.d.ts +160 -73
  15. package/build/legacy/types.cjs.map +1 -1
  16. package/build/legacy/types.d.cts +12 -3
  17. package/build/legacy/types.d.ts +12 -3
  18. package/build/legacy/utils.cjs +55 -0
  19. package/build/legacy/utils.cjs.map +1 -1
  20. package/build/legacy/utils.d.cts +3 -37
  21. package/build/legacy/utils.d.ts +3 -37
  22. package/build/legacy/utils.js +53 -0
  23. package/build/legacy/utils.js.map +1 -1
  24. package/build/modern/FieldApi.cjs +91 -116
  25. package/build/modern/FieldApi.cjs.map +1 -1
  26. package/build/modern/FieldApi.d.cts +1 -2
  27. package/build/modern/FieldApi.d.ts +1 -2
  28. package/build/modern/FieldApi.js +91 -116
  29. package/build/modern/FieldApi.js.map +1 -1
  30. package/build/modern/FormApi.cjs +125 -117
  31. package/build/modern/FormApi.cjs.map +1 -1
  32. package/build/modern/FormApi.d.cts +1 -2
  33. package/build/modern/FormApi.d.ts +1 -2
  34. package/build/modern/FormApi.js +127 -117
  35. package/build/modern/FormApi.js.map +1 -1
  36. package/build/modern/index.d.cts +160 -73
  37. package/build/modern/index.d.ts +160 -73
  38. package/build/modern/types.cjs.map +1 -1
  39. package/build/modern/types.d.cts +12 -3
  40. package/build/modern/types.d.ts +12 -3
  41. package/build/modern/utils.cjs +55 -0
  42. package/build/modern/utils.cjs.map +1 -1
  43. package/build/modern/utils.d.cts +3 -37
  44. package/build/modern/utils.d.ts +3 -37
  45. package/build/modern/utils.js +53 -0
  46. package/build/modern/utils.js.map +1 -1
  47. package/package.json +1 -1
  48. package/src/FieldApi.ts +308 -231
  49. package/src/FormApi.ts +259 -209
  50. package/src/tests/FieldApi.spec.ts +135 -48
  51. package/src/tests/FieldApi.test-d.ts +10 -6
  52. package/src/tests/FormApi.spec.ts +170 -62
  53. package/src/tests/utils.ts +1 -1
  54. package/src/types.ts +10 -2
  55. package/src/utils.ts +106 -0
@@ -1,49 +1,114 @@
1
1
  import { Store } from '@tanstack/store';
2
- import { DeepKeys, DeepValue, Updater } from './utils.js';
3
- export { Narrow, Pretty, RequiredByKey, UpdaterFn, deleteBy, functionalUpdate, getBy, isNonEmptyArray, setBy } from './utils.js';
4
- import { ValidationError, Validator } from './types.js';
2
+ import { ValidationCause, Validator, ValidationError, ValidationErrorMapKeys, ValidationErrorMap } from './types.js';
5
3
 
6
- type ValidateFn$1<TData, ValidatorType> = (values: TData, formApi: FormApi<TData, ValidatorType>) => ValidationError;
7
- type ValidateOrFn$1<TData, ValidatorType> = ValidatorType extends Validator<TData> ? Parameters<ReturnType<ValidatorType>['validate']>[1] : ValidateFn$1<TData, ValidatorType>;
8
- type ValidateAsyncFn$1<TData, ValidatorType> = (value: TData, fieldApi: FormApi<TData, ValidatorType>) => ValidationError | Promise<ValidationError>;
9
- type FormOptions<TData, ValidatorType> = {
10
- defaultValues?: TData;
11
- defaultState?: Partial<FormState<TData>>;
12
- asyncAlways?: boolean;
4
+ type UpdaterFn<TInput, TOutput = TInput> = (input: TInput) => TOutput;
5
+ type Updater<TInput, TOutput = TInput> = TOutput | UpdaterFn<TInput, TOutput>;
6
+ declare function functionalUpdate<TInput, TOutput = TInput>(updater: Updater<TInput, TOutput>, input: TInput): TOutput;
7
+ /**
8
+ * Get a value from an object using a path, including dot notation.
9
+ */
10
+ declare function getBy(obj: any, path: any): any;
11
+ /**
12
+ * Set a value on an object using a path, including dot notation.
13
+ */
14
+ declare function setBy(obj: any, _path: any, updater: Updater<any>): any;
15
+ /**
16
+ * Delete a field on an object using a path, including dot notation.
17
+ */
18
+ declare function deleteBy(obj: any, _path: any): any;
19
+ declare function isNonEmptyArray(obj: any): boolean;
20
+ interface AsyncValidatorArrayPartialOptions<T> {
21
+ validators?: T;
13
22
  asyncDebounceMs?: number;
14
- validator?: ValidatorType;
15
- onMount?: ValidateOrFn$1<TData, ValidatorType>;
16
- onChange?: ValidateOrFn$1<TData, ValidatorType>;
17
- onChangeAsync?: ValidateAsyncFn$1<TData, ValidatorType>;
23
+ }
24
+ interface AsyncValidator<T> {
25
+ cause: ValidationCause;
26
+ validate: T;
27
+ debounceMs: number;
28
+ }
29
+ declare function getAsyncValidatorArray<T>(cause: ValidationCause, options: AsyncValidatorArrayPartialOptions<T>): T extends FieldValidators<any, any> ? Array<AsyncValidator<T['onChangeAsync'] | T['onBlurAsync'] | T['onSubmitAsync']>> : T extends FormValidators<any, any> ? Array<AsyncValidator<T['onChangeAsync'] | T['onBlurAsync'] | T['onSubmitAsync']>> : never;
30
+ interface SyncValidatorArrayPartialOptions<T> {
31
+ validators?: T;
32
+ }
33
+ interface SyncValidator<T> {
34
+ cause: ValidationCause;
35
+ validate: T;
36
+ }
37
+ declare function getSyncValidatorArray<T>(cause: ValidationCause, options: SyncValidatorArrayPartialOptions<T>): T extends FieldValidators<any, any> ? Array<SyncValidator<T['onChange'] | T['onBlur'] | T['onSubmit']>> : T extends FormValidators<any, any> ? Array<SyncValidator<T['onChange'] | T['onBlur'] | T['onSubmit']>> : never;
38
+ type RequiredByKey<T, K extends keyof T> = Omit<T, K> & Required<Pick<T, K>>;
39
+ type ComputeRange<N extends number, Result extends Array<unknown> = []> = Result['length'] extends N ? Result : ComputeRange<N, [...Result, Result['length']]>;
40
+ type Index40 = ComputeRange<40>[number];
41
+ type IsTuple<T> = T extends readonly any[] & {
42
+ length: infer Length;
43
+ } ? Length extends Index40 ? T : never : never;
44
+ type AllowedIndexes<Tuple extends ReadonlyArray<any>, Keys extends number = never> = Tuple extends readonly [] ? Keys : Tuple extends readonly [infer _, ...infer Tail] ? AllowedIndexes<Tail, Keys | Tail['length']> : Keys;
45
+ type DeepKeys<T, TDepth extends any[] = []> = TDepth['length'] extends 5 ? never : unknown extends T ? string : object extends T ? string : T extends readonly any[] & IsTuple<T> ? AllowedIndexes<T> | DeepKeysPrefix<T, AllowedIndexes<T>, TDepth> : T extends any[] ? DeepKeys<T[number], [...TDepth, any]> : T extends Date ? never : T extends object ? (keyof T & string) | DeepKeysPrefix<T, keyof T, TDepth> : never;
46
+ type DeepKeysPrefix<T, TPrefix, TDepth extends any[]> = TPrefix extends keyof T & (number | string) ? `${TPrefix}.${DeepKeys<T[TPrefix], [...TDepth, any]> & string}` : never;
47
+ type DeepValue<T, TProp> = T extends Record<string | number, any> ? TProp extends `${infer TBranch}.${infer TDeepProp}` ? DeepValue<T[TBranch], TDeepProp> : T[TProp & string] : never;
48
+ type Narrowable = string | number | bigint | boolean;
49
+ type NarrowRaw<A> = (A extends [] ? [] : never) | (A extends Narrowable ? A : never) | {
50
+ [K in keyof A]: A[K] extends Function ? A[K] : NarrowRaw<A[K]>;
51
+ };
52
+ type Narrow<A> = Try<A, [], NarrowRaw<A>>;
53
+ type Try<A1, A2, Catch = never> = A1 extends A2 ? A1 : Catch;
54
+ type Pretty<T> = {
55
+ [K in keyof T]: T[K];
56
+ } & {};
57
+
58
+ type FormValidateFn<TFormData, TFormValidator extends Validator<TFormData, unknown> | undefined = undefined> = (props: {
59
+ value: TFormData;
60
+ formApi: FormApi<TFormData, TFormValidator>;
61
+ }) => ValidationError;
62
+ type FormValidateOrFn<TFormData, TFormValidator extends Validator<TFormData, unknown> | undefined = undefined> = TFormValidator extends Validator<TFormData, infer TFN> ? TFN : FormValidateFn<TFormData, TFormValidator>;
63
+ type FormValidateAsyncFn<TFormData, TFormValidator extends Validator<TFormData, unknown> | undefined = undefined> = (props: {
64
+ value: TFormData;
65
+ formApi: FormApi<TFormData, TFormValidator>;
66
+ signal: AbortSignal;
67
+ }) => ValidationError | Promise<ValidationError>;
68
+ type FormAsyncValidateOrFn<TFormData, TFormValidator extends Validator<TFormData, unknown> | undefined = undefined> = TFormValidator extends Validator<TFormData, infer FFN> ? FFN | FormValidateAsyncFn<TFormData, TFormValidator> : FormValidateAsyncFn<TFormData, TFormValidator>;
69
+ interface FormValidators<TFormData, TFormValidator extends Validator<TFormData, unknown> | undefined = undefined> {
70
+ onMount?: FormValidateOrFn<TFormData, TFormValidator>;
71
+ onChange?: FormValidateOrFn<TFormData, TFormValidator>;
72
+ onChangeAsync?: FormAsyncValidateOrFn<TFormData, TFormValidator>;
18
73
  onChangeAsyncDebounceMs?: number;
19
- onBlur?: ValidateOrFn$1<TData, ValidatorType>;
20
- onBlurAsync?: ValidateAsyncFn$1<TData, ValidatorType>;
74
+ onBlur?: FormValidateOrFn<TFormData, TFormValidator>;
75
+ onBlurAsync?: FormAsyncValidateOrFn<TFormData, TFormValidator>;
21
76
  onBlurAsyncDebounceMs?: number;
22
- onSubmit?: (values: TData, formApi: FormApi<TData, ValidatorType>) => any | Promise<any>;
23
- onSubmitInvalid?: (values: TData, formApi: FormApi<TData, ValidatorType>) => void;
77
+ onSubmit?: FormValidateOrFn<TFormData, TFormValidator>;
78
+ onSubmitAsync?: FormAsyncValidateOrFn<TFormData, TFormValidator>;
79
+ onSubmitAsyncDebounceMs?: number;
80
+ }
81
+ type FormOptions<TFormData, TFormValidator extends Validator<TFormData, unknown> | undefined = undefined> = {
82
+ defaultValues?: TFormData;
83
+ defaultState?: Partial<FormState<TFormData>>;
84
+ asyncAlways?: boolean;
85
+ asyncDebounceMs?: number;
86
+ validatorAdapter?: TFormValidator;
87
+ validators?: FormValidators<TFormData, TFormValidator>;
88
+ onSubmit?: (props: {
89
+ value: TFormData;
90
+ formApi: FormApi<TFormData, TFormValidator>;
91
+ }) => any | Promise<any>;
92
+ onSubmitInvalid?: (props: {
93
+ value: TFormData;
94
+ formApi: FormApi<TFormData, TFormValidator>;
95
+ }) => void;
24
96
  };
25
- type FieldInfo<TFormData, ValidatorType> = {
26
- instances: Record<string, FieldApi<TFormData, any, unknown, ValidatorType>>;
27
- } & ValidationMeta;
28
97
  type ValidationMeta = {
29
- validationCount?: number;
30
- validationAsyncCount?: number;
31
- validationPromise?: Promise<ValidationError[] | undefined>;
32
- validationResolve?: (errors: ValidationError[] | undefined) => void;
33
- validationReject?: (errors: unknown) => void;
98
+ lastAbortController: AbortController;
34
99
  };
35
- type ValidationErrorMapKeys = `on${Capitalize<ValidationCause>}`;
36
- type ValidationErrorMap = {
37
- [K in ValidationErrorMapKeys]?: ValidationError;
100
+ type FieldInfo<TFormData, TFormValidator extends Validator<TFormData, unknown> | undefined = undefined> = {
101
+ instances: Record<string, FieldApi<TFormData, any, Validator<unknown, unknown> | undefined, TFormValidator>>;
102
+ validationMetaMap: Record<ValidationErrorMapKeys, ValidationMeta | undefined>;
38
103
  };
39
- type FormState<TData> = {
40
- values: TData;
104
+ type FormState<TFormData> = {
105
+ values: TFormData;
41
106
  isFormValidating: boolean;
42
- formValidationCount: number;
43
107
  isFormValid: boolean;
44
108
  errors: ValidationError[];
45
109
  errorMap: ValidationErrorMap;
46
- fieldMeta: Record<DeepKeys<TData>, FieldMeta>;
110
+ validationMetaMap: Record<ValidationErrorMapKeys, ValidationMeta | undefined>;
111
+ fieldMeta: Record<DeepKeys<TFormData>, FieldMeta>;
47
112
  isFieldsValidating: boolean;
48
113
  isFieldsValid: boolean;
49
114
  isSubmitting: boolean;
@@ -54,27 +119,33 @@ type FormState<TData> = {
54
119
  canSubmit: boolean;
55
120
  submissionAttempts: number;
56
121
  };
57
- declare class FormApi<TFormData, ValidatorType> {
58
- options: FormOptions<TFormData, ValidatorType>;
122
+ declare class FormApi<TFormData, TFormValidator extends Validator<TFormData, unknown> | undefined = undefined> {
123
+ options: FormOptions<TFormData, TFormValidator>;
59
124
  store: Store<FormState<TFormData>>;
60
125
  state: FormState<TFormData>;
61
- fieldInfo: Record<DeepKeys<TFormData>, FieldInfo<TFormData, ValidatorType>>;
62
- fieldName?: string;
63
- validationMeta: ValidationMeta;
64
- constructor(opts?: FormOptions<TFormData, ValidatorType>);
126
+ fieldInfo: Record<DeepKeys<TFormData>, FieldInfo<TFormData, TFormValidator>>;
127
+ constructor(opts?: FormOptions<TFormData, TFormValidator>);
128
+ runValidator<TValue extends {
129
+ value: TFormData;
130
+ formApi: FormApi<any, any>;
131
+ }, TType extends 'validate' | 'validateAsync'>(props: {
132
+ validate: TType extends 'validate' ? FormValidateOrFn<TFormData, TFormValidator> : FormAsyncValidateOrFn<TFormData, TFormValidator>;
133
+ value: TValue;
134
+ type: TType;
135
+ }): ReturnType<ReturnType<Validator<any>>[TType]>;
65
136
  mount: () => void;
66
- update: (options?: FormOptions<TFormData, ValidatorType>) => void;
137
+ update: (options?: FormOptions<TFormData, TFormValidator>) => void;
67
138
  reset: () => void;
68
- validateAllFields: (cause: ValidationCause) => Promise<ValidationError[][]>;
69
- validateSync: (cause: ValidationCause) => void;
70
- __leaseValidateAsync: () => number;
71
- cancelValidateAsync: () => void;
139
+ validateAllFields: (cause: ValidationCause) => Promise<ValidationError[]>;
140
+ validateSync: (cause: ValidationCause) => {
141
+ hasErrored: boolean;
142
+ };
72
143
  validateAsync: (cause: ValidationCause) => Promise<ValidationError[]>;
73
144
  validate: (cause: ValidationCause) => ValidationError[] | Promise<ValidationError[]>;
74
145
  handleSubmit: () => Promise<void>;
75
146
  getFieldValue: <TField extends DeepKeys<TFormData>>(field: TField) => DeepValue<TFormData, TField>;
76
147
  getFieldMeta: <TField extends DeepKeys<TFormData>>(field: TField) => FieldMeta | undefined;
77
- getFieldInfo: <TField extends DeepKeys<TFormData>>(field: TField) => FieldInfo<TFormData, ValidatorType>;
148
+ getFieldInfo: <TField extends DeepKeys<TFormData>>(field: TField) => FieldInfo<TFormData, TFormValidator>;
78
149
  setFieldMeta: <TField extends DeepKeys<TFormData>>(field: TField, updater: Updater<FieldMeta>) => void;
79
150
  setFieldValue: <TField extends DeepKeys<TFormData>>(field: TField, updater: Updater<DeepValue<TFormData, TField>>, opts?: {
80
151
  touch?: boolean;
@@ -92,32 +163,42 @@ declare class FormApi<TFormData, ValidatorType> {
92
163
  swapFieldValues: <TField extends DeepKeys<TFormData>>(field: TField, index1: number, index2: number) => void;
93
164
  }
94
165
 
95
- type ValidationCause = 'change' | 'blur' | 'submit' | 'mount';
96
- type ValidateFn<TParentData, TName extends DeepKeys<TParentData>, ValidatorType, TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>> = (value: TData, fieldApi: FieldApi<TParentData, TName, ValidatorType, TData>) => ValidationError;
97
- type ValidateOrFn<TParentData, TName extends DeepKeys<TParentData>, ValidatorType, FormValidator, TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>> = ValidatorType extends Validator<TData> ? Parameters<ReturnType<ValidatorType>['validate']>[1] | ValidateFn<TParentData, TName, ValidatorType, TData> : FormValidator extends Validator<TData> ? Parameters<ReturnType<FormValidator>['validate']>[1] | ValidateFn<TParentData, TName, ValidatorType, TData> : ValidateFn<TParentData, TName, ValidatorType, TData>;
98
- type ValidateAsyncFn<TParentData, TName extends DeepKeys<TParentData>, ValidatorType, TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>> = (value: TData, fieldApi: FieldApi<TParentData, TName, ValidatorType, TData>) => ValidationError | Promise<ValidationError>;
99
- type AsyncValidateOrFn<TParentData, TName extends DeepKeys<TParentData>, ValidatorType, FormValidator, TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>> = ValidatorType extends Validator<TData> ? Parameters<ReturnType<ValidatorType>['validate']>[1] | ValidateAsyncFn<TParentData, TName, ValidatorType, TData> : FormValidator extends Validator<TData> ? Parameters<ReturnType<FormValidator>['validate']>[1] | ValidateAsyncFn<TParentData, TName, ValidatorType, TData> : ValidateAsyncFn<TParentData, TName, ValidatorType, TData>;
100
- interface FieldOptions<TParentData, TName extends DeepKeys<TParentData>, ValidatorType, FormValidator, TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>> {
166
+ type FieldValidateFn<TParentData, TName extends DeepKeys<TParentData>, TFieldValidator extends Validator<DeepValue<TParentData, TName>, unknown> | undefined = undefined, TFormValidator extends Validator<TParentData, unknown> | undefined = undefined, TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>> = (props: {
167
+ value: TData;
168
+ fieldApi: FieldApi<TParentData, TName, TFieldValidator, TFormValidator, TData>;
169
+ }) => ValidationError;
170
+ type FieldValidateOrFn<TParentData, TName extends DeepKeys<TParentData>, TFieldValidator extends Validator<DeepValue<TParentData, TName>, unknown> | undefined = undefined, TFormValidator extends Validator<TParentData, unknown> | undefined = undefined, TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>> = TFieldValidator extends Validator<TData, infer TFN> ? TFN | FieldValidateFn<TParentData, TName, TFieldValidator, TFormValidator, TData> : TFormValidator extends Validator<TParentData, infer FFN> ? FFN | FieldValidateFn<TParentData, TName, TFieldValidator, TFormValidator, TData> : FieldValidateFn<TParentData, TName, TFieldValidator, TFormValidator, TData>;
171
+ type FieldValidateAsyncFn<TParentData, TName extends DeepKeys<TParentData>, TFieldValidator extends Validator<DeepValue<TParentData, TName>, unknown> | undefined = undefined, TFormValidator extends Validator<TParentData, unknown> | undefined = undefined, TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>> = (options: {
172
+ value: TData;
173
+ fieldApi: FieldApi<TParentData, TName, TFieldValidator, TFormValidator, TData>;
174
+ signal: AbortSignal;
175
+ }) => ValidationError | Promise<ValidationError>;
176
+ type FieldAsyncValidateOrFn<TParentData, TName extends DeepKeys<TParentData>, TFieldValidator extends Validator<DeepValue<TParentData, TName>, unknown> | undefined = undefined, TFormValidator extends Validator<TParentData, unknown> | undefined = undefined, TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>> = TFieldValidator extends Validator<TData, infer TFN> ? TFN | FieldValidateAsyncFn<TParentData, TName, TFieldValidator, TFormValidator, TData> : TFormValidator extends Validator<TParentData, infer FFN> ? FFN | FieldValidateAsyncFn<TParentData, TName, TFieldValidator, TFormValidator, TData> : FieldValidateAsyncFn<TParentData, TName, TFieldValidator, TFormValidator, TData>;
177
+ interface FieldValidators<TParentData, TName extends DeepKeys<TParentData>, TFieldValidator extends Validator<DeepValue<TParentData, TName>, unknown> | undefined = undefined, TFormValidator extends Validator<TParentData, unknown> | undefined = undefined, TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>> {
178
+ onMount?: FieldValidateOrFn<TParentData, TName, TFieldValidator, TFormValidator, TData>;
179
+ onChange?: FieldValidateOrFn<TParentData, TName, TFieldValidator, TFormValidator, TData>;
180
+ onChangeAsync?: FieldAsyncValidateOrFn<TParentData, TName, TFieldValidator, TFormValidator, TData>;
181
+ onChangeAsyncDebounceMs?: number;
182
+ onBlur?: FieldValidateOrFn<TParentData, TName, TFieldValidator, TFormValidator, TData>;
183
+ onBlurAsync?: FieldAsyncValidateOrFn<TParentData, TName, TFieldValidator, TFormValidator, TData>;
184
+ onBlurAsyncDebounceMs?: number;
185
+ onSubmit?: FieldValidateOrFn<TParentData, TName, TFieldValidator, TFormValidator, TData>;
186
+ onSubmitAsync?: FieldAsyncValidateOrFn<TParentData, TName, TFieldValidator, TFormValidator, TData>;
187
+ onSubmitAsyncDebounceMs?: number;
188
+ }
189
+ interface FieldOptions<TParentData, TName extends DeepKeys<TParentData>, TFieldValidator extends Validator<DeepValue<TParentData, TName>, unknown> | undefined = undefined, TFormValidator extends Validator<TParentData, unknown> | undefined = undefined, TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>> {
101
190
  name: TName;
102
191
  index?: TData extends any[] ? number : never;
103
192
  defaultValue?: TData;
104
193
  asyncDebounceMs?: number;
105
194
  asyncAlways?: boolean;
106
195
  preserveValue?: boolean;
107
- validator?: ValidatorType;
108
- onMount?: (formApi: FieldApi<TParentData, TName, ValidatorType, TData>) => void;
109
- onChange?: ValidateOrFn<TParentData, TName, ValidatorType, FormValidator, TData>;
110
- onChangeAsync?: AsyncValidateOrFn<TParentData, TName, ValidatorType, FormValidator, TData>;
111
- onChangeAsyncDebounceMs?: number;
112
- onBlur?: ValidateOrFn<TParentData, TName, ValidatorType, FormValidator, TData>;
113
- onBlurAsync?: AsyncValidateOrFn<TParentData, TName, ValidatorType, FormValidator, TData>;
114
- onBlurAsyncDebounceMs?: number;
115
- onSubmit?: ValidateOrFn<TParentData, TName, ValidatorType, FormValidator, TData>;
116
- onSubmitAsync?: AsyncValidateOrFn<TParentData, TName, ValidatorType, FormValidator, TData>;
196
+ validatorAdapter?: TFieldValidator;
197
+ validators?: FieldValidators<TParentData, TName, TFieldValidator, TFormValidator, TData>;
117
198
  defaultMeta?: Partial<FieldMeta>;
118
199
  }
119
- interface FieldApiOptions<TParentData, TName extends DeepKeys<TParentData>, ValidatorType, FormValidator, TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>> extends FieldOptions<TParentData, TName, ValidatorType, FormValidator, TData> {
120
- form: FormApi<TParentData, FormValidator>;
200
+ interface FieldApiOptions<TParentData, TName extends DeepKeys<TParentData>, TFieldValidator extends Validator<DeepValue<TParentData, TName>, unknown> | undefined = undefined, TFormValidator extends Validator<TParentData, unknown> | undefined = undefined, TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>> extends FieldOptions<TParentData, TName, TFieldValidator, TFormValidator, TData> {
201
+ form: FormApi<TParentData, TFormValidator>;
121
202
  }
122
203
  type FieldMeta = {
123
204
  isTouched: boolean;
@@ -131,17 +212,25 @@ type FieldState<TData> = {
131
212
  meta: FieldMeta;
132
213
  };
133
214
  type ResolveName<TParentData> = unknown extends TParentData ? string : DeepKeys<TParentData>;
134
- declare class FieldApi<TParentData, TName extends DeepKeys<TParentData>, ValidatorType, FormValidator, TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>> {
215
+ declare class FieldApi<TParentData, TName extends DeepKeys<TParentData>, TFieldValidator extends Validator<DeepValue<TParentData, TName>, unknown> | undefined = undefined, TFormValidator extends Validator<TParentData, unknown> | undefined = undefined, TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>> {
135
216
  uid: number;
136
- form: FieldApiOptions<TParentData, TName, ValidatorType, TData>['form'];
217
+ form: FieldApiOptions<TParentData, TName, TFieldValidator, TFormValidator, TData>['form'];
137
218
  name: DeepKeys<TParentData>;
138
- options: FieldApiOptions<TParentData, TName, ValidatorType, TData>;
219
+ options: FieldApiOptions<TParentData, TName, TFieldValidator, TFormValidator, TData>;
139
220
  store: Store<FieldState<TData>>;
140
221
  state: FieldState<TData>;
141
222
  prevState: FieldState<TData>;
142
- constructor(opts: FieldApiOptions<TParentData, TName, ValidatorType, FormValidator, TData>);
223
+ constructor(opts: FieldApiOptions<TParentData, TName, TFieldValidator, TFormValidator, TData>);
224
+ runValidator<TValue extends {
225
+ value: TData;
226
+ fieldApi: FieldApi<any, any, any, any>;
227
+ }, TType extends 'validate' | 'validateAsync'>(props: {
228
+ validate: TType extends 'validate' ? FieldValidateOrFn<any, any, any, any> : FieldAsyncValidateOrFn<any, any, any, any>;
229
+ value: TValue;
230
+ type: TType;
231
+ }): ReturnType<ReturnType<Validator<any>>[TType]>;
143
232
  mount: () => () => void;
144
- update: (opts: FieldApiOptions<TParentData, TName, ValidatorType, TData>) => void;
233
+ update: (opts: FieldApiOptions<TParentData, TName, TFieldValidator, TFormValidator, TData>) => void;
145
234
  getValue: () => TData;
146
235
  setValue: (updater: Updater<TData>, options?: {
147
236
  touch?: boolean;
@@ -150,21 +239,19 @@ declare class FieldApi<TParentData, TName extends DeepKeys<TParentData>, Validat
150
239
  _getMeta: () => FieldMeta | undefined;
151
240
  getMeta: () => FieldMeta;
152
241
  setMeta: (updater: Updater<FieldMeta>) => void;
153
- getInfo: () => FieldInfo<TParentData, TData>;
242
+ getInfo: () => FieldInfo<TParentData, TFormValidator>;
154
243
  pushValue: (value: TData extends any[] ? TData[number] : never) => void;
155
244
  insertValue: (index: number, value: TData extends any[] ? TData[number] : never) => void;
156
245
  removeValue: (index: number) => void;
157
246
  swapValues: (aIndex: number, bIndex: number) => void;
158
- getSubField: <TSubName extends DeepKeys<TData>, TSubData extends DeepValue<TData, TSubName> = DeepValue<TData, TSubName>>(name: TSubName) => FieldApi<TData, TSubName, ValidatorType, TSubData, DeepValue<TData, TSubName>>;
247
+ getSubField: <TSubName extends DeepKeys<TData>, TSubData extends DeepValue<TData, TSubName> = DeepValue<TData, TSubName>>(name: TSubName) => FieldApi<TData, TSubName, Validator<TSubData, unknown> | undefined, Validator<TData, unknown> | undefined, TSubData>;
159
248
  validateSync: (value: TData | undefined, cause: ValidationCause) => {
160
249
  hasErrored: boolean;
161
250
  };
162
- __leaseValidateAsync: () => number;
163
- cancelValidateAsync: () => void;
164
251
  validateAsync: (value: TData | undefined, cause: ValidationCause) => Promise<ValidationError[]>;
165
252
  validate: (cause: ValidationCause, value?: TData) => ValidationError[] | Promise<ValidationError[]>;
166
253
  handleChange: (updater: Updater<TData>) => void;
167
254
  handleBlur: () => void;
168
255
  }
169
256
 
170
- export { DeepKeys, DeepValue, FieldApi, FieldApiOptions, FieldInfo, FieldMeta, FieldOptions, FieldState, FormApi, FormOptions, FormState, ResolveName, Updater, ValidationCause, ValidationError, ValidationErrorMap, ValidationErrorMapKeys, ValidationMeta, Validator };
257
+ export { DeepKeys, DeepValue, FieldApi, FieldApiOptions, FieldAsyncValidateOrFn, FieldInfo, FieldMeta, FieldOptions, FieldState, FieldValidateAsyncFn, FieldValidateFn, FieldValidateOrFn, FieldValidators, FormApi, FormAsyncValidateOrFn, FormOptions, FormState, FormValidateAsyncFn, FormValidateFn, FormValidateOrFn, FormValidators, Narrow, Pretty, RequiredByKey, ResolveName, Updater, UpdaterFn, ValidationCause, ValidationError, ValidationErrorMap, ValidationErrorMapKeys, ValidationMeta, Validator, deleteBy, functionalUpdate, getAsyncValidatorArray, getBy, getSyncValidatorArray, isNonEmptyArray, setBy };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/types.ts"],"sourcesContent":["export type ValidationError = undefined | false | null | string\n\n// If/when TypeScript supports higher-kinded types, this should not be `unknown` anymore\nexport type Validator<Type, Fn = unknown> = () => {\n validate(value: Type, fn: Fn): ValidationError\n validateAsync(value: Type, fn: Fn): Promise<ValidationError>\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAAA;AAAA;","names":[]}
1
+ {"version":3,"sources":["../../src/types.ts"],"sourcesContent":["export type ValidationError = undefined | false | null | string\n\n// If/when TypeScript supports higher-kinded types, this should not be `unknown` anymore\nexport type Validator<Type, Fn = unknown> = () => {\n validate(options: { value: Type }, fn: Fn): ValidationError\n validateAsync(options: { value: Type }, fn: Fn): Promise<ValidationError>\n}\n\nexport type ValidationCause = 'change' | 'blur' | 'submit' | 'mount'\n\nexport type ValidationErrorMapKeys = `on${Capitalize<ValidationCause>}`\n\nexport type ValidationErrorMap = {\n [K in ValidationErrorMapKeys]?: ValidationError\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAAA;AAAA;","names":[]}
@@ -1,7 +1,16 @@
1
1
  type ValidationError = undefined | false | null | string;
2
2
  type Validator<Type, Fn = unknown> = () => {
3
- validate(value: Type, fn: Fn): ValidationError;
4
- validateAsync(value: Type, fn: Fn): Promise<ValidationError>;
3
+ validate(options: {
4
+ value: Type;
5
+ }, fn: Fn): ValidationError;
6
+ validateAsync(options: {
7
+ value: Type;
8
+ }, fn: Fn): Promise<ValidationError>;
9
+ };
10
+ type ValidationCause = 'change' | 'blur' | 'submit' | 'mount';
11
+ type ValidationErrorMapKeys = `on${Capitalize<ValidationCause>}`;
12
+ type ValidationErrorMap = {
13
+ [K in ValidationErrorMapKeys]?: ValidationError;
5
14
  };
6
15
 
7
- export { ValidationError, Validator };
16
+ export { ValidationCause, ValidationError, ValidationErrorMap, ValidationErrorMapKeys, Validator };
@@ -1,7 +1,16 @@
1
1
  type ValidationError = undefined | false | null | string;
2
2
  type Validator<Type, Fn = unknown> = () => {
3
- validate(value: Type, fn: Fn): ValidationError;
4
- validateAsync(value: Type, fn: Fn): Promise<ValidationError>;
3
+ validate(options: {
4
+ value: Type;
5
+ }, fn: Fn): ValidationError;
6
+ validateAsync(options: {
7
+ value: Type;
8
+ }, fn: Fn): Promise<ValidationError>;
9
+ };
10
+ type ValidationCause = 'change' | 'blur' | 'submit' | 'mount';
11
+ type ValidationErrorMapKeys = `on${Capitalize<ValidationCause>}`;
12
+ type ValidationErrorMap = {
13
+ [K in ValidationErrorMapKeys]?: ValidationError;
5
14
  };
6
15
 
7
- export { ValidationError, Validator };
16
+ export { ValidationCause, ValidationError, ValidationErrorMap, ValidationErrorMapKeys, Validator };
@@ -22,7 +22,9 @@ var utils_exports = {};
22
22
  __export(utils_exports, {
23
23
  deleteBy: () => deleteBy,
24
24
  functionalUpdate: () => functionalUpdate,
25
+ getAsyncValidatorArray: () => getAsyncValidatorArray,
25
26
  getBy: () => getBy,
27
+ getSyncValidatorArray: () => getSyncValidatorArray,
26
28
  isNonEmptyArray: () => isNonEmptyArray,
27
29
  setBy: () => setBy
28
30
  });
@@ -121,11 +123,64 @@ function makePathArray(str) {
121
123
  function isNonEmptyArray(obj) {
122
124
  return !(Array.isArray(obj) && obj.length === 0);
123
125
  }
126
+ function getAsyncValidatorArray(cause, options) {
127
+ const { asyncDebounceMs } = options;
128
+ const {
129
+ onChangeAsync,
130
+ onBlurAsync,
131
+ onSubmitAsync,
132
+ onBlurAsyncDebounceMs,
133
+ onChangeAsyncDebounceMs,
134
+ onSubmitAsyncDebounceMs
135
+ } = options.validators || {};
136
+ const defaultDebounceMs = asyncDebounceMs ?? 0;
137
+ const changeValidator = {
138
+ cause: "change",
139
+ validate: onChangeAsync,
140
+ debounceMs: onChangeAsyncDebounceMs ?? defaultDebounceMs
141
+ };
142
+ const blurValidator = {
143
+ cause: "blur",
144
+ validate: onBlurAsync,
145
+ debounceMs: onBlurAsyncDebounceMs ?? defaultDebounceMs
146
+ };
147
+ const submitValidator = {
148
+ cause: "submit",
149
+ validate: onSubmitAsync,
150
+ debounceMs: onSubmitAsyncDebounceMs ?? defaultDebounceMs
151
+ };
152
+ switch (cause) {
153
+ case "submit":
154
+ return [changeValidator, blurValidator, submitValidator];
155
+ case "blur":
156
+ return [blurValidator];
157
+ case "change":
158
+ default:
159
+ return [changeValidator];
160
+ }
161
+ }
162
+ function getSyncValidatorArray(cause, options) {
163
+ const { onChange, onBlur, onSubmit } = options.validators || {};
164
+ const changeValidator = { cause: "change", validate: onChange };
165
+ const blurValidator = { cause: "blur", validate: onBlur };
166
+ const submitValidator = { cause: "submit", validate: onSubmit };
167
+ switch (cause) {
168
+ case "submit":
169
+ return [changeValidator, blurValidator, submitValidator];
170
+ case "blur":
171
+ return [blurValidator];
172
+ case "change":
173
+ default:
174
+ return [changeValidator];
175
+ }
176
+ }
124
177
  // Annotate the CommonJS export names for ESM import in node:
125
178
  0 && (module.exports = {
126
179
  deleteBy,
127
180
  functionalUpdate,
181
+ getAsyncValidatorArray,
128
182
  getBy,
183
+ getSyncValidatorArray,
129
184
  isNonEmptyArray,
130
185
  setBy
131
186
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils.ts"],"sourcesContent":["export type UpdaterFn<TInput, TOutput = TInput> = (input: TInput) => TOutput\n\nexport type Updater<TInput, TOutput = TInput> =\n | TOutput\n | UpdaterFn<TInput, TOutput>\n\nexport function functionalUpdate<TInput, TOutput = TInput>(\n updater: Updater<TInput, TOutput>,\n input: TInput,\n): TOutput {\n return typeof updater === 'function'\n ? (updater as UpdaterFn<TInput, TOutput>)(input)\n : updater\n}\n\n/**\n * Get a value from an object using a path, including dot notation.\n */\nexport function getBy(obj: any, path: any) {\n const pathObj = makePathArray(path)\n return pathObj.reduce((current: any, pathPart: any) => {\n if (typeof current !== 'undefined') {\n return current[pathPart]\n }\n return undefined\n }, obj)\n}\n\n/**\n * Set a value on an object using a path, including dot notation.\n */\nexport function setBy(obj: any, _path: any, updater: Updater<any>) {\n const path = makePathArray(_path)\n\n function doSet(parent?: any): any {\n if (!path.length) {\n return functionalUpdate(updater, parent)\n }\n\n const key = path.shift()\n\n if (typeof key === 'string') {\n if (typeof parent === 'object') {\n return {\n ...parent,\n [key]: doSet(parent[key]),\n }\n }\n return {\n [key]: doSet(),\n }\n }\n\n if (Array.isArray(parent) && key !== undefined) {\n const prefix = parent.slice(0, key)\n return [\n ...(prefix.length ? prefix : new Array(key)),\n doSet(parent[key]),\n ...parent.slice(key + 1),\n ]\n }\n return [...new Array(key), doSet()]\n }\n\n return doSet(obj)\n}\n\n/**\n * Delete a field on an object using a path, including dot notation.\n */\nexport function deleteBy(obj: any, _path: any) {\n const path = makePathArray(_path)\n\n function doDelete(parent: any): any {\n if (path.length === 1) {\n const finalPath = path[0]!\n const { [finalPath]: remove, ...rest } = parent\n return rest\n }\n\n const key = path.shift()\n\n if (typeof key === 'string') {\n if (typeof parent === 'object') {\n return {\n ...parent,\n [key]: doDelete(parent[key]),\n }\n }\n }\n\n if (typeof key === 'number') {\n if (Array.isArray(parent)) {\n const prefix = parent.slice(0, key)\n return [\n ...(prefix.length ? prefix : new Array(key)),\n doDelete(parent[key]),\n ...parent.slice(key + 1),\n ]\n }\n }\n\n throw new Error('It seems we have created an infinite loop in deleteBy. ')\n }\n\n return doDelete(obj)\n}\n\nconst reFindNumbers0 = /^(\\d*)$/gm\nconst reFindNumbers1 = /\\.(\\d*)\\./gm\nconst reFindNumbers2 = /^(\\d*)\\./gm\nconst reFindNumbers3 = /\\.(\\d*$)/gm\nconst reFindMultiplePeriods = /\\.{2,}/gm\n\nconst intPrefix = '__int__'\nconst intReplace = `${intPrefix}$1`\n\nfunction makePathArray(str: string) {\n if (typeof str !== 'string') {\n throw new Error('Path must be a string.')\n }\n\n return str\n .replace('[', '.')\n .replace(']', '')\n .replace(reFindNumbers0, intReplace)\n .replace(reFindNumbers1, `.${intReplace}.`)\n .replace(reFindNumbers2, `${intReplace}.`)\n .replace(reFindNumbers3, `.${intReplace}`)\n .replace(reFindMultiplePeriods, '.')\n .split('.')\n .map((d) => {\n if (d.indexOf(intPrefix) === 0) {\n return parseInt(d.substring(intPrefix.length), 10)\n }\n return d\n })\n}\n\nexport function isNonEmptyArray(obj: any) {\n return !(Array.isArray(obj) && obj.length === 0)\n}\n\nexport type RequiredByKey<T, K extends keyof T> = Omit<T, K> &\n Required<Pick<T, K>>\n\ntype ComputeRange<\n N extends number,\n Result extends Array<unknown> = [],\n> = Result['length'] extends N\n ? Result\n : ComputeRange<N, [...Result, Result['length']]>\ntype Index40 = ComputeRange<40>[number]\n\n// Is this type a tuple?\ntype IsTuple<T> = T extends readonly any[] & { length: infer Length }\n ? Length extends Index40\n ? T\n : never\n : never\n\n// If this type is a tuple, what indices are allowed?\ntype AllowedIndexes<\n Tuple extends ReadonlyArray<any>,\n Keys extends number = never,\n> = Tuple extends readonly []\n ? Keys\n : Tuple extends readonly [infer _, ...infer Tail]\n ? AllowedIndexes<Tail, Keys | Tail['length']>\n : Keys\n\nexport type DeepKeys<T, TDepth extends any[] = []> = TDepth['length'] extends 5\n ? never\n : unknown extends T\n ? string\n : object extends T\n ? string\n : T extends readonly any[] & IsTuple<T>\n ? AllowedIndexes<T> | DeepKeysPrefix<T, AllowedIndexes<T>, TDepth>\n : T extends any[]\n ? DeepKeys<T[number], [...TDepth, any]>\n : T extends Date\n ? never\n : T extends object\n ? (keyof T & string) | DeepKeysPrefix<T, keyof T, TDepth>\n : never\n\ntype DeepKeysPrefix<\n T,\n TPrefix,\n TDepth extends any[],\n> = TPrefix extends keyof T & (number | string)\n ? `${TPrefix}.${DeepKeys<T[TPrefix], [...TDepth, any]> & string}`\n : never\n\nexport type DeepValue<T, TProp> = T extends Record<string | number, any>\n ? TProp extends `${infer TBranch}.${infer TDeepProp}`\n ? DeepValue<T[TBranch], TDeepProp>\n : T[TProp & string]\n : never\n\ntype Narrowable = string | number | bigint | boolean\n\ntype NarrowRaw<A> =\n | (A extends [] ? [] : never)\n | (A extends Narrowable ? A : never)\n | {\n [K in keyof A]: A[K] extends Function ? A[K] : NarrowRaw<A[K]>\n }\n\nexport type Narrow<A> = Try<A, [], NarrowRaw<A>>\n\ntype Try<A1, A2, Catch = never> = A1 extends A2 ? A1 : Catch\n\n// Hack to get TypeScript to show simplified types in error messages\nexport type Pretty<T> = { [K in keyof T]: T[K] } & {}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAMO,SAAS,iBACd,SACA,OACS;AACT,SAAO,OAAO,YAAY,aACrB,QAAuC,KAAK,IAC7C;AACN;AAKO,SAAS,MAAM,KAAU,MAAW;AACzC,QAAM,UAAU,cAAc,IAAI;AAClC,SAAO,QAAQ,OAAO,CAAC,SAAc,aAAkB;AACrD,QAAI,OAAO,YAAY,aAAa;AAClC,aAAO,QAAQ,QAAQ;AAAA,IACzB;AACA,WAAO;AAAA,EACT,GAAG,GAAG;AACR;AAKO,SAAS,MAAM,KAAU,OAAY,SAAuB;AACjE,QAAM,OAAO,cAAc,KAAK;AAEhC,WAAS,MAAM,QAAmB;AAChC,QAAI,CAAC,KAAK,QAAQ;AAChB,aAAO,iBAAiB,SAAS,MAAM;AAAA,IACzC;AAEA,UAAM,MAAM,KAAK,MAAM;AAEvB,QAAI,OAAO,QAAQ,UAAU;AAC3B,UAAI,OAAO,WAAW,UAAU;AAC9B,eAAO;AAAA,UACL,GAAG;AAAA,UACH,CAAC,GAAG,GAAG,MAAM,OAAO,GAAG,CAAC;AAAA,QAC1B;AAAA,MACF;AACA,aAAO;AAAA,QACL,CAAC,GAAG,GAAG,MAAM;AAAA,MACf;AAAA,IACF;AAEA,QAAI,MAAM,QAAQ,MAAM,KAAK,QAAQ,QAAW;AAC9C,YAAM,SAAS,OAAO,MAAM,GAAG,GAAG;AAClC,aAAO;AAAA,QACL,GAAI,OAAO,SAAS,SAAS,IAAI,MAAM,GAAG;AAAA,QAC1C,MAAM,OAAO,GAAG,CAAC;AAAA,QACjB,GAAG,OAAO,MAAM,MAAM,CAAC;AAAA,MACzB;AAAA,IACF;AACA,WAAO,CAAC,GAAG,IAAI,MAAM,GAAG,GAAG,MAAM,CAAC;AAAA,EACpC;AAEA,SAAO,MAAM,GAAG;AAClB;AAKO,SAAS,SAAS,KAAU,OAAY;AAC7C,QAAM,OAAO,cAAc,KAAK;AAEhC,WAAS,SAAS,QAAkB;AAClC,QAAI,KAAK,WAAW,GAAG;AACrB,YAAM,YAAY,KAAK,CAAC;AACxB,YAAM,EAAE,CAAC,SAAS,GAAG,QAAQ,GAAG,KAAK,IAAI;AACzC,aAAO;AAAA,IACT;AAEA,UAAM,MAAM,KAAK,MAAM;AAEvB,QAAI,OAAO,QAAQ,UAAU;AAC3B,UAAI,OAAO,WAAW,UAAU;AAC9B,eAAO;AAAA,UACL,GAAG;AAAA,UACH,CAAC,GAAG,GAAG,SAAS,OAAO,GAAG,CAAC;AAAA,QAC7B;AAAA,MACF;AAAA,IACF;AAEA,QAAI,OAAO,QAAQ,UAAU;AAC3B,UAAI,MAAM,QAAQ,MAAM,GAAG;AACzB,cAAM,SAAS,OAAO,MAAM,GAAG,GAAG;AAClC,eAAO;AAAA,UACL,GAAI,OAAO,SAAS,SAAS,IAAI,MAAM,GAAG;AAAA,UAC1C,SAAS,OAAO,GAAG,CAAC;AAAA,UACpB,GAAG,OAAO,MAAM,MAAM,CAAC;AAAA,QACzB;AAAA,MACF;AAAA,IACF;AAEA,UAAM,IAAI,MAAM,yDAAyD;AAAA,EAC3E;AAEA,SAAO,SAAS,GAAG;AACrB;AAEA,IAAM,iBAAiB;AACvB,IAAM,iBAAiB;AACvB,IAAM,iBAAiB;AACvB,IAAM,iBAAiB;AACvB,IAAM,wBAAwB;AAE9B,IAAM,YAAY;AAClB,IAAM,aAAa,GAAG,SAAS;AAE/B,SAAS,cAAc,KAAa;AAClC,MAAI,OAAO,QAAQ,UAAU;AAC3B,UAAM,IAAI,MAAM,wBAAwB;AAAA,EAC1C;AAEA,SAAO,IACJ,QAAQ,KAAK,GAAG,EAChB,QAAQ,KAAK,EAAE,EACf,QAAQ,gBAAgB,UAAU,EAClC,QAAQ,gBAAgB,IAAI,UAAU,GAAG,EACzC,QAAQ,gBAAgB,GAAG,UAAU,GAAG,EACxC,QAAQ,gBAAgB,IAAI,UAAU,EAAE,EACxC,QAAQ,uBAAuB,GAAG,EAClC,MAAM,GAAG,EACT,IAAI,CAAC,MAAM;AACV,QAAI,EAAE,QAAQ,SAAS,MAAM,GAAG;AAC9B,aAAO,SAAS,EAAE,UAAU,UAAU,MAAM,GAAG,EAAE;AAAA,IACnD;AACA,WAAO;AAAA,EACT,CAAC;AACL;AAEO,SAAS,gBAAgB,KAAU;AACxC,SAAO,EAAE,MAAM,QAAQ,GAAG,KAAK,IAAI,WAAW;AAChD;","names":[]}
1
+ {"version":3,"sources":["../../src/utils.ts"],"sourcesContent":["import type { ValidationCause, Validator } from './types'\nimport type { FormValidators } from './FormApi'\nimport type { FieldValidators } from './FieldApi'\n\nexport type UpdaterFn<TInput, TOutput = TInput> = (input: TInput) => TOutput\n\nexport type Updater<TInput, TOutput = TInput> =\n | TOutput\n | UpdaterFn<TInput, TOutput>\n\nexport function functionalUpdate<TInput, TOutput = TInput>(\n updater: Updater<TInput, TOutput>,\n input: TInput,\n): TOutput {\n return typeof updater === 'function'\n ? (updater as UpdaterFn<TInput, TOutput>)(input)\n : updater\n}\n\n/**\n * Get a value from an object using a path, including dot notation.\n */\nexport function getBy(obj: any, path: any) {\n const pathObj = makePathArray(path)\n return pathObj.reduce((current: any, pathPart: any) => {\n if (typeof current !== 'undefined') {\n return current[pathPart]\n }\n return undefined\n }, obj)\n}\n\n/**\n * Set a value on an object using a path, including dot notation.\n */\nexport function setBy(obj: any, _path: any, updater: Updater<any>) {\n const path = makePathArray(_path)\n\n function doSet(parent?: any): any {\n if (!path.length) {\n return functionalUpdate(updater, parent)\n }\n\n const key = path.shift()\n\n if (typeof key === 'string') {\n if (typeof parent === 'object') {\n return {\n ...parent,\n [key]: doSet(parent[key]),\n }\n }\n return {\n [key]: doSet(),\n }\n }\n\n if (Array.isArray(parent) && key !== undefined) {\n const prefix = parent.slice(0, key)\n return [\n ...(prefix.length ? prefix : new Array(key)),\n doSet(parent[key]),\n ...parent.slice(key + 1),\n ]\n }\n return [...new Array(key), doSet()]\n }\n\n return doSet(obj)\n}\n\n/**\n * Delete a field on an object using a path, including dot notation.\n */\nexport function deleteBy(obj: any, _path: any) {\n const path = makePathArray(_path)\n\n function doDelete(parent: any): any {\n if (path.length === 1) {\n const finalPath = path[0]!\n const { [finalPath]: remove, ...rest } = parent\n return rest\n }\n\n const key = path.shift()\n\n if (typeof key === 'string') {\n if (typeof parent === 'object') {\n return {\n ...parent,\n [key]: doDelete(parent[key]),\n }\n }\n }\n\n if (typeof key === 'number') {\n if (Array.isArray(parent)) {\n const prefix = parent.slice(0, key)\n return [\n ...(prefix.length ? prefix : new Array(key)),\n doDelete(parent[key]),\n ...parent.slice(key + 1),\n ]\n }\n }\n\n throw new Error('It seems we have created an infinite loop in deleteBy. ')\n }\n\n return doDelete(obj)\n}\n\nconst reFindNumbers0 = /^(\\d*)$/gm\nconst reFindNumbers1 = /\\.(\\d*)\\./gm\nconst reFindNumbers2 = /^(\\d*)\\./gm\nconst reFindNumbers3 = /\\.(\\d*$)/gm\nconst reFindMultiplePeriods = /\\.{2,}/gm\n\nconst intPrefix = '__int__'\nconst intReplace = `${intPrefix}$1`\n\nfunction makePathArray(str: string) {\n if (typeof str !== 'string') {\n throw new Error('Path must be a string.')\n }\n\n return str\n .replace('[', '.')\n .replace(']', '')\n .replace(reFindNumbers0, intReplace)\n .replace(reFindNumbers1, `.${intReplace}.`)\n .replace(reFindNumbers2, `${intReplace}.`)\n .replace(reFindNumbers3, `.${intReplace}`)\n .replace(reFindMultiplePeriods, '.')\n .split('.')\n .map((d) => {\n if (d.indexOf(intPrefix) === 0) {\n return parseInt(d.substring(intPrefix.length), 10)\n }\n return d\n })\n}\n\nexport function isNonEmptyArray(obj: any) {\n return !(Array.isArray(obj) && obj.length === 0)\n}\n\ninterface AsyncValidatorArrayPartialOptions<T> {\n validators?: T\n asyncDebounceMs?: number\n}\n\ninterface AsyncValidator<T> {\n cause: ValidationCause\n validate: T\n debounceMs: number\n}\n\nexport function getAsyncValidatorArray<T>(\n cause: ValidationCause,\n options: AsyncValidatorArrayPartialOptions<T>,\n): T extends FieldValidators<any, any>\n ? Array<\n AsyncValidator<T['onChangeAsync'] | T['onBlurAsync'] | T['onSubmitAsync']>\n >\n : T extends FormValidators<any, any>\n ? Array<\n AsyncValidator<T['onChangeAsync'] | T['onBlurAsync'] | T['onSubmitAsync']>\n >\n : never {\n const { asyncDebounceMs } = options\n const {\n onChangeAsync,\n onBlurAsync,\n onSubmitAsync,\n onBlurAsyncDebounceMs,\n onChangeAsyncDebounceMs,\n onSubmitAsyncDebounceMs,\n } = (options.validators || {}) as\n | FieldValidators<any, any>\n | FormValidators<any, any>\n\n const defaultDebounceMs = asyncDebounceMs ?? 0\n\n const changeValidator = {\n cause: 'change',\n validate: onChangeAsync,\n debounceMs: onChangeAsyncDebounceMs ?? defaultDebounceMs,\n } as const\n\n const blurValidator = {\n cause: 'blur',\n validate: onBlurAsync,\n debounceMs: onBlurAsyncDebounceMs ?? defaultDebounceMs,\n } as const\n\n const submitValidator = {\n cause: 'submit',\n validate: onSubmitAsync,\n debounceMs: onSubmitAsyncDebounceMs ?? defaultDebounceMs,\n } as const\n\n switch (cause) {\n case 'submit':\n return [changeValidator, blurValidator, submitValidator] as never\n case 'blur':\n return [blurValidator] as never\n case 'change':\n default:\n return [changeValidator] as never\n }\n}\n\ninterface SyncValidatorArrayPartialOptions<T> {\n validators?: T\n}\n\ninterface SyncValidator<T> {\n cause: ValidationCause\n validate: T\n}\n\nexport function getSyncValidatorArray<T>(\n cause: ValidationCause,\n options: SyncValidatorArrayPartialOptions<T>,\n): T extends FieldValidators<any, any>\n ? Array<SyncValidator<T['onChange'] | T['onBlur'] | T['onSubmit']>>\n : T extends FormValidators<any, any>\n ? Array<SyncValidator<T['onChange'] | T['onBlur'] | T['onSubmit']>>\n : never {\n const { onChange, onBlur, onSubmit } = (options.validators || {}) as\n | FieldValidators<any, any>\n | FormValidators<any, any>\n\n const changeValidator = { cause: 'change', validate: onChange } as const\n const blurValidator = { cause: 'blur', validate: onBlur } as const\n const submitValidator = { cause: 'submit', validate: onSubmit } as const\n\n switch (cause) {\n case 'submit':\n return [changeValidator, blurValidator, submitValidator] as never\n case 'blur':\n return [blurValidator] as never\n case 'change':\n default:\n return [changeValidator] as never\n }\n}\n\nexport type RequiredByKey<T, K extends keyof T> = Omit<T, K> &\n Required<Pick<T, K>>\n\ntype ComputeRange<\n N extends number,\n Result extends Array<unknown> = [],\n> = Result['length'] extends N\n ? Result\n : ComputeRange<N, [...Result, Result['length']]>\ntype Index40 = ComputeRange<40>[number]\n\n// Is this type a tuple?\ntype IsTuple<T> = T extends readonly any[] & { length: infer Length }\n ? Length extends Index40\n ? T\n : never\n : never\n\n// If this type is a tuple, what indices are allowed?\ntype AllowedIndexes<\n Tuple extends ReadonlyArray<any>,\n Keys extends number = never,\n> = Tuple extends readonly []\n ? Keys\n : Tuple extends readonly [infer _, ...infer Tail]\n ? AllowedIndexes<Tail, Keys | Tail['length']>\n : Keys\n\nexport type DeepKeys<T, TDepth extends any[] = []> = TDepth['length'] extends 5\n ? never\n : unknown extends T\n ? string\n : object extends T\n ? string\n : T extends readonly any[] & IsTuple<T>\n ? AllowedIndexes<T> | DeepKeysPrefix<T, AllowedIndexes<T>, TDepth>\n : T extends any[]\n ? DeepKeys<T[number], [...TDepth, any]>\n : T extends Date\n ? never\n : T extends object\n ? (keyof T & string) | DeepKeysPrefix<T, keyof T, TDepth>\n : never\n\ntype DeepKeysPrefix<\n T,\n TPrefix,\n TDepth extends any[],\n> = TPrefix extends keyof T & (number | string)\n ? `${TPrefix}.${DeepKeys<T[TPrefix], [...TDepth, any]> & string}`\n : never\n\nexport type DeepValue<T, TProp> = T extends Record<string | number, any>\n ? TProp extends `${infer TBranch}.${infer TDeepProp}`\n ? DeepValue<T[TBranch], TDeepProp>\n : T[TProp & string]\n : never\n\ntype Narrowable = string | number | bigint | boolean\n\ntype NarrowRaw<A> =\n | (A extends [] ? [] : never)\n | (A extends Narrowable ? A : never)\n | {\n [K in keyof A]: A[K] extends Function ? A[K] : NarrowRaw<A[K]>\n }\n\nexport type Narrow<A> = Try<A, [], NarrowRaw<A>>\n\ntype Try<A1, A2, Catch = never> = A1 extends A2 ? A1 : Catch\n\n// Hack to get TypeScript to show simplified types in error messages\nexport type Pretty<T> = { [K in keyof T]: T[K] } & {}\n"],"mappings":"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","names":[]}
@@ -1,37 +1,3 @@
1
- type UpdaterFn<TInput, TOutput = TInput> = (input: TInput) => TOutput;
2
- type Updater<TInput, TOutput = TInput> = TOutput | UpdaterFn<TInput, TOutput>;
3
- declare function functionalUpdate<TInput, TOutput = TInput>(updater: Updater<TInput, TOutput>, input: TInput): TOutput;
4
- /**
5
- * Get a value from an object using a path, including dot notation.
6
- */
7
- declare function getBy(obj: any, path: any): any;
8
- /**
9
- * Set a value on an object using a path, including dot notation.
10
- */
11
- declare function setBy(obj: any, _path: any, updater: Updater<any>): any;
12
- /**
13
- * Delete a field on an object using a path, including dot notation.
14
- */
15
- declare function deleteBy(obj: any, _path: any): any;
16
- declare function isNonEmptyArray(obj: any): boolean;
17
- type RequiredByKey<T, K extends keyof T> = Omit<T, K> & Required<Pick<T, K>>;
18
- type ComputeRange<N extends number, Result extends Array<unknown> = []> = Result['length'] extends N ? Result : ComputeRange<N, [...Result, Result['length']]>;
19
- type Index40 = ComputeRange<40>[number];
20
- type IsTuple<T> = T extends readonly any[] & {
21
- length: infer Length;
22
- } ? Length extends Index40 ? T : never : never;
23
- type AllowedIndexes<Tuple extends ReadonlyArray<any>, Keys extends number = never> = Tuple extends readonly [] ? Keys : Tuple extends readonly [infer _, ...infer Tail] ? AllowedIndexes<Tail, Keys | Tail['length']> : Keys;
24
- type DeepKeys<T, TDepth extends any[] = []> = TDepth['length'] extends 5 ? never : unknown extends T ? string : object extends T ? string : T extends readonly any[] & IsTuple<T> ? AllowedIndexes<T> | DeepKeysPrefix<T, AllowedIndexes<T>, TDepth> : T extends any[] ? DeepKeys<T[number], [...TDepth, any]> : T extends Date ? never : T extends object ? (keyof T & string) | DeepKeysPrefix<T, keyof T, TDepth> : never;
25
- type DeepKeysPrefix<T, TPrefix, TDepth extends any[]> = TPrefix extends keyof T & (number | string) ? `${TPrefix}.${DeepKeys<T[TPrefix], [...TDepth, any]> & string}` : never;
26
- type DeepValue<T, TProp> = T extends Record<string | number, any> ? TProp extends `${infer TBranch}.${infer TDeepProp}` ? DeepValue<T[TBranch], TDeepProp> : T[TProp & string] : never;
27
- type Narrowable = string | number | bigint | boolean;
28
- type NarrowRaw<A> = (A extends [] ? [] : never) | (A extends Narrowable ? A : never) | {
29
- [K in keyof A]: A[K] extends Function ? A[K] : NarrowRaw<A[K]>;
30
- };
31
- type Narrow<A> = Try<A, [], NarrowRaw<A>>;
32
- type Try<A1, A2, Catch = never> = A1 extends A2 ? A1 : Catch;
33
- type Pretty<T> = {
34
- [K in keyof T]: T[K];
35
- } & {};
36
-
37
- export { DeepKeys, DeepValue, Narrow, Pretty, RequiredByKey, Updater, UpdaterFn, deleteBy, functionalUpdate, getBy, isNonEmptyArray, setBy };
1
+ import './types.cjs';
2
+ export { DeepKeys, DeepValue, Narrow, Pretty, RequiredByKey, Updater, UpdaterFn, deleteBy, functionalUpdate, getAsyncValidatorArray, getBy, getSyncValidatorArray, isNonEmptyArray, setBy } from './index.cjs';
3
+ import '@tanstack/store';
@@ -1,37 +1,3 @@
1
- type UpdaterFn<TInput, TOutput = TInput> = (input: TInput) => TOutput;
2
- type Updater<TInput, TOutput = TInput> = TOutput | UpdaterFn<TInput, TOutput>;
3
- declare function functionalUpdate<TInput, TOutput = TInput>(updater: Updater<TInput, TOutput>, input: TInput): TOutput;
4
- /**
5
- * Get a value from an object using a path, including dot notation.
6
- */
7
- declare function getBy(obj: any, path: any): any;
8
- /**
9
- * Set a value on an object using a path, including dot notation.
10
- */
11
- declare function setBy(obj: any, _path: any, updater: Updater<any>): any;
12
- /**
13
- * Delete a field on an object using a path, including dot notation.
14
- */
15
- declare function deleteBy(obj: any, _path: any): any;
16
- declare function isNonEmptyArray(obj: any): boolean;
17
- type RequiredByKey<T, K extends keyof T> = Omit<T, K> & Required<Pick<T, K>>;
18
- type ComputeRange<N extends number, Result extends Array<unknown> = []> = Result['length'] extends N ? Result : ComputeRange<N, [...Result, Result['length']]>;
19
- type Index40 = ComputeRange<40>[number];
20
- type IsTuple<T> = T extends readonly any[] & {
21
- length: infer Length;
22
- } ? Length extends Index40 ? T : never : never;
23
- type AllowedIndexes<Tuple extends ReadonlyArray<any>, Keys extends number = never> = Tuple extends readonly [] ? Keys : Tuple extends readonly [infer _, ...infer Tail] ? AllowedIndexes<Tail, Keys | Tail['length']> : Keys;
24
- type DeepKeys<T, TDepth extends any[] = []> = TDepth['length'] extends 5 ? never : unknown extends T ? string : object extends T ? string : T extends readonly any[] & IsTuple<T> ? AllowedIndexes<T> | DeepKeysPrefix<T, AllowedIndexes<T>, TDepth> : T extends any[] ? DeepKeys<T[number], [...TDepth, any]> : T extends Date ? never : T extends object ? (keyof T & string) | DeepKeysPrefix<T, keyof T, TDepth> : never;
25
- type DeepKeysPrefix<T, TPrefix, TDepth extends any[]> = TPrefix extends keyof T & (number | string) ? `${TPrefix}.${DeepKeys<T[TPrefix], [...TDepth, any]> & string}` : never;
26
- type DeepValue<T, TProp> = T extends Record<string | number, any> ? TProp extends `${infer TBranch}.${infer TDeepProp}` ? DeepValue<T[TBranch], TDeepProp> : T[TProp & string] : never;
27
- type Narrowable = string | number | bigint | boolean;
28
- type NarrowRaw<A> = (A extends [] ? [] : never) | (A extends Narrowable ? A : never) | {
29
- [K in keyof A]: A[K] extends Function ? A[K] : NarrowRaw<A[K]>;
30
- };
31
- type Narrow<A> = Try<A, [], NarrowRaw<A>>;
32
- type Try<A1, A2, Catch = never> = A1 extends A2 ? A1 : Catch;
33
- type Pretty<T> = {
34
- [K in keyof T]: T[K];
35
- } & {};
36
-
37
- export { DeepKeys, DeepValue, Narrow, Pretty, RequiredByKey, Updater, UpdaterFn, deleteBy, functionalUpdate, getBy, isNonEmptyArray, setBy };
1
+ import './types.js';
2
+ export { DeepKeys, DeepValue, Narrow, Pretty, RequiredByKey, Updater, UpdaterFn, deleteBy, functionalUpdate, getAsyncValidatorArray, getBy, getSyncValidatorArray, isNonEmptyArray, setBy } from './index.js';
3
+ import '@tanstack/store';