@tanstack/form-core 1.8.0 → 1.9.1

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.
@@ -1 +1 @@
1
- {"version":3,"file":"utils.cjs","sources":["../../src/utils.ts"],"sourcesContent":["import type {\n GlobalFormValidationError,\n ValidationCause,\n ValidationError,\n ValidationSource,\n} from './types'\nimport type { FormValidators } from './FormApi'\nimport type { AnyFieldMeta, FieldValidators } from './FieldApi'\n\nexport type UpdaterFn<TInput, TOutput = TInput> = (input: TInput) => TOutput\n\nexport type Updater<TInput, TOutput = TInput> =\n | TOutput\n | UpdaterFn<TInput, TOutput>\n\n/**\n * @private\n */\nexport function functionalUpdate<TInput, TOutput = TInput>(\n updater: Updater<TInput, TOutput>,\n input: TInput,\n): TOutput {\n return typeof updater === 'function'\n ? (updater as UpdaterFn<TInput, TOutput>)(input)\n : updater\n}\n\n/**\n * Get a value from an object using a path, including dot notation.\n * @private\n */\nexport function getBy(obj: any, path: any) {\n const pathObj = makePathArray(path)\n return pathObj.reduce((current: any, pathPart: any) => {\n if (current === null) return null\n if (typeof current !== 'undefined') {\n return current[pathPart]\n }\n return undefined\n }, obj)\n}\n\n/**\n * Set a value on an object using a path, including dot notation.\n * @private\n */\nexport function setBy(obj: any, _path: any, updater: Updater<any>) {\n const path = makePathArray(_path)\n\n function doSet(parent?: any): any {\n if (!path.length) {\n return functionalUpdate(updater, parent)\n }\n\n const key = path.shift()\n\n if (\n typeof key === 'string' ||\n (typeof key === 'number' && !Array.isArray(parent))\n ) {\n if (typeof parent === 'object') {\n if (parent === null) {\n parent = {}\n }\n return {\n ...parent,\n [key]: doSet(parent[key]),\n }\n }\n return {\n [key]: doSet(),\n }\n }\n\n if (Array.isArray(parent) && typeof key === 'number') {\n const prefix = parent.slice(0, key)\n return [\n ...(prefix.length ? prefix : new Array(key)),\n doSet(parent[key]),\n ...parent.slice(key + 1),\n ]\n }\n return [...new Array(key), doSet()]\n }\n\n return doSet(obj)\n}\n\n/**\n * Delete a field on an object using a path, including dot notation.\n * @private\n */\nexport function deleteBy(obj: any, _path: any) {\n const path = makePathArray(_path)\n\n function doDelete(parent: any): any {\n if (!parent) return\n if (path.length === 1) {\n const finalPath = path[0]!\n if (Array.isArray(parent) && typeof finalPath === 'number') {\n return parent.filter((_, i) => i !== finalPath)\n }\n const { [finalPath]: remove, ...rest } = parent\n return rest\n }\n\n const key = path.shift()\n\n if (typeof key === 'string') {\n if (typeof parent === 'object') {\n return {\n ...parent,\n [key]: doDelete(parent[key]),\n }\n }\n }\n\n if (typeof key === 'number') {\n if (Array.isArray(parent)) {\n if (key >= parent.length) {\n return parent\n }\n const prefix = parent.slice(0, key)\n return [\n ...(prefix.length ? prefix : new Array(key)),\n doDelete(parent[key]),\n ...parent.slice(key + 1),\n ]\n }\n }\n\n throw new Error('It seems we have created an infinite loop in deleteBy. ')\n }\n\n return doDelete(obj)\n}\n\nconst reFindNumbers0 = /^(\\d*)$/gm\nconst reFindNumbers1 = /\\.(\\d*)\\./gm\nconst reFindNumbers2 = /^(\\d*)\\./gm\nconst reFindNumbers3 = /\\.(\\d*$)/gm\nconst reFindMultiplePeriods = /\\.{2,}/gm\n\nconst intPrefix = '__int__'\nconst intReplace = `${intPrefix}$1`\n\n/**\n * @private\n */\nexport function makePathArray(str: string | Array<string | number>) {\n if (Array.isArray(str)) {\n return [...str]\n }\n\n if (typeof str !== 'string') {\n throw new Error('Path must be a string.')\n }\n\n return str\n .replace(/\\[/g, '.')\n .replace(/\\]/g, '')\n .replace(reFindNumbers0, intReplace)\n .replace(reFindNumbers1, `.${intReplace}.`)\n .replace(reFindNumbers2, `${intReplace}.`)\n .replace(reFindNumbers3, `.${intReplace}`)\n .replace(reFindMultiplePeriods, '.')\n .split('.')\n .map((d) => {\n if (d.indexOf(intPrefix) === 0) {\n return parseInt(d.substring(intPrefix.length), 10)\n }\n return d\n })\n}\n\n/**\n * @private\n */\nexport function isNonEmptyArray(obj: any) {\n return !(Array.isArray(obj) && obj.length === 0)\n}\n\ninterface AsyncValidatorArrayPartialOptions<T> {\n validators?: T\n asyncDebounceMs?: number\n}\n\n/**\n * @private\n */\nexport interface AsyncValidator<T> {\n cause: ValidationCause\n validate: T\n debounceMs: number\n}\n\n/**\n * @private\n */\nexport function getAsyncValidatorArray<T>(\n cause: ValidationCause,\n options: AsyncValidatorArrayPartialOptions<T>,\n): T extends FieldValidators<any, any, any, any, any, any, any, any, any, any>\n ? Array<\n AsyncValidator<T['onChangeAsync'] | T['onBlurAsync'] | T['onSubmitAsync']>\n >\n : T extends FormValidators<any, any, any, any, any, any, any, any>\n ? Array<\n AsyncValidator<\n T['onChangeAsync'] | T['onBlurAsync'] | T['onSubmitAsync']\n >\n >\n : never {\n const { asyncDebounceMs } = options\n const {\n onChangeAsync,\n onBlurAsync,\n onSubmitAsync,\n onBlurAsyncDebounceMs,\n onChangeAsyncDebounceMs,\n } = (options.validators || {}) as\n | FieldValidators<any, any, any, any, any, any, any, any, any, any>\n | FormValidators<any, any, any, any, any, any, any, any>\n\n const defaultDebounceMs = asyncDebounceMs ?? 0\n\n const changeValidator = {\n cause: 'change',\n validate: onChangeAsync,\n debounceMs: onChangeAsyncDebounceMs ?? defaultDebounceMs,\n } as const\n\n const blurValidator = {\n cause: 'blur',\n validate: onBlurAsync,\n debounceMs: onBlurAsyncDebounceMs ?? defaultDebounceMs,\n } as const\n\n const submitValidator = {\n cause: 'submit',\n validate: onSubmitAsync,\n debounceMs: 0,\n } as const\n\n const noopValidator = (\n validator:\n | typeof changeValidator\n | typeof blurValidator\n | typeof submitValidator,\n ) => ({ ...validator, debounceMs: 0 }) as const\n\n switch (cause) {\n case 'submit':\n return [\n noopValidator(changeValidator),\n noopValidator(blurValidator),\n submitValidator,\n ] as never\n case 'blur':\n return [blurValidator] as never\n case 'change':\n return [changeValidator] as never\n case 'server':\n default:\n return [] as never\n }\n}\n\ninterface SyncValidatorArrayPartialOptions<T> {\n validators?: T\n}\n\n/**\n * @private\n */\nexport interface SyncValidator<T> {\n cause: ValidationCause\n validate: T\n}\n\n/**\n * @private\n */\nexport function getSyncValidatorArray<T>(\n cause: ValidationCause,\n options: SyncValidatorArrayPartialOptions<T>,\n): T extends FieldValidators<any, any, any, any, any, any, any, any, any, any>\n ? Array<\n SyncValidator<T['onChange'] | T['onBlur'] | T['onSubmit'] | T['onMount']>\n >\n : T extends FormValidators<any, any, any, any, any, any, any, any>\n ? Array<\n SyncValidator<\n T['onChange'] | T['onBlur'] | T['onSubmit'] | T['onMount']\n >\n >\n : never {\n const { onChange, onBlur, onSubmit, onMount } = (options.validators || {}) as\n | FieldValidators<any, any, any, any, any, any, any, any, any, any>\n | FormValidators<any, any, any, any, any, any, any, any>\n\n const changeValidator = { cause: 'change', validate: onChange } as const\n const blurValidator = { cause: 'blur', validate: onBlur } as const\n const submitValidator = { cause: 'submit', validate: onSubmit } as const\n const mountValidator = { cause: 'mount', validate: onMount } as const\n\n // Allows us to clear onServer errors\n const serverValidator = {\n cause: 'server',\n validate: () => undefined,\n } as const\n\n switch (cause) {\n case 'mount':\n return [mountValidator] as never\n case 'submit':\n return [\n changeValidator,\n blurValidator,\n submitValidator,\n serverValidator,\n ] as never\n case 'server':\n return [serverValidator] as never\n case 'blur':\n return [blurValidator, serverValidator] as never\n case 'change':\n default:\n return [changeValidator, serverValidator] as never\n }\n}\n\nexport const isGlobalFormValidationError = (\n error: unknown,\n): error is GlobalFormValidationError<unknown> => {\n return !!error && typeof error === 'object' && 'fields' in error\n}\n\nexport function shallow<T>(objA: T, objB: T) {\n if (Object.is(objA, objB)) {\n return true\n }\n\n if (\n typeof objA !== 'object' ||\n objA === null ||\n typeof objB !== 'object' ||\n objB === null\n ) {\n return false\n }\n\n if (objA instanceof Map && objB instanceof Map) {\n if (objA.size !== objB.size) return false\n for (const [k, v] of objA) {\n if (!objB.has(k) || !Object.is(v, objB.get(k))) return false\n }\n return true\n }\n\n if (objA instanceof Set && objB instanceof Set) {\n if (objA.size !== objB.size) return false\n for (const v of objA) {\n if (!objB.has(v)) return false\n }\n return true\n }\n\n const keysA = Object.keys(objA)\n if (keysA.length !== Object.keys(objB).length) {\n return false\n }\n\n for (let i = 0; i < keysA.length; i++) {\n if (\n !Object.prototype.hasOwnProperty.call(objB, keysA[i] as string) ||\n !Object.is(objA[keysA[i] as keyof T], objB[keysA[i] as keyof T])\n ) {\n return false\n }\n }\n return true\n}\n\n/**\n * Determines the logic for determining the error source and value to set on the field meta within the form level sync/async validation.\n * @private\n */\nexport const determineFormLevelErrorSourceAndValue = ({\n newFormValidatorError,\n isPreviousErrorFromFormValidator,\n previousErrorValue,\n}: {\n newFormValidatorError: ValidationError\n isPreviousErrorFromFormValidator: boolean\n previousErrorValue: ValidationError\n}): {\n newErrorValue: ValidationError\n newSource: ValidationSource | undefined\n} => {\n // All falsy values are not considered errors\n if (newFormValidatorError) {\n return { newErrorValue: newFormValidatorError, newSource: 'form' }\n }\n\n // Clears form level error since it's now stale\n if (isPreviousErrorFromFormValidator) {\n return { newErrorValue: undefined, newSource: undefined }\n }\n\n // At this point, we have a preivous error which must have been set by the field validator, keep as is\n if (previousErrorValue) {\n return { newErrorValue: previousErrorValue, newSource: 'field' }\n }\n\n // No new or previous error, clear the error\n return { newErrorValue: undefined, newSource: undefined }\n}\n\n/**\n * Determines the logic for determining the error source and value to set on the field meta within the field level sync/async validation.\n * @private\n */\nexport const determineFieldLevelErrorSourceAndValue = ({\n formLevelError,\n fieldLevelError,\n}: {\n formLevelError: ValidationError\n fieldLevelError: ValidationError\n}): {\n newErrorValue: ValidationError\n newSource: ValidationSource | undefined\n} => {\n // At field level, we prioritize the field level error\n if (fieldLevelError) {\n return { newErrorValue: fieldLevelError, newSource: 'field' }\n }\n\n // If there is no field level error, and there is a form level error, we set the form level error\n if (formLevelError) {\n return { newErrorValue: formLevelError, newSource: 'form' }\n }\n\n return { newErrorValue: undefined, newSource: undefined }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.cjs","sources":["../../src/utils.ts"],"sourcesContent":["import type { FieldValidators } from './FieldApi'\nimport type { FormValidators } from './FormApi'\nimport type {\n GlobalFormValidationError,\n ValidationCause,\n ValidationError,\n ValidationSource,\n} from './types'\n\nexport type UpdaterFn<TInput, TOutput = TInput> = (input: TInput) => TOutput\n\nexport type Updater<TInput, TOutput = TInput> =\n | TOutput\n | UpdaterFn<TInput, TOutput>\n\n/**\n * @private\n */\nexport function functionalUpdate<TInput, TOutput = TInput>(\n updater: Updater<TInput, TOutput>,\n input: TInput,\n): TOutput {\n return typeof updater === 'function'\n ? (updater as UpdaterFn<TInput, TOutput>)(input)\n : updater\n}\n\n/**\n * Get a value from an object using a path, including dot notation.\n * @private\n */\nexport function getBy(obj: any, path: any) {\n const pathObj = makePathArray(path)\n return pathObj.reduce((current: any, pathPart: any) => {\n if (current === null) return null\n if (typeof current !== 'undefined') {\n return current[pathPart]\n }\n return undefined\n }, obj)\n}\n\n/**\n * Set a value on an object using a path, including dot notation.\n * @private\n */\nexport function setBy(obj: any, _path: any, updater: Updater<any>) {\n const path = makePathArray(_path)\n\n function doSet(parent?: any): any {\n if (!path.length) {\n return functionalUpdate(updater, parent)\n }\n\n const key = path.shift()\n\n if (\n typeof key === 'string' ||\n (typeof key === 'number' && !Array.isArray(parent))\n ) {\n if (typeof parent === 'object') {\n if (parent === null) {\n parent = {}\n }\n return {\n ...parent,\n [key]: doSet(parent[key]),\n }\n }\n return {\n [key]: doSet(),\n }\n }\n\n if (Array.isArray(parent) && typeof key === 'number') {\n const prefix = parent.slice(0, key)\n return [\n ...(prefix.length ? prefix : new Array(key)),\n doSet(parent[key]),\n ...parent.slice(key + 1),\n ]\n }\n return [...new Array(key), doSet()]\n }\n\n return doSet(obj)\n}\n\n/**\n * Delete a field on an object using a path, including dot notation.\n * @private\n */\nexport function deleteBy(obj: any, _path: any) {\n const path = makePathArray(_path)\n\n function doDelete(parent: any): any {\n if (!parent) return\n if (path.length === 1) {\n const finalPath = path[0]!\n if (Array.isArray(parent) && typeof finalPath === 'number') {\n return parent.filter((_, i) => i !== finalPath)\n }\n const { [finalPath]: remove, ...rest } = parent\n return rest\n }\n\n const key = path.shift()\n\n if (typeof key === 'string') {\n if (typeof parent === 'object') {\n return {\n ...parent,\n [key]: doDelete(parent[key]),\n }\n }\n }\n\n if (typeof key === 'number') {\n if (Array.isArray(parent)) {\n if (key >= parent.length) {\n return parent\n }\n const prefix = parent.slice(0, key)\n return [\n ...(prefix.length ? prefix : new Array(key)),\n doDelete(parent[key]),\n ...parent.slice(key + 1),\n ]\n }\n }\n\n throw new Error('It seems we have created an infinite loop in deleteBy. ')\n }\n\n return doDelete(obj)\n}\n\nconst reFindNumbers0 = /^(\\d*)$/gm\nconst reFindNumbers1 = /\\.(\\d*)\\./gm\nconst reFindNumbers2 = /^(\\d*)\\./gm\nconst reFindNumbers3 = /\\.(\\d*$)/gm\nconst reFindMultiplePeriods = /\\.{2,}/gm\n\nconst intPrefix = '__int__'\nconst intReplace = `${intPrefix}$1`\n\n/**\n * @private\n */\nexport function makePathArray(str: string | Array<string | number>) {\n if (Array.isArray(str)) {\n return [...str]\n }\n\n if (typeof str !== 'string') {\n throw new Error('Path must be a string.')\n }\n\n return str\n .replace(/\\[/g, '.')\n .replace(/\\]/g, '')\n .replace(reFindNumbers0, intReplace)\n .replace(reFindNumbers1, `.${intReplace}.`)\n .replace(reFindNumbers2, `${intReplace}.`)\n .replace(reFindNumbers3, `.${intReplace}`)\n .replace(reFindMultiplePeriods, '.')\n .split('.')\n .map((d) => {\n if (d.indexOf(intPrefix) === 0) {\n return parseInt(d.substring(intPrefix.length), 10)\n }\n return d\n })\n}\n\n/**\n * @private\n */\nexport function isNonEmptyArray(obj: any) {\n return !(Array.isArray(obj) && obj.length === 0)\n}\n\ninterface AsyncValidatorArrayPartialOptions<T> {\n validators?: T\n asyncDebounceMs?: number\n}\n\n/**\n * @private\n */\nexport interface AsyncValidator<T> {\n cause: ValidationCause\n validate: T\n debounceMs: number\n}\n\n/**\n * @private\n */\nexport function getAsyncValidatorArray<T>(\n cause: ValidationCause,\n options: AsyncValidatorArrayPartialOptions<T>,\n): T extends FieldValidators<any, any, any, any, any, any, any, any, any, any>\n ? Array<\n AsyncValidator<T['onChangeAsync'] | T['onBlurAsync'] | T['onSubmitAsync']>\n >\n : T extends FormValidators<any, any, any, any, any, any, any, any>\n ? Array<\n AsyncValidator<\n T['onChangeAsync'] | T['onBlurAsync'] | T['onSubmitAsync']\n >\n >\n : never {\n const { asyncDebounceMs } = options\n const {\n onChangeAsync,\n onBlurAsync,\n onSubmitAsync,\n onBlurAsyncDebounceMs,\n onChangeAsyncDebounceMs,\n } = (options.validators || {}) as\n | FieldValidators<any, any, any, any, any, any, any, any, any, any>\n | FormValidators<any, any, any, any, any, any, any, any>\n\n const defaultDebounceMs = asyncDebounceMs ?? 0\n\n const changeValidator = {\n cause: 'change',\n validate: onChangeAsync,\n debounceMs: onChangeAsyncDebounceMs ?? defaultDebounceMs,\n } as const\n\n const blurValidator = {\n cause: 'blur',\n validate: onBlurAsync,\n debounceMs: onBlurAsyncDebounceMs ?? defaultDebounceMs,\n } as const\n\n const submitValidator = {\n cause: 'submit',\n validate: onSubmitAsync,\n debounceMs: 0,\n } as const\n\n const noopValidator = (\n validator:\n | typeof changeValidator\n | typeof blurValidator\n | typeof submitValidator,\n ) => ({ ...validator, debounceMs: 0 }) as const\n\n switch (cause) {\n case 'submit':\n return [\n noopValidator(changeValidator),\n noopValidator(blurValidator),\n submitValidator,\n ] as never\n case 'blur':\n return [blurValidator] as never\n case 'change':\n return [changeValidator] as never\n case 'server':\n default:\n return [] as never\n }\n}\n\ninterface SyncValidatorArrayPartialOptions<T> {\n validators?: T\n}\n\n/**\n * @private\n */\nexport interface SyncValidator<T> {\n cause: ValidationCause\n validate: T\n}\n\n/**\n * @private\n */\nexport function getSyncValidatorArray<T>(\n cause: ValidationCause,\n options: SyncValidatorArrayPartialOptions<T>,\n): T extends FieldValidators<any, any, any, any, any, any, any, any, any, any>\n ? Array<\n SyncValidator<T['onChange'] | T['onBlur'] | T['onSubmit'] | T['onMount']>\n >\n : T extends FormValidators<any, any, any, any, any, any, any, any>\n ? Array<\n SyncValidator<\n T['onChange'] | T['onBlur'] | T['onSubmit'] | T['onMount']\n >\n >\n : never {\n const { onChange, onBlur, onSubmit, onMount } = (options.validators || {}) as\n | FieldValidators<any, any, any, any, any, any, any, any, any, any>\n | FormValidators<any, any, any, any, any, any, any, any>\n\n const changeValidator = { cause: 'change', validate: onChange } as const\n const blurValidator = { cause: 'blur', validate: onBlur } as const\n const submitValidator = { cause: 'submit', validate: onSubmit } as const\n const mountValidator = { cause: 'mount', validate: onMount } as const\n\n // Allows us to clear onServer errors\n const serverValidator = {\n cause: 'server',\n validate: () => undefined,\n } as const\n\n switch (cause) {\n case 'mount':\n return [mountValidator] as never\n case 'submit':\n return [\n changeValidator,\n blurValidator,\n submitValidator,\n serverValidator,\n ] as never\n case 'server':\n return [serverValidator] as never\n case 'blur':\n return [blurValidator, serverValidator] as never\n case 'change':\n default:\n return [changeValidator, serverValidator] as never\n }\n}\n\nexport const isGlobalFormValidationError = (\n error: unknown,\n): error is GlobalFormValidationError<unknown> => {\n return !!error && typeof error === 'object' && 'fields' in error\n}\n\nexport function shallow<T>(objA: T, objB: T) {\n if (Object.is(objA, objB)) {\n return true\n }\n\n if (\n typeof objA !== 'object' ||\n objA === null ||\n typeof objB !== 'object' ||\n objB === null\n ) {\n return false\n }\n\n if (objA instanceof Map && objB instanceof Map) {\n if (objA.size !== objB.size) return false\n for (const [k, v] of objA) {\n if (!objB.has(k) || !Object.is(v, objB.get(k))) return false\n }\n return true\n }\n\n if (objA instanceof Set && objB instanceof Set) {\n if (objA.size !== objB.size) return false\n for (const v of objA) {\n if (!objB.has(v)) return false\n }\n return true\n }\n\n const keysA = Object.keys(objA)\n if (keysA.length !== Object.keys(objB).length) {\n return false\n }\n\n for (let i = 0; i < keysA.length; i++) {\n if (\n !Object.prototype.hasOwnProperty.call(objB, keysA[i] as string) ||\n !Object.is(objA[keysA[i] as keyof T], objB[keysA[i] as keyof T])\n ) {\n return false\n }\n }\n return true\n}\n\n/**\n * Determines the logic for determining the error source and value to set on the field meta within the form level sync/async validation.\n * @private\n */\nexport const determineFormLevelErrorSourceAndValue = ({\n newFormValidatorError,\n isPreviousErrorFromFormValidator,\n previousErrorValue,\n}: {\n newFormValidatorError: ValidationError\n isPreviousErrorFromFormValidator: boolean\n previousErrorValue: ValidationError\n}): {\n newErrorValue: ValidationError\n newSource: ValidationSource | undefined\n} => {\n // All falsy values are not considered errors\n if (newFormValidatorError) {\n return { newErrorValue: newFormValidatorError, newSource: 'form' }\n }\n\n // Clears form level error since it's now stale\n if (isPreviousErrorFromFormValidator) {\n return { newErrorValue: undefined, newSource: undefined }\n }\n\n // At this point, we have a preivous error which must have been set by the field validator, keep as is\n if (previousErrorValue) {\n return { newErrorValue: previousErrorValue, newSource: 'field' }\n }\n\n // No new or previous error, clear the error\n return { newErrorValue: undefined, newSource: undefined }\n}\n\n/**\n * Determines the logic for determining the error source and value to set on the field meta within the field level sync/async validation.\n * @private\n */\nexport const determineFieldLevelErrorSourceAndValue = ({\n formLevelError,\n fieldLevelError,\n}: {\n formLevelError: ValidationError\n fieldLevelError: ValidationError\n}): {\n newErrorValue: ValidationError\n newSource: ValidationSource | undefined\n} => {\n // At field level, we prioritize the field level error\n if (fieldLevelError) {\n return { newErrorValue: fieldLevelError, newSource: 'field' }\n }\n\n // If there is no field level error, and there is a form level error, we set the form level error\n if (formLevelError) {\n return { newErrorValue: formLevelError, newSource: 'form' }\n }\n\n return { newErrorValue: undefined, newSource: undefined }\n}\n"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
- import { GlobalFormValidationError, ValidationCause, ValidationError, ValidationSource } from './types.cjs';
2
- import { FormValidators } from './FormApi.cjs';
3
1
  import { FieldValidators } from './FieldApi.cjs';
2
+ import { FormValidators } from './FormApi.cjs';
3
+ import { GlobalFormValidationError, ValidationCause, ValidationError, ValidationSource } from './types.cjs';
4
4
  export type UpdaterFn<TInput, TOutput = TInput> = (input: TInput) => TOutput;
5
5
  export type Updater<TInput, TOutput = TInput> = TOutput | UpdaterFn<TInput, TOutput>;
6
6
  /**
@@ -202,6 +202,10 @@ export type FieldMetaDerived<TParentData, TName extends DeepKeys<TParentData>, T
202
202
  * A flag that is `true` if the field's value has not been modified by the user. Opposite of `isDirty`.
203
203
  */
204
204
  isPristine: boolean;
205
+ /**
206
+ * A boolean indicating if the field is valid. Evaluates `true` if there are no field errors.
207
+ */
208
+ isValid: boolean;
205
209
  };
206
210
  export type AnyFieldMetaDerived = FieldMetaDerived<any, any, any, any, any, any, any, any, any, any, any, any, any, any, any, any, any>;
207
211
  /**
@@ -298,7 +302,7 @@ export declare class FieldApi<in out TParentData, in out TName extends DeepKeys<
298
302
  /**
299
303
  * Sets the field metadata.
300
304
  */
301
- setMeta: (updater: Updater<FieldMeta<TParentData, TName, TData, TOnMount, TOnChange, TOnChangeAsync, TOnBlur, TOnBlurAsync, TOnSubmit, TOnSubmitAsync, TFormOnMount, TFormOnChange, TFormOnChangeAsync, TFormOnBlur, TFormOnBlurAsync, TFormOnSubmit, TFormOnSubmitAsync>>) => void;
305
+ setMeta: (updater: Updater<FieldMetaBase<TParentData, TName, TData, TOnMount, TOnChange, TOnChangeAsync, TOnBlur, TOnBlurAsync, TOnSubmit, TOnSubmitAsync, TFormOnMount, TFormOnChange, TFormOnChangeAsync, TFormOnBlur, TFormOnBlurAsync, TFormOnSubmit, TFormOnSubmitAsync>>) => void;
302
306
  /**
303
307
  * Gets the field information object.
304
308
  */
@@ -358,7 +362,7 @@ export declare class FieldApi<in out TParentData, in out TName extends DeepKeys<
358
362
  /**
359
363
  * Updates the field's errorMap
360
364
  */
361
- setErrorMap(errorMap: ValidationErrorMap): void;
365
+ setErrorMap(errorMap: ValidationErrorMap<UnwrapFieldValidateOrFn<TName, TOnMount, TFormOnMount>, UnwrapFieldValidateOrFn<TName, TOnChange, TFormOnChange>, UnwrapFieldAsyncValidateOrFn<TName, TOnChangeAsync, TFormOnChangeAsync>, UnwrapFieldValidateOrFn<TName, TOnBlur, TFormOnBlur>, UnwrapFieldAsyncValidateOrFn<TName, TOnBlurAsync, TFormOnBlurAsync>, UnwrapFieldValidateOrFn<TName, TOnSubmit, TFormOnSubmit>, UnwrapFieldAsyncValidateOrFn<TName, TOnSubmitAsync, TFormOnSubmitAsync>>): void;
362
366
  /**
363
367
  * Parses the field's value with the given schema and returns
364
368
  * issues (if any). This method does NOT set any internal errors.
@@ -401,15 +401,13 @@ class FieldApi {
401
401
  * Updates the field's errorMap
402
402
  */
403
403
  setErrorMap(errorMap) {
404
- this.setMeta(
405
- (prev) => ({
406
- ...prev,
407
- errorMap: {
408
- ...prev.errorMap,
409
- ...errorMap
410
- }
411
- })
412
- );
404
+ this.setMeta((prev) => ({
405
+ ...prev,
406
+ errorMap: {
407
+ ...prev.errorMap,
408
+ ...errorMap
409
+ }
410
+ }));
413
411
  }
414
412
  triggerOnBlurListener() {
415
413
  var _a, _b, _c, _d, _e, _f;
@@ -1 +1 @@
1
- {"version":3,"file":"FieldApi.js","sources":["../../src/FieldApi.ts"],"sourcesContent":["import { Derived, batch } from '@tanstack/store'\nimport {\n isStandardSchemaValidator,\n standardSchemaValidators,\n} from './standardSchemaValidator'\nimport { defaultFieldMeta } from './metaHelper'\nimport {\n determineFieldLevelErrorSourceAndValue,\n getAsyncValidatorArray,\n getBy,\n getSyncValidatorArray,\n} from './utils'\nimport type { DeepKeys, DeepValue, UnwrapOneLevelOfArray } from './util-types'\nimport type {\n StandardSchemaV1,\n StandardSchemaV1Issue,\n TStandardSchemaValidatorValue,\n} from './standardSchemaValidator'\nimport type {\n FieldInfo,\n FormApi,\n FormAsyncValidateOrFn,\n FormValidateAsyncFn,\n FormValidateFn,\n FormValidateOrFn,\n} from './FormApi'\nimport type {\n ListenerCause,\n UpdateMetaOptions,\n ValidationCause,\n ValidationError,\n ValidationErrorMap,\n ValidationErrorMapSource,\n} from './types'\nimport type { AsyncValidator, SyncValidator, Updater } from './utils'\n\n/**\n * @private\n */\n// TODO: Add the `Unwrap` type to the errors\ntype FieldErrorMapFromValidator<\n TFormData,\n TName extends DeepKeys<TFormData>,\n TData extends DeepValue<TFormData, TName>,\n TOnMount extends undefined | FieldValidateOrFn<TFormData, TName, TData>,\n TOnChange extends undefined | FieldValidateOrFn<TFormData, TName, TData>,\n TOnChangeAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TFormData, TName, TData>,\n TOnBlur extends undefined | FieldValidateOrFn<TFormData, TName, TData>,\n TOnBlurAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TFormData, TName, TData>,\n TOnSubmit extends undefined | FieldValidateOrFn<TFormData, TName, TData>,\n TOnSubmitAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TFormData, TName, TData>,\n> = Partial<\n Record<\n DeepKeys<TFormData>,\n ValidationErrorMap<\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync\n >\n >\n>\n\n/**\n * @private\n */\nexport type FieldValidateFn<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> = (props: {\n value: TData\n fieldApi: FieldApi<\n TParentData,\n TName,\n TData,\n // This is technically an edge-type; which we try to keep non-`any`, but in this case\n // It's referring to an inaccessible type from the field validate function inner types, so it's not a big deal\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n >\n}) => unknown\n\n/**\n * @private\n */\nexport type FieldValidateOrFn<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> =\n | FieldValidateFn<TParentData, TName, TData>\n | StandardSchemaV1<TData, unknown>\n\ntype StandardBrandedSchemaV1<T> = T & { __standardSchemaV1: true }\n\ntype UnwrapFormValidateOrFnForInner<\n TValidateOrFn extends undefined | FormValidateOrFn<any>,\n> = [TValidateOrFn] extends [FormValidateFn<any>]\n ? ReturnType<TValidateOrFn>\n : [TValidateOrFn] extends [StandardSchemaV1<infer TOut, any>]\n ? StandardBrandedSchemaV1<TOut>\n : undefined\n\nexport type UnwrapFieldValidateOrFn<\n TName extends string,\n TValidateOrFn extends undefined | FieldValidateOrFn<any, any, any>,\n TFormValidateOrFn extends undefined | FormValidateOrFn<any>,\n> =\n | ([TFormValidateOrFn] extends [StandardSchemaV1<any, infer TStandardOut>]\n ? TName extends keyof TStandardOut\n ? StandardSchemaV1Issue[]\n : undefined\n : undefined)\n | (UnwrapFormValidateOrFnForInner<TFormValidateOrFn> extends infer TFormValidateVal\n ? TFormValidateVal extends { __standardSchemaV1: true }\n ? [DeepValue<TFormValidateVal, TName>] extends [never]\n ? undefined\n : StandardSchemaV1Issue[]\n : TFormValidateVal extends { fields: any }\n ? TName extends keyof TFormValidateVal['fields']\n ? TFormValidateVal['fields'][TName]\n : undefined\n : undefined\n : never)\n | ([TValidateOrFn] extends [FieldValidateFn<any, any, any>]\n ? ReturnType<TValidateOrFn>\n : [TValidateOrFn] extends [StandardSchemaV1<any, any>]\n ? // TODO: Check if `disableErrorFlat` is enabled, if so, return StandardSchemaV1Issue[][]\n StandardSchemaV1Issue[]\n : undefined)\n\n/**\n * @private\n */\nexport type FieldValidateAsyncFn<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> = (options: {\n value: TData\n fieldApi: FieldApi<\n TParentData,\n TName,\n TData,\n // This is technically an edge-type; which we try to keep non-`any`, but in this case\n // It's referring to an inaccessible type from the field validate function inner types, so it's not a big deal\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n >\n signal: AbortSignal\n}) => unknown | Promise<unknown>\n\n/**\n * @private\n */\nexport type FieldAsyncValidateOrFn<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> =\n | FieldValidateAsyncFn<TParentData, TName, TData>\n | StandardSchemaV1<TData, unknown>\n\ntype UnwrapFormAsyncValidateOrFnForInner<\n TValidateOrFn extends undefined | FormAsyncValidateOrFn<any>,\n> = [TValidateOrFn] extends [FormValidateAsyncFn<any>]\n ? Awaited<ReturnType<TValidateOrFn>>\n : [TValidateOrFn] extends [StandardSchemaV1<infer TOut, any>]\n ? StandardBrandedSchemaV1<TOut>\n : undefined\n\nexport type UnwrapFieldAsyncValidateOrFn<\n TName extends string,\n TValidateOrFn extends undefined | FieldAsyncValidateOrFn<any, any, any>,\n TFormValidateOrFn extends undefined | FormAsyncValidateOrFn<any>,\n> =\n | ([TFormValidateOrFn] extends [StandardSchemaV1<any, infer TStandardOut>]\n ? TName extends keyof TStandardOut\n ? StandardSchemaV1Issue[]\n : undefined\n : undefined)\n | (UnwrapFormAsyncValidateOrFnForInner<TFormValidateOrFn> extends infer TFormValidateVal\n ? TFormValidateVal extends { __standardSchemaV1: true }\n ? [DeepValue<TFormValidateVal, TName>] extends [never]\n ? undefined\n : StandardSchemaV1Issue[]\n : TFormValidateVal extends { fields: any }\n ? TName extends keyof TFormValidateVal['fields']\n ? TFormValidateVal['fields'][TName]\n : undefined\n : undefined\n : never)\n | ([TValidateOrFn] extends [FieldValidateAsyncFn<any, any, any>]\n ? Awaited<ReturnType<TValidateOrFn>>\n : [TValidateOrFn] extends [StandardSchemaV1<any, any>]\n ? // TODO: Check if `disableErrorFlat` is enabled, if so, return StandardSchemaV1Issue[][]\n StandardSchemaV1Issue[]\n : undefined)\n\n/**\n * @private\n */\nexport type FieldListenerFn<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> = (props: {\n value: TData\n fieldApi: FieldApi<\n TParentData,\n TName,\n TData,\n // This is technically an edge-type; which we try to keep non-`any`, but in this case\n // It's referring to an inaccessible type from the field listener function inner types, so it's not a big deal\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n >\n}) => void\n\nexport interface FieldValidators<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName>,\n TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChangeAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnBlurAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnSubmitAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n> {\n /**\n * An optional function, that runs on the mount event of input.\n */\n onMount?: TOnMount\n /**\n * An optional function, that runs on the change event of input.\n *\n * @example z.string().min(1)\n */\n onChange?: TOnChange\n /**\n * An optional property similar to `onChange` but async validation\n *\n * @example z.string().refine(async (val) => val.length > 3, { message: 'Testing 123' })\n */\n onChangeAsync?: TOnChangeAsync\n /**\n * An optional number to represent how long the `onChangeAsync` should wait before running\n *\n * If set to a number larger than 0, will debounce the async validation event by this length of time in milliseconds\n */\n onChangeAsyncDebounceMs?: number\n /**\n * An optional list of field names that should trigger this field's `onChange` and `onChangeAsync` events when its value changes\n */\n onChangeListenTo?: DeepKeys<TParentData>[]\n /**\n * An optional function, that runs on the blur event of input.\n *\n * @example z.string().min(1)\n */\n onBlur?: TOnBlur\n /**\n * An optional property similar to `onBlur` but async validation.\n *\n * @example z.string().refine(async (val) => val.length > 3, { message: 'Testing 123' })\n */\n onBlurAsync?: TOnBlurAsync\n\n /**\n * An optional number to represent how long the `onBlurAsync` should wait before running\n *\n * If set to a number larger than 0, will debounce the async validation event by this length of time in milliseconds\n */\n onBlurAsyncDebounceMs?: number\n /**\n * An optional list of field names that should trigger this field's `onBlur` and `onBlurAsync` events when its value changes\n */\n onBlurListenTo?: DeepKeys<TParentData>[]\n /**\n * An optional function, that runs on the submit event of form.\n *\n * @example z.string().min(1)\n */\n onSubmit?: TOnSubmit\n /**\n * An optional property similar to `onSubmit` but async validation.\n *\n * @example z.string().refine(async (val) => val.length > 3, { message: 'Testing 123' })\n */\n onSubmitAsync?: TOnSubmitAsync\n}\n\nexport interface FieldListeners<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> {\n onChange?: FieldListenerFn<TParentData, TName, TData>\n onChangeDebounceMs?: number\n onBlur?: FieldListenerFn<TParentData, TName, TData>\n onBlurDebounceMs?: number\n onMount?: FieldListenerFn<TParentData, TName, TData>\n onSubmit?: FieldListenerFn<TParentData, TName, TData>\n}\n\n/**\n * An object type representing the options for a field in a form.\n */\nexport interface FieldOptions<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName>,\n TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChangeAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnBlurAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnSubmitAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n> {\n /**\n * The field name. The type will be `DeepKeys<TParentData>` to ensure your name is a deep key of the parent dataset.\n */\n name: TName\n /**\n * An optional default value for the field.\n */\n defaultValue?: NoInfer<TData>\n /**\n * The default time to debounce async validation if there is not a more specific debounce time passed.\n */\n asyncDebounceMs?: number\n /**\n * If `true`, always run async validation, even if there are errors emitted during synchronous validation.\n */\n asyncAlways?: boolean\n /**\n * A list of validators to pass to the field\n */\n validators?: FieldValidators<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync\n >\n /**\n * An optional object with default metadata for the field.\n */\n defaultMeta?: Partial<\n FieldMeta<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n >\n >\n /**\n * A list of listeners which attach to the corresponding events\n */\n listeners?: FieldListeners<TParentData, TName, TData>\n /**\n * Disable the `flat(1)` operation on `field.errors`. This is useful if you want to keep the error structure as is. Not suggested for most use-cases.\n */\n disableErrorFlat?: boolean\n}\n\n/**\n * An object type representing the required options for the FieldApi class.\n */\nexport interface FieldApiOptions<\n in out TParentData,\n in out TName extends DeepKeys<TParentData>,\n in out TData extends DeepValue<TParentData, TName>,\n in out TOnMount extends\n | undefined\n | FieldValidateOrFn<TParentData, TName, TData>,\n in out TOnChange extends\n | undefined\n | FieldValidateOrFn<TParentData, TName, TData>,\n in out TOnChangeAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n in out TOnBlur extends\n | undefined\n | FieldValidateOrFn<TParentData, TName, TData>,\n in out TOnBlurAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n in out TOnSubmit extends\n | undefined\n | FieldValidateOrFn<TParentData, TName, TData>,\n in out TOnSubmitAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n in out TFormOnMount extends undefined | FormValidateOrFn<TParentData>,\n in out TFormOnChange extends undefined | FormValidateOrFn<TParentData>,\n in out TFormOnChangeAsync extends\n | undefined\n | FormAsyncValidateOrFn<TParentData>,\n in out TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,\n in out TFormOnBlurAsync extends\n | undefined\n | FormAsyncValidateOrFn<TParentData>,\n in out TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,\n in out TFormOnSubmitAsync extends\n | undefined\n | FormAsyncValidateOrFn<TParentData>,\n in out TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>,\n in out TParentSubmitMeta,\n> extends FieldOptions<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync\n > {\n form: FormApi<\n TParentData,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnServer,\n TParentSubmitMeta\n >\n}\n\nexport type FieldMetaBase<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName>,\n TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChangeAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnBlurAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnSubmitAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TFormOnMount extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChange extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,\n TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,\n TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n> = {\n /**\n * A flag indicating whether the field has been touched.\n */\n isTouched: boolean\n /**\n * A flag indicating whether the field has been blurred.\n */\n isBlurred: boolean\n /**\n * A flag that is `true` if the field's value has been modified by the user. Opposite of `isPristine`.\n */\n isDirty: boolean\n /**\n * A map of errors related to the field value.\n */\n errorMap: ValidationErrorMap<\n UnwrapFieldValidateOrFn<TName, TOnMount, TFormOnMount>,\n UnwrapFieldValidateOrFn<TName, TOnChange, TFormOnChange>,\n UnwrapFieldAsyncValidateOrFn<TName, TOnChangeAsync, TFormOnChangeAsync>,\n UnwrapFieldValidateOrFn<TName, TOnBlur, TFormOnBlur>,\n UnwrapFieldAsyncValidateOrFn<TName, TOnBlurAsync, TFormOnBlurAsync>,\n UnwrapFieldValidateOrFn<TName, TOnSubmit, TFormOnSubmit>,\n UnwrapFieldAsyncValidateOrFn<TName, TOnSubmitAsync, TFormOnSubmitAsync>\n >\n /**\n * @private allows tracking the source of the errors in the error map\n */\n errorSourceMap: ValidationErrorMapSource\n /**\n * A flag indicating whether the field is currently being validated.\n */\n isValidating: boolean\n}\n\nexport type AnyFieldMetaBase = FieldMetaBase<\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n>\n\nexport type FieldMetaDerived<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName>,\n TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChangeAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnBlurAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnSubmitAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TFormOnMount extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChange extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,\n TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,\n TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n> = {\n /**\n * An array of errors related to the field value.\n */\n errors: Array<\n | UnwrapOneLevelOfArray<\n UnwrapFieldValidateOrFn<TName, TOnMount, TFormOnMount>\n >\n | UnwrapOneLevelOfArray<\n UnwrapFieldValidateOrFn<TName, TOnChange, TFormOnChange>\n >\n | UnwrapOneLevelOfArray<\n UnwrapFieldAsyncValidateOrFn<TName, TOnChangeAsync, TFormOnChangeAsync>\n >\n | UnwrapOneLevelOfArray<\n UnwrapFieldValidateOrFn<TName, TOnBlur, TFormOnBlur>\n >\n | UnwrapOneLevelOfArray<\n UnwrapFieldAsyncValidateOrFn<TName, TOnBlurAsync, TFormOnBlurAsync>\n >\n | UnwrapOneLevelOfArray<\n UnwrapFieldValidateOrFn<TName, TOnSubmit, TFormOnSubmit>\n >\n | UnwrapOneLevelOfArray<\n UnwrapFieldAsyncValidateOrFn<TName, TOnSubmitAsync, TFormOnSubmitAsync>\n >\n >\n /**\n * A flag that is `true` if the field's value has not been modified by the user. Opposite of `isDirty`.\n */\n isPristine: boolean\n}\n\nexport type AnyFieldMetaDerived = FieldMetaDerived<\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n>\n\n/**\n * An object type representing the metadata of a field in a form.\n */\nexport type FieldMeta<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName>,\n TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChangeAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnBlurAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnSubmitAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TFormOnMount extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChange extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,\n TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,\n TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n> = FieldMetaBase<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync\n> &\n FieldMetaDerived<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync\n >\n\nexport type AnyFieldMeta = FieldMeta<\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n>\n\n/**\n * An object type representing the state of a field.\n */\nexport type FieldState<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName>,\n TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChangeAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnBlurAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnSubmitAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TFormOnMount extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChange extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,\n TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,\n TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n> = {\n /**\n * The current value of the field.\n */\n value: TData\n /**\n * The current metadata of the field.\n */\n meta: FieldMeta<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync\n >\n}\n\n/**\n * @public\n *\n * A type representing the Field API with all generics set to `any` for convenience.\n */\nexport type AnyFieldApi = FieldApi<\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n>\n\n/**\n * A class representing the API for managing a form field.\n *\n * Normally, you will not need to create a new `FieldApi` instance directly.\n * Instead, you will use a framework hook/function like `useField` or `createField`\n * to create a new instance for you that uses your framework's reactivity model.\n * However, if you need to create a new instance manually, you can do so by calling\n * the `new FieldApi` constructor.\n */\nexport class FieldApi<\n in out TParentData,\n in out TName extends DeepKeys<TParentData>,\n in out TData extends DeepValue<TParentData, TName>,\n in out TOnMount extends\n | undefined\n | FieldValidateOrFn<TParentData, TName, TData>,\n in out TOnChange extends\n | undefined\n | FieldValidateOrFn<TParentData, TName, TData>,\n in out TOnChangeAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n in out TOnBlur extends\n | undefined\n | FieldValidateOrFn<TParentData, TName, TData>,\n in out TOnBlurAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n in out TOnSubmit extends\n | undefined\n | FieldValidateOrFn<TParentData, TName, TData>,\n in out TOnSubmitAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n in out TFormOnMount extends undefined | FormValidateOrFn<TParentData>,\n in out TFormOnChange extends undefined | FormValidateOrFn<TParentData>,\n in out TFormOnChangeAsync extends\n | undefined\n | FormAsyncValidateOrFn<TParentData>,\n in out TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,\n in out TFormOnBlurAsync extends\n | undefined\n | FormAsyncValidateOrFn<TParentData>,\n in out TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,\n in out TFormOnSubmitAsync extends\n | undefined\n | FormAsyncValidateOrFn<TParentData>,\n in out TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>,\n in out TParentSubmitMeta,\n> {\n /**\n * A reference to the form API instance.\n */\n form: FieldApiOptions<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnServer,\n TParentSubmitMeta\n >['form']\n /**\n * The field name.\n */\n name!: DeepKeys<TParentData>\n /**\n * The field options.\n */\n options: FieldApiOptions<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnServer,\n TParentSubmitMeta\n > = {} as any\n /**\n * The field state store.\n */\n store!: Derived<\n FieldState<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync\n >\n >\n /**\n * The current field state.\n */\n get state() {\n return this.store.state\n }\n timeoutIds: {\n validations: Record<ValidationCause, ReturnType<typeof setTimeout> | null>\n listeners: Record<ListenerCause, ReturnType<typeof setTimeout> | null>\n formListeners: Record<ListenerCause, ReturnType<typeof setTimeout> | null>\n }\n\n /**\n * Initializes a new `FieldApi` instance.\n */\n constructor(\n opts: FieldApiOptions<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnServer,\n TParentSubmitMeta\n >,\n ) {\n this.form = opts.form as never\n this.name = opts.name as never\n this.timeoutIds = {\n validations: {} as Record<ValidationCause, never>,\n listeners: {} as Record<ListenerCause, never>,\n formListeners: {} as Record<ListenerCause, never>,\n }\n\n this.store = new Derived({\n deps: [this.form.store],\n fn: () => {\n const value = this.form.getFieldValue(this.name)\n const meta = this.form.getFieldMeta(this.name) ?? {\n ...defaultFieldMeta,\n ...opts.defaultMeta,\n }\n\n return {\n value,\n meta,\n } as FieldState<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync\n >\n },\n })\n\n this.options = opts as never\n }\n\n /**\n * @private\n */\n runValidator<\n TValue extends TStandardSchemaValidatorValue<TData> & {\n fieldApi: AnyFieldApi\n },\n TType extends 'validate' | 'validateAsync',\n >(props: {\n validate: TType extends 'validate'\n ? FieldValidateOrFn<any, any, any>\n : FieldAsyncValidateOrFn<any, any, any>\n value: TValue\n type: TType\n // When `api` is 'field', the return type cannot be `FormValidationError`\n }): unknown {\n if (isStandardSchemaValidator(props.validate)) {\n return standardSchemaValidators[props.type](\n props.value,\n props.validate,\n ) as never\n }\n\n return (props.validate as FieldValidateFn<any, any>)(props.value) as never\n }\n\n /**\n * Mounts the field instance to the form.\n */\n mount = () => {\n const cleanup = this.store.mount()\n\n if ((this.options.defaultValue as unknown) !== undefined) {\n this.form.setFieldValue(this.name, this.options.defaultValue as never, {\n dontUpdateMeta: true,\n })\n }\n\n const info = this.getInfo()\n info.instance = this as never\n\n this.update(this.options as never)\n const { onMount } = this.options.validators || {}\n\n if (onMount) {\n const error = this.runValidator({\n validate: onMount,\n value: {\n value: this.state.value,\n fieldApi: this,\n validationSource: 'field',\n },\n type: 'validate',\n })\n if (error) {\n this.setMeta(\n (prev) =>\n ({\n ...prev,\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n errorMap: { ...prev?.errorMap, onMount: error },\n errorSourceMap: {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n ...prev?.errorSourceMap,\n onMount: 'field',\n },\n }) as never,\n )\n }\n }\n\n this.options.listeners?.onMount?.({\n value: this.state.value,\n fieldApi: this,\n })\n\n return cleanup\n }\n\n /**\n * Updates the field instance with new options.\n */\n update = (\n opts: FieldApiOptions<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnServer,\n TParentSubmitMeta\n >,\n ) => {\n this.options = opts as never\n\n const nameHasChanged = this.name !== opts.name\n this.name = opts.name\n\n // Default Value\n if ((this.state.value as unknown) === undefined) {\n const formDefault = getBy(opts.form.options.defaultValues, opts.name)\n\n const defaultValue = (opts.defaultValue as unknown) ?? formDefault\n\n // The name is dynamic in array fields. It changes when the user performs operations like removing or reordering.\n // In this case, we don't want to force a default value if the store managed to find an existing value.\n if (nameHasChanged) {\n this.setValue((val) => (val as unknown) || defaultValue, {\n dontUpdateMeta: true,\n })\n } else if (defaultValue !== undefined) {\n this.setValue(defaultValue as never, {\n dontUpdateMeta: true,\n })\n }\n }\n\n // Default Meta\n if (this.form.getFieldMeta(this.name) === undefined) {\n this.setMeta(this.state.meta)\n }\n }\n\n /**\n * Gets the current field value.\n * @deprecated Use `field.state.value` instead.\n */\n getValue = (): TData => {\n return this.form.getFieldValue(this.name) as TData\n }\n\n /**\n * Sets the field value and run the `change` validator.\n */\n setValue = (updater: Updater<TData>, options?: UpdateMetaOptions) => {\n this.form.setFieldValue(this.name, updater as never, options)\n\n this.triggerOnChangeListener()\n\n this.validate('change')\n }\n\n getMeta = () => this.store.state.meta\n\n /**\n * Sets the field metadata.\n */\n setMeta = (\n updater: Updater<\n FieldMeta<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync\n >\n >,\n ) => this.form.setFieldMeta(this.name, updater)\n\n /**\n * Gets the field information object.\n */\n getInfo = () => this.form.getFieldInfo(this.name)\n\n /**\n * Pushes a new value to the field.\n */\n pushValue = (\n value: TData extends any[] ? TData[number] : never,\n opts?: UpdateMetaOptions,\n ) => {\n this.form.pushFieldValue(this.name, value as any, opts)\n\n this.triggerOnChangeListener()\n }\n\n /**\n * Inserts a value at the specified index, shifting the subsequent values to the right.\n */\n insertValue = (\n index: number,\n value: TData extends any[] ? TData[number] : never,\n opts?: UpdateMetaOptions,\n ) => {\n this.form.insertFieldValue(this.name, index, value as any, opts)\n\n this.triggerOnChangeListener()\n }\n\n /**\n * Replaces a value at the specified index.\n */\n replaceValue = (\n index: number,\n value: TData extends any[] ? TData[number] : never,\n opts?: UpdateMetaOptions,\n ) => {\n this.form.replaceFieldValue(this.name, index, value as any, opts)\n\n this.triggerOnChangeListener()\n }\n\n /**\n * Removes a value at the specified index.\n */\n removeValue = (index: number, opts?: UpdateMetaOptions) => {\n this.form.removeFieldValue(this.name, index, opts)\n\n this.triggerOnChangeListener()\n }\n\n /**\n * Swaps the values at the specified indices.\n */\n swapValues = (aIndex: number, bIndex: number, opts?: UpdateMetaOptions) => {\n this.form.swapFieldValues(this.name, aIndex, bIndex, opts)\n\n this.triggerOnChangeListener()\n }\n\n /**\n * Moves the value at the first specified index to the second specified index.\n */\n moveValue = (aIndex: number, bIndex: number, opts?: UpdateMetaOptions) => {\n this.form.moveFieldValues(this.name, aIndex, bIndex, opts)\n\n this.triggerOnChangeListener()\n }\n\n /**\n * @private\n */\n getLinkedFields = (cause: ValidationCause) => {\n const fields = Object.values(this.form.fieldInfo) as FieldInfo<any>[]\n\n const linkedFields: AnyFieldApi[] = []\n for (const field of fields) {\n if (!field.instance) continue\n const { onChangeListenTo, onBlurListenTo } =\n field.instance.options.validators || {}\n if (cause === 'change' && onChangeListenTo?.includes(this.name)) {\n linkedFields.push(field.instance)\n }\n if (cause === 'blur' && onBlurListenTo?.includes(this.name as string)) {\n linkedFields.push(field.instance)\n }\n }\n\n return linkedFields\n }\n\n /**\n * @private\n */\n validateSync = (\n cause: ValidationCause,\n errorFromForm: ValidationErrorMap,\n ) => {\n const validates = getSyncValidatorArray(cause, this.options)\n\n const linkedFields = this.getLinkedFields(cause)\n const linkedFieldValidates = linkedFields.reduce(\n (acc, field) => {\n const fieldValidates = getSyncValidatorArray(cause, field.options)\n fieldValidates.forEach((validate) => {\n ;(validate as any).field = field\n })\n return acc.concat(fieldValidates as never)\n },\n [] as Array<\n SyncValidator<any> & {\n field: AnyFieldApi\n }\n >,\n )\n\n // Needs type cast as eslint errantly believes this is always falsy\n let hasErrored = false as boolean\n\n batch(() => {\n const validateFieldFn = (\n field: AnyFieldApi,\n validateObj: SyncValidator<any>,\n ) => {\n const errorMapKey = getErrorMapKey(validateObj.cause)\n\n const fieldLevelError = validateObj.validate\n ? normalizeError(\n field.runValidator({\n validate: validateObj.validate,\n value: {\n value: field.store.state.value,\n validationSource: 'field',\n fieldApi: field,\n },\n type: 'validate',\n }),\n )\n : undefined\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 (field.state.meta.errorMap?.[errorMapKey] !== newErrorValue) {\n field.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\n for (const validateObj of validates) {\n validateFieldFn(this, validateObj)\n }\n for (const fieldValitateObj of linkedFieldValidates) {\n if (!fieldValitateObj.validate) continue\n validateFieldFn(fieldValitateObj.field, fieldValitateObj)\n }\n })\n\n /**\n * when we have an error for onSubmit in the state, we want\n * to clear the error as soon as the user enters a valid value in the field\n */\n const submitErrKey = getErrorMapKey('submit')\n\n if (\n // 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 ) => {\n const validates = getAsyncValidatorArray(cause, this.options)\n\n // Get the field-specific error messages that are coming from the form's validator\n const asyncFormValidationResults = await formValidationResultPromise\n\n const linkedFields = this.getLinkedFields(cause)\n const linkedFieldValidates = linkedFields.reduce(\n (acc, field) => {\n const fieldValidates = getAsyncValidatorArray(cause, field.options)\n fieldValidates.forEach((validate) => {\n ;(validate as any).field = field\n })\n return acc.concat(fieldValidates as never)\n },\n [] as Array<\n AsyncValidator<any> & {\n field: AnyFieldApi\n }\n >,\n )\n\n if (!this.state.meta.isValidating) {\n this.setMeta((prev) => ({ ...prev, isValidating: true }))\n }\n\n for (const linkedField of linkedFields) {\n linkedField.setMeta((prev) => ({ ...prev, isValidating: true }))\n }\n\n /**\n * We have to use a for loop and generate our promises this way, otherwise it won't be sync\n * when there are no validators needed to be run\n */\n const validatesPromises: Promise<ValidationError | undefined>[] = []\n const linkedPromises: Promise<ValidationError | undefined>[] = []\n\n const validateFieldAsyncFn = (\n field: AnyFieldApi,\n validateObj: AsyncValidator<any>,\n promises: Promise<ValidationError | undefined>[],\n ) => {\n const errorMapKey = getErrorMapKey(validateObj.cause)\n const fieldValidatorMeta = field.getInfo().validationMetaMap[errorMapKey]\n\n fieldValidatorMeta?.lastAbortController.abort()\n const controller = new AbortController()\n\n this.getInfo().validationMetaMap[errorMapKey] = {\n lastAbortController: controller,\n }\n\n promises.push(\n new Promise<ValidationError | undefined>(async (resolve) => {\n let rawError!: ValidationError | undefined\n try {\n rawError = await new Promise((rawResolve, rawReject) => {\n if (this.timeoutIds.validations[validateObj.cause]) {\n clearTimeout(this.timeoutIds.validations[validateObj.cause]!)\n }\n\n this.timeoutIds.validations[validateObj.cause] = setTimeout(\n async () => {\n if (controller.signal.aborted) return rawResolve(undefined)\n try {\n rawResolve(\n await this.runValidator({\n validate: validateObj.validate,\n value: {\n value: field.store.state.value,\n fieldApi: field,\n signal: controller.signal,\n validationSource: 'field',\n },\n type: 'validateAsync',\n }),\n )\n } catch (e) {\n rawReject(e)\n }\n },\n validateObj.debounceMs,\n )\n })\n } catch (e: unknown) {\n rawError = e as ValidationError\n }\n if (controller.signal.aborted) return resolve(undefined)\n\n const fieldLevelError = normalizeError(rawError)\n const formLevelError =\n asyncFormValidationResults[this.name]?.[errorMapKey]\n\n const { newErrorValue, newSource } =\n determineFieldLevelErrorSourceAndValue({\n formLevelError,\n fieldLevelError,\n })\n\n field.setMeta((prev) => {\n return {\n ...prev,\n errorMap: {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n ...prev?.errorMap,\n [errorMapKey]: newErrorValue,\n },\n errorSourceMap: {\n ...prev.errorSourceMap,\n [errorMapKey]: newSource,\n },\n }\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 validateFieldAsyncFn(this, validateObj, validatesPromises)\n }\n for (const fieldValitateObj of linkedFieldValidates) {\n if (!fieldValitateObj.validate) continue\n validateFieldAsyncFn(\n fieldValitateObj.field,\n fieldValitateObj,\n linkedPromises,\n )\n }\n\n let results: ValidationError[] = []\n if (validatesPromises.length || linkedPromises.length) {\n results = await Promise.all(validatesPromises)\n await Promise.all(linkedPromises)\n }\n\n this.setMeta((prev) => ({ ...prev, isValidating: false }))\n\n for (const linkedField of linkedFields) {\n linkedField.setMeta((prev) => ({ ...prev, isValidating: false }))\n }\n\n return results.filter(Boolean)\n }\n\n /**\n * Validates the field value.\n */\n validate = (\n cause: ValidationCause,\n opts?: { skipFormValidation?: boolean },\n ): ValidationError[] | Promise<ValidationError[]> => {\n // If the field is pristine, do not validate\n if (!this.state.meta.isTouched) return []\n\n // Attempt to sync validate first\n const { fieldsErrorMap } = opts?.skipFormValidation\n ? { fieldsErrorMap: {} as never }\n : this.form.validateSync(cause)\n const { hasErrored } = this.validateSync(\n cause,\n fieldsErrorMap[this.name] ?? {},\n )\n\n if (hasErrored && !this.options.asyncAlways) {\n this.getInfo().validationMetaMap[\n getErrorMapKey(cause)\n ]?.lastAbortController.abort()\n return this.state.meta.errors\n }\n\n // No error? Attempt async validation\n const formValidationResultPromise = opts?.skipFormValidation\n ? Promise.resolve({})\n : this.form.validateAsync(cause)\n return this.validateAsync(cause, formValidationResultPromise)\n }\n\n /**\n * Handles the change event.\n */\n handleChange = (updater: Updater<TData>) => {\n this.setValue(updater)\n }\n\n /**\n * Handles the blur event.\n */\n handleBlur = () => {\n const prevTouched = this.state.meta.isTouched\n if (!prevTouched) {\n this.setMeta((prev) => ({ ...prev, isTouched: true }))\n this.validate('change')\n }\n if (!this.state.meta.isBlurred) {\n this.setMeta((prev) => ({ ...prev, isBlurred: true }))\n }\n this.validate('blur')\n\n this.triggerOnBlurListener()\n }\n\n /**\n * Updates the field's errorMap\n */\n setErrorMap(errorMap: ValidationErrorMap) {\n this.setMeta(\n (prev) =>\n ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n ...errorMap,\n },\n }) as never,\n )\n }\n\n /**\n * Parses the field's value with the given schema and returns\n * issues (if any). This method does NOT set any internal errors.\n * @param schema The standard schema to parse this field's value with.\n */\n parseValueWithSchema = (schema: StandardSchemaV1<TData, unknown>) => {\n return standardSchemaValidators.validate(\n { value: this.state.value, validationSource: 'field' },\n schema,\n )\n }\n\n /**\n * Parses the field's value with the given schema and returns\n * issues (if any). This method does NOT set any internal errors.\n * @param schema The standard schema to parse this field's value with.\n */\n parseValueWithSchemaAsync = (schema: StandardSchemaV1<TData, unknown>) => {\n return standardSchemaValidators.validateAsync(\n { value: this.state.value, validationSource: 'field' },\n schema,\n )\n }\n\n private triggerOnBlurListener() {\n const formDebounceMs = this.form.options.listeners?.onBlurDebounceMs\n if (formDebounceMs && formDebounceMs > 0) {\n if (this.timeoutIds.formListeners.blur) {\n clearTimeout(this.timeoutIds.formListeners.blur)\n }\n\n this.timeoutIds.formListeners.blur = setTimeout(() => {\n this.form.options.listeners?.onBlur?.({\n formApi: this.form,\n fieldApi: this,\n })\n }, formDebounceMs)\n } else {\n this.form.options.listeners?.onBlur?.({\n formApi: this.form,\n fieldApi: this,\n })\n }\n\n const fieldDebounceMs = this.options.listeners?.onBlurDebounceMs\n if (fieldDebounceMs && fieldDebounceMs > 0) {\n if (this.timeoutIds.listeners.blur) {\n clearTimeout(this.timeoutIds.listeners.blur)\n }\n\n this.timeoutIds.listeners.blur = setTimeout(() => {\n this.options.listeners?.onBlur?.({\n value: this.state.value,\n fieldApi: this,\n })\n }, fieldDebounceMs)\n } else {\n this.options.listeners?.onBlur?.({\n value: this.state.value,\n fieldApi: this,\n })\n }\n }\n\n private triggerOnChangeListener() {\n const formDebounceMs = this.form.options.listeners?.onChangeDebounceMs\n if (formDebounceMs && formDebounceMs > 0) {\n if (this.timeoutIds.formListeners.blur) {\n clearTimeout(this.timeoutIds.formListeners.blur)\n }\n\n this.timeoutIds.formListeners.blur = setTimeout(() => {\n this.form.options.listeners?.onChange?.({\n formApi: this.form,\n fieldApi: this,\n })\n }, formDebounceMs)\n } else {\n this.form.options.listeners?.onChange?.({\n formApi: this.form,\n fieldApi: 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 fieldApi: this,\n })\n }, fieldDebounceMs)\n } else {\n this.options.listeners?.onChange?.({\n value: this.state.value,\n fieldApi: this,\n })\n }\n }\n}\n\nfunction normalizeError(rawError?: ValidationError) {\n if (rawError) {\n return rawError\n }\n\n return undefined\n}\n\nfunction getErrorMapKey(cause: ValidationCause) {\n switch (cause) {\n case 'submit':\n return 'onSubmit'\n case 'blur':\n return 'onBlur'\n case 'mount':\n return 'onMount'\n case 'server':\n return 'onServer'\n case 'change':\n default:\n return 'onChange'\n }\n}\n"],"names":["opts","_a","_b"],"mappings":"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"}
1
+ {"version":3,"file":"FieldApi.js","sources":["../../src/FieldApi.ts"],"sourcesContent":["import { Derived, batch } from '@tanstack/store'\nimport {\n isStandardSchemaValidator,\n standardSchemaValidators,\n} from './standardSchemaValidator'\nimport { defaultFieldMeta } from './metaHelper'\nimport {\n determineFieldLevelErrorSourceAndValue,\n getAsyncValidatorArray,\n getBy,\n getSyncValidatorArray,\n} from './utils'\nimport type { DeepKeys, DeepValue, UnwrapOneLevelOfArray } from './util-types'\nimport type {\n StandardSchemaV1,\n StandardSchemaV1Issue,\n TStandardSchemaValidatorValue,\n} from './standardSchemaValidator'\nimport type {\n FieldInfo,\n FormApi,\n FormAsyncValidateOrFn,\n FormValidateAsyncFn,\n FormValidateFn,\n FormValidateOrFn,\n} from './FormApi'\nimport type {\n ListenerCause,\n UpdateMetaOptions,\n ValidationCause,\n ValidationError,\n ValidationErrorMap,\n ValidationErrorMapSource,\n} from './types'\nimport type { AsyncValidator, SyncValidator, Updater } from './utils'\n\n/**\n * @private\n */\n// TODO: Add the `Unwrap` type to the errors\ntype FieldErrorMapFromValidator<\n TFormData,\n TName extends DeepKeys<TFormData>,\n TData extends DeepValue<TFormData, TName>,\n TOnMount extends undefined | FieldValidateOrFn<TFormData, TName, TData>,\n TOnChange extends undefined | FieldValidateOrFn<TFormData, TName, TData>,\n TOnChangeAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TFormData, TName, TData>,\n TOnBlur extends undefined | FieldValidateOrFn<TFormData, TName, TData>,\n TOnBlurAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TFormData, TName, TData>,\n TOnSubmit extends undefined | FieldValidateOrFn<TFormData, TName, TData>,\n TOnSubmitAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TFormData, TName, TData>,\n> = Partial<\n Record<\n DeepKeys<TFormData>,\n ValidationErrorMap<\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync\n >\n >\n>\n\n/**\n * @private\n */\nexport type FieldValidateFn<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> = (props: {\n value: TData\n fieldApi: FieldApi<\n TParentData,\n TName,\n TData,\n // This is technically an edge-type; which we try to keep non-`any`, but in this case\n // It's referring to an inaccessible type from the field validate function inner types, so it's not a big deal\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n >\n}) => unknown\n\n/**\n * @private\n */\nexport type FieldValidateOrFn<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> =\n | FieldValidateFn<TParentData, TName, TData>\n | StandardSchemaV1<TData, unknown>\n\ntype StandardBrandedSchemaV1<T> = T & { __standardSchemaV1: true }\n\ntype UnwrapFormValidateOrFnForInner<\n TValidateOrFn extends undefined | FormValidateOrFn<any>,\n> = [TValidateOrFn] extends [FormValidateFn<any>]\n ? ReturnType<TValidateOrFn>\n : [TValidateOrFn] extends [StandardSchemaV1<infer TOut, any>]\n ? StandardBrandedSchemaV1<TOut>\n : undefined\n\nexport type UnwrapFieldValidateOrFn<\n TName extends string,\n TValidateOrFn extends undefined | FieldValidateOrFn<any, any, any>,\n TFormValidateOrFn extends undefined | FormValidateOrFn<any>,\n> =\n | ([TFormValidateOrFn] extends [StandardSchemaV1<any, infer TStandardOut>]\n ? TName extends keyof TStandardOut\n ? StandardSchemaV1Issue[]\n : undefined\n : undefined)\n | (UnwrapFormValidateOrFnForInner<TFormValidateOrFn> extends infer TFormValidateVal\n ? TFormValidateVal extends { __standardSchemaV1: true }\n ? [DeepValue<TFormValidateVal, TName>] extends [never]\n ? undefined\n : StandardSchemaV1Issue[]\n : TFormValidateVal extends { fields: any }\n ? TName extends keyof TFormValidateVal['fields']\n ? TFormValidateVal['fields'][TName]\n : undefined\n : undefined\n : never)\n | ([TValidateOrFn] extends [FieldValidateFn<any, any, any>]\n ? ReturnType<TValidateOrFn>\n : [TValidateOrFn] extends [StandardSchemaV1<any, any>]\n ? // TODO: Check if `disableErrorFlat` is enabled, if so, return StandardSchemaV1Issue[][]\n StandardSchemaV1Issue[]\n : undefined)\n\n/**\n * @private\n */\nexport type FieldValidateAsyncFn<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> = (options: {\n value: TData\n fieldApi: FieldApi<\n TParentData,\n TName,\n TData,\n // This is technically an edge-type; which we try to keep non-`any`, but in this case\n // It's referring to an inaccessible type from the field validate function inner types, so it's not a big deal\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n >\n signal: AbortSignal\n}) => unknown | Promise<unknown>\n\n/**\n * @private\n */\nexport type FieldAsyncValidateOrFn<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> =\n | FieldValidateAsyncFn<TParentData, TName, TData>\n | StandardSchemaV1<TData, unknown>\n\ntype UnwrapFormAsyncValidateOrFnForInner<\n TValidateOrFn extends undefined | FormAsyncValidateOrFn<any>,\n> = [TValidateOrFn] extends [FormValidateAsyncFn<any>]\n ? Awaited<ReturnType<TValidateOrFn>>\n : [TValidateOrFn] extends [StandardSchemaV1<infer TOut, any>]\n ? StandardBrandedSchemaV1<TOut>\n : undefined\n\nexport type UnwrapFieldAsyncValidateOrFn<\n TName extends string,\n TValidateOrFn extends undefined | FieldAsyncValidateOrFn<any, any, any>,\n TFormValidateOrFn extends undefined | FormAsyncValidateOrFn<any>,\n> =\n | ([TFormValidateOrFn] extends [StandardSchemaV1<any, infer TStandardOut>]\n ? TName extends keyof TStandardOut\n ? StandardSchemaV1Issue[]\n : undefined\n : undefined)\n | (UnwrapFormAsyncValidateOrFnForInner<TFormValidateOrFn> extends infer TFormValidateVal\n ? TFormValidateVal extends { __standardSchemaV1: true }\n ? [DeepValue<TFormValidateVal, TName>] extends [never]\n ? undefined\n : StandardSchemaV1Issue[]\n : TFormValidateVal extends { fields: any }\n ? TName extends keyof TFormValidateVal['fields']\n ? TFormValidateVal['fields'][TName]\n : undefined\n : undefined\n : never)\n | ([TValidateOrFn] extends [FieldValidateAsyncFn<any, any, any>]\n ? Awaited<ReturnType<TValidateOrFn>>\n : [TValidateOrFn] extends [StandardSchemaV1<any, any>]\n ? // TODO: Check if `disableErrorFlat` is enabled, if so, return StandardSchemaV1Issue[][]\n StandardSchemaV1Issue[]\n : undefined)\n\n/**\n * @private\n */\nexport type FieldListenerFn<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> = (props: {\n value: TData\n fieldApi: FieldApi<\n TParentData,\n TName,\n TData,\n // This is technically an edge-type; which we try to keep non-`any`, but in this case\n // It's referring to an inaccessible type from the field listener function inner types, so it's not a big deal\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n >\n}) => void\n\nexport interface FieldValidators<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName>,\n TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChangeAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnBlurAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnSubmitAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n> {\n /**\n * An optional function, that runs on the mount event of input.\n */\n onMount?: TOnMount\n /**\n * An optional function, that runs on the change event of input.\n *\n * @example z.string().min(1)\n */\n onChange?: TOnChange\n /**\n * An optional property similar to `onChange` but async validation\n *\n * @example z.string().refine(async (val) => val.length > 3, { message: 'Testing 123' })\n */\n onChangeAsync?: TOnChangeAsync\n /**\n * An optional number to represent how long the `onChangeAsync` should wait before running\n *\n * If set to a number larger than 0, will debounce the async validation event by this length of time in milliseconds\n */\n onChangeAsyncDebounceMs?: number\n /**\n * An optional list of field names that should trigger this field's `onChange` and `onChangeAsync` events when its value changes\n */\n onChangeListenTo?: DeepKeys<TParentData>[]\n /**\n * An optional function, that runs on the blur event of input.\n *\n * @example z.string().min(1)\n */\n onBlur?: TOnBlur\n /**\n * An optional property similar to `onBlur` but async validation.\n *\n * @example z.string().refine(async (val) => val.length > 3, { message: 'Testing 123' })\n */\n onBlurAsync?: TOnBlurAsync\n\n /**\n * An optional number to represent how long the `onBlurAsync` should wait before running\n *\n * If set to a number larger than 0, will debounce the async validation event by this length of time in milliseconds\n */\n onBlurAsyncDebounceMs?: number\n /**\n * An optional list of field names that should trigger this field's `onBlur` and `onBlurAsync` events when its value changes\n */\n onBlurListenTo?: DeepKeys<TParentData>[]\n /**\n * An optional function, that runs on the submit event of form.\n *\n * @example z.string().min(1)\n */\n onSubmit?: TOnSubmit\n /**\n * An optional property similar to `onSubmit` but async validation.\n *\n * @example z.string().refine(async (val) => val.length > 3, { message: 'Testing 123' })\n */\n onSubmitAsync?: TOnSubmitAsync\n}\n\nexport interface FieldListeners<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> {\n onChange?: FieldListenerFn<TParentData, TName, TData>\n onChangeDebounceMs?: number\n onBlur?: FieldListenerFn<TParentData, TName, TData>\n onBlurDebounceMs?: number\n onMount?: FieldListenerFn<TParentData, TName, TData>\n onSubmit?: FieldListenerFn<TParentData, TName, TData>\n}\n\n/**\n * An object type representing the options for a field in a form.\n */\nexport interface FieldOptions<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName>,\n TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChangeAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnBlurAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnSubmitAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n> {\n /**\n * The field name. The type will be `DeepKeys<TParentData>` to ensure your name is a deep key of the parent dataset.\n */\n name: TName\n /**\n * An optional default value for the field.\n */\n defaultValue?: NoInfer<TData>\n /**\n * The default time to debounce async validation if there is not a more specific debounce time passed.\n */\n asyncDebounceMs?: number\n /**\n * If `true`, always run async validation, even if there are errors emitted during synchronous validation.\n */\n asyncAlways?: boolean\n /**\n * A list of validators to pass to the field\n */\n validators?: FieldValidators<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync\n >\n /**\n * An optional object with default metadata for the field.\n */\n defaultMeta?: Partial<\n FieldMeta<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n >\n >\n /**\n * A list of listeners which attach to the corresponding events\n */\n listeners?: FieldListeners<TParentData, TName, TData>\n /**\n * Disable the `flat(1)` operation on `field.errors`. This is useful if you want to keep the error structure as is. Not suggested for most use-cases.\n */\n disableErrorFlat?: boolean\n}\n\n/**\n * An object type representing the required options for the FieldApi class.\n */\nexport interface FieldApiOptions<\n in out TParentData,\n in out TName extends DeepKeys<TParentData>,\n in out TData extends DeepValue<TParentData, TName>,\n in out TOnMount extends\n | undefined\n | FieldValidateOrFn<TParentData, TName, TData>,\n in out TOnChange extends\n | undefined\n | FieldValidateOrFn<TParentData, TName, TData>,\n in out TOnChangeAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n in out TOnBlur extends\n | undefined\n | FieldValidateOrFn<TParentData, TName, TData>,\n in out TOnBlurAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n in out TOnSubmit extends\n | undefined\n | FieldValidateOrFn<TParentData, TName, TData>,\n in out TOnSubmitAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n in out TFormOnMount extends undefined | FormValidateOrFn<TParentData>,\n in out TFormOnChange extends undefined | FormValidateOrFn<TParentData>,\n in out TFormOnChangeAsync extends\n | undefined\n | FormAsyncValidateOrFn<TParentData>,\n in out TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,\n in out TFormOnBlurAsync extends\n | undefined\n | FormAsyncValidateOrFn<TParentData>,\n in out TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,\n in out TFormOnSubmitAsync extends\n | undefined\n | FormAsyncValidateOrFn<TParentData>,\n in out TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>,\n in out TParentSubmitMeta,\n> extends FieldOptions<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync\n > {\n form: FormApi<\n TParentData,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnServer,\n TParentSubmitMeta\n >\n}\n\nexport type FieldMetaBase<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName>,\n TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChangeAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnBlurAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnSubmitAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TFormOnMount extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChange extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,\n TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,\n TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n> = {\n /**\n * A flag indicating whether the field has been touched.\n */\n isTouched: boolean\n /**\n * A flag indicating whether the field has been blurred.\n */\n isBlurred: boolean\n /**\n * A flag that is `true` if the field's value has been modified by the user. Opposite of `isPristine`.\n */\n isDirty: boolean\n /**\n * A map of errors related to the field value.\n */\n errorMap: ValidationErrorMap<\n UnwrapFieldValidateOrFn<TName, TOnMount, TFormOnMount>,\n UnwrapFieldValidateOrFn<TName, TOnChange, TFormOnChange>,\n UnwrapFieldAsyncValidateOrFn<TName, TOnChangeAsync, TFormOnChangeAsync>,\n UnwrapFieldValidateOrFn<TName, TOnBlur, TFormOnBlur>,\n UnwrapFieldAsyncValidateOrFn<TName, TOnBlurAsync, TFormOnBlurAsync>,\n UnwrapFieldValidateOrFn<TName, TOnSubmit, TFormOnSubmit>,\n UnwrapFieldAsyncValidateOrFn<TName, TOnSubmitAsync, TFormOnSubmitAsync>\n >\n /**\n * @private allows tracking the source of the errors in the error map\n */\n errorSourceMap: ValidationErrorMapSource\n /**\n * A flag indicating whether the field is currently being validated.\n */\n isValidating: boolean\n}\n\nexport type AnyFieldMetaBase = FieldMetaBase<\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n>\n\nexport type FieldMetaDerived<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName>,\n TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChangeAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnBlurAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnSubmitAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TFormOnMount extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChange extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,\n TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,\n TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n> = {\n /**\n * An array of errors related to the field value.\n */\n errors: Array<\n | UnwrapOneLevelOfArray<\n UnwrapFieldValidateOrFn<TName, TOnMount, TFormOnMount>\n >\n | UnwrapOneLevelOfArray<\n UnwrapFieldValidateOrFn<TName, TOnChange, TFormOnChange>\n >\n | UnwrapOneLevelOfArray<\n UnwrapFieldAsyncValidateOrFn<TName, TOnChangeAsync, TFormOnChangeAsync>\n >\n | UnwrapOneLevelOfArray<\n UnwrapFieldValidateOrFn<TName, TOnBlur, TFormOnBlur>\n >\n | UnwrapOneLevelOfArray<\n UnwrapFieldAsyncValidateOrFn<TName, TOnBlurAsync, TFormOnBlurAsync>\n >\n | UnwrapOneLevelOfArray<\n UnwrapFieldValidateOrFn<TName, TOnSubmit, TFormOnSubmit>\n >\n | UnwrapOneLevelOfArray<\n UnwrapFieldAsyncValidateOrFn<TName, TOnSubmitAsync, TFormOnSubmitAsync>\n >\n >\n /**\n * A flag that is `true` if the field's value has not been modified by the user. Opposite of `isDirty`.\n */\n isPristine: boolean\n /**\n * A boolean indicating if the field is valid. Evaluates `true` if there are no field errors.\n */\n isValid: boolean\n}\n\nexport type AnyFieldMetaDerived = FieldMetaDerived<\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n>\n\n/**\n * An object type representing the metadata of a field in a form.\n */\nexport type FieldMeta<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName>,\n TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChangeAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnBlurAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnSubmitAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TFormOnMount extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChange extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,\n TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,\n TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n> = FieldMetaBase<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync\n> &\n FieldMetaDerived<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync\n >\n\nexport type AnyFieldMeta = FieldMeta<\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n>\n\n/**\n * An object type representing the state of a field.\n */\nexport type FieldState<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TData extends DeepValue<TParentData, TName>,\n TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnChangeAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnBlurAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>,\n TOnSubmitAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n TFormOnMount extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChange extends undefined | FormValidateOrFn<TParentData>,\n TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,\n TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,\n TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,\n> = {\n /**\n * The current value of the field.\n */\n value: TData\n /**\n * The current metadata of the field.\n */\n meta: FieldMeta<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync\n >\n}\n\n/**\n * @public\n *\n * A type representing the Field API with all generics set to `any` for convenience.\n */\nexport type AnyFieldApi = FieldApi<\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n>\n\n/**\n * A class representing the API for managing a form field.\n *\n * Normally, you will not need to create a new `FieldApi` instance directly.\n * Instead, you will use a framework hook/function like `useField` or `createField`\n * to create a new instance for you that uses your framework's reactivity model.\n * However, if you need to create a new instance manually, you can do so by calling\n * the `new FieldApi` constructor.\n */\nexport class FieldApi<\n in out TParentData,\n in out TName extends DeepKeys<TParentData>,\n in out TData extends DeepValue<TParentData, TName>,\n in out TOnMount extends\n | undefined\n | FieldValidateOrFn<TParentData, TName, TData>,\n in out TOnChange extends\n | undefined\n | FieldValidateOrFn<TParentData, TName, TData>,\n in out TOnChangeAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n in out TOnBlur extends\n | undefined\n | FieldValidateOrFn<TParentData, TName, TData>,\n in out TOnBlurAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n in out TOnSubmit extends\n | undefined\n | FieldValidateOrFn<TParentData, TName, TData>,\n in out TOnSubmitAsync extends\n | undefined\n | FieldAsyncValidateOrFn<TParentData, TName, TData>,\n in out TFormOnMount extends undefined | FormValidateOrFn<TParentData>,\n in out TFormOnChange extends undefined | FormValidateOrFn<TParentData>,\n in out TFormOnChangeAsync extends\n | undefined\n | FormAsyncValidateOrFn<TParentData>,\n in out TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,\n in out TFormOnBlurAsync extends\n | undefined\n | FormAsyncValidateOrFn<TParentData>,\n in out TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,\n in out TFormOnSubmitAsync extends\n | undefined\n | FormAsyncValidateOrFn<TParentData>,\n in out TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>,\n in out TParentSubmitMeta,\n> {\n /**\n * A reference to the form API instance.\n */\n form: FieldApiOptions<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnServer,\n TParentSubmitMeta\n >['form']\n /**\n * The field name.\n */\n name!: DeepKeys<TParentData>\n /**\n * The field options.\n */\n options: FieldApiOptions<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnServer,\n TParentSubmitMeta\n > = {} as any\n /**\n * The field state store.\n */\n store!: Derived<\n FieldState<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync\n >\n >\n /**\n * The current field state.\n */\n get state() {\n return this.store.state\n }\n timeoutIds: {\n validations: Record<ValidationCause, ReturnType<typeof setTimeout> | null>\n listeners: Record<ListenerCause, ReturnType<typeof setTimeout> | null>\n formListeners: Record<ListenerCause, ReturnType<typeof setTimeout> | null>\n }\n\n /**\n * Initializes a new `FieldApi` instance.\n */\n constructor(\n opts: FieldApiOptions<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnServer,\n TParentSubmitMeta\n >,\n ) {\n this.form = opts.form as never\n this.name = opts.name as never\n this.timeoutIds = {\n validations: {} as Record<ValidationCause, never>,\n listeners: {} as Record<ListenerCause, never>,\n formListeners: {} as Record<ListenerCause, never>,\n }\n\n this.store = new Derived({\n deps: [this.form.store],\n fn: () => {\n const value = this.form.getFieldValue(this.name)\n const meta = this.form.getFieldMeta(this.name) ?? {\n ...defaultFieldMeta,\n ...opts.defaultMeta,\n }\n\n return {\n value,\n meta,\n } as FieldState<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync\n >\n },\n })\n\n this.options = opts as never\n }\n\n /**\n * @private\n */\n runValidator<\n TValue extends TStandardSchemaValidatorValue<TData> & {\n fieldApi: AnyFieldApi\n },\n TType extends 'validate' | 'validateAsync',\n >(props: {\n validate: TType extends 'validate'\n ? FieldValidateOrFn<any, any, any>\n : FieldAsyncValidateOrFn<any, any, any>\n value: TValue\n type: TType\n // When `api` is 'field', the return type cannot be `FormValidationError`\n }): unknown {\n if (isStandardSchemaValidator(props.validate)) {\n return standardSchemaValidators[props.type](\n props.value,\n props.validate,\n ) as never\n }\n\n return (props.validate as FieldValidateFn<any, any>)(props.value) as never\n }\n\n /**\n * Mounts the field instance to the form.\n */\n mount = () => {\n const cleanup = this.store.mount()\n\n if ((this.options.defaultValue as unknown) !== undefined) {\n this.form.setFieldValue(this.name, this.options.defaultValue as never, {\n dontUpdateMeta: true,\n })\n }\n\n const info = this.getInfo()\n info.instance = this as never\n\n this.update(this.options as never)\n const { onMount } = this.options.validators || {}\n\n if (onMount) {\n const error = this.runValidator({\n validate: onMount,\n value: {\n value: this.state.value,\n fieldApi: this,\n validationSource: 'field',\n },\n type: 'validate',\n })\n if (error) {\n this.setMeta(\n (prev) =>\n ({\n ...prev,\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n errorMap: { ...prev?.errorMap, onMount: error },\n errorSourceMap: {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n ...prev?.errorSourceMap,\n onMount: 'field',\n },\n }) as never,\n )\n }\n }\n\n this.options.listeners?.onMount?.({\n value: this.state.value,\n fieldApi: this,\n })\n\n return cleanup\n }\n\n /**\n * Updates the field instance with new options.\n */\n update = (\n opts: FieldApiOptions<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync,\n TFormOnServer,\n TParentSubmitMeta\n >,\n ) => {\n this.options = opts as never\n\n const nameHasChanged = this.name !== opts.name\n this.name = opts.name\n\n // Default Value\n if ((this.state.value as unknown) === undefined) {\n const formDefault = getBy(opts.form.options.defaultValues, opts.name)\n\n const defaultValue = (opts.defaultValue as unknown) ?? formDefault\n\n // The name is dynamic in array fields. It changes when the user performs operations like removing or reordering.\n // In this case, we don't want to force a default value if the store managed to find an existing value.\n if (nameHasChanged) {\n this.setValue((val) => (val as unknown) || defaultValue, {\n dontUpdateMeta: true,\n })\n } else if (defaultValue !== undefined) {\n this.setValue(defaultValue as never, {\n dontUpdateMeta: true,\n })\n }\n }\n\n // Default Meta\n if (this.form.getFieldMeta(this.name) === undefined) {\n this.setMeta(this.state.meta)\n }\n }\n\n /**\n * Gets the current field value.\n * @deprecated Use `field.state.value` instead.\n */\n getValue = (): TData => {\n return this.form.getFieldValue(this.name) as TData\n }\n\n /**\n * Sets the field value and run the `change` validator.\n */\n setValue = (updater: Updater<TData>, options?: UpdateMetaOptions) => {\n this.form.setFieldValue(this.name, updater as never, options)\n\n this.triggerOnChangeListener()\n\n this.validate('change')\n }\n\n getMeta = () => this.store.state.meta\n\n /**\n * Sets the field metadata.\n */\n setMeta = (\n updater: Updater<\n FieldMetaBase<\n TParentData,\n TName,\n TData,\n TOnMount,\n TOnChange,\n TOnChangeAsync,\n TOnBlur,\n TOnBlurAsync,\n TOnSubmit,\n TOnSubmitAsync,\n TFormOnMount,\n TFormOnChange,\n TFormOnChangeAsync,\n TFormOnBlur,\n TFormOnBlurAsync,\n TFormOnSubmit,\n TFormOnSubmitAsync\n >\n >,\n ) => this.form.setFieldMeta(this.name, updater)\n\n /**\n * Gets the field information object.\n */\n getInfo = () => this.form.getFieldInfo(this.name)\n\n /**\n * Pushes a new value to the field.\n */\n pushValue = (\n value: TData extends any[] ? TData[number] : never,\n opts?: UpdateMetaOptions,\n ) => {\n this.form.pushFieldValue(this.name, value as any, opts)\n\n this.triggerOnChangeListener()\n }\n\n /**\n * Inserts a value at the specified index, shifting the subsequent values to the right.\n */\n insertValue = (\n index: number,\n value: TData extends any[] ? TData[number] : never,\n opts?: UpdateMetaOptions,\n ) => {\n this.form.insertFieldValue(this.name, index, value as any, opts)\n\n this.triggerOnChangeListener()\n }\n\n /**\n * Replaces a value at the specified index.\n */\n replaceValue = (\n index: number,\n value: TData extends any[] ? TData[number] : never,\n opts?: UpdateMetaOptions,\n ) => {\n this.form.replaceFieldValue(this.name, index, value as any, opts)\n\n this.triggerOnChangeListener()\n }\n\n /**\n * Removes a value at the specified index.\n */\n removeValue = (index: number, opts?: UpdateMetaOptions) => {\n this.form.removeFieldValue(this.name, index, opts)\n\n this.triggerOnChangeListener()\n }\n\n /**\n * Swaps the values at the specified indices.\n */\n swapValues = (aIndex: number, bIndex: number, opts?: UpdateMetaOptions) => {\n this.form.swapFieldValues(this.name, aIndex, bIndex, opts)\n\n this.triggerOnChangeListener()\n }\n\n /**\n * Moves the value at the first specified index to the second specified index.\n */\n moveValue = (aIndex: number, bIndex: number, opts?: UpdateMetaOptions) => {\n this.form.moveFieldValues(this.name, aIndex, bIndex, opts)\n\n this.triggerOnChangeListener()\n }\n\n /**\n * @private\n */\n getLinkedFields = (cause: ValidationCause) => {\n const fields = Object.values(this.form.fieldInfo) as FieldInfo<any>[]\n\n const linkedFields: AnyFieldApi[] = []\n for (const field of fields) {\n if (!field.instance) continue\n const { onChangeListenTo, onBlurListenTo } =\n field.instance.options.validators || {}\n if (cause === 'change' && onChangeListenTo?.includes(this.name)) {\n linkedFields.push(field.instance)\n }\n if (cause === 'blur' && onBlurListenTo?.includes(this.name as string)) {\n linkedFields.push(field.instance)\n }\n }\n\n return linkedFields\n }\n\n /**\n * @private\n */\n validateSync = (\n cause: ValidationCause,\n errorFromForm: ValidationErrorMap,\n ) => {\n const validates = getSyncValidatorArray(cause, this.options)\n\n const linkedFields = this.getLinkedFields(cause)\n const linkedFieldValidates = linkedFields.reduce(\n (acc, field) => {\n const fieldValidates = getSyncValidatorArray(cause, field.options)\n fieldValidates.forEach((validate) => {\n ;(validate as any).field = field\n })\n return acc.concat(fieldValidates as never)\n },\n [] as Array<\n SyncValidator<any> & {\n field: AnyFieldApi\n }\n >,\n )\n\n // Needs type cast as eslint errantly believes this is always falsy\n let hasErrored = false as boolean\n\n batch(() => {\n const validateFieldFn = (\n field: AnyFieldApi,\n validateObj: SyncValidator<any>,\n ) => {\n const errorMapKey = getErrorMapKey(validateObj.cause)\n\n const fieldLevelError = validateObj.validate\n ? normalizeError(\n field.runValidator({\n validate: validateObj.validate,\n value: {\n value: field.store.state.value,\n validationSource: 'field',\n fieldApi: field,\n },\n type: 'validate',\n }),\n )\n : undefined\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 (field.state.meta.errorMap?.[errorMapKey] !== newErrorValue) {\n field.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\n for (const validateObj of validates) {\n validateFieldFn(this, validateObj)\n }\n for (const fieldValitateObj of linkedFieldValidates) {\n if (!fieldValitateObj.validate) continue\n validateFieldFn(fieldValitateObj.field, fieldValitateObj)\n }\n })\n\n /**\n * when we have an error for onSubmit in the state, we want\n * to clear the error as soon as the user enters a valid value in the field\n */\n const submitErrKey = getErrorMapKey('submit')\n\n if (\n // 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 ) => {\n const validates = getAsyncValidatorArray(cause, this.options)\n\n // Get the field-specific error messages that are coming from the form's validator\n const asyncFormValidationResults = await formValidationResultPromise\n\n const linkedFields = this.getLinkedFields(cause)\n const linkedFieldValidates = linkedFields.reduce(\n (acc, field) => {\n const fieldValidates = getAsyncValidatorArray(cause, field.options)\n fieldValidates.forEach((validate) => {\n ;(validate as any).field = field\n })\n return acc.concat(fieldValidates as never)\n },\n [] as Array<\n AsyncValidator<any> & {\n field: AnyFieldApi\n }\n >,\n )\n\n if (!this.state.meta.isValidating) {\n this.setMeta((prev) => ({ ...prev, isValidating: true }))\n }\n\n for (const linkedField of linkedFields) {\n linkedField.setMeta((prev) => ({ ...prev, isValidating: true }))\n }\n\n /**\n * We have to use a for loop and generate our promises this way, otherwise it won't be sync\n * when there are no validators needed to be run\n */\n const validatesPromises: Promise<ValidationError | undefined>[] = []\n const linkedPromises: Promise<ValidationError | undefined>[] = []\n\n const validateFieldAsyncFn = (\n field: AnyFieldApi,\n validateObj: AsyncValidator<any>,\n promises: Promise<ValidationError | undefined>[],\n ) => {\n const errorMapKey = getErrorMapKey(validateObj.cause)\n const fieldValidatorMeta = field.getInfo().validationMetaMap[errorMapKey]\n\n fieldValidatorMeta?.lastAbortController.abort()\n const controller = new AbortController()\n\n this.getInfo().validationMetaMap[errorMapKey] = {\n lastAbortController: controller,\n }\n\n promises.push(\n new Promise<ValidationError | undefined>(async (resolve) => {\n let rawError!: ValidationError | undefined\n try {\n rawError = await new Promise((rawResolve, rawReject) => {\n if (this.timeoutIds.validations[validateObj.cause]) {\n clearTimeout(this.timeoutIds.validations[validateObj.cause]!)\n }\n\n this.timeoutIds.validations[validateObj.cause] = setTimeout(\n async () => {\n if (controller.signal.aborted) return rawResolve(undefined)\n try {\n rawResolve(\n await this.runValidator({\n validate: validateObj.validate,\n value: {\n value: field.store.state.value,\n fieldApi: field,\n signal: controller.signal,\n validationSource: 'field',\n },\n type: 'validateAsync',\n }),\n )\n } catch (e) {\n rawReject(e)\n }\n },\n validateObj.debounceMs,\n )\n })\n } catch (e: unknown) {\n rawError = e as ValidationError\n }\n if (controller.signal.aborted) return resolve(undefined)\n\n const fieldLevelError = normalizeError(rawError)\n const formLevelError =\n asyncFormValidationResults[this.name]?.[errorMapKey]\n\n const { newErrorValue, newSource } =\n determineFieldLevelErrorSourceAndValue({\n formLevelError,\n fieldLevelError,\n })\n\n field.setMeta((prev) => {\n return {\n ...prev,\n errorMap: {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n ...prev?.errorMap,\n [errorMapKey]: newErrorValue,\n },\n errorSourceMap: {\n ...prev.errorSourceMap,\n [errorMapKey]: newSource,\n },\n }\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 validateFieldAsyncFn(this, validateObj, validatesPromises)\n }\n for (const fieldValitateObj of linkedFieldValidates) {\n if (!fieldValitateObj.validate) continue\n validateFieldAsyncFn(\n fieldValitateObj.field,\n fieldValitateObj,\n linkedPromises,\n )\n }\n\n let results: ValidationError[] = []\n if (validatesPromises.length || linkedPromises.length) {\n results = await Promise.all(validatesPromises)\n await Promise.all(linkedPromises)\n }\n\n this.setMeta((prev) => ({ ...prev, isValidating: false }))\n\n for (const linkedField of linkedFields) {\n linkedField.setMeta((prev) => ({ ...prev, isValidating: false }))\n }\n\n return results.filter(Boolean)\n }\n\n /**\n * Validates the field value.\n */\n validate = (\n cause: ValidationCause,\n opts?: { skipFormValidation?: boolean },\n ): ValidationError[] | Promise<ValidationError[]> => {\n // If the field is pristine, do not validate\n if (!this.state.meta.isTouched) return []\n\n // Attempt to sync validate first\n const { fieldsErrorMap } = opts?.skipFormValidation\n ? { fieldsErrorMap: {} as never }\n : this.form.validateSync(cause)\n const { hasErrored } = this.validateSync(\n cause,\n fieldsErrorMap[this.name] ?? {},\n )\n\n if (hasErrored && !this.options.asyncAlways) {\n this.getInfo().validationMetaMap[\n getErrorMapKey(cause)\n ]?.lastAbortController.abort()\n return this.state.meta.errors\n }\n\n // No error? Attempt async validation\n const formValidationResultPromise = opts?.skipFormValidation\n ? Promise.resolve({})\n : this.form.validateAsync(cause)\n return this.validateAsync(cause, formValidationResultPromise)\n }\n\n /**\n * Handles the change event.\n */\n handleChange = (updater: Updater<TData>) => {\n this.setValue(updater)\n }\n\n /**\n * Handles the blur event.\n */\n handleBlur = () => {\n const prevTouched = this.state.meta.isTouched\n if (!prevTouched) {\n this.setMeta((prev) => ({ ...prev, isTouched: true }))\n this.validate('change')\n }\n if (!this.state.meta.isBlurred) {\n this.setMeta((prev) => ({ ...prev, isBlurred: true }))\n }\n this.validate('blur')\n\n this.triggerOnBlurListener()\n }\n\n /**\n * Updates the field's errorMap\n */\n setErrorMap(\n errorMap: ValidationErrorMap<\n UnwrapFieldValidateOrFn<TName, TOnMount, TFormOnMount>,\n UnwrapFieldValidateOrFn<TName, TOnChange, TFormOnChange>,\n UnwrapFieldAsyncValidateOrFn<TName, TOnChangeAsync, TFormOnChangeAsync>,\n UnwrapFieldValidateOrFn<TName, TOnBlur, TFormOnBlur>,\n UnwrapFieldAsyncValidateOrFn<TName, TOnBlurAsync, TFormOnBlurAsync>,\n UnwrapFieldValidateOrFn<TName, TOnSubmit, TFormOnSubmit>,\n UnwrapFieldAsyncValidateOrFn<TName, TOnSubmitAsync, TFormOnSubmitAsync>\n >,\n ) {\n this.setMeta((prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n ...errorMap,\n },\n }))\n }\n\n /**\n * Parses the field's value with the given schema and returns\n * issues (if any). This method does NOT set any internal errors.\n * @param schema The standard schema to parse this field's value with.\n */\n parseValueWithSchema = (schema: StandardSchemaV1<TData, unknown>) => {\n return standardSchemaValidators.validate(\n { value: this.state.value, validationSource: 'field' },\n schema,\n )\n }\n\n /**\n * Parses the field's value with the given schema and returns\n * issues (if any). This method does NOT set any internal errors.\n * @param schema The standard schema to parse this field's value with.\n */\n parseValueWithSchemaAsync = (schema: StandardSchemaV1<TData, unknown>) => {\n return standardSchemaValidators.validateAsync(\n { value: this.state.value, validationSource: 'field' },\n schema,\n )\n }\n\n private triggerOnBlurListener() {\n const formDebounceMs = this.form.options.listeners?.onBlurDebounceMs\n if (formDebounceMs && formDebounceMs > 0) {\n if (this.timeoutIds.formListeners.blur) {\n clearTimeout(this.timeoutIds.formListeners.blur)\n }\n\n this.timeoutIds.formListeners.blur = setTimeout(() => {\n this.form.options.listeners?.onBlur?.({\n formApi: this.form,\n fieldApi: this,\n })\n }, formDebounceMs)\n } else {\n this.form.options.listeners?.onBlur?.({\n formApi: this.form,\n fieldApi: this,\n })\n }\n\n const fieldDebounceMs = this.options.listeners?.onBlurDebounceMs\n if (fieldDebounceMs && fieldDebounceMs > 0) {\n if (this.timeoutIds.listeners.blur) {\n clearTimeout(this.timeoutIds.listeners.blur)\n }\n\n this.timeoutIds.listeners.blur = setTimeout(() => {\n this.options.listeners?.onBlur?.({\n value: this.state.value,\n fieldApi: this,\n })\n }, fieldDebounceMs)\n } else {\n this.options.listeners?.onBlur?.({\n value: this.state.value,\n fieldApi: this,\n })\n }\n }\n\n private triggerOnChangeListener() {\n const formDebounceMs = this.form.options.listeners?.onChangeDebounceMs\n if (formDebounceMs && formDebounceMs > 0) {\n if (this.timeoutIds.formListeners.blur) {\n clearTimeout(this.timeoutIds.formListeners.blur)\n }\n\n this.timeoutIds.formListeners.blur = setTimeout(() => {\n this.form.options.listeners?.onChange?.({\n formApi: this.form,\n fieldApi: this,\n })\n }, formDebounceMs)\n } else {\n this.form.options.listeners?.onChange?.({\n formApi: this.form,\n fieldApi: 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 fieldApi: this,\n })\n }, fieldDebounceMs)\n } else {\n this.options.listeners?.onChange?.({\n value: this.state.value,\n fieldApi: this,\n })\n }\n }\n}\n\nfunction normalizeError(rawError?: ValidationError) {\n if (rawError) {\n return rawError\n }\n\n return undefined\n}\n\nfunction getErrorMapKey(cause: ValidationCause) {\n switch (cause) {\n case 'submit':\n return 'onSubmit'\n case 'blur':\n return 'onBlur'\n case 'mount':\n return 'onMount'\n case 'server':\n return 'onServer'\n case 'change':\n default:\n return 'onChange'\n }\n}\n"],"names":["opts","_a","_b"],"mappings":"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"}
@@ -246,7 +246,7 @@ export type DerivedFormState<in out TFormData, in out TOnMount extends undefined
246
246
  */
247
247
  isFieldsValidating: boolean;
248
248
  /**
249
- * A boolean indicating if all the form fields are valid.
249
+ * A boolean indicating if all the form fields are valid. Evaluates `true` if there are no field errors.
250
250
  */
251
251
  isFieldsValid: boolean;
252
252
  /**
@@ -258,15 +258,15 @@ export type DerivedFormState<in out TFormData, in out TOnMount extends undefined
258
258
  */
259
259
  isBlurred: boolean;
260
260
  /**
261
- * A boolean indicating if any of the form's fields' values have been modified by the user. `True` if the user have modified at least one of the fields. Opposite of `isPristine`.
261
+ * 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`.
262
262
  */
263
263
  isDirty: boolean;
264
264
  /**
265
- * A boolean indicating if none of the form's fields' values have been modified by the user. `True` if the user have not modified any of the fields. Opposite of `isDirty`.
265
+ * 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`.
266
266
  */
267
267
  isPristine: boolean;
268
268
  /**
269
- * A boolean indicating if the form and all its fields are valid.
269
+ * A boolean indicating if the form and all its fields are valid. Evaluates `true` if there are no errors.
270
270
  */
271
271
  isValid: boolean;
272
272
  /**
@@ -388,7 +388,7 @@ export declare class FormApi<in out TFormData, in out TOnMount extends undefined
388
388
  /**
389
389
  * Updates the metadata of the specified field.
390
390
  */
391
- setFieldMeta: <TField extends DeepKeys<TFormData>>(field: TField, updater: Updater<AnyFieldMeta>) => void;
391
+ setFieldMeta: <TField extends DeepKeys<TFormData>>(field: TField, updater: Updater<AnyFieldMetaBase>) => void;
392
392
  /**
393
393
  * resets every field's meta
394
394
  */
@@ -426,7 +426,7 @@ export declare class FormApi<in out TFormData, in out TOnMount extends undefined
426
426
  /**
427
427
  * Updates the form's errorMap
428
428
  */
429
- setErrorMap(errorMap: ValidationErrorMap<TOnMount, TOnChange, TOnChangeAsync, TOnBlur, TOnBlurAsync, TOnSubmit, TOnSubmitAsync>): void;
429
+ setErrorMap(errorMap: ValidationErrorMap<UnwrapFormValidateOrFn<TOnMount>, UnwrapFormValidateOrFn<TOnChange>, UnwrapFormAsyncValidateOrFn<TOnChangeAsync>, UnwrapFormValidateOrFn<TOnBlur>, UnwrapFormAsyncValidateOrFn<TOnBlurAsync>, UnwrapFormValidateOrFn<TOnSubmit>, UnwrapFormAsyncValidateOrFn<TOnSubmitAsync>, UnwrapFormAsyncValidateOrFn<TOnServer>>): void;
430
430
  /**
431
431
  * Returns form and field level errors
432
432
  */
@@ -614,7 +614,8 @@ class FormApi {
614
614
  }
615
615
  }
616
616
  const isFieldPristine = !currBaseVal.isDirty;
617
- if (prevFieldInfo && prevFieldInfo.isPristine === isFieldPristine && prevFieldInfo.errors === fieldErrors && currBaseVal === prevBaseVal) {
617
+ const isFieldValid = !isNonEmptyArray(fieldErrors ?? []);
618
+ if (prevFieldInfo && prevFieldInfo.isPristine === isFieldPristine && prevFieldInfo.isValid === isFieldValid && prevFieldInfo.errors === fieldErrors && currBaseVal === prevBaseVal) {
618
619
  fieldMeta[fieldName] = prevFieldInfo;
619
620
  originalMetaCount++;
620
621
  continue;
@@ -622,7 +623,8 @@ class FormApi {
622
623
  fieldMeta[fieldName] = {
623
624
  ...currBaseVal,
624
625
  errors: fieldErrors,
625
- isPristine: isFieldPristine
626
+ isPristine: isFieldPristine,
627
+ isValid: isFieldValid
626
628
  };
627
629
  }
628
630
  if (!Object.keys(currBaseStore.fieldMetaBase).length) return fieldMeta;
@@ -639,20 +641,21 @@ class FormApi {
639
641
  const prevVal = _prevVal;
640
642
  const prevBaseStore = prevDepVals == null ? void 0 : prevDepVals[0];
641
643
  const currBaseStore = currDepVals[0];
642
- const fieldMetaValues = Object.values(currBaseStore.fieldMetaBase);
643
- const isFieldsValidating = fieldMetaValues.some(
644
- (field) => field == null ? void 0 : field.isValidating
644
+ const currFieldMeta = currDepVals[1];
645
+ const fieldMetaValues = Object.values(currFieldMeta).filter(
646
+ Boolean
645
647
  );
646
- const isFieldsValid = !fieldMetaValues.some(
647
- (field) => (field == null ? void 0 : field.errorMap) && isNonEmptyArray(Object.values(field.errorMap).filter(Boolean))
648
+ const isFieldsValidating = fieldMetaValues.some(
649
+ (field) => field.isValidating
648
650
  );
649
- const isTouched = fieldMetaValues.some((field) => field == null ? void 0 : field.isTouched);
650
- const isBlurred = fieldMetaValues.some((field) => field == null ? void 0 : field.isBlurred);
651
+ const isFieldsValid = fieldMetaValues.every((field) => field.isValid);
652
+ const isTouched = fieldMetaValues.some((field) => field.isTouched);
653
+ const isBlurred = fieldMetaValues.some((field) => field.isBlurred);
651
654
  const shouldInvalidateOnMount = (
652
655
  // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
653
- isTouched && ((_a2 = currBaseStore == null ? void 0 : currBaseStore.errorMap) == null ? void 0 : _a2.onMount)
656
+ isTouched && ((_a2 = currBaseStore.errorMap) == null ? void 0 : _a2.onMount)
654
657
  );
655
- const isDirty = fieldMetaValues.some((field) => field == null ? void 0 : field.isDirty);
658
+ const isDirty = fieldMetaValues.some((field) => field.isDirty);
656
659
  const isPristine = !isDirty;
657
660
  const hasOnMountError = Boolean(
658
661
  // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
@@ -818,15 +821,13 @@ class FormApi {
818
821
  * Updates the form's errorMap
819
822
  */
820
823
  setErrorMap(errorMap) {
821
- this.baseStore.setState(
822
- (prev) => ({
823
- ...prev,
824
- errorMap: {
825
- ...prev.errorMap,
826
- ...errorMap
827
- }
828
- })
829
- );
824
+ this.baseStore.setState((prev) => ({
825
+ ...prev,
826
+ errorMap: {
827
+ ...prev.errorMap,
828
+ ...errorMap
829
+ }
830
+ }));
830
831
  }
831
832
  }
832
833
  function normalizeError(rawError) {