@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.
Files changed (101) hide show
  1. package/dist/cjs/FieldApi.d.ts +94 -0
  2. package/dist/cjs/FormApi.d.ts +118 -0
  3. package/dist/cjs/index.cjs +926 -0
  4. package/dist/cjs/index.cjs.map +1 -0
  5. package/dist/cjs/index.d.cts +5 -0
  6. package/dist/cjs/index.d.ts +5 -0
  7. package/dist/cjs/index.js +926 -0
  8. package/dist/cjs/mergeForm.d.ts +4 -0
  9. package/dist/cjs/tests/FieldApi.spec.d.ts +1 -0
  10. package/dist/cjs/tests/FieldApi.test-d.d.ts +1 -0
  11. package/dist/cjs/tests/FormApi.spec.d.ts +1 -0
  12. package/dist/cjs/tests/mutateMergeDeep.spec.d.ts +1 -0
  13. package/dist/cjs/tests/utils.d.ts +1 -0
  14. package/dist/cjs/tests/utils.spec.d.ts +1 -0
  15. package/dist/cjs/types.d.ts +14 -0
  16. package/dist/cjs/utils.d.ts +57 -0
  17. package/dist/mjs/FieldApi.d.ts +94 -0
  18. package/dist/mjs/FormApi.d.ts +118 -0
  19. package/dist/mjs/index.d.mts +5 -0
  20. package/dist/mjs/index.d.ts +5 -0
  21. package/dist/mjs/index.js +926 -0
  22. package/dist/mjs/index.mjs +926 -0
  23. package/dist/mjs/index.mjs.map +1 -0
  24. package/dist/mjs/mergeForm.d.ts +4 -0
  25. package/dist/mjs/tests/FieldApi.spec.d.ts +1 -0
  26. package/dist/mjs/tests/FieldApi.test-d.d.ts +1 -0
  27. package/dist/mjs/tests/FormApi.spec.d.ts +1 -0
  28. package/dist/mjs/tests/mutateMergeDeep.spec.d.ts +1 -0
  29. package/dist/mjs/tests/utils.d.ts +1 -0
  30. package/dist/mjs/tests/utils.spec.d.ts +1 -0
  31. package/dist/mjs/types.d.ts +14 -0
  32. package/dist/mjs/utils.d.ts +57 -0
  33. package/package.json +16 -21
  34. package/src/FieldApi.ts +53 -38
  35. package/src/FormApi.ts +59 -23
  36. package/src/index.ts +1 -0
  37. package/src/mergeForm.ts +42 -0
  38. package/src/tests/FormApi.spec.ts +1 -0
  39. package/src/tests/mutateMergeDeep.spec.ts +32 -0
  40. package/src/types.ts +2 -1
  41. package/src/utils.ts +40 -23
  42. package/build/legacy/FieldApi.cjs +0 -313
  43. package/build/legacy/FieldApi.cjs.map +0 -1
  44. package/build/legacy/FieldApi.d.cts +0 -3
  45. package/build/legacy/FieldApi.d.ts +0 -3
  46. package/build/legacy/FieldApi.js +0 -288
  47. package/build/legacy/FieldApi.js.map +0 -1
  48. package/build/legacy/FormApi.cjs +0 -445
  49. package/build/legacy/FormApi.cjs.map +0 -1
  50. package/build/legacy/FormApi.d.cts +0 -3
  51. package/build/legacy/FormApi.d.ts +0 -3
  52. package/build/legacy/FormApi.js +0 -428
  53. package/build/legacy/FormApi.js.map +0 -1
  54. package/build/legacy/index.cjs +0 -31
  55. package/build/legacy/index.cjs.map +0 -1
  56. package/build/legacy/index.d.cts +0 -257
  57. package/build/legacy/index.d.ts +0 -257
  58. package/build/legacy/index.js +0 -6
  59. package/build/legacy/index.js.map +0 -1
  60. package/build/legacy/types.cjs +0 -19
  61. package/build/legacy/types.cjs.map +0 -1
  62. package/build/legacy/types.d.cts +0 -16
  63. package/build/legacy/types.d.ts +0 -16
  64. package/build/legacy/types.js +0 -1
  65. package/build/legacy/types.js.map +0 -1
  66. package/build/legacy/utils.cjs +0 -187
  67. package/build/legacy/utils.cjs.map +0 -1
  68. package/build/legacy/utils.d.cts +0 -3
  69. package/build/legacy/utils.d.ts +0 -3
  70. package/build/legacy/utils.js +0 -156
  71. package/build/legacy/utils.js.map +0 -1
  72. package/build/modern/FieldApi.cjs +0 -312
  73. package/build/modern/FieldApi.cjs.map +0 -1
  74. package/build/modern/FieldApi.d.cts +0 -3
  75. package/build/modern/FieldApi.d.ts +0 -3
  76. package/build/modern/FieldApi.js +0 -287
  77. package/build/modern/FieldApi.js.map +0 -1
  78. package/build/modern/FormApi.cjs +0 -439
  79. package/build/modern/FormApi.cjs.map +0 -1
  80. package/build/modern/FormApi.d.cts +0 -3
  81. package/build/modern/FormApi.d.ts +0 -3
  82. package/build/modern/FormApi.js +0 -422
  83. package/build/modern/FormApi.js.map +0 -1
  84. package/build/modern/index.cjs +0 -31
  85. package/build/modern/index.cjs.map +0 -1
  86. package/build/modern/index.d.cts +0 -257
  87. package/build/modern/index.d.ts +0 -257
  88. package/build/modern/index.js +0 -6
  89. package/build/modern/index.js.map +0 -1
  90. package/build/modern/types.cjs +0 -19
  91. package/build/modern/types.cjs.map +0 -1
  92. package/build/modern/types.d.cts +0 -16
  93. package/build/modern/types.d.ts +0 -16
  94. package/build/modern/types.js +0 -1
  95. package/build/modern/types.js.map +0 -1
  96. package/build/modern/utils.cjs +0 -187
  97. package/build/modern/utils.cjs.map +0 -1
  98. package/build/modern/utils.d.cts +0 -3
  99. package/build/modern/utils.d.ts +0 -3
  100. package/build/modern/utils.js +0 -156
  101. package/build/modern/utils.js.map +0 -1
@@ -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
+ }