@tanstack/form-core 0.11.0 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/FieldApi.d.ts +94 -0
- package/dist/cjs/FormApi.d.ts +118 -0
- package/dist/cjs/index.cjs +926 -0
- package/dist/cjs/index.cjs.map +1 -0
- package/dist/cjs/index.d.cts +5 -0
- package/dist/cjs/index.d.ts +5 -0
- package/dist/cjs/index.js +926 -0
- package/dist/cjs/mergeForm.d.ts +4 -0
- package/dist/cjs/tests/FieldApi.spec.d.ts +1 -0
- package/dist/cjs/tests/FieldApi.test-d.d.ts +1 -0
- package/dist/cjs/tests/FormApi.spec.d.ts +1 -0
- package/dist/cjs/tests/mutateMergeDeep.spec.d.ts +1 -0
- package/dist/cjs/tests/utils.d.ts +1 -0
- package/dist/cjs/tests/utils.spec.d.ts +1 -0
- package/dist/cjs/types.d.ts +14 -0
- package/dist/cjs/utils.d.ts +57 -0
- package/dist/mjs/FieldApi.d.ts +94 -0
- package/dist/mjs/FormApi.d.ts +118 -0
- package/dist/mjs/index.d.mts +5 -0
- package/dist/mjs/index.d.ts +5 -0
- package/dist/mjs/index.js +926 -0
- package/dist/mjs/index.mjs +926 -0
- package/dist/mjs/index.mjs.map +1 -0
- package/dist/mjs/mergeForm.d.ts +4 -0
- package/dist/mjs/tests/FieldApi.spec.d.ts +1 -0
- package/dist/mjs/tests/FieldApi.test-d.d.ts +1 -0
- package/dist/mjs/tests/FormApi.spec.d.ts +1 -0
- package/dist/mjs/tests/mutateMergeDeep.spec.d.ts +1 -0
- package/dist/mjs/tests/utils.d.ts +1 -0
- package/dist/mjs/tests/utils.spec.d.ts +1 -0
- package/dist/mjs/types.d.ts +14 -0
- package/dist/mjs/utils.d.ts +57 -0
- package/package.json +16 -21
- package/src/FieldApi.ts +53 -38
- package/src/FormApi.ts +59 -23
- package/src/index.ts +1 -0
- package/src/mergeForm.ts +42 -0
- package/src/tests/FormApi.spec.ts +1 -0
- package/src/tests/mutateMergeDeep.spec.ts +32 -0
- package/src/types.ts +2 -1
- package/src/utils.ts +40 -23
- package/build/legacy/FieldApi.cjs +0 -313
- package/build/legacy/FieldApi.cjs.map +0 -1
- package/build/legacy/FieldApi.d.cts +0 -3
- package/build/legacy/FieldApi.d.ts +0 -3
- package/build/legacy/FieldApi.js +0 -288
- package/build/legacy/FieldApi.js.map +0 -1
- package/build/legacy/FormApi.cjs +0 -445
- package/build/legacy/FormApi.cjs.map +0 -1
- package/build/legacy/FormApi.d.cts +0 -3
- package/build/legacy/FormApi.d.ts +0 -3
- package/build/legacy/FormApi.js +0 -428
- package/build/legacy/FormApi.js.map +0 -1
- package/build/legacy/index.cjs +0 -31
- package/build/legacy/index.cjs.map +0 -1
- package/build/legacy/index.d.cts +0 -257
- package/build/legacy/index.d.ts +0 -257
- package/build/legacy/index.js +0 -6
- package/build/legacy/index.js.map +0 -1
- package/build/legacy/types.cjs +0 -19
- package/build/legacy/types.cjs.map +0 -1
- package/build/legacy/types.d.cts +0 -16
- package/build/legacy/types.d.ts +0 -16
- package/build/legacy/types.js +0 -1
- package/build/legacy/types.js.map +0 -1
- package/build/legacy/utils.cjs +0 -187
- package/build/legacy/utils.cjs.map +0 -1
- package/build/legacy/utils.d.cts +0 -3
- package/build/legacy/utils.d.ts +0 -3
- package/build/legacy/utils.js +0 -156
- package/build/legacy/utils.js.map +0 -1
- package/build/modern/FieldApi.cjs +0 -312
- package/build/modern/FieldApi.cjs.map +0 -1
- package/build/modern/FieldApi.d.cts +0 -3
- package/build/modern/FieldApi.d.ts +0 -3
- package/build/modern/FieldApi.js +0 -287
- package/build/modern/FieldApi.js.map +0 -1
- package/build/modern/FormApi.cjs +0 -439
- package/build/modern/FormApi.cjs.map +0 -1
- package/build/modern/FormApi.d.cts +0 -3
- package/build/modern/FormApi.d.ts +0 -3
- package/build/modern/FormApi.js +0 -422
- package/build/modern/FormApi.js.map +0 -1
- package/build/modern/index.cjs +0 -31
- package/build/modern/index.cjs.map +0 -1
- package/build/modern/index.d.cts +0 -257
- package/build/modern/index.d.ts +0 -257
- package/build/modern/index.js +0 -6
- package/build/modern/index.js.map +0 -1
- package/build/modern/types.cjs +0 -19
- package/build/modern/types.cjs.map +0 -1
- package/build/modern/types.d.cts +0 -16
- package/build/modern/types.d.ts +0 -16
- package/build/modern/types.js +0 -1
- package/build/modern/types.js.map +0 -1
- package/build/modern/utils.cjs +0 -187
- package/build/modern/utils.cjs.map +0 -1
- package/build/modern/utils.d.cts +0 -3
- package/build/modern/utils.d.ts +0 -3
- package/build/modern/utils.js +0 -156
- package/build/modern/utils.js.map +0 -1
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { FormApi } from './FormApi';
|
|
2
|
+
import type { Validator } from './types';
|
|
3
|
+
export declare function mutateMergeDeep(target: object, source: object): object;
|
|
4
|
+
export declare function mergeForm<TFormData, TFormValidator extends Validator<TFormData, unknown> | undefined = undefined>(baseForm: FormApi<TFormData, TFormValidator>, state: Partial<FormApi<TFormData, TFormValidator>['state']>): FormApi<TFormData, TFormValidator>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function sleep(timeout: number): Promise<void>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export type ValidationError = undefined | false | null | string;
|
|
2
|
+
export type Validator<Type, Fn = unknown> = () => {
|
|
3
|
+
validate(options: {
|
|
4
|
+
value: Type;
|
|
5
|
+
}, fn: Fn): ValidationError;
|
|
6
|
+
validateAsync(options: {
|
|
7
|
+
value: Type;
|
|
8
|
+
}, fn: Fn): Promise<ValidationError>;
|
|
9
|
+
};
|
|
10
|
+
export type ValidationCause = 'change' | 'blur' | 'submit' | 'mount' | 'server';
|
|
11
|
+
export type ValidationErrorMapKeys = `on${Capitalize<ValidationCause>}`;
|
|
12
|
+
export type ValidationErrorMap = {
|
|
13
|
+
[K in ValidationErrorMapKeys]?: ValidationError;
|
|
14
|
+
};
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { ValidationCause } from './types';
|
|
2
|
+
import type { FormValidators } from './FormApi';
|
|
3
|
+
import type { FieldValidators } from './FieldApi';
|
|
4
|
+
export type UpdaterFn<TInput, TOutput = TInput> = (input: TInput) => TOutput;
|
|
5
|
+
export type Updater<TInput, TOutput = TInput> = TOutput | UpdaterFn<TInput, TOutput>;
|
|
6
|
+
export 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
|
+
export declare function getBy(obj: any, path: any): any;
|
|
11
|
+
/**
|
|
12
|
+
* Set a value on an object using a path, including dot notation.
|
|
13
|
+
*/
|
|
14
|
+
export 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
|
+
export declare function deleteBy(obj: any, _path: any): any;
|
|
19
|
+
export declare function isNonEmptyArray(obj: any): boolean;
|
|
20
|
+
interface AsyncValidatorArrayPartialOptions<T> {
|
|
21
|
+
validators?: T;
|
|
22
|
+
asyncDebounceMs?: number;
|
|
23
|
+
}
|
|
24
|
+
interface AsyncValidator<T> {
|
|
25
|
+
cause: ValidationCause;
|
|
26
|
+
validate: T;
|
|
27
|
+
debounceMs: number;
|
|
28
|
+
}
|
|
29
|
+
export 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
|
+
export 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
|
+
export 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
|
+
export 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
|
+
export 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
|
+
export type Narrow<A> = Try<A, [], NarrowRaw<A>>;
|
|
53
|
+
type Try<A1, A2, Catch = never> = A1 extends A2 ? A1 : Catch;
|
|
54
|
+
export type Pretty<T> = {
|
|
55
|
+
[K in keyof T]: T[K];
|
|
56
|
+
} & {};
|
|
57
|
+
export {};
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { Store } from '@tanstack/store';
|
|
2
|
+
import type { FormApi } from './FormApi';
|
|
3
|
+
import type { ValidationCause, ValidationError, ValidationErrorMap, Validator } from './types';
|
|
4
|
+
import type { DeepKeys, DeepValue, Updater } from './utils';
|
|
5
|
+
export 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: {
|
|
6
|
+
value: TData;
|
|
7
|
+
fieldApi: FieldApi<TParentData, TName, TFieldValidator, TFormValidator, TData>;
|
|
8
|
+
}) => ValidationError;
|
|
9
|
+
export 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>;
|
|
10
|
+
export 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: {
|
|
11
|
+
value: TData;
|
|
12
|
+
fieldApi: FieldApi<TParentData, TName, TFieldValidator, TFormValidator, TData>;
|
|
13
|
+
signal: AbortSignal;
|
|
14
|
+
}) => ValidationError | Promise<ValidationError>;
|
|
15
|
+
export 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>;
|
|
16
|
+
export 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>> {
|
|
17
|
+
onMount?: FieldValidateOrFn<TParentData, TName, TFieldValidator, TFormValidator, TData>;
|
|
18
|
+
onChange?: FieldValidateOrFn<TParentData, TName, TFieldValidator, TFormValidator, TData>;
|
|
19
|
+
onChangeAsync?: FieldAsyncValidateOrFn<TParentData, TName, TFieldValidator, TFormValidator, TData>;
|
|
20
|
+
onChangeAsyncDebounceMs?: number;
|
|
21
|
+
onBlur?: FieldValidateOrFn<TParentData, TName, TFieldValidator, TFormValidator, TData>;
|
|
22
|
+
onBlurAsync?: FieldAsyncValidateOrFn<TParentData, TName, TFieldValidator, TFormValidator, TData>;
|
|
23
|
+
onBlurAsyncDebounceMs?: number;
|
|
24
|
+
onSubmit?: FieldValidateOrFn<TParentData, TName, TFieldValidator, TFormValidator, TData>;
|
|
25
|
+
onSubmitAsync?: FieldAsyncValidateOrFn<TParentData, TName, TFieldValidator, TFormValidator, TData>;
|
|
26
|
+
onSubmitAsyncDebounceMs?: number;
|
|
27
|
+
}
|
|
28
|
+
export 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>> {
|
|
29
|
+
name: TName;
|
|
30
|
+
index?: TData extends any[] ? number : never;
|
|
31
|
+
defaultValue?: TData;
|
|
32
|
+
asyncDebounceMs?: number;
|
|
33
|
+
asyncAlways?: boolean;
|
|
34
|
+
preserveValue?: boolean;
|
|
35
|
+
validatorAdapter?: TFieldValidator;
|
|
36
|
+
validators?: FieldValidators<TParentData, TName, TFieldValidator, TFormValidator, TData>;
|
|
37
|
+
defaultMeta?: Partial<FieldMeta>;
|
|
38
|
+
}
|
|
39
|
+
export 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> {
|
|
40
|
+
form: FormApi<TParentData, TFormValidator>;
|
|
41
|
+
}
|
|
42
|
+
export type FieldMeta = {
|
|
43
|
+
isTouched: boolean;
|
|
44
|
+
touchedErrors: ValidationError[];
|
|
45
|
+
errors: ValidationError[];
|
|
46
|
+
errorMap: ValidationErrorMap;
|
|
47
|
+
isValidating: boolean;
|
|
48
|
+
};
|
|
49
|
+
export type FieldState<TData> = {
|
|
50
|
+
value: TData;
|
|
51
|
+
meta: FieldMeta;
|
|
52
|
+
};
|
|
53
|
+
export type ResolveName<TParentData> = unknown extends TParentData ? string : DeepKeys<TParentData>;
|
|
54
|
+
export 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>> {
|
|
55
|
+
uid: number;
|
|
56
|
+
form: FieldApiOptions<TParentData, TName, TFieldValidator, TFormValidator, TData>['form'];
|
|
57
|
+
name: DeepKeys<TParentData>;
|
|
58
|
+
options: FieldApiOptions<TParentData, TName, TFieldValidator, TFormValidator, TData>;
|
|
59
|
+
store: Store<FieldState<TData>>;
|
|
60
|
+
state: FieldState<TData>;
|
|
61
|
+
prevState: FieldState<TData>;
|
|
62
|
+
constructor(opts: FieldApiOptions<TParentData, TName, TFieldValidator, TFormValidator, TData>);
|
|
63
|
+
runValidator<TValue extends {
|
|
64
|
+
value: TData;
|
|
65
|
+
fieldApi: FieldApi<any, any, any, any>;
|
|
66
|
+
}, TType extends 'validate' | 'validateAsync'>(props: {
|
|
67
|
+
validate: TType extends 'validate' ? FieldValidateOrFn<any, any, any, any> : FieldAsyncValidateOrFn<any, any, any, any>;
|
|
68
|
+
value: TValue;
|
|
69
|
+
type: TType;
|
|
70
|
+
}): ReturnType<ReturnType<Validator<any>>[TType]>;
|
|
71
|
+
mount: () => () => void;
|
|
72
|
+
update: (opts: FieldApiOptions<TParentData, TName, TFieldValidator, TFormValidator, TData>) => void;
|
|
73
|
+
getValue: () => TData;
|
|
74
|
+
setValue: (updater: Updater<TData>, options?: {
|
|
75
|
+
touch?: boolean;
|
|
76
|
+
notify?: boolean;
|
|
77
|
+
}) => void;
|
|
78
|
+
_getMeta: () => FieldMeta | undefined;
|
|
79
|
+
getMeta: () => FieldMeta;
|
|
80
|
+
setMeta: (updater: Updater<FieldMeta>) => void;
|
|
81
|
+
getInfo: () => import("./FormApi").FieldInfo<TParentData, TFormValidator>;
|
|
82
|
+
pushValue: (value: TData extends any[] ? TData[number] : never) => void;
|
|
83
|
+
insertValue: (index: number, value: TData extends any[] ? TData[number] : never) => void;
|
|
84
|
+
removeValue: (index: number) => void;
|
|
85
|
+
swapValues: (aIndex: number, bIndex: number) => void;
|
|
86
|
+
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>;
|
|
87
|
+
validateSync: (value: TData | undefined, cause: ValidationCause) => {
|
|
88
|
+
hasErrored: boolean;
|
|
89
|
+
};
|
|
90
|
+
validateAsync: (value: TData | undefined, cause: ValidationCause) => Promise<ValidationError[]>;
|
|
91
|
+
validate: (cause: ValidationCause, value?: TData) => ValidationError[] | Promise<ValidationError[]>;
|
|
92
|
+
handleChange: (updater: Updater<TData>) => void;
|
|
93
|
+
handleBlur: () => void;
|
|
94
|
+
}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { Store } from '@tanstack/store';
|
|
3
|
+
import type { DeepKeys, DeepValue, Updater } from './utils';
|
|
4
|
+
import type { FieldApi, FieldMeta } from './FieldApi';
|
|
5
|
+
import type { ValidationError, ValidationErrorMap, Validator, ValidationCause, ValidationErrorMapKeys } from './types';
|
|
6
|
+
export type FormValidateFn<TFormData, TFormValidator extends Validator<TFormData, unknown> | undefined = undefined> = (props: {
|
|
7
|
+
value: TFormData;
|
|
8
|
+
formApi: FormApi<TFormData, TFormValidator>;
|
|
9
|
+
}) => ValidationError;
|
|
10
|
+
export type FormValidateOrFn<TFormData, TFormValidator extends Validator<TFormData, unknown> | undefined = undefined> = TFormValidator extends Validator<TFormData, infer TFN> ? TFN : FormValidateFn<TFormData, TFormValidator>;
|
|
11
|
+
export type FormValidateAsyncFn<TFormData, TFormValidator extends Validator<TFormData, unknown> | undefined = undefined> = (props: {
|
|
12
|
+
value: TFormData;
|
|
13
|
+
formApi: FormApi<TFormData, TFormValidator>;
|
|
14
|
+
signal: AbortSignal;
|
|
15
|
+
}) => ValidationError | Promise<ValidationError>;
|
|
16
|
+
export type FormAsyncValidateOrFn<TFormData, TFormValidator extends Validator<TFormData, unknown> | undefined = undefined> = TFormValidator extends Validator<TFormData, infer FFN> ? FFN | FormValidateAsyncFn<TFormData, TFormValidator> : FormValidateAsyncFn<TFormData, TFormValidator>;
|
|
17
|
+
export interface FormValidators<TFormData, TFormValidator extends Validator<TFormData, unknown> | undefined = undefined> {
|
|
18
|
+
onMount?: FormValidateOrFn<TFormData, TFormValidator>;
|
|
19
|
+
onChange?: FormValidateOrFn<TFormData, TFormValidator>;
|
|
20
|
+
onChangeAsync?: FormAsyncValidateOrFn<TFormData, TFormValidator>;
|
|
21
|
+
onChangeAsyncDebounceMs?: number;
|
|
22
|
+
onBlur?: FormValidateOrFn<TFormData, TFormValidator>;
|
|
23
|
+
onBlurAsync?: FormAsyncValidateOrFn<TFormData, TFormValidator>;
|
|
24
|
+
onBlurAsyncDebounceMs?: number;
|
|
25
|
+
onSubmit?: FormValidateOrFn<TFormData, TFormValidator>;
|
|
26
|
+
onSubmitAsync?: FormAsyncValidateOrFn<TFormData, TFormValidator>;
|
|
27
|
+
onSubmitAsyncDebounceMs?: number;
|
|
28
|
+
}
|
|
29
|
+
export interface FormTransform<TFormData, TFormValidator extends Validator<TFormData, unknown> | undefined = undefined> {
|
|
30
|
+
fn: (formBase: FormApi<TFormData, TFormValidator>) => FormApi<TFormData, TFormValidator>;
|
|
31
|
+
deps: unknown[];
|
|
32
|
+
}
|
|
33
|
+
export interface FormOptions<TFormData, TFormValidator extends Validator<TFormData, unknown> | undefined = undefined> {
|
|
34
|
+
defaultValues?: TFormData;
|
|
35
|
+
defaultState?: Partial<FormState<TFormData>>;
|
|
36
|
+
asyncAlways?: boolean;
|
|
37
|
+
asyncDebounceMs?: number;
|
|
38
|
+
validatorAdapter?: TFormValidator;
|
|
39
|
+
validators?: FormValidators<TFormData, TFormValidator>;
|
|
40
|
+
onSubmit?: (props: {
|
|
41
|
+
value: TFormData;
|
|
42
|
+
formApi: FormApi<TFormData, TFormValidator>;
|
|
43
|
+
}) => any | Promise<any>;
|
|
44
|
+
onSubmitInvalid?: (props: {
|
|
45
|
+
value: TFormData;
|
|
46
|
+
formApi: FormApi<TFormData, TFormValidator>;
|
|
47
|
+
}) => void;
|
|
48
|
+
transform?: FormTransform<TFormData, TFormValidator>;
|
|
49
|
+
}
|
|
50
|
+
export type ValidationMeta = {
|
|
51
|
+
lastAbortController: AbortController;
|
|
52
|
+
};
|
|
53
|
+
export type FieldInfo<TFormData, TFormValidator extends Validator<TFormData, unknown> | undefined = undefined> = {
|
|
54
|
+
instances: Record<string, FieldApi<TFormData, any, Validator<unknown, unknown> | undefined, TFormValidator>>;
|
|
55
|
+
validationMetaMap: Record<ValidationErrorMapKeys, ValidationMeta | undefined>;
|
|
56
|
+
};
|
|
57
|
+
export type FormState<TFormData> = {
|
|
58
|
+
values: TFormData;
|
|
59
|
+
isFormValidating: boolean;
|
|
60
|
+
isFormValid: boolean;
|
|
61
|
+
errors: ValidationError[];
|
|
62
|
+
errorMap: ValidationErrorMap;
|
|
63
|
+
validationMetaMap: Record<ValidationErrorMapKeys, ValidationMeta | undefined>;
|
|
64
|
+
fieldMeta: Record<DeepKeys<TFormData>, FieldMeta>;
|
|
65
|
+
isFieldsValidating: boolean;
|
|
66
|
+
isFieldsValid: boolean;
|
|
67
|
+
isSubmitting: boolean;
|
|
68
|
+
isTouched: boolean;
|
|
69
|
+
isSubmitted: boolean;
|
|
70
|
+
isValidating: boolean;
|
|
71
|
+
isValid: boolean;
|
|
72
|
+
canSubmit: boolean;
|
|
73
|
+
submissionAttempts: number;
|
|
74
|
+
};
|
|
75
|
+
export declare class FormApi<TFormData, TFormValidator extends Validator<TFormData, unknown> | undefined = undefined> {
|
|
76
|
+
options: FormOptions<TFormData, TFormValidator>;
|
|
77
|
+
store: Store<FormState<TFormData>>;
|
|
78
|
+
state: FormState<TFormData>;
|
|
79
|
+
fieldInfo: Record<DeepKeys<TFormData>, FieldInfo<TFormData, TFormValidator>>;
|
|
80
|
+
prevTransformArray: unknown[];
|
|
81
|
+
constructor(opts?: FormOptions<TFormData, TFormValidator>);
|
|
82
|
+
runValidator<TValue extends {
|
|
83
|
+
value: TFormData;
|
|
84
|
+
formApi: FormApi<any, any>;
|
|
85
|
+
}, TType extends 'validate' | 'validateAsync'>(props: {
|
|
86
|
+
validate: TType extends 'validate' ? FormValidateOrFn<TFormData, TFormValidator> : FormAsyncValidateOrFn<TFormData, TFormValidator>;
|
|
87
|
+
value: TValue;
|
|
88
|
+
type: TType;
|
|
89
|
+
}): ReturnType<ReturnType<Validator<any>>[TType]>;
|
|
90
|
+
mount: () => void;
|
|
91
|
+
update: (options?: FormOptions<TFormData, TFormValidator>) => void;
|
|
92
|
+
reset: () => void;
|
|
93
|
+
validateAllFields: (cause: ValidationCause) => Promise<ValidationError[]>;
|
|
94
|
+
validateSync: (cause: ValidationCause) => {
|
|
95
|
+
hasErrored: boolean;
|
|
96
|
+
};
|
|
97
|
+
validateAsync: (cause: ValidationCause) => Promise<ValidationError[]>;
|
|
98
|
+
validate: (cause: ValidationCause) => ValidationError[] | Promise<ValidationError[]>;
|
|
99
|
+
handleSubmit: () => Promise<void>;
|
|
100
|
+
getFieldValue: <TField extends DeepKeys<TFormData>>(field: TField) => DeepValue<TFormData, TField>;
|
|
101
|
+
getFieldMeta: <TField extends DeepKeys<TFormData>>(field: TField) => FieldMeta | undefined;
|
|
102
|
+
getFieldInfo: <TField extends DeepKeys<TFormData>>(field: TField) => FieldInfo<TFormData, TFormValidator>;
|
|
103
|
+
setFieldMeta: <TField extends DeepKeys<TFormData>>(field: TField, updater: Updater<FieldMeta>) => void;
|
|
104
|
+
setFieldValue: <TField extends DeepKeys<TFormData>>(field: TField, updater: Updater<DeepValue<TFormData, TField>>, opts?: {
|
|
105
|
+
touch?: boolean;
|
|
106
|
+
}) => void;
|
|
107
|
+
deleteField: <TField extends DeepKeys<TFormData>>(field: TField) => void;
|
|
108
|
+
pushFieldValue: <TField extends DeepKeys<TFormData>>(field: TField, value: DeepValue<TFormData, TField> extends any[] ? DeepValue<TFormData, TField>[number] : never, opts?: {
|
|
109
|
+
touch?: boolean;
|
|
110
|
+
}) => void;
|
|
111
|
+
insertFieldValue: <TField extends DeepKeys<TFormData>>(field: TField, index: number, value: DeepValue<TFormData, TField> extends any[] ? DeepValue<TFormData, TField>[number] : never, opts?: {
|
|
112
|
+
touch?: boolean;
|
|
113
|
+
}) => void;
|
|
114
|
+
removeFieldValue: <TField extends DeepKeys<TFormData>>(field: TField, index: number, opts?: {
|
|
115
|
+
touch?: boolean;
|
|
116
|
+
}) => void;
|
|
117
|
+
swapFieldValues: <TField extends DeepKeys<TFormData>>(field: TField, index1: number, index2: number) => void;
|
|
118
|
+
}
|