@tanstack/form-core 1.3.2 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/FieldApi.cjs +78 -62
- package/dist/cjs/FieldApi.cjs.map +1 -1
- package/dist/cjs/FieldApi.d.cts +9 -2
- package/dist/cjs/types.d.cts +4 -0
- package/dist/cjs/util-types.d.cts +33 -11
- package/dist/esm/FieldApi.d.ts +9 -2
- package/dist/esm/FieldApi.js +78 -62
- package/dist/esm/FieldApi.js.map +1 -1
- package/dist/esm/types.d.ts +4 -0
- package/dist/esm/util-types.d.ts +33 -11
- package/package.json +1 -1
- package/src/FieldApi.ts +87 -55
- package/src/types.ts +5 -0
- package/src/util-types.ts +90 -35
package/dist/cjs/FieldApi.cjs
CHANGED
|
@@ -73,64 +73,36 @@ class FieldApi {
|
|
|
73
73
|
return this.form.getFieldValue(this.name);
|
|
74
74
|
};
|
|
75
75
|
this.setValue = (updater, options) => {
|
|
76
|
-
var _a, _b;
|
|
77
76
|
this.form.setFieldValue(this.name, updater, options);
|
|
78
|
-
|
|
79
|
-
value: this.state.value,
|
|
80
|
-
fieldApi: this
|
|
81
|
-
});
|
|
77
|
+
this.triggerOnChangeListener();
|
|
82
78
|
this.validate("change");
|
|
83
79
|
};
|
|
84
80
|
this.getMeta = () => this.store.state.meta;
|
|
85
81
|
this.setMeta = (updater) => this.form.setFieldMeta(this.name, updater);
|
|
86
82
|
this.getInfo = () => this.form.getFieldInfo(this.name);
|
|
87
83
|
this.pushValue = (value, opts2) => {
|
|
88
|
-
var _a, _b;
|
|
89
84
|
this.form.pushFieldValue(this.name, value, opts2);
|
|
90
|
-
|
|
91
|
-
value: this.state.value,
|
|
92
|
-
fieldApi: this
|
|
93
|
-
});
|
|
85
|
+
this.triggerOnChangeListener();
|
|
94
86
|
};
|
|
95
87
|
this.insertValue = (index, value, opts2) => {
|
|
96
|
-
var _a, _b;
|
|
97
88
|
this.form.insertFieldValue(this.name, index, value, opts2);
|
|
98
|
-
|
|
99
|
-
value: this.state.value,
|
|
100
|
-
fieldApi: this
|
|
101
|
-
});
|
|
89
|
+
this.triggerOnChangeListener();
|
|
102
90
|
};
|
|
103
91
|
this.replaceValue = (index, value, opts2) => {
|
|
104
|
-
var _a, _b;
|
|
105
92
|
this.form.replaceFieldValue(this.name, index, value, opts2);
|
|
106
|
-
|
|
107
|
-
value: this.state.value,
|
|
108
|
-
fieldApi: this
|
|
109
|
-
});
|
|
93
|
+
this.triggerOnChangeListener();
|
|
110
94
|
};
|
|
111
95
|
this.removeValue = (index, opts2) => {
|
|
112
|
-
var _a, _b;
|
|
113
96
|
this.form.removeFieldValue(this.name, index, opts2);
|
|
114
|
-
|
|
115
|
-
value: this.state.value,
|
|
116
|
-
fieldApi: this
|
|
117
|
-
});
|
|
97
|
+
this.triggerOnChangeListener();
|
|
118
98
|
};
|
|
119
99
|
this.swapValues = (aIndex, bIndex, opts2) => {
|
|
120
|
-
var _a, _b;
|
|
121
100
|
this.form.swapFieldValues(this.name, aIndex, bIndex, opts2);
|
|
122
|
-
|
|
123
|
-
value: this.state.value,
|
|
124
|
-
fieldApi: this
|
|
125
|
-
});
|
|
101
|
+
this.triggerOnChangeListener();
|
|
126
102
|
};
|
|
127
103
|
this.moveValue = (aIndex, bIndex, opts2) => {
|
|
128
|
-
var _a, _b;
|
|
129
104
|
this.form.moveFieldValues(this.name, aIndex, bIndex, opts2);
|
|
130
|
-
|
|
131
|
-
value: this.state.value,
|
|
132
|
-
fieldApi: this
|
|
133
|
-
});
|
|
105
|
+
this.triggerOnChangeListener();
|
|
134
106
|
};
|
|
135
107
|
this.getLinkedFields = (cause) => {
|
|
136
108
|
const fields = Object.values(this.form.fieldInfo);
|
|
@@ -255,28 +227,31 @@ class FieldApi {
|
|
|
255
227
|
let rawError;
|
|
256
228
|
try {
|
|
257
229
|
rawError = await new Promise((rawResolve, rawReject) => {
|
|
258
|
-
if (this.timeoutIds[validateObj.cause]) {
|
|
259
|
-
clearTimeout(this.timeoutIds[validateObj.cause]);
|
|
230
|
+
if (this.timeoutIds.validations[validateObj.cause]) {
|
|
231
|
+
clearTimeout(this.timeoutIds.validations[validateObj.cause]);
|
|
260
232
|
}
|
|
261
|
-
this.timeoutIds[validateObj.cause] = setTimeout(
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
value:
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
233
|
+
this.timeoutIds.validations[validateObj.cause] = setTimeout(
|
|
234
|
+
async () => {
|
|
235
|
+
if (controller.signal.aborted) return rawResolve(void 0);
|
|
236
|
+
try {
|
|
237
|
+
rawResolve(
|
|
238
|
+
await this.runValidator({
|
|
239
|
+
validate: validateObj.validate,
|
|
240
|
+
value: {
|
|
241
|
+
value: field.store.state.value,
|
|
242
|
+
fieldApi: field,
|
|
243
|
+
signal: controller.signal,
|
|
244
|
+
validationSource: "field"
|
|
245
|
+
},
|
|
246
|
+
type: "validateAsync"
|
|
247
|
+
})
|
|
248
|
+
);
|
|
249
|
+
} catch (e) {
|
|
250
|
+
rawReject(e);
|
|
251
|
+
}
|
|
252
|
+
},
|
|
253
|
+
validateObj.debounceMs
|
|
254
|
+
);
|
|
280
255
|
});
|
|
281
256
|
} catch (e) {
|
|
282
257
|
rawError = e;
|
|
@@ -341,7 +316,6 @@ class FieldApi {
|
|
|
341
316
|
this.setValue(updater);
|
|
342
317
|
};
|
|
343
318
|
this.handleBlur = () => {
|
|
344
|
-
var _a, _b;
|
|
345
319
|
const prevTouched = this.state.meta.isTouched;
|
|
346
320
|
if (!prevTouched) {
|
|
347
321
|
this.setMeta((prev) => ({ ...prev, isTouched: true }));
|
|
@@ -351,14 +325,14 @@ class FieldApi {
|
|
|
351
325
|
this.setMeta((prev) => ({ ...prev, isBlurred: true }));
|
|
352
326
|
}
|
|
353
327
|
this.validate("blur");
|
|
354
|
-
|
|
355
|
-
value: this.state.value,
|
|
356
|
-
fieldApi: this
|
|
357
|
-
});
|
|
328
|
+
this.triggerOnBlurListener();
|
|
358
329
|
};
|
|
359
330
|
this.form = opts.form;
|
|
360
331
|
this.name = opts.name;
|
|
361
|
-
this.timeoutIds = {
|
|
332
|
+
this.timeoutIds = {
|
|
333
|
+
validations: {},
|
|
334
|
+
listeners: {}
|
|
335
|
+
};
|
|
362
336
|
this.store = new store.Derived({
|
|
363
337
|
deps: [this.form.store],
|
|
364
338
|
fn: () => {
|
|
@@ -407,6 +381,48 @@ class FieldApi {
|
|
|
407
381
|
})
|
|
408
382
|
);
|
|
409
383
|
}
|
|
384
|
+
triggerOnBlurListener() {
|
|
385
|
+
var _a, _b, _c;
|
|
386
|
+
const debounceMs = (_a = this.options.listeners) == null ? void 0 : _a.onBlurDebounceMs;
|
|
387
|
+
if (debounceMs && debounceMs > 0) {
|
|
388
|
+
if (this.timeoutIds.listeners.blur) {
|
|
389
|
+
clearTimeout(this.timeoutIds.listeners.blur);
|
|
390
|
+
}
|
|
391
|
+
this.timeoutIds.listeners.blur = setTimeout(() => {
|
|
392
|
+
var _a2, _b2;
|
|
393
|
+
(_b2 = (_a2 = this.options.listeners) == null ? void 0 : _a2.onBlur) == null ? void 0 : _b2.call(_a2, {
|
|
394
|
+
value: this.state.value,
|
|
395
|
+
fieldApi: this
|
|
396
|
+
});
|
|
397
|
+
}, debounceMs);
|
|
398
|
+
} else {
|
|
399
|
+
(_c = (_b = this.options.listeners) == null ? void 0 : _b.onBlur) == null ? void 0 : _c.call(_b, {
|
|
400
|
+
value: this.state.value,
|
|
401
|
+
fieldApi: this
|
|
402
|
+
});
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
triggerOnChangeListener() {
|
|
406
|
+
var _a, _b, _c;
|
|
407
|
+
const debounceMs = (_a = this.options.listeners) == null ? void 0 : _a.onChangeDebounceMs;
|
|
408
|
+
if (debounceMs && debounceMs > 0) {
|
|
409
|
+
if (this.timeoutIds.listeners.change) {
|
|
410
|
+
clearTimeout(this.timeoutIds.listeners.change);
|
|
411
|
+
}
|
|
412
|
+
this.timeoutIds.listeners.change = setTimeout(() => {
|
|
413
|
+
var _a2, _b2;
|
|
414
|
+
(_b2 = (_a2 = this.options.listeners) == null ? void 0 : _a2.onChange) == null ? void 0 : _b2.call(_a2, {
|
|
415
|
+
value: this.state.value,
|
|
416
|
+
fieldApi: this
|
|
417
|
+
});
|
|
418
|
+
}, debounceMs);
|
|
419
|
+
} else {
|
|
420
|
+
(_c = (_b = this.options.listeners) == null ? void 0 : _b.onChange) == null ? void 0 : _c.call(_b, {
|
|
421
|
+
value: this.state.value,
|
|
422
|
+
fieldApi: this
|
|
423
|
+
});
|
|
424
|
+
}
|
|
425
|
+
}
|
|
410
426
|
}
|
|
411
427
|
function normalizeError(rawError) {
|
|
412
428
|
if (rawError) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FieldApi.cjs","sources":["../../src/FieldApi.ts"],"sourcesContent":["import { Derived, batch } from '@tanstack/store'\nimport {\n isStandardSchemaValidator,\n standardSchemaValidators,\n} from './standardSchemaValidator'\nimport { defaultFieldMeta } from './metaHelper'\nimport { getAsyncValidatorArray, getBy, getSyncValidatorArray } from './utils'\nimport type { DeepKeys, DeepValue, UnwrapOneLevelOfArray } from './util-types'\nimport type {\n StandardSchemaV1,\n StandardSchemaV1Issue,\n TStandardSchemaValidatorValue,\n} from './standardSchemaValidator'\nimport type {\n FieldInfo,\n FormApi,\n FormAsyncValidateOrFn,\n FormValidateAsyncFn,\n FormValidateFn,\n FormValidateOrFn,\n} from './FormApi'\nimport type {\n UpdateMetaOptions,\n ValidationCause,\n ValidationError,\n ValidationErrorMap,\n} from './types'\nimport type { AsyncValidator, SyncValidator, Updater } from './utils'\n\n/**\n * @private\n */\n// TODO: Add the `Unwrap` type to the errors\ntype FieldErrorMapFromValidator<\n TFormData,\n TName extends DeepKeys<TFormData>,\n TData extends DeepValue<TFormData, TName>,\n TOnMount extends undefined | FieldValidateOrFn<TFormData, TName, TData>,\n TOnChange extends undefined | FieldValidateOrFn<TFormData, TName, TData>,\n TOnChangeAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TFormData, TName, TData>,\n TOnBlur extends undefined | FieldValidateOrFn<TFormData, TName, TData>,\n TOnBlurAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TFormData, TName, TData>,\n TOnSubmit extends undefined | FieldValidateOrFn<TFormData, TName, TData>,\n TOnSubmitAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TFormData, TName, TData>,\n> = Partial<\n Record<\n DeepKeys<TFormData>,\n ValidationErrorMap<\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync\n >\n >\n>\n\n/**\n * @private\n */\nexport type FieldValidateFn<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> = (props: {\n value: TData\n fieldApi: FieldApi<\n TParentData,\n TName,\n TData,\n // This is technically an edge-type; which we try to keep non-`any`, but in this case\n // It's referring to an inaccessible type from the field validate function inner types, so it's not a big deal\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n >\n}) => unknown\n\n/**\n * @private\n */\nexport type FieldValidateOrFn<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> =\n | FieldValidateFn<TParentData, TName, TData>\n | StandardSchemaV1<TData, unknown>\n\ntype StandardBrandedSchemaV1<T> = T & { __standardSchemaV1: true }\n\ntype UnwrapFormValidateOrFnForInner<\n TValidateOrFn extends undefined | FormValidateOrFn<any>,\n> = [TValidateOrFn] extends [FormValidateFn<any>]\n ? ReturnType<TValidateOrFn>\n : [TValidateOrFn] extends [StandardSchemaV1<infer TOut, any>]\n ? StandardBrandedSchemaV1<TOut>\n : undefined\n\nexport type UnwrapFieldValidateOrFn<\n TName extends string,\n TValidateOrFn extends undefined | FieldValidateOrFn<any, any, any>,\n TFormValidateOrFn extends undefined | FormValidateOrFn<any>,\n> =\n | ([TFormValidateOrFn] extends [StandardSchemaV1<any, infer TStandardOut>]\n ? TName extends keyof TStandardOut\n ? StandardSchemaV1Issue[]\n : undefined\n : undefined)\n | (UnwrapFormValidateOrFnForInner<TFormValidateOrFn> extends infer TFormValidateVal\n ? TFormValidateVal extends { __standardSchemaV1: true }\n ? [DeepValue<TFormValidateVal, TName>] extends [never]\n ? undefined\n : StandardSchemaV1Issue[]\n : TFormValidateVal extends { fields: any }\n ? TName extends keyof TFormValidateVal['fields']\n ? TFormValidateVal['fields'][TName]\n : undefined\n : undefined\n : never)\n | ([TValidateOrFn] extends [FieldValidateFn<any, any, any>]\n ? ReturnType<TValidateOrFn>\n : [TValidateOrFn] extends [StandardSchemaV1<any, any>]\n ? // TODO: Check if `disableErrorFlat` is enabled, if so, return StandardSchemaV1Issue[][]\n StandardSchemaV1Issue[]\n : undefined)\n\n/**\n * @private\n */\nexport type FieldValidateAsyncFn<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> = (options: {\n value: TData\n fieldApi: FieldApi<\n TParentData,\n TName,\n TData,\n // This is technically an edge-type; which we try to keep non-`any`, but in this case\n // It's referring to an inaccessible type from the field validate function inner types, so it's not a big deal\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n >\n signal: AbortSignal\n}) => unknown | Promise<unknown>\n\n/**\n * @private\n */\nexport type FieldAsyncValidateOrFn<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> =\n | FieldValidateAsyncFn<TParentData, TName, TData>\n | StandardSchemaV1<TData, unknown>\n\ntype UnwrapFormAsyncValidateOrFnForInner<\n TValidateOrFn extends undefined | FormAsyncValidateOrFn<any>,\n> = [TValidateOrFn] extends [FormValidateAsyncFn<any>]\n ? Awaited<ReturnType<TValidateOrFn>>\n : [TValidateOrFn] extends [StandardSchemaV1<infer TOut, any>]\n ? StandardBrandedSchemaV1<TOut>\n : undefined\n\nexport type UnwrapFieldAsyncValidateOrFn<\n TName extends string,\n TValidateOrFn extends undefined | FieldAsyncValidateOrFn<any, any, any>,\n TFormValidateOrFn extends undefined | FormAsyncValidateOrFn<any>,\n> =\n | ([TFormValidateOrFn] extends [StandardSchemaV1<any, infer TStandardOut>]\n ? TName extends keyof TStandardOut\n ? StandardSchemaV1Issue[]\n : undefined\n : undefined)\n | (UnwrapFormAsyncValidateOrFnForInner<TFormValidateOrFn> extends infer TFormValidateVal\n ? TFormValidateVal extends { __standardSchemaV1: true }\n ? [DeepValue<TFormValidateVal, TName>] extends [never]\n ? undefined\n : StandardSchemaV1Issue[]\n : TFormValidateVal extends { fields: any }\n ? TName extends keyof TFormValidateVal['fields']\n ? TFormValidateVal['fields'][TName]\n : undefined\n : undefined\n : never)\n | ([TValidateOrFn] extends [FieldValidateAsyncFn<any, any, any>]\n ? Awaited<ReturnType<TValidateOrFn>>\n : [TValidateOrFn] extends [StandardSchemaV1<any, any>]\n ? // TODO: Check if `disableErrorFlat` is enabled, if so, return StandardSchemaV1Issue[][]\n StandardSchemaV1Issue[]\n : undefined)\n\n/**\n * @private\n */\nexport type FieldListenerFn<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> = (props: {\n value: TData\n fieldApi: FieldApi<\n TParentData,\n TName,\n TData,\n // This is technically an edge-type; which we try to keep non-`any`, but in this case\n // It's referring to an inaccessible type from the field listener function inner types, so it's not a big deal\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n >\n}) => void\n\nexport interface FieldValidators<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName>,\n TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChangeAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnBlurAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnSubmitAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n> {\n /**\n * An optional function, that runs on the mount event of input.\n */\n onMount?: TOnMount\n /**\n * An optional function, that runs on the change event of input.\n *\n * @example z.string().min(1)\n */\n onChange?: TOnChange\n /**\n * An optional property similar to `onChange` but async validation\n *\n * @example z.string().refine(async (val) => val.length > 3, { message: 'Testing 123' })\n */\n onChangeAsync?: TOnChangeAsync\n /**\n * An optional number to represent how long the `onChangeAsync` should wait before running\n *\n * If set to a number larger than 0, will debounce the async validation event by this length of time in milliseconds\n */\n onChangeAsyncDebounceMs?: number\n /**\n * An optional list of field names that should trigger this field's `onChange` and `onChangeAsync` events when its value changes\n */\n onChangeListenTo?: DeepKeys<TParentData>[]\n /**\n * An optional function, that runs on the blur event of input.\n *\n * @example z.string().min(1)\n */\n onBlur?: TOnBlur\n /**\n * An optional property similar to `onBlur` but async validation.\n *\n * @example z.string().refine(async (val) => val.length > 3, { message: 'Testing 123' })\n */\n onBlurAsync?: TOnBlurAsync\n\n /**\n * An optional number to represent how long the `onBlurAsync` should wait before running\n *\n * If set to a number larger than 0, will debounce the async validation event by this length of time in milliseconds\n */\n onBlurAsyncDebounceMs?: number\n /**\n * An optional list of field names that should trigger this field's `onBlur` and `onBlurAsync` events when its value changes\n */\n onBlurListenTo?: DeepKeys<TParentData>[]\n /**\n * An optional function, that runs on the submit event of form.\n *\n * @example z.string().min(1)\n */\n onSubmit?: TOnSubmit\n /**\n * An optional property similar to `onSubmit` but async validation.\n *\n * @example z.string().refine(async (val) => val.length > 3, { message: 'Testing 123' })\n */\n onSubmitAsync?: TOnSubmitAsync\n}\n\nexport interface FieldListeners<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> {\n onChange?: FieldListenerFn<TParentData, TName, TData>\n onBlur?: FieldListenerFn<TParentData, TName, TData>\n onMount?: FieldListenerFn<TParentData, TName, TData>\n onSubmit?: FieldListenerFn<TParentData, TName, TData>\n}\n\n/**\n * An object type representing the options for a field in a form.\n */\nexport interface FieldOptions<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName>,\n TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChangeAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnBlurAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnSubmitAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n> {\n /**\n * The field name. The type will be `DeepKeys<TParentData>` to ensure your name is a deep key of the parent dataset.\n */\n name: TName\n /**\n * An optional default value for the field.\n */\n defaultValue?: NoInfer<TData>\n /**\n * The default time to debounce async validation if there is not a more specific debounce time passed.\n */\n asyncDebounceMs?: number\n /**\n * If `true`, always run async validation, even if there are errors emitted during synchronous validation.\n */\n asyncAlways?: boolean\n /**\n * A list of validators to pass to the field\n */\n validators?: FieldValidators<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync\n >\n /**\n * An optional object with default metadata for the field.\n */\n defaultMeta?: Partial<\n FieldMeta<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n >\n >\n /**\n * A list of listeners which attach to the corresponding events\n */\n listeners?: FieldListeners<TParentData, TName, TData>\n /**\n * Disable the `flat(1)` operation on `field.errors`. This is useful if you want to keep the error structure as is. Not suggested for most use-cases.\n */\n disableErrorFlat?: boolean\n}\n\n/**\n * An object type representing the required options for the FieldApi class.\n */\nexport interface FieldApiOptions<\n in out TParentData,\n in out TName extends DeepKeys<TParentData>,\n in out TData extends DeepValue<TParentData, TName>,\n in out TOnMount extends\n | undefined\n | FieldValidateOrFn<TParentData, TName, TData>,\n in out TOnChange extends\n | undefined\n | FieldValidateOrFn<TParentData, TName, TData>,\n in out TOnChangeAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n in out TOnBlur extends\n | undefined\n | FieldValidateOrFn<TParentData, TName, TData>,\n in out TOnBlurAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n in out TOnSubmit extends\n | undefined\n | FieldValidateOrFn<TParentData, TName, TData>,\n in out TOnSubmitAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n in out TFormOnMount extends undefined | FormValidateOrFn<TParentData>,\n in out TFormOnChange extends undefined | FormValidateOrFn<TParentData>,\n in out TFormOnChangeAsync extends\n | undefined\n | FormAsyncValidateOrFn<TParentData>,\n in out TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,\n in out TFormOnBlurAsync extends\n | undefined\n | FormAsyncValidateOrFn<TParentData>,\n in out TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,\n in out TFormOnSubmitAsync extends\n | undefined\n | FormAsyncValidateOrFn<TParentData>,\n in out TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>,\n in out TParentSubmitMeta,\n> extends FieldOptions<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync\n > {\n form: FormApi<\n TParentData,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnServer,\n TParentSubmitMeta\n >\n}\n\nexport type FieldMetaBase<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName>,\n TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChangeAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnBlurAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnSubmitAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TFormOnMount extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChange extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,\n TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,\n TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n> = {\n /**\n * A flag indicating whether the field has been touched.\n */\n isTouched: boolean\n /**\n * A flag indicating whether the field has been blurred.\n */\n isBlurred: boolean\n /**\n * A flag that is `true` if the field's value has been modified by the user. Opposite of `isPristine`.\n */\n isDirty: boolean\n /**\n * A map of errors related to the field value.\n */\n errorMap: ValidationErrorMap<\n UnwrapFieldValidateOrFn<TName, TOnMount, TFormOnMount>,\n UnwrapFieldValidateOrFn<TName, TOnChange, TFormOnChange>,\n UnwrapFieldAsyncValidateOrFn<TName, TOnChangeAsync, TFormOnChangeAsync>,\n UnwrapFieldValidateOrFn<TName, TOnBlur, TFormOnBlur>,\n UnwrapFieldAsyncValidateOrFn<TName, TOnBlurAsync, TFormOnBlurAsync>,\n UnwrapFieldValidateOrFn<TName, TOnSubmit, TFormOnSubmit>,\n UnwrapFieldAsyncValidateOrFn<TName, TOnSubmitAsync, TFormOnSubmitAsync>\n >\n /**\n * A flag indicating whether the field is currently being validated.\n */\n isValidating: boolean\n}\n\nexport type AnyFieldMetaBase = FieldMetaBase<\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n>\n\nexport type FieldMetaDerived<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName>,\n TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChangeAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnBlurAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnSubmitAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TFormOnMount extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChange extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,\n TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,\n TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n> = {\n /**\n * An array of errors related to the field value.\n */\n errors: Array<\n | UnwrapOneLevelOfArray<\n UnwrapFieldValidateOrFn<TName, TOnMount, TFormOnMount>\n >\n | UnwrapOneLevelOfArray<\n UnwrapFieldValidateOrFn<TName, TOnChange, TFormOnChange>\n >\n | UnwrapOneLevelOfArray<\n UnwrapFieldAsyncValidateOrFn<TName, TOnChangeAsync, TFormOnChangeAsync>\n >\n | UnwrapOneLevelOfArray<\n UnwrapFieldValidateOrFn<TName, TOnBlur, TFormOnBlur>\n >\n | UnwrapOneLevelOfArray<\n UnwrapFieldAsyncValidateOrFn<TName, TOnBlurAsync, TFormOnBlurAsync>\n >\n | UnwrapOneLevelOfArray<\n UnwrapFieldValidateOrFn<TName, TOnSubmit, TFormOnSubmit>\n >\n | UnwrapOneLevelOfArray<\n UnwrapFieldAsyncValidateOrFn<TName, TOnSubmitAsync, TFormOnSubmitAsync>\n >\n >\n /**\n * A flag that is `true` if the field's value has not been modified by the user. Opposite of `isDirty`.\n */\n isPristine: boolean\n}\n\nexport type AnyFieldMetaDerived = FieldMetaDerived<\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n>\n\n/**\n * An object type representing the metadata of a field in a form.\n */\nexport type FieldMeta<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName>,\n TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChangeAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnBlurAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnSubmitAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TFormOnMount extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChange extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,\n TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,\n TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n> = FieldMetaBase<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync\n> &\n FieldMetaDerived<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync\n >\n\nexport type AnyFieldMeta = FieldMeta<\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n>\n\n/**\n * An object type representing the state of a field.\n */\nexport type FieldState<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName>,\n TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChangeAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnBlurAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnSubmitAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TFormOnMount extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChange extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,\n TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,\n TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n> = {\n /**\n * The current value of the field.\n */\n value: TData\n /**\n * The current metadata of the field.\n */\n meta: FieldMeta<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync\n >\n}\n\n/**\n * @public\n *\n * A type representing the Field API with all generics set to `any` for convenience.\n */\nexport type AnyFieldApi = FieldApi<\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n>\n\n/**\n * A class representing the API for managing a form field.\n *\n * Normally, you will not need to create a new `FieldApi` instance directly.\n * Instead, you will use a framework hook/function like `useField` or `createField`\n * to create a new instance for you that uses your framework's reactivity model.\n * However, if you need to create a new instance manually, you can do so by calling\n * the `new FieldApi` constructor.\n */\nexport class FieldApi<\n in out TParentData,\n in out TName extends DeepKeys<TParentData>,\n in out TData extends DeepValue<TParentData, TName>,\n in out TOnMount extends\n | undefined\n | FieldValidateOrFn<TParentData, TName, TData>,\n in out TOnChange extends\n | undefined\n | FieldValidateOrFn<TParentData, TName, TData>,\n in out TOnChangeAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n in out TOnBlur extends\n | undefined\n | FieldValidateOrFn<TParentData, TName, TData>,\n in out TOnBlurAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n in out TOnSubmit extends\n | undefined\n | FieldValidateOrFn<TParentData, TName, TData>,\n in out TOnSubmitAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n in out TFormOnMount extends undefined | FormValidateOrFn<TParentData>,\n in out TFormOnChange extends undefined | FormValidateOrFn<TParentData>,\n in out TFormOnChangeAsync extends\n | undefined\n | FormAsyncValidateOrFn<TParentData>,\n in out TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,\n in out TFormOnBlurAsync extends\n | undefined\n | FormAsyncValidateOrFn<TParentData>,\n in out TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,\n in out TFormOnSubmitAsync extends\n | undefined\n | FormAsyncValidateOrFn<TParentData>,\n in out TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>,\n in out TParentSubmitMeta,\n> {\n /**\n * A reference to the form API instance.\n */\n form: FieldApiOptions<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnServer,\n TParentSubmitMeta\n >['form']\n /**\n * The field name.\n */\n name!: DeepKeys<TParentData>\n /**\n * The field options.\n */\n options: FieldApiOptions<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnServer,\n TParentSubmitMeta\n > = {} as any\n /**\n * The field state store.\n */\n store!: Derived<\n FieldState<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync\n >\n >\n /**\n * The current field state.\n */\n get state() {\n return this.store.state\n }\n timeoutIds: Record<ValidationCause, ReturnType<typeof setTimeout> | null>\n\n /**\n * Initializes a new `FieldApi` instance.\n */\n constructor(\n opts: FieldApiOptions<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnServer,\n TParentSubmitMeta\n >,\n ) {\n this.form = opts.form as never\n this.name = opts.name as never\n this.timeoutIds = {} as Record<ValidationCause, never>\n\n this.store = new Derived({\n deps: [this.form.store],\n fn: () => {\n const value = this.form.getFieldValue(this.name)\n const meta = this.form.getFieldMeta(this.name) ?? {\n ...defaultFieldMeta,\n ...opts.defaultMeta,\n }\n\n return {\n value,\n meta,\n } as FieldState<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync\n >\n },\n })\n\n this.options = opts as never\n }\n\n /**\n * @private\n */\n runValidator<\n TValue extends TStandardSchemaValidatorValue<TData> & {\n fieldApi: AnyFieldApi\n },\n TType extends 'validate' | 'validateAsync',\n >(props: {\n validate: TType extends 'validate'\n ? FieldValidateOrFn<any, any, any>\n : FieldAsyncValidateOrFn<any, any, any>\n value: TValue\n type: TType\n // When `api` is 'field', the return type cannot be `FormValidationError`\n }): unknown {\n if (isStandardSchemaValidator(props.validate)) {\n return standardSchemaValidators[props.type](\n props.value,\n props.validate,\n ) as never\n }\n\n return (props.validate as FieldValidateFn<any, any>)(props.value) as never\n }\n\n /**\n * Mounts the field instance to the form.\n */\n mount = () => {\n const cleanup = this.store.mount()\n\n if ((this.options.defaultValue as unknown) !== undefined) {\n this.form.setFieldValue(this.name, this.options.defaultValue as never, {\n dontUpdateMeta: true,\n })\n }\n\n const info = this.getInfo()\n info.instance = this as never\n\n this.update(this.options as never)\n const { onMount } = this.options.validators || {}\n\n if (onMount) {\n const error = this.runValidator({\n validate: onMount,\n value: {\n value: this.state.value,\n fieldApi: this,\n validationSource: 'field',\n },\n type: 'validate',\n })\n if (error) {\n this.setMeta(\n (prev) =>\n ({\n ...prev,\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n errorMap: { ...prev?.errorMap, onMount: error },\n }) as never,\n )\n }\n }\n\n this.options.listeners?.onMount?.({\n value: this.state.value,\n fieldApi: this,\n })\n\n return cleanup\n }\n\n /**\n * Updates the field instance with new options.\n */\n update = (\n opts: FieldApiOptions<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnServer,\n TParentSubmitMeta\n >,\n ) => {\n this.options = opts as never\n\n const nameHasChanged = this.name !== opts.name\n this.name = opts.name\n\n // Default Value\n if ((this.state.value as unknown) === undefined) {\n const formDefault = getBy(opts.form.options.defaultValues, opts.name)\n\n const defaultValue = (opts.defaultValue as unknown) ?? formDefault\n\n // The name is dynamic in array fields. It changes when the user performs operations like removing or reordering.\n // In this case, we don't want to force a default value if the store managed to find an existing value.\n if (nameHasChanged) {\n this.setValue((val) => (val as unknown) || defaultValue, {\n dontUpdateMeta: true,\n })\n } else if (defaultValue !== undefined) {\n this.setValue(defaultValue as never, {\n dontUpdateMeta: true,\n })\n }\n }\n\n // Default Meta\n if (this.form.getFieldMeta(this.name) === undefined) {\n this.setMeta(this.state.meta)\n }\n }\n\n /**\n * Gets the current field value.\n * @deprecated Use `field.state.value` instead.\n */\n getValue = (): TData => {\n return this.form.getFieldValue(this.name) as TData\n }\n\n /**\n * Sets the field value and run the `change` validator.\n */\n setValue = (updater: Updater<TData>, options?: UpdateMetaOptions) => {\n this.form.setFieldValue(this.name, updater as never, options)\n\n this.options.listeners?.onChange?.({\n value: this.state.value,\n fieldApi: this,\n })\n\n this.validate('change')\n }\n\n getMeta = () => this.store.state.meta\n\n /**\n * Sets the field metadata.\n */\n setMeta = (\n updater: Updater<\n FieldMeta<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync\n >\n >,\n ) => this.form.setFieldMeta(this.name, updater)\n\n /**\n * Gets the field information object.\n */\n getInfo = () => this.form.getFieldInfo(this.name)\n\n /**\n * Pushes a new value to the field.\n */\n pushValue = (\n value: TData extends any[] ? TData[number] : never,\n opts?: UpdateMetaOptions,\n ) => {\n this.form.pushFieldValue(this.name, value as any, opts)\n\n this.options.listeners?.onChange?.({\n value: this.state.value,\n fieldApi: this,\n })\n }\n\n /**\n * Inserts a value at the specified index, shifting the subsequent values to the right.\n */\n insertValue = (\n index: number,\n value: TData extends any[] ? TData[number] : never,\n opts?: UpdateMetaOptions,\n ) => {\n this.form.insertFieldValue(this.name, index, value as any, opts)\n\n this.options.listeners?.onChange?.({\n value: this.state.value,\n fieldApi: this,\n })\n }\n\n /**\n * Replaces a value at the specified index.\n */\n replaceValue = (\n index: number,\n value: TData extends any[] ? TData[number] : never,\n opts?: UpdateMetaOptions,\n ) => {\n this.form.replaceFieldValue(this.name, index, value as any, opts)\n\n this.options.listeners?.onChange?.({\n value: this.state.value,\n fieldApi: this,\n })\n }\n\n /**\n * Removes a value at the specified index.\n */\n removeValue = (index: number, opts?: UpdateMetaOptions) => {\n this.form.removeFieldValue(this.name, index, opts)\n\n this.options.listeners?.onChange?.({\n value: this.state.value,\n fieldApi: this,\n })\n }\n\n /**\n * Swaps the values at the specified indices.\n */\n swapValues = (aIndex: number, bIndex: number, opts?: UpdateMetaOptions) => {\n this.form.swapFieldValues(this.name, aIndex, bIndex, opts)\n\n this.options.listeners?.onChange?.({\n value: this.state.value,\n fieldApi: this,\n })\n }\n\n /**\n * Moves the value at the first specified index to the second specified index.\n */\n moveValue = (aIndex: number, bIndex: number, opts?: UpdateMetaOptions) => {\n this.form.moveFieldValues(this.name, aIndex, bIndex, opts)\n\n this.options.listeners?.onChange?.({\n value: this.state.value,\n fieldApi: this,\n })\n }\n\n /**\n * @private\n */\n getLinkedFields = (cause: ValidationCause) => {\n const fields = Object.values(this.form.fieldInfo) as FieldInfo<any>[]\n\n const linkedFields: AnyFieldApi[] = []\n for (const field of fields) {\n if (!field.instance) continue\n const { onChangeListenTo, onBlurListenTo } =\n field.instance.options.validators || {}\n if (cause === 'change' && onChangeListenTo?.includes(this.name)) {\n linkedFields.push(field.instance)\n }\n if (cause === 'blur' && onBlurListenTo?.includes(this.name as string)) {\n linkedFields.push(field.instance)\n }\n }\n\n return linkedFields\n }\n\n /**\n * @private\n */\n validateSync = (\n cause: ValidationCause,\n errorFromForm: ValidationErrorMap,\n ) => {\n const validates = getSyncValidatorArray(cause, this.options)\n\n const linkedFields = this.getLinkedFields(cause)\n const linkedFieldValidates = linkedFields.reduce(\n (acc, field) => {\n const fieldValidates = getSyncValidatorArray(cause, field.options)\n fieldValidates.forEach((validate) => {\n ;(validate as any).field = field\n })\n return acc.concat(fieldValidates as never)\n },\n [] as Array<\n SyncValidator<any> & {\n field: AnyFieldApi\n }\n >,\n )\n\n // Needs type cast as eslint errantly believes this is always falsy\n let hasErrored = false as boolean\n\n batch(() => {\n const validateFieldFn = (\n field: AnyFieldApi,\n validateObj: SyncValidator<any>,\n ) => {\n const errorMapKey = getErrorMapKey(validateObj.cause)\n\n const error =\n /*\n If `validateObj.validate` is `undefined`, then the field doesn't have\n a validator for this event, but there still could be an error that\n needs to be cleaned up related to the current event left by the\n form's validator.\n */\n validateObj.validate\n ? normalizeError(\n field.runValidator({\n validate: validateObj.validate,\n value: {\n value: field.store.state.value,\n validationSource: 'field',\n fieldApi: field,\n },\n type: 'validate',\n }),\n )\n : errorFromForm[errorMapKey]\n\n if (field.state.meta.errorMap[errorMapKey] !== error) {\n field.setMeta((prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n [getErrorMapKey(validateObj.cause)]:\n // Prefer the error message from the field validators if they exist\n error ? error : errorFromForm[errorMapKey],\n },\n }))\n }\n if (error || errorFromForm[errorMapKey]) {\n hasErrored = true\n }\n }\n\n for (const validateObj of validates) {\n validateFieldFn(this, validateObj)\n }\n for (const fieldValitateObj of linkedFieldValidates) {\n if (!fieldValitateObj.validate) continue\n validateFieldFn(fieldValitateObj.field, fieldValitateObj)\n }\n })\n\n /**\n * when we have an error for onSubmit in the state, we want\n * to clear the error as soon as the user enters a valid value in the field\n */\n const submitErrKey = getErrorMapKey('submit')\n\n if (\n this.state.meta.errorMap[submitErrKey] &&\n cause !== 'submit' &&\n !hasErrored\n ) {\n this.setMeta((prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n [submitErrKey]: undefined,\n },\n }))\n }\n\n return { hasErrored }\n }\n\n /**\n * @private\n */\n validateAsync = async (\n cause: ValidationCause,\n formValidationResultPromise: Promise<\n FieldErrorMapFromValidator<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync\n >\n >,\n ) => {\n const validates = getAsyncValidatorArray(cause, this.options)\n\n // Get the field-specific error messages that are coming from the form's validator\n const asyncFormValidationResults = await formValidationResultPromise\n\n const linkedFields = this.getLinkedFields(cause)\n const linkedFieldValidates = linkedFields.reduce(\n (acc, field) => {\n const fieldValidates = getAsyncValidatorArray(cause, field.options)\n fieldValidates.forEach((validate) => {\n ;(validate as any).field = field\n })\n return acc.concat(fieldValidates as never)\n },\n [] as Array<\n AsyncValidator<any> & {\n field: AnyFieldApi\n }\n >,\n )\n\n if (!this.state.meta.isValidating) {\n this.setMeta((prev) => ({ ...prev, isValidating: true }))\n }\n\n for (const linkedField of linkedFields) {\n linkedField.setMeta((prev) => ({ ...prev, isValidating: true }))\n }\n\n /**\n * We have to use a for loop and generate our promises this way, otherwise it won't be sync\n * when there are no validators needed to be run\n */\n const validatesPromises: Promise<ValidationError | undefined>[] = []\n const linkedPromises: Promise<ValidationError | undefined>[] = []\n\n const validateFieldAsyncFn = (\n field: AnyFieldApi,\n validateObj: AsyncValidator<any>,\n promises: Promise<ValidationError | undefined>[],\n ) => {\n const errorMapKey = getErrorMapKey(validateObj.cause)\n const fieldValidatorMeta = field.getInfo().validationMetaMap[errorMapKey]\n\n fieldValidatorMeta?.lastAbortController.abort()\n const controller = new AbortController()\n\n this.getInfo().validationMetaMap[errorMapKey] = {\n lastAbortController: controller,\n }\n\n promises.push(\n new Promise<ValidationError | undefined>(async (resolve) => {\n let rawError!: ValidationError | undefined\n try {\n rawError = await new Promise((rawResolve, rawReject) => {\n if (this.timeoutIds[validateObj.cause]) {\n clearTimeout(this.timeoutIds[validateObj.cause]!)\n }\n\n this.timeoutIds[validateObj.cause] = setTimeout(async () => {\n if (controller.signal.aborted) return rawResolve(undefined)\n try {\n rawResolve(\n await this.runValidator({\n validate: validateObj.validate,\n value: {\n value: field.store.state.value,\n fieldApi: field,\n signal: controller.signal,\n validationSource: 'field',\n },\n type: 'validateAsync',\n }),\n )\n } catch (e) {\n rawReject(e)\n }\n }, validateObj.debounceMs)\n })\n } catch (e: unknown) {\n rawError = e as ValidationError\n }\n if (controller.signal.aborted) return resolve(undefined)\n const error = normalizeError(rawError)\n const fieldErrorFromForm =\n asyncFormValidationResults[this.name]?.[errorMapKey]\n const fieldError = error || fieldErrorFromForm\n field.setMeta((prev) => {\n return {\n ...prev,\n errorMap: {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n ...prev?.errorMap,\n [errorMapKey]: fieldError,\n },\n }\n })\n\n resolve(fieldError)\n }),\n )\n }\n\n // TODO: Dedupe this logic to reduce bundle size\n for (const validateObj of validates) {\n if (!validateObj.validate) continue\n validateFieldAsyncFn(this, validateObj, validatesPromises)\n }\n for (const fieldValitateObj of linkedFieldValidates) {\n if (!fieldValitateObj.validate) continue\n validateFieldAsyncFn(\n fieldValitateObj.field,\n fieldValitateObj,\n linkedPromises,\n )\n }\n\n let results: ValidationError[] = []\n if (validatesPromises.length || linkedPromises.length) {\n results = await Promise.all(validatesPromises)\n await Promise.all(linkedPromises)\n }\n\n this.setMeta((prev) => ({ ...prev, isValidating: false }))\n\n for (const linkedField of linkedFields) {\n linkedField.setMeta((prev) => ({ ...prev, isValidating: false }))\n }\n\n return results.filter(Boolean)\n }\n\n /**\n * Validates the field value.\n */\n validate = (\n cause: ValidationCause,\n opts?: { skipFormValidation?: boolean },\n ): ValidationError[] | Promise<ValidationError[]> => {\n // If the field is pristine, do not validate\n if (!this.state.meta.isTouched) return []\n\n // Attempt to sync validate first\n const { fieldsErrorMap } = opts?.skipFormValidation\n ? { fieldsErrorMap: {} as never }\n : this.form.validateSync(cause)\n const { hasErrored } = this.validateSync(\n cause,\n fieldsErrorMap[this.name] ?? {},\n )\n\n if (hasErrored && !this.options.asyncAlways) {\n this.getInfo().validationMetaMap[\n getErrorMapKey(cause)\n ]?.lastAbortController.abort()\n return this.state.meta.errors\n }\n\n // No error? Attempt async validation\n const formValidationResultPromise = opts?.skipFormValidation\n ? Promise.resolve({})\n : this.form.validateAsync(cause)\n return this.validateAsync(cause, formValidationResultPromise)\n }\n\n /**\n * Handles the change event.\n */\n handleChange = (updater: Updater<TData>) => {\n this.setValue(updater)\n }\n\n /**\n * Handles the blur event.\n */\n handleBlur = () => {\n const prevTouched = this.state.meta.isTouched\n if (!prevTouched) {\n this.setMeta((prev) => ({ ...prev, isTouched: true }))\n this.validate('change')\n }\n if (!this.state.meta.isBlurred) {\n this.setMeta((prev) => ({ ...prev, isBlurred: true }))\n }\n this.validate('blur')\n\n this.options.listeners?.onBlur?.({\n value: this.state.value,\n fieldApi: this,\n })\n }\n\n /**\n * Updates the field's errorMap\n */\n setErrorMap(errorMap: ValidationErrorMap) {\n this.setMeta(\n (prev) =>\n ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n ...errorMap,\n },\n }) as never,\n )\n }\n}\n\nfunction normalizeError(rawError?: ValidationError) {\n if (rawError) {\n return rawError\n }\n\n return undefined\n}\n\nfunction getErrorMapKey(cause: ValidationCause) {\n switch (cause) {\n case 'submit':\n return 'onSubmit'\n case 'blur':\n return 'onBlur'\n case 'mount':\n return 'onMount'\n case 'server':\n return 'onServer'\n case 'change':\n default:\n return 'onChange'\n }\n}\n"],"names":["opts","getBy","getSyncValidatorArray","batch","getAsyncValidatorArray","Derived","defaultFieldMeta","isStandardSchemaValidator","standardSchemaValidators"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FieldApi.cjs","sources":["../../src/FieldApi.ts"],"sourcesContent":["import { Derived, batch } from '@tanstack/store'\nimport {\n isStandardSchemaValidator,\n standardSchemaValidators,\n} from './standardSchemaValidator'\nimport { defaultFieldMeta } from './metaHelper'\nimport { getAsyncValidatorArray, getBy, getSyncValidatorArray } from './utils'\nimport type { DeepKeys, DeepValue, UnwrapOneLevelOfArray } from './util-types'\nimport type {\n StandardSchemaV1,\n StandardSchemaV1Issue,\n TStandardSchemaValidatorValue,\n} from './standardSchemaValidator'\nimport type {\n FieldInfo,\n FormApi,\n FormAsyncValidateOrFn,\n FormValidateAsyncFn,\n FormValidateFn,\n FormValidateOrFn,\n} from './FormApi'\nimport type {\n ListenerCause,\n UpdateMetaOptions,\n ValidationCause,\n ValidationError,\n ValidationErrorMap,\n} from './types'\nimport type { AsyncValidator, SyncValidator, Updater } from './utils'\n\n/**\n * @private\n */\n// TODO: Add the `Unwrap` type to the errors\ntype FieldErrorMapFromValidator<\n TFormData,\n TName extends DeepKeys<TFormData>,\n TData extends DeepValue<TFormData, TName>,\n TOnMount extends undefined | FieldValidateOrFn<TFormData, TName, TData>,\n TOnChange extends undefined | FieldValidateOrFn<TFormData, TName, TData>,\n TOnChangeAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TFormData, TName, TData>,\n TOnBlur extends undefined | FieldValidateOrFn<TFormData, TName, TData>,\n TOnBlurAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TFormData, TName, TData>,\n TOnSubmit extends undefined | FieldValidateOrFn<TFormData, TName, TData>,\n TOnSubmitAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TFormData, TName, TData>,\n> = Partial<\n Record<\n DeepKeys<TFormData>,\n ValidationErrorMap<\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync\n >\n >\n>\n\n/**\n * @private\n */\nexport type FieldValidateFn<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> = (props: {\n value: TData\n fieldApi: FieldApi<\n TParentData,\n TName,\n TData,\n // This is technically an edge-type; which we try to keep non-`any`, but in this case\n // It's referring to an inaccessible type from the field validate function inner types, so it's not a big deal\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n >\n}) => unknown\n\n/**\n * @private\n */\nexport type FieldValidateOrFn<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> =\n | FieldValidateFn<TParentData, TName, TData>\n | StandardSchemaV1<TData, unknown>\n\ntype StandardBrandedSchemaV1<T> = T & { __standardSchemaV1: true }\n\ntype UnwrapFormValidateOrFnForInner<\n TValidateOrFn extends undefined | FormValidateOrFn<any>,\n> = [TValidateOrFn] extends [FormValidateFn<any>]\n ? ReturnType<TValidateOrFn>\n : [TValidateOrFn] extends [StandardSchemaV1<infer TOut, any>]\n ? StandardBrandedSchemaV1<TOut>\n : undefined\n\nexport type UnwrapFieldValidateOrFn<\n TName extends string,\n TValidateOrFn extends undefined | FieldValidateOrFn<any, any, any>,\n TFormValidateOrFn extends undefined | FormValidateOrFn<any>,\n> =\n | ([TFormValidateOrFn] extends [StandardSchemaV1<any, infer TStandardOut>]\n ? TName extends keyof TStandardOut\n ? StandardSchemaV1Issue[]\n : undefined\n : undefined)\n | (UnwrapFormValidateOrFnForInner<TFormValidateOrFn> extends infer TFormValidateVal\n ? TFormValidateVal extends { __standardSchemaV1: true }\n ? [DeepValue<TFormValidateVal, TName>] extends [never]\n ? undefined\n : StandardSchemaV1Issue[]\n : TFormValidateVal extends { fields: any }\n ? TName extends keyof TFormValidateVal['fields']\n ? TFormValidateVal['fields'][TName]\n : undefined\n : undefined\n : never)\n | ([TValidateOrFn] extends [FieldValidateFn<any, any, any>]\n ? ReturnType<TValidateOrFn>\n : [TValidateOrFn] extends [StandardSchemaV1<any, any>]\n ? // TODO: Check if `disableErrorFlat` is enabled, if so, return StandardSchemaV1Issue[][]\n StandardSchemaV1Issue[]\n : undefined)\n\n/**\n * @private\n */\nexport type FieldValidateAsyncFn<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> = (options: {\n value: TData\n fieldApi: FieldApi<\n TParentData,\n TName,\n TData,\n // This is technically an edge-type; which we try to keep non-`any`, but in this case\n // It's referring to an inaccessible type from the field validate function inner types, so it's not a big deal\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n >\n signal: AbortSignal\n}) => unknown | Promise<unknown>\n\n/**\n * @private\n */\nexport type FieldAsyncValidateOrFn<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> =\n | FieldValidateAsyncFn<TParentData, TName, TData>\n | StandardSchemaV1<TData, unknown>\n\ntype UnwrapFormAsyncValidateOrFnForInner<\n TValidateOrFn extends undefined | FormAsyncValidateOrFn<any>,\n> = [TValidateOrFn] extends [FormValidateAsyncFn<any>]\n ? Awaited<ReturnType<TValidateOrFn>>\n : [TValidateOrFn] extends [StandardSchemaV1<infer TOut, any>]\n ? StandardBrandedSchemaV1<TOut>\n : undefined\n\nexport type UnwrapFieldAsyncValidateOrFn<\n TName extends string,\n TValidateOrFn extends undefined | FieldAsyncValidateOrFn<any, any, any>,\n TFormValidateOrFn extends undefined | FormAsyncValidateOrFn<any>,\n> =\n | ([TFormValidateOrFn] extends [StandardSchemaV1<any, infer TStandardOut>]\n ? TName extends keyof TStandardOut\n ? StandardSchemaV1Issue[]\n : undefined\n : undefined)\n | (UnwrapFormAsyncValidateOrFnForInner<TFormValidateOrFn> extends infer TFormValidateVal\n ? TFormValidateVal extends { __standardSchemaV1: true }\n ? [DeepValue<TFormValidateVal, TName>] extends [never]\n ? undefined\n : StandardSchemaV1Issue[]\n : TFormValidateVal extends { fields: any }\n ? TName extends keyof TFormValidateVal['fields']\n ? TFormValidateVal['fields'][TName]\n : undefined\n : undefined\n : never)\n | ([TValidateOrFn] extends [FieldValidateAsyncFn<any, any, any>]\n ? Awaited<ReturnType<TValidateOrFn>>\n : [TValidateOrFn] extends [StandardSchemaV1<any, any>]\n ? // TODO: Check if `disableErrorFlat` is enabled, if so, return StandardSchemaV1Issue[][]\n StandardSchemaV1Issue[]\n : undefined)\n\n/**\n * @private\n */\nexport type FieldListenerFn<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> = (props: {\n value: TData\n fieldApi: FieldApi<\n TParentData,\n TName,\n TData,\n // This is technically an edge-type; which we try to keep non-`any`, but in this case\n // It's referring to an inaccessible type from the field listener function inner types, so it's not a big deal\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n >\n}) => void\n\nexport interface FieldValidators<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName>,\n TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChangeAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnBlurAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnSubmitAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n> {\n /**\n * An optional function, that runs on the mount event of input.\n */\n onMount?: TOnMount\n /**\n * An optional function, that runs on the change event of input.\n *\n * @example z.string().min(1)\n */\n onChange?: TOnChange\n /**\n * An optional property similar to `onChange` but async validation\n *\n * @example z.string().refine(async (val) => val.length > 3, { message: 'Testing 123' })\n */\n onChangeAsync?: TOnChangeAsync\n /**\n * An optional number to represent how long the `onChangeAsync` should wait before running\n *\n * If set to a number larger than 0, will debounce the async validation event by this length of time in milliseconds\n */\n onChangeAsyncDebounceMs?: number\n /**\n * An optional list of field names that should trigger this field's `onChange` and `onChangeAsync` events when its value changes\n */\n onChangeListenTo?: DeepKeys<TParentData>[]\n /**\n * An optional function, that runs on the blur event of input.\n *\n * @example z.string().min(1)\n */\n onBlur?: TOnBlur\n /**\n * An optional property similar to `onBlur` but async validation.\n *\n * @example z.string().refine(async (val) => val.length > 3, { message: 'Testing 123' })\n */\n onBlurAsync?: TOnBlurAsync\n\n /**\n * An optional number to represent how long the `onBlurAsync` should wait before running\n *\n * If set to a number larger than 0, will debounce the async validation event by this length of time in milliseconds\n */\n onBlurAsyncDebounceMs?: number\n /**\n * An optional list of field names that should trigger this field's `onBlur` and `onBlurAsync` events when its value changes\n */\n onBlurListenTo?: DeepKeys<TParentData>[]\n /**\n * An optional function, that runs on the submit event of form.\n *\n * @example z.string().min(1)\n */\n onSubmit?: TOnSubmit\n /**\n * An optional property similar to `onSubmit` but async validation.\n *\n * @example z.string().refine(async (val) => val.length > 3, { message: 'Testing 123' })\n */\n onSubmitAsync?: TOnSubmitAsync\n}\n\nexport interface FieldListeners<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> {\n onChange?: FieldListenerFn<TParentData, TName, TData>\n onChangeDebounceMs?: number\n onBlur?: FieldListenerFn<TParentData, TName, TData>\n onBlurDebounceMs?: number\n onMount?: FieldListenerFn<TParentData, TName, TData>\n onSubmit?: FieldListenerFn<TParentData, TName, TData>\n}\n\n/**\n * An object type representing the options for a field in a form.\n */\nexport interface FieldOptions<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName>,\n TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChangeAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnBlurAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnSubmitAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n> {\n /**\n * The field name. The type will be `DeepKeys<TParentData>` to ensure your name is a deep key of the parent dataset.\n */\n name: TName\n /**\n * An optional default value for the field.\n */\n defaultValue?: NoInfer<TData>\n /**\n * The default time to debounce async validation if there is not a more specific debounce time passed.\n */\n asyncDebounceMs?: number\n /**\n * If `true`, always run async validation, even if there are errors emitted during synchronous validation.\n */\n asyncAlways?: boolean\n /**\n * A list of validators to pass to the field\n */\n validators?: FieldValidators<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync\n >\n /**\n * An optional object with default metadata for the field.\n */\n defaultMeta?: Partial<\n FieldMeta<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n >\n >\n /**\n * A list of listeners which attach to the corresponding events\n */\n listeners?: FieldListeners<TParentData, TName, TData>\n /**\n * Disable the `flat(1)` operation on `field.errors`. This is useful if you want to keep the error structure as is. Not suggested for most use-cases.\n */\n disableErrorFlat?: boolean\n}\n\n/**\n * An object type representing the required options for the FieldApi class.\n */\nexport interface FieldApiOptions<\n in out TParentData,\n in out TName extends DeepKeys<TParentData>,\n in out TData extends DeepValue<TParentData, TName>,\n in out TOnMount extends\n | undefined\n | FieldValidateOrFn<TParentData, TName, TData>,\n in out TOnChange extends\n | undefined\n | FieldValidateOrFn<TParentData, TName, TData>,\n in out TOnChangeAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n in out TOnBlur extends\n | undefined\n | FieldValidateOrFn<TParentData, TName, TData>,\n in out TOnBlurAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n in out TOnSubmit extends\n | undefined\n | FieldValidateOrFn<TParentData, TName, TData>,\n in out TOnSubmitAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n in out TFormOnMount extends undefined | FormValidateOrFn<TParentData>,\n in out TFormOnChange extends undefined | FormValidateOrFn<TParentData>,\n in out TFormOnChangeAsync extends\n | undefined\n | FormAsyncValidateOrFn<TParentData>,\n in out TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,\n in out TFormOnBlurAsync extends\n | undefined\n | FormAsyncValidateOrFn<TParentData>,\n in out TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,\n in out TFormOnSubmitAsync extends\n | undefined\n | FormAsyncValidateOrFn<TParentData>,\n in out TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>,\n in out TParentSubmitMeta,\n> extends FieldOptions<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync\n > {\n form: FormApi<\n TParentData,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnServer,\n TParentSubmitMeta\n >\n}\n\nexport type FieldMetaBase<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName>,\n TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChangeAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnBlurAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnSubmitAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TFormOnMount extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChange extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,\n TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,\n TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n> = {\n /**\n * A flag indicating whether the field has been touched.\n */\n isTouched: boolean\n /**\n * A flag indicating whether the field has been blurred.\n */\n isBlurred: boolean\n /**\n * A flag that is `true` if the field's value has been modified by the user. Opposite of `isPristine`.\n */\n isDirty: boolean\n /**\n * A map of errors related to the field value.\n */\n errorMap: ValidationErrorMap<\n UnwrapFieldValidateOrFn<TName, TOnMount, TFormOnMount>,\n UnwrapFieldValidateOrFn<TName, TOnChange, TFormOnChange>,\n UnwrapFieldAsyncValidateOrFn<TName, TOnChangeAsync, TFormOnChangeAsync>,\n UnwrapFieldValidateOrFn<TName, TOnBlur, TFormOnBlur>,\n UnwrapFieldAsyncValidateOrFn<TName, TOnBlurAsync, TFormOnBlurAsync>,\n UnwrapFieldValidateOrFn<TName, TOnSubmit, TFormOnSubmit>,\n UnwrapFieldAsyncValidateOrFn<TName, TOnSubmitAsync, TFormOnSubmitAsync>\n >\n /**\n * A flag indicating whether the field is currently being validated.\n */\n isValidating: boolean\n}\n\nexport type AnyFieldMetaBase = FieldMetaBase<\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n>\n\nexport type FieldMetaDerived<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName>,\n TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChangeAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnBlurAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnSubmitAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TFormOnMount extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChange extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,\n TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,\n TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n> = {\n /**\n * An array of errors related to the field value.\n */\n errors: Array<\n | UnwrapOneLevelOfArray<\n UnwrapFieldValidateOrFn<TName, TOnMount, TFormOnMount>\n >\n | UnwrapOneLevelOfArray<\n UnwrapFieldValidateOrFn<TName, TOnChange, TFormOnChange>\n >\n | UnwrapOneLevelOfArray<\n UnwrapFieldAsyncValidateOrFn<TName, TOnChangeAsync, TFormOnChangeAsync>\n >\n | UnwrapOneLevelOfArray<\n UnwrapFieldValidateOrFn<TName, TOnBlur, TFormOnBlur>\n >\n | UnwrapOneLevelOfArray<\n UnwrapFieldAsyncValidateOrFn<TName, TOnBlurAsync, TFormOnBlurAsync>\n >\n | UnwrapOneLevelOfArray<\n UnwrapFieldValidateOrFn<TName, TOnSubmit, TFormOnSubmit>\n >\n | UnwrapOneLevelOfArray<\n UnwrapFieldAsyncValidateOrFn<TName, TOnSubmitAsync, TFormOnSubmitAsync>\n >\n >\n /**\n * A flag that is `true` if the field's value has not been modified by the user. Opposite of `isDirty`.\n */\n isPristine: boolean\n}\n\nexport type AnyFieldMetaDerived = FieldMetaDerived<\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n>\n\n/**\n * An object type representing the metadata of a field in a form.\n */\nexport type FieldMeta<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName>,\n TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChangeAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnBlurAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnSubmitAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TFormOnMount extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChange extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,\n TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,\n TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n> = FieldMetaBase<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync\n> &\n FieldMetaDerived<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync\n >\n\nexport type AnyFieldMeta = FieldMeta<\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n>\n\n/**\n * An object type representing the state of a field.\n */\nexport type FieldState<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName>,\n TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChangeAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnBlurAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnSubmitAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TFormOnMount extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChange extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,\n TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,\n TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n> = {\n /**\n * The current value of the field.\n */\n value: TData\n /**\n * The current metadata of the field.\n */\n meta: FieldMeta<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync\n >\n}\n\n/**\n * @public\n *\n * A type representing the Field API with all generics set to `any` for convenience.\n */\nexport type AnyFieldApi = FieldApi<\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n>\n\n/**\n * A class representing the API for managing a form field.\n *\n * Normally, you will not need to create a new `FieldApi` instance directly.\n * Instead, you will use a framework hook/function like `useField` or `createField`\n * to create a new instance for you that uses your framework's reactivity model.\n * However, if you need to create a new instance manually, you can do so by calling\n * the `new FieldApi` constructor.\n */\nexport class FieldApi<\n in out TParentData,\n in out TName extends DeepKeys<TParentData>,\n in out TData extends DeepValue<TParentData, TName>,\n in out TOnMount extends\n | undefined\n | FieldValidateOrFn<TParentData, TName, TData>,\n in out TOnChange extends\n | undefined\n | FieldValidateOrFn<TParentData, TName, TData>,\n in out TOnChangeAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n in out TOnBlur extends\n | undefined\n | FieldValidateOrFn<TParentData, TName, TData>,\n in out TOnBlurAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n in out TOnSubmit extends\n | undefined\n | FieldValidateOrFn<TParentData, TName, TData>,\n in out TOnSubmitAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n in out TFormOnMount extends undefined | FormValidateOrFn<TParentData>,\n in out TFormOnChange extends undefined | FormValidateOrFn<TParentData>,\n in out TFormOnChangeAsync extends\n | undefined\n | FormAsyncValidateOrFn<TParentData>,\n in out TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,\n in out TFormOnBlurAsync extends\n | undefined\n | FormAsyncValidateOrFn<TParentData>,\n in out TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,\n in out TFormOnSubmitAsync extends\n | undefined\n | FormAsyncValidateOrFn<TParentData>,\n in out TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>,\n in out TParentSubmitMeta,\n> {\n /**\n * A reference to the form API instance.\n */\n form: FieldApiOptions<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnServer,\n TParentSubmitMeta\n >['form']\n /**\n * The field name.\n */\n name!: DeepKeys<TParentData>\n /**\n * The field options.\n */\n options: FieldApiOptions<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnServer,\n TParentSubmitMeta\n > = {} as any\n /**\n * The field state store.\n */\n store!: Derived<\n FieldState<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync\n >\n >\n /**\n * The current field state.\n */\n get state() {\n return this.store.state\n }\n timeoutIds: {\n validations: Record<ValidationCause, ReturnType<typeof setTimeout> | null>\n listeners: Record<ListenerCause, ReturnType<typeof setTimeout> | null>\n }\n\n /**\n * Initializes a new `FieldApi` instance.\n */\n constructor(\n opts: FieldApiOptions<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnServer,\n TParentSubmitMeta\n >,\n ) {\n this.form = opts.form as never\n this.name = opts.name as never\n this.timeoutIds = {\n validations: {} as Record<ValidationCause, never>,\n listeners: {} as Record<ListenerCause, never>,\n }\n\n this.store = new Derived({\n deps: [this.form.store],\n fn: () => {\n const value = this.form.getFieldValue(this.name)\n const meta = this.form.getFieldMeta(this.name) ?? {\n ...defaultFieldMeta,\n ...opts.defaultMeta,\n }\n\n return {\n value,\n meta,\n } as FieldState<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync\n >\n },\n })\n\n this.options = opts as never\n }\n\n /**\n * @private\n */\n runValidator<\n TValue extends TStandardSchemaValidatorValue<TData> & {\n fieldApi: AnyFieldApi\n },\n TType extends 'validate' | 'validateAsync',\n >(props: {\n validate: TType extends 'validate'\n ? FieldValidateOrFn<any, any, any>\n : FieldAsyncValidateOrFn<any, any, any>\n value: TValue\n type: TType\n // When `api` is 'field', the return type cannot be `FormValidationError`\n }): unknown {\n if (isStandardSchemaValidator(props.validate)) {\n return standardSchemaValidators[props.type](\n props.value,\n props.validate,\n ) as never\n }\n\n return (props.validate as FieldValidateFn<any, any>)(props.value) as never\n }\n\n /**\n * Mounts the field instance to the form.\n */\n mount = () => {\n const cleanup = this.store.mount()\n\n if ((this.options.defaultValue as unknown) !== undefined) {\n this.form.setFieldValue(this.name, this.options.defaultValue as never, {\n dontUpdateMeta: true,\n })\n }\n\n const info = this.getInfo()\n info.instance = this as never\n\n this.update(this.options as never)\n const { onMount } = this.options.validators || {}\n\n if (onMount) {\n const error = this.runValidator({\n validate: onMount,\n value: {\n value: this.state.value,\n fieldApi: this,\n validationSource: 'field',\n },\n type: 'validate',\n })\n if (error) {\n this.setMeta(\n (prev) =>\n ({\n ...prev,\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n errorMap: { ...prev?.errorMap, onMount: error },\n }) as never,\n )\n }\n }\n\n this.options.listeners?.onMount?.({\n value: this.state.value,\n fieldApi: this,\n })\n\n return cleanup\n }\n\n /**\n * Updates the field instance with new options.\n */\n update = (\n opts: FieldApiOptions<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnServer,\n TParentSubmitMeta\n >,\n ) => {\n this.options = opts as never\n\n const nameHasChanged = this.name !== opts.name\n this.name = opts.name\n\n // Default Value\n if ((this.state.value as unknown) === undefined) {\n const formDefault = getBy(opts.form.options.defaultValues, opts.name)\n\n const defaultValue = (opts.defaultValue as unknown) ?? formDefault\n\n // The name is dynamic in array fields. It changes when the user performs operations like removing or reordering.\n // In this case, we don't want to force a default value if the store managed to find an existing value.\n if (nameHasChanged) {\n this.setValue((val) => (val as unknown) || defaultValue, {\n dontUpdateMeta: true,\n })\n } else if (defaultValue !== undefined) {\n this.setValue(defaultValue as never, {\n dontUpdateMeta: true,\n })\n }\n }\n\n // Default Meta\n if (this.form.getFieldMeta(this.name) === undefined) {\n this.setMeta(this.state.meta)\n }\n }\n\n /**\n * Gets the current field value.\n * @deprecated Use `field.state.value` instead.\n */\n getValue = (): TData => {\n return this.form.getFieldValue(this.name) as TData\n }\n\n /**\n * Sets the field value and run the `change` validator.\n */\n setValue = (updater: Updater<TData>, options?: UpdateMetaOptions) => {\n this.form.setFieldValue(this.name, updater as never, options)\n\n this.triggerOnChangeListener()\n\n this.validate('change')\n }\n\n getMeta = () => this.store.state.meta\n\n /**\n * Sets the field metadata.\n */\n setMeta = (\n updater: Updater<\n FieldMeta<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync\n >\n >,\n ) => this.form.setFieldMeta(this.name, updater)\n\n /**\n * Gets the field information object.\n */\n getInfo = () => this.form.getFieldInfo(this.name)\n\n /**\n * Pushes a new value to the field.\n */\n pushValue = (\n value: TData extends any[] ? TData[number] : never,\n opts?: UpdateMetaOptions,\n ) => {\n this.form.pushFieldValue(this.name, value as any, opts)\n\n this.triggerOnChangeListener()\n }\n\n /**\n * Inserts a value at the specified index, shifting the subsequent values to the right.\n */\n insertValue = (\n index: number,\n value: TData extends any[] ? TData[number] : never,\n opts?: UpdateMetaOptions,\n ) => {\n this.form.insertFieldValue(this.name, index, value as any, opts)\n\n this.triggerOnChangeListener()\n }\n\n /**\n * Replaces a value at the specified index.\n */\n replaceValue = (\n index: number,\n value: TData extends any[] ? TData[number] : never,\n opts?: UpdateMetaOptions,\n ) => {\n this.form.replaceFieldValue(this.name, index, value as any, opts)\n\n this.triggerOnChangeListener()\n }\n\n /**\n * Removes a value at the specified index.\n */\n removeValue = (index: number, opts?: UpdateMetaOptions) => {\n this.form.removeFieldValue(this.name, index, opts)\n\n this.triggerOnChangeListener()\n }\n\n /**\n * Swaps the values at the specified indices.\n */\n swapValues = (aIndex: number, bIndex: number, opts?: UpdateMetaOptions) => {\n this.form.swapFieldValues(this.name, aIndex, bIndex, opts)\n\n this.triggerOnChangeListener()\n }\n\n /**\n * Moves the value at the first specified index to the second specified index.\n */\n moveValue = (aIndex: number, bIndex: number, opts?: UpdateMetaOptions) => {\n this.form.moveFieldValues(this.name, aIndex, bIndex, opts)\n\n this.triggerOnChangeListener()\n }\n\n /**\n * @private\n */\n getLinkedFields = (cause: ValidationCause) => {\n const fields = Object.values(this.form.fieldInfo) as FieldInfo<any>[]\n\n const linkedFields: AnyFieldApi[] = []\n for (const field of fields) {\n if (!field.instance) continue\n const { onChangeListenTo, onBlurListenTo } =\n field.instance.options.validators || {}\n if (cause === 'change' && onChangeListenTo?.includes(this.name)) {\n linkedFields.push(field.instance)\n }\n if (cause === 'blur' && onBlurListenTo?.includes(this.name as string)) {\n linkedFields.push(field.instance)\n }\n }\n\n return linkedFields\n }\n\n /**\n * @private\n */\n validateSync = (\n cause: ValidationCause,\n errorFromForm: ValidationErrorMap,\n ) => {\n const validates = getSyncValidatorArray(cause, this.options)\n\n const linkedFields = this.getLinkedFields(cause)\n const linkedFieldValidates = linkedFields.reduce(\n (acc, field) => {\n const fieldValidates = getSyncValidatorArray(cause, field.options)\n fieldValidates.forEach((validate) => {\n ;(validate as any).field = field\n })\n return acc.concat(fieldValidates as never)\n },\n [] as Array<\n SyncValidator<any> & {\n field: AnyFieldApi\n }\n >,\n )\n\n // Needs type cast as eslint errantly believes this is always falsy\n let hasErrored = false as boolean\n\n batch(() => {\n const validateFieldFn = (\n field: AnyFieldApi,\n validateObj: SyncValidator<any>,\n ) => {\n const errorMapKey = getErrorMapKey(validateObj.cause)\n\n const error =\n /*\n If `validateObj.validate` is `undefined`, then the field doesn't have\n a validator for this event, but there still could be an error that\n needs to be cleaned up related to the current event left by the\n form's validator.\n */\n validateObj.validate\n ? normalizeError(\n field.runValidator({\n validate: validateObj.validate,\n value: {\n value: field.store.state.value,\n validationSource: 'field',\n fieldApi: field,\n },\n type: 'validate',\n }),\n )\n : errorFromForm[errorMapKey]\n\n if (field.state.meta.errorMap[errorMapKey] !== error) {\n field.setMeta((prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n [getErrorMapKey(validateObj.cause)]:\n // Prefer the error message from the field validators if they exist\n error ? error : errorFromForm[errorMapKey],\n },\n }))\n }\n if (error || errorFromForm[errorMapKey]) {\n hasErrored = true\n }\n }\n\n for (const validateObj of validates) {\n validateFieldFn(this, validateObj)\n }\n for (const fieldValitateObj of linkedFieldValidates) {\n if (!fieldValitateObj.validate) continue\n validateFieldFn(fieldValitateObj.field, fieldValitateObj)\n }\n })\n\n /**\n * when we have an error for onSubmit in the state, we want\n * to clear the error as soon as the user enters a valid value in the field\n */\n const submitErrKey = getErrorMapKey('submit')\n\n if (\n this.state.meta.errorMap[submitErrKey] &&\n cause !== 'submit' &&\n !hasErrored\n ) {\n this.setMeta((prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n [submitErrKey]: undefined,\n },\n }))\n }\n\n return { hasErrored }\n }\n\n /**\n * @private\n */\n validateAsync = async (\n cause: ValidationCause,\n formValidationResultPromise: Promise<\n FieldErrorMapFromValidator<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync\n >\n >,\n ) => {\n const validates = getAsyncValidatorArray(cause, this.options)\n\n // Get the field-specific error messages that are coming from the form's validator\n const asyncFormValidationResults = await formValidationResultPromise\n\n const linkedFields = this.getLinkedFields(cause)\n const linkedFieldValidates = linkedFields.reduce(\n (acc, field) => {\n const fieldValidates = getAsyncValidatorArray(cause, field.options)\n fieldValidates.forEach((validate) => {\n ;(validate as any).field = field\n })\n return acc.concat(fieldValidates as never)\n },\n [] as Array<\n AsyncValidator<any> & {\n field: AnyFieldApi\n }\n >,\n )\n\n if (!this.state.meta.isValidating) {\n this.setMeta((prev) => ({ ...prev, isValidating: true }))\n }\n\n for (const linkedField of linkedFields) {\n linkedField.setMeta((prev) => ({ ...prev, isValidating: true }))\n }\n\n /**\n * We have to use a for loop and generate our promises this way, otherwise it won't be sync\n * when there are no validators needed to be run\n */\n const validatesPromises: Promise<ValidationError | undefined>[] = []\n const linkedPromises: Promise<ValidationError | undefined>[] = []\n\n const validateFieldAsyncFn = (\n field: AnyFieldApi,\n validateObj: AsyncValidator<any>,\n promises: Promise<ValidationError | undefined>[],\n ) => {\n const errorMapKey = getErrorMapKey(validateObj.cause)\n const fieldValidatorMeta = field.getInfo().validationMetaMap[errorMapKey]\n\n fieldValidatorMeta?.lastAbortController.abort()\n const controller = new AbortController()\n\n this.getInfo().validationMetaMap[errorMapKey] = {\n lastAbortController: controller,\n }\n\n promises.push(\n new Promise<ValidationError | undefined>(async (resolve) => {\n let rawError!: ValidationError | undefined\n try {\n rawError = await new Promise((rawResolve, rawReject) => {\n if (this.timeoutIds.validations[validateObj.cause]) {\n clearTimeout(this.timeoutIds.validations[validateObj.cause]!)\n }\n\n this.timeoutIds.validations[validateObj.cause] = setTimeout(\n async () => {\n if (controller.signal.aborted) return rawResolve(undefined)\n try {\n rawResolve(\n await this.runValidator({\n validate: validateObj.validate,\n value: {\n value: field.store.state.value,\n fieldApi: field,\n signal: controller.signal,\n validationSource: 'field',\n },\n type: 'validateAsync',\n }),\n )\n } catch (e) {\n rawReject(e)\n }\n },\n validateObj.debounceMs,\n )\n })\n } catch (e: unknown) {\n rawError = e as ValidationError\n }\n if (controller.signal.aborted) return resolve(undefined)\n const error = normalizeError(rawError)\n const fieldErrorFromForm =\n asyncFormValidationResults[this.name]?.[errorMapKey]\n const fieldError = error || fieldErrorFromForm\n field.setMeta((prev) => {\n return {\n ...prev,\n errorMap: {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n ...prev?.errorMap,\n [errorMapKey]: fieldError,\n },\n }\n })\n\n resolve(fieldError)\n }),\n )\n }\n\n // TODO: Dedupe this logic to reduce bundle size\n for (const validateObj of validates) {\n if (!validateObj.validate) continue\n validateFieldAsyncFn(this, validateObj, validatesPromises)\n }\n for (const fieldValitateObj of linkedFieldValidates) {\n if (!fieldValitateObj.validate) continue\n validateFieldAsyncFn(\n fieldValitateObj.field,\n fieldValitateObj,\n linkedPromises,\n )\n }\n\n let results: ValidationError[] = []\n if (validatesPromises.length || linkedPromises.length) {\n results = await Promise.all(validatesPromises)\n await Promise.all(linkedPromises)\n }\n\n this.setMeta((prev) => ({ ...prev, isValidating: false }))\n\n for (const linkedField of linkedFields) {\n linkedField.setMeta((prev) => ({ ...prev, isValidating: false }))\n }\n\n return results.filter(Boolean)\n }\n\n /**\n * Validates the field value.\n */\n validate = (\n cause: ValidationCause,\n opts?: { skipFormValidation?: boolean },\n ): ValidationError[] | Promise<ValidationError[]> => {\n // If the field is pristine, do not validate\n if (!this.state.meta.isTouched) return []\n\n // Attempt to sync validate first\n const { fieldsErrorMap } = opts?.skipFormValidation\n ? { fieldsErrorMap: {} as never }\n : this.form.validateSync(cause)\n const { hasErrored } = this.validateSync(\n cause,\n fieldsErrorMap[this.name] ?? {},\n )\n\n if (hasErrored && !this.options.asyncAlways) {\n this.getInfo().validationMetaMap[\n getErrorMapKey(cause)\n ]?.lastAbortController.abort()\n return this.state.meta.errors\n }\n\n // No error? Attempt async validation\n const formValidationResultPromise = opts?.skipFormValidation\n ? Promise.resolve({})\n : this.form.validateAsync(cause)\n return this.validateAsync(cause, formValidationResultPromise)\n }\n\n /**\n * Handles the change event.\n */\n handleChange = (updater: Updater<TData>) => {\n this.setValue(updater)\n }\n\n /**\n * Handles the blur event.\n */\n handleBlur = () => {\n const prevTouched = this.state.meta.isTouched\n if (!prevTouched) {\n this.setMeta((prev) => ({ ...prev, isTouched: true }))\n this.validate('change')\n }\n if (!this.state.meta.isBlurred) {\n this.setMeta((prev) => ({ ...prev, isBlurred: true }))\n }\n this.validate('blur')\n\n this.triggerOnBlurListener()\n }\n\n /**\n * Updates the field's errorMap\n */\n setErrorMap(errorMap: ValidationErrorMap) {\n this.setMeta(\n (prev) =>\n ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n ...errorMap,\n },\n }) as never,\n )\n }\n\n private triggerOnBlurListener() {\n const debounceMs = this.options.listeners?.onBlurDebounceMs\n\n if (debounceMs && debounceMs > 0) {\n if (this.timeoutIds.listeners.blur) {\n clearTimeout(this.timeoutIds.listeners.blur)\n }\n\n this.timeoutIds.listeners.blur = setTimeout(() => {\n this.options.listeners?.onBlur?.({\n value: this.state.value,\n fieldApi: this,\n })\n }, debounceMs)\n } else {\n this.options.listeners?.onBlur?.({\n value: this.state.value,\n fieldApi: this,\n })\n }\n }\n\n private triggerOnChangeListener() {\n const debounceMs = this.options.listeners?.onChangeDebounceMs\n\n if (debounceMs && debounceMs > 0) {\n if (this.timeoutIds.listeners.change) {\n clearTimeout(this.timeoutIds.listeners.change)\n }\n\n this.timeoutIds.listeners.change = setTimeout(() => {\n this.options.listeners?.onChange?.({\n value: this.state.value,\n fieldApi: this,\n })\n }, debounceMs)\n } else {\n this.options.listeners?.onChange?.({\n value: this.state.value,\n fieldApi: this,\n })\n }\n }\n}\n\nfunction normalizeError(rawError?: ValidationError) {\n if (rawError) {\n return rawError\n }\n\n return undefined\n}\n\nfunction getErrorMapKey(cause: ValidationCause) {\n switch (cause) {\n case 'submit':\n return 'onSubmit'\n case 'blur':\n return 'onBlur'\n case 'mount':\n return 'onMount'\n case 'server':\n return 'onServer'\n case 'change':\n default:\n return 'onChange'\n }\n}\n"],"names":["opts","getBy","getSyncValidatorArray","batch","getAsyncValidatorArray","Derived","defaultFieldMeta","isStandardSchemaValidator","standardSchemaValidators","_b","_a"],"mappings":";;;;;;AA40BO,MAAM,SAwCX;AAAA;AAAA;AAAA;AAAA,EA2FA,YACE,MAqBA;AAjFF,SAAA,UAoBI,CAAC;AAuIL,SAAA,QAAQ,MAAM;;AACN,YAAA,UAAU,KAAK,MAAM,MAAM;AAE5B,UAAA,KAAK,QAAQ,iBAA6B,QAAW;AACxD,aAAK,KAAK,cAAc,KAAK,MAAM,KAAK,QAAQ,cAAuB;AAAA,UACrE,gBAAgB;AAAA,QAAA,CACjB;AAAA,MAAA;AAGG,YAAA,OAAO,KAAK,QAAQ;AAC1B,WAAK,WAAW;AAEX,WAAA,OAAO,KAAK,OAAgB;AACjC,YAAM,EAAE,QAAQ,IAAI,KAAK,QAAQ,cAAc,CAAC;AAEhD,UAAI,SAAS;AACL,cAAA,QAAQ,KAAK,aAAa;AAAA,UAC9B,UAAU;AAAA,UACV,OAAO;AAAA,YACL,OAAO,KAAK,MAAM;AAAA,YAClB,UAAU;AAAA,YACV,kBAAkB;AAAA,UACpB;AAAA,UACA,MAAM;AAAA,QAAA,CACP;AACD,YAAI,OAAO;AACJ,eAAA;AAAA,YACH,CAAC,UACE;AAAA,cACC,GAAG;AAAA;AAAA,cAEH,UAAU,EAAE,GAAG,6BAAM,UAAU,SAAS,MAAM;AAAA,YAChD;AAAA,UACJ;AAAA,QAAA;AAAA,MACF;AAGG,uBAAA,QAAQ,cAAR,mBAAmB,YAAnB,4BAA6B;AAAA,QAChC,OAAO,KAAK,MAAM;AAAA,QAClB,UAAU;AAAA,MAAA;AAGL,aAAA;AAAA,IACT;AAKA,SAAA,SAAS,CACPA,UAqBG;AACH,WAAK,UAAUA;AAET,YAAA,iBAAiB,KAAK,SAASA,MAAK;AAC1C,WAAK,OAAOA,MAAK;AAGZ,UAAA,KAAK,MAAM,UAAsB,QAAW;AAC/C,cAAM,cAAcC,MAAM,MAAAD,MAAK,KAAK,QAAQ,eAAeA,MAAK,IAAI;AAE9D,cAAA,eAAgBA,MAAK,gBAA4B;AAIvD,YAAI,gBAAgB;AAClB,eAAK,SAAS,CAAC,QAAS,OAAmB,cAAc;AAAA,YACvD,gBAAgB;AAAA,UAAA,CACjB;AAAA,QAAA,WACQ,iBAAiB,QAAW;AACrC,eAAK,SAAS,cAAuB;AAAA,YACnC,gBAAgB;AAAA,UAAA,CACjB;AAAA,QAAA;AAAA,MACH;AAIF,UAAI,KAAK,KAAK,aAAa,KAAK,IAAI,MAAM,QAAW;AAC9C,aAAA,QAAQ,KAAK,MAAM,IAAI;AAAA,MAAA;AAAA,IAEhC;AAMA,SAAA,WAAW,MAAa;AACtB,aAAO,KAAK,KAAK,cAAc,KAAK,IAAI;AAAA,IAC1C;AAKW,SAAA,WAAA,CAAC,SAAyB,YAAgC;AACnE,WAAK,KAAK,cAAc,KAAK,MAAM,SAAkB,OAAO;AAE5D,WAAK,wBAAwB;AAE7B,WAAK,SAAS,QAAQ;AAAA,IACxB;AAEU,SAAA,UAAA,MAAM,KAAK,MAAM,MAAM;AAKjC,SAAA,UAAU,CACR,YAqBG,KAAK,KAAK,aAAa,KAAK,MAAM,OAAO;AAK9C,SAAA,UAAU,MAAM,KAAK,KAAK,aAAa,KAAK,IAAI;AAKpC,SAAA,YAAA,CACV,OACAA,UACG;AACH,WAAK,KAAK,eAAe,KAAK,MAAM,OAAcA,KAAI;AAEtD,WAAK,wBAAwB;AAAA,IAC/B;AAKc,SAAA,cAAA,CACZ,OACA,OACAA,UACG;AACH,WAAK,KAAK,iBAAiB,KAAK,MAAM,OAAO,OAAcA,KAAI;AAE/D,WAAK,wBAAwB;AAAA,IAC/B;AAKe,SAAA,eAAA,CACb,OACA,OACAA,UACG;AACH,WAAK,KAAK,kBAAkB,KAAK,MAAM,OAAO,OAAcA,KAAI;AAEhE,WAAK,wBAAwB;AAAA,IAC/B;AAKc,SAAA,cAAA,CAAC,OAAeA,UAA6B;AACzD,WAAK,KAAK,iBAAiB,KAAK,MAAM,OAAOA,KAAI;AAEjD,WAAK,wBAAwB;AAAA,IAC/B;AAKa,SAAA,aAAA,CAAC,QAAgB,QAAgBA,UAA6B;AACzE,WAAK,KAAK,gBAAgB,KAAK,MAAM,QAAQ,QAAQA,KAAI;AAEzD,WAAK,wBAAwB;AAAA,IAC/B;AAKY,SAAA,YAAA,CAAC,QAAgB,QAAgBA,UAA6B;AACxE,WAAK,KAAK,gBAAgB,KAAK,MAAM,QAAQ,QAAQA,KAAI;AAEzD,WAAK,wBAAwB;AAAA,IAC/B;AAKA,SAAA,kBAAkB,CAAC,UAA2B;AAC5C,YAAM,SAAS,OAAO,OAAO,KAAK,KAAK,SAAS;AAEhD,YAAM,eAA8B,CAAC;AACrC,iBAAW,SAAS,QAAQ;AACtB,YAAA,CAAC,MAAM,SAAU;AACf,cAAA,EAAE,kBAAkB,eAAe,IACvC,MAAM,SAAS,QAAQ,cAAc,CAAC;AACxC,YAAI,UAAU,aAAY,qDAAkB,SAAS,KAAK,QAAO;AAClD,uBAAA,KAAK,MAAM,QAAQ;AAAA,QAAA;AAElC,YAAI,UAAU,WAAU,iDAAgB,SAAS,KAAK,QAAiB;AACxD,uBAAA,KAAK,MAAM,QAAQ;AAAA,QAAA;AAAA,MAClC;AAGK,aAAA;AAAA,IACT;AAKe,SAAA,eAAA,CACb,OACA,kBACG;AACH,YAAM,YAAYE,MAAA,sBAAsB,OAAO,KAAK,OAAO;AAErD,YAAA,eAAe,KAAK,gBAAgB,KAAK;AAC/C,YAAM,uBAAuB,aAAa;AAAA,QACxC,CAAC,KAAK,UAAU;AACd,gBAAM,iBAAiBA,MAAA,sBAAsB,OAAO,MAAM,OAAO;AAClD,yBAAA,QAAQ,CAAC,aAAa;AACjC,qBAAiB,QAAQ;AAAA,UAAA,CAC5B;AACM,iBAAA,IAAI,OAAO,cAAuB;AAAA,QAC3C;AAAA,QACA,CAAA;AAAA,MAKF;AAGA,UAAI,aAAa;AAEjBC,YAAAA,MAAM,MAAM;AACJ,cAAA,kBAAkB,CACtB,OACA,gBACG;AACG,gBAAA,cAAc,eAAe,YAAY,KAAK;AAE9C,gBAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAOJ,YAAY,WACR;AAAA,cACE,MAAM,aAAa;AAAA,gBACjB,UAAU,YAAY;AAAA,gBACtB,OAAO;AAAA,kBACL,OAAO,MAAM,MAAM,MAAM;AAAA,kBACzB,kBAAkB;AAAA,kBAClB,UAAU;AAAA,gBACZ;AAAA,gBACA,MAAM;AAAA,cACP,CAAA;AAAA,YACH,IACA,cAAc,WAAW;AAAA;AAE/B,cAAI,MAAM,MAAM,KAAK,SAAS,WAAW,MAAM,OAAO;AAC9C,kBAAA,QAAQ,CAAC,UAAU;AAAA,cACvB,GAAG;AAAA,cACH,UAAU;AAAA,gBACR,GAAG,KAAK;AAAA,gBACR,CAAC,eAAe,YAAY,KAAK,CAAC;AAAA;AAAA,kBAEhC,QAAQ,QAAQ,cAAc,WAAW;AAAA;AAAA,cAAA;AAAA,YAC7C,EACA;AAAA,UAAA;AAEA,cAAA,SAAS,cAAc,WAAW,GAAG;AAC1B,yBAAA;AAAA,UAAA;AAAA,QAEjB;AAEA,mBAAW,eAAe,WAAW;AACnC,0BAAgB,MAAM,WAAW;AAAA,QAAA;AAEnC,mBAAW,oBAAoB,sBAAsB;AAC/C,cAAA,CAAC,iBAAiB,SAAU;AAChB,0BAAA,iBAAiB,OAAO,gBAAgB;AAAA,QAAA;AAAA,MAC1D,CACD;AAMK,YAAA,eAAe,eAAe,QAAQ;AAG1C,UAAA,KAAK,MAAM,KAAK,SAAS,YAAY,KACrC,UAAU,YACV,CAAC,YACD;AACK,aAAA,QAAQ,CAAC,UAAU;AAAA,UACtB,GAAG;AAAA,UACH,UAAU;AAAA,YACR,GAAG,KAAK;AAAA,YACR,CAAC,YAAY,GAAG;AAAA,UAAA;AAAA,QAClB,EACA;AAAA,MAAA;AAGJ,aAAO,EAAE,WAAW;AAAA,IACtB;AAKgB,SAAA,gBAAA,OACd,OACA,gCAcG;AACH,YAAM,YAAYC,MAAA,uBAAuB,OAAO,KAAK,OAAO;AAG5D,YAAM,6BAA6B,MAAM;AAEnC,YAAA,eAAe,KAAK,gBAAgB,KAAK;AAC/C,YAAM,uBAAuB,aAAa;AAAA,QACxC,CAAC,KAAK,UAAU;AACd,gBAAM,iBAAiBA,MAAA,uBAAuB,OAAO,MAAM,OAAO;AACnD,yBAAA,QAAQ,CAAC,aAAa;AACjC,qBAAiB,QAAQ;AAAA,UAAA,CAC5B;AACM,iBAAA,IAAI,OAAO,cAAuB;AAAA,QAC3C;AAAA,QACA,CAAA;AAAA,MAKF;AAEA,UAAI,CAAC,KAAK,MAAM,KAAK,cAAc;AAC5B,aAAA,QAAQ,CAAC,UAAU,EAAE,GAAG,MAAM,cAAc,OAAO;AAAA,MAAA;AAG1D,iBAAW,eAAe,cAAc;AAC1B,oBAAA,QAAQ,CAAC,UAAU,EAAE,GAAG,MAAM,cAAc,OAAO;AAAA,MAAA;AAOjE,YAAM,oBAA4D,CAAC;AACnE,YAAM,iBAAyD,CAAC;AAEhE,YAAM,uBAAuB,CAC3B,OACA,aACA,aACG;AACG,cAAA,cAAc,eAAe,YAAY,KAAK;AACpD,cAAM,qBAAqB,MAAM,QAAQ,EAAE,kBAAkB,WAAW;AAExE,iEAAoB,oBAAoB;AAClC,cAAA,aAAa,IAAI,gBAAgB;AAEvC,aAAK,QAAQ,EAAE,kBAAkB,WAAW,IAAI;AAAA,UAC9C,qBAAqB;AAAA,QACvB;AAES,iBAAA;AAAA,UACP,IAAI,QAAqC,OAAO,YAAY;;AACtD,gBAAA;AACA,gBAAA;AACF,yBAAW,MAAM,IAAI,QAAQ,CAAC,YAAY,cAAc;AACtD,oBAAI,KAAK,WAAW,YAAY,YAAY,KAAK,GAAG;AAClD,+BAAa,KAAK,WAAW,YAAY,YAAY,KAAK,CAAE;AAAA,gBAAA;AAG9D,qBAAK,WAAW,YAAY,YAAY,KAAK,IAAI;AAAA,kBAC/C,YAAY;AACV,wBAAI,WAAW,OAAO,QAAS,QAAO,WAAW,MAAS;AACtD,wBAAA;AACF;AAAA,wBACE,MAAM,KAAK,aAAa;AAAA,0BACtB,UAAU,YAAY;AAAA,0BACtB,OAAO;AAAA,4BACL,OAAO,MAAM,MAAM,MAAM;AAAA,4BACzB,UAAU;AAAA,4BACV,QAAQ,WAAW;AAAA,4BACnB,kBAAkB;AAAA,0BACpB;AAAA,0BACA,MAAM;AAAA,wBACP,CAAA;AAAA,sBACH;AAAA,6BACO,GAAG;AACV,gCAAU,CAAC;AAAA,oBAAA;AAAA,kBAEf;AAAA,kBACA,YAAY;AAAA,gBACd;AAAA,cAAA,CACD;AAAA,qBACM,GAAY;AACR,yBAAA;AAAA,YAAA;AAEb,gBAAI,WAAW,OAAO,QAAS,QAAO,QAAQ,MAAS;AACjD,kBAAA,QAAQ,eAAe,QAAQ;AACrC,kBAAM,sBACJ,gCAA2B,KAAK,IAAI,MAApC,mBAAwC;AAC1C,kBAAM,aAAa,SAAS;AACtB,kBAAA,QAAQ,CAAC,SAAS;AACf,qBAAA;AAAA,gBACL,GAAG;AAAA,gBACH,UAAU;AAAA;AAAA,kBAER,GAAG,6BAAM;AAAA,kBACT,CAAC,WAAW,GAAG;AAAA,gBAAA;AAAA,cAEnB;AAAA,YAAA,CACD;AAED,oBAAQ,UAAU;AAAA,UACnB,CAAA;AAAA,QACH;AAAA,MACF;AAGA,iBAAW,eAAe,WAAW;AAC/B,YAAA,CAAC,YAAY,SAAU;AACN,6BAAA,MAAM,aAAa,iBAAiB;AAAA,MAAA;AAE3D,iBAAW,oBAAoB,sBAAsB;AAC/C,YAAA,CAAC,iBAAiB,SAAU;AAChC;AAAA,UACE,iBAAiB;AAAA,UACjB;AAAA,UACA;AAAA,QACF;AAAA,MAAA;AAGF,UAAI,UAA6B,CAAC;AAC9B,UAAA,kBAAkB,UAAU,eAAe,QAAQ;AAC3C,kBAAA,MAAM,QAAQ,IAAI,iBAAiB;AACvC,cAAA,QAAQ,IAAI,cAAc;AAAA,MAAA;AAG7B,WAAA,QAAQ,CAAC,UAAU,EAAE,GAAG,MAAM,cAAc,QAAQ;AAEzD,iBAAW,eAAe,cAAc;AAC1B,oBAAA,QAAQ,CAAC,UAAU,EAAE,GAAG,MAAM,cAAc,QAAQ;AAAA,MAAA;AAG3D,aAAA,QAAQ,OAAO,OAAO;AAAA,IAC/B;AAKW,SAAA,WAAA,CACT,OACAJ,UACmD;;AAEnD,UAAI,CAAC,KAAK,MAAM,KAAK,kBAAkB,CAAC;AAGxC,YAAM,EAAE,eAAA,KAAmBA,SAAA,gBAAAA,MAAM,sBAC7B,EAAE,gBAAgB,CAAY,EAAA,IAC9B,KAAK,KAAK,aAAa,KAAK;AAC1B,YAAA,EAAE,eAAe,KAAK;AAAA,QAC1B;AAAA,QACA,eAAe,KAAK,IAAI,KAAK,CAAA;AAAA,MAC/B;AAEA,UAAI,cAAc,CAAC,KAAK,QAAQ,aAAa;AACtC,mBAAA,UAAU,kBACb,eAAe,KAAK,CACtB,MAFK,mBAEF,oBAAoB;AAChB,eAAA,KAAK,MAAM,KAAK;AAAA,MAAA;AAInB,YAAA,+BAA8BA,SAAA,gBAAAA,MAAM,sBACtC,QAAQ,QAAQ,CAAE,CAAA,IAClB,KAAK,KAAK,cAAc,KAAK;AAC1B,aAAA,KAAK,cAAc,OAAO,2BAA2B;AAAA,IAC9D;AAKA,SAAA,eAAe,CAAC,YAA4B;AAC1C,WAAK,SAAS,OAAO;AAAA,IACvB;AAKA,SAAA,aAAa,MAAM;AACX,YAAA,cAAc,KAAK,MAAM,KAAK;AACpC,UAAI,CAAC,aAAa;AACX,aAAA,QAAQ,CAAC,UAAU,EAAE,GAAG,MAAM,WAAW,OAAO;AACrD,aAAK,SAAS,QAAQ;AAAA,MAAA;AAExB,UAAI,CAAC,KAAK,MAAM,KAAK,WAAW;AACzB,aAAA,QAAQ,CAAC,UAAU,EAAE,GAAG,MAAM,WAAW,OAAO;AAAA,MAAA;AAEvD,WAAK,SAAS,MAAM;AAEpB,WAAK,sBAAsB;AAAA,IAC7B;AArnBE,SAAK,OAAO,KAAK;AACjB,SAAK,OAAO,KAAK;AACjB,SAAK,aAAa;AAAA,MAChB,aAAa,CAAC;AAAA,MACd,WAAW,CAAA;AAAA,IACb;AAEK,SAAA,QAAQ,IAAIK,cAAQ;AAAA,MACvB,MAAM,CAAC,KAAK,KAAK,KAAK;AAAA,MACtB,IAAI,MAAM;AACR,cAAM,QAAQ,KAAK,KAAK,cAAc,KAAK,IAAI;AAC/C,cAAM,OAAO,KAAK,KAAK,aAAa,KAAK,IAAI,KAAK;AAAA,UAChD,GAAGC,WAAA;AAAA,UACH,GAAG,KAAK;AAAA,QACV;AAEO,eAAA;AAAA,UACL;AAAA,UACA;AAAA,QACF;AAAA,MAAA;AAAA,IAmBF,CACD;AAED,SAAK,UAAU;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EA3EjB,IAAI,QAAQ;AACV,WAAO,KAAK,MAAM;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAgFpB,aAKE,OAOU;AACN,QAAAC,wBAAA,0BAA0B,MAAM,QAAQ,GAAG;AACtC,aAAAC,wBAAA,yBAAyB,MAAM,IAAI;AAAA,QACxC,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IAAA;AAGM,WAAA,MAAM,SAAuC,MAAM,KAAK;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAujBlE,YAAY,UAA8B;AACnC,SAAA;AAAA,MACH,CAAC,UACE;AAAA,QACC,GAAG;AAAA,QACH,UAAU;AAAA,UACR,GAAG,KAAK;AAAA,UACR,GAAG;AAAA,QAAA;AAAA,MAEP;AAAA,IACJ;AAAA,EAAA;AAAA,EAGM,wBAAwB;;AACxB,UAAA,cAAa,UAAK,QAAQ,cAAb,mBAAwB;AAEvC,QAAA,cAAc,aAAa,GAAG;AAC5B,UAAA,KAAK,WAAW,UAAU,MAAM;AACrB,qBAAA,KAAK,WAAW,UAAU,IAAI;AAAA,MAAA;AAG7C,WAAK,WAAW,UAAU,OAAO,WAAW,MAAM;;AAC3C,SAAAC,OAAAC,MAAA,KAAA,QAAQ,cAAR,gBAAAA,IAAmB,WAAnB,gBAAAD,IAAA,KAAAC,KAA4B;AAAA,UAC/B,OAAO,KAAK,MAAM;AAAA,UAClB,UAAU;AAAA,QAAA;AAAA,SAEX,UAAU;AAAA,IAAA,OACR;AACA,uBAAA,QAAQ,cAAR,mBAAmB,WAAnB,4BAA4B;AAAA,QAC/B,OAAO,KAAK,MAAM;AAAA,QAClB,UAAU;AAAA,MAAA;AAAA,IACX;AAAA,EACH;AAAA,EAGM,0BAA0B;;AAC1B,UAAA,cAAa,UAAK,QAAQ,cAAb,mBAAwB;AAEvC,QAAA,cAAc,aAAa,GAAG;AAC5B,UAAA,KAAK,WAAW,UAAU,QAAQ;AACvB,qBAAA,KAAK,WAAW,UAAU,MAAM;AAAA,MAAA;AAG/C,WAAK,WAAW,UAAU,SAAS,WAAW,MAAM;;AAC7C,SAAAD,OAAAC,MAAA,KAAA,QAAQ,cAAR,gBAAAA,IAAmB,aAAnB,gBAAAD,IAAA,KAAAC,KAA8B;AAAA,UACjC,OAAO,KAAK,MAAM;AAAA,UAClB,UAAU;AAAA,QAAA;AAAA,SAEX,UAAU;AAAA,IAAA,OACR;AACA,uBAAA,QAAQ,cAAR,mBAAmB,aAAnB,4BAA8B;AAAA,QACjC,OAAO,KAAK,MAAM;AAAA,QAClB,UAAU;AAAA,MAAA;AAAA,IACX;AAAA,EACH;AAEJ;AAEA,SAAS,eAAe,UAA4B;AAClD,MAAI,UAAU;AACL,WAAA;AAAA,EAAA;AAGF,SAAA;AACT;AAEA,SAAS,eAAe,OAAwB;AAC9C,UAAQ,OAAO;AAAA,IACb,KAAK;AACI,aAAA;AAAA,IACT,KAAK;AACI,aAAA;AAAA,IACT,KAAK;AACI,aAAA;AAAA,IACT,KAAK;AACI,aAAA;AAAA,IACT,KAAK;AAAA,IACL;AACS,aAAA;AAAA,EAAA;AAEb;;"}
|
package/dist/cjs/FieldApi.d.cts
CHANGED
|
@@ -2,7 +2,7 @@ import { Derived } from '@tanstack/store';
|
|
|
2
2
|
import { DeepKeys, DeepValue, UnwrapOneLevelOfArray } from './util-types.cjs';
|
|
3
3
|
import { StandardSchemaV1, StandardSchemaV1Issue, TStandardSchemaValidatorValue } from './standardSchemaValidator.cjs';
|
|
4
4
|
import { FieldInfo, FormApi, FormAsyncValidateOrFn, FormValidateAsyncFn, FormValidateFn, FormValidateOrFn } from './FormApi.cjs';
|
|
5
|
-
import { UpdateMetaOptions, ValidationCause, ValidationError, ValidationErrorMap } from './types.cjs';
|
|
5
|
+
import { ListenerCause, UpdateMetaOptions, ValidationCause, ValidationError, ValidationErrorMap } from './types.cjs';
|
|
6
6
|
import { Updater } from './utils.cjs';
|
|
7
7
|
/**
|
|
8
8
|
* @private
|
|
@@ -117,7 +117,9 @@ export interface FieldValidators<TParentData, TName extends DeepKeys<TParentData
|
|
|
117
117
|
}
|
|
118
118
|
export interface FieldListeners<TParentData, TName extends DeepKeys<TParentData>, TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>> {
|
|
119
119
|
onChange?: FieldListenerFn<TParentData, TName, TData>;
|
|
120
|
+
onChangeDebounceMs?: number;
|
|
120
121
|
onBlur?: FieldListenerFn<TParentData, TName, TData>;
|
|
122
|
+
onBlurDebounceMs?: number;
|
|
121
123
|
onMount?: FieldListenerFn<TParentData, TName, TData>;
|
|
122
124
|
onSubmit?: FieldListenerFn<TParentData, TName, TData>;
|
|
123
125
|
}
|
|
@@ -252,7 +254,10 @@ export declare class FieldApi<in out TParentData, in out TName extends DeepKeys<
|
|
|
252
254
|
* The current field state.
|
|
253
255
|
*/
|
|
254
256
|
get state(): FieldState<TParentData, TName, TData, TOnMount, TOnChange, TOnChangeAsync, TOnBlur, TOnBlurAsync, TOnSubmit, TOnSubmitAsync, TFormOnMount, TFormOnChange, TFormOnChangeAsync, TFormOnBlur, TFormOnBlurAsync, TFormOnSubmit, TFormOnSubmitAsync>;
|
|
255
|
-
timeoutIds:
|
|
257
|
+
timeoutIds: {
|
|
258
|
+
validations: Record<ValidationCause, ReturnType<typeof setTimeout> | null>;
|
|
259
|
+
listeners: Record<ListenerCause, ReturnType<typeof setTimeout> | null>;
|
|
260
|
+
};
|
|
256
261
|
/**
|
|
257
262
|
* Initializes a new `FieldApi` instance.
|
|
258
263
|
*/
|
|
@@ -349,5 +354,7 @@ export declare class FieldApi<in out TParentData, in out TName extends DeepKeys<
|
|
|
349
354
|
* Updates the field's errorMap
|
|
350
355
|
*/
|
|
351
356
|
setErrorMap(errorMap: ValidationErrorMap): void;
|
|
357
|
+
private triggerOnBlurListener;
|
|
358
|
+
private triggerOnChangeListener;
|
|
352
359
|
}
|
|
353
360
|
export {};
|
package/dist/cjs/types.d.cts
CHANGED
|
@@ -6,6 +6,10 @@ export type ValidationSource = 'form' | 'field';
|
|
|
6
6
|
* @private
|
|
7
7
|
*/
|
|
8
8
|
export type ValidationCause = 'change' | 'blur' | 'submit' | 'mount' | 'server';
|
|
9
|
+
/**
|
|
10
|
+
* @private
|
|
11
|
+
*/
|
|
12
|
+
export type ListenerCause = 'change' | 'blur' | 'submit' | 'mount';
|
|
9
13
|
/**
|
|
10
14
|
* @private
|
|
11
15
|
*/
|
|
@@ -12,25 +12,47 @@ type Try<A1, A2, Catch = never> = A1 extends A2 ? A1 : Catch;
|
|
|
12
12
|
*/
|
|
13
13
|
export type Narrow<A> = Try<A, [], NarrowRaw<A>>;
|
|
14
14
|
type IsAny<T> = 0 extends 1 & T ? true : false;
|
|
15
|
-
export
|
|
16
|
-
|
|
17
|
-
|
|
15
|
+
export interface AnyDeepKeyAndValue {
|
|
16
|
+
key: string;
|
|
17
|
+
value: any;
|
|
18
|
+
}
|
|
19
|
+
export type ArrayAccessor<TParent extends AnyDeepKeyAndValue> = `${TParent['key'] extends never ? '' : TParent['key']}[${number}]`;
|
|
20
|
+
export interface ArrayDeepKeyAndValue<in out TParent extends AnyDeepKeyAndValue, in out T extends ReadonlyArray<any>> {
|
|
21
|
+
key: ArrayAccessor<TParent>;
|
|
22
|
+
value: T[number] | Nullable<TParent['value']>;
|
|
23
|
+
}
|
|
24
|
+
export type DeepKeyAndValueArray<TParent extends AnyDeepKeyAndValue, T extends ReadonlyArray<any>, TAcc> = DeepKeysAndValues<NonNullable<T[number]>, ArrayDeepKeyAndValue<TParent, T>, TAcc | ArrayDeepKeyAndValue<TParent, T>>;
|
|
25
|
+
export type TupleAccessor<TParent extends AnyDeepKeyAndValue, TKey extends string> = `${TParent['key'] extends never ? '' : TParent['key']}[${TKey}]`;
|
|
26
|
+
export interface TupleDeepKeyAndValue<in out TParent extends AnyDeepKeyAndValue, in out T, in out TKey extends AllTupleKeys<T>> {
|
|
27
|
+
key: TupleAccessor<TParent, TKey>;
|
|
28
|
+
value: T[TKey] | Nullable<TParent['value']>;
|
|
29
|
+
}
|
|
18
30
|
export type AllTupleKeys<T> = T extends any ? keyof T & `${number}` : never;
|
|
19
|
-
export type
|
|
31
|
+
export type DeepKeyAndValueTuple<TParent extends AnyDeepKeyAndValue, T extends ReadonlyArray<any>, TAcc, TAllKeys extends AllTupleKeys<T> = AllTupleKeys<T>> = TAllKeys extends any ? DeepKeysAndValues<NonNullable<T[TAllKeys]>, TupleDeepKeyAndValue<TParent, T, TAllKeys>, TAcc | TupleDeepKeyAndValue<TParent, T, TAllKeys>> : never;
|
|
20
32
|
export type AllObjectKeys<T> = T extends any ? keyof T & (string | number) : never;
|
|
21
|
-
export type ObjectAccessor<
|
|
22
|
-
export type
|
|
23
|
-
export
|
|
33
|
+
export type ObjectAccessor<TParent extends AnyDeepKeyAndValue, TKey extends string | number> = TParent['key'] extends never ? `${TKey}` : `${TParent['key']}.${TKey}`;
|
|
34
|
+
export type Nullable<T> = T & (undefined | null);
|
|
35
|
+
export interface ObjectDeepKeyAndValue<in out TParent extends AnyDeepKeyAndValue, in out T, in out TKey extends AllObjectKeys<T>> {
|
|
36
|
+
key: ObjectAccessor<TParent, TKey>;
|
|
37
|
+
value: T[TKey] | Nullable<TParent['value']>;
|
|
38
|
+
}
|
|
39
|
+
export type DeepKeyAndValueObject<TParent extends AnyDeepKeyAndValue, T, TAcc, TAllKeys extends AllObjectKeys<T> = AllObjectKeys<T>> = TAllKeys extends any ? DeepKeysAndValues<NonNullable<T[TAllKeys]>, ObjectDeepKeyAndValue<TParent, T, TAllKeys>, TAcc | ObjectDeepKeyAndValue<TParent, T, TAllKeys>> : never;
|
|
40
|
+
export type UnknownAccessor<TParent extends AnyDeepKeyAndValue> = TParent['key'] extends never ? string : `${TParent['key']}.${string}`;
|
|
41
|
+
export interface UnknownDeepKeyAndValue<TParent extends AnyDeepKeyAndValue> {
|
|
42
|
+
key: UnknownAccessor<TParent>;
|
|
43
|
+
value: unknown;
|
|
44
|
+
}
|
|
45
|
+
export type DeepKeyAndValueUnknown<TParent extends AnyDeepKeyAndValue> = UnknownDeepKeyAndValue<TParent>;
|
|
46
|
+
export type DeepKeysAndValues<T, TParent extends AnyDeepKeyAndValue = never, TAcc = never> = IsAny<T> extends true ? T : T extends string | number | boolean | bigint | Date ? TAcc : T extends ReadonlyArray<any> ? number extends T['length'] ? DeepKeyAndValueArray<TParent, T, TAcc> : DeepKeyAndValueTuple<TParent, T, TAcc> : keyof T extends never ? TAcc | DeepKeyAndValueUnknown<TParent> : T extends object ? DeepKeyAndValueObject<TParent, T, TAcc> : TAcc;
|
|
24
47
|
export type DeepRecord<T> = {
|
|
25
|
-
[TRecord in
|
|
48
|
+
[TRecord in DeepKeysAndValues<T> extends AnyDeepKeyAndValue ? DeepKeysAndValues<T> : never as TRecord['key']]: TRecord['value'];
|
|
26
49
|
};
|
|
27
|
-
type UnionKeys<T> = T extends any ? keyof T : never;
|
|
28
50
|
/**
|
|
29
51
|
* The keys of an object or array, deeply nested.
|
|
30
52
|
*/
|
|
31
|
-
export type DeepKeys<T> = unknown extends T ? string :
|
|
53
|
+
export type DeepKeys<T> = unknown extends T ? string : DeepKeysAndValues<T> extends AnyDeepKeyAndValue ? DeepKeysAndValues<T>['key'] : never;
|
|
32
54
|
/**
|
|
33
55
|
* Infer the type of a deeply nested property within an object or an array.
|
|
34
56
|
*/
|
|
35
|
-
export type DeepValue<TValue, TAccessor> = DeepRecord<TValue> extends infer TDeepRecord ?
|
|
57
|
+
export type DeepValue<TValue, TAccessor> = DeepRecord<TValue> extends infer TDeepRecord ? TAccessor extends keyof TDeepRecord ? TDeepRecord[TAccessor] : never : never;
|
|
36
58
|
export {};
|