@tanstack/form-core 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.development.js","sources":["../../../../node_modules/.pnpm/@tanstack+store@0.0.1-beta.84/node_modules/@tanstack/store/build/esm/index.js","../../src/utils.ts","../../src/FormApi.ts","../../src/FieldApi.ts"],"sourcesContent":["/**\n * store\n *\n * Copyright (c) TanStack\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE.md file in the root directory of this source tree.\n *\n * @license MIT\n */\nclass Store {\n listeners = new Set();\n batching = false;\n queue = [];\n constructor(initialState, options) {\n this.state = initialState;\n this.options = options;\n }\n subscribe = listener => {\n this.listeners.add(listener);\n const unsub = this.options?.onSubscribe?.(listener, this);\n return () => {\n this.listeners.delete(listener);\n unsub?.();\n };\n };\n setState = updater => {\n const previous = this.state;\n this.state = this.options?.updateFn ? this.options.updateFn(previous)(updater) : updater(previous);\n if (this.state === previous) return;\n this.options?.onUpdate?.(this.state, previous);\n this.queue.push(() => {\n this.listeners.forEach(listener => listener(this.state, previous));\n });\n this.#flush();\n };\n #flush = () => {\n if (this.batching) return;\n this.queue.forEach(cb => cb());\n this.queue = [];\n };\n batch = cb => {\n this.batching = true;\n cb();\n this.batching = false;\n this.#flush();\n };\n}\n\nexport { Store };\n//# sourceMappingURL=index.js.map\n","export type UpdaterFn<TInput, TOutput = TInput> = (input: TInput) => TOutput\n\nexport type Updater<TInput, TOutput = TInput> =\n | TOutput\n | UpdaterFn<TInput, TOutput>\n\nexport function functionalUpdate<TInput, TOutput = TInput>(\n updater: Updater<TInput, TOutput>,\n input: TInput,\n): TOutput {\n return typeof updater === 'function'\n ? (updater as UpdaterFn<TInput, TOutput>)(input)\n : updater\n}\n\nexport function getBy(obj: any, path: any) {\n if (!path) {\n throw new Error('A path string is required to use getBy')\n }\n const pathArray = makePathArray(path)\n const pathObj = pathArray\n return pathObj.reduce((current: any, pathPart: any) => {\n if (typeof current !== 'undefined') {\n return current[pathPart]\n }\n return undefined\n }, obj)\n}\n\nexport function setBy(obj: any, _path: any, updater: Updater<any>) {\n const path = makePathArray(_path)\n\n function doSet(parent?: any): any {\n if (!path.length) {\n return functionalUpdate(updater, parent)\n }\n\n const key = path.shift()\n\n if (typeof key === 'string') {\n if (typeof parent === 'object') {\n return {\n ...parent,\n [key]: doSet(parent[key]),\n }\n }\n return {\n [key]: doSet(),\n }\n }\n\n if (typeof key === 'number') {\n if (Array.isArray(parent)) {\n const prefix = parent.slice(0, key)\n return [\n ...(prefix.length ? prefix : new Array(key)),\n doSet(parent[key]),\n ...parent.slice(key + 1),\n ]\n }\n return [...new Array(key), doSet()]\n }\n\n throw new Error('Uh oh!')\n }\n\n return doSet(obj)\n}\n\nconst reFindNumbers0 = /^(\\d*)$/gm\nconst reFindNumbers1 = /\\.(\\d*)\\./gm\nconst reFindNumbers2 = /^(\\d*)\\./gm\nconst reFindNumbers3 = /\\.(\\d*$)/gm\nconst reFindMultiplePeriods = /\\.{2,}/gm\n\nfunction makePathArray(str: string) {\n return str\n .replace('[', '.')\n .replace(']', '')\n .replace(reFindNumbers0, '__int__$1')\n .replace(reFindNumbers1, '.__int__$1.')\n .replace(reFindNumbers2, '__int__$1.')\n .replace(reFindNumbers3, '.__int__$1')\n .replace(reFindMultiplePeriods, '.')\n .split('.')\n .map((d) => {\n if (d.indexOf('__int__') === 0) {\n return parseInt(d.substring('__int__'.length), 10)\n }\n return d\n })\n}\n\nexport type RequiredByKey<T, K extends keyof T> = Omit<T, K> &\n Required<Pick<T, K>>\n\ntype ComputeRange<\n N extends number,\n Result extends Array<unknown> = [],\n> = Result['length'] extends N\n ? Result\n : ComputeRange<N, [...Result, Result['length']]>\ntype Index40 = ComputeRange<40>[number]\n\n// Is this type a tuple?\ntype IsTuple<T> = T extends readonly any[] & { length: infer Length }\n ? Length extends Index40\n ? T\n : never\n : never\n\n// If this type is a tuple, what indices are allowed?\ntype AllowedIndexes<\n Tuple extends ReadonlyArray<any>,\n Keys extends number = never,\n> = Tuple extends readonly []\n ? Keys\n : Tuple extends readonly [infer _, ...infer Tail]\n ? AllowedIndexes<Tail, Keys | Tail['length']>\n : Keys\n\nexport type DeepKeys<T> = unknown extends T\n ? keyof T\n : object extends T\n ? string\n : T extends readonly any[] & IsTuple<T>\n ? AllowedIndexes<T> | DeepKeysPrefix<T, AllowedIndexes<T>>\n : T extends any[]\n ? never & 'Dynamic length array indexing is not supported'\n : T extends Date\n ? never\n : T extends object\n ? (keyof T & string) | DeepKeysPrefix<T, keyof T>\n : never\n\ntype DeepKeysPrefix<T, TPrefix> = TPrefix extends keyof T & (number | string)\n ? `${TPrefix}.${DeepKeys<T[TPrefix]> & string}`\n : never\n\nexport type DeepValue<T, TProp> = T extends Record<string | number, any>\n ? TProp extends `${infer TBranch}.${infer TDeepProp}`\n ? DeepValue<T[TBranch], TDeepProp>\n : T[TProp & string]\n : never\n","import type { FormEvent } from 'react'\nimport { Store } from '@tanstack/store'\n//\nimport type { DeepKeys, DeepValue, Updater } from './utils'\nimport { functionalUpdate, getBy, setBy } from './utils'\nimport type { FieldApi, FieldMeta } from './FieldApi'\n\nexport type FormOptions<TData> = {\n defaultValues?: TData\n defaultState?: Partial<FormState<TData>>\n onSubmit?: (values: TData, formApi: FormApi<TData>) => Promise<any>\n onInvalidSubmit?: (values: TData, formApi: FormApi<TData>) => void\n validate?: (values: TData, formApi: FormApi<TData>) => Promise<any>\n debugForm?: boolean\n validatePristine?: boolean\n}\n\nexport type FieldInfo<TFormData> = {\n instances: Record<string, FieldApi<any, TFormData>>\n} & ValidationMeta\n\nexport type ValidationMeta = {\n validationCount?: number\n validationPromise?: Promise<ValidationError>\n validationResolve?: (error: ValidationError) => void\n validationReject?: (error: unknown) => void\n}\n\nexport type ValidationError = undefined | false | null | string\n\nexport type FormState<TData> = {\n values: TData\n // Form Validation\n isFormValidating: boolean\n formValidationCount: number\n isFormValid: boolean\n formError?: ValidationError\n // Fields\n fieldMeta: Record<DeepKeys<TData>, FieldMeta>\n isFieldsValidating: boolean\n isFieldsValid: boolean\n isSubmitting: boolean\n // General\n isTouched: boolean\n isSubmitted: boolean\n isValidating: boolean\n isValid: boolean\n canSubmit: boolean\n submissionAttempts: number\n}\n\nexport function getDefaultFormState<TData>(\n defaultState: Partial<FormState<TData>>,\n): FormState<TData> {\n return {\n values: {} as any,\n fieldMeta: {} as any,\n canSubmit: true,\n isFieldsValid: false,\n isFieldsValidating: false,\n isFormValid: false,\n isFormValidating: false,\n isSubmitted: false,\n isSubmitting: false,\n isTouched: false,\n isValid: false,\n isValidating: false,\n submissionAttempts: 0,\n formValidationCount: 0,\n ...defaultState,\n }\n}\n\nexport class FormApi<TFormData> {\n // // This carries the context for nested fields\n options: FormOptions<TFormData> = {}\n store!: Store<FormState<TFormData>>\n // Do not use __state directly, as it is not reactive.\n // Please use form.useStore() utility to subscribe to state\n state!: FormState<TFormData>\n fieldInfo: Record<DeepKeys<TFormData>, FieldInfo<TFormData>> = {} as any\n fieldName?: string\n validationMeta: ValidationMeta = {}\n\n constructor(opts?: FormOptions<TFormData>) {\n this.store = new Store<FormState<TFormData>>(\n getDefaultFormState({\n ...opts?.defaultState,\n values: opts?.defaultValues ?? opts?.defaultState?.values,\n isFormValid: !opts?.validate,\n }),\n {\n onUpdate: (next) => {\n // Computed state\n const fieldMetaValues = Object.values(next.fieldMeta) as (\n | FieldMeta\n | undefined\n )[]\n\n const isFieldsValidating = fieldMetaValues.some(\n (field) => field?.isValidating,\n )\n\n const isFieldsValid = !fieldMetaValues.some((field) => field?.error)\n\n const isTouched = fieldMetaValues.some((field) => field?.isTouched)\n\n const isValidating = isFieldsValidating || next.isFormValidating\n const isFormValid = !next.formError\n const isValid = isFieldsValid && isFormValid\n const canSubmit =\n (next.submissionAttempts === 0 && !isTouched) ||\n (!isValidating && !next.isSubmitting && isValid)\n\n next = {\n ...next,\n isFieldsValidating,\n isFieldsValid,\n isFormValid,\n isValid,\n canSubmit,\n isTouched,\n }\n\n // Create a shortcut for the state\n // Write it back to the store\n this.store.state = next\n this.state = next\n },\n },\n )\n\n this.state = this.store.state\n\n this.update(opts || {})\n }\n\n update = (options: FormOptions<TFormData>) => {\n this.store.batch(() => {\n if (\n options.defaultState &&\n options.defaultState !== this.options.defaultState\n ) {\n this.store.setState((prev) => ({\n ...prev,\n ...options.defaultState,\n }))\n }\n\n if (options.defaultValues !== this.options.defaultValues) {\n this.store.setState((prev) => ({\n ...prev,\n values: options.defaultValues as TFormData,\n }))\n }\n })\n\n this.options = options\n }\n\n reset = () =>\n this.store.setState(() => getDefaultFormState(this.options.defaultValues!))\n\n validateAllFields = async () => {\n const fieldValidationPromises: Promise<ValidationError>[] = [] as any\n\n this.store.batch(() => {\n void (Object.values(this.fieldInfo) as FieldInfo<any>[]).forEach(\n (field) => {\n Object.values(field.instances).forEach((instance) => {\n // If any fields are not touched\n if (!instance.state.meta.isTouched) {\n // Mark them as touched\n instance.setMeta((prev) => ({ ...prev, isTouched: true }))\n // Validate the field\n if (instance.options.validate) {\n fieldValidationPromises.push(instance.validate())\n }\n }\n })\n },\n )\n })\n\n return Promise.all(fieldValidationPromises)\n }\n\n validateForm = async () => {\n const { validate } = this.options\n\n if (!validate) {\n return\n }\n\n // Use the formValidationCount for all field instances to\n // track freshness of the validation\n this.store.setState((prev) => ({\n ...prev,\n isValidating: true,\n formValidationCount: prev.formValidationCount + 1,\n }))\n\n const formValidationCount = this.state.formValidationCount\n\n const checkLatest = () =>\n formValidationCount === this.state.formValidationCount\n\n if (!this.validationMeta.validationPromise) {\n this.validationMeta.validationPromise = new Promise((resolve, reject) => {\n this.validationMeta.validationResolve = resolve\n this.validationMeta.validationReject = reject\n })\n }\n\n const doValidation = async () => {\n try {\n const error = await validate(this.state.values, this)\n\n if (checkLatest()) {\n this.store.setState((prev) => ({\n ...prev,\n isValidating: false,\n error: error\n ? typeof error === 'string'\n ? error\n : 'Invalid Form Values'\n : null,\n }))\n\n this.validationMeta.validationResolve?.(error)\n }\n } catch (err) {\n if (checkLatest()) {\n this.validationMeta.validationReject?.(err)\n }\n } finally {\n delete this.validationMeta.validationPromise\n }\n }\n\n doValidation()\n\n return this.validationMeta.validationPromise\n }\n\n handleSubmit = async (e: FormEvent & { __handled?: boolean }) => {\n e.preventDefault()\n e.stopPropagation()\n\n // Check to see that the form and all fields have been touched\n // If they have not, touch them all and run validation\n // Run form validation\n // Submit the form\n\n this.store.setState((old) => ({\n ...old,\n // Submittion attempts mark the form as not submitted\n isSubmitted: false,\n // Count submission attempts\n submissionAttempts: old.submissionAttempts + 1,\n }))\n\n // Don't let invalid forms submit\n if (!this.state.canSubmit) return\n\n this.store.setState((d) => ({ ...d, isSubmitting: true }))\n\n const done = () => {\n this.store.setState((prev) => ({ ...prev, isSubmitting: false }))\n }\n\n // Validate all fields\n await this.validateAllFields()\n\n // Fields are invalid, do not submit\n if (!this.state.isFieldsValid) {\n done()\n this.options.onInvalidSubmit?.(this.state.values, this)\n return\n }\n\n // Run validation for the form\n await this.validateForm()\n\n if (!this.state.isValid) {\n done()\n this.options.onInvalidSubmit?.(this.state.values, this)\n return\n }\n\n try {\n // Run the submit code\n await this.options.onSubmit?.(this.state.values, this)\n\n this.store.batch(() => {\n this.store.setState((prev) => ({ ...prev, isSubmitted: true }))\n done()\n })\n } catch (err) {\n done()\n throw err\n }\n }\n\n getFieldValue = <TField extends DeepKeys<TFormData>>(\n field: TField,\n ): DeepValue<TFormData, TField> => getBy(this.state.values, field)\n\n getFieldMeta = <TField extends DeepKeys<TFormData>>(\n field: TField,\n ): FieldMeta => {\n return this.state.fieldMeta[field]\n }\n\n getFieldInfo = <TField extends DeepKeys<TFormData>>(field: TField) => {\n return (this.fieldInfo[field] ||= {\n instances: {},\n })\n }\n\n setFieldMeta = <TField extends DeepKeys<TFormData>>(\n field: TField,\n updater: Updater<FieldMeta>,\n ) => {\n this.store.setState((prev) => {\n return {\n ...prev,\n fieldMeta: {\n ...prev.fieldMeta,\n [field]: functionalUpdate(updater, prev.fieldMeta[field]),\n },\n }\n })\n }\n\n setFieldValue = <TField extends DeepKeys<TFormData>>(\n field: TField,\n updater: Updater<DeepValue<TFormData, TField>>,\n opts?: { touch?: boolean },\n ) => {\n const touch = opts?.touch ?? true\n\n this.store.batch(() => {\n this.store.setState((prev) => {\n return {\n ...prev,\n values: setBy(prev.values, field, updater),\n }\n })\n\n if (touch) {\n this.setFieldMeta(field, (prev) => ({\n ...prev,\n isTouched: true,\n }))\n }\n })\n }\n\n pushFieldValue = <TField extends DeepKeys<TFormData>>(\n field: TField,\n value: DeepValue<TFormData, TField>,\n opts?: { touch?: boolean },\n ) => {\n return this.setFieldValue(\n field,\n (prev) => [...(Array.isArray(prev) ? prev : []), value] as any,\n opts,\n )\n }\n\n insertFieldValue = <TField extends DeepKeys<TFormData>>(\n field: TField,\n index: number,\n value: DeepValue<TFormData, TField>,\n opts?: { touch?: boolean },\n ) => {\n this.setFieldValue(\n field,\n (prev) => {\n // invariant( // TODO: bring in invariant\n // Array.isArray(prev),\n // `Cannot insert a field value into a non-array field. Check that this field's existing value is an array: ${field}.`\n // )\n return (prev as DeepValue<TFormData, TField>[]).map((d, i) =>\n i === index ? value : d,\n ) as any\n },\n opts,\n )\n }\n\n spliceFieldValue = <TField extends DeepKeys<TFormData>>(\n field: TField,\n index: number,\n opts?: { touch?: boolean },\n ) => {\n this.setFieldValue(\n field,\n (prev) => {\n // invariant( // TODO: bring in invariant\n // Array.isArray(prev),\n // `Cannot insert a field value into a non-array field. Check that this field's existing value is an array: ${field}.`\n // )\n return (prev as DeepValue<TFormData, TField>[]).filter(\n (_d, i) => i !== index,\n ) as any\n },\n opts,\n )\n }\n\n swapFieldValues = <TField extends DeepKeys<TFormData>>(\n field: TField,\n index1: number,\n index2: number,\n ) => {\n this.setFieldValue(field, (prev: any) => {\n const prev1 = prev[index1]!\n const prev2 = prev[index2]!\n return setBy(setBy(prev, [index1], prev2), [index2], prev1)\n })\n }\n}\n","//\nimport type { DeepKeys, DeepValue, RequiredByKey, Updater } from './utils'\nimport type { FormApi, ValidationError } from './FormApi'\nimport { Store } from '@tanstack/store'\n\ntype ValidateOn = 'change' | 'blur' | 'submit'\n\nexport type FieldOptions<TData, TFormData> = {\n name: unknown extends TFormData ? string : DeepKeys<TFormData>\n defaultValue?: TData\n form?: FormApi<TFormData>\n validate?: (\n value: TData,\n fieldApi: FieldApi<TData, TFormData>,\n ) => ValidationError\n validateAsync?: (\n value: TData,\n fieldApi: FieldApi<TData, TFormData>,\n ) => ValidationError | Promise<ValidationError>\n validatePristine?: boolean // Default: false\n validateOn?: ValidateOn // Default: 'change'\n validateAsyncOn?: ValidateOn // Default: 'blur'\n validateAsyncDebounceMs?: number\n filterValue?: (value: TData) => TData\n defaultMeta?: Partial<FieldMeta>\n change?: boolean\n blur?: boolean\n submit?: boolean\n}\n\nexport type FieldMeta = {\n isTouched: boolean\n touchedError?: ValidationError\n error?: ValidationError\n isValidating: boolean\n}\n\nexport type ChangeProps<TData> = {\n onChange?: (updater: Updater<TData>) => void\n onBlur?: (event: any) => void\n}\n\nexport type InputProps = {\n onChange?: (event: any) => void\n onBlur?: (event: any) => void\n}\n\nexport type FieldApiOptions<TData, TFormData> = RequiredByKey<\n FieldOptions<TData, TFormData>,\n 'form'\n>\n\nlet uid = 0\n\nexport type FieldState<TData> = {\n value: TData\n meta: FieldMeta\n}\n\nexport class FieldApi<TData, TFormData> {\n uid: number\n form: FormApi<TFormData>\n name!: DeepKeys<TFormData>\n store!: Store<FieldState<TData>>\n state!: FieldState<TData>\n options: RequiredByKey<\n FieldOptions<TData, TFormData>,\n 'validateOn' | 'validateAsyncOn'\n > = {} as any\n\n constructor(opts: FieldApiOptions<TData, TFormData>) {\n this.form = opts.form\n this.uid = uid++\n // Support field prefixing from FieldScope\n let fieldPrefix = ''\n if (this.form.fieldName) {\n fieldPrefix = `${this.form.fieldName}.`\n }\n\n this.name = (fieldPrefix + opts.name) as any\n\n this.store = new Store<FieldState<TData>>(\n {\n value: this.getValue(),\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n meta: this.getMeta() ?? {\n isValidating: false,\n isTouched: false,\n ...this.options.defaultMeta,\n },\n },\n {\n onUpdate: (next) => {\n next.meta.touchedError = next.meta.isTouched\n ? next.meta.error\n : undefined\n\n // Do not validate pristine fields\n if (!this.options.validatePristine && !next.meta.isTouched) return\n\n // If validateOn is set to a variation of change, run the validation\n if (\n this.options.validateOn === 'change' ||\n this.options.validateOn.split('-')[0] === 'change'\n ) {\n try {\n this.validate()\n } catch (err) {\n console.error('An error occurred during validation', err)\n }\n }\n\n this.state = next\n },\n },\n )\n\n this.state = this.store.state\n this.update(opts)\n }\n\n mount = () => {\n const info = this.getInfo()\n info.instances[this.uid] = this\n\n const unsubscribe = this.form.store.subscribe(() => {\n this.#updateStore()\n })\n\n return () => {\n unsubscribe()\n delete info.instances[this.uid]\n if (!Object.keys(info.instances).length) {\n delete this.form.fieldInfo[this.name]\n }\n }\n }\n\n #updateStore = () => {\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 update = (opts: FieldApiOptions<TData, TFormData>) => {\n this.options = {\n validateOn: 'change',\n validateAsyncOn: 'blur',\n validateAsyncDebounceMs: 0,\n ...opts,\n }\n\n // Default Value\n if (\n this.state.value === undefined &&\n this.options.defaultValue !== undefined\n ) {\n this.setValue(this.options.defaultValue)\n }\n\n // Default Meta\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (this.getMeta() === undefined) {\n this.setMeta(this.state.meta)\n }\n }\n\n getValue = (): TData => this.form.getFieldValue(this.name)\n setValue = (\n updater: Updater<TData>,\n options?: { touch?: boolean; notify?: boolean },\n ) => this.form.setFieldValue(this.name, updater as any, options)\n\n getMeta = (): FieldMeta => this.form.getFieldMeta(this.name)\n setMeta = (updater: Updater<FieldMeta>) =>\n this.form.setFieldMeta(this.name, updater)\n\n getInfo = () => this.form.getFieldInfo(this.name)\n\n pushValue = (value: TData) =>\n this.form.pushFieldValue(this.name, value as any)\n insertValue = (index: number, value: TData) =>\n this.form.insertFieldValue(this.name, index, value as any)\n removeValue = (index: number) => this.form.spliceFieldValue(this.name, index)\n swapValues = (aIndex: number, bIndex: number) =>\n this.form.swapFieldValues(this.name, aIndex, bIndex)\n\n getSubField = <TName extends DeepKeys<TData>>(name: TName) =>\n new FieldApi<DeepValue<TData, TName>, TFormData>({\n name: `${this.name}.${name}` as any,\n form: this.form,\n })\n\n #validate = async (isAsync: boolean) => {\n if (!this.options.validate) {\n return\n }\n\n this.setMeta((prev) => ({ ...prev, isValidating: true }))\n\n // Use the validationCount for all field instances to\n // track freshness of the validation\n const validationCount = (this.getInfo().validationCount || 0) + 1\n\n this.getInfo().validationCount = validationCount\n\n const checkLatest = () => validationCount === this.getInfo().validationCount\n\n if (!this.getInfo().validationPromise) {\n this.getInfo().validationPromise = new Promise((resolve, reject) => {\n this.getInfo().validationResolve = resolve\n this.getInfo().validationReject = reject\n })\n }\n\n try {\n const rawError = await this.options.validate(this.state.value, this)\n\n if (checkLatest()) {\n const error = (() => {\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\n this.setMeta((prev) => ({\n ...prev,\n isValidating: false,\n error,\n }))\n this.getInfo().validationResolve?.(error)\n }\n } catch (error) {\n if (checkLatest()) {\n this.getInfo().validationReject?.(error)\n throw error\n }\n } finally {\n if (checkLatest()) {\n this.setMeta((prev) => ({ ...prev, isValidating: false }))\n delete this.getInfo().validationPromise\n }\n }\n\n return this.getInfo().validationPromise\n }\n\n validate = () => this.#validate(false)\n validateAsync = () => this.#validate(true)\n\n getChangeProps = <T extends ChangeProps<any>>(\n props: T = {} as T,\n ): ChangeProps<TData> & Omit<T, keyof ChangeProps<TData>> => {\n return {\n ...props,\n value: this.state.value,\n onChange: (value) => {\n this.setValue(value)\n props.onChange?.(value)\n },\n onBlur: (e) => {\n this.setMeta((prev) => ({ ...prev, isTouched: true }))\n\n const { validateOn } = this.options\n\n if (validateOn === 'blur' || validateOn.split('-')[0] === 'blur') {\n this.validate()\n }\n\n props.onBlur?.(e)\n },\n } as ChangeProps<TData> & Omit<T, keyof ChangeProps<TData>>\n }\n\n getInputProps = <T extends InputProps>(\n props: T = {} as T,\n ): InputProps & Omit<T, keyof InputProps> => {\n return {\n ...props,\n value: String(this.state.value),\n onChange: (e) => {\n this.setValue(e.target.value)\n props.onChange?.(e.target.value)\n },\n onBlur: this.getChangeProps(props).onBlur,\n }\n }\n}\n"],"names":["functionalUpdate","updater","input","getBy","obj","path","Error","pathArray","makePathArray","pathObj","reduce","current","pathPart","undefined","setBy","_path","doSet","parent","length","key","shift","Array","isArray","prefix","slice","reFindNumbers0","reFindNumbers1","reFindNumbers2","reFindNumbers3","reFindMultiplePeriods","str","replace","split","map","d","indexOf","parseInt","substring","getDefaultFormState","defaultState","values","fieldMeta","canSubmit","isFieldsValid","isFieldsValidating","isFormValid","isFormValidating","isSubmitted","isSubmitting","isTouched","isValid","isValidating","submissionAttempts","formValidationCount","FormApi","constructor","opts","options","fieldInfo","validationMeta","update","store","batch","setState","prev","defaultValues","reset","validateAllFields","fieldValidationPromises","Object","forEach","field","instances","instance","state","meta","setMeta","validate","push","Promise","all","validateForm","checkLatest","validationPromise","resolve","reject","validationResolve","validationReject","doValidation","error","err","handleSubmit","e","preventDefault","stopPropagation","old","done","onInvalidSubmit","onSubmit","getFieldValue","getFieldMeta","getFieldInfo","setFieldMeta","setFieldValue","touch","pushFieldValue","value","insertFieldValue","index","i","spliceFieldValue","filter","_d","swapFieldValues","index1","index2","prev1","prev2","Store","onUpdate","next","fieldMetaValues","some","formError","uid","FieldApi","mount","info","getInfo","unsubscribe","form","subscribe","keys","name","nextValue","getValue","nextMeta","getMeta","validateOn","validateAsyncOn","validateAsyncDebounceMs","defaultValue","setValue","pushValue","insertValue","removeValue","swapValues","aIndex","bIndex","getSubField","isAsync","validationCount","rawError","validateAsync","getChangeProps","props","onChange","onBlur","getInputProps","String","target","fieldPrefix","fieldName","defaultMeta","touchedError","validatePristine","console"],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * form-core
3
+ *
4
+ * Copyright (c) TanStack
5
+ *
6
+ * This source code is licensed under the MIT license found in the
7
+ * LICENSE.md file in the root directory of this source tree.
8
+ *
9
+ * @license MIT
10
+ */
11
+ !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).FormCore={})}(this,(function(t){"use strict";
12
+ /**
13
+ * store
14
+ *
15
+ * Copyright (c) TanStack
16
+ *
17
+ * This source code is licensed under the MIT license found in the
18
+ * LICENSE.md file in the root directory of this source tree.
19
+ *
20
+ * @license MIT
21
+ */class e{listeners=new Set;batching=!1;queue=[];constructor(t,e){this.state=t,this.options=e}subscribe=t=>{this.listeners.add(t);const e=this.options?.onSubscribe?.(t,this);return()=>{this.listeners.delete(t),e?.()}};setState=t=>{const e=this.state;this.state=this.options?.updateFn?this.options.updateFn(e)(t):t(e),this.state!==e&&(this.options?.onUpdate?.(this.state,e),this.queue.push((()=>{this.listeners.forEach((t=>t(this.state,e)))})),this.#t())};#t=()=>{this.batching||(this.queue.forEach((t=>t())),this.queue=[])};batch=t=>{this.batching=!0,t(),this.batching=!1,this.#t()}}function i(t,e){return"function"==typeof t?t(e):t}function s(t,e){if(!e)throw new Error("A path string is required to use getBy");return u(e).reduce(((t,e)=>{if(void 0!==t)return t[e]}),t)}function a(t,e,s){const a=u(e);return function t(e){if(!a.length)return i(s,e);const n=a.shift();if("string"==typeof n)return"object"==typeof e?{...e,[n]:t(e[n])}:{[n]:t()};if("number"==typeof n){if(Array.isArray(e)){const i=e.slice(0,n);return[...i.length?i:new Array(n),t(e[n]),...e.slice(n+1)]}return[...new Array(n),t()]}throw new Error("Uh oh!")}(t)}const n=/^(\d*)$/gm,o=/\.(\d*)\./gm,l=/^(\d*)\./gm,h=/\.(\d*$)/gm,r=/\.{2,}/gm;function u(t){return t.replace("[",".").replace("]","").replace(n,"__int__$1").replace(o,".__int__$1.").replace(l,"__int__$1.").replace(h,".__int__$1").replace(r,".").split(".").map((t=>0===t.indexOf("__int__")?parseInt(t.substring("__int__".length),10):t))}function d(t){return{values:{},fieldMeta:{},canSubmit:!0,isFieldsValid:!1,isFieldsValidating:!1,isFormValid:!1,isFormValidating:!1,isSubmitted:!1,isSubmitting:!1,isTouched:!1,isValid:!1,isValidating:!1,submissionAttempts:0,formValidationCount:0,...t}}var c=0;function f(t){return"__private_"+c+++"_"+t}function v(t,e){if(!Object.prototype.hasOwnProperty.call(t,e))throw new TypeError("attempted to use private field on non-instance");return t}let m=0;var p=f("updateStore"),g=f("validate");class V{constructor(t){var i;this.options={},this.mount=()=>{const t=this.getInfo();t.instances[this.uid]=this;const e=this.form.store.subscribe((()=>{v(this,p)[p]()}));return()=>{e(),delete t.instances[this.uid],Object.keys(t.instances).length||delete this.form.fieldInfo[this.name]}},Object.defineProperty(this,p,{writable:!0,value:()=>{this.store.batch((()=>{const t=this.getValue(),e=this.getMeta();t!==this.state.value&&this.store.setState((e=>({...e,value:t}))),e!==this.state.meta&&this.store.setState((t=>({...t,meta:e})))}))}}),this.update=t=>{this.options={validateOn:"change",validateAsyncOn:"blur",validateAsyncDebounceMs:0,...t},void 0===this.state.value&&void 0!==this.options.defaultValue&&this.setValue(this.options.defaultValue),void 0===this.getMeta()&&this.setMeta(this.state.meta)},this.getValue=()=>this.form.getFieldValue(this.name),this.setValue=(t,e)=>this.form.setFieldValue(this.name,t,e),this.getMeta=()=>this.form.getFieldMeta(this.name),this.setMeta=t=>this.form.setFieldMeta(this.name,t),this.getInfo=()=>this.form.getFieldInfo(this.name),this.pushValue=t=>this.form.pushFieldValue(this.name,t),this.insertValue=(t,e)=>this.form.insertFieldValue(this.name,t,e),this.removeValue=t=>this.form.spliceFieldValue(this.name,t),this.swapValues=(t,e)=>this.form.swapFieldValues(this.name,t,e),this.getSubField=t=>new V({name:this.name+"."+t,form:this.form}),Object.defineProperty(this,g,{writable:!0,value:async t=>{if(!this.options.validate)return;this.setMeta((t=>({...t,isValidating:!0})));const e=(this.getInfo().validationCount||0)+1;this.getInfo().validationCount=e;const i=()=>e===this.getInfo().validationCount;this.getInfo().validationPromise||(this.getInfo().validationPromise=new Promise(((t,e)=>{this.getInfo().validationResolve=t,this.getInfo().validationReject=e})));try{const t=await this.options.validate(this.state.value,this);if(i()){var s,a;const e=(()=>{if(t)return"string"!=typeof t?"Invalid Form Values":t})();this.setMeta((t=>({...t,isValidating:!1,error:e}))),null==(s=(a=this.getInfo()).validationResolve)||s.call(a,e)}}catch(t){var n,o;if(i())throw null==(n=(o=this.getInfo()).validationReject)||n.call(o,t),t}finally{i()&&(this.setMeta((t=>({...t,isValidating:!1}))),delete this.getInfo().validationPromise)}return this.getInfo().validationPromise}}),this.validate=()=>v(this,g)[g](!1),this.validateAsync=()=>v(this,g)[g](!0),this.getChangeProps=(t={})=>({...t,value:this.state.value,onChange:e=>{this.setValue(e),null==t.onChange||t.onChange(e)},onBlur:e=>{this.setMeta((t=>({...t,isTouched:!0})));const{validateOn:i}=this.options;"blur"!==i&&"blur"!==i.split("-")[0]||this.validate(),null==t.onBlur||t.onBlur(e)}}),this.getInputProps=(t={})=>({...t,value:String(this.state.value),onChange:e=>{this.setValue(e.target.value),null==t.onChange||t.onChange(e.target.value)},onBlur:this.getChangeProps(t).onBlur}),this.form=t.form,this.uid=m++;let s="";this.form.fieldName&&(s=this.form.fieldName+"."),this.name=s+t.name,this.store=new e({value:this.getValue(),meta:null!=(i=this.getMeta())?i:{isValidating:!1,isTouched:!1,...this.options.defaultMeta}},{onUpdate:t=>{if(t.meta.touchedError=t.meta.isTouched?t.meta.error:void 0,this.options.validatePristine||t.meta.isTouched){if("change"===this.options.validateOn||"change"===this.options.validateOn.split("-")[0])try{this.validate()}catch(t){console.error("An error occurred during validation",t)}this.state=t}}}),this.state=this.store.state,this.update(t)}}t.FieldApi=V,t.FormApi=class{constructor(t){var n,o;this.options={},this.fieldInfo={},this.validationMeta={},this.update=t=>{this.store.batch((()=>{t.defaultState&&t.defaultState!==this.options.defaultState&&this.store.setState((e=>({...e,...t.defaultState}))),t.defaultValues!==this.options.defaultValues&&this.store.setState((e=>({...e,values:t.defaultValues})))})),this.options=t},this.reset=()=>this.store.setState((()=>d(this.options.defaultValues))),this.validateAllFields=async()=>{const t=[];return this.store.batch((()=>{Object.values(this.fieldInfo).forEach((e=>{Object.values(e.instances).forEach((e=>{e.state.meta.isTouched||(e.setMeta((t=>({...t,isTouched:!0}))),e.options.validate&&t.push(e.validate()))}))}))})),Promise.all(t)},this.validateForm=async()=>{const{validate:t}=this.options;if(!t)return;this.store.setState((t=>({...t,isValidating:!0,formValidationCount:t.formValidationCount+1})));const e=this.state.formValidationCount,i=()=>e===this.state.formValidationCount;this.validationMeta.validationPromise||(this.validationMeta.validationPromise=new Promise(((t,e)=>{this.validationMeta.validationResolve=t,this.validationMeta.validationReject=e})));return(async()=>{try{const a=await t(this.state.values,this);var e,s;if(i())this.store.setState((t=>({...t,isValidating:!1,error:a?"string"==typeof a?a:"Invalid Form Values":null}))),null==(e=(s=this.validationMeta).validationResolve)||e.call(s,a)}catch(t){var a,n;if(i())null==(a=(n=this.validationMeta).validationReject)||a.call(n,t)}finally{delete this.validationMeta.validationPromise}})(),this.validationMeta.validationPromise},this.handleSubmit=async t=>{if(t.preventDefault(),t.stopPropagation(),this.store.setState((t=>({...t,isSubmitted:!1,submissionAttempts:t.submissionAttempts+1}))),!this.state.canSubmit)return;this.store.setState((t=>({...t,isSubmitting:!0})));const e=()=>{this.store.setState((t=>({...t,isSubmitting:!1})))};var i,s,a,n;if(await this.validateAllFields(),!this.state.isFieldsValid)return e(),void(null==(i=(s=this.options).onInvalidSubmit)||i.call(s,this.state.values,this));if(await this.validateForm(),!this.state.isValid)return e(),void(null==(a=(n=this.options).onInvalidSubmit)||a.call(n,this.state.values,this));try{var o,l;await(null==(o=(l=this.options).onSubmit)?void 0:o.call(l,this.state.values,this)),this.store.batch((()=>{this.store.setState((t=>({...t,isSubmitted:!0}))),e()}))}catch(t){throw e(),t}},this.getFieldValue=t=>s(this.state.values,t),this.getFieldMeta=t=>this.state.fieldMeta[t],this.getFieldInfo=t=>{var e;return(e=this.fieldInfo)[t]||(e[t]={instances:{}})},this.setFieldMeta=(t,e)=>{this.store.setState((s=>({...s,fieldMeta:{...s.fieldMeta,[t]:i(e,s.fieldMeta[t])}})))},this.setFieldValue=(t,e,i)=>{var s;const n=null==(s=null==i?void 0:i.touch)||s;this.store.batch((()=>{this.store.setState((i=>({...i,values:a(i.values,t,e)}))),n&&this.setFieldMeta(t,(t=>({...t,isTouched:!0})))}))},this.pushFieldValue=(t,e,i)=>this.setFieldValue(t,(t=>[...Array.isArray(t)?t:[],e]),i),this.insertFieldValue=(t,e,i,s)=>{this.setFieldValue(t,(t=>t.map(((t,s)=>s===e?i:t))),s)},this.spliceFieldValue=(t,e,i)=>{this.setFieldValue(t,(t=>t.filter(((t,i)=>i!==e))),i)},this.swapFieldValues=(t,e,i)=>{this.setFieldValue(t,(t=>{const s=t[e],n=t[i];return a(a(t,[e],n),[i],s)}))},this.store=new e(d({...null==t?void 0:t.defaultState,values:null!=(n=null==t?void 0:t.defaultValues)?n:null==t||null==(o=t.defaultState)?void 0:o.values,isFormValid:!(null!=t&&t.validate)}),{onUpdate:t=>{const e=Object.values(t.fieldMeta),i=e.some((t=>null==t?void 0:t.isValidating)),s=!e.some((t=>null==t?void 0:t.error)),a=e.some((t=>null==t?void 0:t.isTouched)),n=i||t.isFormValidating,o=!t.formError,l=s&&o,h=0===t.submissionAttempts&&!a||!n&&!t.isSubmitting&&l;t={...t,isFieldsValidating:i,isFieldsValid:s,isFormValid:o,isValid:l,canSubmit:h,isTouched:a},this.store.state=t,this.state=t}}),this.state=this.store.state,this.update(t||{})}},t.functionalUpdate=i,t.getBy=s,t.getDefaultFormState=d,t.setBy=a,Object.defineProperty(t,"__esModule",{value:!0})}));
22
+ //# sourceMappingURL=index.production.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.production.js","sources":["../../../../node_modules/.pnpm/@tanstack+store@0.0.1-beta.84/node_modules/@tanstack/store/build/esm/index.js","../../src/utils.ts","../../src/FormApi.ts","../../src/FieldApi.ts"],"sourcesContent":["/**\n * store\n *\n * Copyright (c) TanStack\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE.md file in the root directory of this source tree.\n *\n * @license MIT\n */\nclass Store {\n listeners = new Set();\n batching = false;\n queue = [];\n constructor(initialState, options) {\n this.state = initialState;\n this.options = options;\n }\n subscribe = listener => {\n this.listeners.add(listener);\n const unsub = this.options?.onSubscribe?.(listener, this);\n return () => {\n this.listeners.delete(listener);\n unsub?.();\n };\n };\n setState = updater => {\n const previous = this.state;\n this.state = this.options?.updateFn ? this.options.updateFn(previous)(updater) : updater(previous);\n if (this.state === previous) return;\n this.options?.onUpdate?.(this.state, previous);\n this.queue.push(() => {\n this.listeners.forEach(listener => listener(this.state, previous));\n });\n this.#flush();\n };\n #flush = () => {\n if (this.batching) return;\n this.queue.forEach(cb => cb());\n this.queue = [];\n };\n batch = cb => {\n this.batching = true;\n cb();\n this.batching = false;\n this.#flush();\n };\n}\n\nexport { Store };\n//# sourceMappingURL=index.js.map\n","export type UpdaterFn<TInput, TOutput = TInput> = (input: TInput) => TOutput\n\nexport type Updater<TInput, TOutput = TInput> =\n | TOutput\n | UpdaterFn<TInput, TOutput>\n\nexport function functionalUpdate<TInput, TOutput = TInput>(\n updater: Updater<TInput, TOutput>,\n input: TInput,\n): TOutput {\n return typeof updater === 'function'\n ? (updater as UpdaterFn<TInput, TOutput>)(input)\n : updater\n}\n\nexport function getBy(obj: any, path: any) {\n if (!path) {\n throw new Error('A path string is required to use getBy')\n }\n const pathArray = makePathArray(path)\n const pathObj = pathArray\n return pathObj.reduce((current: any, pathPart: any) => {\n if (typeof current !== 'undefined') {\n return current[pathPart]\n }\n return undefined\n }, obj)\n}\n\nexport function setBy(obj: any, _path: any, updater: Updater<any>) {\n const path = makePathArray(_path)\n\n function doSet(parent?: any): any {\n if (!path.length) {\n return functionalUpdate(updater, parent)\n }\n\n const key = path.shift()\n\n if (typeof key === 'string') {\n if (typeof parent === 'object') {\n return {\n ...parent,\n [key]: doSet(parent[key]),\n }\n }\n return {\n [key]: doSet(),\n }\n }\n\n if (typeof key === 'number') {\n if (Array.isArray(parent)) {\n const prefix = parent.slice(0, key)\n return [\n ...(prefix.length ? prefix : new Array(key)),\n doSet(parent[key]),\n ...parent.slice(key + 1),\n ]\n }\n return [...new Array(key), doSet()]\n }\n\n throw new Error('Uh oh!')\n }\n\n return doSet(obj)\n}\n\nconst reFindNumbers0 = /^(\\d*)$/gm\nconst reFindNumbers1 = /\\.(\\d*)\\./gm\nconst reFindNumbers2 = /^(\\d*)\\./gm\nconst reFindNumbers3 = /\\.(\\d*$)/gm\nconst reFindMultiplePeriods = /\\.{2,}/gm\n\nfunction makePathArray(str: string) {\n return str\n .replace('[', '.')\n .replace(']', '')\n .replace(reFindNumbers0, '__int__$1')\n .replace(reFindNumbers1, '.__int__$1.')\n .replace(reFindNumbers2, '__int__$1.')\n .replace(reFindNumbers3, '.__int__$1')\n .replace(reFindMultiplePeriods, '.')\n .split('.')\n .map((d) => {\n if (d.indexOf('__int__') === 0) {\n return parseInt(d.substring('__int__'.length), 10)\n }\n return d\n })\n}\n\nexport type RequiredByKey<T, K extends keyof T> = Omit<T, K> &\n Required<Pick<T, K>>\n\ntype ComputeRange<\n N extends number,\n Result extends Array<unknown> = [],\n> = Result['length'] extends N\n ? Result\n : ComputeRange<N, [...Result, Result['length']]>\ntype Index40 = ComputeRange<40>[number]\n\n// Is this type a tuple?\ntype IsTuple<T> = T extends readonly any[] & { length: infer Length }\n ? Length extends Index40\n ? T\n : never\n : never\n\n// If this type is a tuple, what indices are allowed?\ntype AllowedIndexes<\n Tuple extends ReadonlyArray<any>,\n Keys extends number = never,\n> = Tuple extends readonly []\n ? Keys\n : Tuple extends readonly [infer _, ...infer Tail]\n ? AllowedIndexes<Tail, Keys | Tail['length']>\n : Keys\n\nexport type DeepKeys<T> = unknown extends T\n ? keyof T\n : object extends T\n ? string\n : T extends readonly any[] & IsTuple<T>\n ? AllowedIndexes<T> | DeepKeysPrefix<T, AllowedIndexes<T>>\n : T extends any[]\n ? never & 'Dynamic length array indexing is not supported'\n : T extends Date\n ? never\n : T extends object\n ? (keyof T & string) | DeepKeysPrefix<T, keyof T>\n : never\n\ntype DeepKeysPrefix<T, TPrefix> = TPrefix extends keyof T & (number | string)\n ? `${TPrefix}.${DeepKeys<T[TPrefix]> & string}`\n : never\n\nexport type DeepValue<T, TProp> = T extends Record<string | number, any>\n ? TProp extends `${infer TBranch}.${infer TDeepProp}`\n ? DeepValue<T[TBranch], TDeepProp>\n : T[TProp & string]\n : never\n","import type { FormEvent } from 'react'\nimport { Store } from '@tanstack/store'\n//\nimport type { DeepKeys, DeepValue, Updater } from './utils'\nimport { functionalUpdate, getBy, setBy } from './utils'\nimport type { FieldApi, FieldMeta } from './FieldApi'\n\nexport type FormOptions<TData> = {\n defaultValues?: TData\n defaultState?: Partial<FormState<TData>>\n onSubmit?: (values: TData, formApi: FormApi<TData>) => Promise<any>\n onInvalidSubmit?: (values: TData, formApi: FormApi<TData>) => void\n validate?: (values: TData, formApi: FormApi<TData>) => Promise<any>\n debugForm?: boolean\n validatePristine?: boolean\n}\n\nexport type FieldInfo<TFormData> = {\n instances: Record<string, FieldApi<any, TFormData>>\n} & ValidationMeta\n\nexport type ValidationMeta = {\n validationCount?: number\n validationPromise?: Promise<ValidationError>\n validationResolve?: (error: ValidationError) => void\n validationReject?: (error: unknown) => void\n}\n\nexport type ValidationError = undefined | false | null | string\n\nexport type FormState<TData> = {\n values: TData\n // Form Validation\n isFormValidating: boolean\n formValidationCount: number\n isFormValid: boolean\n formError?: ValidationError\n // Fields\n fieldMeta: Record<DeepKeys<TData>, FieldMeta>\n isFieldsValidating: boolean\n isFieldsValid: boolean\n isSubmitting: boolean\n // General\n isTouched: boolean\n isSubmitted: boolean\n isValidating: boolean\n isValid: boolean\n canSubmit: boolean\n submissionAttempts: number\n}\n\nexport function getDefaultFormState<TData>(\n defaultState: Partial<FormState<TData>>,\n): FormState<TData> {\n return {\n values: {} as any,\n fieldMeta: {} as any,\n canSubmit: true,\n isFieldsValid: false,\n isFieldsValidating: false,\n isFormValid: false,\n isFormValidating: false,\n isSubmitted: false,\n isSubmitting: false,\n isTouched: false,\n isValid: false,\n isValidating: false,\n submissionAttempts: 0,\n formValidationCount: 0,\n ...defaultState,\n }\n}\n\nexport class FormApi<TFormData> {\n // // This carries the context for nested fields\n options: FormOptions<TFormData> = {}\n store!: Store<FormState<TFormData>>\n // Do not use __state directly, as it is not reactive.\n // Please use form.useStore() utility to subscribe to state\n state!: FormState<TFormData>\n fieldInfo: Record<DeepKeys<TFormData>, FieldInfo<TFormData>> = {} as any\n fieldName?: string\n validationMeta: ValidationMeta = {}\n\n constructor(opts?: FormOptions<TFormData>) {\n this.store = new Store<FormState<TFormData>>(\n getDefaultFormState({\n ...opts?.defaultState,\n values: opts?.defaultValues ?? opts?.defaultState?.values,\n isFormValid: !opts?.validate,\n }),\n {\n onUpdate: (next) => {\n // Computed state\n const fieldMetaValues = Object.values(next.fieldMeta) as (\n | FieldMeta\n | undefined\n )[]\n\n const isFieldsValidating = fieldMetaValues.some(\n (field) => field?.isValidating,\n )\n\n const isFieldsValid = !fieldMetaValues.some((field) => field?.error)\n\n const isTouched = fieldMetaValues.some((field) => field?.isTouched)\n\n const isValidating = isFieldsValidating || next.isFormValidating\n const isFormValid = !next.formError\n const isValid = isFieldsValid && isFormValid\n const canSubmit =\n (next.submissionAttempts === 0 && !isTouched) ||\n (!isValidating && !next.isSubmitting && isValid)\n\n next = {\n ...next,\n isFieldsValidating,\n isFieldsValid,\n isFormValid,\n isValid,\n canSubmit,\n isTouched,\n }\n\n // Create a shortcut for the state\n // Write it back to the store\n this.store.state = next\n this.state = next\n },\n },\n )\n\n this.state = this.store.state\n\n this.update(opts || {})\n }\n\n update = (options: FormOptions<TFormData>) => {\n this.store.batch(() => {\n if (\n options.defaultState &&\n options.defaultState !== this.options.defaultState\n ) {\n this.store.setState((prev) => ({\n ...prev,\n ...options.defaultState,\n }))\n }\n\n if (options.defaultValues !== this.options.defaultValues) {\n this.store.setState((prev) => ({\n ...prev,\n values: options.defaultValues as TFormData,\n }))\n }\n })\n\n this.options = options\n }\n\n reset = () =>\n this.store.setState(() => getDefaultFormState(this.options.defaultValues!))\n\n validateAllFields = async () => {\n const fieldValidationPromises: Promise<ValidationError>[] = [] as any\n\n this.store.batch(() => {\n void (Object.values(this.fieldInfo) as FieldInfo<any>[]).forEach(\n (field) => {\n Object.values(field.instances).forEach((instance) => {\n // If any fields are not touched\n if (!instance.state.meta.isTouched) {\n // Mark them as touched\n instance.setMeta((prev) => ({ ...prev, isTouched: true }))\n // Validate the field\n if (instance.options.validate) {\n fieldValidationPromises.push(instance.validate())\n }\n }\n })\n },\n )\n })\n\n return Promise.all(fieldValidationPromises)\n }\n\n validateForm = async () => {\n const { validate } = this.options\n\n if (!validate) {\n return\n }\n\n // Use the formValidationCount for all field instances to\n // track freshness of the validation\n this.store.setState((prev) => ({\n ...prev,\n isValidating: true,\n formValidationCount: prev.formValidationCount + 1,\n }))\n\n const formValidationCount = this.state.formValidationCount\n\n const checkLatest = () =>\n formValidationCount === this.state.formValidationCount\n\n if (!this.validationMeta.validationPromise) {\n this.validationMeta.validationPromise = new Promise((resolve, reject) => {\n this.validationMeta.validationResolve = resolve\n this.validationMeta.validationReject = reject\n })\n }\n\n const doValidation = async () => {\n try {\n const error = await validate(this.state.values, this)\n\n if (checkLatest()) {\n this.store.setState((prev) => ({\n ...prev,\n isValidating: false,\n error: error\n ? typeof error === 'string'\n ? error\n : 'Invalid Form Values'\n : null,\n }))\n\n this.validationMeta.validationResolve?.(error)\n }\n } catch (err) {\n if (checkLatest()) {\n this.validationMeta.validationReject?.(err)\n }\n } finally {\n delete this.validationMeta.validationPromise\n }\n }\n\n doValidation()\n\n return this.validationMeta.validationPromise\n }\n\n handleSubmit = async (e: FormEvent & { __handled?: boolean }) => {\n e.preventDefault()\n e.stopPropagation()\n\n // Check to see that the form and all fields have been touched\n // If they have not, touch them all and run validation\n // Run form validation\n // Submit the form\n\n this.store.setState((old) => ({\n ...old,\n // Submittion attempts mark the form as not submitted\n isSubmitted: false,\n // Count submission attempts\n submissionAttempts: old.submissionAttempts + 1,\n }))\n\n // Don't let invalid forms submit\n if (!this.state.canSubmit) return\n\n this.store.setState((d) => ({ ...d, isSubmitting: true }))\n\n const done = () => {\n this.store.setState((prev) => ({ ...prev, isSubmitting: false }))\n }\n\n // Validate all fields\n await this.validateAllFields()\n\n // Fields are invalid, do not submit\n if (!this.state.isFieldsValid) {\n done()\n this.options.onInvalidSubmit?.(this.state.values, this)\n return\n }\n\n // Run validation for the form\n await this.validateForm()\n\n if (!this.state.isValid) {\n done()\n this.options.onInvalidSubmit?.(this.state.values, this)\n return\n }\n\n try {\n // Run the submit code\n await this.options.onSubmit?.(this.state.values, this)\n\n this.store.batch(() => {\n this.store.setState((prev) => ({ ...prev, isSubmitted: true }))\n done()\n })\n } catch (err) {\n done()\n throw err\n }\n }\n\n getFieldValue = <TField extends DeepKeys<TFormData>>(\n field: TField,\n ): DeepValue<TFormData, TField> => getBy(this.state.values, field)\n\n getFieldMeta = <TField extends DeepKeys<TFormData>>(\n field: TField,\n ): FieldMeta => {\n return this.state.fieldMeta[field]\n }\n\n getFieldInfo = <TField extends DeepKeys<TFormData>>(field: TField) => {\n return (this.fieldInfo[field] ||= {\n instances: {},\n })\n }\n\n setFieldMeta = <TField extends DeepKeys<TFormData>>(\n field: TField,\n updater: Updater<FieldMeta>,\n ) => {\n this.store.setState((prev) => {\n return {\n ...prev,\n fieldMeta: {\n ...prev.fieldMeta,\n [field]: functionalUpdate(updater, prev.fieldMeta[field]),\n },\n }\n })\n }\n\n setFieldValue = <TField extends DeepKeys<TFormData>>(\n field: TField,\n updater: Updater<DeepValue<TFormData, TField>>,\n opts?: { touch?: boolean },\n ) => {\n const touch = opts?.touch ?? true\n\n this.store.batch(() => {\n this.store.setState((prev) => {\n return {\n ...prev,\n values: setBy(prev.values, field, updater),\n }\n })\n\n if (touch) {\n this.setFieldMeta(field, (prev) => ({\n ...prev,\n isTouched: true,\n }))\n }\n })\n }\n\n pushFieldValue = <TField extends DeepKeys<TFormData>>(\n field: TField,\n value: DeepValue<TFormData, TField>,\n opts?: { touch?: boolean },\n ) => {\n return this.setFieldValue(\n field,\n (prev) => [...(Array.isArray(prev) ? prev : []), value] as any,\n opts,\n )\n }\n\n insertFieldValue = <TField extends DeepKeys<TFormData>>(\n field: TField,\n index: number,\n value: DeepValue<TFormData, TField>,\n opts?: { touch?: boolean },\n ) => {\n this.setFieldValue(\n field,\n (prev) => {\n // invariant( // TODO: bring in invariant\n // Array.isArray(prev),\n // `Cannot insert a field value into a non-array field. Check that this field's existing value is an array: ${field}.`\n // )\n return (prev as DeepValue<TFormData, TField>[]).map((d, i) =>\n i === index ? value : d,\n ) as any\n },\n opts,\n )\n }\n\n spliceFieldValue = <TField extends DeepKeys<TFormData>>(\n field: TField,\n index: number,\n opts?: { touch?: boolean },\n ) => {\n this.setFieldValue(\n field,\n (prev) => {\n // invariant( // TODO: bring in invariant\n // Array.isArray(prev),\n // `Cannot insert a field value into a non-array field. Check that this field's existing value is an array: ${field}.`\n // )\n return (prev as DeepValue<TFormData, TField>[]).filter(\n (_d, i) => i !== index,\n ) as any\n },\n opts,\n )\n }\n\n swapFieldValues = <TField extends DeepKeys<TFormData>>(\n field: TField,\n index1: number,\n index2: number,\n ) => {\n this.setFieldValue(field, (prev: any) => {\n const prev1 = prev[index1]!\n const prev2 = prev[index2]!\n return setBy(setBy(prev, [index1], prev2), [index2], prev1)\n })\n }\n}\n","//\nimport type { DeepKeys, DeepValue, RequiredByKey, Updater } from './utils'\nimport type { FormApi, ValidationError } from './FormApi'\nimport { Store } from '@tanstack/store'\n\ntype ValidateOn = 'change' | 'blur' | 'submit'\n\nexport type FieldOptions<TData, TFormData> = {\n name: unknown extends TFormData ? string : DeepKeys<TFormData>\n defaultValue?: TData\n form?: FormApi<TFormData>\n validate?: (\n value: TData,\n fieldApi: FieldApi<TData, TFormData>,\n ) => ValidationError\n validateAsync?: (\n value: TData,\n fieldApi: FieldApi<TData, TFormData>,\n ) => ValidationError | Promise<ValidationError>\n validatePristine?: boolean // Default: false\n validateOn?: ValidateOn // Default: 'change'\n validateAsyncOn?: ValidateOn // Default: 'blur'\n validateAsyncDebounceMs?: number\n filterValue?: (value: TData) => TData\n defaultMeta?: Partial<FieldMeta>\n change?: boolean\n blur?: boolean\n submit?: boolean\n}\n\nexport type FieldMeta = {\n isTouched: boolean\n touchedError?: ValidationError\n error?: ValidationError\n isValidating: boolean\n}\n\nexport type ChangeProps<TData> = {\n onChange?: (updater: Updater<TData>) => void\n onBlur?: (event: any) => void\n}\n\nexport type InputProps = {\n onChange?: (event: any) => void\n onBlur?: (event: any) => void\n}\n\nexport type FieldApiOptions<TData, TFormData> = RequiredByKey<\n FieldOptions<TData, TFormData>,\n 'form'\n>\n\nlet uid = 0\n\nexport type FieldState<TData> = {\n value: TData\n meta: FieldMeta\n}\n\nexport class FieldApi<TData, TFormData> {\n uid: number\n form: FormApi<TFormData>\n name!: DeepKeys<TFormData>\n store!: Store<FieldState<TData>>\n state!: FieldState<TData>\n options: RequiredByKey<\n FieldOptions<TData, TFormData>,\n 'validateOn' | 'validateAsyncOn'\n > = {} as any\n\n constructor(opts: FieldApiOptions<TData, TFormData>) {\n this.form = opts.form\n this.uid = uid++\n // Support field prefixing from FieldScope\n let fieldPrefix = ''\n if (this.form.fieldName) {\n fieldPrefix = `${this.form.fieldName}.`\n }\n\n this.name = (fieldPrefix + opts.name) as any\n\n this.store = new Store<FieldState<TData>>(\n {\n value: this.getValue(),\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n meta: this.getMeta() ?? {\n isValidating: false,\n isTouched: false,\n ...this.options.defaultMeta,\n },\n },\n {\n onUpdate: (next) => {\n next.meta.touchedError = next.meta.isTouched\n ? next.meta.error\n : undefined\n\n // Do not validate pristine fields\n if (!this.options.validatePristine && !next.meta.isTouched) return\n\n // If validateOn is set to a variation of change, run the validation\n if (\n this.options.validateOn === 'change' ||\n this.options.validateOn.split('-')[0] === 'change'\n ) {\n try {\n this.validate()\n } catch (err) {\n console.error('An error occurred during validation', err)\n }\n }\n\n this.state = next\n },\n },\n )\n\n this.state = this.store.state\n this.update(opts)\n }\n\n mount = () => {\n const info = this.getInfo()\n info.instances[this.uid] = this\n\n const unsubscribe = this.form.store.subscribe(() => {\n this.#updateStore()\n })\n\n return () => {\n unsubscribe()\n delete info.instances[this.uid]\n if (!Object.keys(info.instances).length) {\n delete this.form.fieldInfo[this.name]\n }\n }\n }\n\n #updateStore = () => {\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 update = (opts: FieldApiOptions<TData, TFormData>) => {\n this.options = {\n validateOn: 'change',\n validateAsyncOn: 'blur',\n validateAsyncDebounceMs: 0,\n ...opts,\n }\n\n // Default Value\n if (\n this.state.value === undefined &&\n this.options.defaultValue !== undefined\n ) {\n this.setValue(this.options.defaultValue)\n }\n\n // Default Meta\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (this.getMeta() === undefined) {\n this.setMeta(this.state.meta)\n }\n }\n\n getValue = (): TData => this.form.getFieldValue(this.name)\n setValue = (\n updater: Updater<TData>,\n options?: { touch?: boolean; notify?: boolean },\n ) => this.form.setFieldValue(this.name, updater as any, options)\n\n getMeta = (): FieldMeta => this.form.getFieldMeta(this.name)\n setMeta = (updater: Updater<FieldMeta>) =>\n this.form.setFieldMeta(this.name, updater)\n\n getInfo = () => this.form.getFieldInfo(this.name)\n\n pushValue = (value: TData) =>\n this.form.pushFieldValue(this.name, value as any)\n insertValue = (index: number, value: TData) =>\n this.form.insertFieldValue(this.name, index, value as any)\n removeValue = (index: number) => this.form.spliceFieldValue(this.name, index)\n swapValues = (aIndex: number, bIndex: number) =>\n this.form.swapFieldValues(this.name, aIndex, bIndex)\n\n getSubField = <TName extends DeepKeys<TData>>(name: TName) =>\n new FieldApi<DeepValue<TData, TName>, TFormData>({\n name: `${this.name}.${name}` as any,\n form: this.form,\n })\n\n #validate = async (isAsync: boolean) => {\n if (!this.options.validate) {\n return\n }\n\n this.setMeta((prev) => ({ ...prev, isValidating: true }))\n\n // Use the validationCount for all field instances to\n // track freshness of the validation\n const validationCount = (this.getInfo().validationCount || 0) + 1\n\n this.getInfo().validationCount = validationCount\n\n const checkLatest = () => validationCount === this.getInfo().validationCount\n\n if (!this.getInfo().validationPromise) {\n this.getInfo().validationPromise = new Promise((resolve, reject) => {\n this.getInfo().validationResolve = resolve\n this.getInfo().validationReject = reject\n })\n }\n\n try {\n const rawError = await this.options.validate(this.state.value, this)\n\n if (checkLatest()) {\n const error = (() => {\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\n this.setMeta((prev) => ({\n ...prev,\n isValidating: false,\n error,\n }))\n this.getInfo().validationResolve?.(error)\n }\n } catch (error) {\n if (checkLatest()) {\n this.getInfo().validationReject?.(error)\n throw error\n }\n } finally {\n if (checkLatest()) {\n this.setMeta((prev) => ({ ...prev, isValidating: false }))\n delete this.getInfo().validationPromise\n }\n }\n\n return this.getInfo().validationPromise\n }\n\n validate = () => this.#validate(false)\n validateAsync = () => this.#validate(true)\n\n getChangeProps = <T extends ChangeProps<any>>(\n props: T = {} as T,\n ): ChangeProps<TData> & Omit<T, keyof ChangeProps<TData>> => {\n return {\n ...props,\n value: this.state.value,\n onChange: (value) => {\n this.setValue(value)\n props.onChange?.(value)\n },\n onBlur: (e) => {\n this.setMeta((prev) => ({ ...prev, isTouched: true }))\n\n const { validateOn } = this.options\n\n if (validateOn === 'blur' || validateOn.split('-')[0] === 'blur') {\n this.validate()\n }\n\n props.onBlur?.(e)\n },\n } as ChangeProps<TData> & Omit<T, keyof ChangeProps<TData>>\n }\n\n getInputProps = <T extends InputProps>(\n props: T = {} as T,\n ): InputProps & Omit<T, keyof InputProps> => {\n return {\n ...props,\n value: String(this.state.value),\n onChange: (e) => {\n this.setValue(e.target.value)\n props.onChange?.(e.target.value)\n },\n onBlur: this.getChangeProps(props).onBlur,\n }\n }\n}\n"],"names":["Store","listeners","Set","batching","queue","constructor","initialState","options","this","state","subscribe","listener","add","unsub","onSubscribe","delete","setState","updater","previous","updateFn","onUpdate","push","forEach","flush","cb","batch","functionalUpdate","input","getBy","obj","path","Error","makePathArray","reduce","current","pathPart","setBy","_path","doSet","parent","length","key","shift","Array","isArray","prefix","slice","reFindNumbers0","reFindNumbers1","reFindNumbers2","reFindNumbers3","reFindMultiplePeriods","str","replace","split","map","d","indexOf","parseInt","substring","getDefaultFormState","defaultState","values","fieldMeta","canSubmit","isFieldsValid","isFieldsValidating","isFormValid","isFormValidating","isSubmitted","isSubmitting","isTouched","isValid","isValidating","submissionAttempts","formValidationCount","uid","FieldApi","opts","_this$getMeta","mount","info","getInfo","instances","unsubscribe","form","store","_classPrivateFieldLooseBase","_updateStore","Object","keys","fieldInfo","name","defineProperty","writable","value","nextValue","getValue","nextMeta","getMeta","prev","meta","update","validateOn","validateAsyncOn","validateAsyncDebounceMs","undefined","defaultValue","setValue","setMeta","getFieldValue","setFieldValue","getFieldMeta","setFieldMeta","getFieldInfo","pushValue","pushFieldValue","insertValue","index","insertFieldValue","removeValue","spliceFieldValue","swapValues","aIndex","bIndex","swapFieldValues","getSubField","_validate","async","validate","validationCount","checkLatest","validationPromise","Promise","resolve","reject","validationResolve","validationReject","rawError","_this$getInfo$validat","_this$getInfo","error","call","_this$getInfo$validat2","_this$getInfo2","validateAsync","getChangeProps","props","onChange","onBlur","e","getInputProps","String","target","fieldPrefix","fieldName","defaultMeta","next","touchedError","validatePristine","err","console","_opts$defaultValues","_opts$defaultState","validationMeta","defaultValues","reset","validateAllFields","fieldValidationPromises","field","instance","all","validateForm","_this$validationMeta$","_this$validationMeta","_this$validationMeta$2","_this$validationMeta2","doValidation","handleSubmit","preventDefault","stopPropagation","old","done","_this$options$onInval","_this$options","_this$options$onInval2","_this$options2","onInvalidSubmit","_this$options$onSubmi","_this$options3","onSubmit","_this$fieldInfo","_opts$touch","touch","i","filter","_d","index1","index2","prev1","prev2","fieldMetaValues","some","formError"],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,32 @@
1
+ {
2
+ "name": "@tanstack/form-core",
3
+ "version": "0.0.1",
4
+ "description": "Powerful, type-safe, framework agnostic forms.",
5
+ "author": "tannerlinsley",
6
+ "license": "MIT",
7
+ "repository": "tanstack/form",
8
+ "homepage": "https://tanstack.com/form",
9
+ "funding": {
10
+ "type": "github",
11
+ "url": "https://github.com/sponsors/tannerlinsley"
12
+ },
13
+ "types": "build/types/index.d.ts",
14
+ "main": "build/cjs/index.js",
15
+ "module": "build/esm/index.js",
16
+ "sideEffects": false,
17
+ "files": [
18
+ "build/**",
19
+ "src"
20
+ ],
21
+ "dependencies": {
22
+ "@tanstack/store": "0.0.1-beta.84"
23
+ },
24
+ "scripts": {
25
+ "clean": "rimraf ./build",
26
+ "test:eslint": "eslint --ext .ts,.tsx ./src",
27
+ "test:types": "tsc",
28
+ "test:lib": "jest --config ./jest.config.ts",
29
+ "test:lib:dev": "pnpm run test:lib --watch",
30
+ "build:types": "tsc --build"
31
+ }
32
+ }
@@ -0,0 +1,303 @@
1
+ //
2
+ import type { DeepKeys, DeepValue, RequiredByKey, Updater } from './utils'
3
+ import type { FormApi, ValidationError } from './FormApi'
4
+ import { Store } from '@tanstack/store'
5
+
6
+ type ValidateOn = 'change' | 'blur' | 'submit'
7
+
8
+ export type FieldOptions<TData, TFormData> = {
9
+ name: unknown extends TFormData ? string : DeepKeys<TFormData>
10
+ defaultValue?: TData
11
+ form?: FormApi<TFormData>
12
+ validate?: (
13
+ value: TData,
14
+ fieldApi: FieldApi<TData, TFormData>,
15
+ ) => ValidationError
16
+ validateAsync?: (
17
+ value: TData,
18
+ fieldApi: FieldApi<TData, TFormData>,
19
+ ) => ValidationError | Promise<ValidationError>
20
+ validatePristine?: boolean // Default: false
21
+ validateOn?: ValidateOn // Default: 'change'
22
+ validateAsyncOn?: ValidateOn // Default: 'blur'
23
+ validateAsyncDebounceMs?: number
24
+ filterValue?: (value: TData) => TData
25
+ defaultMeta?: Partial<FieldMeta>
26
+ change?: boolean
27
+ blur?: boolean
28
+ submit?: boolean
29
+ }
30
+
31
+ export type FieldMeta = {
32
+ isTouched: boolean
33
+ touchedError?: ValidationError
34
+ error?: ValidationError
35
+ isValidating: boolean
36
+ }
37
+
38
+ export type ChangeProps<TData> = {
39
+ onChange?: (updater: Updater<TData>) => void
40
+ onBlur?: (event: any) => void
41
+ }
42
+
43
+ export type InputProps = {
44
+ onChange?: (event: any) => void
45
+ onBlur?: (event: any) => void
46
+ }
47
+
48
+ export type FieldApiOptions<TData, TFormData> = RequiredByKey<
49
+ FieldOptions<TData, TFormData>,
50
+ 'form'
51
+ >
52
+
53
+ let uid = 0
54
+
55
+ export type FieldState<TData> = {
56
+ value: TData
57
+ meta: FieldMeta
58
+ }
59
+
60
+ export class FieldApi<TData, TFormData> {
61
+ uid: number
62
+ form: FormApi<TFormData>
63
+ name!: DeepKeys<TFormData>
64
+ store!: Store<FieldState<TData>>
65
+ state!: FieldState<TData>
66
+ options: RequiredByKey<
67
+ FieldOptions<TData, TFormData>,
68
+ 'validateOn' | 'validateAsyncOn'
69
+ > = {} as any
70
+
71
+ constructor(opts: FieldApiOptions<TData, TFormData>) {
72
+ this.form = opts.form
73
+ this.uid = uid++
74
+ // Support field prefixing from FieldScope
75
+ let fieldPrefix = ''
76
+ if (this.form.fieldName) {
77
+ fieldPrefix = `${this.form.fieldName}.`
78
+ }
79
+
80
+ this.name = (fieldPrefix + opts.name) as any
81
+
82
+ this.store = new Store<FieldState<TData>>(
83
+ {
84
+ value: this.getValue(),
85
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
86
+ meta: this.getMeta() ?? {
87
+ isValidating: false,
88
+ isTouched: false,
89
+ ...this.options.defaultMeta,
90
+ },
91
+ },
92
+ {
93
+ onUpdate: (next) => {
94
+ next.meta.touchedError = next.meta.isTouched
95
+ ? next.meta.error
96
+ : undefined
97
+
98
+ // Do not validate pristine fields
99
+ if (!this.options.validatePristine && !next.meta.isTouched) return
100
+
101
+ // If validateOn is set to a variation of change, run the validation
102
+ if (
103
+ this.options.validateOn === 'change' ||
104
+ this.options.validateOn.split('-')[0] === 'change'
105
+ ) {
106
+ try {
107
+ this.validate()
108
+ } catch (err) {
109
+ console.error('An error occurred during validation', err)
110
+ }
111
+ }
112
+
113
+ this.state = next
114
+ },
115
+ },
116
+ )
117
+
118
+ this.state = this.store.state
119
+ this.update(opts)
120
+ }
121
+
122
+ mount = () => {
123
+ const info = this.getInfo()
124
+ info.instances[this.uid] = this
125
+
126
+ const unsubscribe = this.form.store.subscribe(() => {
127
+ this.#updateStore()
128
+ })
129
+
130
+ return () => {
131
+ unsubscribe()
132
+ delete info.instances[this.uid]
133
+ if (!Object.keys(info.instances).length) {
134
+ delete this.form.fieldInfo[this.name]
135
+ }
136
+ }
137
+ }
138
+
139
+ #updateStore = () => {
140
+ this.store.batch(() => {
141
+ const nextValue = this.getValue()
142
+ const nextMeta = this.getMeta()
143
+
144
+ if (nextValue !== this.state.value) {
145
+ this.store.setState((prev) => ({ ...prev, value: nextValue }))
146
+ }
147
+
148
+ if (nextMeta !== this.state.meta) {
149
+ this.store.setState((prev) => ({ ...prev, meta: nextMeta }))
150
+ }
151
+ })
152
+ }
153
+
154
+ update = (opts: FieldApiOptions<TData, TFormData>) => {
155
+ this.options = {
156
+ validateOn: 'change',
157
+ validateAsyncOn: 'blur',
158
+ validateAsyncDebounceMs: 0,
159
+ ...opts,
160
+ }
161
+
162
+ // Default Value
163
+ if (
164
+ this.state.value === undefined &&
165
+ this.options.defaultValue !== undefined
166
+ ) {
167
+ this.setValue(this.options.defaultValue)
168
+ }
169
+
170
+ // Default Meta
171
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
172
+ if (this.getMeta() === undefined) {
173
+ this.setMeta(this.state.meta)
174
+ }
175
+ }
176
+
177
+ getValue = (): TData => this.form.getFieldValue(this.name)
178
+ setValue = (
179
+ updater: Updater<TData>,
180
+ options?: { touch?: boolean; notify?: boolean },
181
+ ) => this.form.setFieldValue(this.name, updater as any, options)
182
+
183
+ getMeta = (): FieldMeta => this.form.getFieldMeta(this.name)
184
+ setMeta = (updater: Updater<FieldMeta>) =>
185
+ this.form.setFieldMeta(this.name, updater)
186
+
187
+ getInfo = () => this.form.getFieldInfo(this.name)
188
+
189
+ pushValue = (value: TData) =>
190
+ this.form.pushFieldValue(this.name, value as any)
191
+ insertValue = (index: number, value: TData) =>
192
+ this.form.insertFieldValue(this.name, index, value as any)
193
+ removeValue = (index: number) => this.form.spliceFieldValue(this.name, index)
194
+ swapValues = (aIndex: number, bIndex: number) =>
195
+ this.form.swapFieldValues(this.name, aIndex, bIndex)
196
+
197
+ getSubField = <TName extends DeepKeys<TData>>(name: TName) =>
198
+ new FieldApi<DeepValue<TData, TName>, TFormData>({
199
+ name: `${this.name}.${name}` as any,
200
+ form: this.form,
201
+ })
202
+
203
+ #validate = async (isAsync: boolean) => {
204
+ if (!this.options.validate) {
205
+ return
206
+ }
207
+
208
+ this.setMeta((prev) => ({ ...prev, isValidating: true }))
209
+
210
+ // Use the validationCount for all field instances to
211
+ // track freshness of the validation
212
+ const validationCount = (this.getInfo().validationCount || 0) + 1
213
+
214
+ this.getInfo().validationCount = validationCount
215
+
216
+ const checkLatest = () => validationCount === this.getInfo().validationCount
217
+
218
+ if (!this.getInfo().validationPromise) {
219
+ this.getInfo().validationPromise = new Promise((resolve, reject) => {
220
+ this.getInfo().validationResolve = resolve
221
+ this.getInfo().validationReject = reject
222
+ })
223
+ }
224
+
225
+ try {
226
+ const rawError = await this.options.validate(this.state.value, this)
227
+
228
+ if (checkLatest()) {
229
+ const error = (() => {
230
+ if (rawError) {
231
+ if (typeof rawError !== 'string') {
232
+ return 'Invalid Form Values'
233
+ }
234
+
235
+ return rawError
236
+ }
237
+
238
+ return undefined
239
+ })()
240
+
241
+ this.setMeta((prev) => ({
242
+ ...prev,
243
+ isValidating: false,
244
+ error,
245
+ }))
246
+ this.getInfo().validationResolve?.(error)
247
+ }
248
+ } catch (error) {
249
+ if (checkLatest()) {
250
+ this.getInfo().validationReject?.(error)
251
+ throw error
252
+ }
253
+ } finally {
254
+ if (checkLatest()) {
255
+ this.setMeta((prev) => ({ ...prev, isValidating: false }))
256
+ delete this.getInfo().validationPromise
257
+ }
258
+ }
259
+
260
+ return this.getInfo().validationPromise
261
+ }
262
+
263
+ validate = () => this.#validate(false)
264
+ validateAsync = () => this.#validate(true)
265
+
266
+ getChangeProps = <T extends ChangeProps<any>>(
267
+ props: T = {} as T,
268
+ ): ChangeProps<TData> & Omit<T, keyof ChangeProps<TData>> => {
269
+ return {
270
+ ...props,
271
+ value: this.state.value,
272
+ onChange: (value) => {
273
+ this.setValue(value)
274
+ props.onChange?.(value)
275
+ },
276
+ onBlur: (e) => {
277
+ this.setMeta((prev) => ({ ...prev, isTouched: true }))
278
+
279
+ const { validateOn } = this.options
280
+
281
+ if (validateOn === 'blur' || validateOn.split('-')[0] === 'blur') {
282
+ this.validate()
283
+ }
284
+
285
+ props.onBlur?.(e)
286
+ },
287
+ } as ChangeProps<TData> & Omit<T, keyof ChangeProps<TData>>
288
+ }
289
+
290
+ getInputProps = <T extends InputProps>(
291
+ props: T = {} as T,
292
+ ): InputProps & Omit<T, keyof InputProps> => {
293
+ return {
294
+ ...props,
295
+ value: String(this.state.value),
296
+ onChange: (e) => {
297
+ this.setValue(e.target.value)
298
+ props.onChange?.(e.target.value)
299
+ },
300
+ onBlur: this.getChangeProps(props).onBlur,
301
+ }
302
+ }
303
+ }