@tanstack/form-core 0.0.9 → 0.0.11
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 +106 -111
- package/build/cjs/FieldApi.js.map +1 -1
- package/build/cjs/FormApi.js +69 -126
- package/build/cjs/FormApi.js.map +1 -1
- package/build/cjs/_virtual/_rollupPluginBabelHelpers.js +70 -9
- package/build/cjs/_virtual/_rollupPluginBabelHelpers.js.map +1 -1
- package/build/esm/index.js +243 -251
- package/build/esm/index.js.map +1 -1
- package/build/stats-html.html +1 -1
- package/build/stats-react.json +74 -68
- package/build/types/FieldApi.d.ts +19 -13
- package/build/types/FormApi.d.ts +13 -9
- package/build/umd/index.development.js +257 -263
- package/build/umd/index.development.js.map +1 -1
- package/build/umd/index.production.js +2 -2
- package/build/umd/index.production.js.map +1 -1
- package/package.json +2 -2
- package/src/FieldApi.ts +99 -102
- package/src/FormApi.ts +51 -105
package/build/cjs/FieldApi.js
CHANGED
|
@@ -17,35 +17,37 @@ var store = require('@tanstack/store');
|
|
|
17
17
|
|
|
18
18
|
let uid = 0;
|
|
19
19
|
|
|
20
|
-
var
|
|
20
|
+
var _prevState = /*#__PURE__*/new WeakMap();
|
|
21
21
|
|
|
22
|
-
var _leaseValidateAsync = /*#__PURE__*/
|
|
22
|
+
var _leaseValidateAsync = /*#__PURE__*/new WeakMap();
|
|
23
23
|
|
|
24
24
|
class FieldApi {
|
|
25
25
|
constructor(_opts) {
|
|
26
26
|
var _this$getMeta;
|
|
27
27
|
|
|
28
|
-
this
|
|
28
|
+
_rollupPluginBabelHelpers.defineProperty(this, "uid", void 0);
|
|
29
29
|
|
|
30
|
-
this
|
|
31
|
-
const info = this.getInfo();
|
|
32
|
-
info.instances[this.uid] = this;
|
|
33
|
-
const unsubscribe = this.form.store.subscribe(() => {
|
|
34
|
-
_rollupPluginBabelHelpers.classPrivateFieldLooseBase(this, _updateStore)[_updateStore]();
|
|
35
|
-
});
|
|
36
|
-
return () => {
|
|
37
|
-
unsubscribe();
|
|
38
|
-
delete info.instances[this.uid];
|
|
30
|
+
_rollupPluginBabelHelpers.defineProperty(this, "form", void 0);
|
|
39
31
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
};
|
|
44
|
-
};
|
|
32
|
+
_rollupPluginBabelHelpers.defineProperty(this, "name", void 0);
|
|
33
|
+
|
|
34
|
+
_rollupPluginBabelHelpers.defineProperty(this, "store", void 0);
|
|
45
35
|
|
|
46
|
-
|
|
36
|
+
_rollupPluginBabelHelpers.defineProperty(this, "state", void 0);
|
|
37
|
+
|
|
38
|
+
_rollupPluginBabelHelpers.classPrivateFieldInitSpec(this, _prevState, {
|
|
47
39
|
writable: true,
|
|
48
|
-
value:
|
|
40
|
+
value: void 0
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
_rollupPluginBabelHelpers.defineProperty(this, "options", {});
|
|
44
|
+
|
|
45
|
+
_rollupPluginBabelHelpers.defineProperty(this, "mount", () => {
|
|
46
|
+
var _this$options$onMount, _this$options;
|
|
47
|
+
|
|
48
|
+
const info = this.getInfo();
|
|
49
|
+
info.instances[this.uid] = this;
|
|
50
|
+
const unsubscribe = this.form.store.subscribe(() => {
|
|
49
51
|
this.store.batch(() => {
|
|
50
52
|
const nextValue = this.getValue();
|
|
51
53
|
const nextMeta = this.getMeta();
|
|
@@ -62,17 +64,25 @@ class FieldApi {
|
|
|
62
64
|
}));
|
|
63
65
|
}
|
|
64
66
|
});
|
|
65
|
-
}
|
|
67
|
+
});
|
|
68
|
+
(_this$options$onMount = (_this$options = this.options).onMount) == null ? void 0 : _this$options$onMount.call(_this$options, this);
|
|
69
|
+
return () => {
|
|
70
|
+
unsubscribe();
|
|
71
|
+
delete info.instances[this.uid];
|
|
72
|
+
|
|
73
|
+
if (!Object.keys(info.instances).length) {
|
|
74
|
+
delete this.form.fieldInfo[this.name];
|
|
75
|
+
}
|
|
76
|
+
};
|
|
66
77
|
});
|
|
67
78
|
|
|
68
|
-
this
|
|
69
|
-
var _this$form$options$
|
|
79
|
+
_rollupPluginBabelHelpers.defineProperty(this, "update", opts => {
|
|
80
|
+
var _this$form$options$as, _this$form$options$on, _this$form$options$on2;
|
|
70
81
|
|
|
71
82
|
this.options = {
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
validateAsyncDebounceMs: (_this$form$options$de4 = this.form.options.defaultValidateAsyncDebounceMs) != null ? _this$form$options$de4 : 0,
|
|
83
|
+
asyncDebounceMs: (_this$form$options$as = this.form.options.asyncDebounceMs) != null ? _this$form$options$as : 0,
|
|
84
|
+
onChangeAsyncDebounceMs: (_this$form$options$on = this.form.options.onChangeAsyncDebounceMs) != null ? _this$form$options$on : 0,
|
|
85
|
+
onBlurAsyncDebounceMs: (_this$form$options$on2 = this.form.options.onBlurAsyncDebounceMs) != null ? _this$form$options$on2 : 0,
|
|
76
86
|
...opts
|
|
77
87
|
}; // Default Value
|
|
78
88
|
|
|
@@ -85,44 +95,42 @@ class FieldApi {
|
|
|
85
95
|
if (this.getMeta() === undefined) {
|
|
86
96
|
this.setMeta(this.state.meta);
|
|
87
97
|
}
|
|
88
|
-
};
|
|
98
|
+
});
|
|
89
99
|
|
|
90
|
-
this
|
|
100
|
+
_rollupPluginBabelHelpers.defineProperty(this, "getValue", () => {
|
|
91
101
|
return this.form.getFieldValue(this.name);
|
|
92
|
-
};
|
|
102
|
+
});
|
|
93
103
|
|
|
94
|
-
this
|
|
104
|
+
_rollupPluginBabelHelpers.defineProperty(this, "setValue", (updater, options) => this.form.setFieldValue(this.name, updater, options));
|
|
95
105
|
|
|
96
|
-
this
|
|
106
|
+
_rollupPluginBabelHelpers.defineProperty(this, "getMeta", () => this.form.getFieldMeta(this.name));
|
|
97
107
|
|
|
98
|
-
this
|
|
108
|
+
_rollupPluginBabelHelpers.defineProperty(this, "setMeta", updater => this.form.setFieldMeta(this.name, updater));
|
|
99
109
|
|
|
100
|
-
this
|
|
110
|
+
_rollupPluginBabelHelpers.defineProperty(this, "getInfo", () => this.form.getFieldInfo(this.name));
|
|
101
111
|
|
|
102
|
-
this
|
|
112
|
+
_rollupPluginBabelHelpers.defineProperty(this, "pushValue", value => this.form.pushFieldValue(this.name, value));
|
|
103
113
|
|
|
104
|
-
this
|
|
114
|
+
_rollupPluginBabelHelpers.defineProperty(this, "insertValue", (index, value) => this.form.insertFieldValue(this.name, index, value));
|
|
105
115
|
|
|
106
|
-
this
|
|
116
|
+
_rollupPluginBabelHelpers.defineProperty(this, "removeValue", index => this.form.removeFieldValue(this.name, index));
|
|
107
117
|
|
|
108
|
-
this
|
|
118
|
+
_rollupPluginBabelHelpers.defineProperty(this, "swapValues", (aIndex, bIndex) => this.form.swapFieldValues(this.name, aIndex, bIndex));
|
|
109
119
|
|
|
110
|
-
this
|
|
120
|
+
_rollupPluginBabelHelpers.defineProperty(this, "getSubField", name => new FieldApi({
|
|
111
121
|
name: this.name + "." + name,
|
|
112
122
|
form: this.form
|
|
113
|
-
});
|
|
123
|
+
}));
|
|
114
124
|
|
|
115
|
-
this
|
|
125
|
+
_rollupPluginBabelHelpers.defineProperty(this, "validateSync", async (value = this.state.value, cause) => {
|
|
116
126
|
const {
|
|
117
|
-
|
|
127
|
+
onChange,
|
|
128
|
+
onBlur
|
|
118
129
|
} = this.options;
|
|
119
|
-
|
|
120
|
-
if (!validate)
|
|
121
|
-
return;
|
|
122
|
-
} // Use the validationCount for all field instances to
|
|
130
|
+
const validate = cause === 'submit' ? undefined : cause === 'change' ? onChange : onBlur;
|
|
131
|
+
if (!validate) return; // Use the validationCount for all field instances to
|
|
123
132
|
// track freshness of the validation
|
|
124
133
|
|
|
125
|
-
|
|
126
134
|
const validationCount = (this.getInfo().validationCount || 0) + 1;
|
|
127
135
|
this.getInfo().validationCount = validationCount;
|
|
128
136
|
const error = normalizeError(validate(value, this));
|
|
@@ -137,9 +145,9 @@ class FieldApi {
|
|
|
137
145
|
if (this.state.meta.error) {
|
|
138
146
|
this.cancelValidateAsync();
|
|
139
147
|
}
|
|
140
|
-
};
|
|
148
|
+
});
|
|
141
149
|
|
|
142
|
-
|
|
150
|
+
_rollupPluginBabelHelpers.classPrivateFieldInitSpec(this, _leaseValidateAsync, {
|
|
143
151
|
writable: true,
|
|
144
152
|
value: () => {
|
|
145
153
|
const count = (this.getInfo().validationAsyncCount || 0) + 1;
|
|
@@ -148,32 +156,36 @@ class FieldApi {
|
|
|
148
156
|
}
|
|
149
157
|
});
|
|
150
158
|
|
|
151
|
-
this
|
|
159
|
+
_rollupPluginBabelHelpers.defineProperty(this, "cancelValidateAsync", () => {
|
|
152
160
|
// Lease a new validation count to ignore any pending validations
|
|
153
|
-
_rollupPluginBabelHelpers.
|
|
161
|
+
_rollupPluginBabelHelpers.classPrivateFieldGet(this, _leaseValidateAsync).call(this); // Cancel any pending validation state
|
|
154
162
|
|
|
155
163
|
|
|
156
164
|
this.setMeta(prev => ({ ...prev,
|
|
157
165
|
isValidating: false
|
|
158
166
|
}));
|
|
159
|
-
};
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
_rollupPluginBabelHelpers.defineProperty(this, "validateAsync", async (value = this.state.value, cause) => {
|
|
170
|
+
var _ref, _ref2;
|
|
160
171
|
|
|
161
|
-
this.validateAsync = async (value = this.state.value) => {
|
|
162
172
|
const {
|
|
163
|
-
|
|
164
|
-
|
|
173
|
+
onChangeAsync,
|
|
174
|
+
onBlurAsync,
|
|
175
|
+
onSubmitAsync,
|
|
176
|
+
asyncDebounceMs,
|
|
177
|
+
onBlurAsyncDebounceMs,
|
|
178
|
+
onChangeAsyncDebounceMs
|
|
165
179
|
} = this.options;
|
|
166
|
-
|
|
167
|
-
if (!
|
|
168
|
-
|
|
169
|
-
}
|
|
170
|
-
|
|
180
|
+
const validate = cause === 'change' ? onChangeAsync : cause === 'submit' ? onSubmitAsync : onBlurAsync;
|
|
181
|
+
if (!validate) return;
|
|
182
|
+
const debounceMs = cause === 'submit' ? 0 : (_ref = (_ref2 = cause === 'change' ? onChangeAsyncDebounceMs : onBlurAsyncDebounceMs) != null ? _ref2 : asyncDebounceMs) != null ? _ref : 500;
|
|
171
183
|
if (this.state.meta.isValidating !== true) this.setMeta(prev => ({ ...prev,
|
|
172
184
|
isValidating: true
|
|
173
185
|
})); // Use the validationCount for all field instances to
|
|
174
186
|
// track freshness of the validation
|
|
175
187
|
|
|
176
|
-
const validationAsyncCount = _rollupPluginBabelHelpers.
|
|
188
|
+
const validationAsyncCount = _rollupPluginBabelHelpers.classPrivateFieldGet(this, _leaseValidateAsync).call(this);
|
|
177
189
|
|
|
178
190
|
const checkLatest = () => validationAsyncCount === this.getInfo().validationAsyncCount;
|
|
179
191
|
|
|
@@ -184,14 +196,14 @@ class FieldApi {
|
|
|
184
196
|
});
|
|
185
197
|
}
|
|
186
198
|
|
|
187
|
-
if (
|
|
188
|
-
await new Promise(r => setTimeout(r,
|
|
199
|
+
if (debounceMs > 0) {
|
|
200
|
+
await new Promise(r => setTimeout(r, debounceMs));
|
|
189
201
|
} // Only kick off validation if this validation is the latest attempt
|
|
190
202
|
|
|
191
203
|
|
|
192
204
|
if (checkLatest()) {
|
|
193
205
|
try {
|
|
194
|
-
const rawError = await
|
|
206
|
+
const rawError = await validate(value, this);
|
|
195
207
|
|
|
196
208
|
if (checkLatest()) {
|
|
197
209
|
var _this$getInfo$validat, _this$getInfo;
|
|
@@ -222,43 +234,25 @@ class FieldApi {
|
|
|
222
234
|
|
|
223
235
|
|
|
224
236
|
return this.getInfo().validationPromise;
|
|
225
|
-
};
|
|
226
|
-
|
|
227
|
-
this.shouldValidate = (isAsync, cause) => {
|
|
228
|
-
const {
|
|
229
|
-
validateOn,
|
|
230
|
-
validateAsyncOn
|
|
231
|
-
} = this.options;
|
|
232
|
-
const level = getValidationCauseLevel(cause); // Must meet *at least* the validation level to validate,
|
|
233
|
-
// e.g. if validateOn is 'change' and validateCause is 'blur',
|
|
234
|
-
// the field will still validate
|
|
235
|
-
|
|
236
|
-
return Object.keys(validateCauseLevels).some(d => isAsync ? validateAsyncOn : validateOn === d && level >= validateCauseLevels[d]);
|
|
237
|
-
};
|
|
237
|
+
});
|
|
238
238
|
|
|
239
|
-
this
|
|
239
|
+
_rollupPluginBabelHelpers.defineProperty(this, "validate", (cause, value) => {
|
|
240
240
|
// If the field is pristine and validatePristine is false, do not validate
|
|
241
|
-
if (!this.
|
|
242
|
-
|
|
243
|
-
if (this.shouldValidate(false, cause)) {
|
|
244
|
-
this.validateSync(value);
|
|
245
|
-
} // If there is an error, return it, do not attempt async validation
|
|
241
|
+
if (!this.state.meta.isTouched) return; // Attempt to sync validate first
|
|
246
242
|
|
|
243
|
+
this.validateSync(value, cause); // If there is an error, return it, do not attempt async validation
|
|
247
244
|
|
|
248
245
|
if (this.state.meta.error) {
|
|
249
|
-
|
|
246
|
+
if (!this.options.asyncAlways) {
|
|
247
|
+
return this.state.meta.error;
|
|
248
|
+
}
|
|
250
249
|
} // No error? Attempt async validation
|
|
251
250
|
|
|
252
251
|
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
} // If there is no sync error or async validation attempt, there is no error
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
return undefined;
|
|
259
|
-
};
|
|
252
|
+
return this.validateAsync(value, cause);
|
|
253
|
+
});
|
|
260
254
|
|
|
261
|
-
this
|
|
255
|
+
_rollupPluginBabelHelpers.defineProperty(this, "getChangeProps", (props = {}) => {
|
|
262
256
|
return { ...props,
|
|
263
257
|
value: this.state.value,
|
|
264
258
|
onChange: value => {
|
|
@@ -266,16 +260,21 @@ class FieldApi {
|
|
|
266
260
|
props.onChange == null ? void 0 : props.onChange(value);
|
|
267
261
|
},
|
|
268
262
|
onBlur: e => {
|
|
263
|
+
const prevTouched = this.state.meta.isTouched;
|
|
269
264
|
this.setMeta(prev => ({ ...prev,
|
|
270
265
|
isTouched: true
|
|
271
266
|
}));
|
|
267
|
+
|
|
268
|
+
if (!prevTouched) {
|
|
269
|
+
this.validate('change');
|
|
270
|
+
}
|
|
271
|
+
|
|
272
272
|
this.validate('blur');
|
|
273
|
-
props.onBlur == null ? void 0 : props.onBlur(e);
|
|
274
273
|
}
|
|
275
274
|
};
|
|
276
|
-
};
|
|
275
|
+
});
|
|
277
276
|
|
|
278
|
-
this
|
|
277
|
+
_rollupPluginBabelHelpers.defineProperty(this, "getInputProps", (props = {}) => {
|
|
279
278
|
return { ...props,
|
|
280
279
|
value: String(this.state.value),
|
|
281
280
|
onChange: e => {
|
|
@@ -284,7 +283,7 @@ class FieldApi {
|
|
|
284
283
|
},
|
|
285
284
|
onBlur: this.getChangeProps(props).onBlur
|
|
286
285
|
};
|
|
287
|
-
};
|
|
286
|
+
});
|
|
288
287
|
|
|
289
288
|
this.form = _opts.form;
|
|
290
289
|
this.uid = uid++; // Support field prefixing from FieldScope
|
|
@@ -303,31 +302,27 @@ class FieldApi {
|
|
|
303
302
|
...this.options.defaultMeta
|
|
304
303
|
}
|
|
305
304
|
}, {
|
|
306
|
-
onUpdate:
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
const prevState = this.state;
|
|
310
|
-
this.state = next;
|
|
305
|
+
onUpdate: () => {
|
|
306
|
+
const state = this.store.state;
|
|
307
|
+
state.meta.touchedError = state.meta.isTouched ? state.meta.error : undefined;
|
|
311
308
|
|
|
312
|
-
if (
|
|
313
|
-
this.validate('change',
|
|
309
|
+
if (state.value !== _rollupPluginBabelHelpers.classPrivateFieldGet(this, _prevState).value) {
|
|
310
|
+
this.validate('change', state.value);
|
|
314
311
|
}
|
|
312
|
+
|
|
313
|
+
_rollupPluginBabelHelpers.classPrivateFieldSet(this, _prevState, state);
|
|
314
|
+
|
|
315
|
+
this.state = state;
|
|
315
316
|
}
|
|
316
317
|
});
|
|
317
318
|
this.state = this.store.state;
|
|
319
|
+
|
|
320
|
+
_rollupPluginBabelHelpers.classPrivateFieldSet(this, _prevState, this.state);
|
|
321
|
+
|
|
318
322
|
this.update(_opts);
|
|
319
323
|
}
|
|
320
324
|
|
|
321
325
|
}
|
|
322
|
-
const validateCauseLevels = {
|
|
323
|
-
change: 0,
|
|
324
|
-
blur: 1,
|
|
325
|
-
submit: 2
|
|
326
|
-
};
|
|
327
|
-
|
|
328
|
-
function getValidationCauseLevel(cause) {
|
|
329
|
-
return !cause ? 3 : validateCauseLevels[cause];
|
|
330
|
-
}
|
|
331
326
|
|
|
332
327
|
function normalizeError(rawError) {
|
|
333
328
|
if (rawError) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FieldApi.js","sources":["../../src/FieldApi.ts"],"sourcesContent":["//\nimport type { DeepKeys, DeepValue, RequiredByKey, Updater } from './utils'\nimport type { FormApi, ValidationError } from './FormApi'\nimport { Store } from '@tanstack/store'\n\nexport type ValidationCause = 'change' | 'blur' | 'submit'\n\nexport interface FieldOptions<TData, TFormData> {\n name: unknown extends TFormData ? string : DeepKeys<TFormData>\n index?: TData extends any[] ? number : never\n defaultValue?: TData\n validate?: (\n value: TData,\n fieldApi: FieldApi<TData, TFormData>,\n ) => ValidationError\n validateAsync?: (\n value: TData,\n fieldApi: FieldApi<TData, TFormData>,\n ) => ValidationError | Promise<ValidationError>\n validatePristine?: boolean // Default: false\n validateOn?: ValidationCause // Default: 'change'\n validateAsyncOn?: ValidationCause // Default: 'blur'\n validateAsyncDebounceMs?: number\n defaultMeta?: Partial<FieldMeta>\n}\n\nexport type FieldApiOptions<TData, TFormData> = FieldOptions<\n TData,\n TFormData\n> & {\n form: FormApi<TFormData>\n}\n\nexport type FieldMeta = {\n isTouched: boolean\n touchedError?: ValidationError\n error?: ValidationError\n isValidating: boolean\n}\n\nexport type UserChangeProps<TData> = {\n onChange?: (updater: Updater<TData>) => void\n onBlur?: (event: any) => void\n}\n\nexport type UserInputProps = {\n onChange?: (event: any) => void\n onBlur?: (event: any) => void\n}\n\nexport type ChangeProps<TData> = {\n value: TData\n onChange: (updater: Updater<TData>) => void\n onBlur: (event: any) => void\n}\n\nexport type InputProps = {\n value: string\n onChange: (event: any) => void\n onBlur: (event: any) => void\n}\n\nlet uid = 0\n\nexport type FieldState<TData> = {\n value: TData\n meta: FieldMeta\n}\n\nexport class FieldApi<TData, TFormData> {\n uid: number\n form: FormApi<TFormData>\n name!: DeepKeys<TFormData>\n store!: Store<FieldState<TData>>\n state!: FieldState<TData>\n options: RequiredByKey<\n FieldOptions<TData, TFormData>,\n | 'validatePristine'\n | 'validateOn'\n | 'validateAsyncOn'\n | 'validateAsyncDebounceMs'\n > = {} as any\n\n constructor(opts: FieldApiOptions<TData, TFormData>) {\n this.form = opts.form\n this.uid = uid++\n // Support field prefixing from FieldScope\n // let fieldPrefix = ''\n // if (this.form.fieldName) {\n // fieldPrefix = `${this.form.fieldName}.`\n // }\n\n this.name = opts.name as any\n\n this.store = new Store<FieldState<TData>>(\n {\n value: this.getValue(),\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n meta: this.getMeta() ?? {\n isValidating: false,\n isTouched: false,\n ...this.options.defaultMeta,\n },\n },\n {\n onUpdate: (next) => {\n next.meta.touchedError = next.meta.isTouched\n ? next.meta.error\n : undefined\n\n // Do not validate pristine fields\n const prevState = this.state\n this.state = next\n if (next.value !== prevState.value) {\n this.validate('change', next.value)\n }\n },\n },\n )\n\n this.state = this.store.state\n this.update(opts)\n }\n\n mount = () => {\n const info = this.getInfo()\n info.instances[this.uid] = this\n\n const unsubscribe = this.form.store.subscribe(() => {\n this.#updateStore()\n })\n\n return () => {\n unsubscribe()\n delete info.instances[this.uid]\n if (!Object.keys(info.instances).length) {\n delete this.form.fieldInfo[this.name]\n }\n }\n }\n\n #updateStore = () => {\n this.store.batch(() => {\n const nextValue = this.getValue()\n const nextMeta = this.getMeta()\n\n if (nextValue !== this.state.value) {\n this.store.setState((prev) => ({ ...prev, value: nextValue }))\n }\n\n if (nextMeta !== this.state.meta) {\n this.store.setState((prev) => ({ ...prev, meta: nextMeta }))\n }\n })\n }\n\n update = (opts: FieldApiOptions<TData, TFormData>) => {\n this.options = {\n validatePristine: this.form.options.defaultValidatePristine ?? false,\n validateOn: this.form.options.defaultValidateOn ?? 'change',\n validateAsyncOn: this.form.options.defaultValidateAsyncOn ?? 'blur',\n validateAsyncDebounceMs:\n this.form.options.defaultValidateAsyncDebounceMs ?? 0,\n ...opts,\n }\n\n // Default Value\n if (\n this.state.value === undefined &&\n this.options.defaultValue !== undefined\n ) {\n this.setValue(this.options.defaultValue)\n }\n\n // Default Meta\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (this.getMeta() === undefined) {\n this.setMeta(this.state.meta)\n }\n }\n\n getValue = (): TData => {\n return this.form.getFieldValue(this.name)\n }\n setValue = (\n updater: Updater<TData>,\n options?: { touch?: boolean; notify?: boolean },\n ) => this.form.setFieldValue(this.name, updater as any, options)\n\n getMeta = (): FieldMeta => this.form.getFieldMeta(this.name)\n setMeta = (updater: Updater<FieldMeta>) =>\n this.form.setFieldMeta(this.name, updater)\n\n getInfo = () => this.form.getFieldInfo(this.name)\n\n pushValue = (value: TData extends any[] ? TData[number] : never) =>\n this.form.pushFieldValue(this.name, value as any)\n insertValue = (index: number, value: TData) =>\n this.form.insertFieldValue(this.name, index, value as any)\n removeValue = (index: number) => this.form.removeFieldValue(this.name, index)\n swapValues = (aIndex: number, bIndex: number) =>\n this.form.swapFieldValues(this.name, aIndex, bIndex)\n\n getSubField = <TName extends DeepKeys<TData>>(name: TName) =>\n new FieldApi<DeepValue<TData, TName>, TFormData>({\n name: `${this.name}.${name}` as any,\n form: this.form,\n })\n\n validateSync = async (value = this.state.value) => {\n const { validate } = this.options\n\n if (!validate) {\n return\n }\n\n // Use the validationCount for all field instances to\n // track freshness of the validation\n const validationCount = (this.getInfo().validationCount || 0) + 1\n this.getInfo().validationCount = validationCount\n const error = normalizeError(validate(value, this))\n\n if (this.state.meta.error !== error) {\n this.setMeta((prev) => ({\n ...prev,\n error,\n }))\n }\n\n // If a sync error is encountered, cancel any async validation\n if (this.state.meta.error) {\n this.cancelValidateAsync()\n }\n }\n\n #leaseValidateAsync = () => {\n const count = (this.getInfo().validationAsyncCount || 0) + 1\n this.getInfo().validationAsyncCount = count\n return count\n }\n\n cancelValidateAsync = () => {\n // Lease a new validation count to ignore any pending validations\n this.#leaseValidateAsync()\n // Cancel any pending validation state\n this.setMeta((prev) => ({\n ...prev,\n isValidating: false,\n }))\n }\n\n validateAsync = async (value = this.state.value) => {\n const { validateAsync, validateAsyncDebounceMs } = this.options\n\n if (!validateAsync) {\n return\n }\n\n if (this.state.meta.isValidating !== true)\n this.setMeta((prev) => ({ ...prev, isValidating: true }))\n\n // Use the validationCount for all field instances to\n // track freshness of the validation\n const validationAsyncCount = this.#leaseValidateAsync()\n\n const checkLatest = () =>\n validationAsyncCount === this.getInfo().validationAsyncCount\n\n if (!this.getInfo().validationPromise) {\n this.getInfo().validationPromise = new Promise((resolve, reject) => {\n this.getInfo().validationResolve = resolve\n this.getInfo().validationReject = reject\n })\n }\n\n if (validateAsyncDebounceMs > 0) {\n await new Promise((r) => setTimeout(r, validateAsyncDebounceMs))\n }\n\n // Only kick off validation if this validation is the latest attempt\n if (checkLatest()) {\n try {\n const rawError = await validateAsync(value, this)\n\n if (checkLatest()) {\n const error = normalizeError(rawError)\n this.setMeta((prev) => ({\n ...prev,\n isValidating: false,\n error,\n }))\n this.getInfo().validationResolve?.(error)\n }\n } catch (error) {\n if (checkLatest()) {\n this.getInfo().validationReject?.(error)\n throw error\n }\n } finally {\n if (checkLatest()) {\n this.setMeta((prev) => ({ ...prev, isValidating: false }))\n delete this.getInfo().validationPromise\n }\n }\n }\n\n // Always return the latest validation promise to the caller\n return this.getInfo().validationPromise\n }\n\n shouldValidate = (isAsync: boolean, cause?: ValidationCause) => {\n const { validateOn, validateAsyncOn } = this.options\n const level = getValidationCauseLevel(cause)\n\n // Must meet *at least* the validation level to validate,\n // e.g. if validateOn is 'change' and validateCause is 'blur',\n // the field will still validate\n return Object.keys(validateCauseLevels).some((d) =>\n isAsync\n ? validateAsyncOn\n : validateOn === d && level >= validateCauseLevels[d],\n )\n }\n\n validate = async (\n cause?: ValidationCause,\n value?: TData,\n ): Promise<ValidationError> => {\n // If the field is pristine and validatePristine is false, do not validate\n if (!this.options.validatePristine && !this.state.meta.isTouched) return\n\n // Attempt to sync validate first\n if (this.shouldValidate(false, cause)) {\n this.validateSync(value)\n }\n\n // If there is an error, return it, do not attempt async validation\n if (this.state.meta.error) {\n return this.state.meta.error\n }\n\n // No error? Attempt async validation\n if (this.shouldValidate(true, cause)) {\n return this.validateAsync(value)\n }\n\n // If there is no sync error or async validation attempt, there is no error\n return undefined\n }\n\n getChangeProps = <T extends UserChangeProps<any>>(\n props: T = {} as T,\n ): ChangeProps<TData> & Omit<T, keyof ChangeProps<TData>> => {\n return {\n ...props,\n value: this.state.value,\n onChange: (value) => {\n this.setValue(value)\n props.onChange?.(value)\n },\n onBlur: (e) => {\n this.setMeta((prev) => ({ ...prev, isTouched: true }))\n this.validate('blur')\n props.onBlur?.(e)\n },\n } as ChangeProps<TData> & Omit<T, keyof ChangeProps<TData>>\n }\n\n getInputProps = <T extends UserInputProps>(\n props: T = {} as T,\n ): InputProps & Omit<T, keyof InputProps> => {\n return {\n ...props,\n value: String(this.state.value),\n onChange: (e) => {\n this.setValue(e.target.value)\n props.onChange?.(e.target.value)\n },\n onBlur: this.getChangeProps(props).onBlur,\n }\n }\n}\n\nconst validateCauseLevels = {\n change: 0,\n blur: 1,\n submit: 2,\n}\n\nfunction getValidationCauseLevel(cause?: ValidationCause) {\n return !cause ? 3 : validateCauseLevels[cause]\n}\n\nfunction normalizeError(rawError?: ValidationError) {\n if (rawError) {\n if (typeof rawError !== 'string') {\n return 'Invalid Form Values'\n }\n\n return rawError\n }\n\n return undefined\n}\n"],"names":["uid","FieldApi","constructor","opts","options","mount","info","getInfo","instances","unsubscribe","form","store","subscribe","_classPrivateFieldLooseBase","Object","keys","length","fieldInfo","name","batch","nextValue","getValue","nextMeta","getMeta","state","value","setState","prev","meta","update","validatePristine","defaultValidatePristine","validateOn","defaultValidateOn","validateAsyncOn","defaultValidateAsyncOn","validateAsyncDebounceMs","defaultValidateAsyncDebounceMs","undefined","defaultValue","setValue","setMeta","getFieldValue","updater","setFieldValue","getFieldMeta","setFieldMeta","getFieldInfo","pushValue","pushFieldValue","insertValue","index","insertFieldValue","removeValue","removeFieldValue","swapValues","aIndex","bIndex","swapFieldValues","getSubField","validateSync","validate","validationCount","error","normalizeError","cancelValidateAsync","count","validationAsyncCount","isValidating","validateAsync","checkLatest","validationPromise","Promise","resolve","reject","validationResolve","validationReject","r","setTimeout","rawError","shouldValidate","isAsync","cause","level","getValidationCauseLevel","validateCauseLevels","some","d","isTouched","getChangeProps","props","onChange","onBlur","e","getInputProps","String","target","Store","defaultMeta","onUpdate","next","touchedError","prevState","change","blur","submit"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FieldApi.js","sources":["../../src/FieldApi.ts"],"sourcesContent":["//\nimport type { DeepKeys, DeepValue, RequiredByKey, Updater } from './utils'\nimport type { FormApi, ValidationError } from './FormApi'\nimport { Store } from '@tanstack/store'\n\nexport type ValidationCause = 'change' | 'blur' | 'submit'\n\ntype ValidateFn<TData, TFormData> = (\n value: TData,\n fieldApi: FieldApi<TData, TFormData>,\n) => ValidationError\n\ntype ValidateAsyncFn<TData, TFormData> = (\n value: TData,\n fieldApi: FieldApi<TData, TFormData>,\n) => ValidationError | Promise<ValidationError>\n\nexport interface FieldOptions<TData, TFormData> {\n name: unknown extends TFormData ? string : DeepKeys<TFormData>\n index?: TData extends any[] ? number : never\n defaultValue?: TData\n asyncDebounceMs?: number\n asyncAlways?: boolean\n onMount?: (formApi: FieldApi<TData, TFormData>) => void\n onChange?: ValidateFn<TData, TFormData>\n onChangeAsync?: ValidateAsyncFn<TData, TFormData>\n onChangeAsyncDebounceMs?: number\n onBlur?: ValidateFn<TData, TFormData>\n onBlurAsync?: ValidateAsyncFn<TData, TFormData>\n onBlurAsyncDebounceMs?: number\n onSubmitAsync?: ValidateAsyncFn<TData, TFormData>\n defaultMeta?: Partial<FieldMeta>\n}\n\nexport type FieldApiOptions<TData, TFormData> = FieldOptions<\n TData,\n TFormData\n> & {\n form: FormApi<TFormData>\n}\n\nexport type FieldMeta = {\n isTouched: boolean\n touchedError?: ValidationError\n error?: ValidationError\n isValidating: boolean\n}\n\nexport type UserChangeProps<TData> = {\n onChange?: (updater: Updater<TData>) => void\n onBlur?: (event: any) => void\n}\n\nexport type UserInputProps = {\n onChange?: (event: any) => void\n onBlur?: (event: any) => void\n}\n\nexport type ChangeProps<TData> = {\n value: TData\n onChange: (value: TData) => void\n onBlur: (event: any) => void\n}\n\nexport type InputProps = {\n value: string\n onChange: (event: any) => void\n onBlur: (event: any) => void\n}\n\nlet uid = 0\n\nexport type FieldState<TData> = {\n value: TData\n meta: FieldMeta\n}\n\nexport class FieldApi<TData, TFormData> {\n uid: number\n form: FormApi<TFormData>\n name!: DeepKeys<TFormData>\n store!: Store<FieldState<TData>>\n state!: FieldState<TData>\n #prevState!: FieldState<TData>\n options: FieldOptions<TData, TFormData> = {} as any\n\n constructor(opts: FieldApiOptions<TData, TFormData>) {\n this.form = opts.form\n this.uid = uid++\n // Support field prefixing from FieldScope\n // let fieldPrefix = ''\n // if (this.form.fieldName) {\n // fieldPrefix = `${this.form.fieldName}.`\n // }\n\n this.name = opts.name as any\n\n this.store = new Store<FieldState<TData>>(\n {\n value: this.getValue(),\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n meta: this.getMeta() ?? {\n isValidating: false,\n isTouched: false,\n ...this.options.defaultMeta,\n },\n },\n {\n onUpdate: () => {\n const state = this.store.state\n\n state.meta.touchedError = state.meta.isTouched\n ? state.meta.error\n : undefined\n\n if (state.value !== this.#prevState.value) {\n this.validate('change', state.value)\n }\n\n this.#prevState = state\n this.state = state\n },\n },\n )\n\n this.state = this.store.state\n this.#prevState = this.state\n this.update(opts)\n }\n\n mount = () => {\n const info = this.getInfo()\n info.instances[this.uid] = this\n\n const unsubscribe = this.form.store.subscribe(() => {\n this.store.batch(() => {\n const nextValue = this.getValue()\n const nextMeta = this.getMeta()\n\n if (nextValue !== this.state.value) {\n this.store.setState((prev) => ({ ...prev, value: nextValue }))\n }\n\n if (nextMeta !== this.state.meta) {\n this.store.setState((prev) => ({ ...prev, meta: nextMeta }))\n }\n })\n })\n\n this.options.onMount?.(this)\n\n return () => {\n unsubscribe()\n delete info.instances[this.uid]\n if (!Object.keys(info.instances).length) {\n delete this.form.fieldInfo[this.name]\n }\n }\n }\n\n update = (opts: FieldApiOptions<TData, TFormData>) => {\n this.options = {\n asyncDebounceMs: this.form.options.asyncDebounceMs ?? 0,\n onChangeAsyncDebounceMs: this.form.options.onChangeAsyncDebounceMs ?? 0,\n onBlurAsyncDebounceMs: this.form.options.onBlurAsyncDebounceMs ?? 0,\n ...opts,\n }\n\n // Default Value\n if (\n this.state.value === undefined &&\n this.options.defaultValue !== undefined\n ) {\n this.setValue(this.options.defaultValue)\n }\n\n // Default Meta\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (this.getMeta() === undefined) {\n this.setMeta(this.state.meta)\n }\n }\n\n getValue = (): TData => {\n return this.form.getFieldValue(this.name)\n }\n setValue = (\n updater: Updater<TData>,\n options?: { touch?: boolean; notify?: boolean },\n ) => this.form.setFieldValue(this.name, updater as any, options)\n\n getMeta = (): FieldMeta => this.form.getFieldMeta(this.name)\n setMeta = (updater: Updater<FieldMeta>) =>\n this.form.setFieldMeta(this.name, updater)\n\n getInfo = () => this.form.getFieldInfo(this.name)\n\n pushValue = (value: TData extends any[] ? TData[number] : never) =>\n this.form.pushFieldValue(this.name, value as any)\n insertValue = (index: number, value: TData) =>\n this.form.insertFieldValue(this.name, index, value as any)\n removeValue = (index: number) => this.form.removeFieldValue(this.name, index)\n swapValues = (aIndex: number, bIndex: number) =>\n this.form.swapFieldValues(this.name, aIndex, bIndex)\n\n getSubField = <TName extends DeepKeys<TData>>(name: TName) =>\n new FieldApi<DeepValue<TData, TName>, TFormData>({\n name: `${this.name}.${name}` as any,\n form: this.form,\n })\n\n validateSync = async (value = this.state.value, cause: ValidationCause) => {\n const { onChange, onBlur } = this.options\n const validate =\n cause === 'submit' ? undefined : cause === 'change' ? onChange : onBlur\n\n if (!validate) return\n\n // Use the validationCount for all field instances to\n // track freshness of the validation\n const validationCount = (this.getInfo().validationCount || 0) + 1\n this.getInfo().validationCount = validationCount\n const error = normalizeError(validate(value, this))\n\n if (this.state.meta.error !== error) {\n this.setMeta((prev) => ({\n ...prev,\n error,\n }))\n }\n\n // If a sync error is encountered, cancel any async validation\n if (this.state.meta.error) {\n this.cancelValidateAsync()\n }\n }\n\n #leaseValidateAsync = () => {\n const count = (this.getInfo().validationAsyncCount || 0) + 1\n this.getInfo().validationAsyncCount = count\n return count\n }\n\n cancelValidateAsync = () => {\n // Lease a new validation count to ignore any pending validations\n this.#leaseValidateAsync()\n // Cancel any pending validation state\n this.setMeta((prev) => ({\n ...prev,\n isValidating: false,\n }))\n }\n\n validateAsync = async (value = this.state.value, cause: ValidationCause) => {\n const {\n onChangeAsync,\n onBlurAsync,\n onSubmitAsync,\n asyncDebounceMs,\n onBlurAsyncDebounceMs,\n onChangeAsyncDebounceMs,\n } = this.options\n\n const validate =\n cause === 'change'\n ? onChangeAsync\n : cause === 'submit'\n ? onSubmitAsync\n : onBlurAsync\n\n if (!validate) return\n\n const debounceMs =\n cause === 'submit'\n ? 0\n : (cause === 'change'\n ? onChangeAsyncDebounceMs\n : onBlurAsyncDebounceMs) ??\n asyncDebounceMs ??\n 500\n\n if (this.state.meta.isValidating !== true)\n this.setMeta((prev) => ({ ...prev, isValidating: true }))\n\n // Use the validationCount for all field instances to\n // track freshness of the validation\n const validationAsyncCount = this.#leaseValidateAsync()\n\n const checkLatest = () =>\n validationAsyncCount === this.getInfo().validationAsyncCount\n\n if (!this.getInfo().validationPromise) {\n this.getInfo().validationPromise = new Promise((resolve, reject) => {\n this.getInfo().validationResolve = resolve\n this.getInfo().validationReject = reject\n })\n }\n\n if (debounceMs > 0) {\n await new Promise((r) => setTimeout(r, debounceMs))\n }\n\n // Only kick off validation if this validation is the latest attempt\n if (checkLatest()) {\n try {\n const rawError = await validate(value, this)\n\n if (checkLatest()) {\n const error = normalizeError(rawError)\n this.setMeta((prev) => ({\n ...prev,\n isValidating: false,\n error,\n }))\n this.getInfo().validationResolve?.(error)\n }\n } catch (error) {\n if (checkLatest()) {\n this.getInfo().validationReject?.(error)\n throw error\n }\n } finally {\n if (checkLatest()) {\n this.setMeta((prev) => ({ ...prev, isValidating: false }))\n delete this.getInfo().validationPromise\n }\n }\n }\n\n // Always return the latest validation promise to the caller\n return this.getInfo().validationPromise\n }\n\n validate = (\n cause: ValidationCause,\n value?: TData,\n ): ValidationError | Promise<ValidationError> => {\n // If the field is pristine and validatePristine is false, do not validate\n if (!this.state.meta.isTouched) return\n\n // Attempt to sync validate first\n this.validateSync(value, cause)\n\n // If there is an error, return it, do not attempt async validation\n if (this.state.meta.error) {\n if (!this.options.asyncAlways) {\n return this.state.meta.error\n }\n }\n\n // No error? Attempt async validation\n return this.validateAsync(value, cause)\n }\n\n getChangeProps = <T extends UserChangeProps<any>>(\n props: T = {} as T,\n ): ChangeProps<TData> & Omit<T, keyof ChangeProps<TData>> => {\n return {\n ...props,\n value: this.state.value,\n onChange: (value) => {\n this.setValue(value)\n props.onChange?.(value)\n },\n onBlur: (e) => {\n const prevTouched = this.state.meta.isTouched\n this.setMeta((prev) => ({ ...prev, isTouched: true }))\n if (!prevTouched) {\n this.validate('change')\n }\n this.validate('blur')\n },\n } as ChangeProps<TData> & Omit<T, keyof ChangeProps<TData>>\n }\n\n getInputProps = <T extends UserInputProps>(\n props: T = {} as T,\n ): InputProps & Omit<T, keyof InputProps> => {\n return {\n ...props,\n value: String(this.state.value),\n onChange: (e) => {\n this.setValue(e.target.value)\n props.onChange?.(e.target.value)\n },\n onBlur: this.getChangeProps(props).onBlur,\n }\n }\n}\n\nfunction normalizeError(rawError?: ValidationError) {\n if (rawError) {\n if (typeof rawError !== 'string') {\n return 'Invalid Form Values'\n }\n\n return rawError\n }\n\n return undefined\n}\n"],"names":["uid","FieldApi","constructor","opts","_defineProperty","_classPrivateFieldInitSpec","info","getInfo","instances","unsubscribe","form","store","subscribe","batch","nextValue","getValue","nextMeta","getMeta","state","value","setState","prev","meta","options","onMount","Object","keys","length","fieldInfo","name","asyncDebounceMs","onChangeAsyncDebounceMs","onBlurAsyncDebounceMs","undefined","defaultValue","setValue","setMeta","getFieldValue","updater","setFieldValue","getFieldMeta","setFieldMeta","getFieldInfo","pushFieldValue","index","insertFieldValue","removeFieldValue","aIndex","bIndex","swapFieldValues","cause","onChange","onBlur","validate","validationCount","error","normalizeError","cancelValidateAsync","count","validationAsyncCount","_classPrivateFieldGet","isValidating","onChangeAsync","onBlurAsync","onSubmitAsync","debounceMs","checkLatest","validationPromise","Promise","resolve","reject","validationResolve","validationReject","r","setTimeout","rawError","isTouched","validateSync","asyncAlways","validateAsync","props","e","prevTouched","String","target","getChangeProps","Store","defaultMeta","onUpdate","touchedError","_classPrivateFieldSet","update"],"mappings":"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"}
|