@lobehub/ui
Version:
Lobe UI is an open-source UI component library for building AIGC web apps
1 lines • 5.76 kB
Source Map (JSON)
{"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"}