@tanstack/form-core 0.0.11 → 0.0.13
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/build/{cjs/FieldApi.js → lib/FieldApi.cjs} +80 -113
- package/build/lib/FieldApi.cjs.map +1 -0
- package/build/lib/FieldApi.d.ts +112 -0
- package/build/lib/FieldApi.d.ts.map +1 -0
- package/build/lib/FieldApi.js +305 -0
- package/build/lib/FieldApi.js.map +1 -0
- package/build/lib/FieldApi.legacy.cjs +307 -0
- package/build/lib/FieldApi.legacy.cjs.map +1 -0
- package/build/lib/FieldApi.legacy.js +305 -0
- package/build/lib/FieldApi.legacy.js.map +1 -0
- package/build/{cjs/FormApi.js → lib/FormApi.cjs} +66 -78
- package/build/lib/FormApi.cjs.map +1 -0
- package/build/{types → lib}/FormApi.d.ts +3 -2
- package/build/lib/FormApi.d.ts.map +1 -0
- package/build/lib/FormApi.js +246 -0
- package/build/lib/FormApi.js.map +1 -0
- package/build/lib/FormApi.legacy.cjs +248 -0
- package/build/lib/FormApi.legacy.cjs.map +1 -0
- package/build/lib/FormApi.legacy.js +246 -0
- package/build/lib/FormApi.legacy.js.map +1 -0
- package/build/{cjs/_virtual/_rollupPluginBabelHelpers.js → lib/_virtual/_rollupPluginBabelHelpers.cjs} +18 -45
- package/build/lib/_virtual/_rollupPluginBabelHelpers.cjs.map +1 -0
- package/build/lib/_virtual/_rollupPluginBabelHelpers.js +56 -0
- package/build/{cjs → lib}/_virtual/_rollupPluginBabelHelpers.js.map +1 -1
- package/build/lib/_virtual/_rollupPluginBabelHelpers.legacy.cjs +65 -0
- package/build/lib/_virtual/_rollupPluginBabelHelpers.legacy.cjs.map +1 -0
- package/build/lib/_virtual/_rollupPluginBabelHelpers.legacy.js +56 -0
- package/build/lib/_virtual/_rollupPluginBabelHelpers.legacy.js.map +1 -0
- package/build/lib/index.cjs +14 -0
- package/build/lib/index.cjs.map +1 -0
- package/build/{types → lib}/index.d.ts +1 -0
- package/build/lib/index.d.ts.map +1 -0
- package/build/lib/index.js +4 -0
- package/build/{cjs → lib}/index.js.map +1 -1
- package/build/lib/index.legacy.cjs +14 -0
- package/build/lib/index.legacy.cjs.map +1 -0
- package/build/lib/index.legacy.js +4 -0
- package/build/lib/index.legacy.js.map +1 -0
- package/build/lib/tests/FieldApi.spec.d.ts +2 -0
- package/build/lib/tests/FieldApi.spec.d.ts.map +1 -0
- package/build/lib/tests/FieldApi.test-d.d.ts +2 -0
- package/build/lib/tests/FieldApi.test-d.d.ts.map +1 -0
- package/build/lib/tests/FormApi.spec.d.ts +2 -0
- package/build/lib/tests/FormApi.spec.d.ts.map +1 -0
- package/build/{cjs/utils.js → lib/utils.cjs} +18 -27
- package/build/lib/utils.cjs.map +1 -0
- package/build/{types → lib}/utils.d.ts +10 -0
- package/build/lib/utils.d.ts.map +1 -0
- package/build/lib/utils.js +77 -0
- package/build/lib/utils.js.map +1 -0
- package/build/lib/utils.legacy.cjs +81 -0
- package/build/lib/utils.legacy.cjs.map +1 -0
- package/build/lib/utils.legacy.js +77 -0
- package/build/lib/utils.legacy.js.map +1 -0
- package/package.json +22 -9
- package/src/FieldApi.ts +101 -46
- package/src/FormApi.ts +34 -14
- package/src/tests/FieldApi.spec.ts +169 -0
- package/src/tests/FieldApi.test-d.ts +41 -0
- package/src/tests/FormApi.spec.ts +216 -0
- package/src/utils.ts +10 -1
- package/build/cjs/FieldApi.js.map +0 -1
- package/build/cjs/FormApi.js.map +0 -1
- package/build/cjs/index.js +0 -26
- package/build/cjs/utils.js.map +0 -1
- package/build/esm/index.js +0 -716
- package/build/esm/index.js.map +0 -1
- package/build/stats-html.html +0 -2689
- package/build/stats-react.json +0 -196
- package/build/types/FieldApi.d.ts +0 -85
- package/build/types/tests/test.test.d.ts +0 -0
- package/build/umd/index.development.js +0 -779
- package/build/umd/index.development.js.map +0 -1
- package/build/umd/index.production.js +0 -22
- package/build/umd/index.production.js.map +0 -1
- package/src/tests/test.test.tsx +0 -5
|
@@ -1,20 +1,8 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* form-core
|
|
3
|
-
*
|
|
4
|
-
* Copyright (c) TanStack
|
|
5
|
-
*
|
|
6
|
-
* This source code is licensed under the MIT license found in the
|
|
7
|
-
* LICENSE.md file in the root directory of this source tree.
|
|
8
|
-
*
|
|
9
|
-
* @license MIT
|
|
10
|
-
*/
|
|
11
1
|
'use strict';
|
|
12
2
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
var _rollupPluginBabelHelpers = require('./_virtual/_rollupPluginBabelHelpers.js');
|
|
3
|
+
var _rollupPluginBabelHelpers = require('./_virtual/_rollupPluginBabelHelpers.cjs');
|
|
16
4
|
var store = require('@tanstack/store');
|
|
17
|
-
var utils = require('./utils.
|
|
5
|
+
var utils = require('./utils.cjs');
|
|
18
6
|
|
|
19
7
|
function getDefaultFormState(defaultState) {
|
|
20
8
|
return {
|
|
@@ -35,44 +23,45 @@ function getDefaultFormState(defaultState) {
|
|
|
35
23
|
...defaultState
|
|
36
24
|
};
|
|
37
25
|
}
|
|
38
|
-
|
|
39
26
|
class FormApi {
|
|
40
|
-
// // This carries the context for nested fields
|
|
41
|
-
// Do not use __state directly, as it is not reactive.
|
|
42
|
-
// Please use form.useStore() utility to subscribe to state
|
|
43
27
|
constructor(_opts) {
|
|
44
28
|
var _opts$defaultValues, _opts$defaultState;
|
|
45
|
-
|
|
29
|
+
// // This carries the context for nested fields
|
|
46
30
|
_rollupPluginBabelHelpers.defineProperty(this, "options", {});
|
|
47
|
-
|
|
48
31
|
_rollupPluginBabelHelpers.defineProperty(this, "store", void 0);
|
|
49
|
-
|
|
32
|
+
// Do not use __state directly, as it is not reactive.
|
|
33
|
+
// Please use form.useStore() utility to subscribe to state
|
|
50
34
|
_rollupPluginBabelHelpers.defineProperty(this, "state", void 0);
|
|
51
|
-
|
|
52
35
|
_rollupPluginBabelHelpers.defineProperty(this, "fieldInfo", {});
|
|
53
|
-
|
|
54
36
|
_rollupPluginBabelHelpers.defineProperty(this, "fieldName", void 0);
|
|
55
|
-
|
|
56
37
|
_rollupPluginBabelHelpers.defineProperty(this, "validationMeta", {});
|
|
57
|
-
|
|
58
38
|
_rollupPluginBabelHelpers.defineProperty(this, "update", options => {
|
|
59
39
|
if (!options) return;
|
|
60
40
|
this.store.batch(() => {
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
...options.defaultState
|
|
64
|
-
}));
|
|
65
|
-
}
|
|
41
|
+
const shouldUpdateValues = options.defaultValues && options.defaultValues !== this.options.defaultValues;
|
|
42
|
+
const shouldUpdateState = options.defaultState !== this.options.defaultState;
|
|
66
43
|
|
|
67
|
-
|
|
68
|
-
|
|
44
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
45
|
+
if (!shouldUpdateValues || !shouldUpdateValues) {
|
|
46
|
+
return;
|
|
69
47
|
}
|
|
48
|
+
this.store.setState(() => getDefaultFormState(Object.assign({},
|
|
49
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
50
|
+
shouldUpdateState ? options.defaultState : {},
|
|
51
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
52
|
+
shouldUpdateValues ? {
|
|
53
|
+
values: options.defaultValues
|
|
54
|
+
} : {})));
|
|
70
55
|
});
|
|
71
56
|
this.options = options;
|
|
72
57
|
});
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
58
|
+
_rollupPluginBabelHelpers.defineProperty(this, "reset", () => this.store.setState(() => {
|
|
59
|
+
var _this$options$default, _this$options$default2;
|
|
60
|
+
return getDefaultFormState({
|
|
61
|
+
...this.options.defaultState,
|
|
62
|
+
values: (_this$options$default = this.options.defaultValues) != null ? _this$options$default : (_this$options$default2 = this.options.defaultState) == null ? void 0 : _this$options$default2.values
|
|
63
|
+
});
|
|
64
|
+
}));
|
|
76
65
|
_rollupPluginBabelHelpers.defineProperty(this, "validateAllFields", async cause => {
|
|
77
66
|
const fieldValidationPromises = [];
|
|
78
67
|
this.store.batch(() => {
|
|
@@ -81,10 +70,11 @@ class FormApi {
|
|
|
81
70
|
// If any fields are not touched
|
|
82
71
|
if (!instance.state.meta.isTouched) {
|
|
83
72
|
// Mark them as touched
|
|
84
|
-
instance.setMeta(prev => ({
|
|
73
|
+
instance.setMeta(prev => ({
|
|
74
|
+
...prev,
|
|
85
75
|
isTouched: true
|
|
86
|
-
}));
|
|
87
|
-
|
|
76
|
+
}));
|
|
77
|
+
// Validate the field
|
|
88
78
|
fieldValidationPromises.push(Promise.resolve().then(() => instance.validate(cause)));
|
|
89
79
|
}
|
|
90
80
|
});
|
|
@@ -92,60 +82,64 @@ class FormApi {
|
|
|
92
82
|
});
|
|
93
83
|
return Promise.all(fieldValidationPromises);
|
|
94
84
|
});
|
|
95
|
-
|
|
85
|
+
// validateForm = async () => {}
|
|
96
86
|
_rollupPluginBabelHelpers.defineProperty(this, "handleSubmit", async e => {
|
|
97
87
|
e.preventDefault();
|
|
98
|
-
e.stopPropagation();
|
|
88
|
+
e.stopPropagation();
|
|
89
|
+
|
|
90
|
+
// Check to see that the form and all fields have been touched
|
|
99
91
|
// If they have not, touch them all and run validation
|
|
100
92
|
// Run form validation
|
|
101
93
|
// Submit the form
|
|
102
94
|
|
|
103
|
-
this.store.setState(old => ({
|
|
95
|
+
this.store.setState(old => ({
|
|
96
|
+
...old,
|
|
104
97
|
// Submittion attempts mark the form as not submitted
|
|
105
98
|
isSubmitted: false,
|
|
106
99
|
// Count submission attempts
|
|
107
100
|
submissionAttempts: old.submissionAttempts + 1
|
|
108
|
-
}));
|
|
101
|
+
}));
|
|
109
102
|
|
|
103
|
+
// Don't let invalid forms submit
|
|
110
104
|
if (!this.state.canSubmit) return;
|
|
111
|
-
this.store.setState(d => ({
|
|
105
|
+
this.store.setState(d => ({
|
|
106
|
+
...d,
|
|
112
107
|
isSubmitting: true
|
|
113
108
|
}));
|
|
114
|
-
|
|
115
109
|
const done = () => {
|
|
116
|
-
this.store.setState(prev => ({
|
|
110
|
+
this.store.setState(prev => ({
|
|
111
|
+
...prev,
|
|
117
112
|
isSubmitting: false
|
|
118
113
|
}));
|
|
119
|
-
};
|
|
114
|
+
};
|
|
120
115
|
|
|
116
|
+
// Validate all fields
|
|
117
|
+
await this.validateAllFields('submit');
|
|
121
118
|
|
|
122
|
-
|
|
123
|
-
|
|
119
|
+
// Fields are invalid, do not submit
|
|
124
120
|
if (!this.state.isFieldsValid) {
|
|
125
121
|
var _this$options$onSubmi, _this$options;
|
|
126
|
-
|
|
127
122
|
done();
|
|
128
123
|
(_this$options$onSubmi = (_this$options = this.options).onSubmitInvalid) == null ? void 0 : _this$options$onSubmi.call(_this$options, this.state.values, this);
|
|
129
124
|
return;
|
|
130
|
-
}
|
|
131
|
-
// await this.validateForm()
|
|
125
|
+
}
|
|
132
126
|
|
|
127
|
+
// Run validation for the form
|
|
128
|
+
// await this.validateForm()
|
|
133
129
|
|
|
134
130
|
if (!this.state.isValid) {
|
|
135
131
|
var _this$options$onSubmi2, _this$options2;
|
|
136
|
-
|
|
137
132
|
done();
|
|
138
133
|
(_this$options$onSubmi2 = (_this$options2 = this.options).onSubmitInvalid) == null ? void 0 : _this$options$onSubmi2.call(_this$options2, this.state.values, this);
|
|
139
134
|
return;
|
|
140
135
|
}
|
|
141
|
-
|
|
142
136
|
try {
|
|
143
137
|
var _this$options$onSubmi3, _this$options3;
|
|
144
|
-
|
|
145
138
|
// Run the submit code
|
|
146
139
|
await ((_this$options$onSubmi3 = (_this$options3 = this.options).onSubmit) == null ? void 0 : _this$options$onSubmi3.call(_this$options3, this.state.values, this));
|
|
147
140
|
this.store.batch(() => {
|
|
148
|
-
this.store.setState(prev => ({
|
|
141
|
+
this.store.setState(prev => ({
|
|
142
|
+
...prev,
|
|
149
143
|
isSubmitted: true
|
|
150
144
|
}));
|
|
151
145
|
done();
|
|
@@ -155,81 +149,75 @@ class FormApi {
|
|
|
155
149
|
throw err;
|
|
156
150
|
}
|
|
157
151
|
});
|
|
158
|
-
|
|
159
152
|
_rollupPluginBabelHelpers.defineProperty(this, "getFieldValue", field => utils.getBy(this.state.values, field));
|
|
160
|
-
|
|
161
153
|
_rollupPluginBabelHelpers.defineProperty(this, "getFieldMeta", field => {
|
|
162
154
|
return this.state.fieldMeta[field];
|
|
163
155
|
});
|
|
164
|
-
|
|
165
156
|
_rollupPluginBabelHelpers.defineProperty(this, "getFieldInfo", field => {
|
|
166
157
|
var _this$fieldInfo;
|
|
167
|
-
|
|
158
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
168
159
|
return (_this$fieldInfo = this.fieldInfo)[field] || (_this$fieldInfo[field] = {
|
|
169
160
|
instances: {}
|
|
170
161
|
});
|
|
171
162
|
});
|
|
172
|
-
|
|
173
163
|
_rollupPluginBabelHelpers.defineProperty(this, "setFieldMeta", (field, updater) => {
|
|
174
164
|
this.store.setState(prev => {
|
|
175
|
-
return {
|
|
176
|
-
|
|
165
|
+
return {
|
|
166
|
+
...prev,
|
|
167
|
+
fieldMeta: {
|
|
168
|
+
...prev.fieldMeta,
|
|
177
169
|
[field]: utils.functionalUpdate(updater, prev.fieldMeta[field])
|
|
178
170
|
}
|
|
179
171
|
};
|
|
180
172
|
});
|
|
181
173
|
});
|
|
182
|
-
|
|
183
174
|
_rollupPluginBabelHelpers.defineProperty(this, "setFieldValue", (field, updater, opts) => {
|
|
184
175
|
const touch = opts == null ? void 0 : opts.touch;
|
|
185
176
|
this.store.batch(() => {
|
|
186
177
|
if (touch) {
|
|
187
|
-
this.setFieldMeta(field, prev => ({
|
|
178
|
+
this.setFieldMeta(field, prev => ({
|
|
179
|
+
...prev,
|
|
188
180
|
isTouched: true
|
|
189
181
|
}));
|
|
190
182
|
}
|
|
191
|
-
|
|
192
183
|
this.store.setState(prev => {
|
|
193
|
-
return {
|
|
184
|
+
return {
|
|
185
|
+
...prev,
|
|
194
186
|
values: utils.setBy(prev.values, field, updater)
|
|
195
187
|
};
|
|
196
188
|
});
|
|
197
189
|
});
|
|
198
190
|
});
|
|
199
|
-
|
|
200
191
|
_rollupPluginBabelHelpers.defineProperty(this, "pushFieldValue", (field, value, opts) => {
|
|
201
192
|
return this.setFieldValue(field, prev => [...(Array.isArray(prev) ? prev : []), value], opts);
|
|
202
193
|
});
|
|
203
|
-
|
|
204
194
|
_rollupPluginBabelHelpers.defineProperty(this, "insertFieldValue", (field, index, value, opts) => {
|
|
205
195
|
this.setFieldValue(field, prev => {
|
|
206
196
|
return prev.map((d, i) => i === index ? value : d);
|
|
207
197
|
}, opts);
|
|
208
198
|
});
|
|
209
|
-
|
|
210
199
|
_rollupPluginBabelHelpers.defineProperty(this, "removeFieldValue", (field, index, opts) => {
|
|
211
200
|
this.setFieldValue(field, prev => {
|
|
212
201
|
return prev.filter((_d, i) => i !== index);
|
|
213
202
|
}, opts);
|
|
214
203
|
});
|
|
215
|
-
|
|
216
204
|
_rollupPluginBabelHelpers.defineProperty(this, "swapFieldValues", (field, index1, index2) => {
|
|
217
205
|
this.setFieldValue(field, prev => {
|
|
218
206
|
const prev1 = prev[index1];
|
|
219
207
|
const prev2 = prev[index2];
|
|
220
|
-
return utils.setBy(utils.setBy(prev,
|
|
208
|
+
return utils.setBy(utils.setBy(prev, "" + index1, prev2), "" + index2, prev1);
|
|
221
209
|
});
|
|
222
210
|
});
|
|
223
|
-
|
|
224
|
-
|
|
211
|
+
this.store = new store.Store(getDefaultFormState({
|
|
212
|
+
...(_opts == null ? void 0 : _opts.defaultState),
|
|
225
213
|
values: (_opts$defaultValues = _opts == null ? void 0 : _opts.defaultValues) != null ? _opts$defaultValues : _opts == null ? void 0 : (_opts$defaultState = _opts.defaultState) == null ? void 0 : _opts$defaultState.values,
|
|
226
214
|
isFormValid: true
|
|
227
215
|
}), {
|
|
228
216
|
onUpdate: () => {
|
|
229
217
|
let {
|
|
230
218
|
state
|
|
231
|
-
} = this.store;
|
|
232
|
-
|
|
219
|
+
} = this.store;
|
|
220
|
+
// Computed state
|
|
233
221
|
const fieldMetaValues = Object.values(state.fieldMeta);
|
|
234
222
|
const isFieldsValidating = fieldMetaValues.some(field => field == null ? void 0 : field.isValidating);
|
|
235
223
|
const isFieldsValid = !fieldMetaValues.some(field => field == null ? void 0 : field.error);
|
|
@@ -238,7 +226,8 @@ class FormApi {
|
|
|
238
226
|
const isFormValid = !state.formError;
|
|
239
227
|
const isValid = isFieldsValid && isFormValid;
|
|
240
228
|
const canSubmit = state.submissionAttempts === 0 && !isTouched || !isValidating && !state.isSubmitting && isValid;
|
|
241
|
-
state = {
|
|
229
|
+
state = {
|
|
230
|
+
...state,
|
|
242
231
|
isFieldsValidating,
|
|
243
232
|
isFieldsValid,
|
|
244
233
|
isFormValid,
|
|
@@ -253,8 +242,7 @@ class FormApi {
|
|
|
253
242
|
this.state = this.store.state;
|
|
254
243
|
this.update(_opts || {});
|
|
255
244
|
}
|
|
256
|
-
|
|
257
245
|
}
|
|
258
246
|
|
|
259
247
|
exports.FormApi = FormApi;
|
|
260
|
-
//# sourceMappingURL=FormApi.
|
|
248
|
+
//# sourceMappingURL=FormApi.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FormApi.cjs","sources":["../../src/FormApi.ts"],"sourcesContent":["import { Store } from '@tanstack/store'\n//\nimport type { DeepKeys, DeepValue, Updater } from './utils'\nimport { functionalUpdate, getBy, setBy } from './utils'\nimport type { FieldApi, FieldMeta, ValidationCause } from './FieldApi'\n\nexport interface Register {\n // FormSubmitEvent\n}\n\nexport type FormSubmitEvent = Register extends {\n FormSubmitEvent: infer E\n}\n ? E\n : Event\n\nexport type FormOptions<TData> = {\n defaultValues?: TData\n defaultState?: Partial<FormState<TData>>\n asyncDebounceMs?: number\n onMount?: (values: TData, formApi: FormApi<TData>) => ValidationError\n onMountAsync?: (\n values: TData,\n formApi: FormApi<TData>,\n ) => ValidationError | Promise<ValidationError>\n onMountAsyncDebounceMs?: number\n onChange?: (values: TData, formApi: FormApi<TData>) => ValidationError\n onChangeAsync?: (\n values: TData,\n formApi: FormApi<TData>,\n ) => ValidationError | Promise<ValidationError>\n onChangeAsyncDebounceMs?: number\n onBlur?: (values: TData, formApi: FormApi<TData>) => ValidationError\n onBlurAsync?: (\n values: TData,\n formApi: FormApi<TData>,\n ) => ValidationError | Promise<ValidationError>\n onBlurAsyncDebounceMs?: number\n onSubmit?: (values: TData, formApi: FormApi<TData>) => any | Promise<any>\n onSubmitInvalid?: (values: TData, formApi: FormApi<TData>) => void\n}\n\nexport type FieldInfo<TFormData> = {\n instances: Record<string, FieldApi<any, TFormData>>\n} & ValidationMeta\n\nexport type ValidationMeta = {\n validationCount?: number\n validationAsyncCount?: number\n validationPromise?: Promise<ValidationError>\n validationResolve?: (error: ValidationError) => void\n validationReject?: (error: unknown) => void\n}\n\nexport type ValidationError = undefined | false | null | string\n\nexport type FormState<TData> = {\n values: TData\n // Form Validation\n isFormValidating: boolean\n formValidationCount: number\n isFormValid: boolean\n formError?: ValidationError\n // Fields\n fieldMeta: Record<DeepKeys<TData>, FieldMeta>\n isFieldsValidating: boolean\n isFieldsValid: boolean\n isSubmitting: boolean\n // General\n isTouched: boolean\n isSubmitted: boolean\n isValidating: boolean\n isValid: boolean\n canSubmit: boolean\n submissionAttempts: number\n}\n\nfunction getDefaultFormState<TData>(\n defaultState: Partial<FormState<TData>>,\n): FormState<TData> {\n return {\n values: {} as any,\n fieldMeta: {} as any,\n canSubmit: true,\n isFieldsValid: false,\n isFieldsValidating: false,\n isFormValid: false,\n isFormValidating: false,\n isSubmitted: false,\n isSubmitting: false,\n isTouched: false,\n isValid: false,\n isValidating: false,\n submissionAttempts: 0,\n formValidationCount: 0,\n ...defaultState,\n }\n}\n\nexport class FormApi<TFormData> {\n // // This carries the context for nested fields\n options: FormOptions<TFormData> = {}\n store!: Store<FormState<TFormData>>\n // Do not use __state directly, as it is not reactive.\n // Please use form.useStore() utility to subscribe to state\n state!: FormState<TFormData>\n fieldInfo: Record<DeepKeys<TFormData>, FieldInfo<TFormData>> = {} as any\n fieldName?: string\n validationMeta: ValidationMeta = {}\n\n constructor(opts?: FormOptions<TFormData>) {\n this.store = new Store<FormState<TFormData>>(\n getDefaultFormState({\n ...opts?.defaultState,\n values: opts?.defaultValues ?? opts?.defaultState?.values,\n isFormValid: true,\n }),\n {\n onUpdate: () => {\n let { state } = this.store\n // Computed state\n const fieldMetaValues = Object.values(state.fieldMeta) as (\n | FieldMeta\n | undefined\n )[]\n\n const isFieldsValidating = fieldMetaValues.some(\n (field) => field?.isValidating,\n )\n\n const isFieldsValid = !fieldMetaValues.some((field) => field?.error)\n\n const isTouched = fieldMetaValues.some((field) => field?.isTouched)\n\n const isValidating = isFieldsValidating || state.isFormValidating\n const isFormValid = !state.formError\n const isValid = isFieldsValid && isFormValid\n const canSubmit =\n (state.submissionAttempts === 0 && !isTouched) ||\n (!isValidating && !state.isSubmitting && isValid)\n\n state = {\n ...state,\n isFieldsValidating,\n isFieldsValid,\n isFormValid,\n isValid,\n canSubmit,\n isTouched,\n }\n\n this.store.state = state\n this.state = state\n },\n },\n )\n\n this.state = this.store.state\n\n this.update(opts || {})\n }\n\n update = (options?: FormOptions<TFormData>) => {\n if (!options) return\n\n this.store.batch(() => {\n const shouldUpdateValues =\n options.defaultValues &&\n options.defaultValues !== this.options.defaultValues\n\n const shouldUpdateState =\n options.defaultState !== this.options.defaultState\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!shouldUpdateValues || !shouldUpdateValues) {\n return\n }\n\n this.store.setState(() =>\n getDefaultFormState(\n Object.assign(\n {},\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n shouldUpdateState ? options.defaultState : {},\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n shouldUpdateValues\n ? {\n values: options.defaultValues,\n }\n : {},\n ),\n ),\n )\n })\n\n this.options = options\n }\n\n reset = () =>\n this.store.setState(() =>\n getDefaultFormState({\n ...this.options.defaultState,\n values: this.options.defaultValues ?? this.options.defaultState?.values,\n }),\n )\n\n validateAllFields = async (cause: ValidationCause) => {\n const fieldValidationPromises: Promise<ValidationError>[] = [] as any\n\n this.store.batch(() => {\n void (Object.values(this.fieldInfo) as FieldInfo<any>[]).forEach(\n (field) => {\n Object.values(field.instances).forEach((instance) => {\n // If any fields are not touched\n if (!instance.state.meta.isTouched) {\n // Mark them as touched\n instance.setMeta((prev) => ({ ...prev, isTouched: true }))\n // Validate the field\n fieldValidationPromises.push(\n Promise.resolve().then(() => instance.validate(cause)),\n )\n }\n })\n },\n )\n })\n\n return Promise.all(fieldValidationPromises)\n }\n\n // validateForm = async () => {}\n\n handleSubmit = async (e: FormSubmitEvent) => {\n e.preventDefault()\n e.stopPropagation()\n\n // Check to see that the form and all fields have been touched\n // If they have not, touch them all and run validation\n // Run form validation\n // Submit the form\n\n this.store.setState((old) => ({\n ...old,\n // Submittion attempts mark the form as not submitted\n isSubmitted: false,\n // Count submission attempts\n submissionAttempts: old.submissionAttempts + 1,\n }))\n\n // Don't let invalid forms submit\n if (!this.state.canSubmit) return\n\n this.store.setState((d) => ({ ...d, isSubmitting: true }))\n\n const done = () => {\n this.store.setState((prev) => ({ ...prev, isSubmitting: false }))\n }\n\n // Validate all fields\n await this.validateAllFields('submit')\n\n // Fields are invalid, do not submit\n if (!this.state.isFieldsValid) {\n done()\n this.options.onSubmitInvalid?.(this.state.values, this)\n return\n }\n\n // Run validation for the form\n // await this.validateForm()\n\n if (!this.state.isValid) {\n done()\n this.options.onSubmitInvalid?.(this.state.values, this)\n return\n }\n\n try {\n // Run the submit code\n await this.options.onSubmit?.(this.state.values, this)\n\n this.store.batch(() => {\n this.store.setState((prev) => ({ ...prev, isSubmitted: true }))\n done()\n })\n } catch (err) {\n done()\n throw err\n }\n }\n\n getFieldValue = <TField extends DeepKeys<TFormData>>(\n field: TField,\n ): DeepValue<TFormData, TField> => getBy(this.state.values, field)\n\n getFieldMeta = <TField extends DeepKeys<TFormData>>(\n field: TField,\n ): FieldMeta => {\n return this.state.fieldMeta[field]\n }\n\n getFieldInfo = <TField extends DeepKeys<TFormData>>(field: TField) => {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n return (this.fieldInfo[field] ||= {\n instances: {},\n })\n }\n\n setFieldMeta = <TField extends DeepKeys<TFormData>>(\n field: TField,\n updater: Updater<FieldMeta>,\n ) => {\n this.store.setState((prev) => {\n return {\n ...prev,\n fieldMeta: {\n ...prev.fieldMeta,\n [field]: functionalUpdate(updater, prev.fieldMeta[field]),\n },\n }\n })\n }\n\n setFieldValue = <TField extends DeepKeys<TFormData>>(\n field: TField,\n updater: Updater<DeepValue<TFormData, TField>>,\n opts?: { touch?: boolean },\n ) => {\n const touch = opts?.touch\n\n this.store.batch(() => {\n if (touch) {\n this.setFieldMeta(field, (prev) => ({\n ...prev,\n isTouched: true,\n }))\n }\n\n this.store.setState((prev) => {\n return {\n ...prev,\n values: setBy(prev.values, field, updater),\n }\n })\n })\n }\n\n pushFieldValue = <TField extends DeepKeys<TFormData>>(\n field: TField,\n value: DeepValue<TFormData, TField>[number],\n opts?: { touch?: boolean },\n ) => {\n return this.setFieldValue(\n field,\n (prev) => [...(Array.isArray(prev) ? prev : []), value] as any,\n opts,\n )\n }\n\n insertFieldValue = <TField extends DeepKeys<TFormData>>(\n field: TField,\n index: number,\n value: DeepValue<TFormData, TField>[number],\n opts?: { touch?: boolean },\n ) => {\n this.setFieldValue(\n field,\n (prev) => {\n return (prev as DeepValue<TFormData, TField>[]).map((d, i) =>\n i === index ? value : d,\n ) as any\n },\n opts,\n )\n }\n\n removeFieldValue = <TField extends DeepKeys<TFormData>>(\n field: TField,\n index: number,\n opts?: { touch?: boolean },\n ) => {\n this.setFieldValue(\n field,\n (prev) => {\n return (prev as DeepValue<TFormData, TField>[]).filter(\n (_d, i) => i !== index,\n ) as any\n },\n opts,\n )\n }\n\n swapFieldValues = <TField extends DeepKeys<TFormData>>(\n field: TField,\n index1: number,\n index2: number,\n ) => {\n this.setFieldValue(field, (prev: any) => {\n const prev1 = prev[index1]!\n const prev2 = prev[index2]!\n return setBy(setBy(prev, `${index1}`, prev2), `${index2}`, prev1)\n })\n }\n}\n"],"names":["getDefaultFormState","defaultState","values","fieldMeta","canSubmit","isFieldsValid","isFieldsValidating","isFormValid","isFormValidating","isSubmitted","isSubmitting","isTouched","isValid","isValidating","submissionAttempts","formValidationCount","FormApi","constructor","opts","_opts$defaultValues","_opts$defaultState","_defineProperty","options","store","batch","shouldUpdateValues","defaultValues","shouldUpdateState","setState","Object","assign","_this$options$default","_this$options$default2","cause","fieldValidationPromises","fieldInfo","forEach","field","instances","instance","state","meta","setMeta","prev","push","Promise","resolve","then","validate","all","e","preventDefault","stopPropagation","old","d","done","validateAllFields","_this$options$onSubmi","_this$options","onSubmitInvalid","call","_this$options$onSubmi2","_this$options2","_this$options$onSubmi3","_this$options3","onSubmit","err","getBy","_this$fieldInfo","updater","functionalUpdate","touch","setFieldMeta","setBy","value","setFieldValue","Array","isArray","index","map","i","filter","_d","index1","index2","prev1","prev2","Store","onUpdate","fieldMetaValues","some","error","formError","update"],"mappings":"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"}
|
|
@@ -69,10 +69,10 @@ export declare class FormApi<TFormData> {
|
|
|
69
69
|
setFieldValue: <TField extends DeepKeys<TFormData>>(field: TField, updater: Updater<DeepValue<TFormData, TField>>, opts?: {
|
|
70
70
|
touch?: boolean;
|
|
71
71
|
}) => void;
|
|
72
|
-
pushFieldValue: <TField extends DeepKeys<TFormData>>(field: TField, value: DeepValue<TFormData, TField
|
|
72
|
+
pushFieldValue: <TField extends DeepKeys<TFormData>>(field: TField, value: DeepValue<TFormData, TField>[number], opts?: {
|
|
73
73
|
touch?: boolean;
|
|
74
74
|
}) => void;
|
|
75
|
-
insertFieldValue: <TField extends DeepKeys<TFormData>>(field: TField, index: number, value: DeepValue<TFormData, TField
|
|
75
|
+
insertFieldValue: <TField extends DeepKeys<TFormData>>(field: TField, index: number, value: DeepValue<TFormData, TField>[number], opts?: {
|
|
76
76
|
touch?: boolean;
|
|
77
77
|
}) => void;
|
|
78
78
|
removeFieldValue: <TField extends DeepKeys<TFormData>>(field: TField, index: number, opts?: {
|
|
@@ -80,3 +80,4 @@ export declare class FormApi<TFormData> {
|
|
|
80
80
|
}) => void;
|
|
81
81
|
swapFieldValues: <TField extends DeepKeys<TFormData>>(field: TField, index1: number, index2: number) => void;
|
|
82
82
|
}
|
|
83
|
+
//# sourceMappingURL=FormApi.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FormApi.d.ts","sourceRoot":"","sources":["../../src/FormApi.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
import { defineProperty as _defineProperty } from './_virtual/_rollupPluginBabelHelpers.js';
|
|
2
|
+
import { Store } from '@tanstack/store';
|
|
3
|
+
import { getBy, functionalUpdate, setBy } from './utils.js';
|
|
4
|
+
|
|
5
|
+
function getDefaultFormState(defaultState) {
|
|
6
|
+
return {
|
|
7
|
+
values: {},
|
|
8
|
+
fieldMeta: {},
|
|
9
|
+
canSubmit: true,
|
|
10
|
+
isFieldsValid: false,
|
|
11
|
+
isFieldsValidating: false,
|
|
12
|
+
isFormValid: false,
|
|
13
|
+
isFormValidating: false,
|
|
14
|
+
isSubmitted: false,
|
|
15
|
+
isSubmitting: false,
|
|
16
|
+
isTouched: false,
|
|
17
|
+
isValid: false,
|
|
18
|
+
isValidating: false,
|
|
19
|
+
submissionAttempts: 0,
|
|
20
|
+
formValidationCount: 0,
|
|
21
|
+
...defaultState
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
class FormApi {
|
|
25
|
+
constructor(_opts) {
|
|
26
|
+
var _opts$defaultValues, _opts$defaultState;
|
|
27
|
+
// // This carries the context for nested fields
|
|
28
|
+
_defineProperty(this, "options", {});
|
|
29
|
+
_defineProperty(this, "store", void 0);
|
|
30
|
+
// Do not use __state directly, as it is not reactive.
|
|
31
|
+
// Please use form.useStore() utility to subscribe to state
|
|
32
|
+
_defineProperty(this, "state", void 0);
|
|
33
|
+
_defineProperty(this, "fieldInfo", {});
|
|
34
|
+
_defineProperty(this, "fieldName", void 0);
|
|
35
|
+
_defineProperty(this, "validationMeta", {});
|
|
36
|
+
_defineProperty(this, "update", options => {
|
|
37
|
+
if (!options) return;
|
|
38
|
+
this.store.batch(() => {
|
|
39
|
+
const shouldUpdateValues = options.defaultValues && options.defaultValues !== this.options.defaultValues;
|
|
40
|
+
const shouldUpdateState = options.defaultState !== this.options.defaultState;
|
|
41
|
+
|
|
42
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
43
|
+
if (!shouldUpdateValues || !shouldUpdateValues) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
this.store.setState(() => getDefaultFormState(Object.assign({},
|
|
47
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
48
|
+
shouldUpdateState ? options.defaultState : {},
|
|
49
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
50
|
+
shouldUpdateValues ? {
|
|
51
|
+
values: options.defaultValues
|
|
52
|
+
} : {})));
|
|
53
|
+
});
|
|
54
|
+
this.options = options;
|
|
55
|
+
});
|
|
56
|
+
_defineProperty(this, "reset", () => this.store.setState(() => {
|
|
57
|
+
var _this$options$default, _this$options$default2;
|
|
58
|
+
return getDefaultFormState({
|
|
59
|
+
...this.options.defaultState,
|
|
60
|
+
values: (_this$options$default = this.options.defaultValues) != null ? _this$options$default : (_this$options$default2 = this.options.defaultState) == null ? void 0 : _this$options$default2.values
|
|
61
|
+
});
|
|
62
|
+
}));
|
|
63
|
+
_defineProperty(this, "validateAllFields", async cause => {
|
|
64
|
+
const fieldValidationPromises = [];
|
|
65
|
+
this.store.batch(() => {
|
|
66
|
+
void Object.values(this.fieldInfo).forEach(field => {
|
|
67
|
+
Object.values(field.instances).forEach(instance => {
|
|
68
|
+
// If any fields are not touched
|
|
69
|
+
if (!instance.state.meta.isTouched) {
|
|
70
|
+
// Mark them as touched
|
|
71
|
+
instance.setMeta(prev => ({
|
|
72
|
+
...prev,
|
|
73
|
+
isTouched: true
|
|
74
|
+
}));
|
|
75
|
+
// Validate the field
|
|
76
|
+
fieldValidationPromises.push(Promise.resolve().then(() => instance.validate(cause)));
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
return Promise.all(fieldValidationPromises);
|
|
82
|
+
});
|
|
83
|
+
// validateForm = async () => {}
|
|
84
|
+
_defineProperty(this, "handleSubmit", async e => {
|
|
85
|
+
e.preventDefault();
|
|
86
|
+
e.stopPropagation();
|
|
87
|
+
|
|
88
|
+
// Check to see that the form and all fields have been touched
|
|
89
|
+
// If they have not, touch them all and run validation
|
|
90
|
+
// Run form validation
|
|
91
|
+
// Submit the form
|
|
92
|
+
|
|
93
|
+
this.store.setState(old => ({
|
|
94
|
+
...old,
|
|
95
|
+
// Submittion attempts mark the form as not submitted
|
|
96
|
+
isSubmitted: false,
|
|
97
|
+
// Count submission attempts
|
|
98
|
+
submissionAttempts: old.submissionAttempts + 1
|
|
99
|
+
}));
|
|
100
|
+
|
|
101
|
+
// Don't let invalid forms submit
|
|
102
|
+
if (!this.state.canSubmit) return;
|
|
103
|
+
this.store.setState(d => ({
|
|
104
|
+
...d,
|
|
105
|
+
isSubmitting: true
|
|
106
|
+
}));
|
|
107
|
+
const done = () => {
|
|
108
|
+
this.store.setState(prev => ({
|
|
109
|
+
...prev,
|
|
110
|
+
isSubmitting: false
|
|
111
|
+
}));
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
// Validate all fields
|
|
115
|
+
await this.validateAllFields('submit');
|
|
116
|
+
|
|
117
|
+
// Fields are invalid, do not submit
|
|
118
|
+
if (!this.state.isFieldsValid) {
|
|
119
|
+
var _this$options$onSubmi, _this$options;
|
|
120
|
+
done();
|
|
121
|
+
(_this$options$onSubmi = (_this$options = this.options).onSubmitInvalid) == null ? void 0 : _this$options$onSubmi.call(_this$options, this.state.values, this);
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// Run validation for the form
|
|
126
|
+
// await this.validateForm()
|
|
127
|
+
|
|
128
|
+
if (!this.state.isValid) {
|
|
129
|
+
var _this$options$onSubmi2, _this$options2;
|
|
130
|
+
done();
|
|
131
|
+
(_this$options$onSubmi2 = (_this$options2 = this.options).onSubmitInvalid) == null ? void 0 : _this$options$onSubmi2.call(_this$options2, this.state.values, this);
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
try {
|
|
135
|
+
var _this$options$onSubmi3, _this$options3;
|
|
136
|
+
// Run the submit code
|
|
137
|
+
await ((_this$options$onSubmi3 = (_this$options3 = this.options).onSubmit) == null ? void 0 : _this$options$onSubmi3.call(_this$options3, this.state.values, this));
|
|
138
|
+
this.store.batch(() => {
|
|
139
|
+
this.store.setState(prev => ({
|
|
140
|
+
...prev,
|
|
141
|
+
isSubmitted: true
|
|
142
|
+
}));
|
|
143
|
+
done();
|
|
144
|
+
});
|
|
145
|
+
} catch (err) {
|
|
146
|
+
done();
|
|
147
|
+
throw err;
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
_defineProperty(this, "getFieldValue", field => getBy(this.state.values, field));
|
|
151
|
+
_defineProperty(this, "getFieldMeta", field => {
|
|
152
|
+
return this.state.fieldMeta[field];
|
|
153
|
+
});
|
|
154
|
+
_defineProperty(this, "getFieldInfo", field => {
|
|
155
|
+
var _this$fieldInfo;
|
|
156
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
157
|
+
return (_this$fieldInfo = this.fieldInfo)[field] || (_this$fieldInfo[field] = {
|
|
158
|
+
instances: {}
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
_defineProperty(this, "setFieldMeta", (field, updater) => {
|
|
162
|
+
this.store.setState(prev => {
|
|
163
|
+
return {
|
|
164
|
+
...prev,
|
|
165
|
+
fieldMeta: {
|
|
166
|
+
...prev.fieldMeta,
|
|
167
|
+
[field]: functionalUpdate(updater, prev.fieldMeta[field])
|
|
168
|
+
}
|
|
169
|
+
};
|
|
170
|
+
});
|
|
171
|
+
});
|
|
172
|
+
_defineProperty(this, "setFieldValue", (field, updater, opts) => {
|
|
173
|
+
const touch = opts == null ? void 0 : opts.touch;
|
|
174
|
+
this.store.batch(() => {
|
|
175
|
+
if (touch) {
|
|
176
|
+
this.setFieldMeta(field, prev => ({
|
|
177
|
+
...prev,
|
|
178
|
+
isTouched: true
|
|
179
|
+
}));
|
|
180
|
+
}
|
|
181
|
+
this.store.setState(prev => {
|
|
182
|
+
return {
|
|
183
|
+
...prev,
|
|
184
|
+
values: setBy(prev.values, field, updater)
|
|
185
|
+
};
|
|
186
|
+
});
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
_defineProperty(this, "pushFieldValue", (field, value, opts) => {
|
|
190
|
+
return this.setFieldValue(field, prev => [...(Array.isArray(prev) ? prev : []), value], opts);
|
|
191
|
+
});
|
|
192
|
+
_defineProperty(this, "insertFieldValue", (field, index, value, opts) => {
|
|
193
|
+
this.setFieldValue(field, prev => {
|
|
194
|
+
return prev.map((d, i) => i === index ? value : d);
|
|
195
|
+
}, opts);
|
|
196
|
+
});
|
|
197
|
+
_defineProperty(this, "removeFieldValue", (field, index, opts) => {
|
|
198
|
+
this.setFieldValue(field, prev => {
|
|
199
|
+
return prev.filter((_d, i) => i !== index);
|
|
200
|
+
}, opts);
|
|
201
|
+
});
|
|
202
|
+
_defineProperty(this, "swapFieldValues", (field, index1, index2) => {
|
|
203
|
+
this.setFieldValue(field, prev => {
|
|
204
|
+
const prev1 = prev[index1];
|
|
205
|
+
const prev2 = prev[index2];
|
|
206
|
+
return setBy(setBy(prev, "" + index1, prev2), "" + index2, prev1);
|
|
207
|
+
});
|
|
208
|
+
});
|
|
209
|
+
this.store = new Store(getDefaultFormState({
|
|
210
|
+
...(_opts == null ? void 0 : _opts.defaultState),
|
|
211
|
+
values: (_opts$defaultValues = _opts == null ? void 0 : _opts.defaultValues) != null ? _opts$defaultValues : _opts == null ? void 0 : (_opts$defaultState = _opts.defaultState) == null ? void 0 : _opts$defaultState.values,
|
|
212
|
+
isFormValid: true
|
|
213
|
+
}), {
|
|
214
|
+
onUpdate: () => {
|
|
215
|
+
let {
|
|
216
|
+
state
|
|
217
|
+
} = this.store;
|
|
218
|
+
// Computed state
|
|
219
|
+
const fieldMetaValues = Object.values(state.fieldMeta);
|
|
220
|
+
const isFieldsValidating = fieldMetaValues.some(field => field == null ? void 0 : field.isValidating);
|
|
221
|
+
const isFieldsValid = !fieldMetaValues.some(field => field == null ? void 0 : field.error);
|
|
222
|
+
const isTouched = fieldMetaValues.some(field => field == null ? void 0 : field.isTouched);
|
|
223
|
+
const isValidating = isFieldsValidating || state.isFormValidating;
|
|
224
|
+
const isFormValid = !state.formError;
|
|
225
|
+
const isValid = isFieldsValid && isFormValid;
|
|
226
|
+
const canSubmit = state.submissionAttempts === 0 && !isTouched || !isValidating && !state.isSubmitting && isValid;
|
|
227
|
+
state = {
|
|
228
|
+
...state,
|
|
229
|
+
isFieldsValidating,
|
|
230
|
+
isFieldsValid,
|
|
231
|
+
isFormValid,
|
|
232
|
+
isValid,
|
|
233
|
+
canSubmit,
|
|
234
|
+
isTouched
|
|
235
|
+
};
|
|
236
|
+
this.store.state = state;
|
|
237
|
+
this.state = state;
|
|
238
|
+
}
|
|
239
|
+
});
|
|
240
|
+
this.state = this.store.state;
|
|
241
|
+
this.update(_opts || {});
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
export { FormApi };
|
|
246
|
+
//# sourceMappingURL=FormApi.js.map
|