diff --git a/packages/form-core/src/FieldApi.ts b/packages/form-core/src/FieldApi.ts index ddb7c993c..a2d95f4ca 100644 --- a/packages/form-core/src/FieldApi.ts +++ b/packages/form-core/src/FieldApi.ts @@ -4,7 +4,12 @@ import { standardSchemaValidator, } from './standardSchemaValidator' import { getAsyncValidatorArray, getBy, getSyncValidatorArray } from './utils' -import type { FieldInfo, FieldsErrorMapFromValidator, FormApi } from './FormApi' +import type { + FieldInfo, + FieldsErrorMapFromValidator, + FormApi, + FormState, +} from './FormApi' import type { StandardSchemaV1 } from './standardSchemaValidator' import type { UpdateMetaOptions, @@ -116,6 +121,13 @@ export type FieldListenerFn< fieldApi: FieldApi }) => void +/** + * @private + */ +export type FieldMetaFn = ( + props: FormState, +) => FieldMetaExtension + export interface FieldValidators< TParentData, TName extends DeepKeys, @@ -285,6 +297,7 @@ export interface FieldListeners< export interface FieldOptions< TParentData, TName extends DeepKeys, + TMetaExtension extends object, TFieldValidator extends | Validator, unknown> | undefined = undefined, @@ -337,6 +350,7 @@ export interface FieldOptions< TFormValidator, TData > + meta?: FieldMetaFn } /** @@ -396,10 +410,15 @@ export type FieldMetaDerived = { isPristine: boolean } +export type FieldMetaExtension = + TMetaExtension + /** * An object type representing the metadata of a field in a form. */ -export type FieldMeta = FieldMetaBase & FieldMetaDerived +export type FieldMeta = FieldMetaBase & + FieldMetaDerived & + FieldMetaExtension /** * An object type representing the state of a field. @@ -597,6 +616,11 @@ export class FieldApi< fieldApi: this, }) + this.setMeta((prev) => ({ + ...prev, + ...this.options.meta?.(this.form.state), + })) + return cleanup } @@ -661,6 +685,8 @@ export class FieldApi< getMeta = () => this.store.state.meta + meta = this.store.state.meta + /** * Sets the field metadata. */