{"version":3,"file":"AutoForm.mjs","names":[],"sources":["../../src/tanstack-form/AutoForm.tsx"],"sourcesContent":["import React, { useMemo } from \"react\";\nimport { formOptions, revalidateLogic } from \"@tanstack/react-form\";\nimport {\n  getDefaultValues,\n  parseSchema,\n  replaceEmptyValue,\n} from \"@autoform/core\";\nimport type { AutoFormProps } from \"../types\";\nimport { AutoFormProvider } from \"../context\";\nimport { AutoFormField } from \"./AutoFormField\";\nimport { focusFirstInvalidInput, preventPropagation } from \"../utils\";\nimport { createSchemaValidator, getAppForm } from \"./utils\";\nimport {\n  useAppForm,\n  useExternalFormOptions,\n  useSyncValues,\n} from \"./hooks\";\n\nexport function AutoForm<T extends Record<string, any> = Record<string, any>>({\n  formControl,\n  schema,\n  onSubmit = () => {},\n  values,\n  defaultValues,\n  children,\n  uiComponents,\n  formComponents,\n  withSubmit = false,\n  formProps = {},\n}: AutoFormProps<T>) {\n  const parsedSchema = useMemo(() => parseSchema(schema), [schema]);\n  const {\n    ref: _ref,\n    removeEmptyValue = true,\n    ...restFormProps\n  } = formProps as React.ComponentProps<\"form\"> & {\n    removeEmptyValue?: boolean;\n  };\n\n  const options = useMemo(() => {\n    return formOptions({\n      validators: {\n        onDynamic: createSchemaValidator<T>(schema, removeEmptyValue),\n      },\n      validationLogic: revalidateLogic(),\n      onSubmitInvalid: focusFirstInvalidInput,\n      defaultValues: {\n        ...(getDefaultValues(schema) as Partial<T>),\n        ...defaultValues,\n      } as T,\n      onSubmit: async ({ value, formApi }: { value: T; formApi: any }) => {\n        const validation = schema.validateSchema(\n          removeEmptyValue ? replaceEmptyValue(value) : value,\n        );\n        if (validation.success) {\n          await onSubmit(validation.data, formApi);\n        }\n      },\n    });\n  }, [defaultValues, onSubmit, removeEmptyValue, schema]);\n\n  const internalForm = useAppForm(options);\n  const form = (formControl ?? internalForm) as typeof internalForm;\n\n  useSyncValues(form, values);\n  useExternalFormOptions(formControl, options);\n\n  const AppForm = getAppForm(form);\n\n  return (\n    <AppForm>\n      <AutoFormProvider\n        value={{\n          schema: parsedSchema,\n          uiComponents,\n          formComponents,\n        }}\n      >\n        <uiComponents.Form\n          onSubmit={preventPropagation(() => {\n            void form.handleSubmit();\n          })}\n          ref={_ref}\n          {...restFormProps}\n        >\n          {parsedSchema.fields.map((field) => (\n            <AutoFormField\n              key={field.key}\n              parsedField={field}\n              path={[field.key]}\n            />\n          ))}\n          {withSubmit && (\n            <uiComponents.SubmitButton>Submit</uiComponents.SubmitButton>\n          )}\n          {children}\n        </uiComponents.Form>\n      </AutoFormProvider>\n    </AppForm>\n  );\n}\n"],"mappings":";;;;;;;;;;AAkBA,SAAgB,SAA8D,EAC5E,aACA,QACA,iBAAiB,CAAC,GAClB,QACA,eACA,UACA,cACA,gBACA,aAAa,OACb,YAAY,CAAC,KACM;CACnB,MAAM,eAAe,cAAc,YAAY,MAAM,GAAG,CAAC,MAAM,CAAC;CAChE,MAAM,EACJ,KAAK,MACL,mBAAmB,MACnB,GAAG,kBACD;CAIJ,MAAM,UAAU,cAAc;EAC5B,OAAO,YAAY;GACjB,YAAY,EACV,WAAW,sBAAyB,QAAQ,gBAAgB,EAC9D;GACA,iBAAiB,gBAAgB;GACjC,iBAAiB;GACjB,eAAe;IACb,GAAI,iBAAiB,MAAM;IAC3B,GAAG;GACL;GACA,UAAU,OAAO,EAAE,OAAO,cAA0C;IAClE,MAAM,aAAa,OAAO,eACxB,mBAAmB,kBAAkB,KAAK,IAAI,KAChD;IACA,IAAI,WAAW,SACb,MAAM,SAAS,WAAW,MAAM,OAAO;GAE3C;EACF,CAAC;CACH,GAAG;EAAC;EAAe;EAAU;EAAkB;CAAM,CAAC;CAEtD,MAAM,eAAe,WAAW,OAAO;CACvC,MAAM,OAAQ,eAAe;CAE7B,cAAc,MAAM,MAAM;CAC1B,uBAAuB,aAAa,OAAO;CAI3C,OACE,oBAHc,WAAW,IAGlB,GAAP,EAAA,UACE,oBAAC,kBAAD;EACE,OAAO;GACL,QAAQ;GACR;GACA;EACF;YAEA,qBAAC,aAAa,MAAd;GACE,UAAU,yBAAyB;IACjC,KAAU,aAAa;GACzB,CAAC;GACD,KAAK;GACL,GAAI;aALN;IAOG,aAAa,OAAO,KAAK,UACxB,oBAAC,eAAD;KAEE,aAAa;KACb,MAAM,CAAC,MAAM,GAAG;IACjB,GAHM,MAAM,GAGZ,CACF;IACA,cACC,oBAAC,aAAa,cAAd,EAAA,UAA2B,SAAiC,CAAA;IAE7D;GACgB;;CACH,CAAA,EACX,CAAA;AAEb"}