@tanstack/form-core 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"FormApi.legacy.cjs","sources":["../../src/FormApi.ts"],"sourcesContent":["import { Store } from '@tanstack/store'\n//\nimport type { DeepKeys, DeepValue, Updater } from './utils'\nimport { functionalUpdate, getBy, setBy } from './utils'\nimport type { FieldApi, FieldMeta, ValidationCause } from './FieldApi'\n\nexport type FormOptions<TData> = {\n defaultValues?: TData\n defaultState?: Partial<FormState<TData>>\n asyncDebounceMs?: number\n onMount?: (values: TData, formApi: FormApi<TData>) => ValidationError\n onMountAsync?: (\n values: TData,\n formApi: FormApi<TData>,\n ) => ValidationError | Promise<ValidationError>\n onMountAsyncDebounceMs?: number\n onChange?: (values: TData, formApi: FormApi<TData>) => ValidationError\n onChangeAsync?: (\n values: TData,\n formApi: FormApi<TData>,\n ) => ValidationError | Promise<ValidationError>\n onChangeAsyncDebounceMs?: number\n onBlur?: (values: TData, formApi: FormApi<TData>) => ValidationError\n onBlurAsync?: (\n values: TData,\n formApi: FormApi<TData>,\n ) => ValidationError | Promise<ValidationError>\n onBlurAsyncDebounceMs?: number\n onSubmit?: (values: TData, formApi: FormApi<TData>) => any | Promise<any>\n onSubmitInvalid?: (values: TData, formApi: FormApi<TData>) => void\n}\n\nexport type FieldInfo<TFormData> = {\n instances: Record<string, FieldApi<any, TFormData>>\n} & ValidationMeta\n\nexport type ValidationMeta = {\n validationCount?: number\n validationAsyncCount?: 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\nfunction 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: true,\n }),\n {\n onUpdate: () => {\n let { state } = this.store\n // Computed state\n const fieldMetaValues = Object.values(state.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 || state.isFormValidating\n const isFormValid = !state.formError\n const isValid = isFieldsValid && isFormValid\n const canSubmit =\n (state.submissionAttempts === 0 && !isTouched) ||\n (!isValidating && !state.isSubmitting && isValid)\n\n state = {\n ...state,\n isFieldsValidating,\n isFieldsValid,\n isFormValid,\n isValid,\n canSubmit,\n isTouched,\n }\n\n this.store.state = state\n this.state = state\n },\n },\n )\n\n this.state = this.store.state\n\n this.update(opts || {})\n }\n\n update = (options?: FormOptions<TFormData>) => {\n if (!options) return\n\n this.store.batch(() => {\n const shouldUpdateValues =\n options.defaultValues &&\n options.defaultValues !== this.options.defaultValues\n\n const shouldUpdateState =\n options.defaultState !== this.options.defaultState\n\n this.store.setState(() =>\n getDefaultFormState(\n Object.assign(\n {},\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n shouldUpdateState ? options.defaultState : {},\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n shouldUpdateValues\n ? {\n values: options.defaultValues,\n }\n : {},\n ),\n ),\n )\n })\n\n this.options = options\n }\n\n reset = () =>\n this.store.setState(() =>\n getDefaultFormState({\n ...this.options.defaultState,\n values: this.options.defaultValues ?? this.options.defaultState?.values,\n }),\n )\n\n validateAllFields = async (cause: ValidationCause) => {\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 fieldValidationPromises.push(\n Promise.resolve().then(() => instance.validate(cause)),\n )\n }\n })\n },\n )\n })\n\n return Promise.all(fieldValidationPromises)\n }\n\n handleSubmit = async () => {\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 // Submission 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('submit')\n\n // Fields are invalid, do not submit\n if (!this.state.isFieldsValid) {\n done()\n this.options.onSubmitInvalid?.(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.onSubmitInvalid?.(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 | undefined => {\n return this.state.fieldMeta[field]\n }\n\n getFieldInfo = <TField extends DeepKeys<TFormData>>(field: TField) => {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\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\n\n this.store.batch(() => {\n if (touch) {\n this.setFieldMeta(field, (prev) => ({\n ...prev,\n isTouched: true,\n }))\n }\n\n this.store.setState((prev) => {\n return {\n ...prev,\n values: setBy(prev.values, field, updater),\n }\n })\n })\n }\n\n pushFieldValue = <TField extends DeepKeys<TFormData>>(\n field: TField,\n value: DeepValue<TFormData, TField>[number],\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>[number],\n opts?: { touch?: boolean },\n ) => {\n this.setFieldValue(\n field,\n (prev) => {\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 removeFieldValue = <TField extends DeepKeys<TFormData>>(\n field: TField,\n index: number,\n opts?: { touch?: boolean },\n ) => {\n this.setFieldValue(\n field,\n (prev) => {\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"],"names":["getDefaultFormState","defaultState","values","fieldMeta","canSubmit","isFieldsValid","isFieldsValidating","isFormValid","isFormValidating","isSubmitted","isSubmitting","isTouched","isValid","isValidating","submissionAttempts","formValidationCount","FormApi","constructor","opts","_opts$defaultValues","_opts$defaultState","_defineProperty","options","store","batch","shouldUpdateValues","defaultValues","shouldUpdateState","setState","Object","assign","_this$options$default","_this$options$default2","cause","fieldValidationPromises","fieldInfo","forEach","field","instances","instance","state","meta","setMeta","prev","push","Promise","resolve","then","validate","all","old","d","done","validateAllFields","_this$options$onSubmi","_this$options","onSubmitInvalid","call","_this$options$onSubmi2","_this$options2","_this$options$onSubmi3","_this$options3","onSubmit","err","getBy","_this$fieldInfo","updater","functionalUpdate","touch","setFieldMeta","setBy","value","setFieldValue","Array","isArray","index","map","i","filter","_d","index1","index2","prev1","prev2","Store","onUpdate","fieldMetaValues","some","error","formError","update"],"mappings":"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"}
1
+ {"version":3,"file":"FormApi.legacy.cjs","sources":["../../src/FormApi.ts"],"sourcesContent":["import { Store } from '@tanstack/store'\n//\nimport type { DeepKeys, DeepValue, Updater } from './utils'\nimport { functionalUpdate, getBy, setBy } from './utils'\nimport type { FieldApi, FieldMeta, ValidationCause } from './FieldApi'\n\nexport type FormOptions<TData> = {\n defaultValues?: TData\n defaultState?: Partial<FormState<TData>>\n asyncDebounceMs?: number\n onMount?: (values: TData, formApi: FormApi<TData>) => ValidationError\n onMountAsync?: (\n values: TData,\n formApi: FormApi<TData>,\n ) => ValidationError | Promise<ValidationError>\n onMountAsyncDebounceMs?: number\n onChange?: (values: TData, formApi: FormApi<TData>) => ValidationError\n onChangeAsync?: (\n values: TData,\n formApi: FormApi<TData>,\n ) => ValidationError | Promise<ValidationError>\n onChangeAsyncDebounceMs?: number\n onBlur?: (values: TData, formApi: FormApi<TData>) => ValidationError\n onBlurAsync?: (\n values: TData,\n formApi: FormApi<TData>,\n ) => ValidationError | Promise<ValidationError>\n onBlurAsyncDebounceMs?: number\n onSubmit?: (values: TData, formApi: FormApi<TData>) => any | Promise<any>\n onSubmitInvalid?: (values: TData, formApi: FormApi<TData>) => void\n}\n\nexport type FieldInfo<TFormData> = {\n instances: Record<string, FieldApi<any, TFormData>>\n} & ValidationMeta\n\nexport type ValidationMeta = {\n validationCount?: number\n validationAsyncCount?: 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\nfunction getDefaultFormState<TData>(\n defaultState: Partial<FormState<TData>>,\n): FormState<TData> {\n return {\n values: defaultState.values ?? ({} as never),\n fieldMeta: defaultState.fieldMeta ?? ({} as never),\n canSubmit: defaultState.canSubmit ?? true,\n isFieldsValid: defaultState.isFieldsValid ?? false,\n isFieldsValidating: defaultState.isFieldsValidating ?? false,\n isFormValid: defaultState.isFormValid ?? false,\n isFormValidating: defaultState.isFormValidating ?? false,\n isSubmitted: defaultState.isSubmitted ?? false,\n isSubmitting: defaultState.isSubmitting ?? false,\n isTouched: defaultState.isTouched ?? false,\n isValid: defaultState.isValid ?? false,\n isValidating: defaultState.isValidating ?? false,\n submissionAttempts: defaultState.submissionAttempts ?? 0,\n formValidationCount: defaultState.formValidationCount ?? 0,\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: true,\n }),\n {\n onUpdate: () => {\n let { state } = this.store\n // Computed state\n const fieldMetaValues = Object.values(state.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 || state.isFormValidating\n const isFormValid = !state.formError\n const isValid = isFieldsValid && isFormValid\n const canSubmit =\n (state.submissionAttempts === 0 && !isTouched) ||\n (!isValidating && !state.isSubmitting && isValid)\n\n state = {\n ...state,\n isFieldsValidating,\n isFieldsValid,\n isFormValid,\n isValid,\n canSubmit,\n isTouched,\n }\n\n this.store.state = state\n this.state = state\n },\n },\n )\n\n this.state = this.store.state\n\n this.update(opts || {})\n }\n\n update = (options?: FormOptions<TFormData>) => {\n if (!options) return\n\n this.store.batch(() => {\n const shouldUpdateValues =\n options.defaultValues &&\n options.defaultValues !== this.options.defaultValues &&\n !this.state.isTouched\n\n const shouldUpdateState =\n options.defaultState !== this.options.defaultState &&\n !this.state.isTouched\n\n this.store.setState(() =>\n getDefaultFormState(\n Object.assign(\n {},\n this.state,\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n shouldUpdateState ? options.defaultState : {},\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n shouldUpdateValues\n ? {\n values: options.defaultValues,\n }\n : {},\n ),\n ),\n )\n })\n\n this.options = options\n }\n\n reset = () =>\n this.store.setState(() =>\n getDefaultFormState({\n ...this.options.defaultState,\n values: this.options.defaultValues ?? this.options.defaultState?.values,\n }),\n )\n\n validateAllFields = async (cause: ValidationCause) => {\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 fieldValidationPromises.push(\n Promise.resolve().then(() => instance.validate(cause)),\n )\n }\n })\n },\n )\n })\n\n return Promise.all(fieldValidationPromises)\n }\n\n handleSubmit = async () => {\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 // Submission 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('submit')\n\n // Fields are invalid, do not submit\n if (!this.state.isFieldsValid) {\n done()\n this.options.onSubmitInvalid?.(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.onSubmitInvalid?.(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 | undefined => {\n return this.state.fieldMeta[field]\n }\n\n getFieldInfo = <TField extends DeepKeys<TFormData>>(field: TField) => {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\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\n\n this.store.batch(() => {\n if (touch) {\n this.setFieldMeta(field, (prev) => ({\n ...prev,\n isTouched: true,\n }))\n }\n\n this.store.setState((prev) => {\n return {\n ...prev,\n values: setBy(prev.values, field, updater),\n }\n })\n })\n }\n\n pushFieldValue = <TField extends DeepKeys<TFormData>>(\n field: TField,\n value: DeepValue<TFormData, TField>[number],\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>[number],\n opts?: { touch?: boolean },\n ) => {\n this.setFieldValue(\n field,\n (prev) => {\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 removeFieldValue = <TField extends DeepKeys<TFormData>>(\n field: TField,\n index: number,\n opts?: { touch?: boolean },\n ) => {\n this.setFieldValue(\n field,\n (prev) => {\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"],"names":["getDefaultFormState","defaultState","_defaultState$values","_defaultState$fieldMe","_defaultState$canSubm","_defaultState$isField","_defaultState$isField2","_defaultState$isFormV","_defaultState$isFormV2","_defaultState$isSubmi","_defaultState$isSubmi2","_defaultState$isTouch","_defaultState$isValid","_defaultState$isValid2","_defaultState$submiss","_defaultState$formVal","values","fieldMeta","canSubmit","isFieldsValid","isFieldsValidating","isFormValid","isFormValidating","isSubmitted","isSubmitting","isTouched","isValid","isValidating","submissionAttempts","formValidationCount","FormApi","constructor","opts","_opts$defaultValues","_opts$defaultState","_defineProperty","options","store","batch","shouldUpdateValues","defaultValues","state","shouldUpdateState","setState","Object","assign","_this$options$default","_this$options$default2","cause","fieldValidationPromises","fieldInfo","forEach","field","instances","instance","meta","setMeta","prev","push","Promise","resolve","then","validate","all","old","d","done","validateAllFields","_this$options$onSubmi","_this$options","onSubmitInvalid","call","_this$options$onSubmi2","_this$options2","_this$options$onSubmi3","_this$options3","onSubmit","err","getBy","_this$fieldInfo","updater","functionalUpdate","touch","setFieldMeta","setBy","value","setFieldValue","Array","isArray","index","map","i","filter","_d","index1","index2","prev1","prev2","Store","onUpdate","fieldMetaValues","some","error","formError","update"],"mappings":";;;;;;AAmEA,SAASA,mBAAmBA,CAC1BC,YAAuC,EACrB;EAAA,IAAAC,oBAAA,EAAAC,qBAAA,EAAAC,qBAAA,EAAAC,qBAAA,EAAAC,sBAAA,EAAAC,qBAAA,EAAAC,sBAAA,EAAAC,qBAAA,EAAAC,sBAAA,EAAAC,qBAAA,EAAAC,qBAAA,EAAAC,sBAAA,EAAAC,qBAAA,EAAAC,qBAAA,CAAA;EAClB,OAAO;IACLC,MAAM,EAAA,CAAAd,oBAAA,GAAED,YAAY,CAACe,MAAM,KAAAd,IAAAA,GAAAA,oBAAA,GAAK,EAAY;IAC5Ce,SAAS,EAAA,CAAAd,qBAAA,GAAEF,YAAY,CAACgB,SAAS,KAAAd,IAAAA,GAAAA,qBAAA,GAAK,EAAY;IAClDe,SAAS,EAAA,CAAAd,qBAAA,GAAEH,YAAY,CAACiB,SAAS,KAAA,IAAA,GAAAd,qBAAA,GAAI,IAAI;IACzCe,aAAa,EAAA,CAAAd,qBAAA,GAAEJ,YAAY,CAACkB,aAAa,KAAA,IAAA,GAAAd,qBAAA,GAAI,KAAK;IAClDe,kBAAkB,EAAA,CAAAd,sBAAA,GAAEL,YAAY,CAACmB,kBAAkB,KAAA,IAAA,GAAAd,sBAAA,GAAI,KAAK;IAC5De,WAAW,EAAA,CAAAd,qBAAA,GAAEN,YAAY,CAACoB,WAAW,KAAA,IAAA,GAAAd,qBAAA,GAAI,KAAK;IAC9Ce,gBAAgB,EAAA,CAAAd,sBAAA,GAAEP,YAAY,CAACqB,gBAAgB,KAAA,IAAA,GAAAd,sBAAA,GAAI,KAAK;IACxDe,WAAW,EAAA,CAAAd,qBAAA,GAAER,YAAY,CAACsB,WAAW,KAAA,IAAA,GAAAd,qBAAA,GAAI,KAAK;IAC9Ce,YAAY,EAAA,CAAAd,sBAAA,GAAET,YAAY,CAACuB,YAAY,KAAA,IAAA,GAAAd,sBAAA,GAAI,KAAK;IAChDe,SAAS,EAAA,CAAAd,qBAAA,GAAEV,YAAY,CAACwB,SAAS,KAAA,IAAA,GAAAd,qBAAA,GAAI,KAAK;IAC1Ce,OAAO,EAAA,CAAAd,qBAAA,GAAEX,YAAY,CAACyB,OAAO,KAAA,IAAA,GAAAd,qBAAA,GAAI,KAAK;IACtCe,YAAY,EAAA,CAAAd,sBAAA,GAAEZ,YAAY,CAAC0B,YAAY,KAAA,IAAA,GAAAd,sBAAA,GAAI,KAAK;IAChDe,kBAAkB,EAAA,CAAAd,qBAAA,GAAEb,YAAY,CAAC2B,kBAAkB,KAAA,IAAA,GAAAd,qBAAA,GAAI,CAAC;IACxDe,mBAAmB,EAAA,CAAAd,qBAAA,GAAEd,YAAY,CAAC4B,mBAAmB,KAAA,IAAA,GAAAd,qBAAA,GAAI,CAAA;GAC1D,CAAA;AACH,CAAA;AAEO,MAAMe,OAAO,CAAY;EAW9BC,WAAWA,CAACC,KAA6B,EAAE;IAAA,IAAAC,mBAAA,EAAAC,kBAAA,CAAA;AAV3C;IAAAC,wCAAA,CAAA,IAAA,EAAA,SAAA,EACkC,EAAE,CAAA,CAAA;IAAAA,wCAAA,CAAA,IAAA,EAAA,OAAA,EAAA,KAAA,CAAA,CAAA,CAAA;AAEpC;AACA;IAAAA,wCAAA,CAAA,IAAA,EAAA,OAAA,EAAA,KAAA,CAAA,CAAA,CAAA;IAAAA,wCAAA,CAAA,IAAA,EAAA,WAAA,EAE+D,EAAE,CAAA,CAAA;IAAAA,wCAAA,CAAA,IAAA,EAAA,WAAA,EAAA,KAAA,CAAA,CAAA,CAAA;IAAAA,wCAAA,CAAA,IAAA,EAAA,gBAAA,EAEhC,EAAE,CAAA,CAAA;IAAAA,wCAAA,CAAA,IAAA,EAAA,QAAA,EAsDzBC,OAAgC,IAAK;MAC7C,IAAI,CAACA,OAAO,EAAE,OAAA;AAEd,MAAA,IAAI,CAACC,KAAK,CAACC,KAAK,CAAC,MAAM;QACrB,MAAMC,kBAAkB,GACtBH,OAAO,CAACI,aAAa,IACrBJ,OAAO,CAACI,aAAa,KAAK,IAAI,CAACJ,OAAO,CAACI,aAAa,IACpD,CAAC,IAAI,CAACC,KAAK,CAAChB,SAAS,CAAA;AAEvB,QAAA,MAAMiB,iBAAiB,GACrBN,OAAO,CAACnC,YAAY,KAAK,IAAI,CAACmC,OAAO,CAACnC,YAAY,IAClD,CAAC,IAAI,CAACwC,KAAK,CAAChB,SAAS,CAAA;AAEvB,QAAA,IAAI,CAACY,KAAK,CAACM,QAAQ,CAAC,MAClB3C,mBAAmB,CACjB4C,MAAM,CAACC,MAAM,CACX,EAAE,EACF,IAAI,CAACJ,KAAK;AACV;AACAC,QAAAA,iBAAiB,GAAGN,OAAO,CAACnC,YAAY,GAAG,EAAE;AAC7C;AACAsC,QAAAA,kBAAkB,GACd;UACEvB,MAAM,EAAEoB,OAAO,CAACI,aAAAA;AAClB,SAAC,GACD,EACN,CACF,CACF,CAAC,CAAA;AACH,OAAC,CAAC,CAAA;MAEF,IAAI,CAACJ,OAAO,GAAGA,OAAO,CAAA;KACvB,CAAA,CAAA;AAAAD,IAAAA,wCAAA,gBAEO,MACN,IAAI,CAACE,KAAK,CAACM,QAAQ,CAAC,MAAA;MAAA,IAAAG,qBAAA,EAAAC,sBAAA,CAAA;AAAA,MAAA,OAClB/C,mBAAmB,CAAC;AAClB,QAAA,GAAG,IAAI,CAACoC,OAAO,CAACnC,YAAY;QAC5Be,MAAM,EAAA,CAAA8B,qBAAA,GAAE,IAAI,CAACV,OAAO,CAACI,aAAa,KAAAM,IAAAA,GAAAA,qBAAA,IAAAC,sBAAA,GAAI,IAAI,CAACX,OAAO,CAACnC,YAAY,KAAA,IAAA,GAAA,KAAA,CAAA,GAAzB8C,sBAAA,CAA2B/B,MAAAA;AACnE,OAAC,CAAC,CAAA;AAAA,KACJ,CAAC,CAAA,CAAA;IAAAmB,wCAAA,CAAA,IAAA,EAAA,mBAAA,EAEiB,MAAOa,KAAsB,IAAK;MACpD,MAAMC,uBAAmD,GAAG,EAAS,CAAA;AAErE,MAAA,IAAI,CAACZ,KAAK,CAACC,KAAK,CAAC,MAAM;AACrB,QAAA,KAAMM,MAAM,CAAC5B,MAAM,CAAC,IAAI,CAACkC,SAAS,CAAC,CAAsBC,OAAO,CAC7DC,KAAK,IAAK;UACTR,MAAM,CAAC5B,MAAM,CAACoC,KAAK,CAACC,SAAS,CAAC,CAACF,OAAO,CAAEG,QAAQ,IAAK;AACnD;YACA,IAAI,CAACA,QAAQ,CAACb,KAAK,CAACc,IAAI,CAAC9B,SAAS,EAAE;AAClC;AACA6B,cAAAA,QAAQ,CAACE,OAAO,CAAEC,IAAI,KAAM;AAAE,gBAAA,GAAGA,IAAI;AAAEhC,gBAAAA,SAAS,EAAE,IAAA;AAAK,eAAC,CAAC,CAAC,CAAA;AAC1D;AACAwB,cAAAA,uBAAuB,CAACS,IAAI,CAC1BC,OAAO,CAACC,OAAO,EAAE,CAACC,IAAI,CAAC,MAAMP,QAAQ,CAACQ,QAAQ,CAACd,KAAK,CAAC,CACvD,CAAC,CAAA;AACH,aAAA;AACF,WAAC,CAAC,CAAA;AACJ,SACF,CAAC,CAAA;AACH,OAAC,CAAC,CAAA;AAEF,MAAA,OAAOW,OAAO,CAACI,GAAG,CAACd,uBAAuB,CAAC,CAAA;KAC5C,CAAA,CAAA;AAAAd,IAAAA,wCAAA,uBAEc,YAAY;AACzB;AACA;AACA;AACA;;AAEA,MAAA,IAAI,CAACE,KAAK,CAACM,QAAQ,CAAEqB,GAAG,KAAM;AAC5B,QAAA,GAAGA,GAAG;AACN;AACAzC,QAAAA,WAAW,EAAE,KAAK;AAClB;AACAK,QAAAA,kBAAkB,EAAEoC,GAAG,CAACpC,kBAAkB,GAAG,CAAA;AAC/C,OAAC,CAAC,CAAC,CAAA;;AAEH;AACA,MAAA,IAAI,CAAC,IAAI,CAACa,KAAK,CAACvB,SAAS,EAAE,OAAA;AAE3B,MAAA,IAAI,CAACmB,KAAK,CAACM,QAAQ,CAAEsB,CAAC,KAAM;AAAE,QAAA,GAAGA,CAAC;AAAEzC,QAAAA,YAAY,EAAE,IAAA;AAAK,OAAC,CAAC,CAAC,CAAA;MAE1D,MAAM0C,IAAI,GAAGA,MAAM;AACjB,QAAA,IAAI,CAAC7B,KAAK,CAACM,QAAQ,CAAEc,IAAI,KAAM;AAAE,UAAA,GAAGA,IAAI;AAAEjC,UAAAA,YAAY,EAAE,KAAA;AAAM,SAAC,CAAC,CAAC,CAAA;OAClE,CAAA;;AAED;AACA,MAAA,MAAM,IAAI,CAAC2C,iBAAiB,CAAC,QAAQ,CAAC,CAAA;;AAEtC;AACA,MAAA,IAAI,CAAC,IAAI,CAAC1B,KAAK,CAACtB,aAAa,EAAE;QAAA,IAAAiD,qBAAA,EAAAC,aAAA,CAAA;AAC7BH,QAAAA,IAAI,EAAE,CAAA;QACN,CAAAE,qBAAA,IAAAC,aAAA,GAAA,IAAI,CAACjC,OAAO,EAACkC,eAAe,KAAA,IAAA,GAAA,KAAA,CAAA,GAA5BF,qBAAA,CAAAG,IAAA,CAAAF,aAAA,EAA+B,IAAI,CAAC5B,KAAK,CAACzB,MAAM,EAAE,IAAI,CAAC,CAAA;AACvD,QAAA,OAAA;AACF,OAAA;;AAEA;AACA;;AAEA,MAAA,IAAI,CAAC,IAAI,CAACyB,KAAK,CAACf,OAAO,EAAE;QAAA,IAAA8C,sBAAA,EAAAC,cAAA,CAAA;AACvBP,QAAAA,IAAI,EAAE,CAAA;QACN,CAAAM,sBAAA,IAAAC,cAAA,GAAA,IAAI,CAACrC,OAAO,EAACkC,eAAe,KAAA,IAAA,GAAA,KAAA,CAAA,GAA5BE,sBAAA,CAAAD,IAAA,CAAAE,cAAA,EAA+B,IAAI,CAAChC,KAAK,CAACzB,MAAM,EAAE,IAAI,CAAC,CAAA;AACvD,QAAA,OAAA;AACF,OAAA;MAEA,IAAI;QAAA,IAAA0D,sBAAA,EAAAC,cAAA,CAAA;AACF;QACA,OAAAD,CAAAA,sBAAA,GAAM,CAAAC,cAAA,OAAI,CAACvC,OAAO,EAACwC,QAAQ,KAArBF,IAAAA,GAAAA,KAAAA,CAAAA,GAAAA,sBAAA,CAAAH,IAAA,CAAAI,cAAA,EAAwB,IAAI,CAAClC,KAAK,CAACzB,MAAM,EAAE,IAAI,CAAC,CAAA,CAAA;AAEtD,QAAA,IAAI,CAACqB,KAAK,CAACC,KAAK,CAAC,MAAM;AACrB,UAAA,IAAI,CAACD,KAAK,CAACM,QAAQ,CAAEc,IAAI,KAAM;AAAE,YAAA,GAAGA,IAAI;AAAElC,YAAAA,WAAW,EAAE,IAAA;AAAK,WAAC,CAAC,CAAC,CAAA;AAC/D2C,UAAAA,IAAI,EAAE,CAAA;AACR,SAAC,CAAC,CAAA;OACH,CAAC,OAAOW,GAAG,EAAE;AACZX,QAAAA,IAAI,EAAE,CAAA;AACN,QAAA,MAAMW,GAAG,CAAA;AACX,OAAA;KACD,CAAA,CAAA;AAAA1C,IAAAA,wCAAA,CAGCiB,IAAAA,EAAAA,eAAAA,EAAAA,KAAa,IACoB0B,WAAK,CAAC,IAAI,CAACrC,KAAK,CAACzB,MAAM,EAAEoC,KAAK,CAAC,CAAA,CAAA;IAAAjB,wCAAA,CAAA,IAAA,EAAA,cAAA,EAGhEiB,KAAa,IACa;AAC1B,MAAA,OAAO,IAAI,CAACX,KAAK,CAACxB,SAAS,CAACmC,KAAK,CAAC,CAAA;KACnC,CAAA,CAAA;IAAAjB,wCAAA,CAAA,IAAA,EAAA,cAAA,EAEmDiB,KAAa,IAAK;AAAA,MAAA,IAAA2B,eAAA,CAAA;AACpE;AACA,MAAA,OAAQ,CAAAA,eAAA,GAAI,IAAA,CAAC7B,SAAS,EAACE,KAAK,CAAC,KAArB2B,eAAA,CAAe3B,KAAK,CAAC,GAAK;AAChCC,QAAAA,SAAS,EAAE,EAAC;OACb,CAAA,CAAA;KACF,CAAA,CAAA;AAAAlB,IAAAA,wCAAA,CAEc,IAAA,EAAA,cAAA,EAAA,CACbiB,KAAa,EACb4B,OAA2B,KACxB;AACH,MAAA,IAAI,CAAC3C,KAAK,CAACM,QAAQ,CAAEc,IAAI,IAAK;QAC5B,OAAO;AACL,UAAA,GAAGA,IAAI;AACPxC,UAAAA,SAAS,EAAE;YACT,GAAGwC,IAAI,CAACxC,SAAS;YACjB,CAACmC,KAAK,GAAG6B,sBAAgB,CAACD,OAAO,EAAEvB,IAAI,CAACxC,SAAS,CAACmC,KAAK,CAAC,CAAA;AAC1D,WAAA;SACD,CAAA;AACH,OAAC,CAAC,CAAA;KACH,CAAA,CAAA;AAAAjB,IAAAA,wCAAA,wBAEe,CACdiB,KAAa,EACb4B,OAA8C,EAC9ChD,IAA0B,KACvB;AACH,MAAA,MAAMkD,KAAK,GAAGlD,IAAI,IAAJA,IAAAA,GAAAA,KAAAA,CAAAA,GAAAA,IAAI,CAAEkD,KAAK,CAAA;AAEzB,MAAA,IAAI,CAAC7C,KAAK,CAACC,KAAK,CAAC,MAAM;AACrB,QAAA,IAAI4C,KAAK,EAAE;AACT,UAAA,IAAI,CAACC,YAAY,CAAC/B,KAAK,EAAGK,IAAI,KAAM;AAClC,YAAA,GAAGA,IAAI;AACPhC,YAAAA,SAAS,EAAE,IAAA;AACb,WAAC,CAAC,CAAC,CAAA;AACL,SAAA;AAEA,QAAA,IAAI,CAACY,KAAK,CAACM,QAAQ,CAAEc,IAAI,IAAK;UAC5B,OAAO;AACL,YAAA,GAAGA,IAAI;YACPzC,MAAM,EAAEoE,WAAK,CAAC3B,IAAI,CAACzC,MAAM,EAAEoC,KAAK,EAAE4B,OAAO,CAAA;WAC1C,CAAA;AACH,SAAC,CAAC,CAAA;AACJ,OAAC,CAAC,CAAA;KACH,CAAA,CAAA;AAAA7C,IAAAA,wCAAA,yBAEgB,CACfiB,KAAa,EACbiC,KAA2C,EAC3CrD,IAA0B,KACvB;MACH,OAAO,IAAI,CAACsD,aAAa,CACvBlC,KAAK,EACJK,IAAI,IAAK,CAAC,IAAI8B,KAAK,CAACC,OAAO,CAAC/B,IAAI,CAAC,GAAGA,IAAI,GAAG,EAAE,CAAC,EAAE4B,KAAK,CAAQ,EAC9DrD,IACF,CAAC,CAAA;KACF,CAAA,CAAA;IAAAG,wCAAA,CAAA,IAAA,EAAA,kBAAA,EAEkB,CACjBiB,KAAa,EACbqC,KAAa,EACbJ,KAA2C,EAC3CrD,IAA0B,KACvB;AACH,MAAA,IAAI,CAACsD,aAAa,CAChBlC,KAAK,EACJK,IAAI,IAAK;AACR,QAAA,OAAQA,IAAI,CAAoCiC,GAAG,CAAC,CAACzB,CAAC,EAAE0B,CAAC,KACvDA,CAAC,KAAKF,KAAK,GAAGJ,KAAK,GAAGpB,CACxB,CAAC,CAAA;OACF,EACDjC,IACF,CAAC,CAAA;KACF,CAAA,CAAA;AAAAG,IAAAA,wCAAA,2BAEkB,CACjBiB,KAAa,EACbqC,KAAa,EACbzD,IAA0B,KACvB;AACH,MAAA,IAAI,CAACsD,aAAa,CAChBlC,KAAK,EACJK,IAAI,IAAK;AACR,QAAA,OAAQA,IAAI,CAAoCmC,MAAM,CACpD,CAACC,EAAE,EAAEF,CAAC,KAAKA,CAAC,KAAKF,KACnB,CAAC,CAAA;OACF,EACDzD,IACF,CAAC,CAAA;KACF,CAAA,CAAA;AAAAG,IAAAA,wCAAA,0BAEiB,CAChBiB,KAAa,EACb0C,MAAc,EACdC,MAAc,KACX;AACH,MAAA,IAAI,CAACT,aAAa,CAAClC,KAAK,EAAGK,IAAS,IAAK;AACvC,QAAA,MAAMuC,KAAK,GAAGvC,IAAI,CAACqC,MAAM,CAAE,CAAA;AAC3B,QAAA,MAAMG,KAAK,GAAGxC,IAAI,CAACsC,MAAM,CAAE,CAAA;AAC3B,QAAA,OAAOX,WAAK,CAACA,WAAK,CAAC3B,IAAI,EAAKqC,EAAAA,GAAAA,MAAM,EAAIG,KAAK,CAAC,EAAA,EAAA,GAAKF,MAAM,EAAIC,KAAK,CAAC,CAAA;AACnE,OAAC,CAAC,CAAA;KACH,CAAA,CAAA;AA5RC,IAAA,IAAI,CAAC3D,KAAK,GAAG,IAAI6D,WAAK,CACpBlG,mBAAmB,CAAC;AAClB,MAAA,IAAGgC,KAAI,IAAA,IAAA,GAAA,KAAA,CAAA,GAAJA,KAAI,CAAE/B,YAAY,CAAA;MACrBe,MAAM,EAAA,CAAAiB,mBAAA,GAAED,KAAI,oBAAJA,KAAI,CAAEQ,aAAa,KAAAP,IAAAA,GAAAA,mBAAA,GAAID,KAAI,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,CAAAE,kBAAA,GAAJF,KAAI,CAAE/B,YAAY,KAAA,IAAA,GAAA,KAAA,CAAA,GAAlBiC,kBAAA,CAAoBlB,MAAM;AACzDK,MAAAA,WAAW,EAAE,IAAA;AACf,KAAC,CAAC,EACF;MACE8E,QAAQ,EAAEA,MAAM;QACd,IAAI;AAAE1D,UAAAA,KAAAA;SAAO,GAAG,IAAI,CAACJ,KAAK,CAAA;AAC1B;QACA,MAAM+D,eAAe,GAAGxD,MAAM,CAAC5B,MAAM,CAACyB,KAAK,CAACxB,SAAS,CAGlD,CAAA;AAEH,QAAA,MAAMG,kBAAkB,GAAGgF,eAAe,CAACC,IAAI,CAC5CjD,KAAK,IAAKA,KAAK,IAAA,IAAA,GAAA,KAAA,CAAA,GAALA,KAAK,CAAEzB,YACpB,CAAC,CAAA;AAED,QAAA,MAAMR,aAAa,GAAG,CAACiF,eAAe,CAACC,IAAI,CAAEjD,KAAK,IAAKA,KAAK,IAAA,IAAA,GAAA,KAAA,CAAA,GAALA,KAAK,CAAEkD,KAAK,CAAC,CAAA;AAEpE,QAAA,MAAM7E,SAAS,GAAG2E,eAAe,CAACC,IAAI,CAAEjD,KAAK,IAAKA,KAAK,IAAA,IAAA,GAAA,KAAA,CAAA,GAALA,KAAK,CAAE3B,SAAS,CAAC,CAAA;AAEnE,QAAA,MAAME,YAAY,GAAGP,kBAAkB,IAAIqB,KAAK,CAACnB,gBAAgB,CAAA;AACjE,QAAA,MAAMD,WAAW,GAAG,CAACoB,KAAK,CAAC8D,SAAS,CAAA;AACpC,QAAA,MAAM7E,OAAO,GAAGP,aAAa,IAAIE,WAAW,CAAA;AAC5C,QAAA,MAAMH,SAAS,GACZuB,KAAK,CAACb,kBAAkB,KAAK,CAAC,IAAI,CAACH,SAAS,IAC5C,CAACE,YAAY,IAAI,CAACc,KAAK,CAACjB,YAAY,IAAIE,OAAQ,CAAA;AAEnDe,QAAAA,KAAK,GAAG;AACN,UAAA,GAAGA,KAAK;UACRrB,kBAAkB;UAClBD,aAAa;UACbE,WAAW;UACXK,OAAO;UACPR,SAAS;AACTO,UAAAA,SAAAA;SACD,CAAA;AAED,QAAA,IAAI,CAACY,KAAK,CAACI,KAAK,GAAGA,KAAK,CAAA;QACxB,IAAI,CAACA,KAAK,GAAGA,KAAK,CAAA;AACpB,OAAA;AACF,KACF,CAAC,CAAA;AAED,IAAA,IAAI,CAACA,KAAK,GAAG,IAAI,CAACJ,KAAK,CAACI,KAAK,CAAA;AAE7B,IAAA,IAAI,CAAC+D,MAAM,CAACxE,KAAI,IAAI,EAAE,CAAC,CAAA;AACzB,GAAA;AA4OF;;;;"}
@@ -3,22 +3,22 @@ import { Store } from '@tanstack/store';
3
3
  import { getBy, functionalUpdate, setBy } from './utils.legacy.js';
4
4
 
5
5
  function getDefaultFormState(defaultState) {
6
+ var _defaultState$values, _defaultState$fieldMe, _defaultState$canSubm, _defaultState$isField, _defaultState$isField2, _defaultState$isFormV, _defaultState$isFormV2, _defaultState$isSubmi, _defaultState$isSubmi2, _defaultState$isTouch, _defaultState$isValid, _defaultState$isValid2, _defaultState$submiss, _defaultState$formVal;
6
7
  return {
7
- values: {},
8
- fieldMeta: {},
9
- canSubmit: true,
10
- isFieldsValid: false,
11
- isFieldsValidating: false,
12
- isFormValid: false,
13
- isFormValidating: false,
14
- isSubmitted: false,
15
- isSubmitting: false,
16
- isTouched: false,
17
- isValid: false,
18
- isValidating: false,
19
- submissionAttempts: 0,
20
- formValidationCount: 0,
21
- ...defaultState
8
+ values: (_defaultState$values = defaultState.values) != null ? _defaultState$values : {},
9
+ fieldMeta: (_defaultState$fieldMe = defaultState.fieldMeta) != null ? _defaultState$fieldMe : {},
10
+ canSubmit: (_defaultState$canSubm = defaultState.canSubmit) != null ? _defaultState$canSubm : true,
11
+ isFieldsValid: (_defaultState$isField = defaultState.isFieldsValid) != null ? _defaultState$isField : false,
12
+ isFieldsValidating: (_defaultState$isField2 = defaultState.isFieldsValidating) != null ? _defaultState$isField2 : false,
13
+ isFormValid: (_defaultState$isFormV = defaultState.isFormValid) != null ? _defaultState$isFormV : false,
14
+ isFormValidating: (_defaultState$isFormV2 = defaultState.isFormValidating) != null ? _defaultState$isFormV2 : false,
15
+ isSubmitted: (_defaultState$isSubmi = defaultState.isSubmitted) != null ? _defaultState$isSubmi : false,
16
+ isSubmitting: (_defaultState$isSubmi2 = defaultState.isSubmitting) != null ? _defaultState$isSubmi2 : false,
17
+ isTouched: (_defaultState$isTouch = defaultState.isTouched) != null ? _defaultState$isTouch : false,
18
+ isValid: (_defaultState$isValid = defaultState.isValid) != null ? _defaultState$isValid : false,
19
+ isValidating: (_defaultState$isValid2 = defaultState.isValidating) != null ? _defaultState$isValid2 : false,
20
+ submissionAttempts: (_defaultState$submiss = defaultState.submissionAttempts) != null ? _defaultState$submiss : 0,
21
+ formValidationCount: (_defaultState$formVal = defaultState.formValidationCount) != null ? _defaultState$formVal : 0
22
22
  };
23
23
  }
24
24
  class FormApi {
@@ -36,9 +36,9 @@ class FormApi {
36
36
  _defineProperty(this, "update", options => {
37
37
  if (!options) return;
38
38
  this.store.batch(() => {
39
- const shouldUpdateValues = options.defaultValues && options.defaultValues !== this.options.defaultValues;
40
- const shouldUpdateState = options.defaultState !== this.options.defaultState;
41
- this.store.setState(() => getDefaultFormState(Object.assign({},
39
+ const shouldUpdateValues = options.defaultValues && options.defaultValues !== this.options.defaultValues && !this.state.isTouched;
40
+ const shouldUpdateState = options.defaultState !== this.options.defaultState && !this.state.isTouched;
41
+ this.store.setState(() => getDefaultFormState(Object.assign({}, this.state,
42
42
  // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
43
43
  shouldUpdateState ? options.defaultState : {},
44
44
  // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
@@ -1 +1 @@
1
- {"version":3,"file":"FormApi.legacy.js","sources":["../../src/FormApi.ts"],"sourcesContent":["import { Store } from '@tanstack/store'\n//\nimport type { DeepKeys, DeepValue, Updater } from './utils'\nimport { functionalUpdate, getBy, setBy } from './utils'\nimport type { FieldApi, FieldMeta, ValidationCause } from './FieldApi'\n\nexport type FormOptions<TData> = {\n defaultValues?: TData\n defaultState?: Partial<FormState<TData>>\n asyncDebounceMs?: number\n onMount?: (values: TData, formApi: FormApi<TData>) => ValidationError\n onMountAsync?: (\n values: TData,\n formApi: FormApi<TData>,\n ) => ValidationError | Promise<ValidationError>\n onMountAsyncDebounceMs?: number\n onChange?: (values: TData, formApi: FormApi<TData>) => ValidationError\n onChangeAsync?: (\n values: TData,\n formApi: FormApi<TData>,\n ) => ValidationError | Promise<ValidationError>\n onChangeAsyncDebounceMs?: number\n onBlur?: (values: TData, formApi: FormApi<TData>) => ValidationError\n onBlurAsync?: (\n values: TData,\n formApi: FormApi<TData>,\n ) => ValidationError | Promise<ValidationError>\n onBlurAsyncDebounceMs?: number\n onSubmit?: (values: TData, formApi: FormApi<TData>) => any | Promise<any>\n onSubmitInvalid?: (values: TData, formApi: FormApi<TData>) => void\n}\n\nexport type FieldInfo<TFormData> = {\n instances: Record<string, FieldApi<any, TFormData>>\n} & ValidationMeta\n\nexport type ValidationMeta = {\n validationCount?: number\n validationAsyncCount?: 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\nfunction 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: true,\n }),\n {\n onUpdate: () => {\n let { state } = this.store\n // Computed state\n const fieldMetaValues = Object.values(state.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 || state.isFormValidating\n const isFormValid = !state.formError\n const isValid = isFieldsValid && isFormValid\n const canSubmit =\n (state.submissionAttempts === 0 && !isTouched) ||\n (!isValidating && !state.isSubmitting && isValid)\n\n state = {\n ...state,\n isFieldsValidating,\n isFieldsValid,\n isFormValid,\n isValid,\n canSubmit,\n isTouched,\n }\n\n this.store.state = state\n this.state = state\n },\n },\n )\n\n this.state = this.store.state\n\n this.update(opts || {})\n }\n\n update = (options?: FormOptions<TFormData>) => {\n if (!options) return\n\n this.store.batch(() => {\n const shouldUpdateValues =\n options.defaultValues &&\n options.defaultValues !== this.options.defaultValues\n\n const shouldUpdateState =\n options.defaultState !== this.options.defaultState\n\n this.store.setState(() =>\n getDefaultFormState(\n Object.assign(\n {},\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n shouldUpdateState ? options.defaultState : {},\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n shouldUpdateValues\n ? {\n values: options.defaultValues,\n }\n : {},\n ),\n ),\n )\n })\n\n this.options = options\n }\n\n reset = () =>\n this.store.setState(() =>\n getDefaultFormState({\n ...this.options.defaultState,\n values: this.options.defaultValues ?? this.options.defaultState?.values,\n }),\n )\n\n validateAllFields = async (cause: ValidationCause) => {\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 fieldValidationPromises.push(\n Promise.resolve().then(() => instance.validate(cause)),\n )\n }\n })\n },\n )\n })\n\n return Promise.all(fieldValidationPromises)\n }\n\n handleSubmit = async () => {\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 // Submission 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('submit')\n\n // Fields are invalid, do not submit\n if (!this.state.isFieldsValid) {\n done()\n this.options.onSubmitInvalid?.(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.onSubmitInvalid?.(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 | undefined => {\n return this.state.fieldMeta[field]\n }\n\n getFieldInfo = <TField extends DeepKeys<TFormData>>(field: TField) => {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\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\n\n this.store.batch(() => {\n if (touch) {\n this.setFieldMeta(field, (prev) => ({\n ...prev,\n isTouched: true,\n }))\n }\n\n this.store.setState((prev) => {\n return {\n ...prev,\n values: setBy(prev.values, field, updater),\n }\n })\n })\n }\n\n pushFieldValue = <TField extends DeepKeys<TFormData>>(\n field: TField,\n value: DeepValue<TFormData, TField>[number],\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>[number],\n opts?: { touch?: boolean },\n ) => {\n this.setFieldValue(\n field,\n (prev) => {\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 removeFieldValue = <TField extends DeepKeys<TFormData>>(\n field: TField,\n index: number,\n opts?: { touch?: boolean },\n ) => {\n this.setFieldValue(\n field,\n (prev) => {\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"],"names":["getDefaultFormState","defaultState","values","fieldMeta","canSubmit","isFieldsValid","isFieldsValidating","isFormValid","isFormValidating","isSubmitted","isSubmitting","isTouched","isValid","isValidating","submissionAttempts","formValidationCount","FormApi","constructor","opts","_opts$defaultValues","_opts$defaultState","_defineProperty","options","store","batch","shouldUpdateValues","defaultValues","shouldUpdateState","setState","Object","assign","_this$options$default","_this$options$default2","cause","fieldValidationPromises","fieldInfo","forEach","field","instances","instance","state","meta","setMeta","prev","push","Promise","resolve","then","validate","all","old","d","done","validateAllFields","_this$options$onSubmi","_this$options","onSubmitInvalid","call","_this$options$onSubmi2","_this$options2","_this$options$onSubmi3","_this$options3","onSubmit","err","getBy","_this$fieldInfo","updater","functionalUpdate","touch","setFieldMeta","setBy","value","setFieldValue","Array","isArray","index","map","i","filter","_d","index1","index2","prev1","prev2","Store","onUpdate","fieldMetaValues","some","error","formError","update"],"mappings":"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"}
1
+ {"version":3,"file":"FormApi.legacy.js","sources":["../../src/FormApi.ts"],"sourcesContent":["import { Store } from '@tanstack/store'\n//\nimport type { DeepKeys, DeepValue, Updater } from './utils'\nimport { functionalUpdate, getBy, setBy } from './utils'\nimport type { FieldApi, FieldMeta, ValidationCause } from './FieldApi'\n\nexport type FormOptions<TData> = {\n defaultValues?: TData\n defaultState?: Partial<FormState<TData>>\n asyncDebounceMs?: number\n onMount?: (values: TData, formApi: FormApi<TData>) => ValidationError\n onMountAsync?: (\n values: TData,\n formApi: FormApi<TData>,\n ) => ValidationError | Promise<ValidationError>\n onMountAsyncDebounceMs?: number\n onChange?: (values: TData, formApi: FormApi<TData>) => ValidationError\n onChangeAsync?: (\n values: TData,\n formApi: FormApi<TData>,\n ) => ValidationError | Promise<ValidationError>\n onChangeAsyncDebounceMs?: number\n onBlur?: (values: TData, formApi: FormApi<TData>) => ValidationError\n onBlurAsync?: (\n values: TData,\n formApi: FormApi<TData>,\n ) => ValidationError | Promise<ValidationError>\n onBlurAsyncDebounceMs?: number\n onSubmit?: (values: TData, formApi: FormApi<TData>) => any | Promise<any>\n onSubmitInvalid?: (values: TData, formApi: FormApi<TData>) => void\n}\n\nexport type FieldInfo<TFormData> = {\n instances: Record<string, FieldApi<any, TFormData>>\n} & ValidationMeta\n\nexport type ValidationMeta = {\n validationCount?: number\n validationAsyncCount?: 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\nfunction getDefaultFormState<TData>(\n defaultState: Partial<FormState<TData>>,\n): FormState<TData> {\n return {\n values: defaultState.values ?? ({} as never),\n fieldMeta: defaultState.fieldMeta ?? ({} as never),\n canSubmit: defaultState.canSubmit ?? true,\n isFieldsValid: defaultState.isFieldsValid ?? false,\n isFieldsValidating: defaultState.isFieldsValidating ?? false,\n isFormValid: defaultState.isFormValid ?? false,\n isFormValidating: defaultState.isFormValidating ?? false,\n isSubmitted: defaultState.isSubmitted ?? false,\n isSubmitting: defaultState.isSubmitting ?? false,\n isTouched: defaultState.isTouched ?? false,\n isValid: defaultState.isValid ?? false,\n isValidating: defaultState.isValidating ?? false,\n submissionAttempts: defaultState.submissionAttempts ?? 0,\n formValidationCount: defaultState.formValidationCount ?? 0,\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: true,\n }),\n {\n onUpdate: () => {\n let { state } = this.store\n // Computed state\n const fieldMetaValues = Object.values(state.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 || state.isFormValidating\n const isFormValid = !state.formError\n const isValid = isFieldsValid && isFormValid\n const canSubmit =\n (state.submissionAttempts === 0 && !isTouched) ||\n (!isValidating && !state.isSubmitting && isValid)\n\n state = {\n ...state,\n isFieldsValidating,\n isFieldsValid,\n isFormValid,\n isValid,\n canSubmit,\n isTouched,\n }\n\n this.store.state = state\n this.state = state\n },\n },\n )\n\n this.state = this.store.state\n\n this.update(opts || {})\n }\n\n update = (options?: FormOptions<TFormData>) => {\n if (!options) return\n\n this.store.batch(() => {\n const shouldUpdateValues =\n options.defaultValues &&\n options.defaultValues !== this.options.defaultValues &&\n !this.state.isTouched\n\n const shouldUpdateState =\n options.defaultState !== this.options.defaultState &&\n !this.state.isTouched\n\n this.store.setState(() =>\n getDefaultFormState(\n Object.assign(\n {},\n this.state,\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n shouldUpdateState ? options.defaultState : {},\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n shouldUpdateValues\n ? {\n values: options.defaultValues,\n }\n : {},\n ),\n ),\n )\n })\n\n this.options = options\n }\n\n reset = () =>\n this.store.setState(() =>\n getDefaultFormState({\n ...this.options.defaultState,\n values: this.options.defaultValues ?? this.options.defaultState?.values,\n }),\n )\n\n validateAllFields = async (cause: ValidationCause) => {\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 fieldValidationPromises.push(\n Promise.resolve().then(() => instance.validate(cause)),\n )\n }\n })\n },\n )\n })\n\n return Promise.all(fieldValidationPromises)\n }\n\n handleSubmit = async () => {\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 // Submission 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('submit')\n\n // Fields are invalid, do not submit\n if (!this.state.isFieldsValid) {\n done()\n this.options.onSubmitInvalid?.(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.onSubmitInvalid?.(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 | undefined => {\n return this.state.fieldMeta[field]\n }\n\n getFieldInfo = <TField extends DeepKeys<TFormData>>(field: TField) => {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\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\n\n this.store.batch(() => {\n if (touch) {\n this.setFieldMeta(field, (prev) => ({\n ...prev,\n isTouched: true,\n }))\n }\n\n this.store.setState((prev) => {\n return {\n ...prev,\n values: setBy(prev.values, field, updater),\n }\n })\n })\n }\n\n pushFieldValue = <TField extends DeepKeys<TFormData>>(\n field: TField,\n value: DeepValue<TFormData, TField>[number],\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>[number],\n opts?: { touch?: boolean },\n ) => {\n this.setFieldValue(\n field,\n (prev) => {\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 removeFieldValue = <TField extends DeepKeys<TFormData>>(\n field: TField,\n index: number,\n opts?: { touch?: boolean },\n ) => {\n this.setFieldValue(\n field,\n (prev) => {\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"],"names":["getDefaultFormState","defaultState","_defaultState$values","_defaultState$fieldMe","_defaultState$canSubm","_defaultState$isField","_defaultState$isField2","_defaultState$isFormV","_defaultState$isFormV2","_defaultState$isSubmi","_defaultState$isSubmi2","_defaultState$isTouch","_defaultState$isValid","_defaultState$isValid2","_defaultState$submiss","_defaultState$formVal","values","fieldMeta","canSubmit","isFieldsValid","isFieldsValidating","isFormValid","isFormValidating","isSubmitted","isSubmitting","isTouched","isValid","isValidating","submissionAttempts","formValidationCount","FormApi","constructor","opts","_opts$defaultValues","_opts$defaultState","_defineProperty","options","store","batch","shouldUpdateValues","defaultValues","state","shouldUpdateState","setState","Object","assign","_this$options$default","_this$options$default2","cause","fieldValidationPromises","fieldInfo","forEach","field","instances","instance","meta","setMeta","prev","push","Promise","resolve","then","validate","all","old","d","done","validateAllFields","_this$options$onSubmi","_this$options","onSubmitInvalid","call","_this$options$onSubmi2","_this$options2","_this$options$onSubmi3","_this$options3","onSubmit","err","getBy","_this$fieldInfo","updater","functionalUpdate","touch","setFieldMeta","setBy","value","setFieldValue","Array","isArray","index","map","i","filter","_d","index1","index2","prev1","prev2","Store","onUpdate","fieldMetaValues","some","error","formError","update"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function sleep(timeout: number): Promise<void>;
2
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/tests/utils.ts"],"names":[],"mappings":"AAAA,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIpD"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tanstack/form-core",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "Powerful, type-safe, framework agnostic forms.",
5
5
  "author": "tannerlinsley",
6
6
  "license": "MIT",
package/src/FieldApi.ts CHANGED
@@ -165,8 +165,6 @@ export class FieldApi<TData, TFormData> {
165
165
  update = (opts: FieldApiOptions<typeof this._tdata, TFormData>) => {
166
166
  this.options = {
167
167
  asyncDebounceMs: this.form.options.asyncDebounceMs ?? 0,
168
- onChangeAsyncDebounceMs: this.form.options.onChangeAsyncDebounceMs ?? 0,
169
- onBlurAsyncDebounceMs: this.form.options.onBlurAsyncDebounceMs ?? 0,
170
168
  ...opts,
171
169
  } as never
172
170
 
@@ -312,7 +310,7 @@ export class FieldApi<TData, TFormData> {
312
310
  ? onChangeAsyncDebounceMs
313
311
  : onBlurAsyncDebounceMs) ??
314
312
  asyncDebounceMs ??
315
- 500
313
+ 0
316
314
 
317
315
  if (this.state.meta.isValidating !== true)
318
316
  this.setMeta((prev) => ({ ...prev, isValidating: true }))
package/src/FormApi.ts CHANGED
@@ -69,21 +69,20 @@ function getDefaultFormState<TData>(
69
69
  defaultState: Partial<FormState<TData>>,
70
70
  ): FormState<TData> {
71
71
  return {
72
- values: {} as any,
73
- fieldMeta: {} as any,
74
- canSubmit: true,
75
- isFieldsValid: false,
76
- isFieldsValidating: false,
77
- isFormValid: false,
78
- isFormValidating: false,
79
- isSubmitted: false,
80
- isSubmitting: false,
81
- isTouched: false,
82
- isValid: false,
83
- isValidating: false,
84
- submissionAttempts: 0,
85
- formValidationCount: 0,
86
- ...defaultState,
72
+ values: defaultState.values ?? ({} as never),
73
+ fieldMeta: defaultState.fieldMeta ?? ({} as never),
74
+ canSubmit: defaultState.canSubmit ?? true,
75
+ isFieldsValid: defaultState.isFieldsValid ?? false,
76
+ isFieldsValidating: defaultState.isFieldsValidating ?? false,
77
+ isFormValid: defaultState.isFormValid ?? false,
78
+ isFormValidating: defaultState.isFormValidating ?? false,
79
+ isSubmitted: defaultState.isSubmitted ?? false,
80
+ isSubmitting: defaultState.isSubmitting ?? false,
81
+ isTouched: defaultState.isTouched ?? false,
82
+ isValid: defaultState.isValid ?? false,
83
+ isValidating: defaultState.isValidating ?? false,
84
+ submissionAttempts: defaultState.submissionAttempts ?? 0,
85
+ formValidationCount: defaultState.formValidationCount ?? 0,
87
86
  }
88
87
  }
89
88
 
@@ -156,15 +155,18 @@ export class FormApi<TFormData> {
156
155
  this.store.batch(() => {
157
156
  const shouldUpdateValues =
158
157
  options.defaultValues &&
159
- options.defaultValues !== this.options.defaultValues
158
+ options.defaultValues !== this.options.defaultValues &&
159
+ !this.state.isTouched
160
160
 
161
161
  const shouldUpdateState =
162
- options.defaultState !== this.options.defaultState
162
+ options.defaultState !== this.options.defaultState &&
163
+ !this.state.isTouched
163
164
 
164
165
  this.store.setState(() =>
165
166
  getDefaultFormState(
166
167
  Object.assign(
167
168
  {},
169
+ this.state,
168
170
  // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
169
171
  shouldUpdateState ? options.defaultState : {},
170
172
  // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition