{"version":3,"file":"instance.mjs","names":[],"sources":["../../../src/base-ui/FormKit/instance.ts"],"sourcesContent":["import { createTanstackEngine } from './engine/tanstack';\nimport type { FormEngine, ValidateOn } from './engine/types';\nimport { schemaToFormValidator } from './schema';\nimport type { FormInstance, FormValues } from './type';\n\ninterface InstanceInternals {\n  engine: FormEngine;\n  onSubmit?: (values: FormValues) => unknown;\n  validateOn: ValidateOn;\n}\n\nconst internals = new WeakMap<object, InstanceInternals>();\n\nexport const getInternals = (form: object): InstanceInternals => {\n  const found = internals.get(form);\n  if (!found) throw new Error('[@lobehub/ui/base-ui/form] form was not created by useForm');\n  return found;\n};\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> => {\n  if (typeof value !== 'object' || value === null) return false;\n  const proto = Object.getPrototypeOf(value);\n  return proto === Object.prototype || proto === null;\n};\n\nexport const leafPaths = (value: unknown, prefix = ''): string[] => {\n  if (!isPlainObject(value) || (prefix && Object.keys(value).length === 0))\n    return prefix ? [prefix] : [];\n  return Object.entries(value).flatMap(([key, child]) =>\n    leafPaths(child, prefix ? `${prefix}.${key}` : key),\n  );\n};\n\nexport const getIn = (value: unknown, path: string): unknown =>\n  path\n    .split('.')\n    .reduce<unknown>((acc, key) => (acc == null ? undefined : (acc as any)[key]), value);\n\nexport const setIn = (target: Record<string, unknown>, path: string, value: unknown) => {\n  const keys = path.split('.');\n  let cursor: Record<string, unknown> = target;\n  keys.slice(0, -1).forEach((key) => {\n    if (!isPlainObject(cursor[key])) cursor[key] = {};\n    cursor = cursor[key] as Record<string, unknown>;\n  });\n  cursor[keys.at(-1)!] = value;\n};\n\ninterface CreateOptions {\n  initialValues: FormValues;\n  schema?: Parameters<typeof schemaToFormValidator>[0];\n  validateOn: ValidateOn;\n}\n\nexport const createFormInstance = <T extends FormValues>({\n  initialValues,\n  schema,\n  validateOn,\n}: CreateOptions): FormInstance<T> => {\n  const engine = createTanstackEngine(initialValues);\n  if (schema) engine.setFormValidator(schemaToFormValidator(schema));\n  const source = (options?: { asUser?: boolean }) => (options?.asUser ? 'user' : 'api');\n\n  const form: FormInstance<T> = {\n    getValue: ((name: string) => engine.getValue(name)) as FormInstance<T>['getValue'],\n    getValues: () => engine.getValues() as T,\n    isDirty: () => engine.getStatus().dirty,\n    isTouched: (name) => engine.isTouched(name),\n    reset: (values) => engine.reset(values),\n    resetField: (name) => engine.resetField(name),\n    setErrors: (errors) => engine.setErrors(errors as Record<string, string | undefined>),\n    setSchema: (next) => engine.setFormValidator(next ? schemaToFormValidator(next) : undefined),\n    setValue: ((name: string, value: unknown, options?: { asUser?: boolean }) =>\n      engine.setValue(name, value, source(options))) as FormInstance<T>['setValue'],\n    setValues: (values, options) => {\n      for (const path of leafPaths(values))\n        engine.setValue(path, getIn(values, path), source(options));\n    },\n    submit: () =>\n      engine.submit((values) => internals.get(form)?.onSubmit?.(values)) as ReturnType<\n        FormInstance<T>['submit']\n      >,\n    subscribe: (selector, callback) => {\n      let selected = selector(engine.getValues() as T);\n      return engine.subscribe(() => {\n        const next = selector(engine.getValues() as T);\n        if (Object.is(next, selected)) return;\n        selected = next;\n        callback(next);\n      });\n    },\n    validate: (names) => engine.validate(names) as ReturnType<FormInstance<T>['validate']>,\n  };\n\n  internals.set(form, { engine, validateOn });\n  return form;\n};\n"],"mappings":";;;AAWA,MAAM,4BAAY,IAAI,QAAmC;AAEzD,MAAa,gBAAgB,SAAoC;CAC/D,MAAM,QAAQ,UAAU,IAAI,IAAI;CAChC,IAAI,CAAC,OAAO,MAAM,IAAI,MAAM,4DAA4D;CACxF,OAAO;AACT;AAEA,MAAM,iBAAiB,UAAqD;CAC1E,IAAI,OAAO,UAAU,YAAY,UAAU,MAAM,OAAO;CACxD,MAAM,QAAQ,OAAO,eAAe,KAAK;CACzC,OAAO,UAAU,OAAO,aAAa,UAAU;AACjD;AAEA,MAAa,aAAa,OAAgB,SAAS,OAAiB;CAClE,IAAI,CAAC,cAAc,KAAK,KAAM,UAAU,OAAO,KAAK,KAAK,CAAC,CAAC,WAAW,GACpE,OAAO,SAAS,CAAC,MAAM,IAAI,CAAC;CAC9B,OAAO,OAAO,QAAQ,KAAK,CAAC,CAAC,SAAS,CAAC,KAAK,WAC1C,UAAU,OAAO,SAAS,GAAG,OAAO,GAAG,QAAQ,GAAG,CACpD;AACF;AAEA,MAAa,SAAS,OAAgB,SACpC,KACG,MAAM,GAAG,CAAC,CACV,QAAiB,KAAK,QAAS,OAAO,OAAO,KAAA,IAAa,IAAY,MAAO,KAAK;AAEvF,MAAa,SAAS,QAAiC,MAAc,UAAmB;CACtF,MAAM,OAAO,KAAK,MAAM,GAAG;CAC3B,IAAI,SAAkC;CACtC,KAAK,MAAM,GAAG,EAAE,CAAC,CAAC,SAAS,QAAQ;EACjC,IAAI,CAAC,cAAc,OAAO,IAAI,GAAG,OAAO,OAAO,CAAC;EAChD,SAAS,OAAO;CAClB,CAAC;CACD,OAAO,KAAK,GAAG,EAAE,KAAM;AACzB;AAQA,MAAa,sBAA4C,EACvD,eACA,QACA,iBACoC;CACpC,MAAM,SAAS,qBAAqB,aAAa;CACjD,IAAI,QAAQ,OAAO,iBAAiB,sBAAsB,MAAM,CAAC;CACjE,MAAM,UAAU,YAAoC,SAAS,SAAS,SAAS;CAE/E,MAAM,OAAwB;EAC5B,YAAY,SAAiB,OAAO,SAAS,IAAI;EACjD,iBAAiB,OAAO,UAAU;EAClC,eAAe,OAAO,UAAU,CAAC,CAAC;EAClC,YAAY,SAAS,OAAO,UAAU,IAAI;EAC1C,QAAQ,WAAW,OAAO,MAAM,MAAM;EACtC,aAAa,SAAS,OAAO,WAAW,IAAI;EAC5C,YAAY,WAAW,OAAO,UAAU,MAA4C;EACpF,YAAY,SAAS,OAAO,iBAAiB,OAAO,sBAAsB,IAAI,IAAI,KAAA,CAAS;EAC3F,YAAY,MAAc,OAAgB,YACxC,OAAO,SAAS,MAAM,OAAO,OAAO,OAAO,CAAC;EAC9C,YAAY,QAAQ,YAAY;GAC9B,KAAK,MAAM,QAAQ,UAAU,MAAM,GACjC,OAAO,SAAS,MAAM,MAAM,QAAQ,IAAI,GAAG,OAAO,OAAO,CAAC;EAC9D;EACA,cACE,OAAO,QAAQ,WAAW,UAAU,IAAI,IAAI,CAAC,EAAE,WAAW,MAAM,CAAC;EAGnE,YAAY,UAAU,aAAa;GACjC,IAAI,WAAW,SAAS,OAAO,UAAU,CAAM;GAC/C,OAAO,OAAO,gBAAgB;IAC5B,MAAM,OAAO,SAAS,OAAO,UAAU,CAAM;IAC7C,IAAI,OAAO,GAAG,MAAM,QAAQ,GAAG;IAC/B,WAAW;IACX,SAAS,IAAI;GACf,CAAC;EACH;EACA,WAAW,UAAU,OAAO,SAAS,KAAK;CAC5C;CAEA,UAAU,IAAI,MAAM;EAAE;EAAQ;CAAW,CAAC;CAC1C,OAAO;AACT"}