@tanstack/form-core 0.23.1 → 0.23.3

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.
@@ -3,6 +3,9 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const store = require("@tanstack/store");
4
4
  const utils = require("./utils.cjs");
5
5
  class FieldApi {
6
+ /**
7
+ * Initializes a new `FieldApi` instance.
8
+ */
6
9
  constructor(opts) {
7
10
  this.options = {};
8
11
  this.mount = () => {
@@ -59,6 +62,9 @@ class FieldApi {
59
62
  if (this._getMeta() === void 0) {
60
63
  this.setMeta(this.state.meta);
61
64
  }
65
+ if (opts2.defaultValue === void 0 && this.form._tempDefaultValue !== void 0 && this.form._tempDefaultValue.field === this.name) {
66
+ opts2.defaultValue = this.form._tempDefaultValue.value;
67
+ }
62
68
  this.options = opts2;
63
69
  };
64
70
  this.getValue = () => {
@@ -286,6 +292,9 @@ class FieldApi {
286
292
  };
287
293
  this.form = opts.form;
288
294
  this.name = opts.name;
295
+ if (opts.defaultValue === void 0 && this.form._tempDefaultValue !== void 0 && this.form._tempDefaultValue.field === this.name) {
296
+ opts.defaultValue = this.form._tempDefaultValue.value;
297
+ }
289
298
  if (opts.defaultValue !== void 0) {
290
299
  this.form.setFieldValue(this.name, opts.defaultValue);
291
300
  }
@@ -313,6 +322,11 @@ class FieldApi {
313
322
  state.meta.isPristine = !state.meta.isDirty;
314
323
  this.prevState = state;
315
324
  this.state = state;
325
+ setTimeout(() => {
326
+ if (this.form._tempDefaultValue !== void 0 && this.form._tempDefaultValue.field === this.name) {
327
+ this.form._tempDefaultValue = void 0;
328
+ }
329
+ }, 0);
316
330
  }
317
331
  }
318
332
  );
@@ -320,6 +334,9 @@ class FieldApi {
320
334
  this.prevState = this.state;
321
335
  this.options = opts;
322
336
  }
337
+ /**
338
+ * @private
339
+ */
323
340
  runValidator(props) {
324
341
  const adapters = [
325
342
  this.form.options.validatorAdapter,
@@ -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, FormApi } from './FormApi'\nimport type {\n ValidationCause,\n ValidationError,\n ValidationErrorMap,\n Validator,\n} from './types'\nimport type { AsyncValidator, SyncValidator, Updater } from './utils'\nimport type { DeepKeys, DeepValue, NoInfer } from './util-types'\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\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> = 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\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\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> = 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 onMount?: FieldValidateOrFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\n onChange?: FieldValidateOrFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\n onChangeAsync?: FieldAsyncValidateOrFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\n onChangeAsyncDebounceMs?: number\n onChangeListenTo?: DeepKeys<TParentData>[]\n onBlur?: FieldValidateOrFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\n onBlurAsync?: FieldAsyncValidateOrFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\n onBlurAsyncDebounceMs?: number\n onBlurListenTo?: DeepKeys<TParentData>[]\n onSubmit?: FieldValidateOrFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\n onSubmitAsync?: FieldAsyncValidateOrFn<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\n}\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 name: TName\n defaultValue?: NoInfer<TData>\n asyncDebounceMs?: number\n asyncAlways?: boolean\n preserveValue?: boolean\n validatorAdapter?: TFieldValidator\n validators?: FieldValidators<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >\n defaultMeta?: Partial<FieldMeta>\n}\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\nexport type FieldMeta = {\n isTouched: boolean\n isPristine: boolean\n isDirty: boolean\n touchedErrors: ValidationError[]\n errors: ValidationError[]\n errorMap: ValidationErrorMap\n isValidating: boolean\n}\n\nexport type FieldState<TData> = {\n value: TData\n meta: FieldMeta\n}\n\nexport type ResolveName<TParentData> = unknown extends TParentData\n ? string\n : DeepKeys<TParentData>\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 form: FieldApiOptions<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n >['form']\n name!: DeepKeys<TParentData>\n options: FieldApiOptions<\n TParentData,\n TName,\n TFieldValidator,\n TFormValidator,\n TData\n > = {} as any\n store!: Store<FieldState<TData>>\n state!: FieldState<TData>\n prevState!: FieldState<TData>\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\n if (opts.defaultValue !== undefined) {\n this.form.setFieldValue(this.name, opts.defaultValue as never)\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 isDirty: false,\n isPristine: true,\n touchedErrors: [],\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.touchedErrors = state.meta.isTouched\n ? state.meta.errors\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 runValidator<\n TValue extends { value: TData; fieldApi: FieldApi<any, any, any, any> },\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 }): ReturnType<ReturnType<Validator<any>>[TType]> {\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 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 },\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 const preserveValue = this.options.preserveValue\n unsubscribe()\n if (!preserveValue) {\n this.form.deleteField(this.name)\n }\n }\n }\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 } else if (formDefault !== undefined) {\n this.setValue(formDefault as never)\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 getValue = (): TData => {\n return this.form.getFieldValue(this.name) as TData\n }\n\n setValue = (\n updater: Updater<TData>,\n options?: { touch?: boolean; notify?: boolean },\n ) => {\n this.form.setFieldValue(this.name, updater as never, options)\n this.validate('change')\n }\n\n _getMeta = () => this.form.getFieldMeta(this.name)\n getMeta = () =>\n this._getMeta() ??\n ({\n isValidating: false,\n isTouched: false,\n isDirty: false,\n isPristine: true,\n touchedErrors: [],\n errors: [],\n errorMap: {},\n ...this.options.defaultMeta,\n } as FieldMeta)\n\n setMeta = (updater: Updater<FieldMeta>) =>\n this.form.setFieldMeta(this.name, updater)\n\n getInfo = () => this.form.getFieldInfo(this.name)\n\n pushValue = (\n value: TData extends any[] ? TData[number] : never,\n opts?: { touch?: boolean },\n ) => this.form.pushFieldValue(this.name, value as any, opts)\n\n insertValue = (\n index: number,\n value: TData extends any[] ? TData[number] : never,\n opts?: { touch?: boolean },\n ) => this.form.insertFieldValue(this.name, index, value as any, opts)\n\n replaceValue = (\n index: number,\n value: TData extends any[] ? TData[number] : never,\n opts?: { touch?: boolean },\n ) => this.form.replaceFieldValue(this.name, index, value as any, opts)\n\n removeValue = (index: number, opts?: { touch: boolean }) =>\n this.form.removeFieldValue(this.name, index, opts)\n\n swapValues = (aIndex: number, bIndex: number, opts?: { touch?: boolean }) =>\n this.form.swapFieldValues(this.name, aIndex, bIndex, opts)\n\n moveValue = (aIndex: number, bIndex: number, opts?: { touch?: boolean }) =>\n this.form.moveFieldValues(this.name, aIndex, bIndex, opts)\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 validateSync = (cause: ValidationCause) => {\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 error = normalizeError(\n field.runValidator({\n validate: validateObj.validate,\n value: { value: field.getValue(), fieldApi: field },\n type: 'validate',\n }),\n )\n const errorMapKey = getErrorMapKey(validateObj.cause)\n if (field.state.meta.errorMap[errorMapKey] !== error) {\n field.setMeta((prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n [getErrorMapKey(validateObj.cause)]: error,\n },\n }))\n }\n if (error) {\n hasErrored = true\n }\n }\n\n for (const validateObj of validates) {\n if (!validateObj.validate) continue\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 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 validateAsync = async (cause: ValidationCause) => {\n const validates = getAsyncValidatorArray(cause, this.options)\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 key = getErrorMapKey(validateObj.cause)\n const fieldValidatorMeta = field.getInfo().validationMetaMap[key]\n\n fieldValidatorMeta?.lastAbortController.abort()\n const controller = new AbortController()\n\n this.getInfo().validationMetaMap[key] = {\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 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 },\n type: 'validateAsync',\n }),\n )\n } catch (e) {\n rawReject(e)\n }\n }, validateObj.debounceMs)\n })\n } catch (e: unknown) {\n rawError = e as ValidationError\n }\n const error = normalizeError(rawError)\n field.setMeta((prev) => {\n return {\n ...prev,\n errorMap: {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n ...prev?.errorMap,\n [getErrorMapKey(cause)]: error,\n },\n }\n })\n\n resolve(error)\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 validate = (\n cause: ValidationCause,\n ): ValidationError[] | Promise<ValidationError[]> => {\n // If the field is pristine and validatePristine is false, do not validate\n if (!this.state.meta.isTouched) return []\n\n try {\n this.form.validate(cause)\n } catch (_) {}\n\n // Attempt to sync validate first\n const { hasErrored } = this.validateSync(cause)\n\n if (hasErrored && !this.options.asyncAlways) {\n return this.state.meta.errors\n }\n // No error? Attempt async validation\n return this.validateAsync(cause)\n }\n\n handleChange = (updater: Updater<TData>) => {\n this.setValue(updater, { touch: true })\n }\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 this.validate('blur')\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":";;;;AA2PO,MAAM,SAUX;AAAA,EAoBA,YACE,MAOA;AAnBF,SAAA,UAMI;AAuFJ,SAAA,QAAQ,MAAM;AACN,YAAA,OAAO,KAAK;AAClB,WAAK,WAAW;AAChB,YAAM,cAAc,KAAK,KAAK,MAAM,UAAU,MAAM;AAC7C,aAAA,MAAM,MAAM,MAAM;AACf,gBAAA,YAAY,KAAK;AACjB,gBAAA,WAAW,KAAK;AAElB,cAAA,cAAc,KAAK,MAAM,OAAO;AAC7B,iBAAA,MAAM,SAAS,CAAC,UAAU,EAAE,GAAG,MAAM,OAAO,UAAY,EAAA;AAAA,UAC/D;AAEI,cAAA,aAAa,KAAK,MAAM,MAAM;AAC3B,iBAAA,MAAM,SAAS,CAAC,UAAU,EAAE,GAAG,MAAM,MAAM,SAAW,EAAA;AAAA,UAC7D;AAAA,QAAA,CACD;AAAA,MAAA,CACF;AAEI,WAAA,OAAO,KAAK,OAAgB;AACjC,YAAM,EAAE,QAAQ,IAAI,KAAK,QAAQ,cAAc,CAAA;AAE/C,UAAI,SAAS;AACL,cAAA,QAAQ,KAAK,aAAa;AAAA,UAC9B,UAAU;AAAA,UACV,OAAO;AAAA,YACL,OAAO,KAAK,MAAM;AAAA,YAClB,UAAU;AAAA,UACZ;AAAA,UACA,MAAM;AAAA,QAAA,CACP;AACD,YAAI,OAAO;AACJ,eAAA,QAAQ,CAAC,UAAU;AAAA,YACtB,GAAG;AAAA;AAAA,YAEH,UAAU,EAAE,GAAG,6BAAM,UAAU,SAAS,MAAM;AAAA,UAC9C,EAAA;AAAA,QACJ;AAAA,MACF;AAEA,aAAO,MAAM;AACL,cAAA,gBAAgB,KAAK,QAAQ;AACvB;AACZ,YAAI,CAAC,eAAe;AACb,eAAA,KAAK,YAAY,KAAK,IAAI;AAAA,QACjC;AAAA,MAAA;AAAA,IACF;AAGF,SAAA,SAAS,CACPA,UAOG;AAGC,UAAA,KAAK,MAAM,UAAU,QAAW;AAClC,cAAM,cAAcC,MAAM,MAAAD,MAAK,KAAK,QAAQ,eAAeA,MAAK,IAAI;AAEhE,YAAAA,MAAK,iBAAiB,QAAW;AAC9B,eAAA,SAASA,MAAK,YAAqB;AAAA,QAAA,WAC/B,gBAAgB,QAAW;AACpC,eAAK,SAAS,WAAoB;AAAA,QACpC;AAAA,MACF;AAGI,UAAA,KAAK,eAAe,QAAW;AAC5B,aAAA,QAAQ,KAAK,MAAM,IAAI;AAAA,MAC9B;AAEA,WAAK,UAAUA;AAAA,IAAA;AAGjB,SAAA,WAAW,MAAa;AACtB,aAAO,KAAK,KAAK,cAAc,KAAK,IAAI;AAAA,IAAA;AAG/B,SAAA,WAAA,CACT,SACA,YACG;AACH,WAAK,KAAK,cAAc,KAAK,MAAM,SAAkB,OAAO;AAC5D,WAAK,SAAS,QAAQ;AAAA,IAAA;AAGxB,SAAA,WAAW,MAAM,KAAK,KAAK,aAAa,KAAK,IAAI;AACvC,SAAA,UAAA,MACR,KAAK,SAAA,KACJ;AAAA,MACC,cAAc;AAAA,MACd,WAAW;AAAA,MACX,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,eAAe,CAAC;AAAA,MAChB,QAAQ,CAAC;AAAA,MACT,UAAU,CAAC;AAAA,MACX,GAAG,KAAK,QAAQ;AAAA,IAAA;AAGpB,SAAA,UAAU,CAAC,YACT,KAAK,KAAK,aAAa,KAAK,MAAM,OAAO;AAE3C,SAAA,UAAU,MAAM,KAAK,KAAK,aAAa,KAAK,IAAI;AAEpC,SAAA,YAAA,CACV,OACAA,UACG,KAAK,KAAK,eAAe,KAAK,MAAM,OAAcA,KAAI;AAE7C,SAAA,cAAA,CACZ,OACA,OACAA,UACG,KAAK,KAAK,iBAAiB,KAAK,MAAM,OAAO,OAAcA,KAAI;AAErD,SAAA,eAAA,CACb,OACA,OACAA,UACG,KAAK,KAAK,kBAAkB,KAAK,MAAM,OAAO,OAAcA,KAAI;AAEvD,SAAA,cAAA,CAAC,OAAeA,UAC5B,KAAK,KAAK,iBAAiB,KAAK,MAAM,OAAOA,KAAI;AAEtC,SAAA,aAAA,CAAC,QAAgB,QAAgBA,UAC5C,KAAK,KAAK,gBAAgB,KAAK,MAAM,QAAQ,QAAQA,KAAI;AAE/C,SAAA,YAAA,CAAC,QAAgB,QAAgBA,UAC3C,KAAK,KAAK,gBAAgB,KAAK,MAAM,QAAQ,QAAQA,KAAI;AAE3D,SAAA,kBAAkB,CAAC,UAA2B;AAC5C,YAAM,SAAS,OAAO,OAAO,KAAK,KAAK,SAAS;AAKhD,YAAM,eAA+C,CAAA;AACrD,iBAAW,SAAS,QAAQ;AAC1B,YAAI,CAAC,MAAM;AAAU;AACf,cAAA,EAAE,kBAAkB,mBACxB,MAAM,SAAS,QAAQ,cAAc;AACvC,YACE,UAAU,aACV,qDAAkB,SAAS,KAAK,QAChC;AACa,uBAAA,KAAK,MAAM,QAAQ;AAAA,QAClC;AACA,YAAI,UAAU,WAAU,iDAAgB,SAAS,KAAK,QAAiB;AACxD,uBAAA,KAAK,MAAM,QAAQ;AAAA,QAClC;AAAA,MACF;AAEO,aAAA;AAAA,IAAA;AAGT,SAAA,eAAe,CAAC,UAA2B;AACzC,YAAM,YAAYE,MAAA,sBAAsB,OAAO,KAAK,OAAO;AAErD,YAAA,eAAe,KAAK,gBAAgB,KAAK;AAC/C,YAAM,uBAAuB,aAAa;AAAA,QACxC,CAAC,KAAK,UAAU;AACd,gBAAM,iBAAiBA,MAAA,sBAAsB,OAAO,MAAM,OAAO;AAClD,yBAAA,QAAQ,CAAC,aAAa;AACjC,qBAAiB,QAAQ;AAAA,UAAA,CAC5B;AACM,iBAAA,IAAI,OAAO,cAAuB;AAAA,QAC3C;AAAA,QACA,CAAC;AAAA,MAAA;AAIH,UAAI,aAAa;AAEZ,WAAA,KAAK,MAAM,MAAM,MAAM;AACpB,cAAA,kBAAkB,CACtB,OACA,gBACG;AACH,gBAAM,QAAQ;AAAA,YACZ,MAAM,aAAa;AAAA,cACjB,UAAU,YAAY;AAAA,cACtB,OAAO,EAAE,OAAO,MAAM,SAAS,GAAG,UAAU,MAAM;AAAA,cAClD,MAAM;AAAA,YAAA,CACP;AAAA,UAAA;AAEG,gBAAA,cAAc,eAAe,YAAY,KAAK;AACpD,cAAI,MAAM,MAAM,KAAK,SAAS,WAAW,MAAM,OAAO;AAC9C,kBAAA,QAAQ,CAAC,UAAU;AAAA,cACvB,GAAG;AAAA,cACH,UAAU;AAAA,gBACR,GAAG,KAAK;AAAA,gBACR,CAAC,eAAe,YAAY,KAAK,CAAC,GAAG;AAAA,cACvC;AAAA,YACA,EAAA;AAAA,UACJ;AACA,cAAI,OAAO;AACI,yBAAA;AAAA,UACf;AAAA,QAAA;AAGF,mBAAW,eAAe,WAAW;AACnC,cAAI,CAAC,YAAY;AAAU;AAC3B,0BAAgB,MAAM,WAAW;AAAA,QACnC;AACA,mBAAW,oBAAoB,sBAAsB;AACnD,cAAI,CAAC,iBAAiB;AAAU;AAChB,0BAAA,iBAAiB,OAAO,gBAAgB;AAAA,QAC1D;AAAA,MAAA,CACD;AAMK,YAAA,eAAe,eAAe,QAAQ;AAE1C,UAAA,KAAK,MAAM,KAAK,SAAS,YAAY,KACrC,UAAU,YACV,CAAC,YACD;AACK,aAAA,QAAQ,CAAC,UAAU;AAAA,UACtB,GAAG;AAAA,UACH,UAAU;AAAA,YACR,GAAG,KAAK;AAAA,YACR,CAAC,YAAY,GAAG;AAAA,UAClB;AAAA,QACA,EAAA;AAAA,MACJ;AAEA,aAAO,EAAE,WAAW;AAAA,IAAA;AAGtB,SAAA,gBAAgB,OAAO,UAA2B;AAChD,YAAM,YAAYC,MAAA,uBAAuB,OAAO,KAAK,OAAO;AAEtD,YAAA,eAAe,KAAK,gBAAgB,KAAK;AAC/C,YAAM,uBAAuB,aAAa;AAAA,QACxC,CAAC,KAAK,UAAU;AACd,gBAAM,iBAAiBA,MAAA,uBAAuB,OAAO,MAAM,OAAO;AACnD,yBAAA,QAAQ,CAAC,aAAa;AACjC,qBAAiB,QAAQ;AAAA,UAAA,CAC5B;AACM,iBAAA,IAAI,OAAO,cAAuB;AAAA,QAC3C;AAAA,QACA,CAAC;AAAA,MAAA;AAKH,UAAI,CAAC,KAAK,MAAM,KAAK,cAAc;AAC5B,aAAA,QAAQ,CAAC,UAAU,EAAE,GAAG,MAAM,cAAc,KAAO,EAAA;AAAA,MAC1D;AAEA,iBAAW,eAAe,cAAc;AAC1B,oBAAA,QAAQ,CAAC,UAAU,EAAE,GAAG,MAAM,cAAc,KAAO,EAAA;AAAA,MACjE;AAMA,YAAM,oBAA4D,CAAA;AAClE,YAAM,iBAAyD,CAAA;AAE/D,YAAM,uBAAuB,CAC3B,OACA,aACA,aACG;AACG,cAAA,MAAM,eAAe,YAAY,KAAK;AAC5C,cAAM,qBAAqB,MAAM,QAAQ,EAAE,kBAAkB,GAAG;AAEhE,iEAAoB,oBAAoB;AAClC,cAAA,aAAa,IAAI;AAEvB,aAAK,QAAQ,EAAE,kBAAkB,GAAG,IAAI;AAAA,UACtC,qBAAqB;AAAA,QAAA;AAGd,iBAAA;AAAA,UACP,IAAI,QAAqC,OAAO,YAAY;AACtD,gBAAA;AACA,gBAAA;AACF,yBAAW,MAAM,IAAI,QAAQ,CAAC,YAAY,cAAc;AACtD,2BAAW,YAAY;AACrB,sBAAI,WAAW,OAAO;AAAS,2BAAO,WAAW,MAAS;AACtD,sBAAA;AACF;AAAA,sBACE,MAAM,KAAK,aAAa;AAAA,wBACtB,UAAU,YAAY;AAAA,wBACtB,OAAO;AAAA,0BACL,OAAO,MAAM,SAAS;AAAA,0BACtB,UAAU;AAAA,0BACV,QAAQ,WAAW;AAAA,wBACrB;AAAA,wBACA,MAAM;AAAA,sBAAA,CACP;AAAA,oBAAA;AAAA,2BAEI,GAAG;AACV,8BAAU,CAAC;AAAA,kBACb;AAAA,gBAAA,GACC,YAAY,UAAU;AAAA,cAAA,CAC1B;AAAA,qBACM,GAAY;AACR,yBAAA;AAAA,YACb;AACM,kBAAA,QAAQ,eAAe,QAAQ;AAC/B,kBAAA,QAAQ,CAAC,SAAS;AACf,qBAAA;AAAA,gBACL,GAAG;AAAA,gBACH,UAAU;AAAA;AAAA,kBAER,GAAG,6BAAM;AAAA,kBACT,CAAC,eAAe,KAAK,CAAC,GAAG;AAAA,gBAC3B;AAAA,cAAA;AAAA,YACF,CACD;AAED,oBAAQ,KAAK;AAAA,UAAA,CACd;AAAA,QAAA;AAAA,MACH;AAIF,iBAAW,eAAe,WAAW;AACnC,YAAI,CAAC,YAAY;AAAU;AACN,6BAAA,MAAM,aAAa,iBAAiB;AAAA,MAC3D;AACA,iBAAW,oBAAoB,sBAAsB;AACnD,YAAI,CAAC,iBAAiB;AAAU;AAChC;AAAA,UACE,iBAAiB;AAAA,UACjB;AAAA,UACA;AAAA,QAAA;AAAA,MAEJ;AAEA,UAAI,UAA6B,CAAA;AAC7B,UAAA,kBAAkB,UAAU,eAAe,QAAQ;AAC3C,kBAAA,MAAM,QAAQ,IAAI,iBAAiB;AACvC,cAAA,QAAQ,IAAI,cAAc;AAAA,MAClC;AAEK,WAAA,QAAQ,CAAC,UAAU,EAAE,GAAG,MAAM,cAAc,MAAQ,EAAA;AAEzD,iBAAW,eAAe,cAAc;AAC1B,oBAAA,QAAQ,CAAC,UAAU,EAAE,GAAG,MAAM,cAAc,MAAQ,EAAA;AAAA,MAClE;AAEO,aAAA,QAAQ,OAAO,OAAO;AAAA,IAAA;AAG/B,SAAA,WAAW,CACT,UACmD;AAE/C,UAAA,CAAC,KAAK,MAAM,KAAK;AAAW,eAAO;AAEnC,UAAA;AACG,aAAA,KAAK,SAAS,KAAK;AAAA,eACjB,GAAG;AAAA,MAAC;AAGb,YAAM,EAAE,WAAe,IAAA,KAAK,aAAa,KAAK;AAE9C,UAAI,cAAc,CAAC,KAAK,QAAQ,aAAa;AACpC,eAAA,KAAK,MAAM,KAAK;AAAA,MACzB;AAEO,aAAA,KAAK,cAAc,KAAK;AAAA,IAAA;AAGjC,SAAA,eAAe,CAAC,YAA4B;AAC1C,WAAK,SAAS,SAAS,EAAE,OAAO,KAAM,CAAA;AAAA,IAAA;AAGxC,SAAA,aAAa,MAAM;AACX,YAAA,cAAc,KAAK,MAAM,KAAK;AACpC,UAAI,CAAC,aAAa;AACX,aAAA,QAAQ,CAAC,UAAU,EAAE,GAAG,MAAM,WAAW,KAAO,EAAA;AACrD,aAAK,SAAS,QAAQ;AAAA,MACxB;AACA,WAAK,SAAS,MAAM;AAAA,IAAA;AA3cpB,SAAK,OAAO,KAAK;AACjB,SAAK,OAAO,KAAK;AAEb,QAAA,KAAK,iBAAiB,QAAW;AACnC,WAAK,KAAK,cAAc,KAAK,MAAM,KAAK,YAAqB;AAAA,IAC/D;AAEA,SAAK,QAAQ,IAAIC,MAAA;AAAA,MACf;AAAA,QACE,OAAO,KAAK,SAAS;AAAA,QAErB,MAAM,KAAK,cAAc;AAAA,UACvB,cAAc;AAAA,UACd,WAAW;AAAA,UACX,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,eAAe,CAAC;AAAA,UAChB,QAAQ,CAAC;AAAA,UACT,UAAU,CAAC;AAAA,UACX,GAAG,KAAK;AAAA,QACV;AAAA,MACF;AAAA,MACA;AAAA,QACE,UAAU,MAAM;AACR,gBAAA,QAAQ,KAAK,MAAM;AAEzB,gBAAM,KAAK,SAAS,OAAO,OAAO,MAAM,KAAK,QAAQ,EAAE;AAAA,YACrD,CAAC,QAAiB,QAAQ;AAAA,UAAA;AAGtB,gBAAA,KAAK,gBAAgB,MAAM,KAAK,YAClC,MAAM,KAAK,SACX;AAEJ,gBAAM,KAAK,aAAa,CAAC,MAAM,KAAK;AAEpC,eAAK,YAAY;AACjB,eAAK,QAAQ;AAAA,QACf;AAAA,MACF;AAAA,IAAA;AAGG,SAAA,QAAQ,KAAK,MAAM;AACxB,SAAK,YAAY,KAAK;AACtB,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,aAGE,OAMgD;AAChD,UAAM,WAAW;AAAA,MACf,KAAK,KAAK,QAAQ;AAAA,MAClB,KAAK,QAAQ;AAAA,IAAA;AAEf,eAAW,WAAW,UAAU;AAC9B,UAAI,WAAW,OAAO,MAAM,aAAa,YAAY;AAC5C,eAAA,QAAA,EAAU,MAAM,IAAI;AAAA,UACzB,MAAM;AAAA,UACN,MAAM;AAAA,QAAA;AAAA,MAEV;AAAA,IACF;AAEQ,WAAA,MAAM,SAAuC,MAAM,KAAK;AAAA,EAClE;AAsYF;AAEA,SAAS,eAAe,UAA4B;AAClD,MAAI,UAAU;AACR,QAAA,OAAO,aAAa,UAAU;AACzB,aAAA;AAAA,IACT;AAEO,WAAA;AAAA,EACT;AAEO,SAAA;AACT;AAEA,SAAS,eAAe,OAAwB;AAC9C,UAAQ,OAAO;AAAA,IACb,KAAK;AACI,aAAA;AAAA,IACT,KAAK;AACI,aAAA;AAAA,IACT,KAAK;AACI,aAAA;AAAA,IACT,KAAK;AACI,aAAA;AAAA,IACT,KAAK;AAAA,IACL;AACS,aAAA;AAAA,EACX;AACF;;"}
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, FormApi } from './FormApi'\nimport type {\n ValidationCause,\n ValidationError,\n ValidationErrorMap,\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> = 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> = 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 when run when subscribing to 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 when run when subscribing to submit 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 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 preserveValue?: 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 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 touched state of the field.\n */\n touchedErrors: ValidationError[]\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\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\n if (\n opts.defaultValue === undefined &&\n this.form._tempDefaultValue !== undefined &&\n this.form._tempDefaultValue.field === this.name\n ) {\n opts.defaultValue = this.form._tempDefaultValue.value as never\n }\n\n if (opts.defaultValue !== undefined) {\n this.form.setFieldValue(this.name, opts.defaultValue as never)\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 isDirty: false,\n isPristine: true,\n touchedErrors: [],\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.touchedErrors = state.meta.isTouched\n ? state.meta.errors\n : []\n\n state.meta.isPristine = !state.meta.isDirty\n\n this.prevState = state\n this.state = state\n\n // Cleanup the temp value after this \"tick\"\n // (Everything occurs sync otherwise)\n setTimeout(() => {\n if (\n this.form._tempDefaultValue !== undefined &&\n this.form._tempDefaultValue.field === this.name\n ) {\n this.form._tempDefaultValue = undefined\n }\n }, 0)\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 { value: TData; fieldApi: FieldApi<any, any, any, any> },\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 }): ReturnType<ReturnType<Validator<any>>[TType]> {\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 },\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 const preserveValue = this.options.preserveValue\n unsubscribe()\n if (!preserveValue) {\n this.form.deleteField(this.name)\n }\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 } else if (formDefault !== undefined) {\n this.setValue(formDefault as never)\n }\n }\n\n // Default Meta\n if (this._getMeta() === undefined) {\n this.setMeta(this.state.meta)\n }\n\n if (\n opts.defaultValue === undefined &&\n this.form._tempDefaultValue !== undefined &&\n this.form._tempDefaultValue.field === this.name\n ) {\n opts.defaultValue = this.form._tempDefaultValue.value as never\n }\n\n this.options = opts as never\n }\n\n /**\n * Gets the current field value.\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 = (\n updater: Updater<TData>,\n options?: { touch?: boolean; notify?: boolean },\n ) => {\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 isDirty: false,\n isPristine: true,\n touchedErrors: [],\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?: { touch?: boolean },\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?: { touch?: boolean },\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?: { touch?: boolean },\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?: { touch: boolean }) =>\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?: { touch?: boolean }) =>\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?: { touch?: boolean }) =>\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 = (cause: ValidationCause) => {\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 error = normalizeError(\n field.runValidator({\n validate: validateObj.validate,\n value: { value: field.getValue(), fieldApi: field },\n type: 'validate',\n }),\n )\n const errorMapKey = getErrorMapKey(validateObj.cause)\n if (field.state.meta.errorMap[errorMapKey] !== error) {\n field.setMeta((prev) => ({\n ...prev,\n errorMap: {\n ...prev.errorMap,\n [getErrorMapKey(validateObj.cause)]: error,\n },\n }))\n }\n if (error) {\n hasErrored = true\n }\n }\n\n for (const validateObj of validates) {\n if (!validateObj.validate) continue\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 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 (cause: ValidationCause) => {\n const validates = getAsyncValidatorArray(cause, this.options)\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 key = getErrorMapKey(validateObj.cause)\n const fieldValidatorMeta = field.getInfo().validationMetaMap[key]\n\n fieldValidatorMeta?.lastAbortController.abort()\n const controller = new AbortController()\n\n this.getInfo().validationMetaMap[key] = {\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 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 },\n type: 'validateAsync',\n }),\n )\n } catch (e) {\n rawReject(e)\n }\n }, validateObj.debounceMs)\n })\n } catch (e: unknown) {\n rawError = e as ValidationError\n }\n const error = normalizeError(rawError)\n field.setMeta((prev) => {\n return {\n ...prev,\n errorMap: {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n ...prev?.errorMap,\n [getErrorMapKey(cause)]: error,\n },\n }\n })\n\n resolve(error)\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 and validatePristine is false, do not validate\n if (!this.state.meta.isTouched) return []\n\n try {\n this.form.validate(cause)\n } catch (_) {}\n\n // Attempt to sync validate first\n const { hasErrored } = this.validateSync(cause)\n\n if (hasErrored && !this.options.asyncAlways) {\n return this.state.meta.errors\n }\n // No error? Attempt async validation\n return this.validateAsync(cause)\n }\n\n /**\n * Handles the change event.\n */\n handleChange = (updater: Updater<TData>) => {\n this.setValue(updater, { touch: true })\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 this.validate('blur')\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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"}
@@ -4,65 +4,224 @@ import { ValidationCause, ValidationError, ValidationErrorMap, Validator } from
4
4
  import { Updater } from './utils.cjs';
5
5
  import { DeepKeys, DeepValue, NoInfer } from './util-types.cjs';
6
6
 
7
+ /**
8
+ * @private
9
+ */
7
10
  export type FieldValidateFn<TParentData, TName extends DeepKeys<TParentData>, TFieldValidator extends Validator<DeepValue<TParentData, TName>, unknown> | undefined = undefined, TFormValidator extends Validator<TParentData, unknown> | undefined = undefined, TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>> = (props: {
8
11
  value: TData;
9
12
  fieldApi: FieldApi<TParentData, TName, TFieldValidator, TFormValidator, TData>;
10
13
  }) => ValidationError;
14
+ /**
15
+ * @private
16
+ */
11
17
  export type FieldValidateOrFn<TParentData, TName extends DeepKeys<TParentData>, TFieldValidator extends Validator<DeepValue<TParentData, TName>, unknown> | undefined = undefined, TFormValidator extends Validator<TParentData, unknown> | undefined = undefined, TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>> = TFieldValidator extends Validator<TData, infer TFN> ? TFN | FieldValidateFn<TParentData, TName, TFieldValidator, TFormValidator, TData> : TFormValidator extends Validator<TParentData, infer FFN> ? FFN | FieldValidateFn<TParentData, TName, TFieldValidator, TFormValidator, TData> : FieldValidateFn<TParentData, TName, TFieldValidator, TFormValidator, TData>;
18
+ /**
19
+ * @private
20
+ */
12
21
  export type FieldValidateAsyncFn<TParentData, TName extends DeepKeys<TParentData>, TFieldValidator extends Validator<DeepValue<TParentData, TName>, unknown> | undefined = undefined, TFormValidator extends Validator<TParentData, unknown> | undefined = undefined, TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>> = (options: {
13
22
  value: TData;
14
23
  fieldApi: FieldApi<TParentData, TName, TFieldValidator, TFormValidator, TData>;
15
24
  signal: AbortSignal;
16
25
  }) => ValidationError | Promise<ValidationError>;
26
+ /**
27
+ * @private
28
+ */
17
29
  export type FieldAsyncValidateOrFn<TParentData, TName extends DeepKeys<TParentData>, TFieldValidator extends Validator<DeepValue<TParentData, TName>, unknown> | undefined = undefined, TFormValidator extends Validator<TParentData, unknown> | undefined = undefined, TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>> = TFieldValidator extends Validator<TData, infer TFN> ? TFN | FieldValidateAsyncFn<TParentData, TName, TFieldValidator, TFormValidator, TData> : TFormValidator extends Validator<TParentData, infer FFN> ? FFN | FieldValidateAsyncFn<TParentData, TName, TFieldValidator, TFormValidator, TData> : FieldValidateAsyncFn<TParentData, TName, TFieldValidator, TFormValidator, TData>;
18
30
  export interface FieldValidators<TParentData, TName extends DeepKeys<TParentData>, TFieldValidator extends Validator<DeepValue<TParentData, TName>, unknown> | undefined = undefined, TFormValidator extends Validator<TParentData, unknown> | undefined = undefined, TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>> {
31
+ /**
32
+ * An optional function that takes a param of `formApi` which is a generic type of `TData` and `TParentData`
33
+ */
19
34
  onMount?: FieldValidateOrFn<TParentData, TName, TFieldValidator, TFormValidator, TData>;
35
+ /**
36
+ * An optional property that takes a `ValidateFn` which is a generic of `TData` and `TParentData`.
37
+ * If `validatorAdapter` is passed, this may also accept a property from the respective adapter
38
+ *
39
+ * @example `z.string().min(1)` if `zodAdapter` is passed
40
+ */
20
41
  onChange?: FieldValidateOrFn<TParentData, TName, TFieldValidator, TFormValidator, TData>;
42
+ /**
43
+ * An optional property similar to `onChange` but async validation. If `validatorAdapter`
44
+ * is passed, this may also accept a property from the respective adapter
45
+ *
46
+ * @example `z.string().refine(async (val) => val.length > 3, { message: 'Testing 123' })` if `zodAdapter` is passed
47
+ */
21
48
  onChangeAsync?: FieldAsyncValidateOrFn<TParentData, TName, TFieldValidator, TFormValidator, TData>;
49
+ /**
50
+ * An optional number to represent how long the `onChangeAsync` should wait before running
51
+ *
52
+ * If set to a number larger than 0, will debounce the async validation event by this length of time in milliseconds
53
+ */
22
54
  onChangeAsyncDebounceMs?: number;
55
+ /**
56
+ * An optional list of field names that should trigger this field's `onChange` and `onChangeAsync` events when its value changes
57
+ */
23
58
  onChangeListenTo?: DeepKeys<TParentData>[];
59
+ /**
60
+ * An optional function, that when run when subscribing to blur event of input.
61
+ * If `validatorAdapter` is passed, this may also accept a property from the respective adapter
62
+ *
63
+ * @example `z.string().min(1)` if `zodAdapter` is passed
64
+ */
24
65
  onBlur?: FieldValidateOrFn<TParentData, TName, TFieldValidator, TFormValidator, TData>;
66
+ /**
67
+ * An optional property similar to `onBlur` but async validation. If `validatorAdapter`
68
+ * is passed, this may also accept a property from the respective adapter
69
+ *
70
+ * @example `z.string().refine(async (val) => val.length > 3, { message: 'Testing 123' })` if `zodAdapter` is passed
71
+ */
25
72
  onBlurAsync?: FieldAsyncValidateOrFn<TParentData, TName, TFieldValidator, TFormValidator, TData>;
73
+ /**
74
+ * An optional number to represent how long the `onBlurAsync` should wait before running
75
+ *
76
+ * If set to a number larger than 0, will debounce the async validation event by this length of time in milliseconds
77
+ */
26
78
  onBlurAsyncDebounceMs?: number;
79
+ /**
80
+ * An optional list of field names that should trigger this field's `onBlur` and `onBlurAsync` events when its value changes
81
+ */
27
82
  onBlurListenTo?: DeepKeys<TParentData>[];
83
+ /**
84
+ * An optional function, that when run when subscribing to submit event of input.
85
+ * If `validatorAdapter` is passed, this may also accept a property from the respective adapter
86
+ *
87
+ * @example `z.string().min(1)` if `zodAdapter` is passed
88
+ */
28
89
  onSubmit?: FieldValidateOrFn<TParentData, TName, TFieldValidator, TFormValidator, TData>;
90
+ /**
91
+ * An optional property similar to `onSubmit` but async validation. If `validatorAdapter`
92
+ * is passed, this may also accept a property from the respective adapter
93
+ *
94
+ * @example `z.string().refine(async (val) => val.length > 3, { message: 'Testing 123' })` if `zodAdapter` is passed
95
+ */
29
96
  onSubmitAsync?: FieldAsyncValidateOrFn<TParentData, TName, TFieldValidator, TFormValidator, TData>;
30
97
  }
98
+ /**
99
+ * An object type representing the options for a field in a form.
100
+ */
31
101
  export interface FieldOptions<TParentData, TName extends DeepKeys<TParentData>, TFieldValidator extends Validator<DeepValue<TParentData, TName>, unknown> | undefined = undefined, TFormValidator extends Validator<TParentData, unknown> | undefined = undefined, TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>> {
102
+ /**
103
+ * The field name. The type will be `DeepKeys<TParentData>` to ensure your name is a deep key of the parent dataset.
104
+ */
32
105
  name: TName;
106
+ /**
107
+ * An optional default value for the field.
108
+ */
33
109
  defaultValue?: NoInfer<TData>;
110
+ /**
111
+ * The default time to debounce async validation if there is not a more specific debounce time passed.
112
+ */
34
113
  asyncDebounceMs?: number;
114
+ /**
115
+ * If `true`, always run async validation, even if there are errors emitted during synchronous validation.
116
+ */
35
117
  asyncAlways?: boolean;
36
118
  preserveValue?: boolean;
119
+ /**
120
+ * A validator provided by an extension, like `yupValidator` from `@tanstack/yup-form-adapter`
121
+ */
37
122
  validatorAdapter?: TFieldValidator;
123
+ /**
124
+ * A list of validators to pass to the field
125
+ */
38
126
  validators?: FieldValidators<TParentData, TName, TFieldValidator, TFormValidator, TData>;
127
+ /**
128
+ * An optional object with default metadata for the field.
129
+ */
39
130
  defaultMeta?: Partial<FieldMeta>;
40
131
  }
132
+ /**
133
+ * An object type representing the required options for the FieldApi class.
134
+ */
41
135
  export interface FieldApiOptions<TParentData, TName extends DeepKeys<TParentData>, TFieldValidator extends Validator<DeepValue<TParentData, TName>, unknown> | undefined = undefined, TFormValidator extends Validator<TParentData, unknown> | undefined = undefined, TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>> extends FieldOptions<TParentData, TName, TFieldValidator, TFormValidator, TData> {
42
136
  form: FormApi<TParentData, TFormValidator>;
43
137
  }
138
+ /**
139
+ * An object type representing the metadata of a field in a form.
140
+ */
44
141
  export type FieldMeta = {
142
+ /**
143
+ * A flag indicating whether the field has been touched.
144
+ */
45
145
  isTouched: boolean;
146
+ /**
147
+ * A flag that is `true` if the field's value has not been modified by the user. Opposite of `isDirty`.
148
+ */
46
149
  isPristine: boolean;
150
+ /**
151
+ * A flag that is `true` if the field's value has been modified by the user. Opposite of `isPristine`.
152
+ */
47
153
  isDirty: boolean;
154
+ /**
155
+ * An array of errors related to the touched state of the field.
156
+ */
48
157
  touchedErrors: ValidationError[];
158
+ /**
159
+ * An array of errors related to the field value.
160
+ */
49
161
  errors: ValidationError[];
162
+ /**
163
+ * A map of errors related to the field value.
164
+ */
50
165
  errorMap: ValidationErrorMap;
166
+ /**
167
+ * A flag indicating whether the field is currently being validated.
168
+ */
51
169
  isValidating: boolean;
52
170
  };
171
+ /**
172
+ * An object type representing the state of a field.
173
+ */
53
174
  export type FieldState<TData> = {
175
+ /**
176
+ * The current value of the field.
177
+ */
54
178
  value: TData;
179
+ /**
180
+ * The current metadata of the field.
181
+ */
55
182
  meta: FieldMeta;
56
183
  };
57
- export type ResolveName<TParentData> = unknown extends TParentData ? string : DeepKeys<TParentData>;
184
+ /**
185
+ * A class representing the API for managing a form field.
186
+ *
187
+ * Normally, you will not need to create a new `FieldApi` instance directly.
188
+ * Instead, you will use a framework hook/function like `useField` or `createField`
189
+ * to create a new instance for you that uses your framework's reactivity model.
190
+ * However, if you need to create a new instance manually, you can do so by calling
191
+ * the `new FieldApi` constructor.
192
+ */
58
193
  export declare class FieldApi<TParentData, TName extends DeepKeys<TParentData>, TFieldValidator extends Validator<DeepValue<TParentData, TName>, unknown> | undefined = undefined, TFormValidator extends Validator<TParentData, unknown> | undefined = undefined, TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>> {
194
+ /**
195
+ * A reference to the form API instance.
196
+ */
59
197
  form: FieldApiOptions<TParentData, TName, TFieldValidator, TFormValidator, TData>['form'];
198
+ /**
199
+ * The field name.
200
+ */
60
201
  name: DeepKeys<TParentData>;
202
+ /**
203
+ * The field options.
204
+ */
61
205
  options: FieldApiOptions<TParentData, TName, TFieldValidator, TFormValidator, TData>;
206
+ /**
207
+ * The field state store.
208
+ */
62
209
  store: Store<FieldState<TData>>;
210
+ /**
211
+ * The current field state.
212
+ */
63
213
  state: FieldState<TData>;
214
+ /**
215
+ * @private
216
+ */
64
217
  prevState: FieldState<TData>;
218
+ /**
219
+ * Initializes a new `FieldApi` instance.
220
+ */
65
221
  constructor(opts: FieldApiOptions<TParentData, TName, TFieldValidator, TFormValidator, TData>);
222
+ /**
223
+ * @private
224
+ */
66
225
  runValidator<TValue extends {
67
226
  value: TData;
68
227
  fieldApi: FieldApi<any, any, any, any>;
@@ -71,41 +230,101 @@ export declare class FieldApi<TParentData, TName extends DeepKeys<TParentData>,
71
230
  value: TValue;
72
231
  type: TType;
73
232
  }): ReturnType<ReturnType<Validator<any>>[TType]>;
233
+ /**
234
+ * Mounts the field instance to the form.
235
+ */
74
236
  mount: () => () => void;
237
+ /**
238
+ * Updates the field instance with new options.
239
+ */
75
240
  update: (opts: FieldApiOptions<TParentData, TName, TFieldValidator, TFormValidator, TData>) => void;
241
+ /**
242
+ * Gets the current field value.
243
+ */
76
244
  getValue: () => TData;
245
+ /**
246
+ * Sets the field value and run the `change` validator.
247
+ */
77
248
  setValue: (updater: Updater<TData>, options?: {
78
249
  touch?: boolean;
79
250
  notify?: boolean;
80
251
  }) => void;
252
+ /**
253
+ * @private
254
+ */
81
255
  _getMeta: () => FieldMeta | undefined;
256
+ /**
257
+ * Gets the current field metadata.
258
+ */
82
259
  getMeta: () => FieldMeta;
260
+ /**
261
+ * Sets the field metadata.
262
+ */
83
263
  setMeta: (updater: Updater<FieldMeta>) => void;
264
+ /**
265
+ * Gets the field information object.
266
+ */
84
267
  getInfo: () => FieldInfo<TParentData, TFormValidator>;
268
+ /**
269
+ * Pushes a new value to the field.
270
+ */
85
271
  pushValue: (value: TData extends any[] ? TData[number] : never, opts?: {
86
272
  touch?: boolean;
87
273
  }) => void;
274
+ /**
275
+ * Inserts a value at the specified index, shifting the subsequent values to the right.
276
+ */
88
277
  insertValue: (index: number, value: TData extends any[] ? TData[number] : never, opts?: {
89
278
  touch?: boolean;
90
279
  }) => Promise<void>;
280
+ /**
281
+ * Replaces a value at the specified index.
282
+ */
91
283
  replaceValue: (index: number, value: TData extends any[] ? TData[number] : never, opts?: {
92
284
  touch?: boolean;
93
285
  }) => Promise<void>;
286
+ /**
287
+ * Removes a value at the specified index.
288
+ */
94
289
  removeValue: (index: number, opts?: {
95
290
  touch: boolean;
96
291
  }) => Promise<void>;
292
+ /**
293
+ * Swaps the values at the specified indices.
294
+ */
97
295
  swapValues: (aIndex: number, bIndex: number, opts?: {
98
296
  touch?: boolean;
99
297
  }) => void;
298
+ /**
299
+ * Moves the value at the first specified index to the second specified index.
300
+ */
100
301
  moveValue: (aIndex: number, bIndex: number, opts?: {
101
302
  touch?: boolean;
102
303
  }) => void;
304
+ /**
305
+ * @private
306
+ */
103
307
  getLinkedFields: (cause: ValidationCause) => FieldApi<any, any, any, any, any>[];
308
+ /**
309
+ * @private
310
+ */
104
311
  validateSync: (cause: ValidationCause) => {
105
312
  hasErrored: boolean;
106
313
  };
314
+ /**
315
+ * @private
316
+ */
107
317
  validateAsync: (cause: ValidationCause) => Promise<ValidationError[]>;
318
+ /**
319
+ * Validates the field value.
320
+ */
108
321
  validate: (cause: ValidationCause) => ValidationError[] | Promise<ValidationError[]>;
322
+ /**
323
+ * Handles the change event.
324
+ */
109
325
  handleChange: (updater: Updater<TData>) => void;
326
+ /**
327
+ * Handles the blur event.
328
+ */
110
329
  handleBlur: () => void;
111
330
  }
@@ -31,11 +31,15 @@ function getDefaultFormState(defaultState) {
31
31
  };
32
32
  }
33
33
  class FormApi {
34
+ /**
35
+ * Constructs a new `FormApi` instance with the given form options.
36
+ */
34
37
  constructor(opts) {
35
38
  var _a;
36
39
  this.options = {};
37
40
  this.fieldInfo = {};
38
41
  this.prevTransformArray = [];
42
+ this._tempDefaultValue = void 0;
39
43
  this.mount = () => {
40
44
  const { onMount } = this.options.validators || {};
41
45
  if (!onMount)
@@ -375,6 +379,11 @@ class FormApi {
375
379
  delete this.fieldInfo[field];
376
380
  };
377
381
  this.pushFieldValue = (field, value, opts2) => {
382
+ const fieldVal = this.getFieldValue(field) ?? [];
383
+ this._tempDefaultValue = {
384
+ value,
385
+ field: `${field}[${fieldVal.length}]`
386
+ };
378
387
  this.setFieldValue(
379
388
  field,
380
389
  (prev) => [...Array.isArray(prev) ? prev : [], value],
@@ -383,6 +392,7 @@ class FormApi {
383
392
  this.validateField(field, "change");
384
393
  };
385
394
  this.insertFieldValue = async (field, index, value, opts2) => {
395
+ this._tempDefaultValue = { value, field: `${field}[${index}]` };
386
396
  this.setFieldValue(
387
397
  field,
388
398
  (prev) => {
@@ -397,6 +407,7 @@ class FormApi {
397
407
  await this.validateField(field, "change");
398
408
  };
399
409
  this.replaceFieldValue = async (field, index, value, opts2) => {
410
+ this._tempDefaultValue = { value, field: `${field}[${index}]` };
400
411
  this.setFieldValue(
401
412
  field,
402
413
  (prev) => {
@@ -511,6 +522,9 @@ class FormApi {
511
522
  this.state = this.store.state;
512
523
  this.update(opts || {});
513
524
  }
525
+ /**
526
+ * @private
527
+ */
514
528
  runValidator(props) {
515
529
  const adapter = this.options.validatorAdapter;
516
530
  if (adapter && typeof props.validate !== "function") {