@tanstack/form-core 0.36.1 → 0.36.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -284,25 +284,16 @@ class FieldApi {
284
284
  this.validate = (cause) => {
285
285
  var _a;
286
286
  if (!this.state.meta.isTouched) return [];
287
- let validationErrorFromForm = {};
288
- let formValidationResultPromise = Promise.resolve({});
289
- try {
290
- const formValidationResult = this.form.validate(cause);
291
- if (formValidationResult instanceof Promise) {
292
- formValidationResultPromise = formValidationResult;
293
- } else {
294
- const fieldErrorFromForm = formValidationResult[this.name];
295
- if (fieldErrorFromForm) {
296
- validationErrorFromForm = fieldErrorFromForm;
297
- }
298
- }
299
- } catch (_) {
300
- }
301
- const { hasErrored } = this.validateSync(cause, validationErrorFromForm);
287
+ const { fieldsErrorMap } = this.form.validateSync(cause);
288
+ const { hasErrored } = this.validateSync(
289
+ cause,
290
+ fieldsErrorMap[this.name] ?? {}
291
+ );
302
292
  if (hasErrored && !this.options.asyncAlways) {
303
293
  (_a = this.getInfo().validationMetaMap[getErrorMapKey(cause)]) == null ? void 0 : _a.lastAbortController.abort();
304
294
  return this.state.meta.errors;
305
295
  }
296
+ const formValidationResultPromise = this.form.validateAsync(cause);
306
297
  return this.validateAsync(cause, formValidationResultPromise);
307
298
  };
308
299
  this.handleChange = (updater) => {
@@ -1 +1 @@
1
- {"version":3,"file":"FieldApi.cjs","sources":["../../src/FieldApi.ts"],"sourcesContent":["import { Store } from '@tanstack/store'\nimport { getAsyncValidatorArray, getBy, getSyncValidatorArray } from './utils'\nimport type { FieldInfo, FieldsErrorMapFromValidator, FormApi } from './FormApi'\nimport type {\n UpdateMetaOptions,\n ValidationCause,\n ValidationError,\n ValidationErrorMap,\n ValidationSource,\n Validator,\n} from './types'\nimport type { AsyncValidator, SyncValidator, Updater } from './utils'\nimport type { DeepKeys, DeepValue, NoInfer } from './util-types'\n\n/**\n * @private\n */\nexport type FieldValidateFn<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TFieldValidator extends\n | Validator<DeepValue<TParentData, TName>, unknown>\n | undefined = undefined,\n TFormValidator extends\n | Validator<TParentData, unknown>\n | undefined = undefined,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> = (props: {\n value: TData\n fieldApi: FieldApi<TParentData, TName, TFieldValidator, TFormValidator, TData>\n}) => ValidationError\n\n/**\n * @private\n */\nexport type FieldValidateOrFn<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TFieldValidator extends\n | Validator<DeepValue<TParentData, TName>, unknown>\n | undefined = undefined,\n TFormValidator extends\n | Validator<TParentData, unknown>\n | undefined = undefined,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> =\n TFieldValidator extends Validator<TData, infer TFN>\n ?\n | TFN\n | FieldValidateFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\n : TFormValidator extends Validator<TParentData, infer FFN>\n ?\n | FFN\n | FieldValidateFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\n : FieldValidateFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\n\n/**\n * @private\n */\nexport type FieldValidateAsyncFn<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TFieldValidator extends\n | Validator<DeepValue<TParentData, TName>, unknown>\n | undefined = undefined,\n TFormValidator extends\n | Validator<TParentData, unknown>\n | undefined = undefined,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> = (options: {\n value: TData\n fieldApi: FieldApi<TParentData, TName, TFieldValidator, TFormValidator, TData>\n signal: AbortSignal\n}) => ValidationError | Promise<ValidationError>\n\n/**\n * @private\n */\nexport type FieldAsyncValidateOrFn<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TFieldValidator extends\n | Validator<DeepValue<TParentData, TName>, unknown>\n | undefined = undefined,\n TFormValidator extends\n | Validator<TParentData, unknown>\n | undefined = undefined,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> =\n TFieldValidator extends Validator<TData, infer TFN>\n ?\n | TFN\n | FieldValidateAsyncFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\n : TFormValidator extends Validator<TParentData, infer FFN>\n ?\n | FFN\n | FieldValidateAsyncFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\n : FieldValidateAsyncFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\n\nexport interface FieldValidators<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TFieldValidator extends\n | Validator<DeepValue<TParentData, TName>, unknown>\n | undefined = undefined,\n TFormValidator extends\n | Validator<TParentData, unknown>\n | undefined = undefined,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> {\n /**\n * An optional function that takes a param of `formApi` which is a generic type of `TData` and `TParentData`\n */\n onMount?: FieldValidateOrFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\n /**\n * An optional property that takes a `ValidateFn` which is a generic of `TData` and `TParentData`.\n * If `validatorAdapter` is passed, this may also accept a property from the respective adapter\n *\n * @example z.string().min(1) // if `zodAdapter` is passed\n */\n onChange?: FieldValidateOrFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\n /**\n * An optional property similar to `onChange` but async validation. If `validatorAdapter`\n * is passed, this may also accept a property from the respective adapter\n *\n * @example z.string().refine(async (val) => val.length > 3, { message: 'Testing 123' }) // if `zodAdapter` is passed\n */\n onChangeAsync?: FieldAsyncValidateOrFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\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 * If `validatorAdapter` is passed, this may also accept a property from the respective adapter\n *\n * @example z.string().min(1) // if `zodAdapter` is passed\n */\n onBlur?: FieldValidateOrFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\n /**\n * An optional property similar to `onBlur` but async validation. If `validatorAdapter`\n * is passed, this may also accept a property from the respective adapter\n *\n * @example z.string().refine(async (val) => val.length > 3, { message: 'Testing 123' }) // if `zodAdapter` is passed\n */\n onBlurAsync?: FieldAsyncValidateOrFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\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 * If `validatorAdapter` is passed, this may also accept a property from the respective adapter\n *\n * @example z.string().min(1) // if `zodAdapter` is passed\n */\n onSubmit?: FieldValidateOrFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\n /**\n * An optional property similar to `onSubmit` but async validation. If `validatorAdapter`\n * is passed, this may also accept a property from the respective adapter\n *\n * @example z.string().refine(async (val) => val.length > 3, { message: 'Testing 123' }) // if `zodAdapter` is passed\n */\n onSubmitAsync?: FieldAsyncValidateOrFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\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 TFieldValidator extends\n | Validator<DeepValue<TParentData, TName>, unknown>\n | undefined = undefined,\n TFormValidator extends\n | Validator<TParentData, unknown>\n | undefined = undefined,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\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 validator provided by an extension, like `yupValidator` from `@tanstack/yup-form-adapter`\n */\n validatorAdapter?: TFieldValidator\n /**\n * A list of validators to pass to the field\n */\n validators?: FieldValidators<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\n /**\n * An optional object with default metadata for the field.\n */\n defaultMeta?: Partial<FieldMeta>\n}\n\n/**\n * An object type representing the required options for the FieldApi class.\n */\nexport interface FieldApiOptions<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TFieldValidator extends\n | Validator<DeepValue<TParentData, TName>, unknown>\n | undefined = undefined,\n TFormValidator extends\n | Validator<TParentData, unknown>\n | undefined = undefined,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> extends FieldOptions<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n > {\n form: FormApi<TParentData, TFormValidator>\n}\n\n/**\n * An object type representing the metadata of a field in a form.\n */\nexport type FieldMeta = {\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 not been modified by the user. Opposite of `isDirty`.\n */\n isPristine: 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 * An array of errors related to the field value.\n */\n errors: ValidationError[]\n /**\n * A map of errors related to the field value.\n */\n errorMap: ValidationErrorMap\n /**\n * A flag indicating whether the field is currently being validated.\n */\n isValidating: boolean\n}\n\n/**\n * An object type representing the state of a field.\n */\nexport type FieldState<TData> = {\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}\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 TParentData,\n TName extends DeepKeys<TParentData>,\n TFieldValidator extends\n | Validator<DeepValue<TParentData, TName>, unknown>\n | undefined = undefined,\n TFormValidator extends\n | Validator<TParentData, unknown>\n | undefined = undefined,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> {\n /**\n * A reference to the form API instance.\n */\n form: FieldApiOptions<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\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 TFieldValidator,\n TFormValidator,\n TData\n > = {} as any\n /**\n * The field state store.\n */\n store!: Store<FieldState<TData>>\n /**\n * The current field state.\n */\n state!: FieldState<TData>\n /**\n * @private\n */\n prevState!: FieldState<TData>\n timeoutIds: Record<ValidationCause, ReturnType<typeof setTimeout> | null>\n\n /**\n * Initializes a new `FieldApi` instance.\n */\n constructor(\n opts: FieldApiOptions<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >,\n ) {\n this.form = opts.form as never\n this.name = opts.name as never\n this.timeoutIds = {} as Record<ValidationCause, never>\n if (opts.defaultValue !== undefined) {\n this.form.setFieldValue(this.name, opts.defaultValue as never, {\n dontUpdateMeta: true,\n })\n }\n\n this.store = new Store<FieldState<TData>>(\n {\n value: this.getValue(),\n\n meta: this._getMeta() ?? {\n isValidating: false,\n isTouched: false,\n isBlurred: false,\n isDirty: false,\n isPristine: true,\n errors: [],\n errorMap: {},\n ...opts.defaultMeta,\n },\n },\n {\n onUpdate: () => {\n const state = this.store.state\n\n state.meta.errors = Object.values(state.meta.errorMap).filter(\n (val: unknown) => val !== undefined,\n )\n\n state.meta.isPristine = !state.meta.isDirty\n\n this.prevState = state\n this.state = state\n },\n },\n )\n\n this.state = this.store.state\n this.prevState = this.state\n this.options = opts as never\n }\n\n /**\n * @private\n */\n runValidator<\n TValue extends {\n value: TData\n fieldApi: FieldApi<any, any, any, any>\n validationSource: ValidationSource\n },\n TType extends 'validate' | 'validateAsync',\n >(props: {\n validate: TType extends 'validate'\n ? FieldValidateOrFn<any, any, any, any>\n : FieldAsyncValidateOrFn<any, any, any, any>\n value: TValue\n type: TType\n // When `api` is 'field', the return type cannot be `FormValidationError`\n }): TType extends 'validate' ? ValidationError : Promise<ValidationError> {\n const adapters = [\n this.form.options.validatorAdapter,\n this.options.validatorAdapter,\n ] as const\n for (const adapter of adapters) {\n if (adapter && typeof props.validate !== 'function') {\n return adapter()[props.type](\n props.value as never,\n props.validate,\n ) as never\n }\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 info = this.getInfo()\n info.instance = this as never\n const unsubscribe = this.form.store.subscribe(() => {\n this.store.batch(() => {\n const nextValue = this.getValue()\n const nextMeta = this.getMeta()\n\n if (nextValue !== this.state.value) {\n this.store.setState((prev) => ({ ...prev, value: nextValue }))\n }\n\n if (nextMeta !== this.state.meta) {\n this.store.setState((prev) => ({ ...prev, meta: nextMeta }))\n }\n })\n })\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((prev) => ({\n ...prev,\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n errorMap: { ...prev?.errorMap, onMount: error },\n }))\n }\n }\n\n return () => {\n unsubscribe()\n }\n }\n\n /**\n * Updates the field instance with new options.\n */\n update = (\n opts: FieldApiOptions<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >,\n ) => {\n // Default Value\n\n if (this.state.value === undefined) {\n const formDefault = getBy(opts.form.options.defaultValues, opts.name)\n\n if (opts.defaultValue !== undefined) {\n this.setValue(opts.defaultValue as never, {\n dontUpdateMeta: true,\n })\n } else if (formDefault !== undefined) {\n this.setValue(formDefault as never, {\n dontUpdateMeta: true,\n })\n }\n }\n\n // Default Meta\n if (this._getMeta() === undefined) {\n this.setMeta(this.state.meta)\n }\n\n this.options = opts as never\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 this.validate('change')\n }\n\n /**\n * @private\n */\n _getMeta = () => this.form.getFieldMeta(this.name)\n\n /**\n * Gets the current field metadata.\n */\n getMeta = () =>\n this._getMeta() ??\n ({\n isValidating: false,\n isTouched: false,\n isBlurred: false,\n isDirty: false,\n isPristine: true,\n errors: [],\n errorMap: {},\n ...this.options.defaultMeta,\n } as FieldMeta)\n\n /**\n * Sets the field metadata.\n */\n setMeta = (updater: Updater<FieldMeta>) =>\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 ) => this.form.pushFieldValue(this.name, value as any, opts)\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 ) => this.form.insertFieldValue(this.name, index, value as any, opts)\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 ) => this.form.replaceFieldValue(this.name, index, value as any, opts)\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 /**\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 /**\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 /**\n * @private\n */\n getLinkedFields = (cause: ValidationCause) => {\n const fields = Object.values(this.form.fieldInfo) as FieldInfo<\n any,\n TFormValidator\n >[]\n\n const linkedFields: FieldApi<any, any, any, any>[] = []\n for (const field of fields) {\n if (!field.instance) continue\n const { onChangeListenTo, onBlurListenTo } =\n field.instance.options.validators || {}\n if (\n cause === 'change' &&\n onChangeListenTo?.includes(this.name as string)\n ) {\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<SyncValidator<any> & { field: FieldApi<any, any, any, any> }>,\n )\n\n // Needs type cast as eslint errantly believes this is always falsy\n let hasErrored = false as boolean\n\n this.form.store.batch(() => {\n const validateFieldFn = (\n field: FieldApi<any, any, any, any>,\n validateObj: SyncValidator<any>,\n ) => {\n const errorMapKey = getErrorMapKey(validateObj.cause)\n\n const error =\n /*\n If `validateObj.validate` is `undefined`, then the field doesn't have\n a validator for this event, but there still could be an error that\n needs to be cleaned up related to the current event left by the\n form's validator.\n */\n validateObj.validate\n ? normalizeError(\n field.runValidator({\n validate: validateObj.validate,\n value: {\n value: field.getValue(),\n validationSource: 'field',\n fieldApi: field,\n },\n type: 'validate',\n }),\n )\n : errorFromForm[errorMapKey]\n\n if (field.state.meta.errorMap[errorMapKey] !== error) {\n field.setMeta((prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n [getErrorMapKey(validateObj.cause)]:\n // Prefer the error message from the field validators if they exist\n error ? error : errorFromForm[errorMapKey],\n },\n }))\n }\n if (error || errorFromForm[errorMapKey]) {\n hasErrored = true\n }\n }\n\n for (const validateObj of validates) {\n validateFieldFn(this, validateObj)\n }\n for (const fieldValitateObj of linkedFieldValidates) {\n if (!fieldValitateObj.validate) continue\n validateFieldFn(fieldValitateObj.field, fieldValitateObj)\n }\n })\n\n /**\n * when we have an error for onSubmit in the state, we want\n * to clear the error as soon as the user enters a valid value in the field\n */\n const submitErrKey = getErrorMapKey('submit')\n\n if (\n this.state.meta.errorMap[submitErrKey] &&\n cause !== 'submit' &&\n !hasErrored\n ) {\n this.setMeta((prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n [submitErrKey]: undefined,\n },\n }))\n }\n\n return { hasErrored }\n }\n\n /**\n * @private\n */\n validateAsync = async (\n cause: ValidationCause,\n formValidationResultPromise: Promise<\n FieldsErrorMapFromValidator<TParentData>\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> & { field: FieldApi<any, any, any, any> }\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: FieldApi<any, any, any, any>,\n validateObj: AsyncValidator<any>,\n promises: Promise<ValidationError | undefined>[],\n ) => {\n const errorMapKey = getErrorMapKey(validateObj.cause)\n const fieldValidatorMeta = field.getInfo().validationMetaMap[errorMapKey]\n\n fieldValidatorMeta?.lastAbortController.abort()\n const controller = new AbortController()\n\n this.getInfo().validationMetaMap[errorMapKey] = {\n lastAbortController: controller,\n }\n\n promises.push(\n new Promise<ValidationError | undefined>(async (resolve) => {\n let rawError!: ValidationError | undefined\n try {\n rawError = await new Promise((rawResolve, rawReject) => {\n if (this.timeoutIds[validateObj.cause]) {\n clearTimeout(this.timeoutIds[validateObj.cause]!)\n }\n\n this.timeoutIds[validateObj.cause] = setTimeout(async () => {\n if (controller.signal.aborted) return rawResolve(undefined)\n try {\n rawResolve(\n await this.runValidator({\n validate: validateObj.validate,\n value: {\n value: field.getValue(),\n fieldApi: field,\n signal: controller.signal,\n validationSource: 'field',\n },\n type: 'validateAsync',\n }),\n )\n } catch (e) {\n rawReject(e)\n }\n }, validateObj.debounceMs)\n })\n } catch (e: unknown) {\n rawError = e as ValidationError\n }\n if (controller.signal.aborted) return resolve(undefined)\n const error = normalizeError(rawError)\n const fieldErrorFromForm =\n asyncFormValidationResults[this.name]?.[errorMapKey]\n const fieldError = error || fieldErrorFromForm\n field.setMeta((prev) => {\n return {\n ...prev,\n errorMap: {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n ...prev?.errorMap,\n [errorMapKey]: fieldError,\n },\n }\n })\n\n resolve(fieldError)\n }),\n )\n }\n\n // TODO: Dedupe this logic to reduce bundle size\n for (const validateObj of validates) {\n if (!validateObj.validate) continue\n validateFieldAsyncFn(this, validateObj, validatesPromises)\n }\n for (const fieldValitateObj of linkedFieldValidates) {\n if (!fieldValitateObj.validate) continue\n validateFieldAsyncFn(\n fieldValitateObj.field,\n fieldValitateObj,\n linkedPromises,\n )\n }\n\n let results: ValidationError[] = []\n if (validatesPromises.length || linkedPromises.length) {\n results = await Promise.all(validatesPromises)\n await Promise.all(linkedPromises)\n }\n\n this.setMeta((prev) => ({ ...prev, isValidating: false }))\n\n for (const linkedField of linkedFields) {\n linkedField.setMeta((prev) => ({ ...prev, isValidating: false }))\n }\n\n return results.filter(Boolean)\n }\n\n /**\n * Validates the field value.\n */\n validate = (\n cause: ValidationCause,\n ): ValidationError[] | Promise<ValidationError[]> => {\n // If the field is pristine, do not validate\n if (!this.state.meta.isTouched) return []\n\n let validationErrorFromForm: ValidationErrorMap = {}\n let formValidationResultPromise: Promise<\n FieldsErrorMapFromValidator<TParentData>\n > = Promise.resolve({})\n\n try {\n const formValidationResult = this.form.validate(cause)\n if (formValidationResult instanceof Promise) {\n formValidationResultPromise = formValidationResult\n } else {\n const fieldErrorFromForm = formValidationResult[this.name]\n if (fieldErrorFromForm) {\n validationErrorFromForm = fieldErrorFromForm\n }\n }\n } catch (_) {}\n\n // Attempt to sync validate first\n const { hasErrored } = this.validateSync(cause, validationErrorFromForm)\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 // No error? Attempt async validation\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\n /**\n * Updates the field's errorMap\n */\n setErrorMap(errorMap: ValidationErrorMap) {\n this.setMeta((prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n ...errorMap,\n },\n }))\n }\n}\n\nfunction normalizeError(rawError?: ValidationError) {\n if (rawError) {\n if (typeof rawError !== 'string') {\n return 'Invalid Form Values'\n }\n\n return rawError\n }\n\n return undefined\n}\n\nfunction getErrorMapKey(cause: ValidationCause) {\n switch (cause) {\n case 'submit':\n return 'onSubmit'\n case 'blur':\n return 'onBlur'\n case 'mount':\n return 'onMount'\n case 'server':\n return 'onServer'\n case 'change':\n default:\n return 'onChange'\n }\n}\n"],"names":["opts","getBy","getSyncValidatorArray","getAsyncValidatorArray","Store"],"mappings":"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"}
1
+ {"version":3,"file":"FieldApi.cjs","sources":["../../src/FieldApi.ts"],"sourcesContent":["import { Store } from '@tanstack/store'\nimport { getAsyncValidatorArray, getBy, getSyncValidatorArray } from './utils'\nimport type { FieldInfo, FieldsErrorMapFromValidator, FormApi } from './FormApi'\nimport type {\n UpdateMetaOptions,\n ValidationCause,\n ValidationError,\n ValidationErrorMap,\n ValidationSource,\n Validator,\n} from './types'\nimport type { AsyncValidator, SyncValidator, Updater } from './utils'\nimport type { DeepKeys, DeepValue, NoInfer } from './util-types'\n\n/**\n * @private\n */\nexport type FieldValidateFn<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TFieldValidator extends\n | Validator<DeepValue<TParentData, TName>, unknown>\n | undefined = undefined,\n TFormValidator extends\n | Validator<TParentData, unknown>\n | undefined = undefined,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> = (props: {\n value: TData\n fieldApi: FieldApi<TParentData, TName, TFieldValidator, TFormValidator, TData>\n}) => ValidationError\n\n/**\n * @private\n */\nexport type FieldValidateOrFn<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TFieldValidator extends\n | Validator<DeepValue<TParentData, TName>, unknown>\n | undefined = undefined,\n TFormValidator extends\n | Validator<TParentData, unknown>\n | undefined = undefined,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> =\n TFieldValidator extends Validator<TData, infer TFN>\n ?\n | TFN\n | FieldValidateFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\n : TFormValidator extends Validator<TParentData, infer FFN>\n ?\n | FFN\n | FieldValidateFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\n : FieldValidateFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\n\n/**\n * @private\n */\nexport type FieldValidateAsyncFn<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TFieldValidator extends\n | Validator<DeepValue<TParentData, TName>, unknown>\n | undefined = undefined,\n TFormValidator extends\n | Validator<TParentData, unknown>\n | undefined = undefined,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> = (options: {\n value: TData\n fieldApi: FieldApi<TParentData, TName, TFieldValidator, TFormValidator, TData>\n signal: AbortSignal\n}) => ValidationError | Promise<ValidationError>\n\n/**\n * @private\n */\nexport type FieldAsyncValidateOrFn<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TFieldValidator extends\n | Validator<DeepValue<TParentData, TName>, unknown>\n | undefined = undefined,\n TFormValidator extends\n | Validator<TParentData, unknown>\n | undefined = undefined,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> =\n TFieldValidator extends Validator<TData, infer TFN>\n ?\n | TFN\n | FieldValidateAsyncFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\n : TFormValidator extends Validator<TParentData, infer FFN>\n ?\n | FFN\n | FieldValidateAsyncFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\n : FieldValidateAsyncFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\n\nexport interface FieldValidators<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TFieldValidator extends\n | Validator<DeepValue<TParentData, TName>, unknown>\n | undefined = undefined,\n TFormValidator extends\n | Validator<TParentData, unknown>\n | undefined = undefined,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> {\n /**\n * An optional function that takes a param of `formApi` which is a generic type of `TData` and `TParentData`\n */\n onMount?: FieldValidateOrFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\n /**\n * An optional property that takes a `ValidateFn` which is a generic of `TData` and `TParentData`.\n * If `validatorAdapter` is passed, this may also accept a property from the respective adapter\n *\n * @example z.string().min(1) // if `zodAdapter` is passed\n */\n onChange?: FieldValidateOrFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\n /**\n * An optional property similar to `onChange` but async validation. If `validatorAdapter`\n * is passed, this may also accept a property from the respective adapter\n *\n * @example z.string().refine(async (val) => val.length > 3, { message: 'Testing 123' }) // if `zodAdapter` is passed\n */\n onChangeAsync?: FieldAsyncValidateOrFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\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 * If `validatorAdapter` is passed, this may also accept a property from the respective adapter\n *\n * @example z.string().min(1) // if `zodAdapter` is passed\n */\n onBlur?: FieldValidateOrFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\n /**\n * An optional property similar to `onBlur` but async validation. If `validatorAdapter`\n * is passed, this may also accept a property from the respective adapter\n *\n * @example z.string().refine(async (val) => val.length > 3, { message: 'Testing 123' }) // if `zodAdapter` is passed\n */\n onBlurAsync?: FieldAsyncValidateOrFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\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 * If `validatorAdapter` is passed, this may also accept a property from the respective adapter\n *\n * @example z.string().min(1) // if `zodAdapter` is passed\n */\n onSubmit?: FieldValidateOrFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\n /**\n * An optional property similar to `onSubmit` but async validation. If `validatorAdapter`\n * is passed, this may also accept a property from the respective adapter\n *\n * @example z.string().refine(async (val) => val.length > 3, { message: 'Testing 123' }) // if `zodAdapter` is passed\n */\n onSubmitAsync?: FieldAsyncValidateOrFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\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 TFieldValidator extends\n | Validator<DeepValue<TParentData, TName>, unknown>\n | undefined = undefined,\n TFormValidator extends\n | Validator<TParentData, unknown>\n | undefined = undefined,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\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 validator provided by an extension, like `yupValidator` from `@tanstack/yup-form-adapter`\n */\n validatorAdapter?: TFieldValidator\n /**\n * A list of validators to pass to the field\n */\n validators?: FieldValidators<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\n /**\n * An optional object with default metadata for the field.\n */\n defaultMeta?: Partial<FieldMeta>\n}\n\n/**\n * An object type representing the required options for the FieldApi class.\n */\nexport interface FieldApiOptions<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TFieldValidator extends\n | Validator<DeepValue<TParentData, TName>, unknown>\n | undefined = undefined,\n TFormValidator extends\n | Validator<TParentData, unknown>\n | undefined = undefined,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> extends FieldOptions<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n > {\n form: FormApi<TParentData, TFormValidator>\n}\n\n/**\n * An object type representing the metadata of a field in a form.\n */\nexport type FieldMeta = {\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 not been modified by the user. Opposite of `isDirty`.\n */\n isPristine: 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 * An array of errors related to the field value.\n */\n errors: ValidationError[]\n /**\n * A map of errors related to the field value.\n */\n errorMap: ValidationErrorMap\n /**\n * A flag indicating whether the field is currently being validated.\n */\n isValidating: boolean\n}\n\n/**\n * An object type representing the state of a field.\n */\nexport type FieldState<TData> = {\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}\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 TParentData,\n TName extends DeepKeys<TParentData>,\n TFieldValidator extends\n | Validator<DeepValue<TParentData, TName>, unknown>\n | undefined = undefined,\n TFormValidator extends\n | Validator<TParentData, unknown>\n | undefined = undefined,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> {\n /**\n * A reference to the form API instance.\n */\n form: FieldApiOptions<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\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 TFieldValidator,\n TFormValidator,\n TData\n > = {} as any\n /**\n * The field state store.\n */\n store!: Store<FieldState<TData>>\n /**\n * The current field state.\n */\n state!: FieldState<TData>\n /**\n * @private\n */\n prevState!: FieldState<TData>\n timeoutIds: Record<ValidationCause, ReturnType<typeof setTimeout> | null>\n\n /**\n * Initializes a new `FieldApi` instance.\n */\n constructor(\n opts: FieldApiOptions<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >,\n ) {\n this.form = opts.form as never\n this.name = opts.name as never\n this.timeoutIds = {} as Record<ValidationCause, never>\n if (opts.defaultValue !== undefined) {\n this.form.setFieldValue(this.name, opts.defaultValue as never, {\n dontUpdateMeta: true,\n })\n }\n\n this.store = new Store<FieldState<TData>>(\n {\n value: this.getValue(),\n\n meta: this._getMeta() ?? {\n isValidating: false,\n isTouched: false,\n isBlurred: false,\n isDirty: false,\n isPristine: true,\n errors: [],\n errorMap: {},\n ...opts.defaultMeta,\n },\n },\n {\n onUpdate: () => {\n const state = this.store.state\n\n state.meta.errors = Object.values(state.meta.errorMap).filter(\n (val: unknown) => val !== undefined,\n )\n\n state.meta.isPristine = !state.meta.isDirty\n\n this.prevState = state\n this.state = state\n },\n },\n )\n\n this.state = this.store.state\n this.prevState = this.state\n this.options = opts as never\n }\n\n /**\n * @private\n */\n runValidator<\n TValue extends {\n value: TData\n fieldApi: FieldApi<any, any, any, any>\n validationSource: ValidationSource\n },\n TType extends 'validate' | 'validateAsync',\n >(props: {\n validate: TType extends 'validate'\n ? FieldValidateOrFn<any, any, any, any>\n : FieldAsyncValidateOrFn<any, any, any, any>\n value: TValue\n type: TType\n // When `api` is 'field', the return type cannot be `FormValidationError`\n }): TType extends 'validate' ? ValidationError : Promise<ValidationError> {\n const adapters = [\n this.form.options.validatorAdapter,\n this.options.validatorAdapter,\n ] as const\n for (const adapter of adapters) {\n if (adapter && typeof props.validate !== 'function') {\n return adapter()[props.type](\n props.value as never,\n props.validate,\n ) as never\n }\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 info = this.getInfo()\n info.instance = this as never\n const unsubscribe = this.form.store.subscribe(() => {\n this.store.batch(() => {\n const nextValue = this.getValue()\n const nextMeta = this.getMeta()\n\n if (nextValue !== this.state.value) {\n this.store.setState((prev) => ({ ...prev, value: nextValue }))\n }\n\n if (nextMeta !== this.state.meta) {\n this.store.setState((prev) => ({ ...prev, meta: nextMeta }))\n }\n })\n })\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((prev) => ({\n ...prev,\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n errorMap: { ...prev?.errorMap, onMount: error },\n }))\n }\n }\n\n return () => {\n unsubscribe()\n }\n }\n\n /**\n * Updates the field instance with new options.\n */\n update = (\n opts: FieldApiOptions<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >,\n ) => {\n // Default Value\n\n if (this.state.value === undefined) {\n const formDefault = getBy(opts.form.options.defaultValues, opts.name)\n\n if (opts.defaultValue !== undefined) {\n this.setValue(opts.defaultValue as never, {\n dontUpdateMeta: true,\n })\n } else if (formDefault !== undefined) {\n this.setValue(formDefault as never, {\n dontUpdateMeta: true,\n })\n }\n }\n\n // Default Meta\n if (this._getMeta() === undefined) {\n this.setMeta(this.state.meta)\n }\n\n this.options = opts as never\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 this.validate('change')\n }\n\n /**\n * @private\n */\n _getMeta = () => this.form.getFieldMeta(this.name)\n\n /**\n * Gets the current field metadata.\n */\n getMeta = () =>\n this._getMeta() ??\n ({\n isValidating: false,\n isTouched: false,\n isBlurred: false,\n isDirty: false,\n isPristine: true,\n errors: [],\n errorMap: {},\n ...this.options.defaultMeta,\n } as FieldMeta)\n\n /**\n * Sets the field metadata.\n */\n setMeta = (updater: Updater<FieldMeta>) =>\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 ) => this.form.pushFieldValue(this.name, value as any, opts)\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 ) => this.form.insertFieldValue(this.name, index, value as any, opts)\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 ) => this.form.replaceFieldValue(this.name, index, value as any, opts)\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 /**\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 /**\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 /**\n * @private\n */\n getLinkedFields = (cause: ValidationCause) => {\n const fields = Object.values(this.form.fieldInfo) as FieldInfo<\n any,\n TFormValidator\n >[]\n\n const linkedFields: FieldApi<any, any, any, any>[] = []\n for (const field of fields) {\n if (!field.instance) continue\n const { onChangeListenTo, onBlurListenTo } =\n field.instance.options.validators || {}\n if (\n cause === 'change' &&\n onChangeListenTo?.includes(this.name as string)\n ) {\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<SyncValidator<any> & { field: FieldApi<any, any, any, any> }>,\n )\n\n // Needs type cast as eslint errantly believes this is always falsy\n let hasErrored = false as boolean\n\n this.form.store.batch(() => {\n const validateFieldFn = (\n field: FieldApi<any, any, any, any>,\n validateObj: SyncValidator<any>,\n ) => {\n const errorMapKey = getErrorMapKey(validateObj.cause)\n\n const error =\n /*\n If `validateObj.validate` is `undefined`, then the field doesn't have\n a validator for this event, but there still could be an error that\n needs to be cleaned up related to the current event left by the\n form's validator.\n */\n validateObj.validate\n ? normalizeError(\n field.runValidator({\n validate: validateObj.validate,\n value: {\n value: field.getValue(),\n validationSource: 'field',\n fieldApi: field,\n },\n type: 'validate',\n }),\n )\n : errorFromForm[errorMapKey]\n\n if (field.state.meta.errorMap[errorMapKey] !== error) {\n field.setMeta((prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n [getErrorMapKey(validateObj.cause)]:\n // Prefer the error message from the field validators if they exist\n error ? error : errorFromForm[errorMapKey],\n },\n }))\n }\n if (error || errorFromForm[errorMapKey]) {\n hasErrored = true\n }\n }\n\n for (const validateObj of validates) {\n validateFieldFn(this, validateObj)\n }\n for (const fieldValitateObj of linkedFieldValidates) {\n if (!fieldValitateObj.validate) continue\n validateFieldFn(fieldValitateObj.field, fieldValitateObj)\n }\n })\n\n /**\n * when we have an error for onSubmit in the state, we want\n * to clear the error as soon as the user enters a valid value in the field\n */\n const submitErrKey = getErrorMapKey('submit')\n\n if (\n this.state.meta.errorMap[submitErrKey] &&\n cause !== 'submit' &&\n !hasErrored\n ) {\n this.setMeta((prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n [submitErrKey]: undefined,\n },\n }))\n }\n\n return { hasErrored }\n }\n\n /**\n * @private\n */\n validateAsync = async (\n cause: ValidationCause,\n formValidationResultPromise: Promise<\n FieldsErrorMapFromValidator<TParentData>\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> & { field: FieldApi<any, any, any, any> }\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: FieldApi<any, any, any, any>,\n validateObj: AsyncValidator<any>,\n promises: Promise<ValidationError | undefined>[],\n ) => {\n const errorMapKey = getErrorMapKey(validateObj.cause)\n const fieldValidatorMeta = field.getInfo().validationMetaMap[errorMapKey]\n\n fieldValidatorMeta?.lastAbortController.abort()\n const controller = new AbortController()\n\n this.getInfo().validationMetaMap[errorMapKey] = {\n lastAbortController: controller,\n }\n\n promises.push(\n new Promise<ValidationError | undefined>(async (resolve) => {\n let rawError!: ValidationError | undefined\n try {\n rawError = await new Promise((rawResolve, rawReject) => {\n if (this.timeoutIds[validateObj.cause]) {\n clearTimeout(this.timeoutIds[validateObj.cause]!)\n }\n\n this.timeoutIds[validateObj.cause] = setTimeout(async () => {\n if (controller.signal.aborted) return rawResolve(undefined)\n try {\n rawResolve(\n await this.runValidator({\n validate: validateObj.validate,\n value: {\n value: field.getValue(),\n fieldApi: field,\n signal: controller.signal,\n validationSource: 'field',\n },\n type: 'validateAsync',\n }),\n )\n } catch (e) {\n rawReject(e)\n }\n }, validateObj.debounceMs)\n })\n } catch (e: unknown) {\n rawError = e as ValidationError\n }\n if (controller.signal.aborted) return resolve(undefined)\n const error = normalizeError(rawError)\n const fieldErrorFromForm =\n asyncFormValidationResults[this.name]?.[errorMapKey]\n const fieldError = error || fieldErrorFromForm\n field.setMeta((prev) => {\n return {\n ...prev,\n errorMap: {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n ...prev?.errorMap,\n [errorMapKey]: fieldError,\n },\n }\n })\n\n resolve(fieldError)\n }),\n )\n }\n\n // TODO: Dedupe this logic to reduce bundle size\n for (const validateObj of validates) {\n if (!validateObj.validate) continue\n validateFieldAsyncFn(this, validateObj, validatesPromises)\n }\n for (const fieldValitateObj of linkedFieldValidates) {\n if (!fieldValitateObj.validate) continue\n validateFieldAsyncFn(\n fieldValitateObj.field,\n fieldValitateObj,\n linkedPromises,\n )\n }\n\n let results: ValidationError[] = []\n if (validatesPromises.length || linkedPromises.length) {\n results = await Promise.all(validatesPromises)\n await Promise.all(linkedPromises)\n }\n\n this.setMeta((prev) => ({ ...prev, isValidating: false }))\n\n for (const linkedField of linkedFields) {\n linkedField.setMeta((prev) => ({ ...prev, isValidating: false }))\n }\n\n return results.filter(Boolean)\n }\n\n /**\n * Validates the field value.\n */\n validate = (\n cause: ValidationCause,\n ): 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 } = 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 = 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\n /**\n * Updates the field's errorMap\n */\n setErrorMap(errorMap: ValidationErrorMap) {\n this.setMeta((prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n ...errorMap,\n },\n }))\n }\n}\n\nfunction normalizeError(rawError?: ValidationError) {\n if (rawError) {\n if (typeof rawError !== 'string') {\n return 'Invalid Form Values'\n }\n\n return rawError\n }\n\n return undefined\n}\n\nfunction getErrorMapKey(cause: ValidationCause) {\n switch (cause) {\n case 'submit':\n return 'onSubmit'\n case 'blur':\n return 'onBlur'\n case 'mount':\n return 'onMount'\n case 'server':\n return 'onServer'\n case 'change':\n default:\n return 'onChange'\n }\n}\n"],"names":["opts","getBy","getSyncValidatorArray","getAsyncValidatorArray","Store"],"mappings":"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"}
@@ -282,25 +282,16 @@ class FieldApi {
282
282
  this.validate = (cause) => {
283
283
  var _a;
284
284
  if (!this.state.meta.isTouched) return [];
285
- let validationErrorFromForm = {};
286
- let formValidationResultPromise = Promise.resolve({});
287
- try {
288
- const formValidationResult = this.form.validate(cause);
289
- if (formValidationResult instanceof Promise) {
290
- formValidationResultPromise = formValidationResult;
291
- } else {
292
- const fieldErrorFromForm = formValidationResult[this.name];
293
- if (fieldErrorFromForm) {
294
- validationErrorFromForm = fieldErrorFromForm;
295
- }
296
- }
297
- } catch (_) {
298
- }
299
- const { hasErrored } = this.validateSync(cause, validationErrorFromForm);
285
+ const { fieldsErrorMap } = this.form.validateSync(cause);
286
+ const { hasErrored } = this.validateSync(
287
+ cause,
288
+ fieldsErrorMap[this.name] ?? {}
289
+ );
300
290
  if (hasErrored && !this.options.asyncAlways) {
301
291
  (_a = this.getInfo().validationMetaMap[getErrorMapKey(cause)]) == null ? void 0 : _a.lastAbortController.abort();
302
292
  return this.state.meta.errors;
303
293
  }
294
+ const formValidationResultPromise = this.form.validateAsync(cause);
304
295
  return this.validateAsync(cause, formValidationResultPromise);
305
296
  };
306
297
  this.handleChange = (updater) => {
@@ -1 +1 @@
1
- {"version":3,"file":"FieldApi.js","sources":["../../src/FieldApi.ts"],"sourcesContent":["import { Store } from '@tanstack/store'\nimport { getAsyncValidatorArray, getBy, getSyncValidatorArray } from './utils'\nimport type { FieldInfo, FieldsErrorMapFromValidator, FormApi } from './FormApi'\nimport type {\n UpdateMetaOptions,\n ValidationCause,\n ValidationError,\n ValidationErrorMap,\n ValidationSource,\n Validator,\n} from './types'\nimport type { AsyncValidator, SyncValidator, Updater } from './utils'\nimport type { DeepKeys, DeepValue, NoInfer } from './util-types'\n\n/**\n * @private\n */\nexport type FieldValidateFn<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TFieldValidator extends\n | Validator<DeepValue<TParentData, TName>, unknown>\n | undefined = undefined,\n TFormValidator extends\n | Validator<TParentData, unknown>\n | undefined = undefined,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> = (props: {\n value: TData\n fieldApi: FieldApi<TParentData, TName, TFieldValidator, TFormValidator, TData>\n}) => ValidationError\n\n/**\n * @private\n */\nexport type FieldValidateOrFn<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TFieldValidator extends\n | Validator<DeepValue<TParentData, TName>, unknown>\n | undefined = undefined,\n TFormValidator extends\n | Validator<TParentData, unknown>\n | undefined = undefined,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> =\n TFieldValidator extends Validator<TData, infer TFN>\n ?\n | TFN\n | FieldValidateFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\n : TFormValidator extends Validator<TParentData, infer FFN>\n ?\n | FFN\n | FieldValidateFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\n : FieldValidateFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\n\n/**\n * @private\n */\nexport type FieldValidateAsyncFn<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TFieldValidator extends\n | Validator<DeepValue<TParentData, TName>, unknown>\n | undefined = undefined,\n TFormValidator extends\n | Validator<TParentData, unknown>\n | undefined = undefined,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> = (options: {\n value: TData\n fieldApi: FieldApi<TParentData, TName, TFieldValidator, TFormValidator, TData>\n signal: AbortSignal\n}) => ValidationError | Promise<ValidationError>\n\n/**\n * @private\n */\nexport type FieldAsyncValidateOrFn<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TFieldValidator extends\n | Validator<DeepValue<TParentData, TName>, unknown>\n | undefined = undefined,\n TFormValidator extends\n | Validator<TParentData, unknown>\n | undefined = undefined,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> =\n TFieldValidator extends Validator<TData, infer TFN>\n ?\n | TFN\n | FieldValidateAsyncFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\n : TFormValidator extends Validator<TParentData, infer FFN>\n ?\n | FFN\n | FieldValidateAsyncFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\n : FieldValidateAsyncFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\n\nexport interface FieldValidators<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TFieldValidator extends\n | Validator<DeepValue<TParentData, TName>, unknown>\n | undefined = undefined,\n TFormValidator extends\n | Validator<TParentData, unknown>\n | undefined = undefined,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> {\n /**\n * An optional function that takes a param of `formApi` which is a generic type of `TData` and `TParentData`\n */\n onMount?: FieldValidateOrFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\n /**\n * An optional property that takes a `ValidateFn` which is a generic of `TData` and `TParentData`.\n * If `validatorAdapter` is passed, this may also accept a property from the respective adapter\n *\n * @example z.string().min(1) // if `zodAdapter` is passed\n */\n onChange?: FieldValidateOrFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\n /**\n * An optional property similar to `onChange` but async validation. If `validatorAdapter`\n * is passed, this may also accept a property from the respective adapter\n *\n * @example z.string().refine(async (val) => val.length > 3, { message: 'Testing 123' }) // if `zodAdapter` is passed\n */\n onChangeAsync?: FieldAsyncValidateOrFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\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 * If `validatorAdapter` is passed, this may also accept a property from the respective adapter\n *\n * @example z.string().min(1) // if `zodAdapter` is passed\n */\n onBlur?: FieldValidateOrFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\n /**\n * An optional property similar to `onBlur` but async validation. If `validatorAdapter`\n * is passed, this may also accept a property from the respective adapter\n *\n * @example z.string().refine(async (val) => val.length > 3, { message: 'Testing 123' }) // if `zodAdapter` is passed\n */\n onBlurAsync?: FieldAsyncValidateOrFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\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 * If `validatorAdapter` is passed, this may also accept a property from the respective adapter\n *\n * @example z.string().min(1) // if `zodAdapter` is passed\n */\n onSubmit?: FieldValidateOrFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\n /**\n * An optional property similar to `onSubmit` but async validation. If `validatorAdapter`\n * is passed, this may also accept a property from the respective adapter\n *\n * @example z.string().refine(async (val) => val.length > 3, { message: 'Testing 123' }) // if `zodAdapter` is passed\n */\n onSubmitAsync?: FieldAsyncValidateOrFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\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 TFieldValidator extends\n | Validator<DeepValue<TParentData, TName>, unknown>\n | undefined = undefined,\n TFormValidator extends\n | Validator<TParentData, unknown>\n | undefined = undefined,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\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 validator provided by an extension, like `yupValidator` from `@tanstack/yup-form-adapter`\n */\n validatorAdapter?: TFieldValidator\n /**\n * A list of validators to pass to the field\n */\n validators?: FieldValidators<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\n /**\n * An optional object with default metadata for the field.\n */\n defaultMeta?: Partial<FieldMeta>\n}\n\n/**\n * An object type representing the required options for the FieldApi class.\n */\nexport interface FieldApiOptions<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TFieldValidator extends\n | Validator<DeepValue<TParentData, TName>, unknown>\n | undefined = undefined,\n TFormValidator extends\n | Validator<TParentData, unknown>\n | undefined = undefined,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> extends FieldOptions<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n > {\n form: FormApi<TParentData, TFormValidator>\n}\n\n/**\n * An object type representing the metadata of a field in a form.\n */\nexport type FieldMeta = {\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 not been modified by the user. Opposite of `isDirty`.\n */\n isPristine: 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 * An array of errors related to the field value.\n */\n errors: ValidationError[]\n /**\n * A map of errors related to the field value.\n */\n errorMap: ValidationErrorMap\n /**\n * A flag indicating whether the field is currently being validated.\n */\n isValidating: boolean\n}\n\n/**\n * An object type representing the state of a field.\n */\nexport type FieldState<TData> = {\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}\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 TParentData,\n TName extends DeepKeys<TParentData>,\n TFieldValidator extends\n | Validator<DeepValue<TParentData, TName>, unknown>\n | undefined = undefined,\n TFormValidator extends\n | Validator<TParentData, unknown>\n | undefined = undefined,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> {\n /**\n * A reference to the form API instance.\n */\n form: FieldApiOptions<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\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 TFieldValidator,\n TFormValidator,\n TData\n > = {} as any\n /**\n * The field state store.\n */\n store!: Store<FieldState<TData>>\n /**\n * The current field state.\n */\n state!: FieldState<TData>\n /**\n * @private\n */\n prevState!: FieldState<TData>\n timeoutIds: Record<ValidationCause, ReturnType<typeof setTimeout> | null>\n\n /**\n * Initializes a new `FieldApi` instance.\n */\n constructor(\n opts: FieldApiOptions<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >,\n ) {\n this.form = opts.form as never\n this.name = opts.name as never\n this.timeoutIds = {} as Record<ValidationCause, never>\n if (opts.defaultValue !== undefined) {\n this.form.setFieldValue(this.name, opts.defaultValue as never, {\n dontUpdateMeta: true,\n })\n }\n\n this.store = new Store<FieldState<TData>>(\n {\n value: this.getValue(),\n\n meta: this._getMeta() ?? {\n isValidating: false,\n isTouched: false,\n isBlurred: false,\n isDirty: false,\n isPristine: true,\n errors: [],\n errorMap: {},\n ...opts.defaultMeta,\n },\n },\n {\n onUpdate: () => {\n const state = this.store.state\n\n state.meta.errors = Object.values(state.meta.errorMap).filter(\n (val: unknown) => val !== undefined,\n )\n\n state.meta.isPristine = !state.meta.isDirty\n\n this.prevState = state\n this.state = state\n },\n },\n )\n\n this.state = this.store.state\n this.prevState = this.state\n this.options = opts as never\n }\n\n /**\n * @private\n */\n runValidator<\n TValue extends {\n value: TData\n fieldApi: FieldApi<any, any, any, any>\n validationSource: ValidationSource\n },\n TType extends 'validate' | 'validateAsync',\n >(props: {\n validate: TType extends 'validate'\n ? FieldValidateOrFn<any, any, any, any>\n : FieldAsyncValidateOrFn<any, any, any, any>\n value: TValue\n type: TType\n // When `api` is 'field', the return type cannot be `FormValidationError`\n }): TType extends 'validate' ? ValidationError : Promise<ValidationError> {\n const adapters = [\n this.form.options.validatorAdapter,\n this.options.validatorAdapter,\n ] as const\n for (const adapter of adapters) {\n if (adapter && typeof props.validate !== 'function') {\n return adapter()[props.type](\n props.value as never,\n props.validate,\n ) as never\n }\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 info = this.getInfo()\n info.instance = this as never\n const unsubscribe = this.form.store.subscribe(() => {\n this.store.batch(() => {\n const nextValue = this.getValue()\n const nextMeta = this.getMeta()\n\n if (nextValue !== this.state.value) {\n this.store.setState((prev) => ({ ...prev, value: nextValue }))\n }\n\n if (nextMeta !== this.state.meta) {\n this.store.setState((prev) => ({ ...prev, meta: nextMeta }))\n }\n })\n })\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((prev) => ({\n ...prev,\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n errorMap: { ...prev?.errorMap, onMount: error },\n }))\n }\n }\n\n return () => {\n unsubscribe()\n }\n }\n\n /**\n * Updates the field instance with new options.\n */\n update = (\n opts: FieldApiOptions<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >,\n ) => {\n // Default Value\n\n if (this.state.value === undefined) {\n const formDefault = getBy(opts.form.options.defaultValues, opts.name)\n\n if (opts.defaultValue !== undefined) {\n this.setValue(opts.defaultValue as never, {\n dontUpdateMeta: true,\n })\n } else if (formDefault !== undefined) {\n this.setValue(formDefault as never, {\n dontUpdateMeta: true,\n })\n }\n }\n\n // Default Meta\n if (this._getMeta() === undefined) {\n this.setMeta(this.state.meta)\n }\n\n this.options = opts as never\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 this.validate('change')\n }\n\n /**\n * @private\n */\n _getMeta = () => this.form.getFieldMeta(this.name)\n\n /**\n * Gets the current field metadata.\n */\n getMeta = () =>\n this._getMeta() ??\n ({\n isValidating: false,\n isTouched: false,\n isBlurred: false,\n isDirty: false,\n isPristine: true,\n errors: [],\n errorMap: {},\n ...this.options.defaultMeta,\n } as FieldMeta)\n\n /**\n * Sets the field metadata.\n */\n setMeta = (updater: Updater<FieldMeta>) =>\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 ) => this.form.pushFieldValue(this.name, value as any, opts)\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 ) => this.form.insertFieldValue(this.name, index, value as any, opts)\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 ) => this.form.replaceFieldValue(this.name, index, value as any, opts)\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 /**\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 /**\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 /**\n * @private\n */\n getLinkedFields = (cause: ValidationCause) => {\n const fields = Object.values(this.form.fieldInfo) as FieldInfo<\n any,\n TFormValidator\n >[]\n\n const linkedFields: FieldApi<any, any, any, any>[] = []\n for (const field of fields) {\n if (!field.instance) continue\n const { onChangeListenTo, onBlurListenTo } =\n field.instance.options.validators || {}\n if (\n cause === 'change' &&\n onChangeListenTo?.includes(this.name as string)\n ) {\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<SyncValidator<any> & { field: FieldApi<any, any, any, any> }>,\n )\n\n // Needs type cast as eslint errantly believes this is always falsy\n let hasErrored = false as boolean\n\n this.form.store.batch(() => {\n const validateFieldFn = (\n field: FieldApi<any, any, any, any>,\n validateObj: SyncValidator<any>,\n ) => {\n const errorMapKey = getErrorMapKey(validateObj.cause)\n\n const error =\n /*\n If `validateObj.validate` is `undefined`, then the field doesn't have\n a validator for this event, but there still could be an error that\n needs to be cleaned up related to the current event left by the\n form's validator.\n */\n validateObj.validate\n ? normalizeError(\n field.runValidator({\n validate: validateObj.validate,\n value: {\n value: field.getValue(),\n validationSource: 'field',\n fieldApi: field,\n },\n type: 'validate',\n }),\n )\n : errorFromForm[errorMapKey]\n\n if (field.state.meta.errorMap[errorMapKey] !== error) {\n field.setMeta((prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n [getErrorMapKey(validateObj.cause)]:\n // Prefer the error message from the field validators if they exist\n error ? error : errorFromForm[errorMapKey],\n },\n }))\n }\n if (error || errorFromForm[errorMapKey]) {\n hasErrored = true\n }\n }\n\n for (const validateObj of validates) {\n validateFieldFn(this, validateObj)\n }\n for (const fieldValitateObj of linkedFieldValidates) {\n if (!fieldValitateObj.validate) continue\n validateFieldFn(fieldValitateObj.field, fieldValitateObj)\n }\n })\n\n /**\n * when we have an error for onSubmit in the state, we want\n * to clear the error as soon as the user enters a valid value in the field\n */\n const submitErrKey = getErrorMapKey('submit')\n\n if (\n this.state.meta.errorMap[submitErrKey] &&\n cause !== 'submit' &&\n !hasErrored\n ) {\n this.setMeta((prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n [submitErrKey]: undefined,\n },\n }))\n }\n\n return { hasErrored }\n }\n\n /**\n * @private\n */\n validateAsync = async (\n cause: ValidationCause,\n formValidationResultPromise: Promise<\n FieldsErrorMapFromValidator<TParentData>\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> & { field: FieldApi<any, any, any, any> }\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: FieldApi<any, any, any, any>,\n validateObj: AsyncValidator<any>,\n promises: Promise<ValidationError | undefined>[],\n ) => {\n const errorMapKey = getErrorMapKey(validateObj.cause)\n const fieldValidatorMeta = field.getInfo().validationMetaMap[errorMapKey]\n\n fieldValidatorMeta?.lastAbortController.abort()\n const controller = new AbortController()\n\n this.getInfo().validationMetaMap[errorMapKey] = {\n lastAbortController: controller,\n }\n\n promises.push(\n new Promise<ValidationError | undefined>(async (resolve) => {\n let rawError!: ValidationError | undefined\n try {\n rawError = await new Promise((rawResolve, rawReject) => {\n if (this.timeoutIds[validateObj.cause]) {\n clearTimeout(this.timeoutIds[validateObj.cause]!)\n }\n\n this.timeoutIds[validateObj.cause] = setTimeout(async () => {\n if (controller.signal.aborted) return rawResolve(undefined)\n try {\n rawResolve(\n await this.runValidator({\n validate: validateObj.validate,\n value: {\n value: field.getValue(),\n fieldApi: field,\n signal: controller.signal,\n validationSource: 'field',\n },\n type: 'validateAsync',\n }),\n )\n } catch (e) {\n rawReject(e)\n }\n }, validateObj.debounceMs)\n })\n } catch (e: unknown) {\n rawError = e as ValidationError\n }\n if (controller.signal.aborted) return resolve(undefined)\n const error = normalizeError(rawError)\n const fieldErrorFromForm =\n asyncFormValidationResults[this.name]?.[errorMapKey]\n const fieldError = error || fieldErrorFromForm\n field.setMeta((prev) => {\n return {\n ...prev,\n errorMap: {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n ...prev?.errorMap,\n [errorMapKey]: fieldError,\n },\n }\n })\n\n resolve(fieldError)\n }),\n )\n }\n\n // TODO: Dedupe this logic to reduce bundle size\n for (const validateObj of validates) {\n if (!validateObj.validate) continue\n validateFieldAsyncFn(this, validateObj, validatesPromises)\n }\n for (const fieldValitateObj of linkedFieldValidates) {\n if (!fieldValitateObj.validate) continue\n validateFieldAsyncFn(\n fieldValitateObj.field,\n fieldValitateObj,\n linkedPromises,\n )\n }\n\n let results: ValidationError[] = []\n if (validatesPromises.length || linkedPromises.length) {\n results = await Promise.all(validatesPromises)\n await Promise.all(linkedPromises)\n }\n\n this.setMeta((prev) => ({ ...prev, isValidating: false }))\n\n for (const linkedField of linkedFields) {\n linkedField.setMeta((prev) => ({ ...prev, isValidating: false }))\n }\n\n return results.filter(Boolean)\n }\n\n /**\n * Validates the field value.\n */\n validate = (\n cause: ValidationCause,\n ): ValidationError[] | Promise<ValidationError[]> => {\n // If the field is pristine, do not validate\n if (!this.state.meta.isTouched) return []\n\n let validationErrorFromForm: ValidationErrorMap = {}\n let formValidationResultPromise: Promise<\n FieldsErrorMapFromValidator<TParentData>\n > = Promise.resolve({})\n\n try {\n const formValidationResult = this.form.validate(cause)\n if (formValidationResult instanceof Promise) {\n formValidationResultPromise = formValidationResult\n } else {\n const fieldErrorFromForm = formValidationResult[this.name]\n if (fieldErrorFromForm) {\n validationErrorFromForm = fieldErrorFromForm\n }\n }\n } catch (_) {}\n\n // Attempt to sync validate first\n const { hasErrored } = this.validateSync(cause, validationErrorFromForm)\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 // No error? Attempt async validation\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\n /**\n * Updates the field's errorMap\n */\n setErrorMap(errorMap: ValidationErrorMap) {\n this.setMeta((prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n ...errorMap,\n },\n }))\n }\n}\n\nfunction normalizeError(rawError?: ValidationError) {\n if (rawError) {\n if (typeof rawError !== 'string') {\n return 'Invalid Form Values'\n }\n\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"],"mappings":"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"}
1
+ {"version":3,"file":"FieldApi.js","sources":["../../src/FieldApi.ts"],"sourcesContent":["import { Store } from '@tanstack/store'\nimport { getAsyncValidatorArray, getBy, getSyncValidatorArray } from './utils'\nimport type { FieldInfo, FieldsErrorMapFromValidator, FormApi } from './FormApi'\nimport type {\n UpdateMetaOptions,\n ValidationCause,\n ValidationError,\n ValidationErrorMap,\n ValidationSource,\n Validator,\n} from './types'\nimport type { AsyncValidator, SyncValidator, Updater } from './utils'\nimport type { DeepKeys, DeepValue, NoInfer } from './util-types'\n\n/**\n * @private\n */\nexport type FieldValidateFn<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TFieldValidator extends\n | Validator<DeepValue<TParentData, TName>, unknown>\n | undefined = undefined,\n TFormValidator extends\n | Validator<TParentData, unknown>\n | undefined = undefined,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> = (props: {\n value: TData\n fieldApi: FieldApi<TParentData, TName, TFieldValidator, TFormValidator, TData>\n}) => ValidationError\n\n/**\n * @private\n */\nexport type FieldValidateOrFn<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TFieldValidator extends\n | Validator<DeepValue<TParentData, TName>, unknown>\n | undefined = undefined,\n TFormValidator extends\n | Validator<TParentData, unknown>\n | undefined = undefined,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> =\n TFieldValidator extends Validator<TData, infer TFN>\n ?\n | TFN\n | FieldValidateFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\n : TFormValidator extends Validator<TParentData, infer FFN>\n ?\n | FFN\n | FieldValidateFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\n : FieldValidateFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\n\n/**\n * @private\n */\nexport type FieldValidateAsyncFn<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TFieldValidator extends\n | Validator<DeepValue<TParentData, TName>, unknown>\n | undefined = undefined,\n TFormValidator extends\n | Validator<TParentData, unknown>\n | undefined = undefined,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> = (options: {\n value: TData\n fieldApi: FieldApi<TParentData, TName, TFieldValidator, TFormValidator, TData>\n signal: AbortSignal\n}) => ValidationError | Promise<ValidationError>\n\n/**\n * @private\n */\nexport type FieldAsyncValidateOrFn<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TFieldValidator extends\n | Validator<DeepValue<TParentData, TName>, unknown>\n | undefined = undefined,\n TFormValidator extends\n | Validator<TParentData, unknown>\n | undefined = undefined,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> =\n TFieldValidator extends Validator<TData, infer TFN>\n ?\n | TFN\n | FieldValidateAsyncFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\n : TFormValidator extends Validator<TParentData, infer FFN>\n ?\n | FFN\n | FieldValidateAsyncFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\n : FieldValidateAsyncFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\n\nexport interface FieldValidators<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TFieldValidator extends\n | Validator<DeepValue<TParentData, TName>, unknown>\n | undefined = undefined,\n TFormValidator extends\n | Validator<TParentData, unknown>\n | undefined = undefined,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> {\n /**\n * An optional function that takes a param of `formApi` which is a generic type of `TData` and `TParentData`\n */\n onMount?: FieldValidateOrFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\n /**\n * An optional property that takes a `ValidateFn` which is a generic of `TData` and `TParentData`.\n * If `validatorAdapter` is passed, this may also accept a property from the respective adapter\n *\n * @example z.string().min(1) // if `zodAdapter` is passed\n */\n onChange?: FieldValidateOrFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\n /**\n * An optional property similar to `onChange` but async validation. If `validatorAdapter`\n * is passed, this may also accept a property from the respective adapter\n *\n * @example z.string().refine(async (val) => val.length > 3, { message: 'Testing 123' }) // if `zodAdapter` is passed\n */\n onChangeAsync?: FieldAsyncValidateOrFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\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 * If `validatorAdapter` is passed, this may also accept a property from the respective adapter\n *\n * @example z.string().min(1) // if `zodAdapter` is passed\n */\n onBlur?: FieldValidateOrFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\n /**\n * An optional property similar to `onBlur` but async validation. If `validatorAdapter`\n * is passed, this may also accept a property from the respective adapter\n *\n * @example z.string().refine(async (val) => val.length > 3, { message: 'Testing 123' }) // if `zodAdapter` is passed\n */\n onBlurAsync?: FieldAsyncValidateOrFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\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 * If `validatorAdapter` is passed, this may also accept a property from the respective adapter\n *\n * @example z.string().min(1) // if `zodAdapter` is passed\n */\n onSubmit?: FieldValidateOrFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\n /**\n * An optional property similar to `onSubmit` but async validation. If `validatorAdapter`\n * is passed, this may also accept a property from the respective adapter\n *\n * @example z.string().refine(async (val) => val.length > 3, { message: 'Testing 123' }) // if `zodAdapter` is passed\n */\n onSubmitAsync?: FieldAsyncValidateOrFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\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 TFieldValidator extends\n | Validator<DeepValue<TParentData, TName>, unknown>\n | undefined = undefined,\n TFormValidator extends\n | Validator<TParentData, unknown>\n | undefined = undefined,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\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 validator provided by an extension, like `yupValidator` from `@tanstack/yup-form-adapter`\n */\n validatorAdapter?: TFieldValidator\n /**\n * A list of validators to pass to the field\n */\n validators?: FieldValidators<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\n /**\n * An optional object with default metadata for the field.\n */\n defaultMeta?: Partial<FieldMeta>\n}\n\n/**\n * An object type representing the required options for the FieldApi class.\n */\nexport interface FieldApiOptions<\n TParentData,\n TName extends DeepKeys<TParentData>,\n TFieldValidator extends\n | Validator<DeepValue<TParentData, TName>, unknown>\n | undefined = undefined,\n TFormValidator extends\n | Validator<TParentData, unknown>\n | undefined = undefined,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> extends FieldOptions<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n > {\n form: FormApi<TParentData, TFormValidator>\n}\n\n/**\n * An object type representing the metadata of a field in a form.\n */\nexport type FieldMeta = {\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 not been modified by the user. Opposite of `isDirty`.\n */\n isPristine: 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 * An array of errors related to the field value.\n */\n errors: ValidationError[]\n /**\n * A map of errors related to the field value.\n */\n errorMap: ValidationErrorMap\n /**\n * A flag indicating whether the field is currently being validated.\n */\n isValidating: boolean\n}\n\n/**\n * An object type representing the state of a field.\n */\nexport type FieldState<TData> = {\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}\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 TParentData,\n TName extends DeepKeys<TParentData>,\n TFieldValidator extends\n | Validator<DeepValue<TParentData, TName>, unknown>\n | undefined = undefined,\n TFormValidator extends\n | Validator<TParentData, unknown>\n | undefined = undefined,\n TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>,\n> {\n /**\n * A reference to the form API instance.\n */\n form: FieldApiOptions<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\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 TFieldValidator,\n TFormValidator,\n TData\n > = {} as any\n /**\n * The field state store.\n */\n store!: Store<FieldState<TData>>\n /**\n * The current field state.\n */\n state!: FieldState<TData>\n /**\n * @private\n */\n prevState!: FieldState<TData>\n timeoutIds: Record<ValidationCause, ReturnType<typeof setTimeout> | null>\n\n /**\n * Initializes a new `FieldApi` instance.\n */\n constructor(\n opts: FieldApiOptions<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >,\n ) {\n this.form = opts.form as never\n this.name = opts.name as never\n this.timeoutIds = {} as Record<ValidationCause, never>\n if (opts.defaultValue !== undefined) {\n this.form.setFieldValue(this.name, opts.defaultValue as never, {\n dontUpdateMeta: true,\n })\n }\n\n this.store = new Store<FieldState<TData>>(\n {\n value: this.getValue(),\n\n meta: this._getMeta() ?? {\n isValidating: false,\n isTouched: false,\n isBlurred: false,\n isDirty: false,\n isPristine: true,\n errors: [],\n errorMap: {},\n ...opts.defaultMeta,\n },\n },\n {\n onUpdate: () => {\n const state = this.store.state\n\n state.meta.errors = Object.values(state.meta.errorMap).filter(\n (val: unknown) => val !== undefined,\n )\n\n state.meta.isPristine = !state.meta.isDirty\n\n this.prevState = state\n this.state = state\n },\n },\n )\n\n this.state = this.store.state\n this.prevState = this.state\n this.options = opts as never\n }\n\n /**\n * @private\n */\n runValidator<\n TValue extends {\n value: TData\n fieldApi: FieldApi<any, any, any, any>\n validationSource: ValidationSource\n },\n TType extends 'validate' | 'validateAsync',\n >(props: {\n validate: TType extends 'validate'\n ? FieldValidateOrFn<any, any, any, any>\n : FieldAsyncValidateOrFn<any, any, any, any>\n value: TValue\n type: TType\n // When `api` is 'field', the return type cannot be `FormValidationError`\n }): TType extends 'validate' ? ValidationError : Promise<ValidationError> {\n const adapters = [\n this.form.options.validatorAdapter,\n this.options.validatorAdapter,\n ] as const\n for (const adapter of adapters) {\n if (adapter && typeof props.validate !== 'function') {\n return adapter()[props.type](\n props.value as never,\n props.validate,\n ) as never\n }\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 info = this.getInfo()\n info.instance = this as never\n const unsubscribe = this.form.store.subscribe(() => {\n this.store.batch(() => {\n const nextValue = this.getValue()\n const nextMeta = this.getMeta()\n\n if (nextValue !== this.state.value) {\n this.store.setState((prev) => ({ ...prev, value: nextValue }))\n }\n\n if (nextMeta !== this.state.meta) {\n this.store.setState((prev) => ({ ...prev, meta: nextMeta }))\n }\n })\n })\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((prev) => ({\n ...prev,\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n errorMap: { ...prev?.errorMap, onMount: error },\n }))\n }\n }\n\n return () => {\n unsubscribe()\n }\n }\n\n /**\n * Updates the field instance with new options.\n */\n update = (\n opts: FieldApiOptions<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >,\n ) => {\n // Default Value\n\n if (this.state.value === undefined) {\n const formDefault = getBy(opts.form.options.defaultValues, opts.name)\n\n if (opts.defaultValue !== undefined) {\n this.setValue(opts.defaultValue as never, {\n dontUpdateMeta: true,\n })\n } else if (formDefault !== undefined) {\n this.setValue(formDefault as never, {\n dontUpdateMeta: true,\n })\n }\n }\n\n // Default Meta\n if (this._getMeta() === undefined) {\n this.setMeta(this.state.meta)\n }\n\n this.options = opts as never\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 this.validate('change')\n }\n\n /**\n * @private\n */\n _getMeta = () => this.form.getFieldMeta(this.name)\n\n /**\n * Gets the current field metadata.\n */\n getMeta = () =>\n this._getMeta() ??\n ({\n isValidating: false,\n isTouched: false,\n isBlurred: false,\n isDirty: false,\n isPristine: true,\n errors: [],\n errorMap: {},\n ...this.options.defaultMeta,\n } as FieldMeta)\n\n /**\n * Sets the field metadata.\n */\n setMeta = (updater: Updater<FieldMeta>) =>\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 ) => this.form.pushFieldValue(this.name, value as any, opts)\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 ) => this.form.insertFieldValue(this.name, index, value as any, opts)\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 ) => this.form.replaceFieldValue(this.name, index, value as any, opts)\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 /**\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 /**\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 /**\n * @private\n */\n getLinkedFields = (cause: ValidationCause) => {\n const fields = Object.values(this.form.fieldInfo) as FieldInfo<\n any,\n TFormValidator\n >[]\n\n const linkedFields: FieldApi<any, any, any, any>[] = []\n for (const field of fields) {\n if (!field.instance) continue\n const { onChangeListenTo, onBlurListenTo } =\n field.instance.options.validators || {}\n if (\n cause === 'change' &&\n onChangeListenTo?.includes(this.name as string)\n ) {\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<SyncValidator<any> & { field: FieldApi<any, any, any, any> }>,\n )\n\n // Needs type cast as eslint errantly believes this is always falsy\n let hasErrored = false as boolean\n\n this.form.store.batch(() => {\n const validateFieldFn = (\n field: FieldApi<any, any, any, any>,\n validateObj: SyncValidator<any>,\n ) => {\n const errorMapKey = getErrorMapKey(validateObj.cause)\n\n const error =\n /*\n If `validateObj.validate` is `undefined`, then the field doesn't have\n a validator for this event, but there still could be an error that\n needs to be cleaned up related to the current event left by the\n form's validator.\n */\n validateObj.validate\n ? normalizeError(\n field.runValidator({\n validate: validateObj.validate,\n value: {\n value: field.getValue(),\n validationSource: 'field',\n fieldApi: field,\n },\n type: 'validate',\n }),\n )\n : errorFromForm[errorMapKey]\n\n if (field.state.meta.errorMap[errorMapKey] !== error) {\n field.setMeta((prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n [getErrorMapKey(validateObj.cause)]:\n // Prefer the error message from the field validators if they exist\n error ? error : errorFromForm[errorMapKey],\n },\n }))\n }\n if (error || errorFromForm[errorMapKey]) {\n hasErrored = true\n }\n }\n\n for (const validateObj of validates) {\n validateFieldFn(this, validateObj)\n }\n for (const fieldValitateObj of linkedFieldValidates) {\n if (!fieldValitateObj.validate) continue\n validateFieldFn(fieldValitateObj.field, fieldValitateObj)\n }\n })\n\n /**\n * when we have an error for onSubmit in the state, we want\n * to clear the error as soon as the user enters a valid value in the field\n */\n const submitErrKey = getErrorMapKey('submit')\n\n if (\n this.state.meta.errorMap[submitErrKey] &&\n cause !== 'submit' &&\n !hasErrored\n ) {\n this.setMeta((prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n [submitErrKey]: undefined,\n },\n }))\n }\n\n return { hasErrored }\n }\n\n /**\n * @private\n */\n validateAsync = async (\n cause: ValidationCause,\n formValidationResultPromise: Promise<\n FieldsErrorMapFromValidator<TParentData>\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> & { field: FieldApi<any, any, any, any> }\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: FieldApi<any, any, any, any>,\n validateObj: AsyncValidator<any>,\n promises: Promise<ValidationError | undefined>[],\n ) => {\n const errorMapKey = getErrorMapKey(validateObj.cause)\n const fieldValidatorMeta = field.getInfo().validationMetaMap[errorMapKey]\n\n fieldValidatorMeta?.lastAbortController.abort()\n const controller = new AbortController()\n\n this.getInfo().validationMetaMap[errorMapKey] = {\n lastAbortController: controller,\n }\n\n promises.push(\n new Promise<ValidationError | undefined>(async (resolve) => {\n let rawError!: ValidationError | undefined\n try {\n rawError = await new Promise((rawResolve, rawReject) => {\n if (this.timeoutIds[validateObj.cause]) {\n clearTimeout(this.timeoutIds[validateObj.cause]!)\n }\n\n this.timeoutIds[validateObj.cause] = setTimeout(async () => {\n if (controller.signal.aborted) return rawResolve(undefined)\n try {\n rawResolve(\n await this.runValidator({\n validate: validateObj.validate,\n value: {\n value: field.getValue(),\n fieldApi: field,\n signal: controller.signal,\n validationSource: 'field',\n },\n type: 'validateAsync',\n }),\n )\n } catch (e) {\n rawReject(e)\n }\n }, validateObj.debounceMs)\n })\n } catch (e: unknown) {\n rawError = e as ValidationError\n }\n if (controller.signal.aborted) return resolve(undefined)\n const error = normalizeError(rawError)\n const fieldErrorFromForm =\n asyncFormValidationResults[this.name]?.[errorMapKey]\n const fieldError = error || fieldErrorFromForm\n field.setMeta((prev) => {\n return {\n ...prev,\n errorMap: {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n ...prev?.errorMap,\n [errorMapKey]: fieldError,\n },\n }\n })\n\n resolve(fieldError)\n }),\n )\n }\n\n // TODO: Dedupe this logic to reduce bundle size\n for (const validateObj of validates) {\n if (!validateObj.validate) continue\n validateFieldAsyncFn(this, validateObj, validatesPromises)\n }\n for (const fieldValitateObj of linkedFieldValidates) {\n if (!fieldValitateObj.validate) continue\n validateFieldAsyncFn(\n fieldValitateObj.field,\n fieldValitateObj,\n linkedPromises,\n )\n }\n\n let results: ValidationError[] = []\n if (validatesPromises.length || linkedPromises.length) {\n results = await Promise.all(validatesPromises)\n await Promise.all(linkedPromises)\n }\n\n this.setMeta((prev) => ({ ...prev, isValidating: false }))\n\n for (const linkedField of linkedFields) {\n linkedField.setMeta((prev) => ({ ...prev, isValidating: false }))\n }\n\n return results.filter(Boolean)\n }\n\n /**\n * Validates the field value.\n */\n validate = (\n cause: ValidationCause,\n ): 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 } = 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 = 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\n /**\n * Updates the field's errorMap\n */\n setErrorMap(errorMap: ValidationErrorMap) {\n this.setMeta((prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n ...errorMap,\n },\n }))\n }\n}\n\nfunction normalizeError(rawError?: ValidationError) {\n if (rawError) {\n if (typeof rawError !== 'string') {\n return 'Invalid Form Values'\n }\n\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"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tanstack/form-core",
3
- "version": "0.36.1",
3
+ "version": "0.36.2",
4
4
  "description": "Powerful, type-safe, framework agnostic forms.",
5
5
  "author": "tannerlinsley",
6
6
  "license": "MIT",
package/src/FieldApi.ts CHANGED
@@ -978,25 +978,12 @@ export class FieldApi<
978
978
  // If the field is pristine, do not validate
979
979
  if (!this.state.meta.isTouched) return []
980
980
 
981
- let validationErrorFromForm: ValidationErrorMap = {}
982
- let formValidationResultPromise: Promise<
983
- FieldsErrorMapFromValidator<TParentData>
984
- > = Promise.resolve({})
985
-
986
- try {
987
- const formValidationResult = this.form.validate(cause)
988
- if (formValidationResult instanceof Promise) {
989
- formValidationResultPromise = formValidationResult
990
- } else {
991
- const fieldErrorFromForm = formValidationResult[this.name]
992
- if (fieldErrorFromForm) {
993
- validationErrorFromForm = fieldErrorFromForm
994
- }
995
- }
996
- } catch (_) {}
997
-
998
981
  // Attempt to sync validate first
999
- const { hasErrored } = this.validateSync(cause, validationErrorFromForm)
982
+ const { fieldsErrorMap } = this.form.validateSync(cause)
983
+ const { hasErrored } = this.validateSync(
984
+ cause,
985
+ fieldsErrorMap[this.name] ?? {},
986
+ )
1000
987
 
1001
988
  if (hasErrored && !this.options.asyncAlways) {
1002
989
  this.getInfo().validationMetaMap[
@@ -1004,7 +991,9 @@ export class FieldApi<
1004
991
  ]?.lastAbortController.abort()
1005
992
  return this.state.meta.errors
1006
993
  }
994
+
1007
995
  // No error? Attempt async validation
996
+ const formValidationResultPromise = this.form.validateAsync(cause)
1008
997
  return this.validateAsync(cause, formValidationResultPromise)
1009
998
  }
1010
999