{"version":3,"file":"FormGroupApi.cjs","sources":["../../src/FormGroupApi.ts"],"sourcesContent":["import { batch, createStore } from '@tanstack/store'\nimport {\n  determineFieldLevelErrorSourceAndValue,\n  determineFormLevelErrorSourceAndValue,\n  evaluate,\n  getAsyncValidatorArray,\n  getSyncValidatorArray,\n  isFieldInGroup,\n  mergeOpts,\n} from './utils'\nimport { defaultValidationLogic } from './ValidationLogic'\nimport {\n  isStandardSchemaValidator,\n  standardSchemaValidators,\n} from './standardSchemaValidator'\nimport { defaultFieldMeta } from './metaHelper'\nimport { FieldApi } from './FieldApi'\nimport { FieldLikeApiOptions } from './types'\nimport type { ValidationLogicFn } from './ValidationLogic'\nimport type {\n  AnyFieldLikeMeta,\n  AnyFieldLikeMetaBase,\n  FieldErrorMapFromValidator,\n  FieldInfo,\n  FieldLikeAPI,\n  FieldLikeMeta,\n  FieldLikeMetaBase,\n  FieldLikeOptions,\n  FieldLikeState,\n  FormLikeAPI,\n  ListenerCause,\n  UnwrapFieldAsyncValidateOrFn,\n  UnwrapFieldValidateOrFn,\n  UpdateMetaOptions,\n  ValidationCause,\n  ValidationError,\n  ValidationErrorMap,\n} from './types'\nimport type {\n  FormApi,\n  FormAsyncValidateOrFn,\n  FormValidateOrFn,\n} from './FormApi'\nimport type { AnyFieldApi } from './FieldApi'\nimport type {\n  StandardSchemaV1,\n  TStandardSchemaValidatorValue,\n} from './standardSchemaValidator'\nimport type { AsyncValidator, SyncValidator, Updater } from './utils'\nimport type { ReadonlyStore } from '@tanstack/store'\nimport type {\n  DeepKeys,\n  DeepKeysOfType,\n  DeepValue,\n  UnwrapOneLevelOfArray,\n} from './util-types'\n\n/**\n * @private\n */\nexport type FormGroupValidateFn<\n  TParentData,\n  TName extends DeepKeys<TParentData>,\n  TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> = (props: {\n  value: TData\n  groupApi: FormGroupApi<\n    TParentData,\n    TName,\n    TData,\n    // This is technically an edge-type; which we try to keep non-`any`, but in this case\n    // It's referring to an inaccessible type from the group validate function inner types, so it's not a big deal\n    any,\n    any,\n    any,\n    any,\n    any,\n    any,\n    any,\n    any,\n    any,\n    any,\n    any,\n    any,\n    any,\n    any,\n    any,\n    any,\n    any,\n    any,\n    any,\n    any,\n    any\n  >\n}) => unknown\n\n/**\n * @private\n */\nexport type FormGroupValidateOrFn<\n  TParentData,\n  TName extends DeepKeys<TParentData>,\n  TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> =\n  | FormGroupValidateFn<TParentData, TName, TData>\n  | StandardSchemaV1<TData, unknown>\n\n/**\n * @private\n */\nexport type FormGroupValidateAsyncFn<\n  TParentData,\n  TName extends DeepKeys<TParentData>,\n  TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> = (options: {\n  value: TData\n  groupApi: FormGroupApi<\n    TParentData,\n    TName,\n    TData,\n    // This is technically an edge-type; which we try to keep non-`any`, but in this case\n    // It's referring to an inaccessible type from the group validate function inner types, so it's not a big deal\n    any,\n    any,\n    any,\n    any,\n    any,\n    any,\n    any,\n    any,\n    any,\n    any,\n    any,\n    any,\n    any,\n    any,\n    any,\n    any,\n    any,\n    any,\n    any,\n    any,\n    any\n  >\n  signal: AbortSignal\n}) => unknown | Promise<unknown>\n\n/**\n * @private\n */\nexport type FormGroupAsyncValidateOrFn<\n  TParentData,\n  TName extends DeepKeys<TParentData>,\n  TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> =\n  | FormGroupValidateAsyncFn<TParentData, TName, TData>\n  | StandardSchemaV1<TData, unknown>\n\n/**\n * @private\n */\nexport type FormGroupListenerFn<\n  TParentData,\n  TName extends DeepKeys<TParentData>,\n  TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> = (props: {\n  value: TData\n  groupApi: FormGroupApi<\n    TParentData,\n    TName,\n    TData,\n    // This is technically an edge-type; which we try to keep non-`any`, but in this case\n    // It's referring to an inaccessible type from the group listener function inner types, so it's not a big deal\n    any,\n    any,\n    any,\n    any,\n    any,\n    any,\n    any,\n    any,\n    any,\n    any,\n    any,\n    any,\n    any,\n    any,\n    any,\n    any,\n    any,\n    any,\n    any,\n    any,\n    any\n  >\n}) => void\n\n// TODO: Add `listenTo` props back\nexport interface FormGroupValidators<\n  TParentData,\n  TName extends DeepKeys<TParentData>,\n  TData extends DeepValue<TParentData, TName>,\n  TOnMount extends undefined | FormGroupValidateOrFn<TParentData, TName, TData>,\n  TOnChange extends\n    | undefined\n    | FormGroupValidateOrFn<TParentData, TName, TData>,\n  TOnChangeAsync extends\n    | undefined\n    | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n  TOnBlur extends undefined | FormGroupValidateOrFn<TParentData, TName, TData>,\n  TOnBlurAsync extends\n    | undefined\n    | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n  TOnSubmit extends\n    | undefined\n    | FormGroupValidateOrFn<TParentData, TName, TData>,\n  TOnSubmitAsync extends\n    | undefined\n    | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n  TOnDynamic extends\n    | undefined\n    | FormGroupValidateOrFn<TParentData, TName, TData>,\n  TOnDynamicAsync extends\n    | undefined\n    | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n> {\n  /**\n   * An optional function, that runs on the mount event of input.\n   */\n  onMount?: TOnMount\n  /**\n   * An optional function, that runs on the change event of input.\n   *\n   * @example z.string().min(1)\n   */\n  onChange?: TOnChange\n  /**\n   * An optional property similar to `onChange` but async validation\n   *\n   * @example z.string().refine(async (val) => val.length > 3, { message: 'Testing 123' })\n   */\n  onChangeAsync?: TOnChangeAsync\n  /**\n   * An optional number to represent how long the `onChangeAsync` should wait before running\n   *\n   * If set to a number larger than 0, will debounce the async validation event by this length of time in milliseconds\n   */\n  onChangeAsyncDebounceMs?: number\n  /**\n   * An optional list of field names that should trigger this field's `onChange` and `onChangeAsync` events when its value changes\n   */\n  // onChangeListenTo?: DeepKeys<TParentData>[]\n  /**\n   * An optional function, that runs on the blur event of input.\n   *\n   * @example z.string().min(1)\n   */\n  onBlur?: TOnBlur\n  /**\n   * An optional property similar to `onBlur` but async validation.\n   *\n   * @example z.string().refine(async (val) => val.length > 3, { message: 'Testing 123' })\n   */\n  onBlurAsync?: TOnBlurAsync\n\n  /**\n   * An optional number to represent how long the `onBlurAsync` should wait before running\n   *\n   * If set to a number larger than 0, will debounce the async validation event by this length of time in milliseconds\n   */\n  onBlurAsyncDebounceMs?: number\n  /**\n   * An optional list of field names that should trigger this field's `onBlur` and `onBlurAsync` events when its value changes\n   */\n  // onBlurListenTo?: DeepKeys<TParentData>[]\n  /**\n   * An optional function, that runs on the submit event of form.\n   *\n   * @example z.string().min(1)\n   */\n  onSubmit?: TOnSubmit\n  /**\n   * An optional property similar to `onSubmit` but async validation.\n   *\n   * @example z.string().refine(async (val) => val.length > 3, { message: 'Testing 123' })\n   */\n  onSubmitAsync?: TOnSubmitAsync\n  onDynamic?: TOnDynamic\n  onDynamicAsync?: TOnDynamicAsync\n  onDynamicAsyncDebounceMs?: number\n}\n\nexport interface FormGroupListeners<\n  TParentData,\n  TName extends DeepKeys<TParentData>,\n  TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> {\n  onChange?: FormGroupListenerFn<TParentData, TName, TData>\n  onChangeDebounceMs?: number\n  onBlur?: FormGroupListenerFn<TParentData, TName, TData>\n  onBlurDebounceMs?: number\n  onMount?: FormGroupListenerFn<TParentData, TName, TData>\n  onUnmount?: FormGroupListenerFn<TParentData, TName, TData>\n  onSubmit?: FormGroupListenerFn<TParentData, TName, TData>\n  onGroupSubmit?: FormGroupListenerFn<TParentData, TName, TData>\n}\n\ninterface FormGroupExtraOptions<\n  in out TParentData,\n  in out TName extends DeepKeys<TParentData>,\n  in out TData extends DeepValue<TParentData, TName>,\n  in out TOnMount extends\n    | undefined\n    | FormGroupValidateOrFn<TParentData, TName, TData>,\n  in out TOnChange extends\n    | undefined\n    | FormGroupValidateOrFn<TParentData, TName, TData>,\n  in out TOnChangeAsync extends\n    | undefined\n    | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n  in out TOnBlur extends\n    | undefined\n    | FormGroupValidateOrFn<TParentData, TName, TData>,\n  in out TOnBlurAsync extends\n    | undefined\n    | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n  in out TOnSubmit extends\n    | undefined\n    | FormGroupValidateOrFn<TParentData, TName, TData>,\n  in out TOnSubmitAsync extends\n    | undefined\n    | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n  in out TOnDynamic extends\n    | undefined\n    | FormGroupValidateOrFn<TParentData, TName, TData>,\n  in out TOnDynamicAsync extends\n    | undefined\n    | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n  in out TSubmitMeta,\n  in out TFormOnMount extends undefined | FormValidateOrFn<TParentData>,\n  in out TFormOnChange extends undefined | FormValidateOrFn<TParentData>,\n  in out TFormOnChangeAsync extends\n    | undefined\n    | FormAsyncValidateOrFn<TParentData>,\n  in out TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,\n  in out TFormOnBlurAsync extends\n    | undefined\n    | FormAsyncValidateOrFn<TParentData>,\n  in out TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,\n  in out TFormOnSubmitAsync extends\n    | undefined\n    | FormAsyncValidateOrFn<TParentData>,\n  in out TFormOnDynamic extends undefined | FormValidateOrFn<TParentData>,\n  in out TFormOnDynamicAsync extends\n    | undefined\n    | FormAsyncValidateOrFn<TParentData>,\n  in out TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>,\n  in out TParentSubmitMeta,\n> {\n  /**\n   * A list of validators to pass to the field\n   */\n  validators?: FormGroupValidators<\n    TParentData,\n    TName,\n    TData,\n    TOnMount,\n    TOnChange,\n    TOnChangeAsync,\n    TOnBlur,\n    TOnBlurAsync,\n    TOnSubmit,\n    TOnSubmitAsync,\n    TOnDynamic,\n    TOnDynamicAsync\n  >\n\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  /**\n   * A list of listeners which attach to the corresponding events\n   */\n  listeners?: FormGroupListeners<TParentData, TName, TData>\n\n  defaultState?: FormGroupState\n  /**\n   * Optional validation logic strategy to use for this group's own\n   * validators (e.g. `revalidateLogic()`). When omitted, the parent form's\n   * `validationLogic` (or the default) is used.\n   */\n  validationLogic?: ValidationLogicFn\n  /**\n   * onSubmitMeta, the data passed from the handleSubmit handler, to the onSubmit function props\n   */\n  onSubmitMeta?: TSubmitMeta\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  onGroupSubmit?: (props: {\n    value: TData\n    groupApi: FormGroupApi<\n      TParentData,\n      TName,\n      TData,\n      TOnMount,\n      TOnChange,\n      TOnChangeAsync,\n      TOnBlur,\n      TOnBlurAsync,\n      TOnSubmit,\n      TOnSubmitAsync,\n      TOnDynamic,\n      TOnDynamicAsync,\n      TSubmitMeta,\n      TFormOnMount,\n      TFormOnChange,\n      TFormOnChangeAsync,\n      TFormOnBlur,\n      TFormOnBlurAsync,\n      TFormOnSubmit,\n      TFormOnSubmitAsync,\n      TFormOnDynamic,\n      TFormOnDynamicAsync,\n      TFormOnServer,\n      TParentSubmitMeta\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  onGroupSubmitInvalid?: (props: {\n    value: TData\n    groupApi: FormGroupApi<\n      TParentData,\n      TName,\n      TData,\n      TOnMount,\n      TOnChange,\n      TOnChangeAsync,\n      TOnBlur,\n      TOnBlurAsync,\n      TOnSubmit,\n      TOnSubmitAsync,\n      TOnDynamic,\n      TOnDynamicAsync,\n      TSubmitMeta,\n      TFormOnMount,\n      TFormOnChange,\n      TFormOnChangeAsync,\n      TFormOnBlur,\n      TFormOnBlurAsync,\n      TFormOnSubmit,\n      TFormOnSubmitAsync,\n      TFormOnDynamic,\n      TFormOnDynamicAsync,\n      TFormOnServer,\n      TParentSubmitMeta\n    >\n    meta: TSubmitMeta\n  }) => void\n}\n\nexport interface FormGroupOptions<\n  in out TParentData,\n  in out TName extends DeepKeys<TParentData>,\n  in out TData extends DeepValue<TParentData, TName>,\n  in out TOnMount extends\n    | undefined\n    | FormGroupValidateOrFn<TParentData, TName, TData>,\n  in out TOnChange extends\n    | undefined\n    | FormGroupValidateOrFn<TParentData, TName, TData>,\n  in out TOnChangeAsync extends\n    | undefined\n    | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n  in out TOnBlur extends\n    | undefined\n    | FormGroupValidateOrFn<TParentData, TName, TData>,\n  in out TOnBlurAsync extends\n    | undefined\n    | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n  in out TOnSubmit extends\n    | undefined\n    | FormGroupValidateOrFn<TParentData, TName, TData>,\n  in out TOnSubmitAsync extends\n    | undefined\n    | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n  in out TOnDynamic extends\n    | undefined\n    | FormGroupValidateOrFn<TParentData, TName, TData>,\n  in out TOnDynamicAsync extends\n    | undefined\n    | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n  in out TSubmitMeta,\n  in out TFormOnMount extends undefined | FormValidateOrFn<TParentData>,\n  in out TFormOnChange extends undefined | FormValidateOrFn<TParentData>,\n  in out TFormOnChangeAsync extends\n    | undefined\n    | FormAsyncValidateOrFn<TParentData>,\n  in out TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,\n  in out TFormOnBlurAsync extends\n    | undefined\n    | FormAsyncValidateOrFn<TParentData>,\n  in out TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,\n  in out TFormOnSubmitAsync extends\n    | undefined\n    | FormAsyncValidateOrFn<TParentData>,\n  in out TFormOnDynamic extends undefined | FormValidateOrFn<TParentData>,\n  in out TFormOnDynamicAsync extends\n    | undefined\n    | FormAsyncValidateOrFn<TParentData>,\n  in out TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>,\n  in out TParentSubmitMeta,\n>\n  extends\n    FieldLikeOptions<\n      TParentData,\n      TName,\n      TData,\n      TOnMount,\n      TOnChange,\n      TOnChangeAsync,\n      TOnBlur,\n      TOnBlurAsync,\n      TOnSubmit,\n      TOnSubmitAsync,\n      TOnDynamic,\n      TOnDynamicAsync\n    >,\n    FormGroupExtraOptions<\n      TParentData,\n      TName,\n      TData,\n      TOnMount,\n      TOnChange,\n      TOnChangeAsync,\n      TOnBlur,\n      TOnBlurAsync,\n      TOnSubmit,\n      TOnSubmitAsync,\n      TOnDynamic,\n      TOnDynamicAsync,\n      TSubmitMeta,\n      TFormOnMount,\n      TFormOnChange,\n      TFormOnChangeAsync,\n      TFormOnBlur,\n      TFormOnBlurAsync,\n      TFormOnSubmit,\n      TFormOnSubmitAsync,\n      TFormOnDynamic,\n      TFormOnDynamicAsync,\n      TFormOnServer,\n      TParentSubmitMeta\n    > {}\n\nexport interface FormGroupApiOptions<\n  in out TParentData,\n  in out TName extends DeepKeys<TParentData>,\n  in out TData extends DeepValue<TParentData, TName>,\n  in out TOnMount extends\n    | undefined\n    | FormGroupValidateOrFn<TParentData, TName, TData>,\n  in out TOnChange extends\n    | undefined\n    | FormGroupValidateOrFn<TParentData, TName, TData>,\n  in out TOnChangeAsync extends\n    | undefined\n    | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n  in out TOnBlur extends\n    | undefined\n    | FormGroupValidateOrFn<TParentData, TName, TData>,\n  in out TOnBlurAsync extends\n    | undefined\n    | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n  in out TOnSubmit extends\n    | undefined\n    | FormGroupValidateOrFn<TParentData, TName, TData>,\n  in out TOnSubmitAsync extends\n    | undefined\n    | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n  in out TOnDynamic extends\n    | undefined\n    | FormGroupValidateOrFn<TParentData, TName, TData>,\n  in out TOnDynamicAsync extends\n    | undefined\n    | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n  in out TSubmitMeta,\n  in out TFormOnMount extends undefined | FormValidateOrFn<TParentData>,\n  in out TFormOnChange extends undefined | FormValidateOrFn<TParentData>,\n  in out TFormOnChangeAsync extends\n    | undefined\n    | FormAsyncValidateOrFn<TParentData>,\n  in out TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,\n  in out TFormOnBlurAsync extends\n    | undefined\n    | FormAsyncValidateOrFn<TParentData>,\n  in out TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,\n  in out TFormOnSubmitAsync extends\n    | undefined\n    | FormAsyncValidateOrFn<TParentData>,\n  in out TFormOnDynamic extends undefined | FormValidateOrFn<TParentData>,\n  in out TFormOnDynamicAsync extends\n    | undefined\n    | FormAsyncValidateOrFn<TParentData>,\n  in out TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>,\n  in out TParentSubmitMeta,\n> extends FormGroupOptions<\n  TParentData,\n  TName,\n  TData,\n  TOnMount,\n  TOnChange,\n  TOnChangeAsync,\n  TOnBlur,\n  TOnBlurAsync,\n  TOnSubmit,\n  TOnSubmitAsync,\n  TOnDynamic,\n  TOnDynamicAsync,\n  TSubmitMeta,\n  TFormOnMount,\n  TFormOnChange,\n  TFormOnChangeAsync,\n  TFormOnBlur,\n  TFormOnBlurAsync,\n  TFormOnSubmit,\n  TFormOnSubmitAsync,\n  TFormOnDynamic,\n  TFormOnDynamicAsync,\n  TFormOnServer,\n  TParentSubmitMeta\n> {\n  form: FormApi<\n    TParentData,\n    TFormOnMount,\n    TFormOnChange,\n    TFormOnChangeAsync,\n    TFormOnBlur,\n    TFormOnBlurAsync,\n    TFormOnSubmit,\n    TFormOnSubmitAsync,\n    TFormOnDynamic,\n    TFormOnDynamicAsync,\n    TFormOnServer,\n    TParentSubmitMeta\n  >\n}\n\nexport interface FormGroupState {\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\nfunction getDefaultFormGroupState(\n  defaultState: Partial<FormGroupState>,\n): FormGroupState {\n  return {\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  }\n}\n\n/**\n * @public\n *\n * A type representing the FormGroup API with all generics set to `any` for convenience.\n */\nexport type AnyFormGroupApi = FormGroupApi<\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  any,\n  any\n>\n\n/**\n * @public\n *\n * The `meta` shape exposed on `FormGroupApi.state.meta`. Mirrors\n * `FieldApi.state.meta` (since `FormGroupMeta extends FieldLikeMeta`) but\n * additionally surfaces the group's submission lifecycle and aggregated\n * validity flags. All derivation lives on the parent `FormApi` (in\n * `formGroupMetaDerived`), keeping per-instance `FormGroupApi.store` as\n * minimal as `FieldApi.store`.\n *\n * Aggregated booleans (`isTouched`, `isBlurred`, `isDirty`, `isPristine`,\n * `isDefaultValue`) are computed across the group's descendant fields\n * rather than the group's own field-meta entry.\n */\nexport interface FormGroupMeta<\n  in out TParentData,\n  in out TName extends DeepKeys<TParentData>,\n  in out TData extends DeepValue<TParentData, TName>,\n  in out TOnMount extends\n    | undefined\n    | FormGroupValidateOrFn<TParentData, TName, TData>,\n  in out TOnChange extends\n    | undefined\n    | FormGroupValidateOrFn<TParentData, TName, TData>,\n  in out TOnChangeAsync extends\n    | undefined\n    | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n  in out TOnBlur extends\n    | undefined\n    | FormGroupValidateOrFn<TParentData, TName, TData>,\n  in out TOnBlurAsync extends\n    | undefined\n    | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n  in out TOnSubmit extends\n    | undefined\n    | FormGroupValidateOrFn<TParentData, TName, TData>,\n  in out TOnSubmitAsync extends\n    | undefined\n    | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n  in out TOnDynamic extends\n    | undefined\n    | FormGroupValidateOrFn<TParentData, TName, TData>,\n  in out TOnDynamicAsync extends\n    | undefined\n    | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n  in out TFormOnMount extends undefined | FormValidateOrFn<TParentData>,\n  in out TFormOnChange extends undefined | FormValidateOrFn<TParentData>,\n  in out TFormOnChangeAsync extends\n    | undefined\n    | FormAsyncValidateOrFn<TParentData>,\n  in out TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,\n  in out TFormOnBlurAsync extends\n    | undefined\n    | FormAsyncValidateOrFn<TParentData>,\n  in out TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,\n  in out TFormOnSubmitAsync extends\n    | undefined\n    | FormAsyncValidateOrFn<TParentData>,\n  in out TFormOnDynamic extends undefined | FormValidateOrFn<TParentData>,\n  in out TFormOnDynamicAsync extends\n    | undefined\n    | FormAsyncValidateOrFn<TParentData>,\n>\n  extends\n    FieldLikeMeta<\n      TParentData,\n      TName,\n      TData,\n      TOnMount,\n      TOnChange,\n      TOnChangeAsync,\n      TOnBlur,\n      TOnBlurAsync,\n      TOnSubmit,\n      TOnSubmitAsync,\n      TOnDynamic,\n      TOnDynamicAsync,\n      TFormOnMount,\n      TFormOnChange,\n      TFormOnChangeAsync,\n      TFormOnBlur,\n      TFormOnBlurAsync,\n      TFormOnSubmit,\n      TFormOnSubmitAsync,\n      TFormOnDynamic,\n      TFormOnDynamicAsync\n    >,\n    FormGroupState {\n  isFieldsValidating: boolean\n  isFieldsValid: boolean\n  isGroupValid: boolean\n  isValid: boolean\n  canSubmit: boolean\n}\n\n/**\n * @public\n *\n * `FormGroupMeta` with all generics widened to `any`.\n */\nexport type AnyFormGroupMeta = FormGroupMeta<\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>\n\nexport interface FormGroupStoreState<\n  in out TParentData,\n  in out TName extends DeepKeys<TParentData>,\n  in out TData extends DeepValue<TParentData, TName>,\n  in out TOnMount extends\n    | undefined\n    | FormGroupValidateOrFn<TParentData, TName, TData>,\n  in out TOnChange extends\n    | undefined\n    | FormGroupValidateOrFn<TParentData, TName, TData>,\n  in out TOnChangeAsync extends\n    | undefined\n    | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n  in out TOnBlur extends\n    | undefined\n    | FormGroupValidateOrFn<TParentData, TName, TData>,\n  in out TOnBlurAsync extends\n    | undefined\n    | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n  in out TOnSubmit extends\n    | undefined\n    | FormGroupValidateOrFn<TParentData, TName, TData>,\n  in out TOnSubmitAsync extends\n    | undefined\n    | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n  in out TOnDynamic extends\n    | undefined\n    | FormGroupValidateOrFn<TParentData, TName, TData>,\n  in out TOnDynamicAsync extends\n    | undefined\n    | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n  in out TFormOnMount extends undefined | FormValidateOrFn<TParentData>,\n  in out TFormOnChange extends undefined | FormValidateOrFn<TParentData>,\n  in out TFormOnChangeAsync extends\n    | undefined\n    | FormAsyncValidateOrFn<TParentData>,\n  in out TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,\n  in out TFormOnBlurAsync extends\n    | undefined\n    | FormAsyncValidateOrFn<TParentData>,\n  in out TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,\n  in out TFormOnSubmitAsync extends\n    | undefined\n    | FormAsyncValidateOrFn<TParentData>,\n  in out TFormOnDynamic extends undefined | FormValidateOrFn<TParentData>,\n  in out TFormOnDynamicAsync extends\n    | undefined\n    | FormAsyncValidateOrFn<TParentData>,\n> {\n  /**\n   * The current value of the form group.\n   */\n  value: TData\n  /**\n   * The current metadata of the form group, including aggregated validity,\n   * group-level errors, and submission lifecycle.\n   */\n  meta: FormGroupMeta<\n    TParentData,\n    TName,\n    TData,\n    TOnMount,\n    TOnChange,\n    TOnChangeAsync,\n    TOnBlur,\n    TOnBlurAsync,\n    TOnSubmit,\n    TOnSubmitAsync,\n    TOnDynamic,\n    TOnDynamicAsync,\n    TFormOnMount,\n    TFormOnChange,\n    TFormOnChangeAsync,\n    TFormOnBlur,\n    TFormOnBlurAsync,\n    TFormOnSubmit,\n    TFormOnSubmitAsync,\n    TFormOnDynamic,\n    TFormOnDynamicAsync\n  >\n}\n\n/**\n * @private\n *\n * Builds a default `FormGroupMeta` value, used as a fallback when the\n * parent form's `formGroupMetaDerived` store has no entry for this group\n * yet (e.g. between `new FormGroupApi(...)` and `mount()`).\n */\nexport function getDefaultFormGroupMeta(\n  defaultMeta?: Partial<AnyFieldLikeMetaBase>,\n): AnyFormGroupMeta {\n  return {\n    ...defaultFieldMeta,\n    ...defaultMeta,\n    errors: [],\n    isPristine: true,\n    isValid: true,\n    isDefaultValue: true,\n    isFieldsValidating: false,\n    isFieldsValid: true,\n    isGroupValid: true,\n    canSubmit: true,\n    isSubmitting: false,\n    isSubmitted: false,\n    isValidating: false,\n    submissionAttempts: 0,\n    isSubmitSuccessful: false,\n  } as AnyFormGroupMeta\n}\n\nexport class FormGroupApi<\n  in out TParentData,\n  in out TName extends DeepKeys<TParentData>,\n  in out TData extends DeepValue<TParentData, TName>,\n  in out TOnMount extends\n    | undefined\n    | FormGroupValidateOrFn<TParentData, TName, TData>,\n  in out TOnChange extends\n    | undefined\n    | FormGroupValidateOrFn<TParentData, TName, TData>,\n  in out TOnChangeAsync extends\n    | undefined\n    | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n  in out TOnBlur extends\n    | undefined\n    | FormGroupValidateOrFn<TParentData, TName, TData>,\n  in out TOnBlurAsync extends\n    | undefined\n    | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n  in out TOnSubmit extends\n    | undefined\n    | FormGroupValidateOrFn<TParentData, TName, TData>,\n  in out TOnSubmitAsync extends\n    | undefined\n    | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n  in out TOnDynamic extends\n    | undefined\n    | FormGroupValidateOrFn<TParentData, TName, TData>,\n  in out TOnDynamicAsync extends\n    | undefined\n    | FormGroupAsyncValidateOrFn<TParentData, TName, TData>,\n  in out TSubmitMeta,\n  in out TFormOnMount extends undefined | FormValidateOrFn<TParentData>,\n  in out TFormOnChange extends undefined | FormValidateOrFn<TParentData>,\n  in out TFormOnChangeAsync extends\n    | undefined\n    | FormAsyncValidateOrFn<TParentData>,\n  in out TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,\n  in out TFormOnBlurAsync extends\n    | undefined\n    | FormAsyncValidateOrFn<TParentData>,\n  in out TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,\n  in out TFormOnSubmitAsync extends\n    | undefined\n    | FormAsyncValidateOrFn<TParentData>,\n  in out TFormOnDynamic extends undefined | FormValidateOrFn<TParentData>,\n  in out TFormOnDynamicAsync extends\n    | undefined\n    | FormAsyncValidateOrFn<TParentData>,\n  in out TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>,\n  in out TParentSubmitMeta,\n>\n  implements\n    FormLikeAPI<TParentData, TSubmitMeta>,\n    FieldLikeAPI<\n      TParentData,\n      TName,\n      TData,\n      TOnMount,\n      TOnChange,\n      TOnChangeAsync,\n      TOnBlur,\n      TOnBlurAsync,\n      TOnSubmit,\n      TOnSubmitAsync,\n      TOnDynamic,\n      TOnDynamicAsync,\n      TFormOnMount,\n      TFormOnChange,\n      TFormOnChangeAsync,\n      TFormOnBlur,\n      TFormOnBlurAsync,\n      TFormOnSubmit,\n      TFormOnSubmitAsync,\n      TFormOnDynamic,\n      TFormOnDynamicAsync,\n      TFormOnServer,\n      TParentSubmitMeta,\n      FormGroupExtraOptions<\n        TParentData,\n        TName,\n        TData,\n        TOnMount,\n        TOnChange,\n        TOnChangeAsync,\n        TOnBlur,\n        TOnBlurAsync,\n        TOnSubmit,\n        TOnSubmitAsync,\n        TOnDynamic,\n        TOnDynamicAsync,\n        TSubmitMeta,\n        TFormOnMount,\n        TFormOnChange,\n        TFormOnChangeAsync,\n        TFormOnBlur,\n        TFormOnBlurAsync,\n        TFormOnSubmit,\n        TFormOnSubmitAsync,\n        TFormOnDynamic,\n        TFormOnDynamicAsync,\n        TFormOnServer,\n        TParentSubmitMeta\n      >\n    >\n{\n  /**\n   * A reference to the form API instance.\n   */\n  form: FormGroupApiOptions<\n    TParentData,\n    TName,\n    TData,\n    TOnMount,\n    TOnChange,\n    TOnChangeAsync,\n    TOnBlur,\n    TOnBlurAsync,\n    TOnSubmit,\n    TOnSubmitAsync,\n    TOnDynamic,\n    TOnDynamicAsync,\n    TSubmitMeta,\n    TFormOnMount,\n    TFormOnChange,\n    TFormOnChangeAsync,\n    TFormOnBlur,\n    TFormOnBlurAsync,\n    TFormOnSubmit,\n    TFormOnSubmitAsync,\n    TFormOnDynamic,\n    TFormOnDynamicAsync,\n    TFormOnServer,\n    TParentSubmitMeta\n  >['form']\n  /**\n   * The field name.\n   */\n  name: TName\n  /**\n   * The field options.\n   */\n  options: FormGroupApiOptions<\n    TParentData,\n    TName,\n    TData,\n    TOnMount,\n    TOnChange,\n    TOnChangeAsync,\n    TOnBlur,\n    TOnBlurAsync,\n    TOnSubmit,\n    TOnSubmitAsync,\n    TOnDynamic,\n    TOnDynamicAsync,\n    TSubmitMeta,\n    TFormOnMount,\n    TFormOnChange,\n    TFormOnChangeAsync,\n    TFormOnBlur,\n    TFormOnBlurAsync,\n    TFormOnSubmit,\n    TFormOnSubmitAsync,\n    TFormOnDynamic,\n    TFormOnDynamicAsync,\n    TFormOnServer,\n    TParentSubmitMeta\n  > = {} as any\n  /**\n   * The field state store.\n   */\n  store!: ReadonlyStore<\n    FormGroupStoreState<\n      TParentData,\n      TName,\n      TData,\n      TOnMount,\n      TOnChange,\n      TOnChangeAsync,\n      TOnBlur,\n      TOnBlurAsync,\n      TOnSubmit,\n      TOnSubmitAsync,\n      TOnDynamic,\n      TOnDynamicAsync,\n      TFormOnMount,\n      TFormOnChange,\n      TFormOnChangeAsync,\n      TFormOnBlur,\n      TFormOnBlurAsync,\n      TFormOnSubmit,\n      TFormOnSubmitAsync,\n      TFormOnDynamic,\n      TFormOnDynamicAsync\n    >\n  >\n  /**\n   * The current field state.\n   */\n  get state() {\n    return this.store.state\n  }\n\n  /**\n   * @private\n   *\n   * Updates this group's submission lifecycle state on the parent form's\n   * `baseStore` (where group state is now persisted), preserving entries\n   * for any other mounted groups. After writing, the form's\n   * `formGroupMetaDerived` re-derives so this group's `state.meta` picks\n   * up the new lifecycle values automatically.\n   */\n  private setFormGroupState = (\n    updater: (prev: FormGroupState) => FormGroupState,\n  ) => {\n    this.form.baseStore.setState((prev) => {\n      const prevGroupState =\n        prev.formGroupStateBase[this.name as never] ??\n        getDefaultFormGroupState({})\n      return {\n        ...prev,\n        formGroupStateBase: {\n          ...prev.formGroupStateBase,\n          [this.name as never]: updater(prevGroupState),\n        },\n      }\n    })\n  }\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  /**\n   * @private\n   *\n   * Tracks the set of fully-qualified child field names that this group's\n   * validators last set form-source errors on, keyed by `errorMap` key.\n   * Used to clear stale group-level field errors on subsequent runs without\n   * trampling errors set by the parent form's validators.\n   */\n  private _lastDistributedFieldNames: Partial<Record<string, Set<string>>> = {}\n\n  private fieldInfo: FieldInfo<TParentData>\n\n  constructor(\n    opts: FormGroupApiOptions<\n      TParentData,\n      TName,\n      TData,\n      TOnMount,\n      TOnChange,\n      TOnChangeAsync,\n      TOnBlur,\n      TOnBlurAsync,\n      TOnSubmit,\n      TOnSubmitAsync,\n      TOnDynamic,\n      TOnDynamicAsync,\n      TSubmitMeta,\n      TFormOnMount,\n      TFormOnChange,\n      TFormOnChangeAsync,\n      TFormOnBlur,\n      TFormOnBlurAsync,\n      TFormOnSubmit,\n      TFormOnSubmitAsync,\n      TFormOnDynamic,\n      TFormOnDynamicAsync,\n      TFormOnServer,\n      TParentSubmitMeta\n    >,\n  ) {\n    this.form = opts.form\n    this.name = opts.name\n    this.options = opts\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.fieldInfo = {\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    this.store = createStore(\n      (\n        prevVal:\n          | FormGroupStoreState<\n              TParentData,\n              TName,\n              TData,\n              TOnMount,\n              TOnChange,\n              TOnChangeAsync,\n              TOnBlur,\n              TOnBlurAsync,\n              TOnSubmit,\n              TOnSubmitAsync,\n              TOnDynamic,\n              TOnDynamicAsync,\n              TFormOnMount,\n              TFormOnChange,\n              TFormOnChangeAsync,\n              TFormOnBlur,\n              TFormOnBlurAsync,\n              TFormOnSubmit,\n              TFormOnSubmitAsync,\n              TFormOnDynamic,\n              TFormOnDynamicAsync\n            >\n          | undefined,\n      ) => {\n        // Subscribe to all form-level derived state that affects this\n        // group. Mirrors `FieldApi.store`'s minimal pattern: per-instance\n        // `store` only sources `{ value, meta }`; all heavy derivation\n        // lives on the parent `FormApi` (in `formGroupMetaDerived`).\n        this.form.formGroupMetaDerived.get()\n        this.form.baseStore.get()\n\n        const meta =\n          (this.form.getFormGroupMeta(this.name as never) as\n            | AnyFormGroupMeta\n            | undefined) ?? getDefaultFormGroupMeta(opts.defaultMeta as never)\n\n        let value = this.form.getFieldValue(this.name)\n        if (\n          !meta.isTouched &&\n          (value as unknown) === undefined &&\n          this.options.defaultValue !== undefined &&\n          !evaluate(value, this.options.defaultValue)\n        ) {\n          value = this.options.defaultValue\n        }\n\n        if (prevVal && prevVal.value === value && prevVal.meta === meta) {\n          return prevVal\n        }\n\n        return {\n          value,\n          meta,\n        } as FormGroupStoreState<\n          TParentData,\n          TName,\n          TData,\n          TOnMount,\n          TOnChange,\n          TOnChangeAsync,\n          TOnBlur,\n          TOnBlurAsync,\n          TOnSubmit,\n          TOnSubmitAsync,\n          TOnDynamic,\n          TOnDynamicAsync,\n          TFormOnMount,\n          TFormOnChange,\n          TFormOnChangeAsync,\n          TFormOnBlur,\n          TFormOnBlurAsync,\n          TFormOnSubmit,\n          TFormOnSubmitAsync,\n          TFormOnDynamic,\n          TFormOnDynamicAsync\n        >\n      },\n    )\n\n    this.handleSubmit = this.handleSubmit.bind(this)\n  }\n\n  /**\n   * Updates the field instance with new options.\n   */\n  update = (\n    opts: FormGroupApiOptions<\n      TParentData,\n      TName,\n      TData,\n      TOnMount,\n      TOnChange,\n      TOnChangeAsync,\n      TOnBlur,\n      TOnBlurAsync,\n      TOnSubmit,\n      TOnSubmitAsync,\n      TOnDynamic,\n      TOnDynamicAsync,\n      TSubmitMeta,\n      TFormOnMount,\n      TFormOnChange,\n      TFormOnChangeAsync,\n      TFormOnBlur,\n      TFormOnBlurAsync,\n      TFormOnSubmit,\n      TFormOnSubmitAsync,\n      TFormOnDynamic,\n      TFormOnDynamicAsync,\n      TFormOnServer,\n      TParentSubmitMeta\n    >,\n  ) => {\n    this.options = opts\n    this.name = opts.name\n\n    // Default Value\n    if (!this.state.meta.isTouched && this.options.defaultValue !== undefined) {\n      const formField = this.form.getFieldValue(this.name)\n      if (!evaluate(formField, opts.defaultValue)) {\n        this.form.setFieldValue(this.name, opts.defaultValue as never, {\n          dontUpdateMeta: true,\n          dontValidate: true,\n          dontRunListeners: true,\n        })\n      }\n    }\n\n    if (!this.form.getFieldMeta(this.name)) {\n      this.form.setFieldMeta(this.name, {\n        ...defaultFieldMeta,\n        ...(this.options.defaultMeta as Partial<AnyFieldLikeMetaBase>),\n      } as never)\n    }\n  }\n\n  /**\n   * @private\n   */\n  runValidator<\n    TValue extends TStandardSchemaValidatorValue<TData> & {\n      groupApi: AnyFormGroupApi\n    },\n    TType extends 'validate' | 'validateAsync',\n  >(props: {\n    validate: TType extends 'validate'\n      ? FormGroupValidateOrFn<any, any, any>\n      : FormGroupAsyncValidateOrFn<any, any, any>\n    value: TValue\n    type: TType\n    // When `api` is 'field', the return type cannot be `FormValidationError`\n  }): unknown {\n    if (isStandardSchemaValidator(props.validate)) {\n      const result = standardSchemaValidators[props.type](\n        props.value,\n        props.validate,\n      ) as unknown\n\n      // Standard schemas with `validationSource: 'form'` return `{ form, fields }`.\n      // For groups we expose the same fan-out shape but under a `group` key\n      // (a `form` key on a group-level validator would be misleading), so\n      // remap the standard-schema result here. Manual functions on a group\n      // are expected to return `{ group, fields }` already.\n      if (props.type === 'validate') {\n        return remapStandardSchemaResultForGroup(result)\n      }\n      return (result as Promise<unknown>).then(\n        remapStandardSchemaResultForGroup,\n      )\n    }\n\n    return (props.validate as FormGroupValidateFn<any, any>)(\n      props.value,\n    ) as never\n  }\n\n  mount = () => {\n    this.update(this.options as never)\n    this.form.formGroupApis.add(this)\n    this.fieldInfo.instance = this as never\n\n    // Seed the parent form's `formGroupStateBase` entry for this group.\n    // We always write so that `formGroupMetaDerived` re-derives now that\n    // `formGroupApis` includes this instance — this is what makes\n    // `state.meta` populated on the very first read after mount. Mirrors\n    // `FieldApi.mount`'s lifecycle: per-group lifecycle state lives on\n    // the form so it can be read off `FormApi` directly without walking\n    // the mounted group instances.\n    this.form.baseStore.setState((prev) => ({\n      ...prev,\n      formGroupStateBase: {\n        ...prev.formGroupStateBase,\n        [this.name as never]:\n          prev.formGroupStateBase[this.name as never] ??\n          getDefaultFormGroupState({\n            ...(this.options.defaultState as Partial<FormGroupState>),\n          }),\n      },\n    }))\n\n    const { onMount } = this.options.validators || {}\n\n    if (onMount) {\n      const rawError = this.runValidator({\n        validate: onMount,\n        value: {\n          value: this.state.value,\n          groupApi: this,\n          validationSource: 'form',\n        },\n        type: 'validate',\n      })\n\n      let groupOwnRawError = rawError\n      let groupFieldErrors: Record<string, unknown> | undefined = undefined\n      if (isGlobalGroupValidationError(rawError)) {\n        groupOwnRawError = rawError.group\n        groupFieldErrors = rawError.fields\n      }\n\n      const error = normalizeError(groupOwnRawError as ValidationError)\n      if (error) {\n        this.setMeta(\n          (prev) =>\n            ({\n              ...prev,\n              errorMap: {\n                ...prev.errorMap,\n                onMount: error,\n              },\n              errorSourceMap: {\n                ...prev.errorSourceMap,\n                onMount: 'field',\n              },\n            }) as never,\n        )\n      }\n\n      this.distributeFieldErrors('onMount', groupFieldErrors)\n    }\n\n    this.options.listeners?.onMount?.({\n      value: this.state.value,\n      groupApi: this,\n    })\n\n    return () => {\n      // Stop any in-flight async validation or listener work tied to this instance.\n      for (const [key, timeout] of Object.entries(\n        this.timeoutIds.validations,\n      )) {\n        if (timeout) {\n          clearTimeout(timeout)\n          this.timeoutIds.validations[\n            key as keyof typeof this.timeoutIds.validations\n          ] = null\n        }\n      }\n      for (const [key, timeout] of Object.entries(this.timeoutIds.listeners)) {\n        if (timeout) {\n          clearTimeout(timeout)\n          this.timeoutIds.listeners[\n            key as keyof typeof this.timeoutIds.listeners\n          ] = null\n        }\n      }\n      for (const [key, timeout] of Object.entries(\n        this.timeoutIds.formListeners,\n      )) {\n        if (timeout) {\n          clearTimeout(timeout)\n          this.timeoutIds.formListeners[\n            key as keyof typeof this.timeoutIds.formListeners\n          ] = null\n        }\n      }\n\n      if (this.fieldInfo.instance !== this) return\n\n      for (const [key, validationMeta] of Object.entries(\n        this.fieldInfo.validationMetaMap,\n      )) {\n        validationMeta?.lastAbortController.abort()\n        this.fieldInfo.validationMetaMap[\n          key as keyof typeof this.fieldInfo.validationMetaMap\n        ] = undefined\n      }\n\n      this.form.formGroupApis.delete(this)\n\n      // Reset this group's submission lifecycle state on the form. Mirrors\n      // `FieldApi.mount`'s teardown which resets `fieldMetaBase` for the\n      // unmounting field while preserving the entry on the parent store.\n      this.form.baseStore.setState((prev) => ({\n        ...prev,\n        formGroupStateBase: {\n          ...prev.formGroupStateBase,\n          [this.name as never]: getDefaultFormGroupState({}),\n        },\n      }))\n\n      this.fieldInfo.instance = null\n\n      this.options.listeners?.onUnmount?.({\n        value: this.state.value,\n        groupApi: this,\n      })\n    }\n  }\n\n  /**\n   * Sets the field value and run the `change` validator.\n   */\n  setValue = (updater: Updater<TData>, options?: UpdateMetaOptions) => {\n    this.form.setFieldValue(\n      this.name,\n      updater as never,\n      mergeOpts(options, { dontRunListeners: true, dontValidate: true }),\n    )\n\n    if (!options?.dontRunListeners) {\n      this.triggerOnChangeListener()\n    }\n\n    if (!options?.dontValidate) {\n      this.validate('change')\n    }\n  }\n\n  getMeta = () => this.store.state.meta\n\n  /**\n   * Sets the field metadata.\n   */\n  setMeta = (\n    updater: Updater<\n      FieldLikeMetaBase<\n        TParentData,\n        TName,\n        TData,\n        TOnMount,\n        TOnChange,\n        TOnChangeAsync,\n        TOnBlur,\n        TOnBlurAsync,\n        TOnSubmit,\n        TOnSubmitAsync,\n        TOnDynamic,\n        TOnDynamicAsync,\n        TFormOnMount,\n        TFormOnChange,\n        TFormOnChangeAsync,\n        TFormOnBlur,\n        TFormOnBlurAsync,\n        TFormOnSubmit,\n        TFormOnSubmitAsync,\n        TFormOnDynamic,\n        TFormOnDynamicAsync\n      >\n    >,\n  ) => this.form.setFieldMeta(this.name, updater)\n\n  /**\n   * Gets the field information object.\n   */\n  getInfo = () => this.fieldInfo\n\n  /**\n   * @private\n   */\n  getRelatedFields = () => {\n    const fields = Object.values(this.form.fieldInfo) as FieldInfo<any>[]\n\n    const relatedFields: AnyFieldApi[] = []\n    for (const field of fields) {\n      if (!field.instance) continue\n      // TODO: How to handle FormGroups?\n      if (!(field.instance instanceof FieldApi)) continue\n      if (field.instance.name.startsWith(this.name)) {\n        relatedFields.push(field.instance)\n      }\n    }\n\n    return relatedFields\n  }\n  /**\n   * @private\n   */\n  getRelatedFieldMetasDerived = () => {\n    const fields = Object.entries(this.form.fieldMetaDerived.state) as [\n      string,\n      AnyFieldLikeMeta,\n    ][]\n\n    const relatedFieldMetas: (AnyFieldLikeMeta & { name: string })[] = []\n    for (const [fieldName, fieldMeta] of fields) {\n      // Skip the group's own self-entry — its validity is tracked via\n      // `isGroupValid`. Including it here would conflate group-level\n      // validation with field-level validation in `isFieldsValid` etc.\n      if (fieldName === this.name) continue\n      if (isFieldInGroup(this.name, fieldName)) {\n        relatedFieldMetas.push({ ...fieldMeta, name: fieldName })\n      }\n    }\n\n    return relatedFieldMetas\n  }\n\n  /**\n   * @private\n   *\n   * Builds a fully-qualified field name from a path that is relative to this\n   * group, supporting both dot (`name`, `nested.value`) and bracket\n   * (`[0].name`) notation.\n   */\n  private buildChildFieldName = (relativeName: string): string => {\n    if (relativeName === '') return this.name as string\n    if (relativeName.startsWith('[')) return `${this.name}${relativeName}`\n    return `${this.name}.${relativeName}`\n  }\n\n  /**\n   * @private\n   *\n   * Distributes a `{ fields: { ... } }` payload returned by one of this\n   * group's own validators onto the corresponding child fields. Tracks\n   * which fields have been touched so subsequent runs can clear stale\n   * errors without trampling errors set by the parent form's validators.\n   */\n  private distributeFieldErrors = (\n    errorMapKey: string,\n    fieldErrors: Record<string, unknown> | undefined,\n  ): boolean => {\n    const previousNames =\n      this._lastDistributedFieldNames[errorMapKey] ?? new Set<string>()\n    const currentNames = new Set<string>()\n\n    if (fieldErrors) {\n      for (const [relativeName, err] of Object.entries(fieldErrors)) {\n        if (err === undefined || err === null || err === false) continue\n        currentNames.add(this.buildChildFieldName(relativeName))\n      }\n    }\n\n    const allNames = new Set<string>([...previousNames, ...currentNames])\n\n    let hasErrored = false\n    for (const fullName of allNames) {\n      const relativeName = fullName.startsWith(this.name + '[')\n        ? fullName.slice((this.name as string).length)\n        : fullName.slice((this.name as string).length + 1)\n      const newFormValidatorError = fieldErrors?.[relativeName] as\n        | ValidationError\n        | undefined\n\n      const fieldMeta = this.form.getFieldMeta(fullName as never)\n      if (!fieldMeta && !newFormValidatorError) continue\n\n      const previousErrorValue = fieldMeta?.errorMap[errorMapKey as never] as\n        | ValidationError\n        | undefined\n      const isPreviousErrorFromFormValidator =\n        (fieldMeta?.errorSourceMap[errorMapKey as never] as\n          | string\n          | undefined) === 'form'\n\n      const { newErrorValue, newSource } =\n        determineFormLevelErrorSourceAndValue({\n          newFormValidatorError,\n          isPreviousErrorFromFormValidator,\n          previousErrorValue,\n        })\n\n      if (newErrorValue) hasErrored = true\n\n      if (\n        previousErrorValue === newErrorValue &&\n        fieldMeta?.errorSourceMap[errorMapKey as never] === newSource\n      ) {\n        continue\n      }\n\n      this.form.setFieldMeta(fullName as never, (prev = defaultFieldMeta) => ({\n        ...prev,\n        errorMap: {\n          ...prev.errorMap,\n          [errorMapKey]: newErrorValue,\n        },\n        errorSourceMap: {\n          ...prev.errorSourceMap,\n          [errorMapKey]: newSource,\n        },\n      }))\n    }\n\n    this._lastDistributedFieldNames[errorMapKey] = currentNames\n    return hasErrored\n  }\n\n  /**\n   * @private\n   */\n  validateSync = (\n    cause: ValidationCause,\n    errorFromForm: ValidationErrorMap,\n    opts: {\n      skipRelatedFieldValidation?: boolean\n    } = {},\n  ) => {\n    const validates = getSyncValidatorArray(cause, {\n      ...this.options,\n      form: this.form,\n      group: this,\n      validationLogic:\n        this.options.validationLogic ||\n        this.form.options.validationLogic ||\n        defaultValidationLogic,\n    })\n\n    const relatedFields = opts.skipRelatedFieldValidation\n      ? []\n      : this.getRelatedFields()\n    const relatedFieldValidates = relatedFields.reduce(\n      (acc, field) => {\n        const fieldValidates = getSyncValidatorArray(cause, {\n          ...field.options,\n          form: field.form,\n          validationLogic:\n            field.form.options.validationLogic || defaultValidationLogic,\n        })\n        fieldValidates.forEach((validate) => {\n          ;(validate as any).field = field\n        })\n        return acc.concat(fieldValidates as never)\n      },\n      [] as Array<\n        SyncValidator<any> & {\n          field: AnyFieldApi\n        }\n      >,\n    )\n\n    // Needs type cast as eslint errantly believes this is always falsy\n    let hasErrored = false as boolean\n\n    batch(() => {\n      const validateFieldOrGroupFn = (\n        fieldOrGroup: AnyFieldApi | AnyFormGroupApi,\n        validateObj: SyncValidator<any>,\n      ) => {\n        const errorMapKey = getErrorMapKey(validateObj.cause)\n        const isGroup = fieldOrGroup === this\n\n        let rawError: unknown = undefined\n        if (validateObj.validate) {\n          rawError = (fieldOrGroup as any).runValidator({\n            validate: validateObj.validate,\n            value: {\n              value: fieldOrGroup.store.state.value,\n              // For the group's own validators we want standard schemas to\n              // produce a `{ form, fields }` shape (with relative keys) so\n              // we can fan errors out to children. Field-level validators on\n              // related fields keep the regular field source.\n              validationSource: isGroup ? 'form' : 'field',\n              ...(fieldOrGroup instanceof FormGroupApi\n                ? {\n                    groupApi: fieldOrGroup,\n                  }\n                : { fieldApi: fieldOrGroup }),\n            } as never,\n            type: 'validate',\n          })\n        }\n\n        let groupOwnRawError: unknown = rawError\n        let groupFieldErrors: Record<string, unknown> | undefined = undefined\n        if (isGroup && isGlobalGroupValidationError(rawError)) {\n          groupOwnRawError = rawError.group\n          groupFieldErrors = rawError.fields\n        }\n\n        const fieldLevelError = normalizeError(\n          groupOwnRawError as ValidationError,\n        )\n\n        const formLevelError = errorFromForm[errorMapKey]\n\n        const { newErrorValue, newSource } =\n          determineFieldLevelErrorSourceAndValue({\n            formLevelError,\n            fieldLevelError,\n          })\n\n        // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n        if (fieldOrGroup.state.meta.errorMap?.[errorMapKey] !== newErrorValue) {\n          fieldOrGroup.setMeta((prev) => ({\n            ...prev,\n            errorMap: {\n              ...prev.errorMap,\n              [errorMapKey]: newErrorValue,\n            },\n            errorSourceMap: {\n              ...prev.errorSourceMap,\n              [errorMapKey]: newSource,\n            },\n          }))\n        }\n        if (newErrorValue) {\n          hasErrored = true\n        }\n\n        if (isGroup) {\n          const distributedHasErrored = this.distributeFieldErrors(\n            errorMapKey,\n            groupFieldErrors,\n          )\n          if (distributedHasErrored) {\n            hasErrored = true\n          }\n        }\n      }\n\n      for (const validateObj of validates) {\n        validateFieldOrGroupFn(this, validateObj)\n      }\n      for (const fieldValidateObj of relatedFieldValidates) {\n        if (!fieldValidateObj.validate) continue\n        validateFieldOrGroupFn(fieldValidateObj.field, fieldValidateObj)\n      }\n    })\n\n    /**\n     *  when we have an error for onSubmit in the state, we want\n     *  to clear the error as soon as the user enters a valid value in the field\n     */\n    const submitErrKey = getErrorMapKey('submit')\n\n    if (\n      // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n      this.state.meta.errorMap?.[submitErrKey] &&\n      cause !== 'submit' &&\n      !hasErrored\n    ) {\n      this.setMeta((prev) => ({\n        ...prev,\n        errorMap: {\n          ...prev.errorMap,\n          [submitErrKey]: undefined,\n        },\n        errorSourceMap: {\n          ...prev.errorSourceMap,\n          [submitErrKey]: undefined,\n        },\n      }))\n    }\n\n    return { hasErrored }\n  }\n\n  /**\n   * @private\n   */\n  validateAsync = async (\n    cause: ValidationCause,\n    formValidationResultPromise: Promise<\n      FieldErrorMapFromValidator<\n        TParentData,\n        TName,\n        TData,\n        TOnMount,\n        TOnChange,\n        TOnChangeAsync,\n        TOnBlur,\n        TOnBlurAsync,\n        TOnSubmit,\n        TOnSubmitAsync\n      >\n    >,\n    opts: {\n      skipRelatedFieldValidation?: boolean\n    } = {},\n  ) => {\n    const validates = getAsyncValidatorArray(cause, {\n      ...this.options,\n      form: this.form,\n      group: this,\n      validationLogic:\n        this.options.validationLogic ||\n        this.form.options.validationLogic ||\n        defaultValidationLogic,\n    })\n\n    // Get the field-specific error messages that are coming from the form's validator\n    const asyncFormValidationResults = await formValidationResultPromise\n\n    const relatedFields = opts.skipRelatedFieldValidation\n      ? []\n      : this.getRelatedFields()\n    const relatedFieldValidates = relatedFields.reduce(\n      (acc, field) => {\n        const fieldValidates = getAsyncValidatorArray(cause, {\n          ...field.options,\n          form: field.form,\n          validationLogic:\n            field.form.options.validationLogic || defaultValidationLogic,\n        })\n        fieldValidates.forEach((validate) => {\n          ;(validate as any).field = field\n        })\n        return acc.concat(fieldValidates as never)\n      },\n      [] as Array<\n        AsyncValidator<any> & {\n          field: AnyFieldApi\n        }\n      >,\n    )\n\n    /**\n     * We have to use a for loop and generate our promises this way, otherwise it won't be sync\n     * when there are no validators needed to be run\n     */\n    const validatesPromises: Promise<ValidationError | undefined>[] = []\n    const linkedPromises: Promise<ValidationError | undefined>[] = []\n\n    // Check if there are actual async validators to run before setting isValidating\n    // This prevents unnecessary re-renders when there are no async validators\n    // See: https://github.com/TanStack/form/issues/1130\n    const hasAsyncValidators =\n      validates.some((v) => v.validate) ||\n      relatedFieldValidates.some((v) => v.validate)\n\n    if (hasAsyncValidators) {\n      if (!this.state.meta.isValidating) {\n        this.setMeta((prev) => ({ ...prev, isValidating: true }))\n      }\n\n      for (const linkedField of relatedFields) {\n        linkedField.setMeta((prev) => ({ ...prev, isValidating: true }))\n      }\n    }\n\n    const validateFieldOrGroupAsyncFn = (\n      fieldOrGroup: AnyFieldApi | AnyFormGroupApi,\n      validateObj: AsyncValidator<any>,\n      promises: Promise<ValidationError | undefined>[],\n    ) => {\n      const errorMapKey = getErrorMapKey(validateObj.cause)\n      const fieldInfo = fieldOrGroup.getInfo()\n      const fieldValidatorMeta = fieldInfo.validationMetaMap[errorMapKey]\n\n      fieldValidatorMeta?.lastAbortController.abort()\n      const controller = new AbortController()\n\n      fieldInfo.validationMetaMap[errorMapKey] = {\n        lastAbortController: controller,\n      }\n\n      const isGroup = fieldOrGroup === this\n\n      promises.push(\n        new Promise<ValidationError | undefined>(async (resolve) => {\n          let rawError!: ValidationError | undefined\n          try {\n            rawError = await new Promise((rawResolve, rawReject) => {\n              if (fieldOrGroup.timeoutIds.validations[validateObj.cause]) {\n                clearTimeout(\n                  fieldOrGroup.timeoutIds.validations[validateObj.cause]!,\n                )\n              }\n\n              fieldOrGroup.timeoutIds.validations[validateObj.cause] =\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: fieldOrGroup.store.state.value,\n                          signal: controller.signal,\n                          // See sync counterpart: produce `{ form, fields }`\n                          // from standard schemas attached to the group so we\n                          // can fan errors out to children.\n                          validationSource: isGroup ? 'form' : 'field',\n                          ...(fieldOrGroup instanceof FormGroupApi\n                            ? {\n                                groupApi: fieldOrGroup,\n                              }\n                            : { fieldApi: fieldOrGroup }),\n                        } as never,\n                        type: 'validateAsync',\n                      }),\n                    )\n                  } catch (e) {\n                    rawReject(e)\n                  }\n                }, validateObj.debounceMs)\n            })\n          } catch (e: unknown) {\n            rawError = e as ValidationError\n          }\n          if (controller.signal.aborted) return resolve(undefined)\n\n          let groupOwnRawError: ValidationError | undefined = rawError\n          let groupFieldErrors: Record<string, unknown> | undefined = undefined\n          if (isGroup && isGlobalGroupValidationError(rawError)) {\n            groupOwnRawError = rawError.group as ValidationError | undefined\n            groupFieldErrors = rawError.fields\n          }\n\n          const fieldLevelError = normalizeError(groupOwnRawError)\n          const formLevelError =\n            asyncFormValidationResults[\n              fieldOrGroup.name as keyof typeof asyncFormValidationResults\n            ]?.[errorMapKey]\n\n          const { newErrorValue, newSource } =\n            determineFieldLevelErrorSourceAndValue({\n              formLevelError,\n              fieldLevelError,\n            })\n\n          if (fieldOrGroup.getInfo().instance !== fieldOrGroup) {\n            return resolve(undefined)\n          }\n\n          fieldOrGroup.setMeta((prev) => {\n            return {\n              ...prev,\n              errorMap: {\n                // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n                ...prev?.errorMap,\n                [errorMapKey]: newErrorValue,\n              },\n              errorSourceMap: {\n                ...prev.errorSourceMap,\n                [errorMapKey]: newSource,\n              },\n            }\n          })\n\n          if (isGroup) {\n            this.distributeFieldErrors(errorMapKey, groupFieldErrors)\n          }\n\n          resolve(newErrorValue)\n        }),\n      )\n    }\n\n    // TODO: Dedupe this logic to reduce bundle size\n    for (const validateObj of validates) {\n      if (!validateObj.validate) continue\n      validateFieldOrGroupAsyncFn(this, validateObj, validatesPromises)\n    }\n    for (const fieldValitateObj of relatedFieldValidates) {\n      if (!fieldValitateObj.validate) continue\n      validateFieldOrGroupAsyncFn(\n        fieldValitateObj.field,\n        fieldValitateObj,\n        linkedPromises,\n      )\n    }\n\n    let results: ValidationError[] = []\n    if (validatesPromises.length || linkedPromises.length) {\n      results = await Promise.all(validatesPromises)\n      await Promise.all(linkedPromises)\n    }\n\n    // Only reset isValidating if we set it to true earlier\n    if (hasAsyncValidators) {\n      this.setMeta((prev) => ({ ...prev, isValidating: false }))\n\n      for (const linkedField of relatedFields) {\n        linkedField.setMeta((prev) => ({ ...prev, isValidating: false }))\n      }\n    }\n\n    return results.filter(Boolean)\n  }\n\n  /**\n   * Validates all fields according to the FIELD level validators.\n   * This will ignore FORM level validators, use form.validate({ValidationCause}) for a complete validation\n   */\n  validateAllFields = async (cause: ValidationCause) => {\n    const fieldValidationPromises: Promise<ValidationError[]>[] = [] as any\n\n    batch(() => {\n      void Object.values(this.getRelatedFields()).forEach((fieldInstance) => {\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, {\n              skipFormValidation: true,\n              skipGroupValidation: true,\n            }),\n          ),\n        )\n\n        // If any fields are not touched\n        if (!fieldInstance.store.state.meta.isTouched) {\n          // Mark them as touched\n          fieldInstance.setMeta((prev) => ({ ...prev, isTouched: true }))\n        }\n      })\n    })\n\n    const fieldErrorMapMap = await Promise.all(fieldValidationPromises)\n    return fieldErrorMapMap.flat()\n  }\n\n  validateArrayFieldsStartingFrom = <\n    TField extends DeepKeysOfType<TParentData, any[]>,\n  >(\n    field: TField,\n    index: number,\n    cause: ValidationCause,\n  ) => {\n    return this.form.validateArrayFieldsStartingFrom(field, index, cause)\n  }\n\n  validateField = <TField extends DeepKeysOfType<TParentData, any>>(\n    field: TField,\n    cause: ValidationCause,\n  ) => {\n    return this.form.validateField(field, cause)\n  }\n\n  getFieldValue = <TField extends DeepKeysOfType<TParentData, any>>(\n    field: TField,\n  ) => {\n    return this.form.getFieldValue(field)\n  }\n\n  getFieldMeta = <TField extends DeepKeysOfType<TParentData, any>>(\n    field: TField,\n  ) => {\n    return this.form.getFieldMeta(field)\n  }\n\n  setFieldMeta = <TField extends DeepKeysOfType<TParentData, any>>(\n    field: TField,\n    updater: Updater<AnyFieldLikeMetaBase>,\n  ) => {\n    return this.form.setFieldMeta(field, updater)\n  }\n\n  setFieldValue = <TField extends DeepKeysOfType<TParentData, any>>(\n    field: TField,\n    value: any,\n  ) => {\n    return this.form.setFieldValue(field, value)\n  }\n\n  deleteField = <TField extends DeepKeysOfType<TParentData, any>>(\n    field: TField,\n  ) => {\n    return this.form.deleteField(field)\n  }\n\n  pushFieldValue = <TField extends DeepKeysOfType<TParentData, any[]>>(\n    field: TField,\n    value: any,\n  ) => {\n    return this.form.pushFieldValue(field, value)\n  }\n\n  insertFieldValue = <TField extends DeepKeysOfType<TParentData, any[]>>(\n    field: TField,\n    index: number,\n    value: any,\n  ) => {\n    return this.form.insertFieldValue(field, index, value)\n  }\n\n  replaceFieldValue = <TField extends DeepKeysOfType<TParentData, any[]>>(\n    field: TField,\n    index: number,\n    value: any,\n  ) => {\n    return this.form.replaceFieldValue(field, index, value)\n  }\n\n  swapFieldValues = <TField extends DeepKeysOfType<TParentData, any[]>>(\n    field: TField,\n    index1: number,\n    index2: number,\n  ) => {\n    return this.form.swapFieldValues(field, index1, index2)\n  }\n\n  moveFieldValues = <TField extends DeepKeysOfType<TParentData, any[]>>(\n    field: TField,\n    fromIndex: number,\n    toIndex: number,\n  ) => {\n    return this.form.moveFieldValues(field, fromIndex, toIndex)\n  }\n\n  clearFieldValues = <TField extends DeepKeysOfType<TParentData, any[]>>(\n    field: TField,\n  ) => {\n    return this.form.clearFieldValues(field)\n  }\n\n  resetField = <TField extends DeepKeysOfType<TParentData, any>>(\n    field: TField,\n  ) => {\n    return this.form.resetField(field)\n  }\n\n  removeFieldValue = <TField extends DeepKeysOfType<TParentData, any[]>>(\n    field: TField,\n    index: number,\n  ) => {\n    return this.form.removeFieldValue(field, index)\n  }\n\n  areRelatedFieldsValid = () => {\n    return Object.values(this.getRelatedFields()).every(\n      (field) => field.state.meta.isValid,\n    )\n  }\n\n  /**\n   * Validates the form group and all related children.\n   */\n  validate = (\n    cause: ValidationCause,\n    opts?: {\n      skipFormValidation?: boolean\n      skipRelatedFieldValidation?: boolean\n    },\n  ): ValidationError[] | Promise<ValidationError[]> => {\n    // Attempt to sync validate first\n    const { fieldsErrorMap } = opts?.skipFormValidation\n      ? { fieldsErrorMap: {} as never }\n      : this.form.validateSync(cause, {\n          dontUpdateFormErrorMap: true,\n          filterFieldNames: (fieldName) => isFieldInGroup(this.name, fieldName),\n        })\n    const { hasErrored } = this.validateSync(\n      cause,\n      fieldsErrorMap[this.name] ?? {},\n      { skipRelatedFieldValidation: opts?.skipRelatedFieldValidation },\n    )\n\n    if (hasErrored && !this.options.asyncAlways) {\n      this.getInfo().validationMetaMap[\n        getErrorMapKey(cause)\n      ]?.lastAbortController.abort()\n      return this.state.meta.errors\n    }\n\n    // No error? Attempt async validation\n    const formValidationResultPromise = opts?.skipFormValidation\n      ? Promise.resolve({})\n      : this.form.validateAsync(cause, {\n          dontUpdateFormErrorMap: true,\n          filterFieldNames: (fieldName) => isFieldInGroup(this.name, fieldName),\n        })\n    return this.validateAsync(cause, formValidationResultPromise, {\n      skipRelatedFieldValidation: opts?.skipRelatedFieldValidation,\n    })\n  }\n\n  /**\n   * @private\n   */\n  triggerOnChangeListener = () => {\n    const formDebounceMs = this.form.options.listeners?.onChangeGroupDebounceMs\n    if (formDebounceMs && formDebounceMs > 0) {\n      if (this.timeoutIds.formListeners.change) {\n        clearTimeout(this.timeoutIds.formListeners.change)\n      }\n\n      this.timeoutIds.formListeners.change = setTimeout(() => {\n        this.form.options.listeners?.onChangeGroup?.({\n          formApi: this.form,\n          groupApi: this,\n        })\n      }, formDebounceMs)\n    } else {\n      this.form.options.listeners?.onChangeGroup?.({\n        formApi: this.form,\n        groupApi: this,\n      })\n    }\n\n    const fieldDebounceMs = this.options.listeners?.onChangeDebounceMs\n    if (fieldDebounceMs && fieldDebounceMs > 0) {\n      if (this.timeoutIds.listeners.change) {\n        clearTimeout(this.timeoutIds.listeners.change)\n      }\n\n      this.timeoutIds.listeners.change = setTimeout(() => {\n        this.options.listeners?.onChange?.({\n          value: this.state.value,\n          groupApi: this,\n        })\n      }, fieldDebounceMs)\n    } else {\n      this.options.listeners?.onChange?.({\n        value: this.state.value,\n        groupApi: this,\n      })\n    }\n  }\n\n  /**\n   * @private\n   */\n  triggerOnSubmitListener = () => {\n    this.options.listeners?.onSubmit?.({\n      value: this.state.value,\n      groupApi: this,\n    })\n  }\n\n  // Needs to edgecase in the React adapter specifically to avoid type errors\n  handleSubmit(): Promise<void>\n  handleSubmit(submitMeta: TSubmitMeta): Promise<void>\n  handleSubmit(submitMeta?: TSubmitMeta): Promise<void> {\n    return this._handleSubmit(submitMeta)\n  }\n\n  /**\n   * Handles the form submission, performs validation, and calls the appropriate onSubmit or onSubmitInvalid callbacks.\n   */\n  _handleSubmit = async (submitMeta?: TSubmitMeta): Promise<void> => {\n    this.setFormGroupState((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.getRelatedFields()).forEach((field) => {\n        // If any fields are not touched\n        if (!field.state.meta.isTouched) {\n          // Mark them as touched\n          field.setMeta((prev) => ({ ...prev, isTouched: true }))\n        }\n      })\n    })\n\n    const submitMetaArg =\n      submitMeta ?? (this.options.onSubmitMeta as TSubmitMeta)\n\n    this.setFormGroupState((d) => ({ ...d, isSubmitting: true }))\n\n    const done = () => {\n      this.setFormGroupState((prev) => ({ ...prev, isSubmitting: false }))\n    }\n\n    await this.validateAllFields('submit')\n\n    // Fields are invalid, do not submit\n    if (!this.areRelatedFieldsValid()) {\n      done()\n\n      this.options.onGroupSubmitInvalid?.({\n        value: this.state.value,\n        groupApi: this,\n        meta: submitMetaArg,\n      })\n\n      return\n    }\n\n    await this.validate('submit', {\n      // This has already happened in the previous step\n      skipRelatedFieldValidation: true,\n    })\n\n    // Group (or related fields) is invalid, do not submit. Mirrors\n    // `FormApi._handleSubmit`'s check against the derived `state.isValid`,\n    // which includes both the group's own validators and any form-level\n    // errors propagated onto related fields by `validate('submit')` above\n    // (e.g. `onDynamic` errors via `revalidateLogic`).\n\n    if (!this.areRelatedFieldsValid() || !this.state.meta.isValid) {\n      done()\n\n      this.options.onGroupSubmitInvalid?.({\n        value: this.state.value,\n        groupApi: this,\n        meta: submitMetaArg,\n      })\n\n      return\n    }\n\n    batch(() => {\n      void Object.values(this.getRelatedFields()).forEach((field) => {\n        field.options.listeners?.onGroupSubmit?.({\n          value: field.state.value,\n          fieldApi: field,\n        })\n      })\n    })\n\n    this.options.listeners?.onSubmit?.({\n      groupApi: this,\n      value: this.state.value,\n    })\n\n    try {\n      // Run the submit code\n      await this.options.onGroupSubmit?.({\n        value: this.state.value,\n        groupApi: this,\n        meta: submitMetaArg,\n      })\n\n      batch(() => {\n        this.setFormGroupState((prev) => ({\n          ...prev,\n          isSubmitted: true,\n          isSubmitSuccessful: true, // Set isSubmitSuccessful to true on successful submission\n        }))\n\n        done()\n      })\n    } catch (err) {\n      this.setFormGroupState((prev) => ({\n        ...prev,\n        isSubmitSuccessful: false, // Ensure isSubmitSuccessful is false if an error occurs\n      }))\n\n      done()\n\n      throw err\n    }\n  }\n}\n\nfunction normalizeError(rawError?: ValidationError) {\n  if (rawError) {\n    return rawError\n  }\n\n  return undefined\n}\n\n/**\n * @private\n *\n * Type guard for the group-level analogue of `GlobalFormValidationError`.\n * Group-level validators that want to fan errors out to child fields return\n * `{ group?: ValidationError, fields: { ...relativePath: ValidationError } }`.\n */\nfunction isGlobalGroupValidationError(\n  error: unknown,\n): error is { group?: unknown; fields?: Record<string, unknown> } {\n  return !!error && typeof error === 'object' && 'fields' in error\n}\n\n/**\n * @private\n *\n * Standard schemas produce `{ form, fields }`. For groups we prefer to expose\n * a `{ group, fields }` shape because `form` would be misleading on a\n * group-level validator. This rename keeps the rest of the group validation\n * pipeline operating on a single shape.\n */\nfunction remapStandardSchemaResultForGroup(result: unknown): unknown {\n  if (!result || typeof result !== 'object') return result\n  if (!('form' in result) && !('fields' in result)) return result\n  const { form, fields, ...rest } = result as {\n    form?: unknown\n    fields?: unknown\n  }\n  return { ...rest, group: form, fields }\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":["defaultFieldMeta","opts","evaluate","mergeOpts","FieldApi","isFieldInGroup","determineFormLevelErrorSourceAndValue","getSyncValidatorArray","defaultValidationLogic","batch","determineFieldLevelErrorSourceAndValue","getAsyncValidatorArray","createStore","isStandardSchemaValidator","standardSchemaValidators"],"mappings":"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"}