@tanstack/form-core 1.24.1 → 1.24.2

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.
@@ -174,6 +174,9 @@ class FormApi {
174
174
  for (const field of Object.keys(
175
175
  this.state.fieldMeta
176
176
  )) {
177
+ if (this.baseStore.state.fieldMetaBase[field] === void 0) {
178
+ continue;
179
+ }
177
180
  const fieldMeta = this.getFieldMeta(field);
178
181
  if (!fieldMeta) continue;
179
182
  const {
@@ -314,6 +317,9 @@ class FormApi {
314
317
  for (const field of Object.keys(
315
318
  this.state.fieldMeta
316
319
  )) {
320
+ if (this.baseStore.state.fieldMetaBase[field] === void 0) {
321
+ continue;
322
+ }
317
323
  const fieldMeta = this.getFieldMeta(field);
318
324
  if (!fieldMeta) continue;
319
325
  const {
@@ -1 +1 @@
1
- {"version":3,"file":"FormApi.cjs","sources":["../../src/FormApi.ts"],"sourcesContent":["import { Derived, Store, batch } from '@tanstack/store'\n\nimport {\n deleteBy,\n determineFormLevelErrorSourceAndValue,\n evaluate,\n functionalUpdate,\n getAsyncValidatorArray,\n getBy,\n getSyncValidatorArray,\n isGlobalFormValidationError,\n isNonEmptyArray,\n mergeOpts,\n setBy,\n uuid,\n} from './utils'\nimport { defaultValidationLogic } from './ValidationLogic'\n\nimport {\n isStandardSchemaValidator,\n standardSchemaValidators,\n} from './standardSchemaValidator'\nimport { defaultFieldMeta, metaHelper } from './metaHelper'\nimport { formEventClient } from './EventClient'\nimport type {\n RequestFormForceReset,\n RequestFormReset,\n RequestFormState,\n} from './EventClient'\nimport type { ValidationLogicFn } from './ValidationLogic'\nimport type {\n StandardSchemaV1,\n StandardSchemaV1Issue,\n TStandardSchemaValidatorValue,\n} from './standardSchemaValidator'\nimport type {\n AnyFieldApi,\n AnyFieldMeta,\n AnyFieldMetaBase,\n FieldApi,\n} from './FieldApi'\nimport type {\n ExtractGlobalFormError,\n FieldManipulator,\n FormValidationError,\n FormValidationErrorMap,\n ListenerCause,\n UpdateMetaOptions,\n ValidationCause,\n ValidationError,\n ValidationErrorMap,\n ValidationErrorMapKeys,\n} from './types'\nimport type { DeepKeys, DeepKeysOfType, DeepValue } from './util-types'\nimport type { Updater } from './utils'\n\n/**\n * @private\n */\n// TODO: Add the `Unwrap` type to the errors\ntype FormErrorMapFromValidator<\n TFormData,\n TOnMount extends undefined | FormValidateOrFn<TFormData>,\n TOnChange extends undefined | FormValidateOrFn<TFormData>,\n TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n> = Partial<\n Record<\n DeepKeys<TFormData>,\n ValidationErrorMap<\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync\n >\n >\n>\n\nexport type FormValidateFn<TFormData> = (props: {\n value: TFormData\n formApi: FormApi<\n TFormData,\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 >\n}) => unknown\n\n/**\n * @private\n */\nexport type FormValidateOrFn<TFormData> =\n | FormValidateFn<TFormData>\n | StandardSchemaV1<TFormData, unknown>\n\nexport type UnwrapFormValidateOrFn<\n TValidateOrFn extends undefined | FormValidateOrFn<any>,\n> = [TValidateOrFn] extends [FormValidateFn<any>]\n ? ExtractGlobalFormError<ReturnType<TValidateOrFn>>\n : [TValidateOrFn] extends [StandardSchemaV1<any, any>]\n ? Record<string, StandardSchemaV1Issue[]>\n : undefined\n\n/**\n * @private\n */\nexport type FormValidateAsyncFn<TFormData> = (props: {\n value: TFormData\n formApi: FormApi<\n TFormData,\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 >\n signal: AbortSignal\n}) => unknown | Promise<unknown>\n\nexport type FormValidator<TFormData, TType, TFn = unknown> = {\n validate(options: { value: TType }, fn: TFn): ValidationError\n validateAsync(\n options: { value: TType },\n fn: TFn,\n ): Promise<FormValidationError<TFormData>>\n}\n\ntype ValidationPromiseResult<TFormData> =\n | {\n fieldErrors: Partial<Record<DeepKeys<TFormData>, ValidationError>>\n errorMapKey: ValidationErrorMapKeys\n }\n | undefined\n\n/**\n * @private\n */\nexport type FormAsyncValidateOrFn<TFormData> =\n | FormValidateAsyncFn<TFormData>\n | StandardSchemaV1<TFormData, unknown>\n\nexport type UnwrapFormAsyncValidateOrFn<\n TValidateOrFn extends undefined | FormAsyncValidateOrFn<any>,\n> = [TValidateOrFn] extends [FormValidateAsyncFn<any>]\n ? ExtractGlobalFormError<Awaited<ReturnType<TValidateOrFn>>>\n : [TValidateOrFn] extends [StandardSchemaV1<any, any>]\n ? Record<string, StandardSchemaV1Issue[]>\n : undefined\n\nexport interface FormValidators<\n TFormData,\n TOnMount extends undefined | FormValidateOrFn<TFormData>,\n TOnChange extends undefined | FormValidateOrFn<TFormData>,\n TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n> {\n /**\n * Optional function that fires as soon as the component mounts.\n */\n onMount?: TOnMount\n /**\n * Optional function that checks the validity of your data whenever a value changes\n */\n onChange?: TOnChange\n /**\n * Optional onChange asynchronous counterpart to onChange. Useful for more complex validation logic that might involve server requests.\n */\n onChangeAsync?: TOnChangeAsync\n /**\n * The default time in milliseconds that 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 * Optional function that validates the form data when a field loses focus, returns a `FormValidationError`\n */\n onBlur?: TOnBlur\n /**\n * Optional onBlur asynchronous validation method for when a field loses focus returns a ` FormValidationError` or a promise of `Promise<FormValidationError>`\n */\n onBlurAsync?: TOnBlurAsync\n /**\n * The default time in milliseconds that 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 onSubmit?: TOnSubmit\n onSubmitAsync?: TOnSubmitAsync\n onDynamic?: TOnDynamic\n onDynamicAsync?: TOnDynamicAsync\n onDynamicAsyncDebounceMs?: number\n}\n\n/**\n * @private\n */\nexport interface FormTransform<\n TFormData,\n TOnMount extends undefined | FormValidateOrFn<TFormData>,\n TOnChange extends undefined | FormValidateOrFn<TFormData>,\n TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n TSubmitMeta = never,\n> {\n fn: (\n formBase: FormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >,\n ) => FormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >\n deps: unknown[]\n}\n\nexport interface FormListeners<\n TFormData,\n TOnMount extends undefined | FormValidateOrFn<TFormData>,\n TOnChange extends undefined | FormValidateOrFn<TFormData>,\n TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n TSubmitMeta = never,\n> {\n onChange?: (props: {\n formApi: FormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >\n fieldApi: AnyFieldApi\n }) => void\n onChangeDebounceMs?: number\n\n onBlur?: (props: {\n formApi: FormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >\n fieldApi: AnyFieldApi\n }) => void\n onBlurDebounceMs?: number\n\n onMount?: (props: {\n formApi: FormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >\n }) => void\n\n onSubmit?: (props: {\n formApi: FormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >\n meta: TSubmitMeta\n }) => void\n}\n\n/**\n * An object representing the base properties of a form, unrelated to any validators\n */\nexport interface BaseFormOptions<in out TFormData, in out TSubmitMeta = never> {\n /**\n * Set initial values for your form.\n */\n defaultValues?: TFormData\n /**\n * onSubmitMeta, the data passed from the handleSubmit handler, to the onSubmit function props\n */\n onSubmitMeta?: TSubmitMeta\n}\n\n/**\n * An object representing the options for a form.\n */\nexport interface FormOptions<\n in out TFormData,\n in out TOnMount extends undefined | FormValidateOrFn<TFormData>,\n in out TOnChange extends undefined | FormValidateOrFn<TFormData>,\n in out TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n in out TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n in out TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n in out TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TSubmitMeta = never,\n> extends BaseFormOptions<TFormData, TSubmitMeta> {\n /**\n * The form name, used for devtools and identification\n */\n formId?: string\n /**\n * The default state for the form.\n */\n defaultState?: Partial<\n FormState<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer\n >\n >\n /**\n * If true, always run async validation, even when sync validation has produced an error. Defaults to undefined.\n */\n asyncAlways?: boolean\n /**\n * Optional time in milliseconds if you want to introduce a delay before firing off an async action.\n */\n asyncDebounceMs?: number\n /**\n * If true, allows the form to be submitted in an invalid state i.e. canSubmit will remain true regardless of validation errors. Defaults to undefined.\n */\n canSubmitWhenInvalid?: boolean\n /**\n * A list of validators to pass to the form\n */\n validators?: FormValidators<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync\n >\n\n validationLogic?: ValidationLogicFn\n\n /**\n * form level listeners\n */\n listeners?: FormListeners<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >\n\n /**\n * A function to be called when the form is submitted, what should happen once the user submits a valid form returns `any` or a promise `Promise<any>`\n */\n onSubmit?: (props: {\n value: TFormData\n formApi: FormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >\n meta: TSubmitMeta\n }) => any | Promise<any>\n /**\n * Specify an action for scenarios where the user tries to submit an invalid form.\n */\n onSubmitInvalid?: (props: {\n value: TFormData\n formApi: FormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >\n meta: TSubmitMeta\n }) => void\n transform?: FormTransform<\n NoInfer<TFormData>,\n NoInfer<TOnMount>,\n NoInfer<TOnChange>,\n NoInfer<TOnChangeAsync>,\n NoInfer<TOnBlur>,\n NoInfer<TOnBlurAsync>,\n NoInfer<TOnSubmit>,\n NoInfer<TOnSubmitAsync>,\n NoInfer<TOnDynamic>,\n NoInfer<TOnDynamicAsync>,\n NoInfer<TOnServer>,\n NoInfer<TSubmitMeta>\n >\n}\n\nexport type AnyFormOptions = FormOptions<\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 representing the validation metadata for a field. Not intended for public usage.\n */\nexport type ValidationMeta = {\n /**\n * An abort controller stored in memory to cancel previous async validation attempts.\n */\n lastAbortController: AbortController\n}\n\n/**\n * An object representing the field information for a specific field within the form.\n */\nexport type FieldInfo<TFormData> = {\n /**\n * An instance of the FieldAPI.\n */\n instance: FieldApi<\n TFormData,\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 any,\n any,\n any\n > | null\n /**\n * A record of field validation internal handling.\n */\n validationMetaMap: Record<ValidationErrorMapKeys, ValidationMeta | undefined>\n}\n\n/**\n * An object representing the current state of the form.\n */\nexport type BaseFormState<\n in out TFormData,\n in out TOnMount extends undefined | FormValidateOrFn<TFormData>,\n in out TOnChange extends undefined | FormValidateOrFn<TFormData>,\n in out TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n in out TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n in out TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n in out TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n> = {\n /**\n * The current values of the form fields.\n */\n values: TFormData\n /**\n * The error map for the form itself.\n */\n errorMap: ValidationErrorMap<\n UnwrapFormValidateOrFn<TOnMount>,\n UnwrapFormValidateOrFn<TOnChange>,\n UnwrapFormAsyncValidateOrFn<TOnChangeAsync>,\n UnwrapFormValidateOrFn<TOnBlur>,\n UnwrapFormAsyncValidateOrFn<TOnBlurAsync>,\n UnwrapFormValidateOrFn<TOnSubmit>,\n UnwrapFormAsyncValidateOrFn<TOnSubmitAsync>,\n UnwrapFormValidateOrFn<TOnDynamic>,\n UnwrapFormAsyncValidateOrFn<TOnDynamicAsync>,\n UnwrapFormAsyncValidateOrFn<TOnServer>\n >\n /**\n * An internal mechanism used for keeping track of validation logic in a form.\n */\n validationMetaMap: Record<ValidationErrorMapKeys, ValidationMeta | undefined>\n /**\n * A record of field metadata for each field in the form, not including the derived properties, like `errors` and such\n */\n fieldMetaBase: Record<DeepKeys<TFormData>, AnyFieldMetaBase>\n /**\n * A boolean indicating if the form is currently in the process of being submitted after `handleSubmit` is called.\n *\n * Goes back to `false` when submission completes for one of the following reasons:\n * - the validation step returned errors.\n * - the `onSubmit` function has completed.\n *\n * Note: if you're running async operations in your `onSubmit` function make sure to await them to ensure `isSubmitting` is set to `false` only when the async operation completes.\n *\n * This is useful for displaying loading indicators or disabling form inputs during submission.\n *\n */\n isSubmitting: boolean\n /**\n * A boolean indicating if the `onSubmit` function has completed successfully.\n *\n * Goes back to `false` at each new submission attempt.\n *\n * Note: you can use isSubmitting to check if the form is currently submitting.\n */\n isSubmitted: boolean\n /**\n * A boolean indicating if the form or any of its fields are currently validating.\n */\n isValidating: boolean\n /**\n * A counter for tracking the number of submission attempts.\n */\n submissionAttempts: number\n /**\n * A boolean indicating if the last submission was successful.\n */\n isSubmitSuccessful: boolean\n /**\n * @private, used to force a re-evaluation of the form state when options change\n */\n _force_re_eval?: boolean\n}\n\nexport type DerivedFormState<\n in out TFormData,\n in out TOnMount extends undefined | FormValidateOrFn<TFormData>,\n in out TOnChange extends undefined | FormValidateOrFn<TFormData>,\n in out TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n in out TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n in out TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n in out TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n> = {\n /**\n * A boolean indicating if the form is currently validating.\n */\n isFormValidating: boolean\n /**\n * A boolean indicating if the form is valid.\n */\n isFormValid: boolean\n /**\n * The error array for the form itself.\n */\n errors: Array<\n | UnwrapFormValidateOrFn<TOnMount>\n | UnwrapFormValidateOrFn<TOnChange>\n | UnwrapFormAsyncValidateOrFn<TOnChangeAsync>\n | UnwrapFormValidateOrFn<TOnBlur>\n | UnwrapFormAsyncValidateOrFn<TOnBlurAsync>\n | UnwrapFormValidateOrFn<TOnSubmit>\n | UnwrapFormAsyncValidateOrFn<TOnSubmitAsync>\n | UnwrapFormValidateOrFn<TOnDynamic>\n | UnwrapFormAsyncValidateOrFn<TOnDynamicAsync>\n | UnwrapFormAsyncValidateOrFn<TOnServer>\n >\n /**\n * A boolean indicating if any of the form fields are currently validating.\n */\n isFieldsValidating: boolean\n /**\n * A boolean indicating if all the form fields are valid. Evaluates `true` if there are no field errors.\n */\n isFieldsValid: boolean\n /**\n * A boolean indicating if any of the form fields have been touched.\n */\n isTouched: boolean\n /**\n * A boolean indicating if any of the form fields have been blurred.\n */\n isBlurred: boolean\n /**\n * A boolean indicating if any of the form's fields' values have been modified by the user. Evaluates `true` if the user have modified at least one of the fields. Opposite of `isPristine`.\n */\n isDirty: boolean\n /**\n * A boolean indicating if none of the form's fields' values have been modified by the user. Evaluates `true` if the user have not modified any of the fields. Opposite of `isDirty`.\n */\n isPristine: boolean\n /**\n * A boolean indicating if all of the form's fields are the same as default values.\n */\n isDefaultValue: boolean\n /**\n * A boolean indicating if the form and all its fields are valid. Evaluates `true` if there are no errors.\n */\n isValid: boolean\n /**\n * A boolean indicating if the form can be submitted based on its current state.\n */\n canSubmit: boolean\n /**\n * A record of field metadata for each field in the form.\n */\n fieldMeta: Record<DeepKeys<TFormData>, AnyFieldMeta>\n}\n\nexport interface FormState<\n in out TFormData,\n in out TOnMount extends undefined | FormValidateOrFn<TFormData>,\n in out TOnChange extends undefined | FormValidateOrFn<TFormData>,\n in out TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n in out TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n in out TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n in out TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n> extends BaseFormState<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer\n >,\n DerivedFormState<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer\n > {}\n\nexport type AnyFormState = FormState<\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n>\n\nfunction getDefaultFormState<\n TFormData,\n TOnMount extends undefined | FormValidateOrFn<TFormData>,\n TOnChange extends undefined | FormValidateOrFn<TFormData>,\n TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n>(\n defaultState: Partial<\n FormState<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer\n >\n >,\n): BaseFormState<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer\n> {\n return {\n values: defaultState.values ?? ({} as never),\n errorMap: defaultState.errorMap ?? {},\n fieldMetaBase: defaultState.fieldMetaBase ?? ({} as never),\n isSubmitted: defaultState.isSubmitted ?? false,\n isSubmitting: defaultState.isSubmitting ?? false,\n isValidating: defaultState.isValidating ?? false,\n submissionAttempts: defaultState.submissionAttempts ?? 0,\n isSubmitSuccessful: defaultState.isSubmitSuccessful ?? false,\n validationMetaMap: defaultState.validationMetaMap ?? {\n onChange: undefined,\n onBlur: undefined,\n onSubmit: undefined,\n onMount: undefined,\n onServer: undefined,\n onDynamic: undefined,\n },\n }\n}\n\n/**\n * @public\n *\n * A type representing the Form API with all generics set to `any` for convenience.\n */\nexport type AnyFormApi = FormApi<\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 Form API. It handles the logic and interactions with the form state.\n *\n * Normally, you will not need to create a new `FormApi` instance directly. Instead, you will use a framework\n * hook/function like `useForm` or `createForm` 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 the `new FormApi` constructor.\n */\nexport class FormApi<\n in out TFormData,\n in out TOnMount extends undefined | FormValidateOrFn<TFormData>,\n in out TOnChange extends undefined | FormValidateOrFn<TFormData>,\n in out TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n in out TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n in out TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n in out TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TSubmitMeta = never,\n> implements FieldManipulator<TFormData, TSubmitMeta>\n{\n /**\n * The options for the form.\n */\n options: FormOptions<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n > = {}\n baseStore!: Store<\n BaseFormState<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer\n >\n >\n fieldMetaDerived!: Derived<Record<DeepKeys<TFormData>, AnyFieldMeta>>\n store!: Derived<\n FormState<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer\n >\n >\n /**\n * A record of field information for each field in the form.\n */\n fieldInfo: Record<DeepKeys<TFormData>, FieldInfo<TFormData>> = {} as any\n\n get state() {\n return this.store.state\n }\n\n /**\n * @private\n */\n prevTransformArray: unknown[] = []\n\n /**\n * @private\n */\n timeoutIds: {\n validations: Record<ValidationCause, ReturnType<typeof setTimeout> | null>\n listeners: Record<ListenerCause, ReturnType<typeof setTimeout> | null>\n formListeners: Record<ListenerCause, ReturnType<typeof setTimeout> | null>\n }\n /**\n * @private\n */\n private _formId: string\n /**\n * @private\n */\n private _devtoolsSubmissionOverride: boolean\n\n /**\n * Constructs a new `FormApi` instance with the given form options.\n */\n constructor(\n opts?: FormOptions<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >,\n ) {\n this.timeoutIds = {\n validations: {} as Record<ValidationCause, never>,\n listeners: {} as Record<ListenerCause, never>,\n formListeners: {} as Record<ListenerCause, never>,\n }\n\n this._formId = opts?.formId ?? uuid()\n\n this._devtoolsSubmissionOverride = false\n\n this.baseStore = new Store(\n getDefaultFormState({\n ...(opts?.defaultState as any),\n values: opts?.defaultValues ?? opts?.defaultState?.values,\n isFormValid: true,\n }),\n )\n\n this.fieldMetaDerived = new Derived({\n deps: [this.baseStore],\n fn: ({ prevDepVals, currDepVals, prevVal: _prevVal }) => {\n const prevVal = _prevVal as\n | Record<DeepKeys<TFormData>, AnyFieldMeta>\n | undefined\n const prevBaseStore = prevDepVals?.[0]\n const currBaseStore = currDepVals[0]\n\n let originalMetaCount = 0\n\n const fieldMeta = {} as FormState<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer\n >['fieldMeta']\n\n for (const fieldName of Object.keys(\n currBaseStore.fieldMetaBase,\n ) as Array<keyof typeof currBaseStore.fieldMetaBase>) {\n const currBaseMeta = currBaseStore.fieldMetaBase[\n fieldName as never\n ] as AnyFieldMetaBase\n\n const prevBaseMeta = prevBaseStore?.fieldMetaBase[\n fieldName as never\n ] as AnyFieldMetaBase | undefined\n\n const prevFieldInfo =\n prevVal?.[fieldName as never as keyof typeof prevVal]\n\n const curFieldVal = getBy(currBaseStore.values, fieldName)\n\n let fieldErrors = prevFieldInfo?.errors\n if (\n !prevBaseMeta ||\n currBaseMeta.errorMap !== prevBaseMeta.errorMap\n ) {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n fieldErrors = Object.values(currBaseMeta.errorMap ?? {}).filter(\n (val) => val !== undefined,\n ) as never\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n const fieldInstance = this.getFieldInfo(fieldName)?.instance\n\n if (fieldInstance && !fieldInstance.options.disableErrorFlat) {\n fieldErrors = (fieldErrors as undefined | string[])?.flat(\n 1,\n ) as never\n }\n }\n\n // As primitives, we don't need to aggressively persist the same referential value for performance reasons\n const isFieldValid = !isNonEmptyArray(fieldErrors ?? [])\n const isFieldPristine = !currBaseMeta.isDirty\n const isDefaultValue =\n evaluate(\n curFieldVal,\n getBy(this.options.defaultValues, fieldName),\n ) ||\n evaluate(\n curFieldVal,\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n this.getFieldInfo(fieldName)?.instance?.options.defaultValue,\n )\n\n if (\n prevFieldInfo &&\n prevFieldInfo.isPristine === isFieldPristine &&\n prevFieldInfo.isValid === isFieldValid &&\n prevFieldInfo.isDefaultValue === isDefaultValue &&\n prevFieldInfo.errors === fieldErrors &&\n currBaseMeta === prevBaseMeta\n ) {\n fieldMeta[fieldName] = prevFieldInfo\n originalMetaCount++\n continue\n }\n\n fieldMeta[fieldName] = {\n ...currBaseMeta,\n errors: fieldErrors,\n isPristine: isFieldPristine,\n isValid: isFieldValid,\n isDefaultValue: isDefaultValue,\n } as AnyFieldMeta\n }\n\n if (!Object.keys(currBaseStore.fieldMetaBase).length) return fieldMeta\n\n if (\n prevVal &&\n originalMetaCount === Object.keys(currBaseStore.fieldMetaBase).length\n ) {\n return prevVal\n }\n\n return fieldMeta\n },\n })\n\n this.store = new Derived({\n deps: [this.baseStore, this.fieldMetaDerived],\n fn: ({ prevDepVals, currDepVals, prevVal: _prevVal }) => {\n const prevVal = _prevVal as\n | FormState<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer\n >\n | undefined\n const prevBaseStore = prevDepVals?.[0]\n const currBaseStore = currDepVals[0]\n const currFieldMeta = currDepVals[1]\n\n // Computed state\n const fieldMetaValues = Object.values(currFieldMeta).filter(\n Boolean,\n ) as AnyFieldMeta[]\n\n const isFieldsValidating = fieldMetaValues.some(\n (field) => field.isValidating,\n )\n\n const isFieldsValid = fieldMetaValues.every((field) => field.isValid)\n\n const isTouched = fieldMetaValues.some((field) => field.isTouched)\n const isBlurred = fieldMetaValues.some((field) => field.isBlurred)\n const isDefaultValue = fieldMetaValues.every(\n (field) => field.isDefaultValue,\n )\n\n const shouldInvalidateOnMount =\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n isTouched && currBaseStore.errorMap?.onMount\n\n const isDirty = fieldMetaValues.some((field) => field.isDirty)\n const isPristine = !isDirty\n\n const hasOnMountError = Boolean(\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n currBaseStore.errorMap?.onMount ||\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n fieldMetaValues.some((f) => f?.errorMap?.onMount),\n )\n\n const isValidating = !!isFieldsValidating\n\n // As `errors` is not a primitive, we need to aggressively persist the same referencial value for performance reasons\n let errors = prevVal?.errors ?? []\n if (\n !prevBaseStore ||\n currBaseStore.errorMap !== prevBaseStore.errorMap\n ) {\n errors = Object.values(currBaseStore.errorMap).reduce<\n Array<\n | UnwrapFormValidateOrFn<TOnMount>\n | UnwrapFormValidateOrFn<TOnChange>\n | UnwrapFormAsyncValidateOrFn<TOnChangeAsync>\n | UnwrapFormValidateOrFn<TOnBlur>\n | UnwrapFormAsyncValidateOrFn<TOnBlurAsync>\n | UnwrapFormValidateOrFn<TOnSubmit>\n | UnwrapFormAsyncValidateOrFn<TOnSubmitAsync>\n | UnwrapFormAsyncValidateOrFn<TOnServer>\n >\n >((prev, curr) => {\n if (curr === undefined) return prev\n\n if (curr && isGlobalFormValidationError(curr)) {\n prev.push(curr.form as never)\n return prev\n }\n prev.push(curr as never)\n return prev\n }, [])\n }\n\n const isFormValid = errors.length === 0\n const isValid = isFieldsValid && isFormValid\n const submitInvalid = this.options.canSubmitWhenInvalid ?? false\n const canSubmit =\n (currBaseStore.submissionAttempts === 0 &&\n !isTouched &&\n !hasOnMountError) ||\n (!isValidating && !currBaseStore.isSubmitting && isValid) ||\n submitInvalid\n\n let errorMap = currBaseStore.errorMap\n if (shouldInvalidateOnMount) {\n errors = errors.filter(\n (err) => err !== currBaseStore.errorMap.onMount,\n )\n errorMap = Object.assign(errorMap, { onMount: undefined })\n }\n\n if (\n prevVal &&\n prevBaseStore &&\n prevVal.errorMap === errorMap &&\n prevVal.fieldMeta === this.fieldMetaDerived.state &&\n prevVal.errors === errors &&\n prevVal.isFieldsValidating === isFieldsValidating &&\n prevVal.isFieldsValid === isFieldsValid &&\n prevVal.isFormValid === isFormValid &&\n prevVal.isValid === isValid &&\n prevVal.canSubmit === canSubmit &&\n prevVal.isTouched === isTouched &&\n prevVal.isBlurred === isBlurred &&\n prevVal.isPristine === isPristine &&\n prevVal.isDefaultValue === isDefaultValue &&\n prevVal.isDirty === isDirty &&\n evaluate(prevBaseStore, currBaseStore)\n ) {\n return prevVal\n }\n\n let state = {\n ...currBaseStore,\n errorMap,\n fieldMeta: this.fieldMetaDerived.state,\n errors,\n isFieldsValidating,\n isFieldsValid,\n isFormValid,\n isValid,\n canSubmit,\n isTouched,\n isBlurred,\n isPristine,\n isDefaultValue,\n isDirty,\n } as FormState<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer\n >\n\n // Only run transform if state has shallowly changed - IE how React.useEffect works\n const transformArray = this.options.transform?.deps ?? []\n const shouldTransform =\n transformArray.length !== this.prevTransformArray.length ||\n transformArray.some((val, i) => val !== this.prevTransformArray[i])\n\n if (shouldTransform) {\n const newObj = Object.assign({}, this, { state })\n // This mutates the state\n this.options.transform?.fn(newObj)\n state = newObj.state\n this.prevTransformArray = transformArray\n }\n\n return state\n },\n })\n\n this.handleSubmit = this.handleSubmit.bind(this)\n\n this.update(opts || {})\n\n this.store.subscribe(() => {\n formEventClient.emit('form-state-change', {\n id: this._formId,\n state: this.store.state,\n options: this.options,\n })\n })\n\n formEventClient.on('request-form-state', (e) => {\n if (e.payload.id === this._formId) {\n formEventClient.emit('form-state-change', {\n id: this._formId,\n state: this.store.state,\n options: this.options,\n })\n }\n })\n\n formEventClient.on('request-form-reset', (e) => {\n if (e.payload.id === this._formId) {\n this.reset()\n }\n })\n\n formEventClient.on('request-form-force-submit', (e) => {\n if (e.payload.id === this._formId) {\n this._devtoolsSubmissionOverride = true\n this.handleSubmit()\n this._devtoolsSubmissionOverride = false\n }\n })\n }\n\n get formId(): string {\n return this._formId\n }\n\n /**\n * @private\n */\n runValidator<\n TValue extends TStandardSchemaValidatorValue<TFormData> & {\n formApi: AnyFormApi\n },\n TType extends 'validate' | 'validateAsync',\n >(props: {\n validate: TType extends 'validate'\n ? FormValidateOrFn<TFormData>\n : FormAsyncValidateOrFn<TFormData>\n value: TValue\n type: TType\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 FormValidateFn<any>)(props.value) as never\n }\n\n mount = () => {\n const cleanupFieldMetaDerived = this.fieldMetaDerived.mount()\n const cleanupStoreDerived = this.store.mount()\n const cleanup = () => {\n cleanupFieldMetaDerived()\n cleanupStoreDerived()\n\n // broadcast form unmount for devtools\n formEventClient.emit('form-unmounted', {\n id: this._formId,\n })\n }\n\n this.options.listeners?.onMount?.({ formApi: this })\n\n const { onMount } = this.options.validators || {}\n\n // broadcast form state for devtools on mounting\n formEventClient.emit('form-state-change', {\n id: this._formId,\n state: this.store.state,\n options: this.options,\n })\n\n // if no validation skip\n if (!onMount) return cleanup\n\n // validate\n this.validateSync('mount')\n return cleanup\n }\n\n /**\n * Updates the form options and form state.\n */\n update = (\n options?: FormOptions<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >,\n ) => {\n if (!options) return\n\n const oldOptions = this.options\n\n // Options need to be updated first so that when the store is updated, the state is correct for the derived state\n this.options = options\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n const shouldUpdateReeval = !!options.transform?.deps?.some(\n (val, i) => val !== this.prevTransformArray[i],\n )\n\n const shouldUpdateValues =\n options.defaultValues &&\n !evaluate(options.defaultValues, oldOptions.defaultValues) &&\n !this.state.isTouched\n\n const shouldUpdateState =\n !evaluate(options.defaultState, oldOptions.defaultState) &&\n !this.state.isTouched\n\n if (!shouldUpdateValues && !shouldUpdateState && !shouldUpdateReeval) return\n\n batch(() => {\n this.baseStore.setState(() =>\n getDefaultFormState(\n Object.assign(\n {},\n this.state as any,\n\n shouldUpdateState ? options.defaultState : {},\n\n shouldUpdateValues\n ? {\n values: options.defaultValues,\n }\n : {},\n\n shouldUpdateReeval\n ? { _force_re_eval: !this.state._force_re_eval }\n : {},\n ),\n ),\n )\n })\n }\n\n /**\n * Resets the form state to the default values.\n * If values are provided, the form will be reset to those values instead and the default values will be updated.\n *\n * @param values - Optional values to reset the form to.\n * @param opts - Optional options to control the reset behavior.\n */\n reset = (values?: TFormData, opts?: { keepDefaultValues?: boolean }) => {\n const { fieldMeta: currentFieldMeta } = this.state\n const fieldMetaBase = this.resetFieldMeta(currentFieldMeta)\n\n if (values && !opts?.keepDefaultValues) {\n this.options = {\n ...this.options,\n defaultValues: values,\n }\n }\n\n this.baseStore.setState(() =>\n getDefaultFormState({\n ...(this.options.defaultState as any),\n values:\n values ??\n this.options.defaultValues ??\n this.options.defaultState?.values,\n fieldMetaBase,\n }),\n )\n }\n\n /**\n * Validates all fields using the correct handlers for a given validation cause.\n */\n validateAllFields = async (cause: ValidationCause) => {\n const fieldValidationPromises: Promise<ValidationError[]>[] = [] as any\n batch(() => {\n void (Object.values(this.fieldInfo) as FieldInfo<any>[]).forEach(\n (field) => {\n if (!field.instance) return\n const fieldInstance = field.instance\n // Validate the field\n fieldValidationPromises.push(\n // Remember, `validate` is either a sync operation or a promise\n Promise.resolve().then(() =>\n fieldInstance.validate(cause, { skipFormValidation: true }),\n ),\n )\n // If any fields are not touched\n if (!field.instance.state.meta.isTouched) {\n // Mark them as touched\n field.instance.setMeta((prev) => ({ ...prev, isTouched: true }))\n }\n },\n )\n })\n\n const fieldErrorMapMap = await Promise.all(fieldValidationPromises)\n return fieldErrorMapMap.flat()\n }\n\n /**\n * Validates the children of a specified array in the form starting from a given index until the end using the correct handlers for a given validation type.\n */\n validateArrayFieldsStartingFrom = async <\n TField extends DeepKeysOfType<TFormData, any[]>,\n >(\n field: TField,\n index: number,\n cause: ValidationCause,\n ) => {\n const currentValue = this.getFieldValue(field)\n\n const lastIndex = Array.isArray(currentValue)\n ? Math.max((currentValue as Array<unknown>).length - 1, 0)\n : null\n\n // We have to validate all fields that have shifted (at least the current field)\n const fieldKeysToValidate = [`${field}[${index}]`]\n for (let i = index + 1; i <= (lastIndex ?? 0); i++) {\n fieldKeysToValidate.push(`${field}[${i}]`)\n }\n\n // We also have to include all fields that are nested in the shifted fields\n const fieldsToValidate = Object.keys(this.fieldInfo).filter((fieldKey) =>\n fieldKeysToValidate.some((key) => fieldKey.startsWith(key)),\n ) as DeepKeys<TFormData>[]\n\n // Validate the fields\n const fieldValidationPromises: Promise<ValidationError[]>[] = [] as any\n batch(() => {\n fieldsToValidate.forEach((nestedField) => {\n fieldValidationPromises.push(\n Promise.resolve().then(() => this.validateField(nestedField, cause)),\n )\n })\n })\n\n const fieldErrorMapMap = await Promise.all(fieldValidationPromises)\n return fieldErrorMapMap.flat()\n }\n\n /**\n * Validates a specified field in the form using the correct handlers for a given validation type.\n */\n validateField = <TField extends DeepKeys<TFormData>>(\n field: TField,\n cause: ValidationCause,\n ) => {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n const fieldInstance = this.fieldInfo[field]?.instance\n if (!fieldInstance) return []\n\n // If the field is not touched (same logic as in validateAllFields)\n if (!fieldInstance.state.meta.isTouched) {\n // Mark it as touched\n fieldInstance.setMeta((prev) => ({ ...prev, isTouched: true }))\n }\n\n return fieldInstance.validate(cause)\n }\n\n /**\n * TODO: This code is copied from FieldApi, we should refactor to share\n * @private\n */\n validateSync = (\n cause: ValidationCause,\n ): {\n hasErrored: boolean\n fieldsErrorMap: FormErrorMapFromValidator<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync\n >\n } => {\n const validates = getSyncValidatorArray(cause, {\n ...this.options,\n form: this,\n validationLogic: this.options.validationLogic || defaultValidationLogic,\n })\n\n let hasErrored = false as boolean\n\n // This map will only include fields that have errors in the current validation cycle\n const currentValidationErrorMap: FormErrorMapFromValidator<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync\n > = {}\n\n batch(() => {\n for (const validateObj of validates) {\n if (!validateObj.validate) continue\n\n const rawError = this.runValidator({\n validate: validateObj.validate,\n value: {\n value: this.state.values,\n formApi: this,\n validationSource: 'form',\n },\n type: 'validate',\n })\n\n const { formError, fieldErrors } = normalizeError<TFormData>(rawError)\n\n const errorMapKey = getErrorMapKey(validateObj.cause)\n\n for (const field of Object.keys(\n this.state.fieldMeta,\n ) as DeepKeys<TFormData>[]) {\n const fieldMeta = this.getFieldMeta(field)\n if (!fieldMeta) continue\n\n const {\n errorMap: currentErrorMap,\n errorSourceMap: currentErrorMapSource,\n } = fieldMeta\n\n const newFormValidatorError = fieldErrors?.[field]\n\n const { newErrorValue, newSource } =\n determineFormLevelErrorSourceAndValue({\n newFormValidatorError,\n isPreviousErrorFromFormValidator:\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n currentErrorMapSource?.[errorMapKey] === 'form',\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n previousErrorValue: currentErrorMap?.[errorMapKey],\n })\n\n if (newSource === 'form') {\n currentValidationErrorMap[field] = {\n ...currentValidationErrorMap[field],\n [errorMapKey]: newFormValidatorError,\n }\n }\n\n if (\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n currentErrorMap?.[errorMapKey] !== newErrorValue\n ) {\n this.setFieldMeta(field, (prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n [errorMapKey]: newErrorValue,\n },\n errorSourceMap: {\n ...prev.errorSourceMap,\n [errorMapKey]: newSource,\n },\n }))\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (this.state.errorMap?.[errorMapKey] !== formError) {\n this.baseStore.setState((prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n [errorMapKey]: formError,\n },\n }))\n }\n\n if (formError || fieldErrors) {\n hasErrored = true\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 if (\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n this.state.errorMap?.[submitErrKey] &&\n cause !== 'submit' &&\n !hasErrored\n ) {\n this.baseStore.setState((prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n [submitErrKey]: undefined,\n },\n }))\n }\n\n /**\n * when we have an error for onServer 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 serverErrKey = getErrorMapKey('server')\n if (\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n this.state.errorMap?.[serverErrKey] &&\n cause !== 'server' &&\n !hasErrored\n ) {\n this.baseStore.setState((prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n [serverErrKey]: undefined,\n },\n }))\n }\n })\n\n return { hasErrored, fieldsErrorMap: currentValidationErrorMap }\n }\n\n /**\n * @private\n */\n validateAsync = async (\n cause: ValidationCause,\n ): Promise<\n FormErrorMapFromValidator<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync\n >\n > => {\n const validates = getAsyncValidatorArray(cause, {\n ...this.options,\n form: this,\n validationLogic: this.options.validationLogic || defaultValidationLogic,\n })\n\n if (!this.state.isFormValidating) {\n this.baseStore.setState((prev) => ({ ...prev, isFormValidating: 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 promises: Promise<ValidationPromiseResult<TFormData>>[] = []\n\n let fieldErrorsFromFormValidators:\n | Partial<Record<DeepKeys<TFormData>, ValidationError>>\n | undefined\n\n for (const validateObj of validates) {\n if (!validateObj.validate) continue\n const key = getErrorMapKey(validateObj.cause)\n const fieldValidatorMeta = this.state.validationMetaMap[key]\n\n fieldValidatorMeta?.lastAbortController.abort()\n const controller = new AbortController()\n\n this.state.validationMetaMap[key] = {\n lastAbortController: controller,\n }\n\n promises.push(\n new Promise<ValidationPromiseResult<TFormData>>(async (resolve) => {\n let rawError!:\n | ValidationError\n | FormValidationError<unknown>\n | undefined\n try {\n rawError = await new Promise((rawResolve, rawReject) => {\n 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: this.state.values,\n formApi: this,\n validationSource: 'form',\n signal: controller.signal,\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 const { formError, fieldErrors: fieldErrorsFromNormalizeError } =\n normalizeError<TFormData>(rawError)\n\n if (fieldErrorsFromNormalizeError) {\n fieldErrorsFromFormValidators = fieldErrorsFromFormValidators\n ? {\n ...fieldErrorsFromFormValidators,\n ...fieldErrorsFromNormalizeError,\n }\n : fieldErrorsFromNormalizeError\n }\n const errorMapKey = getErrorMapKey(validateObj.cause)\n\n for (const field of Object.keys(\n this.state.fieldMeta,\n ) as DeepKeys<TFormData>[]) {\n const fieldMeta = this.getFieldMeta(field)\n if (!fieldMeta) continue\n\n const {\n errorMap: currentErrorMap,\n errorSourceMap: currentErrorMapSource,\n } = fieldMeta\n\n const newFormValidatorError = fieldErrorsFromFormValidators?.[field]\n\n const { newErrorValue, newSource } =\n determineFormLevelErrorSourceAndValue({\n newFormValidatorError,\n isPreviousErrorFromFormValidator:\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n currentErrorMapSource?.[errorMapKey] === 'form',\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n previousErrorValue: currentErrorMap?.[errorMapKey],\n })\n\n if (\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n currentErrorMap?.[errorMapKey] !== newErrorValue\n ) {\n this.setFieldMeta(field, (prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n [errorMapKey]: newErrorValue,\n },\n errorSourceMap: {\n ...prev.errorSourceMap,\n [errorMapKey]: newSource,\n },\n }))\n }\n }\n\n this.baseStore.setState((prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n [errorMapKey]: formError,\n },\n }))\n\n resolve(\n fieldErrorsFromFormValidators\n ? { fieldErrors: fieldErrorsFromFormValidators, errorMapKey }\n : undefined,\n )\n }),\n )\n }\n\n let results: ValidationPromiseResult<TFormData>[] = []\n\n const fieldsErrorMap: FormErrorMapFromValidator<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync\n > = {}\n if (promises.length) {\n results = await Promise.all(promises)\n for (const fieldValidationResult of results) {\n if (fieldValidationResult?.fieldErrors) {\n const { errorMapKey } = fieldValidationResult\n\n for (const [field, fieldError] of Object.entries(\n fieldValidationResult.fieldErrors,\n )) {\n const oldErrorMap =\n fieldsErrorMap[field as DeepKeys<TFormData>] || {}\n const newErrorMap = {\n ...oldErrorMap,\n [errorMapKey]: fieldError,\n }\n fieldsErrorMap[field as DeepKeys<TFormData>] = newErrorMap\n }\n }\n }\n }\n\n this.baseStore.setState((prev) => ({\n ...prev,\n isFormValidating: false,\n }))\n\n return fieldsErrorMap\n }\n\n /**\n * @private\n */\n validate = (\n cause: ValidationCause,\n ):\n | FormErrorMapFromValidator<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync\n >\n | Promise<\n FormErrorMapFromValidator<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync\n >\n > => {\n // Attempt to sync validate first\n const { hasErrored, fieldsErrorMap } = this.validateSync(cause)\n\n if (hasErrored && !this.options.asyncAlways) {\n return fieldsErrorMap\n }\n\n // No error? Attempt async validation\n return this.validateAsync(cause)\n }\n\n /**\n * Handles the form submission, performs validation, and calls the appropriate onSubmit or onSubmitInvalid callbacks.\n */\n handleSubmit(): Promise<void>\n handleSubmit(submitMeta: TSubmitMeta): Promise<void>\n async handleSubmit(submitMeta?: TSubmitMeta): Promise<void> {\n this.baseStore.setState((old) => ({\n ...old,\n // Submission attempts mark the form as not submitted\n isSubmitted: false,\n // Count submission attempts\n submissionAttempts: old.submissionAttempts + 1,\n isSubmitSuccessful: false, // Reset isSubmitSuccessful at the start of submission\n }))\n\n batch(() => {\n void (Object.values(this.fieldInfo) as FieldInfo<any>[]).forEach(\n (field) => {\n if (!field.instance) return\n // If any fields are not touched\n if (!field.instance.state.meta.isTouched) {\n // Mark them as touched\n field.instance.setMeta((prev) => ({ ...prev, isTouched: true }))\n }\n },\n )\n })\n\n const submitMetaArg =\n submitMeta ?? (this.options.onSubmitMeta as TSubmitMeta)\n\n if (!this.state.canSubmit && !this._devtoolsSubmissionOverride) {\n this.options.onSubmitInvalid?.({\n value: this.state.values,\n formApi: this,\n meta: submitMetaArg,\n })\n return\n }\n\n this.baseStore.setState((d) => ({ ...d, isSubmitting: true }))\n\n const done = () => {\n this.baseStore.setState((prev) => ({ ...prev, isSubmitting: false }))\n }\n\n await this.validateAllFields('submit')\n\n if (!this.state.isFieldsValid) {\n done()\n\n this.options.onSubmitInvalid?.({\n value: this.state.values,\n formApi: this,\n meta: submitMetaArg,\n })\n\n formEventClient.emit('form-submission-state-change', {\n id: this._formId,\n submissionAttempt: this.state.submissionAttempts,\n successful: false,\n stage: 'validateAllFields',\n errors: (Object.values(this.state.fieldMeta) as AnyFieldMeta[])\n .map((meta: AnyFieldMeta) => meta.errors)\n .flat(),\n })\n return\n }\n\n await this.validate('submit')\n\n // Fields are invalid, do not submit\n if (!this.state.isValid) {\n done()\n\n this.options.onSubmitInvalid?.({\n value: this.state.values,\n formApi: this,\n meta: submitMetaArg,\n })\n\n formEventClient.emit('form-submission-state-change', {\n id: this._formId,\n submissionAttempt: this.state.submissionAttempts,\n successful: false,\n stage: 'validate',\n errors: this.state.errors,\n })\n\n return\n }\n\n batch(() => {\n void (Object.values(this.fieldInfo) as FieldInfo<TFormData>[]).forEach(\n (field) => {\n field.instance?.options.listeners?.onSubmit?.({\n value: field.instance.state.value,\n fieldApi: field.instance,\n })\n },\n )\n })\n\n this.options.listeners?.onSubmit?.({ formApi: this, meta: submitMetaArg })\n\n try {\n // Run the submit code\n await this.options.onSubmit?.({\n value: this.state.values,\n formApi: this,\n meta: submitMetaArg,\n })\n\n batch(() => {\n this.baseStore.setState((prev) => ({\n ...prev,\n isSubmitted: true,\n isSubmitSuccessful: true, // Set isSubmitSuccessful to true on successful submission\n }))\n\n formEventClient.emit('form-submission-state-change', {\n id: this._formId,\n submissionAttempt: this.state.submissionAttempts,\n successful: true,\n })\n\n done()\n })\n } catch (err) {\n this.baseStore.setState((prev) => ({\n ...prev,\n isSubmitSuccessful: false, // Ensure isSubmitSuccessful is false if an error occurs\n }))\n\n formEventClient.emit('form-submission-state-change', {\n id: this._formId,\n submissionAttempt: this.state.submissionAttempts,\n successful: false,\n stage: 'inflight',\n onError: err,\n })\n\n done()\n\n throw err\n }\n }\n\n /**\n * Gets the value of the specified field.\n */\n getFieldValue = <TField extends DeepKeys<TFormData>>(\n field: TField,\n ): DeepValue<TFormData, TField> => getBy(this.state.values, field)\n\n /**\n * Gets the metadata of the specified field.\n */\n getFieldMeta = <TField extends DeepKeys<TFormData>>(\n field: TField,\n ): AnyFieldMeta | undefined => {\n return this.state.fieldMeta[field]\n }\n\n /**\n * Gets the field info of the specified field.\n */\n getFieldInfo = <TField extends DeepKeys<TFormData>>(\n field: TField,\n ): FieldInfo<TFormData> => {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n return (this.fieldInfo[field] ||= {\n instance: null,\n validationMetaMap: {\n onChange: undefined,\n onBlur: undefined,\n onSubmit: undefined,\n onMount: undefined,\n onServer: undefined,\n onDynamic: undefined,\n },\n })\n }\n\n /**\n * Updates the metadata of the specified field.\n */\n setFieldMeta = <TField extends DeepKeys<TFormData>>(\n field: TField,\n updater: Updater<AnyFieldMetaBase>,\n ) => {\n this.baseStore.setState((prev) => {\n return {\n ...prev,\n fieldMetaBase: {\n ...prev.fieldMetaBase,\n [field]: functionalUpdate(\n updater,\n prev.fieldMetaBase[field] as never,\n ),\n },\n }\n })\n }\n\n /**\n * resets every field's meta\n */\n resetFieldMeta = <TField extends DeepKeys<TFormData>>(\n fieldMeta: Record<TField, AnyFieldMeta>,\n ): Record<TField, AnyFieldMeta> => {\n return Object.keys(fieldMeta).reduce(\n (acc: Record<TField, AnyFieldMeta>, key) => {\n const fieldKey = key as TField\n acc[fieldKey] = defaultFieldMeta\n return acc\n },\n {} as Record<TField, AnyFieldMeta>,\n )\n }\n\n /**\n * Sets the value of the specified field and optionally updates the touched state.\n */\n setFieldValue = <TField extends DeepKeys<TFormData>>(\n field: TField,\n updater: Updater<DeepValue<TFormData, TField>>,\n opts?: UpdateMetaOptions,\n ) => {\n const dontUpdateMeta = opts?.dontUpdateMeta ?? false\n const dontRunListeners = opts?.dontRunListeners ?? false\n const dontValidate = opts?.dontValidate ?? false\n\n batch(() => {\n if (!dontUpdateMeta) {\n this.setFieldMeta(field, (prev) => ({\n ...prev,\n isTouched: true,\n isDirty: true,\n errorMap: {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n ...prev?.errorMap,\n onMount: undefined,\n },\n }))\n }\n\n this.baseStore.setState((prev) => {\n return {\n ...prev,\n values: setBy(prev.values, field, updater),\n }\n })\n })\n\n if (!dontRunListeners) {\n this.getFieldInfo(field).instance?.triggerOnChangeListener()\n }\n\n if (!dontValidate) {\n this.validateField(field, 'change')\n }\n }\n\n deleteField = <TField extends DeepKeys<TFormData>>(field: TField) => {\n const subFieldsToDelete = Object.keys(this.fieldInfo).filter((f) => {\n const fieldStr = field.toString()\n return f !== fieldStr && f.startsWith(fieldStr)\n })\n\n const fieldsToDelete = [...subFieldsToDelete, field]\n\n // Cleanup the last fields\n this.baseStore.setState((prev) => {\n const newState = { ...prev }\n fieldsToDelete.forEach((f) => {\n newState.values = deleteBy(newState.values, f)\n delete this.fieldInfo[f as never]\n delete newState.fieldMetaBase[f as never]\n })\n\n return newState\n })\n }\n\n /**\n * Pushes a value into an array field.\n */\n pushFieldValue = <TField extends DeepKeysOfType<TFormData, any[]>>(\n field: TField,\n value: DeepValue<TFormData, TField> extends any[]\n ? DeepValue<TFormData, TField>[number]\n : never,\n options?: UpdateMetaOptions,\n ) => {\n this.setFieldValue(\n field,\n (prev) => [...(Array.isArray(prev) ? prev : []), value] as any,\n options,\n )\n }\n\n insertFieldValue = async <TField extends DeepKeysOfType<TFormData, any[]>>(\n field: TField,\n index: number,\n value: DeepValue<TFormData, TField> extends any[]\n ? DeepValue<TFormData, TField>[number]\n : never,\n options?: UpdateMetaOptions,\n ) => {\n this.setFieldValue(\n field,\n (prev) => {\n return [\n ...(prev as DeepValue<TFormData, TField>[]).slice(0, index),\n value,\n ...(prev as DeepValue<TFormData, TField>[]).slice(index),\n ] as any\n },\n mergeOpts(options, { dontValidate: true }),\n )\n\n // Validate the whole array + all fields that have shifted\n await this.validateField(field, 'change')\n\n // Shift down all meta after validating to make sure the new field has been mounted\n metaHelper(this).handleArrayFieldMetaShift(field, index, 'insert')\n\n await this.validateArrayFieldsStartingFrom(field, index, 'change')\n }\n\n /**\n * Replaces a value into an array field at the specified index.\n */\n replaceFieldValue = async <TField extends DeepKeysOfType<TFormData, any[]>>(\n field: TField,\n index: number,\n value: DeepValue<TFormData, TField> extends any[]\n ? DeepValue<TFormData, TField>[number]\n : never,\n options?: UpdateMetaOptions,\n ) => {\n this.setFieldValue(\n field,\n (prev) => {\n return (prev as DeepValue<TFormData, TField>[]).map((d, i) =>\n i === index ? value : d,\n ) as any\n },\n mergeOpts(options, { dontValidate: true }),\n )\n\n // Validate the whole array + all fields that have shifted\n await this.validateField(field, 'change')\n await this.validateArrayFieldsStartingFrom(field, index, 'change')\n }\n\n /**\n * Removes a value from an array field at the specified index.\n */\n removeFieldValue = async <TField extends DeepKeysOfType<TFormData, any[]>>(\n field: TField,\n index: number,\n options?: UpdateMetaOptions,\n ) => {\n const fieldValue = this.getFieldValue(field)\n\n const lastIndex = Array.isArray(fieldValue)\n ? Math.max((fieldValue as Array<unknown>).length - 1, 0)\n : null\n\n this.setFieldValue(\n field,\n (prev) => {\n return (prev as DeepValue<TFormData, TField>[]).filter(\n (_d, i) => i !== index,\n ) as any\n },\n mergeOpts(options, { dontValidate: true }),\n )\n\n // Shift up all meta\n metaHelper(this).handleArrayFieldMetaShift(field, index, 'remove')\n\n if (lastIndex !== null) {\n const start = `${field}[${lastIndex}]`\n this.deleteField(start as never)\n }\n\n // Validate the whole array + all fields that have shifted\n await this.validateField(field, 'change')\n await this.validateArrayFieldsStartingFrom(field, index, 'change')\n }\n\n /**\n * Swaps the values at the specified indices within an array field.\n */\n swapFieldValues = <TField extends DeepKeysOfType<TFormData, any[]>>(\n field: TField,\n index1: number,\n index2: number,\n options?: UpdateMetaOptions,\n ) => {\n this.setFieldValue(\n field,\n (prev: any) => {\n const prev1 = prev[index1]!\n const prev2 = prev[index2]!\n return setBy(setBy(prev, `${index1}`, prev2), `${index2}`, prev1)\n },\n mergeOpts(options, { dontValidate: true }),\n )\n\n // Swap meta\n metaHelper(this).handleArrayFieldMetaShift(field, index1, 'swap', index2)\n\n // Validate the whole array\n this.validateField(field, 'change')\n // Validate the swapped fields\n this.validateField(`${field}[${index1}]` as DeepKeys<TFormData>, 'change')\n this.validateField(`${field}[${index2}]` as DeepKeys<TFormData>, 'change')\n }\n\n /**\n * Moves the value at the first specified index to the second specified index within an array field.\n */\n moveFieldValues = <TField extends DeepKeysOfType<TFormData, any[]>>(\n field: TField,\n index1: number,\n index2: number,\n options?: UpdateMetaOptions,\n ) => {\n this.setFieldValue(\n field,\n (prev: any) => {\n const next: any = [...prev]\n next.splice(index2, 0, next.splice(index1, 1)[0])\n return next\n },\n mergeOpts(options, { dontValidate: true }),\n )\n\n // Move meta between index1 and index2\n metaHelper(this).handleArrayFieldMetaShift(field, index1, 'move', index2)\n\n // Validate the whole array\n this.validateField(field, 'change')\n // Validate the moved fields\n this.validateField(`${field}[${index1}]` as DeepKeys<TFormData>, 'change')\n this.validateField(`${field}[${index2}]` as DeepKeys<TFormData>, 'change')\n }\n\n /**\n * Clear all values within an array field.\n */\n clearFieldValues = <TField extends DeepKeysOfType<TFormData, any[]>>(\n field: TField,\n options?: UpdateMetaOptions,\n ) => {\n const fieldValue = this.getFieldValue(field)\n\n const lastIndex = Array.isArray(fieldValue)\n ? Math.max((fieldValue as unknown[]).length - 1, 0)\n : null\n\n this.setFieldValue(\n field,\n [] as any,\n mergeOpts(options, { dontValidate: true }),\n )\n\n if (lastIndex !== null) {\n for (let i = 0; i <= lastIndex; i++) {\n const fieldKey = `${field}[${i}]`\n this.deleteField(fieldKey as never)\n }\n }\n\n // validate array change\n this.validateField(field, 'change')\n }\n\n /**\n * Resets the field value and meta to default state\n */\n resetField = <TField extends DeepKeys<TFormData>>(field: TField) => {\n this.baseStore.setState((prev) => {\n return {\n ...prev,\n fieldMetaBase: {\n ...prev.fieldMetaBase,\n [field]: defaultFieldMeta,\n },\n values: this.options.defaultValues\n ? setBy(prev.values, field, getBy(this.options.defaultValues, field))\n : prev.values,\n }\n })\n }\n\n /**\n * Updates the form's errorMap\n */\n setErrorMap(\n errorMap: FormValidationErrorMap<\n TFormData,\n UnwrapFormValidateOrFn<TOnMount>,\n UnwrapFormValidateOrFn<TOnChange>,\n UnwrapFormAsyncValidateOrFn<TOnChangeAsync>,\n UnwrapFormValidateOrFn<TOnBlur>,\n UnwrapFormAsyncValidateOrFn<TOnBlurAsync>,\n UnwrapFormValidateOrFn<TOnSubmit>,\n UnwrapFormAsyncValidateOrFn<TOnSubmitAsync>,\n UnwrapFormValidateOrFn<TOnDynamic>,\n UnwrapFormAsyncValidateOrFn<TOnDynamicAsync>,\n UnwrapFormAsyncValidateOrFn<TOnServer>\n >,\n ) {\n batch(() => {\n Object.entries(errorMap).forEach(([key, value]) => {\n const errorMapKey = key as ValidationErrorMapKeys\n\n if (isGlobalFormValidationError(value)) {\n const { formError, fieldErrors } = normalizeError<TFormData>(value)\n\n for (const fieldName of Object.keys(\n this.fieldInfo,\n ) as DeepKeys<TFormData>[]) {\n const fieldMeta = this.getFieldMeta(fieldName)\n if (!fieldMeta) continue\n\n this.setFieldMeta(fieldName, (prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n [errorMapKey]: fieldErrors?.[fieldName],\n },\n errorSourceMap: {\n ...prev.errorSourceMap,\n [errorMapKey]: 'form',\n },\n }))\n }\n\n this.baseStore.setState((prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n [errorMapKey]: formError,\n },\n }))\n } else {\n this.baseStore.setState((prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n [errorMapKey]: value,\n },\n }))\n }\n })\n })\n }\n\n /**\n * Returns form and field level errors\n */\n getAllErrors = (): {\n form: {\n errors: Array<\n | UnwrapFormValidateOrFn<TOnMount>\n | UnwrapFormValidateOrFn<TOnChange>\n | UnwrapFormAsyncValidateOrFn<TOnChangeAsync>\n | UnwrapFormValidateOrFn<TOnBlur>\n | UnwrapFormAsyncValidateOrFn<TOnBlurAsync>\n | UnwrapFormValidateOrFn<TOnSubmit>\n | UnwrapFormAsyncValidateOrFn<TOnSubmitAsync>\n | UnwrapFormValidateOrFn<TOnDynamic>\n | UnwrapFormAsyncValidateOrFn<TOnDynamicAsync>\n | UnwrapFormAsyncValidateOrFn<TOnServer>\n >\n errorMap: ValidationErrorMap<\n UnwrapFormValidateOrFn<TOnMount>,\n UnwrapFormValidateOrFn<TOnChange>,\n UnwrapFormAsyncValidateOrFn<TOnChangeAsync>,\n UnwrapFormValidateOrFn<TOnBlur>,\n UnwrapFormAsyncValidateOrFn<TOnBlurAsync>,\n UnwrapFormValidateOrFn<TOnSubmit>,\n UnwrapFormAsyncValidateOrFn<TOnSubmitAsync>,\n UnwrapFormValidateOrFn<TOnDynamic>,\n UnwrapFormAsyncValidateOrFn<TOnDynamicAsync>,\n UnwrapFormAsyncValidateOrFn<TOnServer>\n >\n }\n fields: Record<\n DeepKeys<TFormData>,\n { errors: ValidationError[]; errorMap: ValidationErrorMap }\n >\n } => {\n return {\n form: {\n errors: this.state.errors,\n errorMap: this.state.errorMap,\n },\n fields: Object.entries(this.state.fieldMeta).reduce(\n (acc, [fieldName, fieldMeta]) => {\n if (\n Object.keys(fieldMeta as AnyFieldMeta).length &&\n (fieldMeta as AnyFieldMeta).errors.length\n ) {\n acc[fieldName as DeepKeys<TFormData>] = {\n errors: (fieldMeta as AnyFieldMeta).errors,\n errorMap: (fieldMeta as AnyFieldMeta).errorMap,\n }\n }\n\n return acc\n },\n {} as Record<\n DeepKeys<TFormData>,\n { errors: ValidationError[]; errorMap: ValidationErrorMap }\n >,\n ),\n }\n }\n\n /**\n * Parses the form's values with a given standard schema and returns\n * issues (if any). This method does NOT set any internal errors.\n * @param schema The standard schema to parse the form values with.\n */\n parseValuesWithSchema = (schema: StandardSchemaV1<TFormData, unknown>) => {\n return standardSchemaValidators.validate(\n { value: this.state.values, validationSource: 'form' },\n schema,\n )\n }\n\n /**\n * Parses the form's values with a given standard schema and returns\n * issues (if any). This method does NOT set any internal errors.\n * @param schema The standard schema to parse the form values with.\n */\n parseValuesWithSchemaAsync = (\n schema: StandardSchemaV1<TFormData, unknown>,\n ) => {\n return standardSchemaValidators.validateAsync(\n { value: this.state.values, validationSource: 'form' },\n schema,\n )\n }\n}\n\nfunction normalizeError<TFormData>(rawError?: FormValidationError<unknown>): {\n formError: ValidationError\n fieldErrors?: Partial<Record<DeepKeys<TFormData>, ValidationError>>\n} {\n if (rawError) {\n if (isGlobalFormValidationError(rawError)) {\n const formError = normalizeError(rawError.form).formError\n const fieldErrors = rawError.fields\n return { formError, fieldErrors } as never\n }\n\n return { formError: rawError }\n }\n\n return { formError: 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 'dynamic':\n return 'onDynamic'\n case 'change':\n default:\n return 'onChange'\n }\n}\n"],"names":["formEventClient","evaluate","batch","opts","getSyncValidatorArray","defaultValidationLogic","determineFormLevelErrorSourceAndValue","getAsyncValidatorArray","getBy","functionalUpdate","defaultFieldMeta","setBy","deleteBy","mergeOpts","metaHelper","standardSchemaValidators","uuid","Store","Derived","isNonEmptyArray","isGlobalFormValidationError","isStandardSchemaValidator"],"mappings":"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"}
1
+ {"version":3,"file":"FormApi.cjs","sources":["../../src/FormApi.ts"],"sourcesContent":["import { Derived, Store, batch } from '@tanstack/store'\n\nimport {\n deleteBy,\n determineFormLevelErrorSourceAndValue,\n evaluate,\n functionalUpdate,\n getAsyncValidatorArray,\n getBy,\n getSyncValidatorArray,\n isGlobalFormValidationError,\n isNonEmptyArray,\n mergeOpts,\n setBy,\n uuid,\n} from './utils'\nimport { defaultValidationLogic } from './ValidationLogic'\n\nimport {\n isStandardSchemaValidator,\n standardSchemaValidators,\n} from './standardSchemaValidator'\nimport { defaultFieldMeta, metaHelper } from './metaHelper'\nimport { formEventClient } from './EventClient'\nimport type {\n RequestFormForceReset,\n RequestFormReset,\n RequestFormState,\n} from './EventClient'\nimport type { ValidationLogicFn } from './ValidationLogic'\nimport type {\n StandardSchemaV1,\n StandardSchemaV1Issue,\n TStandardSchemaValidatorValue,\n} from './standardSchemaValidator'\nimport type {\n AnyFieldApi,\n AnyFieldMeta,\n AnyFieldMetaBase,\n FieldApi,\n} from './FieldApi'\nimport type {\n ExtractGlobalFormError,\n FieldManipulator,\n FormValidationError,\n FormValidationErrorMap,\n ListenerCause,\n UpdateMetaOptions,\n ValidationCause,\n ValidationError,\n ValidationErrorMap,\n ValidationErrorMapKeys,\n} from './types'\nimport type { DeepKeys, DeepKeysOfType, DeepValue } from './util-types'\nimport type { Updater } from './utils'\n\n/**\n * @private\n */\n// TODO: Add the `Unwrap` type to the errors\ntype FormErrorMapFromValidator<\n TFormData,\n TOnMount extends undefined | FormValidateOrFn<TFormData>,\n TOnChange extends undefined | FormValidateOrFn<TFormData>,\n TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n> = Partial<\n Record<\n DeepKeys<TFormData>,\n ValidationErrorMap<\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync\n >\n >\n>\n\nexport type FormValidateFn<TFormData> = (props: {\n value: TFormData\n formApi: FormApi<\n TFormData,\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 >\n}) => unknown\n\n/**\n * @private\n */\nexport type FormValidateOrFn<TFormData> =\n | FormValidateFn<TFormData>\n | StandardSchemaV1<TFormData, unknown>\n\nexport type UnwrapFormValidateOrFn<\n TValidateOrFn extends undefined | FormValidateOrFn<any>,\n> = [TValidateOrFn] extends [FormValidateFn<any>]\n ? ExtractGlobalFormError<ReturnType<TValidateOrFn>>\n : [TValidateOrFn] extends [StandardSchemaV1<any, any>]\n ? Record<string, StandardSchemaV1Issue[]>\n : undefined\n\n/**\n * @private\n */\nexport type FormValidateAsyncFn<TFormData> = (props: {\n value: TFormData\n formApi: FormApi<\n TFormData,\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 >\n signal: AbortSignal\n}) => unknown | Promise<unknown>\n\nexport type FormValidator<TFormData, TType, TFn = unknown> = {\n validate(options: { value: TType }, fn: TFn): ValidationError\n validateAsync(\n options: { value: TType },\n fn: TFn,\n ): Promise<FormValidationError<TFormData>>\n}\n\ntype ValidationPromiseResult<TFormData> =\n | {\n fieldErrors: Partial<Record<DeepKeys<TFormData>, ValidationError>>\n errorMapKey: ValidationErrorMapKeys\n }\n | undefined\n\n/**\n * @private\n */\nexport type FormAsyncValidateOrFn<TFormData> =\n | FormValidateAsyncFn<TFormData>\n | StandardSchemaV1<TFormData, unknown>\n\nexport type UnwrapFormAsyncValidateOrFn<\n TValidateOrFn extends undefined | FormAsyncValidateOrFn<any>,\n> = [TValidateOrFn] extends [FormValidateAsyncFn<any>]\n ? ExtractGlobalFormError<Awaited<ReturnType<TValidateOrFn>>>\n : [TValidateOrFn] extends [StandardSchemaV1<any, any>]\n ? Record<string, StandardSchemaV1Issue[]>\n : undefined\n\nexport interface FormValidators<\n TFormData,\n TOnMount extends undefined | FormValidateOrFn<TFormData>,\n TOnChange extends undefined | FormValidateOrFn<TFormData>,\n TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n> {\n /**\n * Optional function that fires as soon as the component mounts.\n */\n onMount?: TOnMount\n /**\n * Optional function that checks the validity of your data whenever a value changes\n */\n onChange?: TOnChange\n /**\n * Optional onChange asynchronous counterpart to onChange. Useful for more complex validation logic that might involve server requests.\n */\n onChangeAsync?: TOnChangeAsync\n /**\n * The default time in milliseconds that 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 * Optional function that validates the form data when a field loses focus, returns a `FormValidationError`\n */\n onBlur?: TOnBlur\n /**\n * Optional onBlur asynchronous validation method for when a field loses focus returns a ` FormValidationError` or a promise of `Promise<FormValidationError>`\n */\n onBlurAsync?: TOnBlurAsync\n /**\n * The default time in milliseconds that 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 onSubmit?: TOnSubmit\n onSubmitAsync?: TOnSubmitAsync\n onDynamic?: TOnDynamic\n onDynamicAsync?: TOnDynamicAsync\n onDynamicAsyncDebounceMs?: number\n}\n\n/**\n * @private\n */\nexport interface FormTransform<\n TFormData,\n TOnMount extends undefined | FormValidateOrFn<TFormData>,\n TOnChange extends undefined | FormValidateOrFn<TFormData>,\n TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n TSubmitMeta = never,\n> {\n fn: (\n formBase: FormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >,\n ) => FormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >\n deps: unknown[]\n}\n\nexport interface FormListeners<\n TFormData,\n TOnMount extends undefined | FormValidateOrFn<TFormData>,\n TOnChange extends undefined | FormValidateOrFn<TFormData>,\n TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n TSubmitMeta = never,\n> {\n onChange?: (props: {\n formApi: FormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >\n fieldApi: AnyFieldApi\n }) => void\n onChangeDebounceMs?: number\n\n onBlur?: (props: {\n formApi: FormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >\n fieldApi: AnyFieldApi\n }) => void\n onBlurDebounceMs?: number\n\n onMount?: (props: {\n formApi: FormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >\n }) => void\n\n onSubmit?: (props: {\n formApi: FormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >\n meta: TSubmitMeta\n }) => void\n}\n\n/**\n * An object representing the base properties of a form, unrelated to any validators\n */\nexport interface BaseFormOptions<in out TFormData, in out TSubmitMeta = never> {\n /**\n * Set initial values for your form.\n */\n defaultValues?: TFormData\n /**\n * onSubmitMeta, the data passed from the handleSubmit handler, to the onSubmit function props\n */\n onSubmitMeta?: TSubmitMeta\n}\n\n/**\n * An object representing the options for a form.\n */\nexport interface FormOptions<\n in out TFormData,\n in out TOnMount extends undefined | FormValidateOrFn<TFormData>,\n in out TOnChange extends undefined | FormValidateOrFn<TFormData>,\n in out TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n in out TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n in out TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n in out TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TSubmitMeta = never,\n> extends BaseFormOptions<TFormData, TSubmitMeta> {\n /**\n * The form name, used for devtools and identification\n */\n formId?: string\n /**\n * The default state for the form.\n */\n defaultState?: Partial<\n FormState<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer\n >\n >\n /**\n * If true, always run async validation, even when sync validation has produced an error. Defaults to undefined.\n */\n asyncAlways?: boolean\n /**\n * Optional time in milliseconds if you want to introduce a delay before firing off an async action.\n */\n asyncDebounceMs?: number\n /**\n * If true, allows the form to be submitted in an invalid state i.e. canSubmit will remain true regardless of validation errors. Defaults to undefined.\n */\n canSubmitWhenInvalid?: boolean\n /**\n * A list of validators to pass to the form\n */\n validators?: FormValidators<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync\n >\n\n validationLogic?: ValidationLogicFn\n\n /**\n * form level listeners\n */\n listeners?: FormListeners<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >\n\n /**\n * A function to be called when the form is submitted, what should happen once the user submits a valid form returns `any` or a promise `Promise<any>`\n */\n onSubmit?: (props: {\n value: TFormData\n formApi: FormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >\n meta: TSubmitMeta\n }) => any | Promise<any>\n /**\n * Specify an action for scenarios where the user tries to submit an invalid form.\n */\n onSubmitInvalid?: (props: {\n value: TFormData\n formApi: FormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >\n meta: TSubmitMeta\n }) => void\n transform?: FormTransform<\n NoInfer<TFormData>,\n NoInfer<TOnMount>,\n NoInfer<TOnChange>,\n NoInfer<TOnChangeAsync>,\n NoInfer<TOnBlur>,\n NoInfer<TOnBlurAsync>,\n NoInfer<TOnSubmit>,\n NoInfer<TOnSubmitAsync>,\n NoInfer<TOnDynamic>,\n NoInfer<TOnDynamicAsync>,\n NoInfer<TOnServer>,\n NoInfer<TSubmitMeta>\n >\n}\n\nexport type AnyFormOptions = FormOptions<\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 representing the validation metadata for a field. Not intended for public usage.\n */\nexport type ValidationMeta = {\n /**\n * An abort controller stored in memory to cancel previous async validation attempts.\n */\n lastAbortController: AbortController\n}\n\n/**\n * An object representing the field information for a specific field within the form.\n */\nexport type FieldInfo<TFormData> = {\n /**\n * An instance of the FieldAPI.\n */\n instance: FieldApi<\n TFormData,\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 any,\n any,\n any\n > | null\n /**\n * A record of field validation internal handling.\n */\n validationMetaMap: Record<ValidationErrorMapKeys, ValidationMeta | undefined>\n}\n\n/**\n * An object representing the current state of the form.\n */\nexport type BaseFormState<\n in out TFormData,\n in out TOnMount extends undefined | FormValidateOrFn<TFormData>,\n in out TOnChange extends undefined | FormValidateOrFn<TFormData>,\n in out TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n in out TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n in out TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n in out TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n> = {\n /**\n * The current values of the form fields.\n */\n values: TFormData\n /**\n * The error map for the form itself.\n */\n errorMap: ValidationErrorMap<\n UnwrapFormValidateOrFn<TOnMount>,\n UnwrapFormValidateOrFn<TOnChange>,\n UnwrapFormAsyncValidateOrFn<TOnChangeAsync>,\n UnwrapFormValidateOrFn<TOnBlur>,\n UnwrapFormAsyncValidateOrFn<TOnBlurAsync>,\n UnwrapFormValidateOrFn<TOnSubmit>,\n UnwrapFormAsyncValidateOrFn<TOnSubmitAsync>,\n UnwrapFormValidateOrFn<TOnDynamic>,\n UnwrapFormAsyncValidateOrFn<TOnDynamicAsync>,\n UnwrapFormAsyncValidateOrFn<TOnServer>\n >\n /**\n * An internal mechanism used for keeping track of validation logic in a form.\n */\n validationMetaMap: Record<ValidationErrorMapKeys, ValidationMeta | undefined>\n /**\n * A record of field metadata for each field in the form, not including the derived properties, like `errors` and such\n */\n fieldMetaBase: Record<DeepKeys<TFormData>, AnyFieldMetaBase>\n /**\n * A boolean indicating if the form is currently in the process of being submitted after `handleSubmit` is called.\n *\n * Goes back to `false` when submission completes for one of the following reasons:\n * - the validation step returned errors.\n * - the `onSubmit` function has completed.\n *\n * Note: if you're running async operations in your `onSubmit` function make sure to await them to ensure `isSubmitting` is set to `false` only when the async operation completes.\n *\n * This is useful for displaying loading indicators or disabling form inputs during submission.\n *\n */\n isSubmitting: boolean\n /**\n * A boolean indicating if the `onSubmit` function has completed successfully.\n *\n * Goes back to `false` at each new submission attempt.\n *\n * Note: you can use isSubmitting to check if the form is currently submitting.\n */\n isSubmitted: boolean\n /**\n * A boolean indicating if the form or any of its fields are currently validating.\n */\n isValidating: boolean\n /**\n * A counter for tracking the number of submission attempts.\n */\n submissionAttempts: number\n /**\n * A boolean indicating if the last submission was successful.\n */\n isSubmitSuccessful: boolean\n /**\n * @private, used to force a re-evaluation of the form state when options change\n */\n _force_re_eval?: boolean\n}\n\nexport type DerivedFormState<\n in out TFormData,\n in out TOnMount extends undefined | FormValidateOrFn<TFormData>,\n in out TOnChange extends undefined | FormValidateOrFn<TFormData>,\n in out TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n in out TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n in out TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n in out TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n> = {\n /**\n * A boolean indicating if the form is currently validating.\n */\n isFormValidating: boolean\n /**\n * A boolean indicating if the form is valid.\n */\n isFormValid: boolean\n /**\n * The error array for the form itself.\n */\n errors: Array<\n | UnwrapFormValidateOrFn<TOnMount>\n | UnwrapFormValidateOrFn<TOnChange>\n | UnwrapFormAsyncValidateOrFn<TOnChangeAsync>\n | UnwrapFormValidateOrFn<TOnBlur>\n | UnwrapFormAsyncValidateOrFn<TOnBlurAsync>\n | UnwrapFormValidateOrFn<TOnSubmit>\n | UnwrapFormAsyncValidateOrFn<TOnSubmitAsync>\n | UnwrapFormValidateOrFn<TOnDynamic>\n | UnwrapFormAsyncValidateOrFn<TOnDynamicAsync>\n | UnwrapFormAsyncValidateOrFn<TOnServer>\n >\n /**\n * A boolean indicating if any of the form fields are currently validating.\n */\n isFieldsValidating: boolean\n /**\n * A boolean indicating if all the form fields are valid. Evaluates `true` if there are no field errors.\n */\n isFieldsValid: boolean\n /**\n * A boolean indicating if any of the form fields have been touched.\n */\n isTouched: boolean\n /**\n * A boolean indicating if any of the form fields have been blurred.\n */\n isBlurred: boolean\n /**\n * A boolean indicating if any of the form's fields' values have been modified by the user. Evaluates `true` if the user have modified at least one of the fields. Opposite of `isPristine`.\n */\n isDirty: boolean\n /**\n * A boolean indicating if none of the form's fields' values have been modified by the user. Evaluates `true` if the user have not modified any of the fields. Opposite of `isDirty`.\n */\n isPristine: boolean\n /**\n * A boolean indicating if all of the form's fields are the same as default values.\n */\n isDefaultValue: boolean\n /**\n * A boolean indicating if the form and all its fields are valid. Evaluates `true` if there are no errors.\n */\n isValid: boolean\n /**\n * A boolean indicating if the form can be submitted based on its current state.\n */\n canSubmit: boolean\n /**\n * A record of field metadata for each field in the form.\n */\n fieldMeta: Record<DeepKeys<TFormData>, AnyFieldMeta>\n}\n\nexport interface FormState<\n in out TFormData,\n in out TOnMount extends undefined | FormValidateOrFn<TFormData>,\n in out TOnChange extends undefined | FormValidateOrFn<TFormData>,\n in out TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n in out TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n in out TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n in out TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n> extends BaseFormState<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer\n >,\n DerivedFormState<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer\n > {}\n\nexport type AnyFormState = FormState<\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n>\n\nfunction getDefaultFormState<\n TFormData,\n TOnMount extends undefined | FormValidateOrFn<TFormData>,\n TOnChange extends undefined | FormValidateOrFn<TFormData>,\n TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n>(\n defaultState: Partial<\n FormState<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer\n >\n >,\n): BaseFormState<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer\n> {\n return {\n values: defaultState.values ?? ({} as never),\n errorMap: defaultState.errorMap ?? {},\n fieldMetaBase: defaultState.fieldMetaBase ?? ({} as never),\n isSubmitted: defaultState.isSubmitted ?? false,\n isSubmitting: defaultState.isSubmitting ?? false,\n isValidating: defaultState.isValidating ?? false,\n submissionAttempts: defaultState.submissionAttempts ?? 0,\n isSubmitSuccessful: defaultState.isSubmitSuccessful ?? false,\n validationMetaMap: defaultState.validationMetaMap ?? {\n onChange: undefined,\n onBlur: undefined,\n onSubmit: undefined,\n onMount: undefined,\n onServer: undefined,\n onDynamic: undefined,\n },\n }\n}\n\n/**\n * @public\n *\n * A type representing the Form API with all generics set to `any` for convenience.\n */\nexport type AnyFormApi = FormApi<\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 Form API. It handles the logic and interactions with the form state.\n *\n * Normally, you will not need to create a new `FormApi` instance directly. Instead, you will use a framework\n * hook/function like `useForm` or `createForm` 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 the `new FormApi` constructor.\n */\nexport class FormApi<\n in out TFormData,\n in out TOnMount extends undefined | FormValidateOrFn<TFormData>,\n in out TOnChange extends undefined | FormValidateOrFn<TFormData>,\n in out TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n in out TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n in out TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n in out TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TSubmitMeta = never,\n> implements FieldManipulator<TFormData, TSubmitMeta>\n{\n /**\n * The options for the form.\n */\n options: FormOptions<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n > = {}\n baseStore!: Store<\n BaseFormState<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer\n >\n >\n fieldMetaDerived!: Derived<Record<DeepKeys<TFormData>, AnyFieldMeta>>\n store!: Derived<\n FormState<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer\n >\n >\n /**\n * A record of field information for each field in the form.\n */\n fieldInfo: Record<DeepKeys<TFormData>, FieldInfo<TFormData>> = {} as any\n\n get state() {\n return this.store.state\n }\n\n /**\n * @private\n */\n prevTransformArray: unknown[] = []\n\n /**\n * @private\n */\n timeoutIds: {\n validations: Record<ValidationCause, ReturnType<typeof setTimeout> | null>\n listeners: Record<ListenerCause, ReturnType<typeof setTimeout> | null>\n formListeners: Record<ListenerCause, ReturnType<typeof setTimeout> | null>\n }\n /**\n * @private\n */\n private _formId: string\n /**\n * @private\n */\n private _devtoolsSubmissionOverride: boolean\n\n /**\n * Constructs a new `FormApi` instance with the given form options.\n */\n constructor(\n opts?: FormOptions<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >,\n ) {\n this.timeoutIds = {\n validations: {} as Record<ValidationCause, never>,\n listeners: {} as Record<ListenerCause, never>,\n formListeners: {} as Record<ListenerCause, never>,\n }\n\n this._formId = opts?.formId ?? uuid()\n\n this._devtoolsSubmissionOverride = false\n\n this.baseStore = new Store(\n getDefaultFormState({\n ...(opts?.defaultState as any),\n values: opts?.defaultValues ?? opts?.defaultState?.values,\n isFormValid: true,\n }),\n )\n\n this.fieldMetaDerived = new Derived({\n deps: [this.baseStore],\n fn: ({ prevDepVals, currDepVals, prevVal: _prevVal }) => {\n const prevVal = _prevVal as\n | Record<DeepKeys<TFormData>, AnyFieldMeta>\n | undefined\n const prevBaseStore = prevDepVals?.[0]\n const currBaseStore = currDepVals[0]\n\n let originalMetaCount = 0\n\n const fieldMeta = {} as FormState<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer\n >['fieldMeta']\n\n for (const fieldName of Object.keys(\n currBaseStore.fieldMetaBase,\n ) as Array<keyof typeof currBaseStore.fieldMetaBase>) {\n const currBaseMeta = currBaseStore.fieldMetaBase[\n fieldName as never\n ] as AnyFieldMetaBase\n\n const prevBaseMeta = prevBaseStore?.fieldMetaBase[\n fieldName as never\n ] as AnyFieldMetaBase | undefined\n\n const prevFieldInfo =\n prevVal?.[fieldName as never as keyof typeof prevVal]\n\n const curFieldVal = getBy(currBaseStore.values, fieldName)\n\n let fieldErrors = prevFieldInfo?.errors\n if (\n !prevBaseMeta ||\n currBaseMeta.errorMap !== prevBaseMeta.errorMap\n ) {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n fieldErrors = Object.values(currBaseMeta.errorMap ?? {}).filter(\n (val) => val !== undefined,\n ) as never\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n const fieldInstance = this.getFieldInfo(fieldName)?.instance\n\n if (fieldInstance && !fieldInstance.options.disableErrorFlat) {\n fieldErrors = (fieldErrors as undefined | string[])?.flat(\n 1,\n ) as never\n }\n }\n\n // As primitives, we don't need to aggressively persist the same referential value for performance reasons\n const isFieldValid = !isNonEmptyArray(fieldErrors ?? [])\n const isFieldPristine = !currBaseMeta.isDirty\n const isDefaultValue =\n evaluate(\n curFieldVal,\n getBy(this.options.defaultValues, fieldName),\n ) ||\n evaluate(\n curFieldVal,\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n this.getFieldInfo(fieldName)?.instance?.options.defaultValue,\n )\n\n if (\n prevFieldInfo &&\n prevFieldInfo.isPristine === isFieldPristine &&\n prevFieldInfo.isValid === isFieldValid &&\n prevFieldInfo.isDefaultValue === isDefaultValue &&\n prevFieldInfo.errors === fieldErrors &&\n currBaseMeta === prevBaseMeta\n ) {\n fieldMeta[fieldName] = prevFieldInfo\n originalMetaCount++\n continue\n }\n\n fieldMeta[fieldName] = {\n ...currBaseMeta,\n errors: fieldErrors,\n isPristine: isFieldPristine,\n isValid: isFieldValid,\n isDefaultValue: isDefaultValue,\n } as AnyFieldMeta\n }\n\n if (!Object.keys(currBaseStore.fieldMetaBase).length) return fieldMeta\n\n if (\n prevVal &&\n originalMetaCount === Object.keys(currBaseStore.fieldMetaBase).length\n ) {\n return prevVal\n }\n\n return fieldMeta\n },\n })\n\n this.store = new Derived({\n deps: [this.baseStore, this.fieldMetaDerived],\n fn: ({ prevDepVals, currDepVals, prevVal: _prevVal }) => {\n const prevVal = _prevVal as\n | FormState<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer\n >\n | undefined\n const prevBaseStore = prevDepVals?.[0]\n const currBaseStore = currDepVals[0]\n const currFieldMeta = currDepVals[1]\n\n // Computed state\n const fieldMetaValues = Object.values(currFieldMeta).filter(\n Boolean,\n ) as AnyFieldMeta[]\n\n const isFieldsValidating = fieldMetaValues.some(\n (field) => field.isValidating,\n )\n\n const isFieldsValid = fieldMetaValues.every((field) => field.isValid)\n\n const isTouched = fieldMetaValues.some((field) => field.isTouched)\n const isBlurred = fieldMetaValues.some((field) => field.isBlurred)\n const isDefaultValue = fieldMetaValues.every(\n (field) => field.isDefaultValue,\n )\n\n const shouldInvalidateOnMount =\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n isTouched && currBaseStore.errorMap?.onMount\n\n const isDirty = fieldMetaValues.some((field) => field.isDirty)\n const isPristine = !isDirty\n\n const hasOnMountError = Boolean(\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n currBaseStore.errorMap?.onMount ||\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n fieldMetaValues.some((f) => f?.errorMap?.onMount),\n )\n\n const isValidating = !!isFieldsValidating\n\n // As `errors` is not a primitive, we need to aggressively persist the same referencial value for performance reasons\n let errors = prevVal?.errors ?? []\n if (\n !prevBaseStore ||\n currBaseStore.errorMap !== prevBaseStore.errorMap\n ) {\n errors = Object.values(currBaseStore.errorMap).reduce<\n Array<\n | UnwrapFormValidateOrFn<TOnMount>\n | UnwrapFormValidateOrFn<TOnChange>\n | UnwrapFormAsyncValidateOrFn<TOnChangeAsync>\n | UnwrapFormValidateOrFn<TOnBlur>\n | UnwrapFormAsyncValidateOrFn<TOnBlurAsync>\n | UnwrapFormValidateOrFn<TOnSubmit>\n | UnwrapFormAsyncValidateOrFn<TOnSubmitAsync>\n | UnwrapFormAsyncValidateOrFn<TOnServer>\n >\n >((prev, curr) => {\n if (curr === undefined) return prev\n\n if (curr && isGlobalFormValidationError(curr)) {\n prev.push(curr.form as never)\n return prev\n }\n prev.push(curr as never)\n return prev\n }, [])\n }\n\n const isFormValid = errors.length === 0\n const isValid = isFieldsValid && isFormValid\n const submitInvalid = this.options.canSubmitWhenInvalid ?? false\n const canSubmit =\n (currBaseStore.submissionAttempts === 0 &&\n !isTouched &&\n !hasOnMountError) ||\n (!isValidating && !currBaseStore.isSubmitting && isValid) ||\n submitInvalid\n\n let errorMap = currBaseStore.errorMap\n if (shouldInvalidateOnMount) {\n errors = errors.filter(\n (err) => err !== currBaseStore.errorMap.onMount,\n )\n errorMap = Object.assign(errorMap, { onMount: undefined })\n }\n\n if (\n prevVal &&\n prevBaseStore &&\n prevVal.errorMap === errorMap &&\n prevVal.fieldMeta === this.fieldMetaDerived.state &&\n prevVal.errors === errors &&\n prevVal.isFieldsValidating === isFieldsValidating &&\n prevVal.isFieldsValid === isFieldsValid &&\n prevVal.isFormValid === isFormValid &&\n prevVal.isValid === isValid &&\n prevVal.canSubmit === canSubmit &&\n prevVal.isTouched === isTouched &&\n prevVal.isBlurred === isBlurred &&\n prevVal.isPristine === isPristine &&\n prevVal.isDefaultValue === isDefaultValue &&\n prevVal.isDirty === isDirty &&\n evaluate(prevBaseStore, currBaseStore)\n ) {\n return prevVal\n }\n\n let state = {\n ...currBaseStore,\n errorMap,\n fieldMeta: this.fieldMetaDerived.state,\n errors,\n isFieldsValidating,\n isFieldsValid,\n isFormValid,\n isValid,\n canSubmit,\n isTouched,\n isBlurred,\n isPristine,\n isDefaultValue,\n isDirty,\n } as FormState<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer\n >\n\n // Only run transform if state has shallowly changed - IE how React.useEffect works\n const transformArray = this.options.transform?.deps ?? []\n const shouldTransform =\n transformArray.length !== this.prevTransformArray.length ||\n transformArray.some((val, i) => val !== this.prevTransformArray[i])\n\n if (shouldTransform) {\n const newObj = Object.assign({}, this, { state })\n // This mutates the state\n this.options.transform?.fn(newObj)\n state = newObj.state\n this.prevTransformArray = transformArray\n }\n\n return state\n },\n })\n\n this.handleSubmit = this.handleSubmit.bind(this)\n\n this.update(opts || {})\n\n this.store.subscribe(() => {\n formEventClient.emit('form-state-change', {\n id: this._formId,\n state: this.store.state,\n options: this.options,\n })\n })\n\n formEventClient.on('request-form-state', (e) => {\n if (e.payload.id === this._formId) {\n formEventClient.emit('form-state-change', {\n id: this._formId,\n state: this.store.state,\n options: this.options,\n })\n }\n })\n\n formEventClient.on('request-form-reset', (e) => {\n if (e.payload.id === this._formId) {\n this.reset()\n }\n })\n\n formEventClient.on('request-form-force-submit', (e) => {\n if (e.payload.id === this._formId) {\n this._devtoolsSubmissionOverride = true\n this.handleSubmit()\n this._devtoolsSubmissionOverride = false\n }\n })\n }\n\n get formId(): string {\n return this._formId\n }\n\n /**\n * @private\n */\n runValidator<\n TValue extends TStandardSchemaValidatorValue<TFormData> & {\n formApi: AnyFormApi\n },\n TType extends 'validate' | 'validateAsync',\n >(props: {\n validate: TType extends 'validate'\n ? FormValidateOrFn<TFormData>\n : FormAsyncValidateOrFn<TFormData>\n value: TValue\n type: TType\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 FormValidateFn<any>)(props.value) as never\n }\n\n mount = () => {\n const cleanupFieldMetaDerived = this.fieldMetaDerived.mount()\n const cleanupStoreDerived = this.store.mount()\n const cleanup = () => {\n cleanupFieldMetaDerived()\n cleanupStoreDerived()\n\n // broadcast form unmount for devtools\n formEventClient.emit('form-unmounted', {\n id: this._formId,\n })\n }\n\n this.options.listeners?.onMount?.({ formApi: this })\n\n const { onMount } = this.options.validators || {}\n\n // broadcast form state for devtools on mounting\n formEventClient.emit('form-state-change', {\n id: this._formId,\n state: this.store.state,\n options: this.options,\n })\n\n // if no validation skip\n if (!onMount) return cleanup\n\n // validate\n this.validateSync('mount')\n return cleanup\n }\n\n /**\n * Updates the form options and form state.\n */\n update = (\n options?: FormOptions<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >,\n ) => {\n if (!options) return\n\n const oldOptions = this.options\n\n // Options need to be updated first so that when the store is updated, the state is correct for the derived state\n this.options = options\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n const shouldUpdateReeval = !!options.transform?.deps?.some(\n (val, i) => val !== this.prevTransformArray[i],\n )\n\n const shouldUpdateValues =\n options.defaultValues &&\n !evaluate(options.defaultValues, oldOptions.defaultValues) &&\n !this.state.isTouched\n\n const shouldUpdateState =\n !evaluate(options.defaultState, oldOptions.defaultState) &&\n !this.state.isTouched\n\n if (!shouldUpdateValues && !shouldUpdateState && !shouldUpdateReeval) return\n\n batch(() => {\n this.baseStore.setState(() =>\n getDefaultFormState(\n Object.assign(\n {},\n this.state as any,\n\n shouldUpdateState ? options.defaultState : {},\n\n shouldUpdateValues\n ? {\n values: options.defaultValues,\n }\n : {},\n\n shouldUpdateReeval\n ? { _force_re_eval: !this.state._force_re_eval }\n : {},\n ),\n ),\n )\n })\n }\n\n /**\n * Resets the form state to the default values.\n * If values are provided, the form will be reset to those values instead and the default values will be updated.\n *\n * @param values - Optional values to reset the form to.\n * @param opts - Optional options to control the reset behavior.\n */\n reset = (values?: TFormData, opts?: { keepDefaultValues?: boolean }) => {\n const { fieldMeta: currentFieldMeta } = this.state\n const fieldMetaBase = this.resetFieldMeta(currentFieldMeta)\n\n if (values && !opts?.keepDefaultValues) {\n this.options = {\n ...this.options,\n defaultValues: values,\n }\n }\n\n this.baseStore.setState(() =>\n getDefaultFormState({\n ...(this.options.defaultState as any),\n values:\n values ??\n this.options.defaultValues ??\n this.options.defaultState?.values,\n fieldMetaBase,\n }),\n )\n }\n\n /**\n * Validates all fields using the correct handlers for a given validation cause.\n */\n validateAllFields = async (cause: ValidationCause) => {\n const fieldValidationPromises: Promise<ValidationError[]>[] = [] as any\n batch(() => {\n void (Object.values(this.fieldInfo) as FieldInfo<any>[]).forEach(\n (field) => {\n if (!field.instance) return\n const fieldInstance = field.instance\n // Validate the field\n fieldValidationPromises.push(\n // Remember, `validate` is either a sync operation or a promise\n Promise.resolve().then(() =>\n fieldInstance.validate(cause, { skipFormValidation: true }),\n ),\n )\n // If any fields are not touched\n if (!field.instance.state.meta.isTouched) {\n // Mark them as touched\n field.instance.setMeta((prev) => ({ ...prev, isTouched: true }))\n }\n },\n )\n })\n\n const fieldErrorMapMap = await Promise.all(fieldValidationPromises)\n return fieldErrorMapMap.flat()\n }\n\n /**\n * Validates the children of a specified array in the form starting from a given index until the end using the correct handlers for a given validation type.\n */\n validateArrayFieldsStartingFrom = async <\n TField extends DeepKeysOfType<TFormData, any[]>,\n >(\n field: TField,\n index: number,\n cause: ValidationCause,\n ) => {\n const currentValue = this.getFieldValue(field)\n\n const lastIndex = Array.isArray(currentValue)\n ? Math.max((currentValue as Array<unknown>).length - 1, 0)\n : null\n\n // We have to validate all fields that have shifted (at least the current field)\n const fieldKeysToValidate = [`${field}[${index}]`]\n for (let i = index + 1; i <= (lastIndex ?? 0); i++) {\n fieldKeysToValidate.push(`${field}[${i}]`)\n }\n\n // We also have to include all fields that are nested in the shifted fields\n const fieldsToValidate = Object.keys(this.fieldInfo).filter((fieldKey) =>\n fieldKeysToValidate.some((key) => fieldKey.startsWith(key)),\n ) as DeepKeys<TFormData>[]\n\n // Validate the fields\n const fieldValidationPromises: Promise<ValidationError[]>[] = [] as any\n batch(() => {\n fieldsToValidate.forEach((nestedField) => {\n fieldValidationPromises.push(\n Promise.resolve().then(() => this.validateField(nestedField, cause)),\n )\n })\n })\n\n const fieldErrorMapMap = await Promise.all(fieldValidationPromises)\n return fieldErrorMapMap.flat()\n }\n\n /**\n * Validates a specified field in the form using the correct handlers for a given validation type.\n */\n validateField = <TField extends DeepKeys<TFormData>>(\n field: TField,\n cause: ValidationCause,\n ) => {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n const fieldInstance = this.fieldInfo[field]?.instance\n if (!fieldInstance) return []\n\n // If the field is not touched (same logic as in validateAllFields)\n if (!fieldInstance.state.meta.isTouched) {\n // Mark it as touched\n fieldInstance.setMeta((prev) => ({ ...prev, isTouched: true }))\n }\n\n return fieldInstance.validate(cause)\n }\n\n /**\n * TODO: This code is copied from FieldApi, we should refactor to share\n * @private\n */\n validateSync = (\n cause: ValidationCause,\n ): {\n hasErrored: boolean\n fieldsErrorMap: FormErrorMapFromValidator<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync\n >\n } => {\n const validates = getSyncValidatorArray(cause, {\n ...this.options,\n form: this,\n validationLogic: this.options.validationLogic || defaultValidationLogic,\n })\n\n let hasErrored = false as boolean\n\n // This map will only include fields that have errors in the current validation cycle\n const currentValidationErrorMap: FormErrorMapFromValidator<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync\n > = {}\n\n batch(() => {\n for (const validateObj of validates) {\n if (!validateObj.validate) continue\n\n const rawError = this.runValidator({\n validate: validateObj.validate,\n value: {\n value: this.state.values,\n formApi: this,\n validationSource: 'form',\n },\n type: 'validate',\n })\n\n const { formError, fieldErrors } = normalizeError<TFormData>(rawError)\n\n const errorMapKey = getErrorMapKey(validateObj.cause)\n\n for (const field of Object.keys(\n this.state.fieldMeta,\n ) as DeepKeys<TFormData>[]) {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (this.baseStore.state.fieldMetaBase[field] === undefined) {\n continue\n }\n\n const fieldMeta = this.getFieldMeta(field)\n if (!fieldMeta) continue\n\n const {\n errorMap: currentErrorMap,\n errorSourceMap: currentErrorMapSource,\n } = fieldMeta\n\n const newFormValidatorError = fieldErrors?.[field]\n\n const { newErrorValue, newSource } =\n determineFormLevelErrorSourceAndValue({\n newFormValidatorError,\n isPreviousErrorFromFormValidator:\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n currentErrorMapSource?.[errorMapKey] === 'form',\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n previousErrorValue: currentErrorMap?.[errorMapKey],\n })\n\n if (newSource === 'form') {\n currentValidationErrorMap[field] = {\n ...currentValidationErrorMap[field],\n [errorMapKey]: newFormValidatorError,\n }\n }\n\n if (\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n currentErrorMap?.[errorMapKey] !== newErrorValue\n ) {\n this.setFieldMeta(field, (prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n [errorMapKey]: newErrorValue,\n },\n errorSourceMap: {\n ...prev.errorSourceMap,\n [errorMapKey]: newSource,\n },\n }))\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (this.state.errorMap?.[errorMapKey] !== formError) {\n this.baseStore.setState((prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n [errorMapKey]: formError,\n },\n }))\n }\n\n if (formError || fieldErrors) {\n hasErrored = true\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 if (\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n this.state.errorMap?.[submitErrKey] &&\n cause !== 'submit' &&\n !hasErrored\n ) {\n this.baseStore.setState((prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n [submitErrKey]: undefined,\n },\n }))\n }\n\n /**\n * when we have an error for onServer 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 serverErrKey = getErrorMapKey('server')\n if (\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n this.state.errorMap?.[serverErrKey] &&\n cause !== 'server' &&\n !hasErrored\n ) {\n this.baseStore.setState((prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n [serverErrKey]: undefined,\n },\n }))\n }\n })\n\n return { hasErrored, fieldsErrorMap: currentValidationErrorMap }\n }\n\n /**\n * @private\n */\n validateAsync = async (\n cause: ValidationCause,\n ): Promise<\n FormErrorMapFromValidator<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync\n >\n > => {\n const validates = getAsyncValidatorArray(cause, {\n ...this.options,\n form: this,\n validationLogic: this.options.validationLogic || defaultValidationLogic,\n })\n\n if (!this.state.isFormValidating) {\n this.baseStore.setState((prev) => ({ ...prev, isFormValidating: 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 promises: Promise<ValidationPromiseResult<TFormData>>[] = []\n\n let fieldErrorsFromFormValidators:\n | Partial<Record<DeepKeys<TFormData>, ValidationError>>\n | undefined\n\n for (const validateObj of validates) {\n if (!validateObj.validate) continue\n const key = getErrorMapKey(validateObj.cause)\n const fieldValidatorMeta = this.state.validationMetaMap[key]\n\n fieldValidatorMeta?.lastAbortController.abort()\n const controller = new AbortController()\n\n this.state.validationMetaMap[key] = {\n lastAbortController: controller,\n }\n\n promises.push(\n new Promise<ValidationPromiseResult<TFormData>>(async (resolve) => {\n let rawError!:\n | ValidationError\n | FormValidationError<unknown>\n | undefined\n try {\n rawError = await new Promise((rawResolve, rawReject) => {\n 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: this.state.values,\n formApi: this,\n validationSource: 'form',\n signal: controller.signal,\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 const { formError, fieldErrors: fieldErrorsFromNormalizeError } =\n normalizeError<TFormData>(rawError)\n\n if (fieldErrorsFromNormalizeError) {\n fieldErrorsFromFormValidators = fieldErrorsFromFormValidators\n ? {\n ...fieldErrorsFromFormValidators,\n ...fieldErrorsFromNormalizeError,\n }\n : fieldErrorsFromNormalizeError\n }\n const errorMapKey = getErrorMapKey(validateObj.cause)\n\n for (const field of Object.keys(\n this.state.fieldMeta,\n ) as DeepKeys<TFormData>[]) {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (this.baseStore.state.fieldMetaBase[field] === undefined) {\n continue\n }\n\n const fieldMeta = this.getFieldMeta(field)\n if (!fieldMeta) continue\n\n const {\n errorMap: currentErrorMap,\n errorSourceMap: currentErrorMapSource,\n } = fieldMeta\n\n const newFormValidatorError = fieldErrorsFromFormValidators?.[field]\n\n const { newErrorValue, newSource } =\n determineFormLevelErrorSourceAndValue({\n newFormValidatorError,\n isPreviousErrorFromFormValidator:\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n currentErrorMapSource?.[errorMapKey] === 'form',\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n previousErrorValue: currentErrorMap?.[errorMapKey],\n })\n\n if (\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n currentErrorMap?.[errorMapKey] !== newErrorValue\n ) {\n this.setFieldMeta(field, (prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n [errorMapKey]: newErrorValue,\n },\n errorSourceMap: {\n ...prev.errorSourceMap,\n [errorMapKey]: newSource,\n },\n }))\n }\n }\n\n this.baseStore.setState((prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n [errorMapKey]: formError,\n },\n }))\n\n resolve(\n fieldErrorsFromFormValidators\n ? { fieldErrors: fieldErrorsFromFormValidators, errorMapKey }\n : undefined,\n )\n }),\n )\n }\n\n let results: ValidationPromiseResult<TFormData>[] = []\n\n const fieldsErrorMap: FormErrorMapFromValidator<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync\n > = {}\n if (promises.length) {\n results = await Promise.all(promises)\n for (const fieldValidationResult of results) {\n if (fieldValidationResult?.fieldErrors) {\n const { errorMapKey } = fieldValidationResult\n\n for (const [field, fieldError] of Object.entries(\n fieldValidationResult.fieldErrors,\n )) {\n const oldErrorMap =\n fieldsErrorMap[field as DeepKeys<TFormData>] || {}\n const newErrorMap = {\n ...oldErrorMap,\n [errorMapKey]: fieldError,\n }\n fieldsErrorMap[field as DeepKeys<TFormData>] = newErrorMap\n }\n }\n }\n }\n\n this.baseStore.setState((prev) => ({\n ...prev,\n isFormValidating: false,\n }))\n\n return fieldsErrorMap\n }\n\n /**\n * @private\n */\n validate = (\n cause: ValidationCause,\n ):\n | FormErrorMapFromValidator<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync\n >\n | Promise<\n FormErrorMapFromValidator<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync\n >\n > => {\n // Attempt to sync validate first\n const { hasErrored, fieldsErrorMap } = this.validateSync(cause)\n\n if (hasErrored && !this.options.asyncAlways) {\n return fieldsErrorMap\n }\n\n // No error? Attempt async validation\n return this.validateAsync(cause)\n }\n\n /**\n * Handles the form submission, performs validation, and calls the appropriate onSubmit or onSubmitInvalid callbacks.\n */\n handleSubmit(): Promise<void>\n handleSubmit(submitMeta: TSubmitMeta): Promise<void>\n async handleSubmit(submitMeta?: TSubmitMeta): Promise<void> {\n this.baseStore.setState((old) => ({\n ...old,\n // Submission attempts mark the form as not submitted\n isSubmitted: false,\n // Count submission attempts\n submissionAttempts: old.submissionAttempts + 1,\n isSubmitSuccessful: false, // Reset isSubmitSuccessful at the start of submission\n }))\n\n batch(() => {\n void (Object.values(this.fieldInfo) as FieldInfo<any>[]).forEach(\n (field) => {\n if (!field.instance) return\n // If any fields are not touched\n if (!field.instance.state.meta.isTouched) {\n // Mark them as touched\n field.instance.setMeta((prev) => ({ ...prev, isTouched: true }))\n }\n },\n )\n })\n\n const submitMetaArg =\n submitMeta ?? (this.options.onSubmitMeta as TSubmitMeta)\n\n if (!this.state.canSubmit && !this._devtoolsSubmissionOverride) {\n this.options.onSubmitInvalid?.({\n value: this.state.values,\n formApi: this,\n meta: submitMetaArg,\n })\n return\n }\n\n this.baseStore.setState((d) => ({ ...d, isSubmitting: true }))\n\n const done = () => {\n this.baseStore.setState((prev) => ({ ...prev, isSubmitting: false }))\n }\n\n await this.validateAllFields('submit')\n\n if (!this.state.isFieldsValid) {\n done()\n\n this.options.onSubmitInvalid?.({\n value: this.state.values,\n formApi: this,\n meta: submitMetaArg,\n })\n\n formEventClient.emit('form-submission-state-change', {\n id: this._formId,\n submissionAttempt: this.state.submissionAttempts,\n successful: false,\n stage: 'validateAllFields',\n errors: (Object.values(this.state.fieldMeta) as AnyFieldMeta[])\n .map((meta: AnyFieldMeta) => meta.errors)\n .flat(),\n })\n return\n }\n\n await this.validate('submit')\n\n // Fields are invalid, do not submit\n if (!this.state.isValid) {\n done()\n\n this.options.onSubmitInvalid?.({\n value: this.state.values,\n formApi: this,\n meta: submitMetaArg,\n })\n\n formEventClient.emit('form-submission-state-change', {\n id: this._formId,\n submissionAttempt: this.state.submissionAttempts,\n successful: false,\n stage: 'validate',\n errors: this.state.errors,\n })\n\n return\n }\n\n batch(() => {\n void (Object.values(this.fieldInfo) as FieldInfo<TFormData>[]).forEach(\n (field) => {\n field.instance?.options.listeners?.onSubmit?.({\n value: field.instance.state.value,\n fieldApi: field.instance,\n })\n },\n )\n })\n\n this.options.listeners?.onSubmit?.({ formApi: this, meta: submitMetaArg })\n\n try {\n // Run the submit code\n await this.options.onSubmit?.({\n value: this.state.values,\n formApi: this,\n meta: submitMetaArg,\n })\n\n batch(() => {\n this.baseStore.setState((prev) => ({\n ...prev,\n isSubmitted: true,\n isSubmitSuccessful: true, // Set isSubmitSuccessful to true on successful submission\n }))\n\n formEventClient.emit('form-submission-state-change', {\n id: this._formId,\n submissionAttempt: this.state.submissionAttempts,\n successful: true,\n })\n\n done()\n })\n } catch (err) {\n this.baseStore.setState((prev) => ({\n ...prev,\n isSubmitSuccessful: false, // Ensure isSubmitSuccessful is false if an error occurs\n }))\n\n formEventClient.emit('form-submission-state-change', {\n id: this._formId,\n submissionAttempt: this.state.submissionAttempts,\n successful: false,\n stage: 'inflight',\n onError: err,\n })\n\n done()\n\n throw err\n }\n }\n\n /**\n * Gets the value of the specified field.\n */\n getFieldValue = <TField extends DeepKeys<TFormData>>(\n field: TField,\n ): DeepValue<TFormData, TField> => getBy(this.state.values, field)\n\n /**\n * Gets the metadata of the specified field.\n */\n getFieldMeta = <TField extends DeepKeys<TFormData>>(\n field: TField,\n ): AnyFieldMeta | undefined => {\n return this.state.fieldMeta[field]\n }\n\n /**\n * Gets the field info of the specified field.\n */\n getFieldInfo = <TField extends DeepKeys<TFormData>>(\n field: TField,\n ): FieldInfo<TFormData> => {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n return (this.fieldInfo[field] ||= {\n instance: null,\n validationMetaMap: {\n onChange: undefined,\n onBlur: undefined,\n onSubmit: undefined,\n onMount: undefined,\n onServer: undefined,\n onDynamic: undefined,\n },\n })\n }\n\n /**\n * Updates the metadata of the specified field.\n */\n setFieldMeta = <TField extends DeepKeys<TFormData>>(\n field: TField,\n updater: Updater<AnyFieldMetaBase>,\n ) => {\n this.baseStore.setState((prev) => {\n return {\n ...prev,\n fieldMetaBase: {\n ...prev.fieldMetaBase,\n [field]: functionalUpdate(\n updater,\n prev.fieldMetaBase[field] as never,\n ),\n },\n }\n })\n }\n\n /**\n * resets every field's meta\n */\n resetFieldMeta = <TField extends DeepKeys<TFormData>>(\n fieldMeta: Record<TField, AnyFieldMeta>,\n ): Record<TField, AnyFieldMeta> => {\n return Object.keys(fieldMeta).reduce(\n (acc: Record<TField, AnyFieldMeta>, key) => {\n const fieldKey = key as TField\n acc[fieldKey] = defaultFieldMeta\n return acc\n },\n {} as Record<TField, AnyFieldMeta>,\n )\n }\n\n /**\n * Sets the value of the specified field and optionally updates the touched state.\n */\n setFieldValue = <TField extends DeepKeys<TFormData>>(\n field: TField,\n updater: Updater<DeepValue<TFormData, TField>>,\n opts?: UpdateMetaOptions,\n ) => {\n const dontUpdateMeta = opts?.dontUpdateMeta ?? false\n const dontRunListeners = opts?.dontRunListeners ?? false\n const dontValidate = opts?.dontValidate ?? false\n\n batch(() => {\n if (!dontUpdateMeta) {\n this.setFieldMeta(field, (prev) => ({\n ...prev,\n isTouched: true,\n isDirty: true,\n errorMap: {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n ...prev?.errorMap,\n onMount: undefined,\n },\n }))\n }\n\n this.baseStore.setState((prev) => {\n return {\n ...prev,\n values: setBy(prev.values, field, updater),\n }\n })\n })\n\n if (!dontRunListeners) {\n this.getFieldInfo(field).instance?.triggerOnChangeListener()\n }\n\n if (!dontValidate) {\n this.validateField(field, 'change')\n }\n }\n\n deleteField = <TField extends DeepKeys<TFormData>>(field: TField) => {\n const subFieldsToDelete = Object.keys(this.fieldInfo).filter((f) => {\n const fieldStr = field.toString()\n return f !== fieldStr && f.startsWith(fieldStr)\n })\n\n const fieldsToDelete = [...subFieldsToDelete, field]\n\n // Cleanup the last fields\n this.baseStore.setState((prev) => {\n const newState = { ...prev }\n fieldsToDelete.forEach((f) => {\n newState.values = deleteBy(newState.values, f)\n delete this.fieldInfo[f as never]\n delete newState.fieldMetaBase[f as never]\n })\n\n return newState\n })\n }\n\n /**\n * Pushes a value into an array field.\n */\n pushFieldValue = <TField extends DeepKeysOfType<TFormData, any[]>>(\n field: TField,\n value: DeepValue<TFormData, TField> extends any[]\n ? DeepValue<TFormData, TField>[number]\n : never,\n options?: UpdateMetaOptions,\n ) => {\n this.setFieldValue(\n field,\n (prev) => [...(Array.isArray(prev) ? prev : []), value] as any,\n options,\n )\n }\n\n insertFieldValue = async <TField extends DeepKeysOfType<TFormData, any[]>>(\n field: TField,\n index: number,\n value: DeepValue<TFormData, TField> extends any[]\n ? DeepValue<TFormData, TField>[number]\n : never,\n options?: UpdateMetaOptions,\n ) => {\n this.setFieldValue(\n field,\n (prev) => {\n return [\n ...(prev as DeepValue<TFormData, TField>[]).slice(0, index),\n value,\n ...(prev as DeepValue<TFormData, TField>[]).slice(index),\n ] as any\n },\n mergeOpts(options, { dontValidate: true }),\n )\n\n // Validate the whole array + all fields that have shifted\n await this.validateField(field, 'change')\n\n // Shift down all meta after validating to make sure the new field has been mounted\n metaHelper(this).handleArrayFieldMetaShift(field, index, 'insert')\n\n await this.validateArrayFieldsStartingFrom(field, index, 'change')\n }\n\n /**\n * Replaces a value into an array field at the specified index.\n */\n replaceFieldValue = async <TField extends DeepKeysOfType<TFormData, any[]>>(\n field: TField,\n index: number,\n value: DeepValue<TFormData, TField> extends any[]\n ? DeepValue<TFormData, TField>[number]\n : never,\n options?: UpdateMetaOptions,\n ) => {\n this.setFieldValue(\n field,\n (prev) => {\n return (prev as DeepValue<TFormData, TField>[]).map((d, i) =>\n i === index ? value : d,\n ) as any\n },\n mergeOpts(options, { dontValidate: true }),\n )\n\n // Validate the whole array + all fields that have shifted\n await this.validateField(field, 'change')\n await this.validateArrayFieldsStartingFrom(field, index, 'change')\n }\n\n /**\n * Removes a value from an array field at the specified index.\n */\n removeFieldValue = async <TField extends DeepKeysOfType<TFormData, any[]>>(\n field: TField,\n index: number,\n options?: UpdateMetaOptions,\n ) => {\n const fieldValue = this.getFieldValue(field)\n\n const lastIndex = Array.isArray(fieldValue)\n ? Math.max((fieldValue as Array<unknown>).length - 1, 0)\n : null\n\n this.setFieldValue(\n field,\n (prev) => {\n return (prev as DeepValue<TFormData, TField>[]).filter(\n (_d, i) => i !== index,\n ) as any\n },\n mergeOpts(options, { dontValidate: true }),\n )\n\n // Shift up all meta\n metaHelper(this).handleArrayFieldMetaShift(field, index, 'remove')\n\n if (lastIndex !== null) {\n const start = `${field}[${lastIndex}]`\n this.deleteField(start as never)\n }\n\n // Validate the whole array + all fields that have shifted\n await this.validateField(field, 'change')\n await this.validateArrayFieldsStartingFrom(field, index, 'change')\n }\n\n /**\n * Swaps the values at the specified indices within an array field.\n */\n swapFieldValues = <TField extends DeepKeysOfType<TFormData, any[]>>(\n field: TField,\n index1: number,\n index2: number,\n options?: UpdateMetaOptions,\n ) => {\n this.setFieldValue(\n field,\n (prev: any) => {\n const prev1 = prev[index1]!\n const prev2 = prev[index2]!\n return setBy(setBy(prev, `${index1}`, prev2), `${index2}`, prev1)\n },\n mergeOpts(options, { dontValidate: true }),\n )\n\n // Swap meta\n metaHelper(this).handleArrayFieldMetaShift(field, index1, 'swap', index2)\n\n // Validate the whole array\n this.validateField(field, 'change')\n // Validate the swapped fields\n this.validateField(`${field}[${index1}]` as DeepKeys<TFormData>, 'change')\n this.validateField(`${field}[${index2}]` as DeepKeys<TFormData>, 'change')\n }\n\n /**\n * Moves the value at the first specified index to the second specified index within an array field.\n */\n moveFieldValues = <TField extends DeepKeysOfType<TFormData, any[]>>(\n field: TField,\n index1: number,\n index2: number,\n options?: UpdateMetaOptions,\n ) => {\n this.setFieldValue(\n field,\n (prev: any) => {\n const next: any = [...prev]\n next.splice(index2, 0, next.splice(index1, 1)[0])\n return next\n },\n mergeOpts(options, { dontValidate: true }),\n )\n\n // Move meta between index1 and index2\n metaHelper(this).handleArrayFieldMetaShift(field, index1, 'move', index2)\n\n // Validate the whole array\n this.validateField(field, 'change')\n // Validate the moved fields\n this.validateField(`${field}[${index1}]` as DeepKeys<TFormData>, 'change')\n this.validateField(`${field}[${index2}]` as DeepKeys<TFormData>, 'change')\n }\n\n /**\n * Clear all values within an array field.\n */\n clearFieldValues = <TField extends DeepKeysOfType<TFormData, any[]>>(\n field: TField,\n options?: UpdateMetaOptions,\n ) => {\n const fieldValue = this.getFieldValue(field)\n\n const lastIndex = Array.isArray(fieldValue)\n ? Math.max((fieldValue as unknown[]).length - 1, 0)\n : null\n\n this.setFieldValue(\n field,\n [] as any,\n mergeOpts(options, { dontValidate: true }),\n )\n\n if (lastIndex !== null) {\n for (let i = 0; i <= lastIndex; i++) {\n const fieldKey = `${field}[${i}]`\n this.deleteField(fieldKey as never)\n }\n }\n\n // validate array change\n this.validateField(field, 'change')\n }\n\n /**\n * Resets the field value and meta to default state\n */\n resetField = <TField extends DeepKeys<TFormData>>(field: TField) => {\n this.baseStore.setState((prev) => {\n return {\n ...prev,\n fieldMetaBase: {\n ...prev.fieldMetaBase,\n [field]: defaultFieldMeta,\n },\n values: this.options.defaultValues\n ? setBy(prev.values, field, getBy(this.options.defaultValues, field))\n : prev.values,\n }\n })\n }\n\n /**\n * Updates the form's errorMap\n */\n setErrorMap(\n errorMap: FormValidationErrorMap<\n TFormData,\n UnwrapFormValidateOrFn<TOnMount>,\n UnwrapFormValidateOrFn<TOnChange>,\n UnwrapFormAsyncValidateOrFn<TOnChangeAsync>,\n UnwrapFormValidateOrFn<TOnBlur>,\n UnwrapFormAsyncValidateOrFn<TOnBlurAsync>,\n UnwrapFormValidateOrFn<TOnSubmit>,\n UnwrapFormAsyncValidateOrFn<TOnSubmitAsync>,\n UnwrapFormValidateOrFn<TOnDynamic>,\n UnwrapFormAsyncValidateOrFn<TOnDynamicAsync>,\n UnwrapFormAsyncValidateOrFn<TOnServer>\n >,\n ) {\n batch(() => {\n Object.entries(errorMap).forEach(([key, value]) => {\n const errorMapKey = key as ValidationErrorMapKeys\n\n if (isGlobalFormValidationError(value)) {\n const { formError, fieldErrors } = normalizeError<TFormData>(value)\n\n for (const fieldName of Object.keys(\n this.fieldInfo,\n ) as DeepKeys<TFormData>[]) {\n const fieldMeta = this.getFieldMeta(fieldName)\n if (!fieldMeta) continue\n\n this.setFieldMeta(fieldName, (prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n [errorMapKey]: fieldErrors?.[fieldName],\n },\n errorSourceMap: {\n ...prev.errorSourceMap,\n [errorMapKey]: 'form',\n },\n }))\n }\n\n this.baseStore.setState((prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n [errorMapKey]: formError,\n },\n }))\n } else {\n this.baseStore.setState((prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n [errorMapKey]: value,\n },\n }))\n }\n })\n })\n }\n\n /**\n * Returns form and field level errors\n */\n getAllErrors = (): {\n form: {\n errors: Array<\n | UnwrapFormValidateOrFn<TOnMount>\n | UnwrapFormValidateOrFn<TOnChange>\n | UnwrapFormAsyncValidateOrFn<TOnChangeAsync>\n | UnwrapFormValidateOrFn<TOnBlur>\n | UnwrapFormAsyncValidateOrFn<TOnBlurAsync>\n | UnwrapFormValidateOrFn<TOnSubmit>\n | UnwrapFormAsyncValidateOrFn<TOnSubmitAsync>\n | UnwrapFormValidateOrFn<TOnDynamic>\n | UnwrapFormAsyncValidateOrFn<TOnDynamicAsync>\n | UnwrapFormAsyncValidateOrFn<TOnServer>\n >\n errorMap: ValidationErrorMap<\n UnwrapFormValidateOrFn<TOnMount>,\n UnwrapFormValidateOrFn<TOnChange>,\n UnwrapFormAsyncValidateOrFn<TOnChangeAsync>,\n UnwrapFormValidateOrFn<TOnBlur>,\n UnwrapFormAsyncValidateOrFn<TOnBlurAsync>,\n UnwrapFormValidateOrFn<TOnSubmit>,\n UnwrapFormAsyncValidateOrFn<TOnSubmitAsync>,\n UnwrapFormValidateOrFn<TOnDynamic>,\n UnwrapFormAsyncValidateOrFn<TOnDynamicAsync>,\n UnwrapFormAsyncValidateOrFn<TOnServer>\n >\n }\n fields: Record<\n DeepKeys<TFormData>,\n { errors: ValidationError[]; errorMap: ValidationErrorMap }\n >\n } => {\n return {\n form: {\n errors: this.state.errors,\n errorMap: this.state.errorMap,\n },\n fields: Object.entries(this.state.fieldMeta).reduce(\n (acc, [fieldName, fieldMeta]) => {\n if (\n Object.keys(fieldMeta as AnyFieldMeta).length &&\n (fieldMeta as AnyFieldMeta).errors.length\n ) {\n acc[fieldName as DeepKeys<TFormData>] = {\n errors: (fieldMeta as AnyFieldMeta).errors,\n errorMap: (fieldMeta as AnyFieldMeta).errorMap,\n }\n }\n\n return acc\n },\n {} as Record<\n DeepKeys<TFormData>,\n { errors: ValidationError[]; errorMap: ValidationErrorMap }\n >,\n ),\n }\n }\n\n /**\n * Parses the form's values with a given standard schema and returns\n * issues (if any). This method does NOT set any internal errors.\n * @param schema The standard schema to parse the form values with.\n */\n parseValuesWithSchema = (schema: StandardSchemaV1<TFormData, unknown>) => {\n return standardSchemaValidators.validate(\n { value: this.state.values, validationSource: 'form' },\n schema,\n )\n }\n\n /**\n * Parses the form's values with a given standard schema and returns\n * issues (if any). This method does NOT set any internal errors.\n * @param schema The standard schema to parse the form values with.\n */\n parseValuesWithSchemaAsync = (\n schema: StandardSchemaV1<TFormData, unknown>,\n ) => {\n return standardSchemaValidators.validateAsync(\n { value: this.state.values, validationSource: 'form' },\n schema,\n )\n }\n}\n\nfunction normalizeError<TFormData>(rawError?: FormValidationError<unknown>): {\n formError: ValidationError\n fieldErrors?: Partial<Record<DeepKeys<TFormData>, ValidationError>>\n} {\n if (rawError) {\n if (isGlobalFormValidationError(rawError)) {\n const formError = normalizeError(rawError.form).formError\n const fieldErrors = rawError.fields\n return { formError, fieldErrors } as never\n }\n\n return { formError: rawError }\n }\n\n return { formError: 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 'dynamic':\n return 'onDynamic'\n case 'change':\n default:\n return 'onChange'\n }\n}\n"],"names":["formEventClient","evaluate","batch","opts","getSyncValidatorArray","defaultValidationLogic","determineFormLevelErrorSourceAndValue","getAsyncValidatorArray","getBy","functionalUpdate","defaultFieldMeta","setBy","deleteBy","mergeOpts","metaHelper","standardSchemaValidators","uuid","Store","Derived","isNonEmptyArray","isGlobalFormValidationError","isStandardSchemaValidator"],"mappings":";;;;;;;;AA4xBA,SAAS,oBAaP,cA2BA;AACA,SAAO;AAAA,IACL,QAAQ,aAAa,UAAW,CAAA;AAAA,IAChC,UAAU,aAAa,YAAY,CAAA;AAAA,IACnC,eAAe,aAAa,iBAAkB,CAAA;AAAA,IAC9C,aAAa,aAAa,eAAe;AAAA,IACzC,cAAc,aAAa,gBAAgB;AAAA,IAC3C,cAAc,aAAa,gBAAgB;AAAA,IAC3C,oBAAoB,aAAa,sBAAsB;AAAA,IACvD,oBAAoB,aAAa,sBAAsB;AAAA,IACvD,mBAAmB,aAAa,qBAAqB;AAAA,MACnD,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,SAAS;AAAA,MACT,UAAU;AAAA,MACV,WAAW;AAAA,IAAA;AAAA,EACb;AAEJ;AA6BO,MAAM,QAcb;AAAA;AAAA;AAAA;AAAA,EAmFE,YACE,MAcA;AA9FF,SAAA,UAaI,CAAA;AAmCJ,SAAA,YAA+D,CAAA;AAS/D,SAAA,qBAAgC,CAAA;AAkZhC,SAAA,QAAQ,MAAM;AACZ,YAAM,0BAA0B,KAAK,iBAAiB,MAAA;AACtD,YAAM,sBAAsB,KAAK,MAAM,MAAA;AACvC,YAAM,UAAU,MAAM;AACpB,gCAAA;AACA,4BAAA;AAGAA,oBAAAA,gBAAgB,KAAK,kBAAkB;AAAA,UACrC,IAAI,KAAK;AAAA,QAAA,CACV;AAAA,MACH;AAEA,WAAK,QAAQ,WAAW,UAAU,EAAE,SAAS,MAAM;AAEnD,YAAM,EAAE,QAAA,IAAY,KAAK,QAAQ,cAAc,CAAA;AAG/CA,kBAAAA,gBAAgB,KAAK,qBAAqB;AAAA,QACxC,IAAI,KAAK;AAAA,QACT,OAAO,KAAK,MAAM;AAAA,QAClB,SAAS,KAAK;AAAA,MAAA,CACf;AAGD,UAAI,CAAC,QAAS,QAAO;AAGrB,WAAK,aAAa,OAAO;AACzB,aAAO;AAAA,IACT;AAKA,SAAA,SAAS,CACP,YAcG;AACH,UAAI,CAAC,QAAS;AAEd,YAAM,aAAa,KAAK;AAGxB,WAAK,UAAU;AAGf,YAAM,qBAAqB,CAAC,CAAC,QAAQ,WAAW,MAAM;AAAA,QACpD,CAAC,KAAK,MAAM,QAAQ,KAAK,mBAAmB,CAAC;AAAA,MAAA;AAG/C,YAAM,qBACJ,QAAQ,iBACR,CAACC,MAAAA,SAAS,QAAQ,eAAe,WAAW,aAAa,KACzD,CAAC,KAAK,MAAM;AAEd,YAAM,oBACJ,CAACA,eAAS,QAAQ,cAAc,WAAW,YAAY,KACvD,CAAC,KAAK,MAAM;AAEd,UAAI,CAAC,sBAAsB,CAAC,qBAAqB,CAAC,mBAAoB;AAEtEC,YAAAA,MAAM,MAAM;AACV,aAAK,UAAU;AAAA,UAAS,MACtB;AAAA,YACE,OAAO;AAAA,cACL,CAAA;AAAA,cACA,KAAK;AAAA,cAEL,oBAAoB,QAAQ,eAAe,CAAA;AAAA,cAE3C,qBACI;AAAA,gBACE,QAAQ,QAAQ;AAAA,cAAA,IAElB,CAAA;AAAA,cAEJ,qBACI,EAAE,gBAAgB,CAAC,KAAK,MAAM,eAAA,IAC9B,CAAA;AAAA,YAAC;AAAA,UACP;AAAA,QACF;AAAA,MAEJ,CAAC;AAAA,IACH;AASA,SAAA,QAAQ,CAAC,QAAoBC,UAA2C;AACtE,YAAM,EAAE,WAAW,iBAAA,IAAqB,KAAK;AAC7C,YAAM,gBAAgB,KAAK,eAAe,gBAAgB;AAE1D,UAAI,UAAU,CAACA,OAAM,mBAAmB;AACtC,aAAK,UAAU;AAAA,UACb,GAAG,KAAK;AAAA,UACR,eAAe;AAAA,QAAA;AAAA,MAEnB;AAEA,WAAK,UAAU;AAAA,QAAS,MACtB,oBAAoB;AAAA,UAClB,GAAI,KAAK,QAAQ;AAAA,UACjB,QACE,UACA,KAAK,QAAQ,iBACb,KAAK,QAAQ,cAAc;AAAA,UAC7B;AAAA,QAAA,CACD;AAAA,MAAA;AAAA,IAEL;AAKA,SAAA,oBAAoB,OAAO,UAA2B;AACpD,YAAM,0BAAwD,CAAA;AAC9DD,YAAAA,MAAM,MAAM;AACV,aAAM,OAAO,OAAO,KAAK,SAAS,EAAuB;AAAA,UACvD,CAAC,UAAU;AACT,gBAAI,CAAC,MAAM,SAAU;AACrB,kBAAM,gBAAgB,MAAM;AAE5B,oCAAwB;AAAA;AAAA,cAEtB,QAAQ,UAAU;AAAA,gBAAK,MACrB,cAAc,SAAS,OAAO,EAAE,oBAAoB,MAAM;AAAA,cAAA;AAAA,YAC5D;AAGF,gBAAI,CAAC,MAAM,SAAS,MAAM,KAAK,WAAW;AAExC,oBAAM,SAAS,QAAQ,CAAC,UAAU,EAAE,GAAG,MAAM,WAAW,KAAA,EAAO;AAAA,YACjE;AAAA,UACF;AAAA,QAAA;AAAA,MAEJ,CAAC;AAED,YAAM,mBAAmB,MAAM,QAAQ,IAAI,uBAAuB;AAClE,aAAO,iBAAiB,KAAA;AAAA,IAC1B;AAKA,SAAA,kCAAkC,OAGhC,OACA,OACA,UACG;AACH,YAAM,eAAe,KAAK,cAAc,KAAK;AAE7C,YAAM,YAAY,MAAM,QAAQ,YAAY,IACxC,KAAK,IAAK,aAAgC,SAAS,GAAG,CAAC,IACvD;AAGJ,YAAM,sBAAsB,CAAC,GAAG,KAAK,IAAI,KAAK,GAAG;AACjD,eAAS,IAAI,QAAQ,GAAG,MAAM,aAAa,IAAI,KAAK;AAClD,4BAAoB,KAAK,GAAG,KAAK,IAAI,CAAC,GAAG;AAAA,MAC3C;AAGA,YAAM,mBAAmB,OAAO,KAAK,KAAK,SAAS,EAAE;AAAA,QAAO,CAAC,aAC3D,oBAAoB,KAAK,CAAC,QAAQ,SAAS,WAAW,GAAG,CAAC;AAAA,MAAA;AAI5D,YAAM,0BAAwD,CAAA;AAC9DA,YAAAA,MAAM,MAAM;AACV,yBAAiB,QAAQ,CAAC,gBAAgB;AACxC,kCAAwB;AAAA,YACtB,QAAQ,UAAU,KAAK,MAAM,KAAK,cAAc,aAAa,KAAK,CAAC;AAAA,UAAA;AAAA,QAEvE,CAAC;AAAA,MACH,CAAC;AAED,YAAM,mBAAmB,MAAM,QAAQ,IAAI,uBAAuB;AAClE,aAAO,iBAAiB,KAAA;AAAA,IAC1B;AAKA,SAAA,gBAAgB,CACd,OACA,UACG;AAEH,YAAM,gBAAgB,KAAK,UAAU,KAAK,GAAG;AAC7C,UAAI,CAAC,cAAe,QAAO,CAAA;AAG3B,UAAI,CAAC,cAAc,MAAM,KAAK,WAAW;AAEvC,sBAAc,QAAQ,CAAC,UAAU,EAAE,GAAG,MAAM,WAAW,OAAO;AAAA,MAChE;AAEA,aAAO,cAAc,SAAS,KAAK;AAAA,IACrC;AAMA,SAAA,eAAe,CACb,UAeG;AACH,YAAM,YAAYE,MAAAA,sBAAsB,OAAO;AAAA,QAC7C,GAAG,KAAK;AAAA,QACR,MAAM;AAAA,QACN,iBAAiB,KAAK,QAAQ,mBAAmBC,gBAAAA;AAAAA,MAAA,CAClD;AAED,UAAI,aAAa;AAGjB,YAAM,4BAWF,CAAA;AAEJH,YAAAA,MAAM,MAAM;AACV,mBAAW,eAAe,WAAW;AACnC,cAAI,CAAC,YAAY,SAAU;AAE3B,gBAAM,WAAW,KAAK,aAAa;AAAA,YACjC,UAAU,YAAY;AAAA,YACtB,OAAO;AAAA,cACL,OAAO,KAAK,MAAM;AAAA,cAClB,SAAS;AAAA,cACT,kBAAkB;AAAA,YAAA;AAAA,YAEpB,MAAM;AAAA,UAAA,CACP;AAED,gBAAM,EAAE,WAAW,gBAAgB,eAA0B,QAAQ;AAErE,gBAAM,cAAc,eAAe,YAAY,KAAK;AAEpD,qBAAW,SAAS,OAAO;AAAA,YACzB,KAAK,MAAM;AAAA,UAAA,GACe;AAE1B,gBAAI,KAAK,UAAU,MAAM,cAAc,KAAK,MAAM,QAAW;AAC3D;AAAA,YACF;AAEA,kBAAM,YAAY,KAAK,aAAa,KAAK;AACzC,gBAAI,CAAC,UAAW;AAEhB,kBAAM;AAAA,cACJ,UAAU;AAAA,cACV,gBAAgB;AAAA,YAAA,IACd;AAEJ,kBAAM,wBAAwB,cAAc,KAAK;AAEjD,kBAAM,EAAE,eAAe,UAAA,IACrBI,4CAAsC;AAAA,cACpC;AAAA,cACA;AAAA;AAAA,gBAEE,wBAAwB,WAAW,MAAM;AAAA;AAAA;AAAA,cAE3C,oBAAoB,kBAAkB,WAAW;AAAA,YAAA,CAClD;AAEH,gBAAI,cAAc,QAAQ;AACxB,wCAA0B,KAAK,IAAI;AAAA,gBACjC,GAAG,0BAA0B,KAAK;AAAA,gBAClC,CAAC,WAAW,GAAG;AAAA,cAAA;AAAA,YAEnB;AAEA;AAAA;AAAA,cAEE,kBAAkB,WAAW,MAAM;AAAA,cACnC;AACA,mBAAK,aAAa,OAAO,CAAC,UAAU;AAAA,gBAClC,GAAG;AAAA,gBACH,UAAU;AAAA,kBACR,GAAG,KAAK;AAAA,kBACR,CAAC,WAAW,GAAG;AAAA,gBAAA;AAAA,gBAEjB,gBAAgB;AAAA,kBACd,GAAG,KAAK;AAAA,kBACR,CAAC,WAAW,GAAG;AAAA,gBAAA;AAAA,cACjB,EACA;AAAA,YACJ;AAAA,UACF;AAGA,cAAI,KAAK,MAAM,WAAW,WAAW,MAAM,WAAW;AACpD,iBAAK,UAAU,SAAS,CAAC,UAAU;AAAA,cACjC,GAAG;AAAA,cACH,UAAU;AAAA,gBACR,GAAG,KAAK;AAAA,gBACR,CAAC,WAAW,GAAG;AAAA,cAAA;AAAA,YACjB,EACA;AAAA,UACJ;AAEA,cAAI,aAAa,aAAa;AAC5B,yBAAa;AAAA,UACf;AAAA,QACF;AAMA,cAAM,eAAe,eAAe,QAAQ;AAC5C;AAAA;AAAA,UAEE,KAAK,MAAM,WAAW,YAAY,KAClC,UAAU,YACV,CAAC;AAAA,UACD;AACA,eAAK,UAAU,SAAS,CAAC,UAAU;AAAA,YACjC,GAAG;AAAA,YACH,UAAU;AAAA,cACR,GAAG,KAAK;AAAA,cACR,CAAC,YAAY,GAAG;AAAA,YAAA;AAAA,UAClB,EACA;AAAA,QACJ;AAMA,cAAM,eAAe,eAAe,QAAQ;AAC5C;AAAA;AAAA,UAEE,KAAK,MAAM,WAAW,YAAY,KAClC,UAAU,YACV,CAAC;AAAA,UACD;AACA,eAAK,UAAU,SAAS,CAAC,UAAU;AAAA,YACjC,GAAG;AAAA,YACH,UAAU;AAAA,cACR,GAAG,KAAK;AAAA,cACR,CAAC,YAAY,GAAG;AAAA,YAAA;AAAA,UAClB,EACA;AAAA,QACJ;AAAA,MACF,CAAC;AAED,aAAO,EAAE,YAAY,gBAAgB,0BAAA;AAAA,IACvC;AAKA,SAAA,gBAAgB,OACd,UAcG;AACH,YAAM,YAAYC,MAAAA,uBAAuB,OAAO;AAAA,QAC9C,GAAG,KAAK;AAAA,QACR,MAAM;AAAA,QACN,iBAAiB,KAAK,QAAQ,mBAAmBF,gBAAAA;AAAAA,MAAA,CAClD;AAED,UAAI,CAAC,KAAK,MAAM,kBAAkB;AAChC,aAAK,UAAU,SAAS,CAAC,UAAU,EAAE,GAAG,MAAM,kBAAkB,KAAA,EAAO;AAAA,MACzE;AAMA,YAAM,WAA0D,CAAA;AAEhE,UAAI;AAIJ,iBAAW,eAAe,WAAW;AACnC,YAAI,CAAC,YAAY,SAAU;AAC3B,cAAM,MAAM,eAAe,YAAY,KAAK;AAC5C,cAAM,qBAAqB,KAAK,MAAM,kBAAkB,GAAG;AAE3D,4BAAoB,oBAAoB,MAAA;AACxC,cAAM,aAAa,IAAI,gBAAA;AAEvB,aAAK,MAAM,kBAAkB,GAAG,IAAI;AAAA,UAClC,qBAAqB;AAAA,QAAA;AAGvB,iBAAS;AAAA,UACP,IAAI,QAA4C,OAAO,YAAY;AACjE,gBAAI;AAIJ,gBAAI;AACF,yBAAW,MAAM,IAAI,QAAQ,CAAC,YAAY,cAAc;AACtD,2BAAW,YAAY;AACrB,sBAAI,WAAW,OAAO,QAAS,QAAO,WAAW,MAAS;AAC1D,sBAAI;AACF;AAAA,sBACE,MAAM,KAAK,aAAa;AAAA,wBACtB,UAAU,YAAY;AAAA,wBACtB,OAAO;AAAA,0BACL,OAAO,KAAK,MAAM;AAAA,0BAClB,SAAS;AAAA,0BACT,kBAAkB;AAAA,0BAClB,QAAQ,WAAW;AAAA,wBAAA;AAAA,wBAErB,MAAM;AAAA,sBAAA,CACP;AAAA,oBAAA;AAAA,kBAEL,SAAS,GAAG;AACV,8BAAU,CAAC;AAAA,kBACb;AAAA,gBACF,GAAG,YAAY,UAAU;AAAA,cAC3B,CAAC;AAAA,YACH,SAAS,GAAY;AACnB,yBAAW;AAAA,YACb;AACA,kBAAM,EAAE,WAAW,aAAa,8BAAA,IAC9B,eAA0B,QAAQ;AAEpC,gBAAI,+BAA+B;AACjC,8CAAgC,gCAC5B;AAAA,gBACE,GAAG;AAAA,gBACH,GAAG;AAAA,cAAA,IAEL;AAAA,YACN;AACA,kBAAM,cAAc,eAAe,YAAY,KAAK;AAEpD,uBAAW,SAAS,OAAO;AAAA,cACzB,KAAK,MAAM;AAAA,YAAA,GACe;AAE1B,kBAAI,KAAK,UAAU,MAAM,cAAc,KAAK,MAAM,QAAW;AAC3D;AAAA,cACF;AAEA,oBAAM,YAAY,KAAK,aAAa,KAAK;AACzC,kBAAI,CAAC,UAAW;AAEhB,oBAAM;AAAA,gBACJ,UAAU;AAAA,gBACV,gBAAgB;AAAA,cAAA,IACd;AAEJ,oBAAM,wBAAwB,gCAAgC,KAAK;AAEnE,oBAAM,EAAE,eAAe,UAAA,IACrBC,4CAAsC;AAAA,gBACpC;AAAA,gBACA;AAAA;AAAA,kBAEE,wBAAwB,WAAW,MAAM;AAAA;AAAA;AAAA,gBAE3C,oBAAoB,kBAAkB,WAAW;AAAA,cAAA,CAClD;AAEH;AAAA;AAAA,gBAEE,kBAAkB,WAAW,MAAM;AAAA,gBACnC;AACA,qBAAK,aAAa,OAAO,CAAC,UAAU;AAAA,kBAClC,GAAG;AAAA,kBACH,UAAU;AAAA,oBACR,GAAG,KAAK;AAAA,oBACR,CAAC,WAAW,GAAG;AAAA,kBAAA;AAAA,kBAEjB,gBAAgB;AAAA,oBACd,GAAG,KAAK;AAAA,oBACR,CAAC,WAAW,GAAG;AAAA,kBAAA;AAAA,gBACjB,EACA;AAAA,cACJ;AAAA,YACF;AAEA,iBAAK,UAAU,SAAS,CAAC,UAAU;AAAA,cACjC,GAAG;AAAA,cACH,UAAU;AAAA,gBACR,GAAG,KAAK;AAAA,gBACR,CAAC,WAAW,GAAG;AAAA,cAAA;AAAA,YACjB,EACA;AAEF;AAAA,cACE,gCACI,EAAE,aAAa,+BAA+B,gBAC9C;AAAA,YAAA;AAAA,UAER,CAAC;AAAA,QAAA;AAAA,MAEL;AAEA,UAAI,UAAgD,CAAA;AAEpD,YAAM,iBAWF,CAAA;AACJ,UAAI,SAAS,QAAQ;AACnB,kBAAU,MAAM,QAAQ,IAAI,QAAQ;AACpC,mBAAW,yBAAyB,SAAS;AAC3C,cAAI,uBAAuB,aAAa;AACtC,kBAAM,EAAE,gBAAgB;AAExB,uBAAW,CAAC,OAAO,UAAU,KAAK,OAAO;AAAA,cACvC,sBAAsB;AAAA,YAAA,GACrB;AACD,oBAAM,cACJ,eAAe,KAA4B,KAAK,CAAA;AAClD,oBAAM,cAAc;AAAA,gBAClB,GAAG;AAAA,gBACH,CAAC,WAAW,GAAG;AAAA,cAAA;AAEjB,6BAAe,KAA4B,IAAI;AAAA,YACjD;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,WAAK,UAAU,SAAS,CAAC,UAAU;AAAA,QACjC,GAAG;AAAA,QACH,kBAAkB;AAAA,MAAA,EAClB;AAEF,aAAO;AAAA,IACT;AAKA,SAAA,WAAW,CACT,UA2BO;AAEP,YAAM,EAAE,YAAY,eAAA,IAAmB,KAAK,aAAa,KAAK;AAE9D,UAAI,cAAc,CAAC,KAAK,QAAQ,aAAa;AAC3C,eAAO;AAAA,MACT;AAGA,aAAO,KAAK,cAAc,KAAK;AAAA,IACjC;AAyJA,SAAA,gBAAgB,CACd,UACiCE,MAAAA,MAAM,KAAK,MAAM,QAAQ,KAAK;AAKjE,SAAA,eAAe,CACb,UAC6B;AAC7B,aAAO,KAAK,MAAM,UAAU,KAAK;AAAA,IACnC;AAKA,SAAA,eAAe,CACb,UACyB;AAEzB,aAAQ,KAAK,UAAU,KAAK,MAAM;AAAA,QAChC,UAAU;AAAA,QACV,mBAAmB;AAAA,UACjB,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,UAAU;AAAA,UACV,SAAS;AAAA,UACT,UAAU;AAAA,UACV,WAAW;AAAA,QAAA;AAAA,MACb;AAAA,IAEJ;AAKA,SAAA,eAAe,CACb,OACA,YACG;AACH,WAAK,UAAU,SAAS,CAAC,SAAS;AAChC,eAAO;AAAA,UACL,GAAG;AAAA,UACH,eAAe;AAAA,YACb,GAAG,KAAK;AAAA,YACR,CAAC,KAAK,GAAGC,MAAAA;AAAAA,cACP;AAAA,cACA,KAAK,cAAc,KAAK;AAAA,YAAA;AAAA,UAC1B;AAAA,QACF;AAAA,MAEJ,CAAC;AAAA,IACH;AAKA,SAAA,iBAAiB,CACf,cACiC;AACjC,aAAO,OAAO,KAAK,SAAS,EAAE;AAAA,QAC5B,CAAC,KAAmC,QAAQ;AAC1C,gBAAM,WAAW;AACjB,cAAI,QAAQ,IAAIC,WAAAA;AAChB,iBAAO;AAAA,QACT;AAAA,QACA,CAAA;AAAA,MAAC;AAAA,IAEL;AAKA,SAAA,gBAAgB,CACd,OACA,SACAP,UACG;AACH,YAAM,iBAAiBA,OAAM,kBAAkB;AAC/C,YAAM,mBAAmBA,OAAM,oBAAoB;AACnD,YAAM,eAAeA,OAAM,gBAAgB;AAE3CD,YAAAA,MAAM,MAAM;AACV,YAAI,CAAC,gBAAgB;AACnB,eAAK,aAAa,OAAO,CAAC,UAAU;AAAA,YAClC,GAAG;AAAA,YACH,WAAW;AAAA,YACX,SAAS;AAAA,YACT,UAAU;AAAA;AAAA,cAER,GAAG,MAAM;AAAA,cACT,SAAS;AAAA,YAAA;AAAA,UACX,EACA;AAAA,QACJ;AAEA,aAAK,UAAU,SAAS,CAAC,SAAS;AAChC,iBAAO;AAAA,YACL,GAAG;AAAA,YACH,QAAQS,MAAAA,MAAM,KAAK,QAAQ,OAAO,OAAO;AAAA,UAAA;AAAA,QAE7C,CAAC;AAAA,MACH,CAAC;AAED,UAAI,CAAC,kBAAkB;AACrB,aAAK,aAAa,KAAK,EAAE,UAAU,wBAAA;AAAA,MACrC;AAEA,UAAI,CAAC,cAAc;AACjB,aAAK,cAAc,OAAO,QAAQ;AAAA,MACpC;AAAA,IACF;AAEA,SAAA,cAAc,CAAqC,UAAkB;AACnE,YAAM,oBAAoB,OAAO,KAAK,KAAK,SAAS,EAAE,OAAO,CAAC,MAAM;AAClE,cAAM,WAAW,MAAM,SAAA;AACvB,eAAO,MAAM,YAAY,EAAE,WAAW,QAAQ;AAAA,MAChD,CAAC;AAED,YAAM,iBAAiB,CAAC,GAAG,mBAAmB,KAAK;AAGnD,WAAK,UAAU,SAAS,CAAC,SAAS;AAChC,cAAM,WAAW,EAAE,GAAG,KAAA;AACtB,uBAAe,QAAQ,CAAC,MAAM;AAC5B,mBAAS,SAASC,MAAAA,SAAS,SAAS,QAAQ,CAAC;AAC7C,iBAAO,KAAK,UAAU,CAAU;AAChC,iBAAO,SAAS,cAAc,CAAU;AAAA,QAC1C,CAAC;AAED,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAKA,SAAA,iBAAiB,CACf,OACA,OAGA,YACG;AACH,WAAK;AAAA,QACH;AAAA,QACA,CAAC,SAAS,CAAC,GAAI,MAAM,QAAQ,IAAI,IAAI,OAAO,CAAA,GAAK,KAAK;AAAA,QACtD;AAAA,MAAA;AAAA,IAEJ;AAEA,SAAA,mBAAmB,OACjB,OACA,OACA,OAGA,YACG;AACH,WAAK;AAAA,QACH;AAAA,QACA,CAAC,SAAS;AACR,iBAAO;AAAA,YACL,GAAI,KAAwC,MAAM,GAAG,KAAK;AAAA,YAC1D;AAAA,YACA,GAAI,KAAwC,MAAM,KAAK;AAAA,UAAA;AAAA,QAE3D;AAAA,QACAC,MAAAA,UAAU,SAAS,EAAE,cAAc,MAAM;AAAA,MAAA;AAI3C,YAAM,KAAK,cAAc,OAAO,QAAQ;AAGxCC,iBAAAA,WAAW,IAAI,EAAE,0BAA0B,OAAO,OAAO,QAAQ;AAEjE,YAAM,KAAK,gCAAgC,OAAO,OAAO,QAAQ;AAAA,IACnE;AAKA,SAAA,oBAAoB,OAClB,OACA,OACA,OAGA,YACG;AACH,WAAK;AAAA,QACH;AAAA,QACA,CAAC,SAAS;AACR,iBAAQ,KAAwC;AAAA,YAAI,CAAC,GAAG,MACtD,MAAM,QAAQ,QAAQ;AAAA,UAAA;AAAA,QAE1B;AAAA,QACAD,MAAAA,UAAU,SAAS,EAAE,cAAc,MAAM;AAAA,MAAA;AAI3C,YAAM,KAAK,cAAc,OAAO,QAAQ;AACxC,YAAM,KAAK,gCAAgC,OAAO,OAAO,QAAQ;AAAA,IACnE;AAKA,SAAA,mBAAmB,OACjB,OACA,OACA,YACG;AACH,YAAM,aAAa,KAAK,cAAc,KAAK;AAE3C,YAAM,YAAY,MAAM,QAAQ,UAAU,IACtC,KAAK,IAAK,WAA8B,SAAS,GAAG,CAAC,IACrD;AAEJ,WAAK;AAAA,QACH;AAAA,QACA,CAAC,SAAS;AACR,iBAAQ,KAAwC;AAAA,YAC9C,CAAC,IAAI,MAAM,MAAM;AAAA,UAAA;AAAA,QAErB;AAAA,QACAA,MAAAA,UAAU,SAAS,EAAE,cAAc,MAAM;AAAA,MAAA;AAI3CC,iBAAAA,WAAW,IAAI,EAAE,0BAA0B,OAAO,OAAO,QAAQ;AAEjE,UAAI,cAAc,MAAM;AACtB,cAAM,QAAQ,GAAG,KAAK,IAAI,SAAS;AACnC,aAAK,YAAY,KAAc;AAAA,MACjC;AAGA,YAAM,KAAK,cAAc,OAAO,QAAQ;AACxC,YAAM,KAAK,gCAAgC,OAAO,OAAO,QAAQ;AAAA,IACnE;AAKA,SAAA,kBAAkB,CAChB,OACA,QACA,QACA,YACG;AACH,WAAK;AAAA,QACH;AAAA,QACA,CAAC,SAAc;AACb,gBAAM,QAAQ,KAAK,MAAM;AACzB,gBAAM,QAAQ,KAAK,MAAM;AACzB,iBAAOH,YAAMA,MAAAA,MAAM,MAAM,GAAG,MAAM,IAAI,KAAK,GAAG,GAAG,MAAM,IAAI,KAAK;AAAA,QAClE;AAAA,QACAE,MAAAA,UAAU,SAAS,EAAE,cAAc,MAAM;AAAA,MAAA;AAI3CC,iBAAAA,WAAW,IAAI,EAAE,0BAA0B,OAAO,QAAQ,QAAQ,MAAM;AAGxE,WAAK,cAAc,OAAO,QAAQ;AAElC,WAAK,cAAc,GAAG,KAAK,IAAI,MAAM,KAA4B,QAAQ;AACzE,WAAK,cAAc,GAAG,KAAK,IAAI,MAAM,KAA4B,QAAQ;AAAA,IAC3E;AAKA,SAAA,kBAAkB,CAChB,OACA,QACA,QACA,YACG;AACH,WAAK;AAAA,QACH;AAAA,QACA,CAAC,SAAc;AACb,gBAAM,OAAY,CAAC,GAAG,IAAI;AAC1B,eAAK,OAAO,QAAQ,GAAG,KAAK,OAAO,QAAQ,CAAC,EAAE,CAAC,CAAC;AAChD,iBAAO;AAAA,QACT;AAAA,QACAD,MAAAA,UAAU,SAAS,EAAE,cAAc,MAAM;AAAA,MAAA;AAI3CC,iBAAAA,WAAW,IAAI,EAAE,0BAA0B,OAAO,QAAQ,QAAQ,MAAM;AAGxE,WAAK,cAAc,OAAO,QAAQ;AAElC,WAAK,cAAc,GAAG,KAAK,IAAI,MAAM,KAA4B,QAAQ;AACzE,WAAK,cAAc,GAAG,KAAK,IAAI,MAAM,KAA4B,QAAQ;AAAA,IAC3E;AAKA,SAAA,mBAAmB,CACjB,OACA,YACG;AACH,YAAM,aAAa,KAAK,cAAc,KAAK;AAE3C,YAAM,YAAY,MAAM,QAAQ,UAAU,IACtC,KAAK,IAAK,WAAyB,SAAS,GAAG,CAAC,IAChD;AAEJ,WAAK;AAAA,QACH;AAAA,QACA,CAAA;AAAA,QACAD,MAAAA,UAAU,SAAS,EAAE,cAAc,MAAM;AAAA,MAAA;AAG3C,UAAI,cAAc,MAAM;AACtB,iBAAS,IAAI,GAAG,KAAK,WAAW,KAAK;AACnC,gBAAM,WAAW,GAAG,KAAK,IAAI,CAAC;AAC9B,eAAK,YAAY,QAAiB;AAAA,QACpC;AAAA,MACF;AAGA,WAAK,cAAc,OAAO,QAAQ;AAAA,IACpC;AAKA,SAAA,aAAa,CAAqC,UAAkB;AAClE,WAAK,UAAU,SAAS,CAAC,SAAS;AAChC,eAAO;AAAA,UACL,GAAG;AAAA,UACH,eAAe;AAAA,YACb,GAAG,KAAK;AAAA,YACR,CAAC,KAAK,GAAGH,WAAAA;AAAAA,UAAA;AAAA,UAEX,QAAQ,KAAK,QAAQ,gBACjBC,MAAAA,MAAM,KAAK,QAAQ,OAAOH,MAAAA,MAAM,KAAK,QAAQ,eAAe,KAAK,CAAC,IAClE,KAAK;AAAA,QAAA;AAAA,MAEb,CAAC;AAAA,IACH;AAqEA,SAAA,eAAe,MA+BV;AACH,aAAO;AAAA,QACL,MAAM;AAAA,UACJ,QAAQ,KAAK,MAAM;AAAA,UACnB,UAAU,KAAK,MAAM;AAAA,QAAA;AAAA,QAEvB,QAAQ,OAAO,QAAQ,KAAK,MAAM,SAAS,EAAE;AAAA,UAC3C,CAAC,KAAK,CAAC,WAAW,SAAS,MAAM;AAC/B,gBACE,OAAO,KAAK,SAAyB,EAAE,UACtC,UAA2B,OAAO,QACnC;AACA,kBAAI,SAAgC,IAAI;AAAA,gBACtC,QAAS,UAA2B;AAAA,gBACpC,UAAW,UAA2B;AAAA,cAAA;AAAA,YAE1C;AAEA,mBAAO;AAAA,UACT;AAAA,UACA,CAAA;AAAA,QAAC;AAAA,MAIH;AAAA,IAEJ;AAOA,SAAA,wBAAwB,CAAC,WAAiD;AACxE,aAAOO,wBAAAA,yBAAyB;AAAA,QAC9B,EAAE,OAAO,KAAK,MAAM,QAAQ,kBAAkB,OAAA;AAAA,QAC9C;AAAA,MAAA;AAAA,IAEJ;AAOA,SAAA,6BAA6B,CAC3B,WACG;AACH,aAAOA,wBAAAA,yBAAyB;AAAA,QAC9B,EAAE,OAAO,KAAK,MAAM,QAAQ,kBAAkB,OAAA;AAAA,QAC9C;AAAA,MAAA;AAAA,IAEJ;AAnnDE,SAAK,aAAa;AAAA,MAChB,aAAa,CAAA;AAAA,MACb,WAAW,CAAA;AAAA,MACX,eAAe,CAAA;AAAA,IAAC;AAGlB,SAAK,UAAU,MAAM,UAAUC,MAAAA,KAAA;AAE/B,SAAK,8BAA8B;AAEnC,SAAK,YAAY,IAAIC,MAAAA;AAAAA,MACnB,oBAAoB;AAAA,QAClB,GAAI,MAAM;AAAA,QACV,QAAQ,MAAM,iBAAiB,MAAM,cAAc;AAAA,MAErD,CAAC;AAAA,IAAA;AAGH,SAAK,mBAAmB,IAAIC,cAAQ;AAAA,MAClC,MAAM,CAAC,KAAK,SAAS;AAAA,MACrB,IAAI,CAAC,EAAE,aAAa,aAAa,SAAS,eAAe;AACvD,cAAM,UAAU;AAGhB,cAAM,gBAAgB,cAAc,CAAC;AACrC,cAAM,gBAAgB,YAAY,CAAC;AAEnC,YAAI,oBAAoB;AAExB,cAAM,YAAY,CAAA;AAclB,mBAAW,aAAa,OAAO;AAAA,UAC7B,cAAc;AAAA,QAAA,GACsC;AACpD,gBAAM,eAAe,cAAc,cACjC,SACF;AAEA,gBAAM,eAAe,eAAe,cAClC,SACF;AAEA,gBAAM,gBACJ,UAAU,SAA0C;AAEtD,gBAAM,cAAcV,MAAAA,MAAM,cAAc,QAAQ,SAAS;AAEzD,cAAI,cAAc,eAAe;AACjC,cACE,CAAC,gBACD,aAAa,aAAa,aAAa,UACvC;AAEA,0BAAc,OAAO,OAAO,aAAa,YAAY,CAAA,CAAE,EAAE;AAAA,cACvD,CAAC,QAAQ,QAAQ;AAAA,YAAA;AAInB,kBAAM,gBAAgB,KAAK,aAAa,SAAS,GAAG;AAEpD,gBAAI,iBAAiB,CAAC,cAAc,QAAQ,kBAAkB;AAC5D,4BAAe,aAAsC;AAAA,gBACnD;AAAA,cAAA;AAAA,YAEJ;AAAA,UACF;AAGA,gBAAM,eAAe,CAACW,sBAAgB,eAAe,CAAA,CAAE;AACvD,gBAAM,kBAAkB,CAAC,aAAa;AACtC,gBAAM,iBACJlB,MAAAA;AAAAA,YACE;AAAA,YACAO,MAAAA,MAAM,KAAK,QAAQ,eAAe,SAAS;AAAA,UAAA,KAE7CP,MAAAA;AAAAA,YACE;AAAA;AAAA,YAEA,KAAK,aAAa,SAAS,GAAG,UAAU,QAAQ;AAAA,UAAA;AAGpD,cACE,iBACA,cAAc,eAAe,mBAC7B,cAAc,YAAY,gBAC1B,cAAc,mBAAmB,kBACjC,cAAc,WAAW,eACzB,iBAAiB,cACjB;AACA,sBAAU,SAAS,IAAI;AACvB;AACA;AAAA,UACF;AAEA,oBAAU,SAAS,IAAI;AAAA,YACrB,GAAG;AAAA,YACH,QAAQ;AAAA,YACR,YAAY;AAAA,YACZ,SAAS;AAAA,YACT;AAAA,UAAA;AAAA,QAEJ;AAEA,YAAI,CAAC,OAAO,KAAK,cAAc,aAAa,EAAE,OAAQ,QAAO;AAE7D,YACE,WACA,sBAAsB,OAAO,KAAK,cAAc,aAAa,EAAE,QAC/D;AACA,iBAAO;AAAA,QACT;AAEA,eAAO;AAAA,MACT;AAAA,IAAA,CACD;AAED,SAAK,QAAQ,IAAIiB,cAAQ;AAAA,MACvB,MAAM,CAAC,KAAK,WAAW,KAAK,gBAAgB;AAAA,MAC5C,IAAI,CAAC,EAAE,aAAa,aAAa,SAAS,eAAe;AACvD,cAAM,UAAU;AAehB,cAAM,gBAAgB,cAAc,CAAC;AACrC,cAAM,gBAAgB,YAAY,CAAC;AACnC,cAAM,gBAAgB,YAAY,CAAC;AAGnC,cAAM,kBAAkB,OAAO,OAAO,aAAa,EAAE;AAAA,UACnD;AAAA,QAAA;AAGF,cAAM,qBAAqB,gBAAgB;AAAA,UACzC,CAAC,UAAU,MAAM;AAAA,QAAA;AAGnB,cAAM,gBAAgB,gBAAgB,MAAM,CAAC,UAAU,MAAM,OAAO;AAEpE,cAAM,YAAY,gBAAgB,KAAK,CAAC,UAAU,MAAM,SAAS;AACjE,cAAM,YAAY,gBAAgB,KAAK,CAAC,UAAU,MAAM,SAAS;AACjE,cAAM,iBAAiB,gBAAgB;AAAA,UACrC,CAAC,UAAU,MAAM;AAAA,QAAA;AAGnB,cAAM;AAAA;AAAA,UAEJ,aAAa,cAAc,UAAU;AAAA;AAEvC,cAAM,UAAU,gBAAgB,KAAK,CAAC,UAAU,MAAM,OAAO;AAC7D,cAAM,aAAa,CAAC;AAEpB,cAAM,kBAAkB;AAAA;AAAA,UAEtB,cAAc,UAAU;AAAA,UAEtB,gBAAgB,KAAK,CAAC,MAAM,GAAG,UAAU,OAAO;AAAA,QAAA;AAGpD,cAAM,eAAe,CAAC,CAAC;AAGvB,YAAI,SAAS,SAAS,UAAU,CAAA;AAChC,YACE,CAAC,iBACD,cAAc,aAAa,cAAc,UACzC;AACA,mBAAS,OAAO,OAAO,cAAc,QAAQ,EAAE,OAW7C,CAAC,MAAM,SAAS;AAChB,gBAAI,SAAS,OAAW,QAAO;AAE/B,gBAAI,QAAQE,kCAA4B,IAAI,GAAG;AAC7C,mBAAK,KAAK,KAAK,IAAa;AAC5B,qBAAO;AAAA,YACT;AACA,iBAAK,KAAK,IAAa;AACvB,mBAAO;AAAA,UACT,GAAG,CAAA,CAAE;AAAA,QACP;AAEA,cAAM,cAAc,OAAO,WAAW;AACtC,cAAM,UAAU,iBAAiB;AACjC,cAAM,gBAAgB,KAAK,QAAQ,wBAAwB;AAC3D,cAAM,YACH,cAAc,uBAAuB,KACpC,CAAC,aACD,CAAC,mBACF,CAAC,gBAAgB,CAAC,cAAc,gBAAgB,WACjD;AAEF,YAAI,WAAW,cAAc;AAC7B,YAAI,yBAAyB;AAC3B,mBAAS,OAAO;AAAA,YACd,CAAC,QAAQ,QAAQ,cAAc,SAAS;AAAA,UAAA;AAE1C,qBAAW,OAAO,OAAO,UAAU,EAAE,SAAS,QAAW;AAAA,QAC3D;AAEA,YACE,WACA,iBACA,QAAQ,aAAa,YACrB,QAAQ,cAAc,KAAK,iBAAiB,SAC5C,QAAQ,WAAW,UACnB,QAAQ,uBAAuB,sBAC/B,QAAQ,kBAAkB,iBAC1B,QAAQ,gBAAgB,eACxB,QAAQ,YAAY,WACpB,QAAQ,cAAc,aACtB,QAAQ,cAAc,aACtB,QAAQ,cAAc,aACtB,QAAQ,eAAe,cACvB,QAAQ,mBAAmB,kBAC3B,QAAQ,YAAY,WACpBnB,MAAAA,SAAS,eAAe,aAAa,GACrC;AACA,iBAAO;AAAA,QACT;AAEA,YAAI,QAAQ;AAAA,UACV,GAAG;AAAA,UACH;AAAA,UACA,WAAW,KAAK,iBAAiB;AAAA,UACjC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAgBF,cAAM,iBAAiB,KAAK,QAAQ,WAAW,QAAQ,CAAA;AACvD,cAAM,kBACJ,eAAe,WAAW,KAAK,mBAAmB,UAClD,eAAe,KAAK,CAAC,KAAK,MAAM,QAAQ,KAAK,mBAAmB,CAAC,CAAC;AAEpE,YAAI,iBAAiB;AACnB,gBAAM,SAAS,OAAO,OAAO,CAAA,GAAI,MAAM,EAAE,OAAO;AAEhD,eAAK,QAAQ,WAAW,GAAG,MAAM;AACjC,kBAAQ,OAAO;AACf,eAAK,qBAAqB;AAAA,QAC5B;AAEA,eAAO;AAAA,MACT;AAAA,IAAA,CACD;AAED,SAAK,eAAe,KAAK,aAAa,KAAK,IAAI;AAE/C,SAAK,OAAO,QAAQ,EAAE;AAEtB,SAAK,MAAM,UAAU,MAAM;AACzBD,kBAAAA,gBAAgB,KAAK,qBAAqB;AAAA,QACxC,IAAI,KAAK;AAAA,QACT,OAAO,KAAK,MAAM;AAAA,QAClB,SAAS,KAAK;AAAA,MAAA,CACf;AAAA,IACH,CAAC;AAEDA,gBAAAA,gBAAgB,GAAG,sBAAsB,CAAC,MAAM;AAC9C,UAAI,EAAE,QAAQ,OAAO,KAAK,SAAS;AACjCA,oBAAAA,gBAAgB,KAAK,qBAAqB;AAAA,UACxC,IAAI,KAAK;AAAA,UACT,OAAO,KAAK,MAAM;AAAA,UAClB,SAAS,KAAK;AAAA,QAAA,CACf;AAAA,MACH;AAAA,IACF,CAAC;AAEDA,gBAAAA,gBAAgB,GAAG,sBAAsB,CAAC,MAAM;AAC9C,UAAI,EAAE,QAAQ,OAAO,KAAK,SAAS;AACjC,aAAK,MAAA;AAAA,MACP;AAAA,IACF,CAAC;AAEDA,gBAAAA,gBAAgB,GAAG,6BAA6B,CAAC,MAAM;AACrD,UAAI,EAAE,QAAQ,OAAO,KAAK,SAAS;AACjC,aAAK,8BAA8B;AACnC,aAAK,aAAA;AACL,aAAK,8BAA8B;AAAA,MACrC;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EA1XA,IAAI,QAAQ;AACV,WAAO,KAAK,MAAM;AAAA,EACpB;AAAA,EA0XA,IAAI,SAAiB;AACnB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,aAKE,OAMU;AACV,QAAIqB,wBAAAA,0BAA0B,MAAM,QAAQ,GAAG;AAC7C,aAAON,wBAAAA,yBAAyB,MAAM,IAAI;AAAA,QACxC,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IAEV;AAEA,WAAQ,MAAM,SAAiC,MAAM,KAAK;AAAA,EAC5D;AAAA,EAooBA,MAAM,aAAa,YAAyC;AAC1D,SAAK,UAAU,SAAS,CAAC,SAAS;AAAA,MAChC,GAAG;AAAA;AAAA,MAEH,aAAa;AAAA;AAAA,MAEb,oBAAoB,IAAI,qBAAqB;AAAA,MAC7C,oBAAoB;AAAA;AAAA,IAAA,EACpB;AAEFb,UAAAA,MAAM,MAAM;AACV,WAAM,OAAO,OAAO,KAAK,SAAS,EAAuB;AAAA,QACvD,CAAC,UAAU;AACT,cAAI,CAAC,MAAM,SAAU;AAErB,cAAI,CAAC,MAAM,SAAS,MAAM,KAAK,WAAW;AAExC,kBAAM,SAAS,QAAQ,CAAC,UAAU,EAAE,GAAG,MAAM,WAAW,KAAA,EAAO;AAAA,UACjE;AAAA,QACF;AAAA,MAAA;AAAA,IAEJ,CAAC;AAED,UAAM,gBACJ,cAAe,KAAK,QAAQ;AAE9B,QAAI,CAAC,KAAK,MAAM,aAAa,CAAC,KAAK,6BAA6B;AAC9D,WAAK,QAAQ,kBAAkB;AAAA,QAC7B,OAAO,KAAK,MAAM;AAAA,QAClB,SAAS;AAAA,QACT,MAAM;AAAA,MAAA,CACP;AACD;AAAA,IACF;AAEA,SAAK,UAAU,SAAS,CAAC,OAAO,EAAE,GAAG,GAAG,cAAc,KAAA,EAAO;AAE7D,UAAM,OAAO,MAAM;AACjB,WAAK,UAAU,SAAS,CAAC,UAAU,EAAE,GAAG,MAAM,cAAc,MAAA,EAAQ;AAAA,IACtE;AAEA,UAAM,KAAK,kBAAkB,QAAQ;AAErC,QAAI,CAAC,KAAK,MAAM,eAAe;AAC7B,WAAA;AAEA,WAAK,QAAQ,kBAAkB;AAAA,QAC7B,OAAO,KAAK,MAAM;AAAA,QAClB,SAAS;AAAA,QACT,MAAM;AAAA,MAAA,CACP;AAEDF,kBAAAA,gBAAgB,KAAK,gCAAgC;AAAA,QACnD,IAAI,KAAK;AAAA,QACT,mBAAmB,KAAK,MAAM;AAAA,QAC9B,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,QAAS,OAAO,OAAO,KAAK,MAAM,SAAS,EACxC,IAAI,CAAC,SAAuB,KAAK,MAAM,EACvC,KAAA;AAAA,MAAK,CACT;AACD;AAAA,IACF;AAEA,UAAM,KAAK,SAAS,QAAQ;AAG5B,QAAI,CAAC,KAAK,MAAM,SAAS;AACvB,WAAA;AAEA,WAAK,QAAQ,kBAAkB;AAAA,QAC7B,OAAO,KAAK,MAAM;AAAA,QAClB,SAAS;AAAA,QACT,MAAM;AAAA,MAAA,CACP;AAEDA,kBAAAA,gBAAgB,KAAK,gCAAgC;AAAA,QACnD,IAAI,KAAK;AAAA,QACT,mBAAmB,KAAK,MAAM;AAAA,QAC9B,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,QAAQ,KAAK,MAAM;AAAA,MAAA,CACpB;AAED;AAAA,IACF;AAEAE,UAAAA,MAAM,MAAM;AACV,WAAM,OAAO,OAAO,KAAK,SAAS,EAA6B;AAAA,QAC7D,CAAC,UAAU;AACT,gBAAM,UAAU,QAAQ,WAAW,WAAW;AAAA,YAC5C,OAAO,MAAM,SAAS,MAAM;AAAA,YAC5B,UAAU,MAAM;AAAA,UAAA,CACjB;AAAA,QACH;AAAA,MAAA;AAAA,IAEJ,CAAC;AAED,SAAK,QAAQ,WAAW,WAAW,EAAE,SAAS,MAAM,MAAM,eAAe;AAEzE,QAAI;AAEF,YAAM,KAAK,QAAQ,WAAW;AAAA,QAC5B,OAAO,KAAK,MAAM;AAAA,QAClB,SAAS;AAAA,QACT,MAAM;AAAA,MAAA,CACP;AAEDA,YAAAA,MAAM,MAAM;AACV,aAAK,UAAU,SAAS,CAAC,UAAU;AAAA,UACjC,GAAG;AAAA,UACH,aAAa;AAAA,UACb,oBAAoB;AAAA;AAAA,QAAA,EACpB;AAEFF,oBAAAA,gBAAgB,KAAK,gCAAgC;AAAA,UACnD,IAAI,KAAK;AAAA,UACT,mBAAmB,KAAK,MAAM;AAAA,UAC9B,YAAY;AAAA,QAAA,CACb;AAED,aAAA;AAAA,MACF,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,WAAK,UAAU,SAAS,CAAC,UAAU;AAAA,QACjC,GAAG;AAAA,QACH,oBAAoB;AAAA;AAAA,MAAA,EACpB;AAEFA,kBAAAA,gBAAgB,KAAK,gCAAgC;AAAA,QACnD,IAAI,KAAK;AAAA,QACT,mBAAmB,KAAK,MAAM;AAAA,QAC9B,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,SAAS;AAAA,MAAA,CACV;AAED,WAAA;AAEA,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAqWA,YACE,UAaA;AACAE,UAAAA,MAAM,MAAM;AACV,aAAO,QAAQ,QAAQ,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AACjD,cAAM,cAAc;AAEpB,YAAIkB,MAAAA,4BAA4B,KAAK,GAAG;AACtC,gBAAM,EAAE,WAAW,gBAAgB,eAA0B,KAAK;AAElE,qBAAW,aAAa,OAAO;AAAA,YAC7B,KAAK;AAAA,UAAA,GACqB;AAC1B,kBAAM,YAAY,KAAK,aAAa,SAAS;AAC7C,gBAAI,CAAC,UAAW;AAEhB,iBAAK,aAAa,WAAW,CAAC,UAAU;AAAA,cACtC,GAAG;AAAA,cACH,UAAU;AAAA,gBACR,GAAG,KAAK;AAAA,gBACR,CAAC,WAAW,GAAG,cAAc,SAAS;AAAA,cAAA;AAAA,cAExC,gBAAgB;AAAA,gBACd,GAAG,KAAK;AAAA,gBACR,CAAC,WAAW,GAAG;AAAA,cAAA;AAAA,YACjB,EACA;AAAA,UACJ;AAEA,eAAK,UAAU,SAAS,CAAC,UAAU;AAAA,YACjC,GAAG;AAAA,YACH,UAAU;AAAA,cACR,GAAG,KAAK;AAAA,cACR,CAAC,WAAW,GAAG;AAAA,YAAA;AAAA,UACjB,EACA;AAAA,QACJ,OAAO;AACL,eAAK,UAAU,SAAS,CAAC,UAAU;AAAA,YACjC,GAAG;AAAA,YACH,UAAU;AAAA,cACR,GAAG,KAAK;AAAA,cACR,CAAC,WAAW,GAAG;AAAA,YAAA;AAAA,UACjB,EACA;AAAA,QACJ;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAyFF;AAEA,SAAS,eAA0B,UAGjC;AACA,MAAI,UAAU;AACZ,QAAIA,MAAAA,4BAA4B,QAAQ,GAAG;AACzC,YAAM,YAAY,eAAe,SAAS,IAAI,EAAE;AAChD,YAAM,cAAc,SAAS;AAC7B,aAAO,EAAE,WAAW,YAAA;AAAA,IACtB;AAEA,WAAO,EAAE,WAAW,SAAA;AAAA,EACtB;AAEA,SAAO,EAAE,WAAW,OAAA;AACtB;AAEA,SAAS,eAAe,OAAwB;AAC9C,UAAQ,OAAA;AAAA,IACN,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL;AACE,aAAO;AAAA,EAAA;AAEb;;"}
@@ -172,6 +172,9 @@ class FormApi {
172
172
  for (const field of Object.keys(
173
173
  this.state.fieldMeta
174
174
  )) {
175
+ if (this.baseStore.state.fieldMetaBase[field] === void 0) {
176
+ continue;
177
+ }
175
178
  const fieldMeta = this.getFieldMeta(field);
176
179
  if (!fieldMeta) continue;
177
180
  const {
@@ -312,6 +315,9 @@ class FormApi {
312
315
  for (const field of Object.keys(
313
316
  this.state.fieldMeta
314
317
  )) {
318
+ if (this.baseStore.state.fieldMetaBase[field] === void 0) {
319
+ continue;
320
+ }
315
321
  const fieldMeta = this.getFieldMeta(field);
316
322
  if (!fieldMeta) continue;
317
323
  const {
@@ -1 +1 @@
1
- {"version":3,"file":"FormApi.js","sources":["../../src/FormApi.ts"],"sourcesContent":["import { Derived, Store, batch } from '@tanstack/store'\n\nimport {\n deleteBy,\n determineFormLevelErrorSourceAndValue,\n evaluate,\n functionalUpdate,\n getAsyncValidatorArray,\n getBy,\n getSyncValidatorArray,\n isGlobalFormValidationError,\n isNonEmptyArray,\n mergeOpts,\n setBy,\n uuid,\n} from './utils'\nimport { defaultValidationLogic } from './ValidationLogic'\n\nimport {\n isStandardSchemaValidator,\n standardSchemaValidators,\n} from './standardSchemaValidator'\nimport { defaultFieldMeta, metaHelper } from './metaHelper'\nimport { formEventClient } from './EventClient'\nimport type {\n RequestFormForceReset,\n RequestFormReset,\n RequestFormState,\n} from './EventClient'\nimport type { ValidationLogicFn } from './ValidationLogic'\nimport type {\n StandardSchemaV1,\n StandardSchemaV1Issue,\n TStandardSchemaValidatorValue,\n} from './standardSchemaValidator'\nimport type {\n AnyFieldApi,\n AnyFieldMeta,\n AnyFieldMetaBase,\n FieldApi,\n} from './FieldApi'\nimport type {\n ExtractGlobalFormError,\n FieldManipulator,\n FormValidationError,\n FormValidationErrorMap,\n ListenerCause,\n UpdateMetaOptions,\n ValidationCause,\n ValidationError,\n ValidationErrorMap,\n ValidationErrorMapKeys,\n} from './types'\nimport type { DeepKeys, DeepKeysOfType, DeepValue } from './util-types'\nimport type { Updater } from './utils'\n\n/**\n * @private\n */\n// TODO: Add the `Unwrap` type to the errors\ntype FormErrorMapFromValidator<\n TFormData,\n TOnMount extends undefined | FormValidateOrFn<TFormData>,\n TOnChange extends undefined | FormValidateOrFn<TFormData>,\n TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n> = Partial<\n Record<\n DeepKeys<TFormData>,\n ValidationErrorMap<\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync\n >\n >\n>\n\nexport type FormValidateFn<TFormData> = (props: {\n value: TFormData\n formApi: FormApi<\n TFormData,\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 >\n}) => unknown\n\n/**\n * @private\n */\nexport type FormValidateOrFn<TFormData> =\n | FormValidateFn<TFormData>\n | StandardSchemaV1<TFormData, unknown>\n\nexport type UnwrapFormValidateOrFn<\n TValidateOrFn extends undefined | FormValidateOrFn<any>,\n> = [TValidateOrFn] extends [FormValidateFn<any>]\n ? ExtractGlobalFormError<ReturnType<TValidateOrFn>>\n : [TValidateOrFn] extends [StandardSchemaV1<any, any>]\n ? Record<string, StandardSchemaV1Issue[]>\n : undefined\n\n/**\n * @private\n */\nexport type FormValidateAsyncFn<TFormData> = (props: {\n value: TFormData\n formApi: FormApi<\n TFormData,\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 >\n signal: AbortSignal\n}) => unknown | Promise<unknown>\n\nexport type FormValidator<TFormData, TType, TFn = unknown> = {\n validate(options: { value: TType }, fn: TFn): ValidationError\n validateAsync(\n options: { value: TType },\n fn: TFn,\n ): Promise<FormValidationError<TFormData>>\n}\n\ntype ValidationPromiseResult<TFormData> =\n | {\n fieldErrors: Partial<Record<DeepKeys<TFormData>, ValidationError>>\n errorMapKey: ValidationErrorMapKeys\n }\n | undefined\n\n/**\n * @private\n */\nexport type FormAsyncValidateOrFn<TFormData> =\n | FormValidateAsyncFn<TFormData>\n | StandardSchemaV1<TFormData, unknown>\n\nexport type UnwrapFormAsyncValidateOrFn<\n TValidateOrFn extends undefined | FormAsyncValidateOrFn<any>,\n> = [TValidateOrFn] extends [FormValidateAsyncFn<any>]\n ? ExtractGlobalFormError<Awaited<ReturnType<TValidateOrFn>>>\n : [TValidateOrFn] extends [StandardSchemaV1<any, any>]\n ? Record<string, StandardSchemaV1Issue[]>\n : undefined\n\nexport interface FormValidators<\n TFormData,\n TOnMount extends undefined | FormValidateOrFn<TFormData>,\n TOnChange extends undefined | FormValidateOrFn<TFormData>,\n TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n> {\n /**\n * Optional function that fires as soon as the component mounts.\n */\n onMount?: TOnMount\n /**\n * Optional function that checks the validity of your data whenever a value changes\n */\n onChange?: TOnChange\n /**\n * Optional onChange asynchronous counterpart to onChange. Useful for more complex validation logic that might involve server requests.\n */\n onChangeAsync?: TOnChangeAsync\n /**\n * The default time in milliseconds that 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 * Optional function that validates the form data when a field loses focus, returns a `FormValidationError`\n */\n onBlur?: TOnBlur\n /**\n * Optional onBlur asynchronous validation method for when a field loses focus returns a ` FormValidationError` or a promise of `Promise<FormValidationError>`\n */\n onBlurAsync?: TOnBlurAsync\n /**\n * The default time in milliseconds that 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 onSubmit?: TOnSubmit\n onSubmitAsync?: TOnSubmitAsync\n onDynamic?: TOnDynamic\n onDynamicAsync?: TOnDynamicAsync\n onDynamicAsyncDebounceMs?: number\n}\n\n/**\n * @private\n */\nexport interface FormTransform<\n TFormData,\n TOnMount extends undefined | FormValidateOrFn<TFormData>,\n TOnChange extends undefined | FormValidateOrFn<TFormData>,\n TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n TSubmitMeta = never,\n> {\n fn: (\n formBase: FormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >,\n ) => FormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >\n deps: unknown[]\n}\n\nexport interface FormListeners<\n TFormData,\n TOnMount extends undefined | FormValidateOrFn<TFormData>,\n TOnChange extends undefined | FormValidateOrFn<TFormData>,\n TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n TSubmitMeta = never,\n> {\n onChange?: (props: {\n formApi: FormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >\n fieldApi: AnyFieldApi\n }) => void\n onChangeDebounceMs?: number\n\n onBlur?: (props: {\n formApi: FormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >\n fieldApi: AnyFieldApi\n }) => void\n onBlurDebounceMs?: number\n\n onMount?: (props: {\n formApi: FormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >\n }) => void\n\n onSubmit?: (props: {\n formApi: FormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >\n meta: TSubmitMeta\n }) => void\n}\n\n/**\n * An object representing the base properties of a form, unrelated to any validators\n */\nexport interface BaseFormOptions<in out TFormData, in out TSubmitMeta = never> {\n /**\n * Set initial values for your form.\n */\n defaultValues?: TFormData\n /**\n * onSubmitMeta, the data passed from the handleSubmit handler, to the onSubmit function props\n */\n onSubmitMeta?: TSubmitMeta\n}\n\n/**\n * An object representing the options for a form.\n */\nexport interface FormOptions<\n in out TFormData,\n in out TOnMount extends undefined | FormValidateOrFn<TFormData>,\n in out TOnChange extends undefined | FormValidateOrFn<TFormData>,\n in out TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n in out TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n in out TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n in out TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TSubmitMeta = never,\n> extends BaseFormOptions<TFormData, TSubmitMeta> {\n /**\n * The form name, used for devtools and identification\n */\n formId?: string\n /**\n * The default state for the form.\n */\n defaultState?: Partial<\n FormState<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer\n >\n >\n /**\n * If true, always run async validation, even when sync validation has produced an error. Defaults to undefined.\n */\n asyncAlways?: boolean\n /**\n * Optional time in milliseconds if you want to introduce a delay before firing off an async action.\n */\n asyncDebounceMs?: number\n /**\n * If true, allows the form to be submitted in an invalid state i.e. canSubmit will remain true regardless of validation errors. Defaults to undefined.\n */\n canSubmitWhenInvalid?: boolean\n /**\n * A list of validators to pass to the form\n */\n validators?: FormValidators<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync\n >\n\n validationLogic?: ValidationLogicFn\n\n /**\n * form level listeners\n */\n listeners?: FormListeners<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >\n\n /**\n * A function to be called when the form is submitted, what should happen once the user submits a valid form returns `any` or a promise `Promise<any>`\n */\n onSubmit?: (props: {\n value: TFormData\n formApi: FormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >\n meta: TSubmitMeta\n }) => any | Promise<any>\n /**\n * Specify an action for scenarios where the user tries to submit an invalid form.\n */\n onSubmitInvalid?: (props: {\n value: TFormData\n formApi: FormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >\n meta: TSubmitMeta\n }) => void\n transform?: FormTransform<\n NoInfer<TFormData>,\n NoInfer<TOnMount>,\n NoInfer<TOnChange>,\n NoInfer<TOnChangeAsync>,\n NoInfer<TOnBlur>,\n NoInfer<TOnBlurAsync>,\n NoInfer<TOnSubmit>,\n NoInfer<TOnSubmitAsync>,\n NoInfer<TOnDynamic>,\n NoInfer<TOnDynamicAsync>,\n NoInfer<TOnServer>,\n NoInfer<TSubmitMeta>\n >\n}\n\nexport type AnyFormOptions = FormOptions<\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 representing the validation metadata for a field. Not intended for public usage.\n */\nexport type ValidationMeta = {\n /**\n * An abort controller stored in memory to cancel previous async validation attempts.\n */\n lastAbortController: AbortController\n}\n\n/**\n * An object representing the field information for a specific field within the form.\n */\nexport type FieldInfo<TFormData> = {\n /**\n * An instance of the FieldAPI.\n */\n instance: FieldApi<\n TFormData,\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 any,\n any,\n any\n > | null\n /**\n * A record of field validation internal handling.\n */\n validationMetaMap: Record<ValidationErrorMapKeys, ValidationMeta | undefined>\n}\n\n/**\n * An object representing the current state of the form.\n */\nexport type BaseFormState<\n in out TFormData,\n in out TOnMount extends undefined | FormValidateOrFn<TFormData>,\n in out TOnChange extends undefined | FormValidateOrFn<TFormData>,\n in out TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n in out TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n in out TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n in out TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n> = {\n /**\n * The current values of the form fields.\n */\n values: TFormData\n /**\n * The error map for the form itself.\n */\n errorMap: ValidationErrorMap<\n UnwrapFormValidateOrFn<TOnMount>,\n UnwrapFormValidateOrFn<TOnChange>,\n UnwrapFormAsyncValidateOrFn<TOnChangeAsync>,\n UnwrapFormValidateOrFn<TOnBlur>,\n UnwrapFormAsyncValidateOrFn<TOnBlurAsync>,\n UnwrapFormValidateOrFn<TOnSubmit>,\n UnwrapFormAsyncValidateOrFn<TOnSubmitAsync>,\n UnwrapFormValidateOrFn<TOnDynamic>,\n UnwrapFormAsyncValidateOrFn<TOnDynamicAsync>,\n UnwrapFormAsyncValidateOrFn<TOnServer>\n >\n /**\n * An internal mechanism used for keeping track of validation logic in a form.\n */\n validationMetaMap: Record<ValidationErrorMapKeys, ValidationMeta | undefined>\n /**\n * A record of field metadata for each field in the form, not including the derived properties, like `errors` and such\n */\n fieldMetaBase: Record<DeepKeys<TFormData>, AnyFieldMetaBase>\n /**\n * A boolean indicating if the form is currently in the process of being submitted after `handleSubmit` is called.\n *\n * Goes back to `false` when submission completes for one of the following reasons:\n * - the validation step returned errors.\n * - the `onSubmit` function has completed.\n *\n * Note: if you're running async operations in your `onSubmit` function make sure to await them to ensure `isSubmitting` is set to `false` only when the async operation completes.\n *\n * This is useful for displaying loading indicators or disabling form inputs during submission.\n *\n */\n isSubmitting: boolean\n /**\n * A boolean indicating if the `onSubmit` function has completed successfully.\n *\n * Goes back to `false` at each new submission attempt.\n *\n * Note: you can use isSubmitting to check if the form is currently submitting.\n */\n isSubmitted: boolean\n /**\n * A boolean indicating if the form or any of its fields are currently validating.\n */\n isValidating: boolean\n /**\n * A counter for tracking the number of submission attempts.\n */\n submissionAttempts: number\n /**\n * A boolean indicating if the last submission was successful.\n */\n isSubmitSuccessful: boolean\n /**\n * @private, used to force a re-evaluation of the form state when options change\n */\n _force_re_eval?: boolean\n}\n\nexport type DerivedFormState<\n in out TFormData,\n in out TOnMount extends undefined | FormValidateOrFn<TFormData>,\n in out TOnChange extends undefined | FormValidateOrFn<TFormData>,\n in out TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n in out TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n in out TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n in out TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n> = {\n /**\n * A boolean indicating if the form is currently validating.\n */\n isFormValidating: boolean\n /**\n * A boolean indicating if the form is valid.\n */\n isFormValid: boolean\n /**\n * The error array for the form itself.\n */\n errors: Array<\n | UnwrapFormValidateOrFn<TOnMount>\n | UnwrapFormValidateOrFn<TOnChange>\n | UnwrapFormAsyncValidateOrFn<TOnChangeAsync>\n | UnwrapFormValidateOrFn<TOnBlur>\n | UnwrapFormAsyncValidateOrFn<TOnBlurAsync>\n | UnwrapFormValidateOrFn<TOnSubmit>\n | UnwrapFormAsyncValidateOrFn<TOnSubmitAsync>\n | UnwrapFormValidateOrFn<TOnDynamic>\n | UnwrapFormAsyncValidateOrFn<TOnDynamicAsync>\n | UnwrapFormAsyncValidateOrFn<TOnServer>\n >\n /**\n * A boolean indicating if any of the form fields are currently validating.\n */\n isFieldsValidating: boolean\n /**\n * A boolean indicating if all the form fields are valid. Evaluates `true` if there are no field errors.\n */\n isFieldsValid: boolean\n /**\n * A boolean indicating if any of the form fields have been touched.\n */\n isTouched: boolean\n /**\n * A boolean indicating if any of the form fields have been blurred.\n */\n isBlurred: boolean\n /**\n * A boolean indicating if any of the form's fields' values have been modified by the user. Evaluates `true` if the user have modified at least one of the fields. Opposite of `isPristine`.\n */\n isDirty: boolean\n /**\n * A boolean indicating if none of the form's fields' values have been modified by the user. Evaluates `true` if the user have not modified any of the fields. Opposite of `isDirty`.\n */\n isPristine: boolean\n /**\n * A boolean indicating if all of the form's fields are the same as default values.\n */\n isDefaultValue: boolean\n /**\n * A boolean indicating if the form and all its fields are valid. Evaluates `true` if there are no errors.\n */\n isValid: boolean\n /**\n * A boolean indicating if the form can be submitted based on its current state.\n */\n canSubmit: boolean\n /**\n * A record of field metadata for each field in the form.\n */\n fieldMeta: Record<DeepKeys<TFormData>, AnyFieldMeta>\n}\n\nexport interface FormState<\n in out TFormData,\n in out TOnMount extends undefined | FormValidateOrFn<TFormData>,\n in out TOnChange extends undefined | FormValidateOrFn<TFormData>,\n in out TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n in out TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n in out TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n in out TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n> extends BaseFormState<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer\n >,\n DerivedFormState<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer\n > {}\n\nexport type AnyFormState = FormState<\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n>\n\nfunction getDefaultFormState<\n TFormData,\n TOnMount extends undefined | FormValidateOrFn<TFormData>,\n TOnChange extends undefined | FormValidateOrFn<TFormData>,\n TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n>(\n defaultState: Partial<\n FormState<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer\n >\n >,\n): BaseFormState<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer\n> {\n return {\n values: defaultState.values ?? ({} as never),\n errorMap: defaultState.errorMap ?? {},\n fieldMetaBase: defaultState.fieldMetaBase ?? ({} as never),\n isSubmitted: defaultState.isSubmitted ?? false,\n isSubmitting: defaultState.isSubmitting ?? false,\n isValidating: defaultState.isValidating ?? false,\n submissionAttempts: defaultState.submissionAttempts ?? 0,\n isSubmitSuccessful: defaultState.isSubmitSuccessful ?? false,\n validationMetaMap: defaultState.validationMetaMap ?? {\n onChange: undefined,\n onBlur: undefined,\n onSubmit: undefined,\n onMount: undefined,\n onServer: undefined,\n onDynamic: undefined,\n },\n }\n}\n\n/**\n * @public\n *\n * A type representing the Form API with all generics set to `any` for convenience.\n */\nexport type AnyFormApi = FormApi<\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 Form API. It handles the logic and interactions with the form state.\n *\n * Normally, you will not need to create a new `FormApi` instance directly. Instead, you will use a framework\n * hook/function like `useForm` or `createForm` 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 the `new FormApi` constructor.\n */\nexport class FormApi<\n in out TFormData,\n in out TOnMount extends undefined | FormValidateOrFn<TFormData>,\n in out TOnChange extends undefined | FormValidateOrFn<TFormData>,\n in out TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n in out TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n in out TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n in out TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TSubmitMeta = never,\n> implements FieldManipulator<TFormData, TSubmitMeta>\n{\n /**\n * The options for the form.\n */\n options: FormOptions<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n > = {}\n baseStore!: Store<\n BaseFormState<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer\n >\n >\n fieldMetaDerived!: Derived<Record<DeepKeys<TFormData>, AnyFieldMeta>>\n store!: Derived<\n FormState<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer\n >\n >\n /**\n * A record of field information for each field in the form.\n */\n fieldInfo: Record<DeepKeys<TFormData>, FieldInfo<TFormData>> = {} as any\n\n get state() {\n return this.store.state\n }\n\n /**\n * @private\n */\n prevTransformArray: unknown[] = []\n\n /**\n * @private\n */\n timeoutIds: {\n validations: Record<ValidationCause, ReturnType<typeof setTimeout> | null>\n listeners: Record<ListenerCause, ReturnType<typeof setTimeout> | null>\n formListeners: Record<ListenerCause, ReturnType<typeof setTimeout> | null>\n }\n /**\n * @private\n */\n private _formId: string\n /**\n * @private\n */\n private _devtoolsSubmissionOverride: boolean\n\n /**\n * Constructs a new `FormApi` instance with the given form options.\n */\n constructor(\n opts?: FormOptions<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >,\n ) {\n this.timeoutIds = {\n validations: {} as Record<ValidationCause, never>,\n listeners: {} as Record<ListenerCause, never>,\n formListeners: {} as Record<ListenerCause, never>,\n }\n\n this._formId = opts?.formId ?? uuid()\n\n this._devtoolsSubmissionOverride = false\n\n this.baseStore = new Store(\n getDefaultFormState({\n ...(opts?.defaultState as any),\n values: opts?.defaultValues ?? opts?.defaultState?.values,\n isFormValid: true,\n }),\n )\n\n this.fieldMetaDerived = new Derived({\n deps: [this.baseStore],\n fn: ({ prevDepVals, currDepVals, prevVal: _prevVal }) => {\n const prevVal = _prevVal as\n | Record<DeepKeys<TFormData>, AnyFieldMeta>\n | undefined\n const prevBaseStore = prevDepVals?.[0]\n const currBaseStore = currDepVals[0]\n\n let originalMetaCount = 0\n\n const fieldMeta = {} as FormState<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer\n >['fieldMeta']\n\n for (const fieldName of Object.keys(\n currBaseStore.fieldMetaBase,\n ) as Array<keyof typeof currBaseStore.fieldMetaBase>) {\n const currBaseMeta = currBaseStore.fieldMetaBase[\n fieldName as never\n ] as AnyFieldMetaBase\n\n const prevBaseMeta = prevBaseStore?.fieldMetaBase[\n fieldName as never\n ] as AnyFieldMetaBase | undefined\n\n const prevFieldInfo =\n prevVal?.[fieldName as never as keyof typeof prevVal]\n\n const curFieldVal = getBy(currBaseStore.values, fieldName)\n\n let fieldErrors = prevFieldInfo?.errors\n if (\n !prevBaseMeta ||\n currBaseMeta.errorMap !== prevBaseMeta.errorMap\n ) {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n fieldErrors = Object.values(currBaseMeta.errorMap ?? {}).filter(\n (val) => val !== undefined,\n ) as never\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n const fieldInstance = this.getFieldInfo(fieldName)?.instance\n\n if (fieldInstance && !fieldInstance.options.disableErrorFlat) {\n fieldErrors = (fieldErrors as undefined | string[])?.flat(\n 1,\n ) as never\n }\n }\n\n // As primitives, we don't need to aggressively persist the same referential value for performance reasons\n const isFieldValid = !isNonEmptyArray(fieldErrors ?? [])\n const isFieldPristine = !currBaseMeta.isDirty\n const isDefaultValue =\n evaluate(\n curFieldVal,\n getBy(this.options.defaultValues, fieldName),\n ) ||\n evaluate(\n curFieldVal,\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n this.getFieldInfo(fieldName)?.instance?.options.defaultValue,\n )\n\n if (\n prevFieldInfo &&\n prevFieldInfo.isPristine === isFieldPristine &&\n prevFieldInfo.isValid === isFieldValid &&\n prevFieldInfo.isDefaultValue === isDefaultValue &&\n prevFieldInfo.errors === fieldErrors &&\n currBaseMeta === prevBaseMeta\n ) {\n fieldMeta[fieldName] = prevFieldInfo\n originalMetaCount++\n continue\n }\n\n fieldMeta[fieldName] = {\n ...currBaseMeta,\n errors: fieldErrors,\n isPristine: isFieldPristine,\n isValid: isFieldValid,\n isDefaultValue: isDefaultValue,\n } as AnyFieldMeta\n }\n\n if (!Object.keys(currBaseStore.fieldMetaBase).length) return fieldMeta\n\n if (\n prevVal &&\n originalMetaCount === Object.keys(currBaseStore.fieldMetaBase).length\n ) {\n return prevVal\n }\n\n return fieldMeta\n },\n })\n\n this.store = new Derived({\n deps: [this.baseStore, this.fieldMetaDerived],\n fn: ({ prevDepVals, currDepVals, prevVal: _prevVal }) => {\n const prevVal = _prevVal as\n | FormState<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer\n >\n | undefined\n const prevBaseStore = prevDepVals?.[0]\n const currBaseStore = currDepVals[0]\n const currFieldMeta = currDepVals[1]\n\n // Computed state\n const fieldMetaValues = Object.values(currFieldMeta).filter(\n Boolean,\n ) as AnyFieldMeta[]\n\n const isFieldsValidating = fieldMetaValues.some(\n (field) => field.isValidating,\n )\n\n const isFieldsValid = fieldMetaValues.every((field) => field.isValid)\n\n const isTouched = fieldMetaValues.some((field) => field.isTouched)\n const isBlurred = fieldMetaValues.some((field) => field.isBlurred)\n const isDefaultValue = fieldMetaValues.every(\n (field) => field.isDefaultValue,\n )\n\n const shouldInvalidateOnMount =\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n isTouched && currBaseStore.errorMap?.onMount\n\n const isDirty = fieldMetaValues.some((field) => field.isDirty)\n const isPristine = !isDirty\n\n const hasOnMountError = Boolean(\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n currBaseStore.errorMap?.onMount ||\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n fieldMetaValues.some((f) => f?.errorMap?.onMount),\n )\n\n const isValidating = !!isFieldsValidating\n\n // As `errors` is not a primitive, we need to aggressively persist the same referencial value for performance reasons\n let errors = prevVal?.errors ?? []\n if (\n !prevBaseStore ||\n currBaseStore.errorMap !== prevBaseStore.errorMap\n ) {\n errors = Object.values(currBaseStore.errorMap).reduce<\n Array<\n | UnwrapFormValidateOrFn<TOnMount>\n | UnwrapFormValidateOrFn<TOnChange>\n | UnwrapFormAsyncValidateOrFn<TOnChangeAsync>\n | UnwrapFormValidateOrFn<TOnBlur>\n | UnwrapFormAsyncValidateOrFn<TOnBlurAsync>\n | UnwrapFormValidateOrFn<TOnSubmit>\n | UnwrapFormAsyncValidateOrFn<TOnSubmitAsync>\n | UnwrapFormAsyncValidateOrFn<TOnServer>\n >\n >((prev, curr) => {\n if (curr === undefined) return prev\n\n if (curr && isGlobalFormValidationError(curr)) {\n prev.push(curr.form as never)\n return prev\n }\n prev.push(curr as never)\n return prev\n }, [])\n }\n\n const isFormValid = errors.length === 0\n const isValid = isFieldsValid && isFormValid\n const submitInvalid = this.options.canSubmitWhenInvalid ?? false\n const canSubmit =\n (currBaseStore.submissionAttempts === 0 &&\n !isTouched &&\n !hasOnMountError) ||\n (!isValidating && !currBaseStore.isSubmitting && isValid) ||\n submitInvalid\n\n let errorMap = currBaseStore.errorMap\n if (shouldInvalidateOnMount) {\n errors = errors.filter(\n (err) => err !== currBaseStore.errorMap.onMount,\n )\n errorMap = Object.assign(errorMap, { onMount: undefined })\n }\n\n if (\n prevVal &&\n prevBaseStore &&\n prevVal.errorMap === errorMap &&\n prevVal.fieldMeta === this.fieldMetaDerived.state &&\n prevVal.errors === errors &&\n prevVal.isFieldsValidating === isFieldsValidating &&\n prevVal.isFieldsValid === isFieldsValid &&\n prevVal.isFormValid === isFormValid &&\n prevVal.isValid === isValid &&\n prevVal.canSubmit === canSubmit &&\n prevVal.isTouched === isTouched &&\n prevVal.isBlurred === isBlurred &&\n prevVal.isPristine === isPristine &&\n prevVal.isDefaultValue === isDefaultValue &&\n prevVal.isDirty === isDirty &&\n evaluate(prevBaseStore, currBaseStore)\n ) {\n return prevVal\n }\n\n let state = {\n ...currBaseStore,\n errorMap,\n fieldMeta: this.fieldMetaDerived.state,\n errors,\n isFieldsValidating,\n isFieldsValid,\n isFormValid,\n isValid,\n canSubmit,\n isTouched,\n isBlurred,\n isPristine,\n isDefaultValue,\n isDirty,\n } as FormState<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer\n >\n\n // Only run transform if state has shallowly changed - IE how React.useEffect works\n const transformArray = this.options.transform?.deps ?? []\n const shouldTransform =\n transformArray.length !== this.prevTransformArray.length ||\n transformArray.some((val, i) => val !== this.prevTransformArray[i])\n\n if (shouldTransform) {\n const newObj = Object.assign({}, this, { state })\n // This mutates the state\n this.options.transform?.fn(newObj)\n state = newObj.state\n this.prevTransformArray = transformArray\n }\n\n return state\n },\n })\n\n this.handleSubmit = this.handleSubmit.bind(this)\n\n this.update(opts || {})\n\n this.store.subscribe(() => {\n formEventClient.emit('form-state-change', {\n id: this._formId,\n state: this.store.state,\n options: this.options,\n })\n })\n\n formEventClient.on('request-form-state', (e) => {\n if (e.payload.id === this._formId) {\n formEventClient.emit('form-state-change', {\n id: this._formId,\n state: this.store.state,\n options: this.options,\n })\n }\n })\n\n formEventClient.on('request-form-reset', (e) => {\n if (e.payload.id === this._formId) {\n this.reset()\n }\n })\n\n formEventClient.on('request-form-force-submit', (e) => {\n if (e.payload.id === this._formId) {\n this._devtoolsSubmissionOverride = true\n this.handleSubmit()\n this._devtoolsSubmissionOverride = false\n }\n })\n }\n\n get formId(): string {\n return this._formId\n }\n\n /**\n * @private\n */\n runValidator<\n TValue extends TStandardSchemaValidatorValue<TFormData> & {\n formApi: AnyFormApi\n },\n TType extends 'validate' | 'validateAsync',\n >(props: {\n validate: TType extends 'validate'\n ? FormValidateOrFn<TFormData>\n : FormAsyncValidateOrFn<TFormData>\n value: TValue\n type: TType\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 FormValidateFn<any>)(props.value) as never\n }\n\n mount = () => {\n const cleanupFieldMetaDerived = this.fieldMetaDerived.mount()\n const cleanupStoreDerived = this.store.mount()\n const cleanup = () => {\n cleanupFieldMetaDerived()\n cleanupStoreDerived()\n\n // broadcast form unmount for devtools\n formEventClient.emit('form-unmounted', {\n id: this._formId,\n })\n }\n\n this.options.listeners?.onMount?.({ formApi: this })\n\n const { onMount } = this.options.validators || {}\n\n // broadcast form state for devtools on mounting\n formEventClient.emit('form-state-change', {\n id: this._formId,\n state: this.store.state,\n options: this.options,\n })\n\n // if no validation skip\n if (!onMount) return cleanup\n\n // validate\n this.validateSync('mount')\n return cleanup\n }\n\n /**\n * Updates the form options and form state.\n */\n update = (\n options?: FormOptions<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >,\n ) => {\n if (!options) return\n\n const oldOptions = this.options\n\n // Options need to be updated first so that when the store is updated, the state is correct for the derived state\n this.options = options\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n const shouldUpdateReeval = !!options.transform?.deps?.some(\n (val, i) => val !== this.prevTransformArray[i],\n )\n\n const shouldUpdateValues =\n options.defaultValues &&\n !evaluate(options.defaultValues, oldOptions.defaultValues) &&\n !this.state.isTouched\n\n const shouldUpdateState =\n !evaluate(options.defaultState, oldOptions.defaultState) &&\n !this.state.isTouched\n\n if (!shouldUpdateValues && !shouldUpdateState && !shouldUpdateReeval) return\n\n batch(() => {\n this.baseStore.setState(() =>\n getDefaultFormState(\n Object.assign(\n {},\n this.state as any,\n\n shouldUpdateState ? options.defaultState : {},\n\n shouldUpdateValues\n ? {\n values: options.defaultValues,\n }\n : {},\n\n shouldUpdateReeval\n ? { _force_re_eval: !this.state._force_re_eval }\n : {},\n ),\n ),\n )\n })\n }\n\n /**\n * Resets the form state to the default values.\n * If values are provided, the form will be reset to those values instead and the default values will be updated.\n *\n * @param values - Optional values to reset the form to.\n * @param opts - Optional options to control the reset behavior.\n */\n reset = (values?: TFormData, opts?: { keepDefaultValues?: boolean }) => {\n const { fieldMeta: currentFieldMeta } = this.state\n const fieldMetaBase = this.resetFieldMeta(currentFieldMeta)\n\n if (values && !opts?.keepDefaultValues) {\n this.options = {\n ...this.options,\n defaultValues: values,\n }\n }\n\n this.baseStore.setState(() =>\n getDefaultFormState({\n ...(this.options.defaultState as any),\n values:\n values ??\n this.options.defaultValues ??\n this.options.defaultState?.values,\n fieldMetaBase,\n }),\n )\n }\n\n /**\n * Validates all fields using the correct handlers for a given validation cause.\n */\n validateAllFields = async (cause: ValidationCause) => {\n const fieldValidationPromises: Promise<ValidationError[]>[] = [] as any\n batch(() => {\n void (Object.values(this.fieldInfo) as FieldInfo<any>[]).forEach(\n (field) => {\n if (!field.instance) return\n const fieldInstance = field.instance\n // Validate the field\n fieldValidationPromises.push(\n // Remember, `validate` is either a sync operation or a promise\n Promise.resolve().then(() =>\n fieldInstance.validate(cause, { skipFormValidation: true }),\n ),\n )\n // If any fields are not touched\n if (!field.instance.state.meta.isTouched) {\n // Mark them as touched\n field.instance.setMeta((prev) => ({ ...prev, isTouched: true }))\n }\n },\n )\n })\n\n const fieldErrorMapMap = await Promise.all(fieldValidationPromises)\n return fieldErrorMapMap.flat()\n }\n\n /**\n * Validates the children of a specified array in the form starting from a given index until the end using the correct handlers for a given validation type.\n */\n validateArrayFieldsStartingFrom = async <\n TField extends DeepKeysOfType<TFormData, any[]>,\n >(\n field: TField,\n index: number,\n cause: ValidationCause,\n ) => {\n const currentValue = this.getFieldValue(field)\n\n const lastIndex = Array.isArray(currentValue)\n ? Math.max((currentValue as Array<unknown>).length - 1, 0)\n : null\n\n // We have to validate all fields that have shifted (at least the current field)\n const fieldKeysToValidate = [`${field}[${index}]`]\n for (let i = index + 1; i <= (lastIndex ?? 0); i++) {\n fieldKeysToValidate.push(`${field}[${i}]`)\n }\n\n // We also have to include all fields that are nested in the shifted fields\n const fieldsToValidate = Object.keys(this.fieldInfo).filter((fieldKey) =>\n fieldKeysToValidate.some((key) => fieldKey.startsWith(key)),\n ) as DeepKeys<TFormData>[]\n\n // Validate the fields\n const fieldValidationPromises: Promise<ValidationError[]>[] = [] as any\n batch(() => {\n fieldsToValidate.forEach((nestedField) => {\n fieldValidationPromises.push(\n Promise.resolve().then(() => this.validateField(nestedField, cause)),\n )\n })\n })\n\n const fieldErrorMapMap = await Promise.all(fieldValidationPromises)\n return fieldErrorMapMap.flat()\n }\n\n /**\n * Validates a specified field in the form using the correct handlers for a given validation type.\n */\n validateField = <TField extends DeepKeys<TFormData>>(\n field: TField,\n cause: ValidationCause,\n ) => {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n const fieldInstance = this.fieldInfo[field]?.instance\n if (!fieldInstance) return []\n\n // If the field is not touched (same logic as in validateAllFields)\n if (!fieldInstance.state.meta.isTouched) {\n // Mark it as touched\n fieldInstance.setMeta((prev) => ({ ...prev, isTouched: true }))\n }\n\n return fieldInstance.validate(cause)\n }\n\n /**\n * TODO: This code is copied from FieldApi, we should refactor to share\n * @private\n */\n validateSync = (\n cause: ValidationCause,\n ): {\n hasErrored: boolean\n fieldsErrorMap: FormErrorMapFromValidator<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync\n >\n } => {\n const validates = getSyncValidatorArray(cause, {\n ...this.options,\n form: this,\n validationLogic: this.options.validationLogic || defaultValidationLogic,\n })\n\n let hasErrored = false as boolean\n\n // This map will only include fields that have errors in the current validation cycle\n const currentValidationErrorMap: FormErrorMapFromValidator<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync\n > = {}\n\n batch(() => {\n for (const validateObj of validates) {\n if (!validateObj.validate) continue\n\n const rawError = this.runValidator({\n validate: validateObj.validate,\n value: {\n value: this.state.values,\n formApi: this,\n validationSource: 'form',\n },\n type: 'validate',\n })\n\n const { formError, fieldErrors } = normalizeError<TFormData>(rawError)\n\n const errorMapKey = getErrorMapKey(validateObj.cause)\n\n for (const field of Object.keys(\n this.state.fieldMeta,\n ) as DeepKeys<TFormData>[]) {\n const fieldMeta = this.getFieldMeta(field)\n if (!fieldMeta) continue\n\n const {\n errorMap: currentErrorMap,\n errorSourceMap: currentErrorMapSource,\n } = fieldMeta\n\n const newFormValidatorError = fieldErrors?.[field]\n\n const { newErrorValue, newSource } =\n determineFormLevelErrorSourceAndValue({\n newFormValidatorError,\n isPreviousErrorFromFormValidator:\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n currentErrorMapSource?.[errorMapKey] === 'form',\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n previousErrorValue: currentErrorMap?.[errorMapKey],\n })\n\n if (newSource === 'form') {\n currentValidationErrorMap[field] = {\n ...currentValidationErrorMap[field],\n [errorMapKey]: newFormValidatorError,\n }\n }\n\n if (\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n currentErrorMap?.[errorMapKey] !== newErrorValue\n ) {\n this.setFieldMeta(field, (prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n [errorMapKey]: newErrorValue,\n },\n errorSourceMap: {\n ...prev.errorSourceMap,\n [errorMapKey]: newSource,\n },\n }))\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (this.state.errorMap?.[errorMapKey] !== formError) {\n this.baseStore.setState((prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n [errorMapKey]: formError,\n },\n }))\n }\n\n if (formError || fieldErrors) {\n hasErrored = true\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 if (\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n this.state.errorMap?.[submitErrKey] &&\n cause !== 'submit' &&\n !hasErrored\n ) {\n this.baseStore.setState((prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n [submitErrKey]: undefined,\n },\n }))\n }\n\n /**\n * when we have an error for onServer 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 serverErrKey = getErrorMapKey('server')\n if (\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n this.state.errorMap?.[serverErrKey] &&\n cause !== 'server' &&\n !hasErrored\n ) {\n this.baseStore.setState((prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n [serverErrKey]: undefined,\n },\n }))\n }\n })\n\n return { hasErrored, fieldsErrorMap: currentValidationErrorMap }\n }\n\n /**\n * @private\n */\n validateAsync = async (\n cause: ValidationCause,\n ): Promise<\n FormErrorMapFromValidator<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync\n >\n > => {\n const validates = getAsyncValidatorArray(cause, {\n ...this.options,\n form: this,\n validationLogic: this.options.validationLogic || defaultValidationLogic,\n })\n\n if (!this.state.isFormValidating) {\n this.baseStore.setState((prev) => ({ ...prev, isFormValidating: 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 promises: Promise<ValidationPromiseResult<TFormData>>[] = []\n\n let fieldErrorsFromFormValidators:\n | Partial<Record<DeepKeys<TFormData>, ValidationError>>\n | undefined\n\n for (const validateObj of validates) {\n if (!validateObj.validate) continue\n const key = getErrorMapKey(validateObj.cause)\n const fieldValidatorMeta = this.state.validationMetaMap[key]\n\n fieldValidatorMeta?.lastAbortController.abort()\n const controller = new AbortController()\n\n this.state.validationMetaMap[key] = {\n lastAbortController: controller,\n }\n\n promises.push(\n new Promise<ValidationPromiseResult<TFormData>>(async (resolve) => {\n let rawError!:\n | ValidationError\n | FormValidationError<unknown>\n | undefined\n try {\n rawError = await new Promise((rawResolve, rawReject) => {\n 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: this.state.values,\n formApi: this,\n validationSource: 'form',\n signal: controller.signal,\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 const { formError, fieldErrors: fieldErrorsFromNormalizeError } =\n normalizeError<TFormData>(rawError)\n\n if (fieldErrorsFromNormalizeError) {\n fieldErrorsFromFormValidators = fieldErrorsFromFormValidators\n ? {\n ...fieldErrorsFromFormValidators,\n ...fieldErrorsFromNormalizeError,\n }\n : fieldErrorsFromNormalizeError\n }\n const errorMapKey = getErrorMapKey(validateObj.cause)\n\n for (const field of Object.keys(\n this.state.fieldMeta,\n ) as DeepKeys<TFormData>[]) {\n const fieldMeta = this.getFieldMeta(field)\n if (!fieldMeta) continue\n\n const {\n errorMap: currentErrorMap,\n errorSourceMap: currentErrorMapSource,\n } = fieldMeta\n\n const newFormValidatorError = fieldErrorsFromFormValidators?.[field]\n\n const { newErrorValue, newSource } =\n determineFormLevelErrorSourceAndValue({\n newFormValidatorError,\n isPreviousErrorFromFormValidator:\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n currentErrorMapSource?.[errorMapKey] === 'form',\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n previousErrorValue: currentErrorMap?.[errorMapKey],\n })\n\n if (\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n currentErrorMap?.[errorMapKey] !== newErrorValue\n ) {\n this.setFieldMeta(field, (prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n [errorMapKey]: newErrorValue,\n },\n errorSourceMap: {\n ...prev.errorSourceMap,\n [errorMapKey]: newSource,\n },\n }))\n }\n }\n\n this.baseStore.setState((prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n [errorMapKey]: formError,\n },\n }))\n\n resolve(\n fieldErrorsFromFormValidators\n ? { fieldErrors: fieldErrorsFromFormValidators, errorMapKey }\n : undefined,\n )\n }),\n )\n }\n\n let results: ValidationPromiseResult<TFormData>[] = []\n\n const fieldsErrorMap: FormErrorMapFromValidator<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync\n > = {}\n if (promises.length) {\n results = await Promise.all(promises)\n for (const fieldValidationResult of results) {\n if (fieldValidationResult?.fieldErrors) {\n const { errorMapKey } = fieldValidationResult\n\n for (const [field, fieldError] of Object.entries(\n fieldValidationResult.fieldErrors,\n )) {\n const oldErrorMap =\n fieldsErrorMap[field as DeepKeys<TFormData>] || {}\n const newErrorMap = {\n ...oldErrorMap,\n [errorMapKey]: fieldError,\n }\n fieldsErrorMap[field as DeepKeys<TFormData>] = newErrorMap\n }\n }\n }\n }\n\n this.baseStore.setState((prev) => ({\n ...prev,\n isFormValidating: false,\n }))\n\n return fieldsErrorMap\n }\n\n /**\n * @private\n */\n validate = (\n cause: ValidationCause,\n ):\n | FormErrorMapFromValidator<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync\n >\n | Promise<\n FormErrorMapFromValidator<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync\n >\n > => {\n // Attempt to sync validate first\n const { hasErrored, fieldsErrorMap } = this.validateSync(cause)\n\n if (hasErrored && !this.options.asyncAlways) {\n return fieldsErrorMap\n }\n\n // No error? Attempt async validation\n return this.validateAsync(cause)\n }\n\n /**\n * Handles the form submission, performs validation, and calls the appropriate onSubmit or onSubmitInvalid callbacks.\n */\n handleSubmit(): Promise<void>\n handleSubmit(submitMeta: TSubmitMeta): Promise<void>\n async handleSubmit(submitMeta?: TSubmitMeta): Promise<void> {\n this.baseStore.setState((old) => ({\n ...old,\n // Submission attempts mark the form as not submitted\n isSubmitted: false,\n // Count submission attempts\n submissionAttempts: old.submissionAttempts + 1,\n isSubmitSuccessful: false, // Reset isSubmitSuccessful at the start of submission\n }))\n\n batch(() => {\n void (Object.values(this.fieldInfo) as FieldInfo<any>[]).forEach(\n (field) => {\n if (!field.instance) return\n // If any fields are not touched\n if (!field.instance.state.meta.isTouched) {\n // Mark them as touched\n field.instance.setMeta((prev) => ({ ...prev, isTouched: true }))\n }\n },\n )\n })\n\n const submitMetaArg =\n submitMeta ?? (this.options.onSubmitMeta as TSubmitMeta)\n\n if (!this.state.canSubmit && !this._devtoolsSubmissionOverride) {\n this.options.onSubmitInvalid?.({\n value: this.state.values,\n formApi: this,\n meta: submitMetaArg,\n })\n return\n }\n\n this.baseStore.setState((d) => ({ ...d, isSubmitting: true }))\n\n const done = () => {\n this.baseStore.setState((prev) => ({ ...prev, isSubmitting: false }))\n }\n\n await this.validateAllFields('submit')\n\n if (!this.state.isFieldsValid) {\n done()\n\n this.options.onSubmitInvalid?.({\n value: this.state.values,\n formApi: this,\n meta: submitMetaArg,\n })\n\n formEventClient.emit('form-submission-state-change', {\n id: this._formId,\n submissionAttempt: this.state.submissionAttempts,\n successful: false,\n stage: 'validateAllFields',\n errors: (Object.values(this.state.fieldMeta) as AnyFieldMeta[])\n .map((meta: AnyFieldMeta) => meta.errors)\n .flat(),\n })\n return\n }\n\n await this.validate('submit')\n\n // Fields are invalid, do not submit\n if (!this.state.isValid) {\n done()\n\n this.options.onSubmitInvalid?.({\n value: this.state.values,\n formApi: this,\n meta: submitMetaArg,\n })\n\n formEventClient.emit('form-submission-state-change', {\n id: this._formId,\n submissionAttempt: this.state.submissionAttempts,\n successful: false,\n stage: 'validate',\n errors: this.state.errors,\n })\n\n return\n }\n\n batch(() => {\n void (Object.values(this.fieldInfo) as FieldInfo<TFormData>[]).forEach(\n (field) => {\n field.instance?.options.listeners?.onSubmit?.({\n value: field.instance.state.value,\n fieldApi: field.instance,\n })\n },\n )\n })\n\n this.options.listeners?.onSubmit?.({ formApi: this, meta: submitMetaArg })\n\n try {\n // Run the submit code\n await this.options.onSubmit?.({\n value: this.state.values,\n formApi: this,\n meta: submitMetaArg,\n })\n\n batch(() => {\n this.baseStore.setState((prev) => ({\n ...prev,\n isSubmitted: true,\n isSubmitSuccessful: true, // Set isSubmitSuccessful to true on successful submission\n }))\n\n formEventClient.emit('form-submission-state-change', {\n id: this._formId,\n submissionAttempt: this.state.submissionAttempts,\n successful: true,\n })\n\n done()\n })\n } catch (err) {\n this.baseStore.setState((prev) => ({\n ...prev,\n isSubmitSuccessful: false, // Ensure isSubmitSuccessful is false if an error occurs\n }))\n\n formEventClient.emit('form-submission-state-change', {\n id: this._formId,\n submissionAttempt: this.state.submissionAttempts,\n successful: false,\n stage: 'inflight',\n onError: err,\n })\n\n done()\n\n throw err\n }\n }\n\n /**\n * Gets the value of the specified field.\n */\n getFieldValue = <TField extends DeepKeys<TFormData>>(\n field: TField,\n ): DeepValue<TFormData, TField> => getBy(this.state.values, field)\n\n /**\n * Gets the metadata of the specified field.\n */\n getFieldMeta = <TField extends DeepKeys<TFormData>>(\n field: TField,\n ): AnyFieldMeta | undefined => {\n return this.state.fieldMeta[field]\n }\n\n /**\n * Gets the field info of the specified field.\n */\n getFieldInfo = <TField extends DeepKeys<TFormData>>(\n field: TField,\n ): FieldInfo<TFormData> => {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n return (this.fieldInfo[field] ||= {\n instance: null,\n validationMetaMap: {\n onChange: undefined,\n onBlur: undefined,\n onSubmit: undefined,\n onMount: undefined,\n onServer: undefined,\n onDynamic: undefined,\n },\n })\n }\n\n /**\n * Updates the metadata of the specified field.\n */\n setFieldMeta = <TField extends DeepKeys<TFormData>>(\n field: TField,\n updater: Updater<AnyFieldMetaBase>,\n ) => {\n this.baseStore.setState((prev) => {\n return {\n ...prev,\n fieldMetaBase: {\n ...prev.fieldMetaBase,\n [field]: functionalUpdate(\n updater,\n prev.fieldMetaBase[field] as never,\n ),\n },\n }\n })\n }\n\n /**\n * resets every field's meta\n */\n resetFieldMeta = <TField extends DeepKeys<TFormData>>(\n fieldMeta: Record<TField, AnyFieldMeta>,\n ): Record<TField, AnyFieldMeta> => {\n return Object.keys(fieldMeta).reduce(\n (acc: Record<TField, AnyFieldMeta>, key) => {\n const fieldKey = key as TField\n acc[fieldKey] = defaultFieldMeta\n return acc\n },\n {} as Record<TField, AnyFieldMeta>,\n )\n }\n\n /**\n * Sets the value of the specified field and optionally updates the touched state.\n */\n setFieldValue = <TField extends DeepKeys<TFormData>>(\n field: TField,\n updater: Updater<DeepValue<TFormData, TField>>,\n opts?: UpdateMetaOptions,\n ) => {\n const dontUpdateMeta = opts?.dontUpdateMeta ?? false\n const dontRunListeners = opts?.dontRunListeners ?? false\n const dontValidate = opts?.dontValidate ?? false\n\n batch(() => {\n if (!dontUpdateMeta) {\n this.setFieldMeta(field, (prev) => ({\n ...prev,\n isTouched: true,\n isDirty: true,\n errorMap: {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n ...prev?.errorMap,\n onMount: undefined,\n },\n }))\n }\n\n this.baseStore.setState((prev) => {\n return {\n ...prev,\n values: setBy(prev.values, field, updater),\n }\n })\n })\n\n if (!dontRunListeners) {\n this.getFieldInfo(field).instance?.triggerOnChangeListener()\n }\n\n if (!dontValidate) {\n this.validateField(field, 'change')\n }\n }\n\n deleteField = <TField extends DeepKeys<TFormData>>(field: TField) => {\n const subFieldsToDelete = Object.keys(this.fieldInfo).filter((f) => {\n const fieldStr = field.toString()\n return f !== fieldStr && f.startsWith(fieldStr)\n })\n\n const fieldsToDelete = [...subFieldsToDelete, field]\n\n // Cleanup the last fields\n this.baseStore.setState((prev) => {\n const newState = { ...prev }\n fieldsToDelete.forEach((f) => {\n newState.values = deleteBy(newState.values, f)\n delete this.fieldInfo[f as never]\n delete newState.fieldMetaBase[f as never]\n })\n\n return newState\n })\n }\n\n /**\n * Pushes a value into an array field.\n */\n pushFieldValue = <TField extends DeepKeysOfType<TFormData, any[]>>(\n field: TField,\n value: DeepValue<TFormData, TField> extends any[]\n ? DeepValue<TFormData, TField>[number]\n : never,\n options?: UpdateMetaOptions,\n ) => {\n this.setFieldValue(\n field,\n (prev) => [...(Array.isArray(prev) ? prev : []), value] as any,\n options,\n )\n }\n\n insertFieldValue = async <TField extends DeepKeysOfType<TFormData, any[]>>(\n field: TField,\n index: number,\n value: DeepValue<TFormData, TField> extends any[]\n ? DeepValue<TFormData, TField>[number]\n : never,\n options?: UpdateMetaOptions,\n ) => {\n this.setFieldValue(\n field,\n (prev) => {\n return [\n ...(prev as DeepValue<TFormData, TField>[]).slice(0, index),\n value,\n ...(prev as DeepValue<TFormData, TField>[]).slice(index),\n ] as any\n },\n mergeOpts(options, { dontValidate: true }),\n )\n\n // Validate the whole array + all fields that have shifted\n await this.validateField(field, 'change')\n\n // Shift down all meta after validating to make sure the new field has been mounted\n metaHelper(this).handleArrayFieldMetaShift(field, index, 'insert')\n\n await this.validateArrayFieldsStartingFrom(field, index, 'change')\n }\n\n /**\n * Replaces a value into an array field at the specified index.\n */\n replaceFieldValue = async <TField extends DeepKeysOfType<TFormData, any[]>>(\n field: TField,\n index: number,\n value: DeepValue<TFormData, TField> extends any[]\n ? DeepValue<TFormData, TField>[number]\n : never,\n options?: UpdateMetaOptions,\n ) => {\n this.setFieldValue(\n field,\n (prev) => {\n return (prev as DeepValue<TFormData, TField>[]).map((d, i) =>\n i === index ? value : d,\n ) as any\n },\n mergeOpts(options, { dontValidate: true }),\n )\n\n // Validate the whole array + all fields that have shifted\n await this.validateField(field, 'change')\n await this.validateArrayFieldsStartingFrom(field, index, 'change')\n }\n\n /**\n * Removes a value from an array field at the specified index.\n */\n removeFieldValue = async <TField extends DeepKeysOfType<TFormData, any[]>>(\n field: TField,\n index: number,\n options?: UpdateMetaOptions,\n ) => {\n const fieldValue = this.getFieldValue(field)\n\n const lastIndex = Array.isArray(fieldValue)\n ? Math.max((fieldValue as Array<unknown>).length - 1, 0)\n : null\n\n this.setFieldValue(\n field,\n (prev) => {\n return (prev as DeepValue<TFormData, TField>[]).filter(\n (_d, i) => i !== index,\n ) as any\n },\n mergeOpts(options, { dontValidate: true }),\n )\n\n // Shift up all meta\n metaHelper(this).handleArrayFieldMetaShift(field, index, 'remove')\n\n if (lastIndex !== null) {\n const start = `${field}[${lastIndex}]`\n this.deleteField(start as never)\n }\n\n // Validate the whole array + all fields that have shifted\n await this.validateField(field, 'change')\n await this.validateArrayFieldsStartingFrom(field, index, 'change')\n }\n\n /**\n * Swaps the values at the specified indices within an array field.\n */\n swapFieldValues = <TField extends DeepKeysOfType<TFormData, any[]>>(\n field: TField,\n index1: number,\n index2: number,\n options?: UpdateMetaOptions,\n ) => {\n this.setFieldValue(\n field,\n (prev: any) => {\n const prev1 = prev[index1]!\n const prev2 = prev[index2]!\n return setBy(setBy(prev, `${index1}`, prev2), `${index2}`, prev1)\n },\n mergeOpts(options, { dontValidate: true }),\n )\n\n // Swap meta\n metaHelper(this).handleArrayFieldMetaShift(field, index1, 'swap', index2)\n\n // Validate the whole array\n this.validateField(field, 'change')\n // Validate the swapped fields\n this.validateField(`${field}[${index1}]` as DeepKeys<TFormData>, 'change')\n this.validateField(`${field}[${index2}]` as DeepKeys<TFormData>, 'change')\n }\n\n /**\n * Moves the value at the first specified index to the second specified index within an array field.\n */\n moveFieldValues = <TField extends DeepKeysOfType<TFormData, any[]>>(\n field: TField,\n index1: number,\n index2: number,\n options?: UpdateMetaOptions,\n ) => {\n this.setFieldValue(\n field,\n (prev: any) => {\n const next: any = [...prev]\n next.splice(index2, 0, next.splice(index1, 1)[0])\n return next\n },\n mergeOpts(options, { dontValidate: true }),\n )\n\n // Move meta between index1 and index2\n metaHelper(this).handleArrayFieldMetaShift(field, index1, 'move', index2)\n\n // Validate the whole array\n this.validateField(field, 'change')\n // Validate the moved fields\n this.validateField(`${field}[${index1}]` as DeepKeys<TFormData>, 'change')\n this.validateField(`${field}[${index2}]` as DeepKeys<TFormData>, 'change')\n }\n\n /**\n * Clear all values within an array field.\n */\n clearFieldValues = <TField extends DeepKeysOfType<TFormData, any[]>>(\n field: TField,\n options?: UpdateMetaOptions,\n ) => {\n const fieldValue = this.getFieldValue(field)\n\n const lastIndex = Array.isArray(fieldValue)\n ? Math.max((fieldValue as unknown[]).length - 1, 0)\n : null\n\n this.setFieldValue(\n field,\n [] as any,\n mergeOpts(options, { dontValidate: true }),\n )\n\n if (lastIndex !== null) {\n for (let i = 0; i <= lastIndex; i++) {\n const fieldKey = `${field}[${i}]`\n this.deleteField(fieldKey as never)\n }\n }\n\n // validate array change\n this.validateField(field, 'change')\n }\n\n /**\n * Resets the field value and meta to default state\n */\n resetField = <TField extends DeepKeys<TFormData>>(field: TField) => {\n this.baseStore.setState((prev) => {\n return {\n ...prev,\n fieldMetaBase: {\n ...prev.fieldMetaBase,\n [field]: defaultFieldMeta,\n },\n values: this.options.defaultValues\n ? setBy(prev.values, field, getBy(this.options.defaultValues, field))\n : prev.values,\n }\n })\n }\n\n /**\n * Updates the form's errorMap\n */\n setErrorMap(\n errorMap: FormValidationErrorMap<\n TFormData,\n UnwrapFormValidateOrFn<TOnMount>,\n UnwrapFormValidateOrFn<TOnChange>,\n UnwrapFormAsyncValidateOrFn<TOnChangeAsync>,\n UnwrapFormValidateOrFn<TOnBlur>,\n UnwrapFormAsyncValidateOrFn<TOnBlurAsync>,\n UnwrapFormValidateOrFn<TOnSubmit>,\n UnwrapFormAsyncValidateOrFn<TOnSubmitAsync>,\n UnwrapFormValidateOrFn<TOnDynamic>,\n UnwrapFormAsyncValidateOrFn<TOnDynamicAsync>,\n UnwrapFormAsyncValidateOrFn<TOnServer>\n >,\n ) {\n batch(() => {\n Object.entries(errorMap).forEach(([key, value]) => {\n const errorMapKey = key as ValidationErrorMapKeys\n\n if (isGlobalFormValidationError(value)) {\n const { formError, fieldErrors } = normalizeError<TFormData>(value)\n\n for (const fieldName of Object.keys(\n this.fieldInfo,\n ) as DeepKeys<TFormData>[]) {\n const fieldMeta = this.getFieldMeta(fieldName)\n if (!fieldMeta) continue\n\n this.setFieldMeta(fieldName, (prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n [errorMapKey]: fieldErrors?.[fieldName],\n },\n errorSourceMap: {\n ...prev.errorSourceMap,\n [errorMapKey]: 'form',\n },\n }))\n }\n\n this.baseStore.setState((prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n [errorMapKey]: formError,\n },\n }))\n } else {\n this.baseStore.setState((prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n [errorMapKey]: value,\n },\n }))\n }\n })\n })\n }\n\n /**\n * Returns form and field level errors\n */\n getAllErrors = (): {\n form: {\n errors: Array<\n | UnwrapFormValidateOrFn<TOnMount>\n | UnwrapFormValidateOrFn<TOnChange>\n | UnwrapFormAsyncValidateOrFn<TOnChangeAsync>\n | UnwrapFormValidateOrFn<TOnBlur>\n | UnwrapFormAsyncValidateOrFn<TOnBlurAsync>\n | UnwrapFormValidateOrFn<TOnSubmit>\n | UnwrapFormAsyncValidateOrFn<TOnSubmitAsync>\n | UnwrapFormValidateOrFn<TOnDynamic>\n | UnwrapFormAsyncValidateOrFn<TOnDynamicAsync>\n | UnwrapFormAsyncValidateOrFn<TOnServer>\n >\n errorMap: ValidationErrorMap<\n UnwrapFormValidateOrFn<TOnMount>,\n UnwrapFormValidateOrFn<TOnChange>,\n UnwrapFormAsyncValidateOrFn<TOnChangeAsync>,\n UnwrapFormValidateOrFn<TOnBlur>,\n UnwrapFormAsyncValidateOrFn<TOnBlurAsync>,\n UnwrapFormValidateOrFn<TOnSubmit>,\n UnwrapFormAsyncValidateOrFn<TOnSubmitAsync>,\n UnwrapFormValidateOrFn<TOnDynamic>,\n UnwrapFormAsyncValidateOrFn<TOnDynamicAsync>,\n UnwrapFormAsyncValidateOrFn<TOnServer>\n >\n }\n fields: Record<\n DeepKeys<TFormData>,\n { errors: ValidationError[]; errorMap: ValidationErrorMap }\n >\n } => {\n return {\n form: {\n errors: this.state.errors,\n errorMap: this.state.errorMap,\n },\n fields: Object.entries(this.state.fieldMeta).reduce(\n (acc, [fieldName, fieldMeta]) => {\n if (\n Object.keys(fieldMeta as AnyFieldMeta).length &&\n (fieldMeta as AnyFieldMeta).errors.length\n ) {\n acc[fieldName as DeepKeys<TFormData>] = {\n errors: (fieldMeta as AnyFieldMeta).errors,\n errorMap: (fieldMeta as AnyFieldMeta).errorMap,\n }\n }\n\n return acc\n },\n {} as Record<\n DeepKeys<TFormData>,\n { errors: ValidationError[]; errorMap: ValidationErrorMap }\n >,\n ),\n }\n }\n\n /**\n * Parses the form's values with a given standard schema and returns\n * issues (if any). This method does NOT set any internal errors.\n * @param schema The standard schema to parse the form values with.\n */\n parseValuesWithSchema = (schema: StandardSchemaV1<TFormData, unknown>) => {\n return standardSchemaValidators.validate(\n { value: this.state.values, validationSource: 'form' },\n schema,\n )\n }\n\n /**\n * Parses the form's values with a given standard schema and returns\n * issues (if any). This method does NOT set any internal errors.\n * @param schema The standard schema to parse the form values with.\n */\n parseValuesWithSchemaAsync = (\n schema: StandardSchemaV1<TFormData, unknown>,\n ) => {\n return standardSchemaValidators.validateAsync(\n { value: this.state.values, validationSource: 'form' },\n schema,\n )\n }\n}\n\nfunction normalizeError<TFormData>(rawError?: FormValidationError<unknown>): {\n formError: ValidationError\n fieldErrors?: Partial<Record<DeepKeys<TFormData>, ValidationError>>\n} {\n if (rawError) {\n if (isGlobalFormValidationError(rawError)) {\n const formError = normalizeError(rawError.form).formError\n const fieldErrors = rawError.fields\n return { formError, fieldErrors } as never\n }\n\n return { formError: rawError }\n }\n\n return { formError: 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 'dynamic':\n return 'onDynamic'\n case 'change':\n default:\n return 'onChange'\n }\n}\n"],"names":["opts"],"mappings":"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"}
1
+ {"version":3,"file":"FormApi.js","sources":["../../src/FormApi.ts"],"sourcesContent":["import { Derived, Store, batch } from '@tanstack/store'\n\nimport {\n deleteBy,\n determineFormLevelErrorSourceAndValue,\n evaluate,\n functionalUpdate,\n getAsyncValidatorArray,\n getBy,\n getSyncValidatorArray,\n isGlobalFormValidationError,\n isNonEmptyArray,\n mergeOpts,\n setBy,\n uuid,\n} from './utils'\nimport { defaultValidationLogic } from './ValidationLogic'\n\nimport {\n isStandardSchemaValidator,\n standardSchemaValidators,\n} from './standardSchemaValidator'\nimport { defaultFieldMeta, metaHelper } from './metaHelper'\nimport { formEventClient } from './EventClient'\nimport type {\n RequestFormForceReset,\n RequestFormReset,\n RequestFormState,\n} from './EventClient'\nimport type { ValidationLogicFn } from './ValidationLogic'\nimport type {\n StandardSchemaV1,\n StandardSchemaV1Issue,\n TStandardSchemaValidatorValue,\n} from './standardSchemaValidator'\nimport type {\n AnyFieldApi,\n AnyFieldMeta,\n AnyFieldMetaBase,\n FieldApi,\n} from './FieldApi'\nimport type {\n ExtractGlobalFormError,\n FieldManipulator,\n FormValidationError,\n FormValidationErrorMap,\n ListenerCause,\n UpdateMetaOptions,\n ValidationCause,\n ValidationError,\n ValidationErrorMap,\n ValidationErrorMapKeys,\n} from './types'\nimport type { DeepKeys, DeepKeysOfType, DeepValue } from './util-types'\nimport type { Updater } from './utils'\n\n/**\n * @private\n */\n// TODO: Add the `Unwrap` type to the errors\ntype FormErrorMapFromValidator<\n TFormData,\n TOnMount extends undefined | FormValidateOrFn<TFormData>,\n TOnChange extends undefined | FormValidateOrFn<TFormData>,\n TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n> = Partial<\n Record<\n DeepKeys<TFormData>,\n ValidationErrorMap<\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync\n >\n >\n>\n\nexport type FormValidateFn<TFormData> = (props: {\n value: TFormData\n formApi: FormApi<\n TFormData,\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 >\n}) => unknown\n\n/**\n * @private\n */\nexport type FormValidateOrFn<TFormData> =\n | FormValidateFn<TFormData>\n | StandardSchemaV1<TFormData, unknown>\n\nexport type UnwrapFormValidateOrFn<\n TValidateOrFn extends undefined | FormValidateOrFn<any>,\n> = [TValidateOrFn] extends [FormValidateFn<any>]\n ? ExtractGlobalFormError<ReturnType<TValidateOrFn>>\n : [TValidateOrFn] extends [StandardSchemaV1<any, any>]\n ? Record<string, StandardSchemaV1Issue[]>\n : undefined\n\n/**\n * @private\n */\nexport type FormValidateAsyncFn<TFormData> = (props: {\n value: TFormData\n formApi: FormApi<\n TFormData,\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 >\n signal: AbortSignal\n}) => unknown | Promise<unknown>\n\nexport type FormValidator<TFormData, TType, TFn = unknown> = {\n validate(options: { value: TType }, fn: TFn): ValidationError\n validateAsync(\n options: { value: TType },\n fn: TFn,\n ): Promise<FormValidationError<TFormData>>\n}\n\ntype ValidationPromiseResult<TFormData> =\n | {\n fieldErrors: Partial<Record<DeepKeys<TFormData>, ValidationError>>\n errorMapKey: ValidationErrorMapKeys\n }\n | undefined\n\n/**\n * @private\n */\nexport type FormAsyncValidateOrFn<TFormData> =\n | FormValidateAsyncFn<TFormData>\n | StandardSchemaV1<TFormData, unknown>\n\nexport type UnwrapFormAsyncValidateOrFn<\n TValidateOrFn extends undefined | FormAsyncValidateOrFn<any>,\n> = [TValidateOrFn] extends [FormValidateAsyncFn<any>]\n ? ExtractGlobalFormError<Awaited<ReturnType<TValidateOrFn>>>\n : [TValidateOrFn] extends [StandardSchemaV1<any, any>]\n ? Record<string, StandardSchemaV1Issue[]>\n : undefined\n\nexport interface FormValidators<\n TFormData,\n TOnMount extends undefined | FormValidateOrFn<TFormData>,\n TOnChange extends undefined | FormValidateOrFn<TFormData>,\n TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n> {\n /**\n * Optional function that fires as soon as the component mounts.\n */\n onMount?: TOnMount\n /**\n * Optional function that checks the validity of your data whenever a value changes\n */\n onChange?: TOnChange\n /**\n * Optional onChange asynchronous counterpart to onChange. Useful for more complex validation logic that might involve server requests.\n */\n onChangeAsync?: TOnChangeAsync\n /**\n * The default time in milliseconds that 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 * Optional function that validates the form data when a field loses focus, returns a `FormValidationError`\n */\n onBlur?: TOnBlur\n /**\n * Optional onBlur asynchronous validation method for when a field loses focus returns a ` FormValidationError` or a promise of `Promise<FormValidationError>`\n */\n onBlurAsync?: TOnBlurAsync\n /**\n * The default time in milliseconds that 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 onSubmit?: TOnSubmit\n onSubmitAsync?: TOnSubmitAsync\n onDynamic?: TOnDynamic\n onDynamicAsync?: TOnDynamicAsync\n onDynamicAsyncDebounceMs?: number\n}\n\n/**\n * @private\n */\nexport interface FormTransform<\n TFormData,\n TOnMount extends undefined | FormValidateOrFn<TFormData>,\n TOnChange extends undefined | FormValidateOrFn<TFormData>,\n TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n TSubmitMeta = never,\n> {\n fn: (\n formBase: FormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >,\n ) => FormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >\n deps: unknown[]\n}\n\nexport interface FormListeners<\n TFormData,\n TOnMount extends undefined | FormValidateOrFn<TFormData>,\n TOnChange extends undefined | FormValidateOrFn<TFormData>,\n TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n TSubmitMeta = never,\n> {\n onChange?: (props: {\n formApi: FormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >\n fieldApi: AnyFieldApi\n }) => void\n onChangeDebounceMs?: number\n\n onBlur?: (props: {\n formApi: FormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >\n fieldApi: AnyFieldApi\n }) => void\n onBlurDebounceMs?: number\n\n onMount?: (props: {\n formApi: FormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >\n }) => void\n\n onSubmit?: (props: {\n formApi: FormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >\n meta: TSubmitMeta\n }) => void\n}\n\n/**\n * An object representing the base properties of a form, unrelated to any validators\n */\nexport interface BaseFormOptions<in out TFormData, in out TSubmitMeta = never> {\n /**\n * Set initial values for your form.\n */\n defaultValues?: TFormData\n /**\n * onSubmitMeta, the data passed from the handleSubmit handler, to the onSubmit function props\n */\n onSubmitMeta?: TSubmitMeta\n}\n\n/**\n * An object representing the options for a form.\n */\nexport interface FormOptions<\n in out TFormData,\n in out TOnMount extends undefined | FormValidateOrFn<TFormData>,\n in out TOnChange extends undefined | FormValidateOrFn<TFormData>,\n in out TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n in out TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n in out TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n in out TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TSubmitMeta = never,\n> extends BaseFormOptions<TFormData, TSubmitMeta> {\n /**\n * The form name, used for devtools and identification\n */\n formId?: string\n /**\n * The default state for the form.\n */\n defaultState?: Partial<\n FormState<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer\n >\n >\n /**\n * If true, always run async validation, even when sync validation has produced an error. Defaults to undefined.\n */\n asyncAlways?: boolean\n /**\n * Optional time in milliseconds if you want to introduce a delay before firing off an async action.\n */\n asyncDebounceMs?: number\n /**\n * If true, allows the form to be submitted in an invalid state i.e. canSubmit will remain true regardless of validation errors. Defaults to undefined.\n */\n canSubmitWhenInvalid?: boolean\n /**\n * A list of validators to pass to the form\n */\n validators?: FormValidators<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync\n >\n\n validationLogic?: ValidationLogicFn\n\n /**\n * form level listeners\n */\n listeners?: FormListeners<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >\n\n /**\n * A function to be called when the form is submitted, what should happen once the user submits a valid form returns `any` or a promise `Promise<any>`\n */\n onSubmit?: (props: {\n value: TFormData\n formApi: FormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >\n meta: TSubmitMeta\n }) => any | Promise<any>\n /**\n * Specify an action for scenarios where the user tries to submit an invalid form.\n */\n onSubmitInvalid?: (props: {\n value: TFormData\n formApi: FormApi<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >\n meta: TSubmitMeta\n }) => void\n transform?: FormTransform<\n NoInfer<TFormData>,\n NoInfer<TOnMount>,\n NoInfer<TOnChange>,\n NoInfer<TOnChangeAsync>,\n NoInfer<TOnBlur>,\n NoInfer<TOnBlurAsync>,\n NoInfer<TOnSubmit>,\n NoInfer<TOnSubmitAsync>,\n NoInfer<TOnDynamic>,\n NoInfer<TOnDynamicAsync>,\n NoInfer<TOnServer>,\n NoInfer<TSubmitMeta>\n >\n}\n\nexport type AnyFormOptions = FormOptions<\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 representing the validation metadata for a field. Not intended for public usage.\n */\nexport type ValidationMeta = {\n /**\n * An abort controller stored in memory to cancel previous async validation attempts.\n */\n lastAbortController: AbortController\n}\n\n/**\n * An object representing the field information for a specific field within the form.\n */\nexport type FieldInfo<TFormData> = {\n /**\n * An instance of the FieldAPI.\n */\n instance: FieldApi<\n TFormData,\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 any,\n any,\n any\n > | null\n /**\n * A record of field validation internal handling.\n */\n validationMetaMap: Record<ValidationErrorMapKeys, ValidationMeta | undefined>\n}\n\n/**\n * An object representing the current state of the form.\n */\nexport type BaseFormState<\n in out TFormData,\n in out TOnMount extends undefined | FormValidateOrFn<TFormData>,\n in out TOnChange extends undefined | FormValidateOrFn<TFormData>,\n in out TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n in out TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n in out TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n in out TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n> = {\n /**\n * The current values of the form fields.\n */\n values: TFormData\n /**\n * The error map for the form itself.\n */\n errorMap: ValidationErrorMap<\n UnwrapFormValidateOrFn<TOnMount>,\n UnwrapFormValidateOrFn<TOnChange>,\n UnwrapFormAsyncValidateOrFn<TOnChangeAsync>,\n UnwrapFormValidateOrFn<TOnBlur>,\n UnwrapFormAsyncValidateOrFn<TOnBlurAsync>,\n UnwrapFormValidateOrFn<TOnSubmit>,\n UnwrapFormAsyncValidateOrFn<TOnSubmitAsync>,\n UnwrapFormValidateOrFn<TOnDynamic>,\n UnwrapFormAsyncValidateOrFn<TOnDynamicAsync>,\n UnwrapFormAsyncValidateOrFn<TOnServer>\n >\n /**\n * An internal mechanism used for keeping track of validation logic in a form.\n */\n validationMetaMap: Record<ValidationErrorMapKeys, ValidationMeta | undefined>\n /**\n * A record of field metadata for each field in the form, not including the derived properties, like `errors` and such\n */\n fieldMetaBase: Record<DeepKeys<TFormData>, AnyFieldMetaBase>\n /**\n * A boolean indicating if the form is currently in the process of being submitted after `handleSubmit` is called.\n *\n * Goes back to `false` when submission completes for one of the following reasons:\n * - the validation step returned errors.\n * - the `onSubmit` function has completed.\n *\n * Note: if you're running async operations in your `onSubmit` function make sure to await them to ensure `isSubmitting` is set to `false` only when the async operation completes.\n *\n * This is useful for displaying loading indicators or disabling form inputs during submission.\n *\n */\n isSubmitting: boolean\n /**\n * A boolean indicating if the `onSubmit` function has completed successfully.\n *\n * Goes back to `false` at each new submission attempt.\n *\n * Note: you can use isSubmitting to check if the form is currently submitting.\n */\n isSubmitted: boolean\n /**\n * A boolean indicating if the form or any of its fields are currently validating.\n */\n isValidating: boolean\n /**\n * A counter for tracking the number of submission attempts.\n */\n submissionAttempts: number\n /**\n * A boolean indicating if the last submission was successful.\n */\n isSubmitSuccessful: boolean\n /**\n * @private, used to force a re-evaluation of the form state when options change\n */\n _force_re_eval?: boolean\n}\n\nexport type DerivedFormState<\n in out TFormData,\n in out TOnMount extends undefined | FormValidateOrFn<TFormData>,\n in out TOnChange extends undefined | FormValidateOrFn<TFormData>,\n in out TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n in out TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n in out TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n in out TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n> = {\n /**\n * A boolean indicating if the form is currently validating.\n */\n isFormValidating: boolean\n /**\n * A boolean indicating if the form is valid.\n */\n isFormValid: boolean\n /**\n * The error array for the form itself.\n */\n errors: Array<\n | UnwrapFormValidateOrFn<TOnMount>\n | UnwrapFormValidateOrFn<TOnChange>\n | UnwrapFormAsyncValidateOrFn<TOnChangeAsync>\n | UnwrapFormValidateOrFn<TOnBlur>\n | UnwrapFormAsyncValidateOrFn<TOnBlurAsync>\n | UnwrapFormValidateOrFn<TOnSubmit>\n | UnwrapFormAsyncValidateOrFn<TOnSubmitAsync>\n | UnwrapFormValidateOrFn<TOnDynamic>\n | UnwrapFormAsyncValidateOrFn<TOnDynamicAsync>\n | UnwrapFormAsyncValidateOrFn<TOnServer>\n >\n /**\n * A boolean indicating if any of the form fields are currently validating.\n */\n isFieldsValidating: boolean\n /**\n * A boolean indicating if all the form fields are valid. Evaluates `true` if there are no field errors.\n */\n isFieldsValid: boolean\n /**\n * A boolean indicating if any of the form fields have been touched.\n */\n isTouched: boolean\n /**\n * A boolean indicating if any of the form fields have been blurred.\n */\n isBlurred: boolean\n /**\n * A boolean indicating if any of the form's fields' values have been modified by the user. Evaluates `true` if the user have modified at least one of the fields. Opposite of `isPristine`.\n */\n isDirty: boolean\n /**\n * A boolean indicating if none of the form's fields' values have been modified by the user. Evaluates `true` if the user have not modified any of the fields. Opposite of `isDirty`.\n */\n isPristine: boolean\n /**\n * A boolean indicating if all of the form's fields are the same as default values.\n */\n isDefaultValue: boolean\n /**\n * A boolean indicating if the form and all its fields are valid. Evaluates `true` if there are no errors.\n */\n isValid: boolean\n /**\n * A boolean indicating if the form can be submitted based on its current state.\n */\n canSubmit: boolean\n /**\n * A record of field metadata for each field in the form.\n */\n fieldMeta: Record<DeepKeys<TFormData>, AnyFieldMeta>\n}\n\nexport interface FormState<\n in out TFormData,\n in out TOnMount extends undefined | FormValidateOrFn<TFormData>,\n in out TOnChange extends undefined | FormValidateOrFn<TFormData>,\n in out TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n in out TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n in out TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n in out TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n> extends BaseFormState<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer\n >,\n DerivedFormState<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer\n > {}\n\nexport type AnyFormState = FormState<\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n>\n\nfunction getDefaultFormState<\n TFormData,\n TOnMount extends undefined | FormValidateOrFn<TFormData>,\n TOnChange extends undefined | FormValidateOrFn<TFormData>,\n TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n>(\n defaultState: Partial<\n FormState<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer\n >\n >,\n): BaseFormState<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer\n> {\n return {\n values: defaultState.values ?? ({} as never),\n errorMap: defaultState.errorMap ?? {},\n fieldMetaBase: defaultState.fieldMetaBase ?? ({} as never),\n isSubmitted: defaultState.isSubmitted ?? false,\n isSubmitting: defaultState.isSubmitting ?? false,\n isValidating: defaultState.isValidating ?? false,\n submissionAttempts: defaultState.submissionAttempts ?? 0,\n isSubmitSuccessful: defaultState.isSubmitSuccessful ?? false,\n validationMetaMap: defaultState.validationMetaMap ?? {\n onChange: undefined,\n onBlur: undefined,\n onSubmit: undefined,\n onMount: undefined,\n onServer: undefined,\n onDynamic: undefined,\n },\n }\n}\n\n/**\n * @public\n *\n * A type representing the Form API with all generics set to `any` for convenience.\n */\nexport type AnyFormApi = FormApi<\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 Form API. It handles the logic and interactions with the form state.\n *\n * Normally, you will not need to create a new `FormApi` instance directly. Instead, you will use a framework\n * hook/function like `useForm` or `createForm` 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 the `new FormApi` constructor.\n */\nexport class FormApi<\n in out TFormData,\n in out TOnMount extends undefined | FormValidateOrFn<TFormData>,\n in out TOnChange extends undefined | FormValidateOrFn<TFormData>,\n in out TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnBlur extends undefined | FormValidateOrFn<TFormData>,\n in out TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnSubmit extends undefined | FormValidateOrFn<TFormData>,\n in out TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnDynamic extends undefined | FormValidateOrFn<TFormData>,\n in out TOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,\n in out TSubmitMeta = never,\n> implements FieldManipulator<TFormData, TSubmitMeta>\n{\n /**\n * The options for the form.\n */\n options: FormOptions<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n > = {}\n baseStore!: Store<\n BaseFormState<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer\n >\n >\n fieldMetaDerived!: Derived<Record<DeepKeys<TFormData>, AnyFieldMeta>>\n store!: Derived<\n FormState<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer\n >\n >\n /**\n * A record of field information for each field in the form.\n */\n fieldInfo: Record<DeepKeys<TFormData>, FieldInfo<TFormData>> = {} as any\n\n get state() {\n return this.store.state\n }\n\n /**\n * @private\n */\n prevTransformArray: unknown[] = []\n\n /**\n * @private\n */\n timeoutIds: {\n validations: Record<ValidationCause, ReturnType<typeof setTimeout> | null>\n listeners: Record<ListenerCause, ReturnType<typeof setTimeout> | null>\n formListeners: Record<ListenerCause, ReturnType<typeof setTimeout> | null>\n }\n /**\n * @private\n */\n private _formId: string\n /**\n * @private\n */\n private _devtoolsSubmissionOverride: boolean\n\n /**\n * Constructs a new `FormApi` instance with the given form options.\n */\n constructor(\n opts?: FormOptions<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >,\n ) {\n this.timeoutIds = {\n validations: {} as Record<ValidationCause, never>,\n listeners: {} as Record<ListenerCause, never>,\n formListeners: {} as Record<ListenerCause, never>,\n }\n\n this._formId = opts?.formId ?? uuid()\n\n this._devtoolsSubmissionOverride = false\n\n this.baseStore = new Store(\n getDefaultFormState({\n ...(opts?.defaultState as any),\n values: opts?.defaultValues ?? opts?.defaultState?.values,\n isFormValid: true,\n }),\n )\n\n this.fieldMetaDerived = new Derived({\n deps: [this.baseStore],\n fn: ({ prevDepVals, currDepVals, prevVal: _prevVal }) => {\n const prevVal = _prevVal as\n | Record<DeepKeys<TFormData>, AnyFieldMeta>\n | undefined\n const prevBaseStore = prevDepVals?.[0]\n const currBaseStore = currDepVals[0]\n\n let originalMetaCount = 0\n\n const fieldMeta = {} as FormState<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer\n >['fieldMeta']\n\n for (const fieldName of Object.keys(\n currBaseStore.fieldMetaBase,\n ) as Array<keyof typeof currBaseStore.fieldMetaBase>) {\n const currBaseMeta = currBaseStore.fieldMetaBase[\n fieldName as never\n ] as AnyFieldMetaBase\n\n const prevBaseMeta = prevBaseStore?.fieldMetaBase[\n fieldName as never\n ] as AnyFieldMetaBase | undefined\n\n const prevFieldInfo =\n prevVal?.[fieldName as never as keyof typeof prevVal]\n\n const curFieldVal = getBy(currBaseStore.values, fieldName)\n\n let fieldErrors = prevFieldInfo?.errors\n if (\n !prevBaseMeta ||\n currBaseMeta.errorMap !== prevBaseMeta.errorMap\n ) {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n fieldErrors = Object.values(currBaseMeta.errorMap ?? {}).filter(\n (val) => val !== undefined,\n ) as never\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n const fieldInstance = this.getFieldInfo(fieldName)?.instance\n\n if (fieldInstance && !fieldInstance.options.disableErrorFlat) {\n fieldErrors = (fieldErrors as undefined | string[])?.flat(\n 1,\n ) as never\n }\n }\n\n // As primitives, we don't need to aggressively persist the same referential value for performance reasons\n const isFieldValid = !isNonEmptyArray(fieldErrors ?? [])\n const isFieldPristine = !currBaseMeta.isDirty\n const isDefaultValue =\n evaluate(\n curFieldVal,\n getBy(this.options.defaultValues, fieldName),\n ) ||\n evaluate(\n curFieldVal,\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n this.getFieldInfo(fieldName)?.instance?.options.defaultValue,\n )\n\n if (\n prevFieldInfo &&\n prevFieldInfo.isPristine === isFieldPristine &&\n prevFieldInfo.isValid === isFieldValid &&\n prevFieldInfo.isDefaultValue === isDefaultValue &&\n prevFieldInfo.errors === fieldErrors &&\n currBaseMeta === prevBaseMeta\n ) {\n fieldMeta[fieldName] = prevFieldInfo\n originalMetaCount++\n continue\n }\n\n fieldMeta[fieldName] = {\n ...currBaseMeta,\n errors: fieldErrors,\n isPristine: isFieldPristine,\n isValid: isFieldValid,\n isDefaultValue: isDefaultValue,\n } as AnyFieldMeta\n }\n\n if (!Object.keys(currBaseStore.fieldMetaBase).length) return fieldMeta\n\n if (\n prevVal &&\n originalMetaCount === Object.keys(currBaseStore.fieldMetaBase).length\n ) {\n return prevVal\n }\n\n return fieldMeta\n },\n })\n\n this.store = new Derived({\n deps: [this.baseStore, this.fieldMetaDerived],\n fn: ({ prevDepVals, currDepVals, prevVal: _prevVal }) => {\n const prevVal = _prevVal as\n | FormState<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer\n >\n | undefined\n const prevBaseStore = prevDepVals?.[0]\n const currBaseStore = currDepVals[0]\n const currFieldMeta = currDepVals[1]\n\n // Computed state\n const fieldMetaValues = Object.values(currFieldMeta).filter(\n Boolean,\n ) as AnyFieldMeta[]\n\n const isFieldsValidating = fieldMetaValues.some(\n (field) => field.isValidating,\n )\n\n const isFieldsValid = fieldMetaValues.every((field) => field.isValid)\n\n const isTouched = fieldMetaValues.some((field) => field.isTouched)\n const isBlurred = fieldMetaValues.some((field) => field.isBlurred)\n const isDefaultValue = fieldMetaValues.every(\n (field) => field.isDefaultValue,\n )\n\n const shouldInvalidateOnMount =\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n isTouched && currBaseStore.errorMap?.onMount\n\n const isDirty = fieldMetaValues.some((field) => field.isDirty)\n const isPristine = !isDirty\n\n const hasOnMountError = Boolean(\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n currBaseStore.errorMap?.onMount ||\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n fieldMetaValues.some((f) => f?.errorMap?.onMount),\n )\n\n const isValidating = !!isFieldsValidating\n\n // As `errors` is not a primitive, we need to aggressively persist the same referencial value for performance reasons\n let errors = prevVal?.errors ?? []\n if (\n !prevBaseStore ||\n currBaseStore.errorMap !== prevBaseStore.errorMap\n ) {\n errors = Object.values(currBaseStore.errorMap).reduce<\n Array<\n | UnwrapFormValidateOrFn<TOnMount>\n | UnwrapFormValidateOrFn<TOnChange>\n | UnwrapFormAsyncValidateOrFn<TOnChangeAsync>\n | UnwrapFormValidateOrFn<TOnBlur>\n | UnwrapFormAsyncValidateOrFn<TOnBlurAsync>\n | UnwrapFormValidateOrFn<TOnSubmit>\n | UnwrapFormAsyncValidateOrFn<TOnSubmitAsync>\n | UnwrapFormAsyncValidateOrFn<TOnServer>\n >\n >((prev, curr) => {\n if (curr === undefined) return prev\n\n if (curr && isGlobalFormValidationError(curr)) {\n prev.push(curr.form as never)\n return prev\n }\n prev.push(curr as never)\n return prev\n }, [])\n }\n\n const isFormValid = errors.length === 0\n const isValid = isFieldsValid && isFormValid\n const submitInvalid = this.options.canSubmitWhenInvalid ?? false\n const canSubmit =\n (currBaseStore.submissionAttempts === 0 &&\n !isTouched &&\n !hasOnMountError) ||\n (!isValidating && !currBaseStore.isSubmitting && isValid) ||\n submitInvalid\n\n let errorMap = currBaseStore.errorMap\n if (shouldInvalidateOnMount) {\n errors = errors.filter(\n (err) => err !== currBaseStore.errorMap.onMount,\n )\n errorMap = Object.assign(errorMap, { onMount: undefined })\n }\n\n if (\n prevVal &&\n prevBaseStore &&\n prevVal.errorMap === errorMap &&\n prevVal.fieldMeta === this.fieldMetaDerived.state &&\n prevVal.errors === errors &&\n prevVal.isFieldsValidating === isFieldsValidating &&\n prevVal.isFieldsValid === isFieldsValid &&\n prevVal.isFormValid === isFormValid &&\n prevVal.isValid === isValid &&\n prevVal.canSubmit === canSubmit &&\n prevVal.isTouched === isTouched &&\n prevVal.isBlurred === isBlurred &&\n prevVal.isPristine === isPristine &&\n prevVal.isDefaultValue === isDefaultValue &&\n prevVal.isDirty === isDirty &&\n evaluate(prevBaseStore, currBaseStore)\n ) {\n return prevVal\n }\n\n let state = {\n ...currBaseStore,\n errorMap,\n fieldMeta: this.fieldMetaDerived.state,\n errors,\n isFieldsValidating,\n isFieldsValid,\n isFormValid,\n isValid,\n canSubmit,\n isTouched,\n isBlurred,\n isPristine,\n isDefaultValue,\n isDirty,\n } as FormState<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer\n >\n\n // Only run transform if state has shallowly changed - IE how React.useEffect works\n const transformArray = this.options.transform?.deps ?? []\n const shouldTransform =\n transformArray.length !== this.prevTransformArray.length ||\n transformArray.some((val, i) => val !== this.prevTransformArray[i])\n\n if (shouldTransform) {\n const newObj = Object.assign({}, this, { state })\n // This mutates the state\n this.options.transform?.fn(newObj)\n state = newObj.state\n this.prevTransformArray = transformArray\n }\n\n return state\n },\n })\n\n this.handleSubmit = this.handleSubmit.bind(this)\n\n this.update(opts || {})\n\n this.store.subscribe(() => {\n formEventClient.emit('form-state-change', {\n id: this._formId,\n state: this.store.state,\n options: this.options,\n })\n })\n\n formEventClient.on('request-form-state', (e) => {\n if (e.payload.id === this._formId) {\n formEventClient.emit('form-state-change', {\n id: this._formId,\n state: this.store.state,\n options: this.options,\n })\n }\n })\n\n formEventClient.on('request-form-reset', (e) => {\n if (e.payload.id === this._formId) {\n this.reset()\n }\n })\n\n formEventClient.on('request-form-force-submit', (e) => {\n if (e.payload.id === this._formId) {\n this._devtoolsSubmissionOverride = true\n this.handleSubmit()\n this._devtoolsSubmissionOverride = false\n }\n })\n }\n\n get formId(): string {\n return this._formId\n }\n\n /**\n * @private\n */\n runValidator<\n TValue extends TStandardSchemaValidatorValue<TFormData> & {\n formApi: AnyFormApi\n },\n TType extends 'validate' | 'validateAsync',\n >(props: {\n validate: TType extends 'validate'\n ? FormValidateOrFn<TFormData>\n : FormAsyncValidateOrFn<TFormData>\n value: TValue\n type: TType\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 FormValidateFn<any>)(props.value) as never\n }\n\n mount = () => {\n const cleanupFieldMetaDerived = this.fieldMetaDerived.mount()\n const cleanupStoreDerived = this.store.mount()\n const cleanup = () => {\n cleanupFieldMetaDerived()\n cleanupStoreDerived()\n\n // broadcast form unmount for devtools\n formEventClient.emit('form-unmounted', {\n id: this._formId,\n })\n }\n\n this.options.listeners?.onMount?.({ formApi: this })\n\n const { onMount } = this.options.validators || {}\n\n // broadcast form state for devtools on mounting\n formEventClient.emit('form-state-change', {\n id: this._formId,\n state: this.store.state,\n options: this.options,\n })\n\n // if no validation skip\n if (!onMount) return cleanup\n\n // validate\n this.validateSync('mount')\n return cleanup\n }\n\n /**\n * Updates the form options and form state.\n */\n update = (\n options?: FormOptions<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync,\n TOnServer,\n TSubmitMeta\n >,\n ) => {\n if (!options) return\n\n const oldOptions = this.options\n\n // Options need to be updated first so that when the store is updated, the state is correct for the derived state\n this.options = options\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n const shouldUpdateReeval = !!options.transform?.deps?.some(\n (val, i) => val !== this.prevTransformArray[i],\n )\n\n const shouldUpdateValues =\n options.defaultValues &&\n !evaluate(options.defaultValues, oldOptions.defaultValues) &&\n !this.state.isTouched\n\n const shouldUpdateState =\n !evaluate(options.defaultState, oldOptions.defaultState) &&\n !this.state.isTouched\n\n if (!shouldUpdateValues && !shouldUpdateState && !shouldUpdateReeval) return\n\n batch(() => {\n this.baseStore.setState(() =>\n getDefaultFormState(\n Object.assign(\n {},\n this.state as any,\n\n shouldUpdateState ? options.defaultState : {},\n\n shouldUpdateValues\n ? {\n values: options.defaultValues,\n }\n : {},\n\n shouldUpdateReeval\n ? { _force_re_eval: !this.state._force_re_eval }\n : {},\n ),\n ),\n )\n })\n }\n\n /**\n * Resets the form state to the default values.\n * If values are provided, the form will be reset to those values instead and the default values will be updated.\n *\n * @param values - Optional values to reset the form to.\n * @param opts - Optional options to control the reset behavior.\n */\n reset = (values?: TFormData, opts?: { keepDefaultValues?: boolean }) => {\n const { fieldMeta: currentFieldMeta } = this.state\n const fieldMetaBase = this.resetFieldMeta(currentFieldMeta)\n\n if (values && !opts?.keepDefaultValues) {\n this.options = {\n ...this.options,\n defaultValues: values,\n }\n }\n\n this.baseStore.setState(() =>\n getDefaultFormState({\n ...(this.options.defaultState as any),\n values:\n values ??\n this.options.defaultValues ??\n this.options.defaultState?.values,\n fieldMetaBase,\n }),\n )\n }\n\n /**\n * Validates all fields using the correct handlers for a given validation cause.\n */\n validateAllFields = async (cause: ValidationCause) => {\n const fieldValidationPromises: Promise<ValidationError[]>[] = [] as any\n batch(() => {\n void (Object.values(this.fieldInfo) as FieldInfo<any>[]).forEach(\n (field) => {\n if (!field.instance) return\n const fieldInstance = field.instance\n // Validate the field\n fieldValidationPromises.push(\n // Remember, `validate` is either a sync operation or a promise\n Promise.resolve().then(() =>\n fieldInstance.validate(cause, { skipFormValidation: true }),\n ),\n )\n // If any fields are not touched\n if (!field.instance.state.meta.isTouched) {\n // Mark them as touched\n field.instance.setMeta((prev) => ({ ...prev, isTouched: true }))\n }\n },\n )\n })\n\n const fieldErrorMapMap = await Promise.all(fieldValidationPromises)\n return fieldErrorMapMap.flat()\n }\n\n /**\n * Validates the children of a specified array in the form starting from a given index until the end using the correct handlers for a given validation type.\n */\n validateArrayFieldsStartingFrom = async <\n TField extends DeepKeysOfType<TFormData, any[]>,\n >(\n field: TField,\n index: number,\n cause: ValidationCause,\n ) => {\n const currentValue = this.getFieldValue(field)\n\n const lastIndex = Array.isArray(currentValue)\n ? Math.max((currentValue as Array<unknown>).length - 1, 0)\n : null\n\n // We have to validate all fields that have shifted (at least the current field)\n const fieldKeysToValidate = [`${field}[${index}]`]\n for (let i = index + 1; i <= (lastIndex ?? 0); i++) {\n fieldKeysToValidate.push(`${field}[${i}]`)\n }\n\n // We also have to include all fields that are nested in the shifted fields\n const fieldsToValidate = Object.keys(this.fieldInfo).filter((fieldKey) =>\n fieldKeysToValidate.some((key) => fieldKey.startsWith(key)),\n ) as DeepKeys<TFormData>[]\n\n // Validate the fields\n const fieldValidationPromises: Promise<ValidationError[]>[] = [] as any\n batch(() => {\n fieldsToValidate.forEach((nestedField) => {\n fieldValidationPromises.push(\n Promise.resolve().then(() => this.validateField(nestedField, cause)),\n )\n })\n })\n\n const fieldErrorMapMap = await Promise.all(fieldValidationPromises)\n return fieldErrorMapMap.flat()\n }\n\n /**\n * Validates a specified field in the form using the correct handlers for a given validation type.\n */\n validateField = <TField extends DeepKeys<TFormData>>(\n field: TField,\n cause: ValidationCause,\n ) => {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n const fieldInstance = this.fieldInfo[field]?.instance\n if (!fieldInstance) return []\n\n // If the field is not touched (same logic as in validateAllFields)\n if (!fieldInstance.state.meta.isTouched) {\n // Mark it as touched\n fieldInstance.setMeta((prev) => ({ ...prev, isTouched: true }))\n }\n\n return fieldInstance.validate(cause)\n }\n\n /**\n * TODO: This code is copied from FieldApi, we should refactor to share\n * @private\n */\n validateSync = (\n cause: ValidationCause,\n ): {\n hasErrored: boolean\n fieldsErrorMap: FormErrorMapFromValidator<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync\n >\n } => {\n const validates = getSyncValidatorArray(cause, {\n ...this.options,\n form: this,\n validationLogic: this.options.validationLogic || defaultValidationLogic,\n })\n\n let hasErrored = false as boolean\n\n // This map will only include fields that have errors in the current validation cycle\n const currentValidationErrorMap: FormErrorMapFromValidator<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync\n > = {}\n\n batch(() => {\n for (const validateObj of validates) {\n if (!validateObj.validate) continue\n\n const rawError = this.runValidator({\n validate: validateObj.validate,\n value: {\n value: this.state.values,\n formApi: this,\n validationSource: 'form',\n },\n type: 'validate',\n })\n\n const { formError, fieldErrors } = normalizeError<TFormData>(rawError)\n\n const errorMapKey = getErrorMapKey(validateObj.cause)\n\n for (const field of Object.keys(\n this.state.fieldMeta,\n ) as DeepKeys<TFormData>[]) {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (this.baseStore.state.fieldMetaBase[field] === undefined) {\n continue\n }\n\n const fieldMeta = this.getFieldMeta(field)\n if (!fieldMeta) continue\n\n const {\n errorMap: currentErrorMap,\n errorSourceMap: currentErrorMapSource,\n } = fieldMeta\n\n const newFormValidatorError = fieldErrors?.[field]\n\n const { newErrorValue, newSource } =\n determineFormLevelErrorSourceAndValue({\n newFormValidatorError,\n isPreviousErrorFromFormValidator:\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n currentErrorMapSource?.[errorMapKey] === 'form',\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n previousErrorValue: currentErrorMap?.[errorMapKey],\n })\n\n if (newSource === 'form') {\n currentValidationErrorMap[field] = {\n ...currentValidationErrorMap[field],\n [errorMapKey]: newFormValidatorError,\n }\n }\n\n if (\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n currentErrorMap?.[errorMapKey] !== newErrorValue\n ) {\n this.setFieldMeta(field, (prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n [errorMapKey]: newErrorValue,\n },\n errorSourceMap: {\n ...prev.errorSourceMap,\n [errorMapKey]: newSource,\n },\n }))\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (this.state.errorMap?.[errorMapKey] !== formError) {\n this.baseStore.setState((prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n [errorMapKey]: formError,\n },\n }))\n }\n\n if (formError || fieldErrors) {\n hasErrored = true\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 if (\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n this.state.errorMap?.[submitErrKey] &&\n cause !== 'submit' &&\n !hasErrored\n ) {\n this.baseStore.setState((prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n [submitErrKey]: undefined,\n },\n }))\n }\n\n /**\n * when we have an error for onServer 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 serverErrKey = getErrorMapKey('server')\n if (\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n this.state.errorMap?.[serverErrKey] &&\n cause !== 'server' &&\n !hasErrored\n ) {\n this.baseStore.setState((prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n [serverErrKey]: undefined,\n },\n }))\n }\n })\n\n return { hasErrored, fieldsErrorMap: currentValidationErrorMap }\n }\n\n /**\n * @private\n */\n validateAsync = async (\n cause: ValidationCause,\n ): Promise<\n FormErrorMapFromValidator<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync\n >\n > => {\n const validates = getAsyncValidatorArray(cause, {\n ...this.options,\n form: this,\n validationLogic: this.options.validationLogic || defaultValidationLogic,\n })\n\n if (!this.state.isFormValidating) {\n this.baseStore.setState((prev) => ({ ...prev, isFormValidating: 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 promises: Promise<ValidationPromiseResult<TFormData>>[] = []\n\n let fieldErrorsFromFormValidators:\n | Partial<Record<DeepKeys<TFormData>, ValidationError>>\n | undefined\n\n for (const validateObj of validates) {\n if (!validateObj.validate) continue\n const key = getErrorMapKey(validateObj.cause)\n const fieldValidatorMeta = this.state.validationMetaMap[key]\n\n fieldValidatorMeta?.lastAbortController.abort()\n const controller = new AbortController()\n\n this.state.validationMetaMap[key] = {\n lastAbortController: controller,\n }\n\n promises.push(\n new Promise<ValidationPromiseResult<TFormData>>(async (resolve) => {\n let rawError!:\n | ValidationError\n | FormValidationError<unknown>\n | undefined\n try {\n rawError = await new Promise((rawResolve, rawReject) => {\n 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: this.state.values,\n formApi: this,\n validationSource: 'form',\n signal: controller.signal,\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 const { formError, fieldErrors: fieldErrorsFromNormalizeError } =\n normalizeError<TFormData>(rawError)\n\n if (fieldErrorsFromNormalizeError) {\n fieldErrorsFromFormValidators = fieldErrorsFromFormValidators\n ? {\n ...fieldErrorsFromFormValidators,\n ...fieldErrorsFromNormalizeError,\n }\n : fieldErrorsFromNormalizeError\n }\n const errorMapKey = getErrorMapKey(validateObj.cause)\n\n for (const field of Object.keys(\n this.state.fieldMeta,\n ) as DeepKeys<TFormData>[]) {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (this.baseStore.state.fieldMetaBase[field] === undefined) {\n continue\n }\n\n const fieldMeta = this.getFieldMeta(field)\n if (!fieldMeta) continue\n\n const {\n errorMap: currentErrorMap,\n errorSourceMap: currentErrorMapSource,\n } = fieldMeta\n\n const newFormValidatorError = fieldErrorsFromFormValidators?.[field]\n\n const { newErrorValue, newSource } =\n determineFormLevelErrorSourceAndValue({\n newFormValidatorError,\n isPreviousErrorFromFormValidator:\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n currentErrorMapSource?.[errorMapKey] === 'form',\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n previousErrorValue: currentErrorMap?.[errorMapKey],\n })\n\n if (\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n currentErrorMap?.[errorMapKey] !== newErrorValue\n ) {\n this.setFieldMeta(field, (prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n [errorMapKey]: newErrorValue,\n },\n errorSourceMap: {\n ...prev.errorSourceMap,\n [errorMapKey]: newSource,\n },\n }))\n }\n }\n\n this.baseStore.setState((prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n [errorMapKey]: formError,\n },\n }))\n\n resolve(\n fieldErrorsFromFormValidators\n ? { fieldErrors: fieldErrorsFromFormValidators, errorMapKey }\n : undefined,\n )\n }),\n )\n }\n\n let results: ValidationPromiseResult<TFormData>[] = []\n\n const fieldsErrorMap: FormErrorMapFromValidator<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync\n > = {}\n if (promises.length) {\n results = await Promise.all(promises)\n for (const fieldValidationResult of results) {\n if (fieldValidationResult?.fieldErrors) {\n const { errorMapKey } = fieldValidationResult\n\n for (const [field, fieldError] of Object.entries(\n fieldValidationResult.fieldErrors,\n )) {\n const oldErrorMap =\n fieldsErrorMap[field as DeepKeys<TFormData>] || {}\n const newErrorMap = {\n ...oldErrorMap,\n [errorMapKey]: fieldError,\n }\n fieldsErrorMap[field as DeepKeys<TFormData>] = newErrorMap\n }\n }\n }\n }\n\n this.baseStore.setState((prev) => ({\n ...prev,\n isFormValidating: false,\n }))\n\n return fieldsErrorMap\n }\n\n /**\n * @private\n */\n validate = (\n cause: ValidationCause,\n ):\n | FormErrorMapFromValidator<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync\n >\n | Promise<\n FormErrorMapFromValidator<\n TFormData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TOnDynamic,\n TOnDynamicAsync\n >\n > => {\n // Attempt to sync validate first\n const { hasErrored, fieldsErrorMap } = this.validateSync(cause)\n\n if (hasErrored && !this.options.asyncAlways) {\n return fieldsErrorMap\n }\n\n // No error? Attempt async validation\n return this.validateAsync(cause)\n }\n\n /**\n * Handles the form submission, performs validation, and calls the appropriate onSubmit or onSubmitInvalid callbacks.\n */\n handleSubmit(): Promise<void>\n handleSubmit(submitMeta: TSubmitMeta): Promise<void>\n async handleSubmit(submitMeta?: TSubmitMeta): Promise<void> {\n this.baseStore.setState((old) => ({\n ...old,\n // Submission attempts mark the form as not submitted\n isSubmitted: false,\n // Count submission attempts\n submissionAttempts: old.submissionAttempts + 1,\n isSubmitSuccessful: false, // Reset isSubmitSuccessful at the start of submission\n }))\n\n batch(() => {\n void (Object.values(this.fieldInfo) as FieldInfo<any>[]).forEach(\n (field) => {\n if (!field.instance) return\n // If any fields are not touched\n if (!field.instance.state.meta.isTouched) {\n // Mark them as touched\n field.instance.setMeta((prev) => ({ ...prev, isTouched: true }))\n }\n },\n )\n })\n\n const submitMetaArg =\n submitMeta ?? (this.options.onSubmitMeta as TSubmitMeta)\n\n if (!this.state.canSubmit && !this._devtoolsSubmissionOverride) {\n this.options.onSubmitInvalid?.({\n value: this.state.values,\n formApi: this,\n meta: submitMetaArg,\n })\n return\n }\n\n this.baseStore.setState((d) => ({ ...d, isSubmitting: true }))\n\n const done = () => {\n this.baseStore.setState((prev) => ({ ...prev, isSubmitting: false }))\n }\n\n await this.validateAllFields('submit')\n\n if (!this.state.isFieldsValid) {\n done()\n\n this.options.onSubmitInvalid?.({\n value: this.state.values,\n formApi: this,\n meta: submitMetaArg,\n })\n\n formEventClient.emit('form-submission-state-change', {\n id: this._formId,\n submissionAttempt: this.state.submissionAttempts,\n successful: false,\n stage: 'validateAllFields',\n errors: (Object.values(this.state.fieldMeta) as AnyFieldMeta[])\n .map((meta: AnyFieldMeta) => meta.errors)\n .flat(),\n })\n return\n }\n\n await this.validate('submit')\n\n // Fields are invalid, do not submit\n if (!this.state.isValid) {\n done()\n\n this.options.onSubmitInvalid?.({\n value: this.state.values,\n formApi: this,\n meta: submitMetaArg,\n })\n\n formEventClient.emit('form-submission-state-change', {\n id: this._formId,\n submissionAttempt: this.state.submissionAttempts,\n successful: false,\n stage: 'validate',\n errors: this.state.errors,\n })\n\n return\n }\n\n batch(() => {\n void (Object.values(this.fieldInfo) as FieldInfo<TFormData>[]).forEach(\n (field) => {\n field.instance?.options.listeners?.onSubmit?.({\n value: field.instance.state.value,\n fieldApi: field.instance,\n })\n },\n )\n })\n\n this.options.listeners?.onSubmit?.({ formApi: this, meta: submitMetaArg })\n\n try {\n // Run the submit code\n await this.options.onSubmit?.({\n value: this.state.values,\n formApi: this,\n meta: submitMetaArg,\n })\n\n batch(() => {\n this.baseStore.setState((prev) => ({\n ...prev,\n isSubmitted: true,\n isSubmitSuccessful: true, // Set isSubmitSuccessful to true on successful submission\n }))\n\n formEventClient.emit('form-submission-state-change', {\n id: this._formId,\n submissionAttempt: this.state.submissionAttempts,\n successful: true,\n })\n\n done()\n })\n } catch (err) {\n this.baseStore.setState((prev) => ({\n ...prev,\n isSubmitSuccessful: false, // Ensure isSubmitSuccessful is false if an error occurs\n }))\n\n formEventClient.emit('form-submission-state-change', {\n id: this._formId,\n submissionAttempt: this.state.submissionAttempts,\n successful: false,\n stage: 'inflight',\n onError: err,\n })\n\n done()\n\n throw err\n }\n }\n\n /**\n * Gets the value of the specified field.\n */\n getFieldValue = <TField extends DeepKeys<TFormData>>(\n field: TField,\n ): DeepValue<TFormData, TField> => getBy(this.state.values, field)\n\n /**\n * Gets the metadata of the specified field.\n */\n getFieldMeta = <TField extends DeepKeys<TFormData>>(\n field: TField,\n ): AnyFieldMeta | undefined => {\n return this.state.fieldMeta[field]\n }\n\n /**\n * Gets the field info of the specified field.\n */\n getFieldInfo = <TField extends DeepKeys<TFormData>>(\n field: TField,\n ): FieldInfo<TFormData> => {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n return (this.fieldInfo[field] ||= {\n instance: null,\n validationMetaMap: {\n onChange: undefined,\n onBlur: undefined,\n onSubmit: undefined,\n onMount: undefined,\n onServer: undefined,\n onDynamic: undefined,\n },\n })\n }\n\n /**\n * Updates the metadata of the specified field.\n */\n setFieldMeta = <TField extends DeepKeys<TFormData>>(\n field: TField,\n updater: Updater<AnyFieldMetaBase>,\n ) => {\n this.baseStore.setState((prev) => {\n return {\n ...prev,\n fieldMetaBase: {\n ...prev.fieldMetaBase,\n [field]: functionalUpdate(\n updater,\n prev.fieldMetaBase[field] as never,\n ),\n },\n }\n })\n }\n\n /**\n * resets every field's meta\n */\n resetFieldMeta = <TField extends DeepKeys<TFormData>>(\n fieldMeta: Record<TField, AnyFieldMeta>,\n ): Record<TField, AnyFieldMeta> => {\n return Object.keys(fieldMeta).reduce(\n (acc: Record<TField, AnyFieldMeta>, key) => {\n const fieldKey = key as TField\n acc[fieldKey] = defaultFieldMeta\n return acc\n },\n {} as Record<TField, AnyFieldMeta>,\n )\n }\n\n /**\n * Sets the value of the specified field and optionally updates the touched state.\n */\n setFieldValue = <TField extends DeepKeys<TFormData>>(\n field: TField,\n updater: Updater<DeepValue<TFormData, TField>>,\n opts?: UpdateMetaOptions,\n ) => {\n const dontUpdateMeta = opts?.dontUpdateMeta ?? false\n const dontRunListeners = opts?.dontRunListeners ?? false\n const dontValidate = opts?.dontValidate ?? false\n\n batch(() => {\n if (!dontUpdateMeta) {\n this.setFieldMeta(field, (prev) => ({\n ...prev,\n isTouched: true,\n isDirty: true,\n errorMap: {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n ...prev?.errorMap,\n onMount: undefined,\n },\n }))\n }\n\n this.baseStore.setState((prev) => {\n return {\n ...prev,\n values: setBy(prev.values, field, updater),\n }\n })\n })\n\n if (!dontRunListeners) {\n this.getFieldInfo(field).instance?.triggerOnChangeListener()\n }\n\n if (!dontValidate) {\n this.validateField(field, 'change')\n }\n }\n\n deleteField = <TField extends DeepKeys<TFormData>>(field: TField) => {\n const subFieldsToDelete = Object.keys(this.fieldInfo).filter((f) => {\n const fieldStr = field.toString()\n return f !== fieldStr && f.startsWith(fieldStr)\n })\n\n const fieldsToDelete = [...subFieldsToDelete, field]\n\n // Cleanup the last fields\n this.baseStore.setState((prev) => {\n const newState = { ...prev }\n fieldsToDelete.forEach((f) => {\n newState.values = deleteBy(newState.values, f)\n delete this.fieldInfo[f as never]\n delete newState.fieldMetaBase[f as never]\n })\n\n return newState\n })\n }\n\n /**\n * Pushes a value into an array field.\n */\n pushFieldValue = <TField extends DeepKeysOfType<TFormData, any[]>>(\n field: TField,\n value: DeepValue<TFormData, TField> extends any[]\n ? DeepValue<TFormData, TField>[number]\n : never,\n options?: UpdateMetaOptions,\n ) => {\n this.setFieldValue(\n field,\n (prev) => [...(Array.isArray(prev) ? prev : []), value] as any,\n options,\n )\n }\n\n insertFieldValue = async <TField extends DeepKeysOfType<TFormData, any[]>>(\n field: TField,\n index: number,\n value: DeepValue<TFormData, TField> extends any[]\n ? DeepValue<TFormData, TField>[number]\n : never,\n options?: UpdateMetaOptions,\n ) => {\n this.setFieldValue(\n field,\n (prev) => {\n return [\n ...(prev as DeepValue<TFormData, TField>[]).slice(0, index),\n value,\n ...(prev as DeepValue<TFormData, TField>[]).slice(index),\n ] as any\n },\n mergeOpts(options, { dontValidate: true }),\n )\n\n // Validate the whole array + all fields that have shifted\n await this.validateField(field, 'change')\n\n // Shift down all meta after validating to make sure the new field has been mounted\n metaHelper(this).handleArrayFieldMetaShift(field, index, 'insert')\n\n await this.validateArrayFieldsStartingFrom(field, index, 'change')\n }\n\n /**\n * Replaces a value into an array field at the specified index.\n */\n replaceFieldValue = async <TField extends DeepKeysOfType<TFormData, any[]>>(\n field: TField,\n index: number,\n value: DeepValue<TFormData, TField> extends any[]\n ? DeepValue<TFormData, TField>[number]\n : never,\n options?: UpdateMetaOptions,\n ) => {\n this.setFieldValue(\n field,\n (prev) => {\n return (prev as DeepValue<TFormData, TField>[]).map((d, i) =>\n i === index ? value : d,\n ) as any\n },\n mergeOpts(options, { dontValidate: true }),\n )\n\n // Validate the whole array + all fields that have shifted\n await this.validateField(field, 'change')\n await this.validateArrayFieldsStartingFrom(field, index, 'change')\n }\n\n /**\n * Removes a value from an array field at the specified index.\n */\n removeFieldValue = async <TField extends DeepKeysOfType<TFormData, any[]>>(\n field: TField,\n index: number,\n options?: UpdateMetaOptions,\n ) => {\n const fieldValue = this.getFieldValue(field)\n\n const lastIndex = Array.isArray(fieldValue)\n ? Math.max((fieldValue as Array<unknown>).length - 1, 0)\n : null\n\n this.setFieldValue(\n field,\n (prev) => {\n return (prev as DeepValue<TFormData, TField>[]).filter(\n (_d, i) => i !== index,\n ) as any\n },\n mergeOpts(options, { dontValidate: true }),\n )\n\n // Shift up all meta\n metaHelper(this).handleArrayFieldMetaShift(field, index, 'remove')\n\n if (lastIndex !== null) {\n const start = `${field}[${lastIndex}]`\n this.deleteField(start as never)\n }\n\n // Validate the whole array + all fields that have shifted\n await this.validateField(field, 'change')\n await this.validateArrayFieldsStartingFrom(field, index, 'change')\n }\n\n /**\n * Swaps the values at the specified indices within an array field.\n */\n swapFieldValues = <TField extends DeepKeysOfType<TFormData, any[]>>(\n field: TField,\n index1: number,\n index2: number,\n options?: UpdateMetaOptions,\n ) => {\n this.setFieldValue(\n field,\n (prev: any) => {\n const prev1 = prev[index1]!\n const prev2 = prev[index2]!\n return setBy(setBy(prev, `${index1}`, prev2), `${index2}`, prev1)\n },\n mergeOpts(options, { dontValidate: true }),\n )\n\n // Swap meta\n metaHelper(this).handleArrayFieldMetaShift(field, index1, 'swap', index2)\n\n // Validate the whole array\n this.validateField(field, 'change')\n // Validate the swapped fields\n this.validateField(`${field}[${index1}]` as DeepKeys<TFormData>, 'change')\n this.validateField(`${field}[${index2}]` as DeepKeys<TFormData>, 'change')\n }\n\n /**\n * Moves the value at the first specified index to the second specified index within an array field.\n */\n moveFieldValues = <TField extends DeepKeysOfType<TFormData, any[]>>(\n field: TField,\n index1: number,\n index2: number,\n options?: UpdateMetaOptions,\n ) => {\n this.setFieldValue(\n field,\n (prev: any) => {\n const next: any = [...prev]\n next.splice(index2, 0, next.splice(index1, 1)[0])\n return next\n },\n mergeOpts(options, { dontValidate: true }),\n )\n\n // Move meta between index1 and index2\n metaHelper(this).handleArrayFieldMetaShift(field, index1, 'move', index2)\n\n // Validate the whole array\n this.validateField(field, 'change')\n // Validate the moved fields\n this.validateField(`${field}[${index1}]` as DeepKeys<TFormData>, 'change')\n this.validateField(`${field}[${index2}]` as DeepKeys<TFormData>, 'change')\n }\n\n /**\n * Clear all values within an array field.\n */\n clearFieldValues = <TField extends DeepKeysOfType<TFormData, any[]>>(\n field: TField,\n options?: UpdateMetaOptions,\n ) => {\n const fieldValue = this.getFieldValue(field)\n\n const lastIndex = Array.isArray(fieldValue)\n ? Math.max((fieldValue as unknown[]).length - 1, 0)\n : null\n\n this.setFieldValue(\n field,\n [] as any,\n mergeOpts(options, { dontValidate: true }),\n )\n\n if (lastIndex !== null) {\n for (let i = 0; i <= lastIndex; i++) {\n const fieldKey = `${field}[${i}]`\n this.deleteField(fieldKey as never)\n }\n }\n\n // validate array change\n this.validateField(field, 'change')\n }\n\n /**\n * Resets the field value and meta to default state\n */\n resetField = <TField extends DeepKeys<TFormData>>(field: TField) => {\n this.baseStore.setState((prev) => {\n return {\n ...prev,\n fieldMetaBase: {\n ...prev.fieldMetaBase,\n [field]: defaultFieldMeta,\n },\n values: this.options.defaultValues\n ? setBy(prev.values, field, getBy(this.options.defaultValues, field))\n : prev.values,\n }\n })\n }\n\n /**\n * Updates the form's errorMap\n */\n setErrorMap(\n errorMap: FormValidationErrorMap<\n TFormData,\n UnwrapFormValidateOrFn<TOnMount>,\n UnwrapFormValidateOrFn<TOnChange>,\n UnwrapFormAsyncValidateOrFn<TOnChangeAsync>,\n UnwrapFormValidateOrFn<TOnBlur>,\n UnwrapFormAsyncValidateOrFn<TOnBlurAsync>,\n UnwrapFormValidateOrFn<TOnSubmit>,\n UnwrapFormAsyncValidateOrFn<TOnSubmitAsync>,\n UnwrapFormValidateOrFn<TOnDynamic>,\n UnwrapFormAsyncValidateOrFn<TOnDynamicAsync>,\n UnwrapFormAsyncValidateOrFn<TOnServer>\n >,\n ) {\n batch(() => {\n Object.entries(errorMap).forEach(([key, value]) => {\n const errorMapKey = key as ValidationErrorMapKeys\n\n if (isGlobalFormValidationError(value)) {\n const { formError, fieldErrors } = normalizeError<TFormData>(value)\n\n for (const fieldName of Object.keys(\n this.fieldInfo,\n ) as DeepKeys<TFormData>[]) {\n const fieldMeta = this.getFieldMeta(fieldName)\n if (!fieldMeta) continue\n\n this.setFieldMeta(fieldName, (prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n [errorMapKey]: fieldErrors?.[fieldName],\n },\n errorSourceMap: {\n ...prev.errorSourceMap,\n [errorMapKey]: 'form',\n },\n }))\n }\n\n this.baseStore.setState((prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n [errorMapKey]: formError,\n },\n }))\n } else {\n this.baseStore.setState((prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n [errorMapKey]: value,\n },\n }))\n }\n })\n })\n }\n\n /**\n * Returns form and field level errors\n */\n getAllErrors = (): {\n form: {\n errors: Array<\n | UnwrapFormValidateOrFn<TOnMount>\n | UnwrapFormValidateOrFn<TOnChange>\n | UnwrapFormAsyncValidateOrFn<TOnChangeAsync>\n | UnwrapFormValidateOrFn<TOnBlur>\n | UnwrapFormAsyncValidateOrFn<TOnBlurAsync>\n | UnwrapFormValidateOrFn<TOnSubmit>\n | UnwrapFormAsyncValidateOrFn<TOnSubmitAsync>\n | UnwrapFormValidateOrFn<TOnDynamic>\n | UnwrapFormAsyncValidateOrFn<TOnDynamicAsync>\n | UnwrapFormAsyncValidateOrFn<TOnServer>\n >\n errorMap: ValidationErrorMap<\n UnwrapFormValidateOrFn<TOnMount>,\n UnwrapFormValidateOrFn<TOnChange>,\n UnwrapFormAsyncValidateOrFn<TOnChangeAsync>,\n UnwrapFormValidateOrFn<TOnBlur>,\n UnwrapFormAsyncValidateOrFn<TOnBlurAsync>,\n UnwrapFormValidateOrFn<TOnSubmit>,\n UnwrapFormAsyncValidateOrFn<TOnSubmitAsync>,\n UnwrapFormValidateOrFn<TOnDynamic>,\n UnwrapFormAsyncValidateOrFn<TOnDynamicAsync>,\n UnwrapFormAsyncValidateOrFn<TOnServer>\n >\n }\n fields: Record<\n DeepKeys<TFormData>,\n { errors: ValidationError[]; errorMap: ValidationErrorMap }\n >\n } => {\n return {\n form: {\n errors: this.state.errors,\n errorMap: this.state.errorMap,\n },\n fields: Object.entries(this.state.fieldMeta).reduce(\n (acc, [fieldName, fieldMeta]) => {\n if (\n Object.keys(fieldMeta as AnyFieldMeta).length &&\n (fieldMeta as AnyFieldMeta).errors.length\n ) {\n acc[fieldName as DeepKeys<TFormData>] = {\n errors: (fieldMeta as AnyFieldMeta).errors,\n errorMap: (fieldMeta as AnyFieldMeta).errorMap,\n }\n }\n\n return acc\n },\n {} as Record<\n DeepKeys<TFormData>,\n { errors: ValidationError[]; errorMap: ValidationErrorMap }\n >,\n ),\n }\n }\n\n /**\n * Parses the form's values with a given standard schema and returns\n * issues (if any). This method does NOT set any internal errors.\n * @param schema The standard schema to parse the form values with.\n */\n parseValuesWithSchema = (schema: StandardSchemaV1<TFormData, unknown>) => {\n return standardSchemaValidators.validate(\n { value: this.state.values, validationSource: 'form' },\n schema,\n )\n }\n\n /**\n * Parses the form's values with a given standard schema and returns\n * issues (if any). This method does NOT set any internal errors.\n * @param schema The standard schema to parse the form values with.\n */\n parseValuesWithSchemaAsync = (\n schema: StandardSchemaV1<TFormData, unknown>,\n ) => {\n return standardSchemaValidators.validateAsync(\n { value: this.state.values, validationSource: 'form' },\n schema,\n )\n }\n}\n\nfunction normalizeError<TFormData>(rawError?: FormValidationError<unknown>): {\n formError: ValidationError\n fieldErrors?: Partial<Record<DeepKeys<TFormData>, ValidationError>>\n} {\n if (rawError) {\n if (isGlobalFormValidationError(rawError)) {\n const formError = normalizeError(rawError.form).formError\n const fieldErrors = rawError.fields\n return { formError, fieldErrors } as never\n }\n\n return { formError: rawError }\n }\n\n return { formError: 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 'dynamic':\n return 'onDynamic'\n case 'change':\n default:\n return 'onChange'\n }\n}\n"],"names":["opts"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tanstack/form-core",
3
- "version": "1.24.1",
3
+ "version": "1.24.2",
4
4
  "description": "Powerful, type-safe, framework agnostic forms.",
5
5
  "author": "tannerlinsley",
6
6
  "license": "MIT",
package/src/FormApi.ts CHANGED
@@ -1642,6 +1642,11 @@ export class FormApi<
1642
1642
  for (const field of Object.keys(
1643
1643
  this.state.fieldMeta,
1644
1644
  ) as DeepKeys<TFormData>[]) {
1645
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
1646
+ if (this.baseStore.state.fieldMetaBase[field] === undefined) {
1647
+ continue
1648
+ }
1649
+
1645
1650
  const fieldMeta = this.getFieldMeta(field)
1646
1651
  if (!fieldMeta) continue
1647
1652
 
@@ -1845,6 +1850,11 @@ export class FormApi<
1845
1850
  for (const field of Object.keys(
1846
1851
  this.state.fieldMeta,
1847
1852
  ) as DeepKeys<TFormData>[]) {
1853
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
1854
+ if (this.baseStore.state.fieldMetaBase[field] === undefined) {
1855
+ continue
1856
+ }
1857
+
1848
1858
  const fieldMeta = this.getFieldMeta(field)
1849
1859
  if (!fieldMeta) continue
1850
1860