@duke333/builder-ui 0.1.0

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,"sources":["../src/admin/BuilderEditorPage.tsx","../src/admin/editorState.ts","../src/admin/BuilderEntityManager.tsx","../src/admin/BuilderViewDialog.tsx","../src/api/createBuilderApiClient.ts","../src/components/DynamicForm.tsx","../src/runtime/runtimeUtils.ts","../src/components/DynamicList.tsx","../src/components/DynamicView.tsx","../src/components/RuntimeEntryDialog.tsx","../src/components/RuntimeSubformField.tsx","../src/hooks/createBuilderHooks.ts","../src/index.ts"],"sourcesContent":["\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport { useEffect } from \"react\";\nimport {\n FormProvider,\n type Resolver,\n type UseFieldArrayReturn,\n type UseFormReturn,\n useFieldArray,\n useForm,\n useWatch,\n} from \"react-hook-form\";\nimport {\n type BuilderEditorDbTable,\n type BuilderEditorTriggerValues,\n type BuilderFormEditorEntity,\n type BuilderFormEditorFieldValues,\n type BuilderFormEditorSubformValues,\n type BuilderFormEditorValues,\n type BuilderListEditorColumnValues,\n type BuilderListEditorEntity,\n type BuilderListEditorValues,\n builderFormEditorDefaultLayoutGroups,\n builderFormEditorFieldsFromTable,\n builderFormEditorValuesFromEntity,\n builderListEditorColumnsFromTable,\n builderListEditorValuesFromEntity,\n} from \"./editorState\";\n\ntype BuilderEditorEntity = {\n id: string;\n};\n\ntype BuilderEditorQuery<TEntity> = {\n data?: TEntity;\n isPending: boolean;\n isError: boolean;\n};\n\ntype BuilderEditorListQuery<TItem> = {\n data?: TItem[];\n};\n\ntype BuilderEditorSaveMutation<TInput, TEntity> = {\n mutateAsync(args: { id?: string; input: TInput }): Promise<TEntity>;\n isPending: boolean;\n};\n\ntype BuilderEditorNotifications = {\n success(message: string): void;\n error(error: unknown): void;\n};\n\ntype BuilderEditorLabels = {\n created: string;\n saved: string;\n};\n\ntype BuilderEditorStateLabels = {\n loading: string;\n error: string;\n};\n\nexport type BuilderFormEditorBodyProps<TFieldType extends string, TTriggerEvent extends string> = {\n formId?: string;\n form: UseFormReturn<BuilderFormEditorValues<TFieldType, TTriggerEvent>>;\n fieldArray: UseFieldArrayReturn<BuilderFormEditorValues<TFieldType, TTriggerEvent>, \"fields\">;\n subformArray: UseFieldArrayReturn<BuilderFormEditorValues<TFieldType, TTriggerEvent>, \"subforms\">;\n triggerArray: UseFieldArrayReturn<BuilderFormEditorValues<TFieldType, TTriggerEvent>, \"triggers\">;\n fields: BuilderFormEditorFieldValues<TFieldType>[];\n subforms: BuilderFormEditorSubformValues[];\n sourceType: BuilderFormEditorValues<TFieldType, TTriggerEvent>[\"sourceType\"];\n sourceTable: string;\n tables: BuilderEditorDbTable<TFieldType>[];\n emptyField: BuilderFormEditorFieldValues<TFieldType>;\n emptyTrigger: BuilderEditorTriggerValues<TTriggerEvent>;\n isSaving: boolean;\n importFieldsFromTable(): void;\n};\n\nexport type BuilderListEditorBodyProps<TTriggerEvent extends string> = {\n listId?: string;\n form: UseFormReturn<BuilderListEditorValues<TTriggerEvent>>;\n columnArray: UseFieldArrayReturn<BuilderListEditorValues<TTriggerEvent>, \"columns\">;\n triggerArray: UseFieldArrayReturn<BuilderListEditorValues<TTriggerEvent>, \"triggers\">;\n sourceType: BuilderListEditorValues<TTriggerEvent>[\"sourceType\"];\n sourceTable: string;\n tables: BuilderEditorDbTable[];\n emptyColumn: BuilderListEditorColumnValues;\n emptyTrigger: BuilderEditorTriggerValues<TTriggerEvent>;\n isSaving: boolean;\n importColumnsFromTable(): void;\n};\n\nexport type BuilderFormEditorPageDependencies<\n TEntity extends BuilderEditorEntity & BuilderFormEditorEntity<TFieldType, TTriggerEvent>,\n TInput,\n TFieldType extends string,\n TTriggerEvent extends string,\n> = {\n emptyValues: BuilderFormEditorValues<TFieldType, TTriggerEvent>;\n emptyField: BuilderFormEditorFieldValues<TFieldType>;\n emptyTrigger: BuilderEditorTriggerValues<TTriggerEvent>;\n resolver?: Resolver<BuilderFormEditorValues<TFieldType, TTriggerEvent>>;\n labels: BuilderEditorLabels;\n states: BuilderEditorStateLabels;\n hooks: {\n useEntity(id?: string): BuilderEditorQuery<TEntity>;\n useTables(): BuilderEditorListQuery<BuilderEditorDbTable<TFieldType>>;\n useSave(): BuilderEditorSaveMutation<TInput, TEntity>;\n };\n buildInput(values: BuilderFormEditorValues<TFieldType, TTriggerEvent>): TInput;\n navigateAfterCreate(entity: TEntity): void;\n notifications: BuilderEditorNotifications;\n Body(props: BuilderFormEditorBodyProps<TFieldType, TTriggerEvent>): ReactNode;\n};\n\nexport type BuilderListEditorPageDependencies<\n TEntity extends BuilderEditorEntity & BuilderListEditorEntity<TTriggerEvent>,\n TInput,\n TTriggerEvent extends string,\n> = {\n emptyValues: BuilderListEditorValues<TTriggerEvent>;\n emptyColumn: BuilderListEditorColumnValues;\n emptyTrigger: BuilderEditorTriggerValues<TTriggerEvent>;\n resolver?: Resolver<BuilderListEditorValues<TTriggerEvent>>;\n labels: BuilderEditorLabels;\n states: BuilderEditorStateLabels;\n hooks: {\n useEntity(id?: string): BuilderEditorQuery<TEntity>;\n useTables(): BuilderEditorListQuery<BuilderEditorDbTable>;\n useSave(): BuilderEditorSaveMutation<TInput, TEntity>;\n };\n buildInput(values: BuilderListEditorValues<TTriggerEvent>): TInput;\n navigateAfterCreate(entity: TEntity): void;\n notifications: BuilderEditorNotifications;\n Body(props: BuilderListEditorBodyProps<TTriggerEvent>): ReactNode;\n};\n\nexport function createBuilderFormEditorPageComponent<\n TEntity extends BuilderEditorEntity & BuilderFormEditorEntity<TFieldType, TTriggerEvent>,\n TInput,\n TFieldType extends string,\n TTriggerEvent extends string,\n>(deps: BuilderFormEditorPageDependencies<TEntity, TInput, TFieldType, TTriggerEvent>) {\n return function BuilderFormEditorPage({ formId }: { formId?: string }) {\n const Body = deps.Body;\n const entityQuery = deps.hooks.useEntity(formId);\n const tables = deps.hooks.useTables();\n const save = deps.hooks.useSave();\n const form = useForm<BuilderFormEditorValues<TFieldType, TTriggerEvent>>({\n resolver: deps.resolver,\n defaultValues: deps.emptyValues,\n });\n const fieldArray = useFieldArray({ control: form.control, name: \"fields\" });\n const subformArray = useFieldArray({ control: form.control, name: \"subforms\" });\n const triggerArray = useFieldArray({ control: form.control, name: \"triggers\" });\n const fields = useWatch({ control: form.control, name: \"fields\" }) ?? [];\n const subforms = useWatch({ control: form.control, name: \"subforms\" }) ?? [];\n const sourceType = useWatch({ control: form.control, name: \"sourceType\" });\n const sourceTable = useWatch({ control: form.control, name: \"sourceTable\" });\n\n useEffect(() => {\n if (formId && !entityQuery.data) return;\n form.reset(builderFormEditorValuesFromEntity(entityQuery.data ?? null, deps.emptyValues));\n }, [entityQuery.data, form, formId]);\n\n const importFieldsFromTable = () => {\n const table = tables.data?.find((item) => item.name === sourceTable);\n if (!table) return;\n const nextFields = builderFormEditorFieldsFromTable(table);\n fieldArray.replace(nextFields);\n form.setValue(\"layoutGroups\", builderFormEditorDefaultLayoutGroups(nextFields), {\n shouldDirty: true,\n });\n };\n\n const onSubmit = form.handleSubmit(async (values) => {\n try {\n const saved = await save.mutateAsync({ id: formId, input: deps.buildInput(values) });\n deps.notifications.success(formId ? deps.labels.saved : deps.labels.created);\n if (!formId) deps.navigateAfterCreate(saved);\n } catch (error) {\n deps.notifications.error(error);\n }\n });\n\n if (formId && entityQuery.isPending) {\n return <div className=\"text-muted-foreground text-sm\">{deps.states.loading}</div>;\n }\n\n if (formId && entityQuery.isError) {\n return <div className=\"text-destructive text-sm\">{deps.states.error}</div>;\n }\n\n return (\n <FormProvider {...form}>\n <form onSubmit={onSubmit} noValidate className=\"space-y-6\">\n <Body\n formId={formId}\n form={form}\n fieldArray={fieldArray}\n subformArray={subformArray}\n triggerArray={triggerArray}\n fields={fields}\n subforms={subforms}\n sourceType={sourceType}\n sourceTable={sourceTable}\n tables={tables.data ?? []}\n emptyField={deps.emptyField}\n emptyTrigger={deps.emptyTrigger}\n isSaving={save.isPending}\n importFieldsFromTable={importFieldsFromTable}\n />\n </form>\n </FormProvider>\n );\n };\n}\n\nexport function createBuilderListEditorPageComponent<\n TEntity extends BuilderEditorEntity & BuilderListEditorEntity<TTriggerEvent>,\n TInput,\n TTriggerEvent extends string,\n>(deps: BuilderListEditorPageDependencies<TEntity, TInput, TTriggerEvent>) {\n return function BuilderListEditorPage({ listId }: { listId?: string }) {\n const Body = deps.Body;\n const entityQuery = deps.hooks.useEntity(listId);\n const tables = deps.hooks.useTables();\n const save = deps.hooks.useSave();\n const form = useForm<BuilderListEditorValues<TTriggerEvent>>({\n resolver: deps.resolver,\n defaultValues: deps.emptyValues,\n });\n const columnArray = useFieldArray({ control: form.control, name: \"columns\" });\n const triggerArray = useFieldArray({ control: form.control, name: \"triggers\" });\n const sourceType = useWatch({ control: form.control, name: \"sourceType\" });\n const sourceTable = useWatch({ control: form.control, name: \"sourceTable\" });\n\n useEffect(() => {\n if (listId && !entityQuery.data) return;\n form.reset(builderListEditorValuesFromEntity(entityQuery.data ?? null, deps.emptyValues));\n }, [entityQuery.data, form, listId]);\n\n const importColumnsFromTable = () => {\n const table = tables.data?.find((item) => item.name === sourceTable);\n if (!table) return;\n columnArray.replace(builderListEditorColumnsFromTable(table));\n };\n\n const onSubmit = form.handleSubmit(async (values) => {\n try {\n const saved = await save.mutateAsync({ id: listId, input: deps.buildInput(values) });\n deps.notifications.success(listId ? deps.labels.saved : deps.labels.created);\n if (!listId) deps.navigateAfterCreate(saved);\n } catch (error) {\n deps.notifications.error(error);\n }\n });\n\n if (listId && entityQuery.isPending) {\n return <div className=\"text-muted-foreground text-sm\">{deps.states.loading}</div>;\n }\n\n if (listId && entityQuery.isError) {\n return <div className=\"text-destructive text-sm\">{deps.states.error}</div>;\n }\n\n return (\n <FormProvider {...form}>\n <form onSubmit={onSubmit} noValidate className=\"space-y-6\">\n <Body\n listId={listId}\n form={form}\n columnArray={columnArray}\n triggerArray={triggerArray}\n sourceType={sourceType}\n sourceTable={sourceTable}\n tables={tables.data ?? []}\n emptyColumn={deps.emptyColumn}\n emptyTrigger={deps.emptyTrigger}\n isSaving={save.isPending}\n importColumnsFromTable={importColumnsFromTable}\n />\n </form>\n </FormProvider>\n );\n };\n}\n","export const BUILDER_EDITOR_NONE_VALUE = \"__none\";\n\nexport type BuilderEditorSelectOption = {\n label: string;\n value: string;\n};\n\nexport type BuilderEditorDbTable<TFieldType extends string = string> = {\n name: string;\n label?: string;\n lookupColumns?: Array<{\n name: string;\n label: string;\n }>;\n columns: Array<{\n name: string;\n label: string;\n fieldType: TFieldType;\n nullable: boolean;\n dataType: string;\n sortable: boolean;\n }>;\n};\n\ntype BuilderEditorSource =\n | { type: \"dbTable\"; tableName: string }\n | { type: \"apiEndpoint\"; basePath: string }\n | null;\n\ntype BuilderEditorTrigger<TEvent extends string> = {\n event: TEvent;\n action: string;\n enabled: boolean;\n blocking: boolean;\n config: Record<string, unknown>;\n};\n\ntype BuilderEditorField<TFieldType extends string> = {\n key: string;\n label: string;\n type: TFieldType;\n required: boolean;\n hidden?: boolean;\n disabled?: boolean;\n placeholder?: string;\n description?: string;\n options?: BuilderEditorSelectOption[];\n optionsSource?:\n | {\n type: \"dbTable\";\n tableName: string;\n valueField: string;\n labelField: string;\n searchFields?: string[];\n filterBy?: {\n field: string;\n valueFromField: string;\n };\n }\n | undefined;\n triggers?: BuilderEditorFieldTrigger[];\n};\n\nexport type BuilderEditorSubform = {\n key: string;\n label: string;\n viewId: string;\n parentField: string;\n childField: string;\n buttonLabel?: string;\n icon?: string;\n};\n\ntype BuilderEditorFormLayoutField = {\n key: string;\n span?: number;\n};\n\ntype BuilderEditorFormLayoutGroup = {\n id: string;\n title?: string | null;\n columns?: 6 | 8 | 12;\n fields?: BuilderEditorFormLayoutField[];\n};\n\ntype BuilderEditorFormLayout = {\n groups?: BuilderEditorFormLayoutGroup[];\n};\n\ntype BuilderEditorColumn = {\n key: string;\n label: string;\n sortable: boolean;\n align: \"left\" | \"right\";\n};\n\nexport type BuilderFormEditorEntity<\n TFieldType extends string = string,\n TTriggerEvent extends string = string,\n> = {\n title: string;\n description: string | null;\n version: number;\n source: BuilderEditorSource;\n schema: {\n fields: BuilderEditorField<TFieldType>[];\n layout?: BuilderEditorFormLayout;\n subforms?: BuilderEditorSubform[];\n };\n triggers: BuilderEditorTrigger<TTriggerEvent>[];\n};\n\nexport type BuilderListEditorEntity<TTriggerEvent extends string = string> = {\n title: string;\n description: string | null;\n version: number;\n source: BuilderEditorSource;\n schema: { columns: BuilderEditorColumn[] };\n triggers: BuilderEditorTrigger<TTriggerEvent>[];\n};\n\nexport type BuilderFormEditorFieldValues<TFieldType extends string = string> = {\n key: string;\n label: string;\n type: TFieldType;\n required: boolean;\n hidden: boolean;\n disabled: boolean;\n placeholder?: string;\n optionsText?: string;\n optionsMode: \"static\" | \"table\";\n optionsTable: string;\n optionsValueField: string;\n optionsLabelField: string;\n optionsSearchFieldsText?: string;\n optionsDependsOn?: string;\n optionsFilterField?: string;\n triggers: BuilderEditorFieldTriggerValues[];\n};\n\nexport type BuilderFormEditorSubformValues = {\n key: string;\n label: string;\n viewId: string;\n parentField: string;\n childField: string;\n buttonLabel?: string;\n icon?: string;\n};\n\nexport type BuilderFormEditorLayoutFieldValues = {\n key: string;\n span: number;\n};\n\nexport type BuilderFormEditorLayoutGroupValues = {\n id: string;\n title: string;\n columns: 6 | 8 | 12;\n fields: BuilderFormEditorLayoutFieldValues[];\n};\n\nexport type BuilderEditorTriggerValues<TEvent extends string = string> = {\n event: TEvent;\n route: string;\n enabled: boolean;\n blocking: boolean;\n};\n\nexport type BuilderEditorFieldTrigger = {\n event: string;\n action: string;\n enabled: boolean;\n debounceMs: number;\n config: Record<string, unknown>;\n};\n\nexport type BuilderEditorFieldTriggerValues = {\n event: string;\n action: string;\n enabled: boolean;\n debounceMs: number;\n};\n\nexport type BuilderFormEditorValues<\n TFieldType extends string = string,\n TTriggerEvent extends string = string,\n> = {\n title: string;\n description?: string;\n sourceType: \"none\" | \"dbTable\" | \"apiEndpoint\";\n sourceTable: string;\n apiBasePath?: string;\n fields: BuilderFormEditorFieldValues<TFieldType>[];\n layoutGroups: BuilderFormEditorLayoutGroupValues[];\n subforms?: BuilderFormEditorSubformValues[];\n triggers: BuilderEditorTriggerValues<TTriggerEvent>[];\n version: number;\n};\n\nexport type BuilderListEditorColumnValues = {\n key: string;\n label: string;\n sortable: boolean;\n align: \"left\" | \"right\";\n};\n\nexport type BuilderListEditorValues<TTriggerEvent extends string = string> = {\n title: string;\n description?: string;\n sourceType: \"none\" | \"dbTable\" | \"apiEndpoint\";\n sourceTable: string;\n apiBasePath?: string;\n columns: BuilderListEditorColumnValues[];\n triggers: BuilderEditorTriggerValues<TTriggerEvent>[];\n version: number;\n};\n\nexport type BuilderViewEditorEntity<TTrigger = unknown> = {\n title: string;\n description: string | null;\n formId: string | null;\n listId: string | null;\n permissionRead?: string | null;\n permissionWrite?: string | null;\n triggers: TTrigger[];\n version: number;\n};\n\nexport type BuilderViewEditorValues = {\n title: string;\n description?: string;\n formId: string;\n listId: string;\n permissionRead: string;\n permissionWrite: string;\n triggersText?: string;\n version: number;\n};\n\nexport function builderEditorOptionsToText(options?: BuilderEditorSelectOption[]) {\n return (options ?? []).map((option) => `${option.label}:${option.value}`).join(\"\\n\");\n}\n\nexport function builderEditorTextToOptions(\n value?: string,\n): BuilderEditorSelectOption[] | undefined {\n const rows = (value ?? \"\")\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter(Boolean);\n if (rows.length === 0) return undefined;\n return rows.map((line) => {\n const [label, ...rest] = line.split(\":\");\n return { label: label.trim(), value: rest.join(\":\").trim() || label.trim() };\n });\n}\n\nexport function builderEditorSearchFieldsToText(fields?: string[]) {\n return (fields ?? []).join(\"\\n\");\n}\n\nexport function builderEditorTextToSearchFields(value?: string): string[] | undefined {\n const fields = (value ?? \"\")\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter(Boolean);\n return fields.length > 0 ? fields : undefined;\n}\n\nexport function getBuilderEditorTriggerRoute(config: Record<string, unknown>) {\n const route = config.route ?? config.path ?? config.url;\n return typeof route === \"string\" ? route : \"\";\n}\n\nfunction valuesFromTriggers<TEvent extends string>(\n triggers: BuilderEditorTrigger<TEvent>[],\n): BuilderEditorTriggerValues<TEvent>[] {\n return triggers\n .filter((trigger) => trigger.action === \"callApi\" || trigger.action === \"webhook\")\n .map((trigger) => ({\n event: trigger.event,\n route: getBuilderEditorTriggerRoute(trigger.config),\n enabled: trigger.enabled,\n blocking: trigger.blocking,\n }))\n .filter((trigger) => trigger.route);\n}\n\nfunction valuesFromFieldTriggers(\n triggers?: BuilderEditorFieldTrigger[],\n): BuilderEditorFieldTriggerValues[] {\n return (triggers ?? []).map((trigger) => ({\n event: trigger.event,\n action: trigger.action,\n enabled: trigger.enabled,\n debounceMs: trigger.debounceMs,\n }));\n}\n\nfunction clampLayoutSpan(span: number | undefined, columns: 6 | 8 | 12) {\n if (!span || Number.isNaN(span)) return columns;\n return Math.max(1, Math.min(columns, Math.trunc(span)));\n}\n\nexport function builderFormEditorDefaultSpan<TFieldType extends string>(\n field: BuilderFormEditorFieldValues<TFieldType>,\n) {\n if (field.type === \"textarea\" || field.type === \"checkbox\") return 12;\n return 6;\n}\n\nexport function builderFormEditorDefaultLayoutGroups<TFieldType extends string>(\n fields: BuilderFormEditorFieldValues<TFieldType>[],\n subforms: BuilderFormEditorSubformValues[] = [],\n): BuilderFormEditorLayoutGroupValues[] {\n return [\n {\n id: \"main\",\n title: \"Үндсэн\",\n columns: 12,\n fields: [\n ...fields.map((field) => ({\n key: field.key,\n span: builderFormEditorDefaultSpan(field),\n })),\n ...subforms.map((subform) => ({ key: subform.key, span: 12 })),\n ],\n },\n ];\n}\n\nexport function normalizeBuilderFormEditorLayoutGroups<TFieldType extends string>(\n groups: BuilderEditorFormLayoutGroup[] | undefined,\n fields: BuilderFormEditorFieldValues<TFieldType>[],\n subforms: BuilderFormEditorSubformValues[] = [],\n): BuilderFormEditorLayoutGroupValues[] {\n if (fields.length === 0 && subforms.length === 0) return [];\n\n const layoutItems = [\n ...fields.map((field) => ({\n key: field.key,\n span: builderFormEditorDefaultSpan(field),\n })),\n ...subforms.map((subform) => ({ key: subform.key, span: 12 })),\n ];\n const itemKeys = new Set(layoutItems.map((item) => item.key));\n const usedKeys = new Set<string>();\n const normalized = (groups ?? [])\n .map((group, index) => {\n const columns: 6 | 8 | 12 = group.columns === 6 || group.columns === 8 ? group.columns : 12;\n const groupFields = (group.fields ?? [])\n .filter((field) => itemKeys.has(field.key) && !usedKeys.has(field.key))\n .map((field) => {\n usedKeys.add(field.key);\n return { key: field.key, span: clampLayoutSpan(field.span, columns) };\n });\n\n return {\n id: group.id || `group${index + 1}`,\n title: group.title || `Group ${index + 1}`,\n columns,\n fields: groupFields,\n };\n })\n .filter((group) => group.fields.length > 0 || group.title.trim());\n\n const missingFields = layoutItems.filter((item) => !usedKeys.has(item.key));\n\n if (normalized.length === 0) {\n return builderFormEditorDefaultLayoutGroups(fields, subforms);\n }\n\n if (missingFields.length > 0) {\n normalized.push({\n id: \"ungrouped\",\n title: \"Бусад\",\n columns: 12,\n fields: missingFields,\n });\n }\n\n return normalized;\n}\n\nexport function builderFormEditorValuesFromEntity<\n TFieldType extends string,\n TTriggerEvent extends string,\n>(\n form: BuilderFormEditorEntity<TFieldType, TTriggerEvent> | null,\n emptyValues: BuilderFormEditorValues<TFieldType, TTriggerEvent>,\n): BuilderFormEditorValues<TFieldType, TTriggerEvent> {\n if (!form) return emptyValues;\n const source = form.source;\n const fields: BuilderFormEditorFieldValues<TFieldType>[] = form.schema.fields.map((field) => ({\n key: field.key,\n label: field.label,\n type: field.type,\n required: field.required,\n hidden: field.hidden ?? false,\n disabled: field.disabled ?? false,\n placeholder: field.placeholder ?? \"\",\n optionsText: builderEditorOptionsToText(field.options),\n optionsMode: field.optionsSource?.type === \"dbTable\" ? \"table\" : \"static\",\n optionsTable:\n field.optionsSource?.type === \"dbTable\"\n ? field.optionsSource.tableName\n : BUILDER_EDITOR_NONE_VALUE,\n optionsValueField:\n field.optionsSource?.type === \"dbTable\"\n ? field.optionsSource.valueField\n : BUILDER_EDITOR_NONE_VALUE,\n optionsLabelField:\n field.optionsSource?.type === \"dbTable\"\n ? field.optionsSource.labelField\n : BUILDER_EDITOR_NONE_VALUE,\n optionsSearchFieldsText:\n field.optionsSource?.type === \"dbTable\"\n ? builderEditorSearchFieldsToText(field.optionsSource.searchFields)\n : \"\",\n optionsDependsOn:\n field.optionsSource?.type === \"dbTable\"\n ? (field.optionsSource.filterBy?.valueFromField ?? \"\")\n : \"\",\n optionsFilterField:\n field.optionsSource?.type === \"dbTable\" ? (field.optionsSource.filterBy?.field ?? \"\") : \"\",\n triggers: valuesFromFieldTriggers(field.triggers),\n }));\n const subforms = (form.schema.subforms ?? []).map((subform) => ({\n key: subform.key,\n label: subform.label,\n viewId: subform.viewId,\n parentField: subform.parentField,\n childField: subform.childField,\n buttonLabel: subform.buttonLabel ?? \"\",\n icon: subform.icon ?? \"\",\n }));\n return {\n title: form.title,\n description: form.description ?? \"\",\n sourceType: source?.type ?? \"none\",\n sourceTable: source?.type === \"dbTable\" ? source.tableName : BUILDER_EDITOR_NONE_VALUE,\n apiBasePath: source?.type === \"apiEndpoint\" ? source.basePath : \"\",\n fields,\n layoutGroups: normalizeBuilderFormEditorLayoutGroups(\n form.schema.layout?.groups,\n fields,\n subforms,\n ),\n subforms,\n triggers: valuesFromTriggers(form.triggers),\n version: form.version,\n };\n}\n\nexport function builderListEditorValuesFromEntity<TTriggerEvent extends string>(\n list: BuilderListEditorEntity<TTriggerEvent> | null,\n emptyValues: BuilderListEditorValues<TTriggerEvent>,\n): BuilderListEditorValues<TTriggerEvent> {\n if (!list) return emptyValues;\n const source = list.source;\n return {\n title: list.title,\n description: list.description ?? \"\",\n sourceType: source?.type ?? \"none\",\n sourceTable: source?.type === \"dbTable\" ? source.tableName : BUILDER_EDITOR_NONE_VALUE,\n apiBasePath: source?.type === \"apiEndpoint\" ? source.basePath : \"\",\n columns: list.schema.columns.map((column) => ({\n key: column.key,\n label: column.label,\n sortable: column.sortable,\n align: column.align,\n })),\n triggers: valuesFromTriggers(list.triggers),\n version: list.version,\n };\n}\n\nexport function builderViewEditorValuesFromEntity<TTrigger>(\n view: BuilderViewEditorEntity<TTrigger> | null,\n emptyValues: BuilderViewEditorValues,\n defaultPermission: string,\n): BuilderViewEditorValues {\n if (!view) return emptyValues;\n return {\n title: view.title,\n description: view.description ?? \"\",\n formId: view.formId ?? BUILDER_EDITOR_NONE_VALUE,\n listId: view.listId ?? BUILDER_EDITOR_NONE_VALUE,\n permissionRead: view.permissionRead ?? defaultPermission,\n permissionWrite: view.permissionWrite ?? defaultPermission,\n triggersText: JSON.stringify(view.triggers ?? [], null, 2),\n version: view.version,\n };\n}\n\nexport function builderFormEditorFieldsFromTable<TFieldType extends string>(\n table: BuilderEditorDbTable<TFieldType>,\n): BuilderFormEditorFieldValues<TFieldType>[] {\n return table.columns.map((column) => ({\n key: column.name,\n label: column.label,\n type: column.fieldType,\n required: !column.nullable,\n hidden: false,\n disabled: false,\n placeholder: column.label,\n optionsText: \"\",\n optionsMode: \"static\",\n optionsTable: BUILDER_EDITOR_NONE_VALUE,\n optionsValueField: BUILDER_EDITOR_NONE_VALUE,\n optionsLabelField: BUILDER_EDITOR_NONE_VALUE,\n optionsSearchFieldsText: \"\",\n optionsDependsOn: \"\",\n optionsFilterField: \"\",\n triggers: [],\n }));\n}\n\nexport function builderListEditorColumnsFromTable<TFieldType extends string>(\n table: BuilderEditorDbTable<TFieldType>,\n): BuilderListEditorColumnValues[] {\n return table.columns.map((column) => ({\n key: column.name,\n label: column.label,\n sortable: column.sortable,\n align: column.fieldType === \"number\" || column.fieldType === \"money\" ? \"right\" : \"left\",\n }));\n}\n\nexport function builderFormEditorInputFromValues<\n TFieldType extends string,\n TTriggerEvent extends string,\n>(values: BuilderFormEditorValues<TFieldType, TTriggerEvent>) {\n const source =\n values.sourceType === \"dbTable\" && values.sourceTable !== BUILDER_EDITOR_NONE_VALUE\n ? { type: \"dbTable\" as const, tableName: values.sourceTable }\n : values.sourceType === \"apiEndpoint\" && values.apiBasePath\n ? { type: \"apiEndpoint\" as const, basePath: values.apiBasePath }\n : null;\n\n return {\n title: values.title,\n description: values.description || null,\n source,\n schema: {\n fields: values.fields.map((field) => ({\n key: field.key,\n label: field.label,\n type: field.type,\n required: field.required,\n hidden: field.hidden,\n disabled: field.disabled,\n placeholder: field.placeholder?.trim() || field.label,\n options:\n field.type === \"select\" && field.optionsMode === \"static\"\n ? builderEditorTextToOptions(field.optionsText)\n : undefined,\n optionsSource:\n field.type === \"select\" &&\n field.optionsMode === \"table\" &&\n field.optionsTable !== BUILDER_EDITOR_NONE_VALUE &&\n field.optionsValueField !== BUILDER_EDITOR_NONE_VALUE &&\n field.optionsLabelField !== BUILDER_EDITOR_NONE_VALUE\n ? {\n type: \"dbTable\" as const,\n tableName: field.optionsTable,\n valueField: field.optionsValueField,\n labelField: field.optionsLabelField,\n searchFields: builderEditorTextToSearchFields(field.optionsSearchFieldsText),\n filterBy:\n field.optionsDependsOn && field.optionsFilterField\n ? {\n field: field.optionsFilterField,\n valueFromField: field.optionsDependsOn,\n }\n : undefined,\n }\n : undefined,\n triggers: field.triggers.map((trigger) => ({\n event: trigger.event,\n action: trigger.action,\n enabled: trigger.enabled,\n debounceMs: trigger.debounceMs,\n config: {},\n })),\n })),\n layout: {\n groups: normalizeBuilderFormEditorLayoutGroups(\n values.layoutGroups,\n values.fields,\n values.subforms ?? [],\n ),\n },\n subforms: (values.subforms ?? [])\n .filter(\n (subform) =>\n subform.key &&\n subform.label &&\n subform.viewId !== BUILDER_EDITOR_NONE_VALUE &&\n subform.parentField &&\n subform.childField,\n )\n .map((subform) => ({\n key: subform.key,\n label: subform.label,\n viewId: subform.viewId,\n parentField: subform.parentField,\n childField: subform.childField,\n buttonLabel: subform.buttonLabel?.trim() || undefined,\n icon: subform.icon?.trim() || undefined,\n })),\n },\n triggers: values.triggers.map((trigger) => ({\n event: trigger.event,\n action: \"callApi\" as const,\n enabled: trigger.enabled,\n blocking: trigger.blocking,\n config: { route: trigger.route },\n })),\n version: values.version,\n };\n}\n\nexport function builderListEditorInputFromValues<TTriggerEvent extends string>(\n values: BuilderListEditorValues<TTriggerEvent>,\n) {\n const source =\n values.sourceType === \"dbTable\" && values.sourceTable !== BUILDER_EDITOR_NONE_VALUE\n ? { type: \"dbTable\" as const, tableName: values.sourceTable }\n : values.sourceType === \"apiEndpoint\" && values.apiBasePath\n ? { type: \"apiEndpoint\" as const, basePath: values.apiBasePath }\n : null;\n\n return {\n title: values.title,\n description: values.description || null,\n source,\n schema: { columns: values.columns },\n triggers: values.triggers.map((trigger) => ({\n event: trigger.event,\n action: \"callApi\" as const,\n enabled: trigger.enabled,\n blocking: trigger.blocking,\n config: { route: trigger.route },\n })),\n version: values.version,\n };\n}\n\nexport function builderViewEditorInputFromValues<TTrigger>(\n values: BuilderViewEditorValues,\n parseTriggers: (value: string) => TTrigger[],\n) {\n return {\n title: values.title,\n description: values.description || null,\n formId: values.formId === BUILDER_EDITOR_NONE_VALUE ? null : values.formId,\n listId: values.listId === BUILDER_EDITOR_NONE_VALUE ? null : values.listId,\n permissionRead: values.permissionRead,\n permissionWrite: values.permissionWrite,\n triggers: values.triggersText?.trim() ? parseTriggers(values.triggersText) : [],\n version: values.version,\n };\n}\n","\"use client\";\n\nimport type { ComponentType, ReactNode } from \"react\";\nimport { useCallback, useMemo, useState } from \"react\";\n\nexport type BuilderEntityManagerEntity = {\n id: string;\n title: string;\n};\n\nexport type BuilderEntityManagerActions<TEntity extends BuilderEntityManagerEntity> = {\n onEdit(entity: TEntity): void;\n onReplicate(entity: TEntity): void | Promise<void>;\n onDelete(entity: TEntity): void;\n runtimeHref?: (entity: TEntity) => string;\n};\n\nexport type BuilderEntityManagerDataGridProps<TController, TEntity> = {\n title: string;\n description: string;\n controller: TController;\n isLoading?: boolean;\n searchPlaceholder: string;\n emptyTitle: string;\n emptyDescription: string;\n onRowClick(entity: TEntity): void;\n toolbarExtra: ReactNode;\n};\n\nexport type BuilderEntityManagerAddButtonProps = {\n href: string;\n label: string;\n};\n\nexport type BuilderEntityManagerDialogAddButtonProps = {\n label: string;\n onAdd(): void;\n};\n\nexport type BuilderEntityManagerDeleteDialogProps<TEntity> = {\n entity: TEntity | null;\n title: string;\n description: string;\n isDeleting: boolean;\n onClose(): void;\n onConfirm(): Promise<void>;\n};\n\nexport type BuilderEntityManagerEditorDialogProps<TEntity> = {\n open: boolean;\n editing: TEntity | null;\n onClose(): void;\n};\n\nexport type BuilderEntityManagerHookResult<TEntity> = {\n data?: {\n items: TEntity[];\n total: number;\n };\n isPending: boolean;\n};\n\nexport type BuilderEntityManagerMutation<TInput> = {\n mutateAsync(input: TInput): Promise<unknown>;\n isPending: boolean;\n};\n\nexport type BuilderEntityManagerLabels = {\n title: string;\n description: string;\n searchPlaceholder: string;\n emptyTitle: string;\n emptyDescription: string;\n addLabel: string;\n deleteTitle: string;\n deleteDescription(entity: BuilderEntityManagerEntity | null): string;\n};\n\nexport type BuilderEntityManagerDependencies<\n TEntity extends BuilderEntityManagerEntity,\n TColumn,\n TState extends { query: TQuery },\n TQuery,\n TController,\n> = {\n labels: BuilderEntityManagerLabels;\n createHref: string;\n runtimeHref(entity: TEntity): string;\n navigateToEdit(entity: TEntity): void;\n requestReplicateTitle(entity: TEntity): string | null | Promise<string | null>;\n hooks: {\n useEntities(query: TQuery): BuilderEntityManagerHookResult<TEntity>;\n useDelete(): BuilderEntityManagerMutation<string>;\n useReplicate(): BuilderEntityManagerMutation<{ id: string; input: { title?: string } }>;\n };\n buildColumns(actions: BuilderEntityManagerActions<TEntity>): TColumn[];\n useDataTableState(args?: { pageSize?: number }): TState;\n useDataTable(args: {\n columns: TColumn[];\n data: TEntity[];\n rowCount: number;\n state: TState;\n getRowId(row: TEntity): string;\n }): TController;\n DataGrid: ComponentType<BuilderEntityManagerDataGridProps<TController, TEntity>>;\n AddButton: ComponentType<BuilderEntityManagerAddButtonProps>;\n DeleteDialog: ComponentType<BuilderEntityManagerDeleteDialogProps<TEntity>>;\n};\n\nexport type BuilderEntityDialogManagerDependencies<\n TEntity extends BuilderEntityManagerEntity,\n TColumn,\n TState extends { query: TQuery },\n TQuery,\n TController,\n> = {\n labels: BuilderEntityManagerLabels;\n runtimeHref(entity: TEntity): string;\n requestReplicateTitle(entity: TEntity): string | null | Promise<string | null>;\n hooks: {\n useEntities(query: TQuery): BuilderEntityManagerHookResult<TEntity>;\n useDelete(): BuilderEntityManagerMutation<string>;\n useReplicate(): BuilderEntityManagerMutation<{ id: string; input: { title?: string } }>;\n };\n buildColumns(actions: BuilderEntityManagerActions<TEntity>): TColumn[];\n useDataTableState(args?: { pageSize?: number }): TState;\n useDataTable(args: {\n columns: TColumn[];\n data: TEntity[];\n rowCount: number;\n state: TState;\n getRowId(row: TEntity): string;\n }): TController;\n DataGrid: ComponentType<BuilderEntityManagerDataGridProps<TController, TEntity>>;\n AddButton: ComponentType<BuilderEntityManagerDialogAddButtonProps>;\n EditorDialog: ComponentType<BuilderEntityManagerEditorDialogProps<TEntity>>;\n DeleteDialog: ComponentType<BuilderEntityManagerDeleteDialogProps<TEntity>>;\n};\n\nexport function createBuilderEntityManagerComponent<\n TEntity extends BuilderEntityManagerEntity,\n TColumn,\n TState extends { query: TQuery },\n TQuery,\n TController,\n>(deps: BuilderEntityManagerDependencies<TEntity, TColumn, TState, TQuery, TController>) {\n return function BuilderEntityManager() {\n const [pendingDelete, setPendingDelete] = useState<TEntity | null>(null);\n const state = deps.useDataTableState({ pageSize: 20 });\n const query = deps.hooks.useEntities(state.query);\n const remove = deps.hooks.useDelete();\n const replicate = deps.hooks.useReplicate();\n\n const columns = useMemo(\n () =>\n deps.buildColumns({\n onEdit: deps.navigateToEdit,\n onReplicate: async (entity) => {\n const title = await deps.requestReplicateTitle(entity);\n if (!title) return;\n await replicate.mutateAsync({ id: entity.id, input: { title } });\n },\n onDelete: setPendingDelete,\n runtimeHref: deps.runtimeHref,\n }),\n [replicate],\n );\n\n const controller = deps.useDataTable({\n columns,\n data: query.data?.items ?? [],\n rowCount: query.data?.total ?? 0,\n state,\n getRowId: (row) => row.id,\n });\n\n return (\n <div className=\"space-y-6\">\n <deps.DataGrid\n title={deps.labels.title}\n description={deps.labels.description}\n controller={controller}\n isLoading={query.isPending}\n searchPlaceholder={deps.labels.searchPlaceholder}\n emptyTitle={deps.labels.emptyTitle}\n emptyDescription={deps.labels.emptyDescription}\n onRowClick={deps.navigateToEdit}\n toolbarExtra={<deps.AddButton href={deps.createHref} label={deps.labels.addLabel} />}\n />\n\n <deps.DeleteDialog\n entity={pendingDelete}\n title={deps.labels.deleteTitle}\n description={deps.labels.deleteDescription(pendingDelete)}\n isDeleting={remove.isPending}\n onClose={() => setPendingDelete(null)}\n onConfirm={async () => {\n if (!pendingDelete) return;\n await remove.mutateAsync(pendingDelete.id);\n setPendingDelete(null);\n }}\n />\n </div>\n );\n };\n}\n\nexport function createBuilderEntityDialogManagerComponent<\n TEntity extends BuilderEntityManagerEntity,\n TColumn,\n TState extends { query: TQuery },\n TQuery,\n TController,\n>(deps: BuilderEntityDialogManagerDependencies<TEntity, TColumn, TState, TQuery, TController>) {\n return function BuilderEntityDialogManager() {\n const [editing, setEditing] = useState<TEntity | null>(null);\n const [isEditorOpen, setEditorOpen] = useState(false);\n const [pendingDelete, setPendingDelete] = useState<TEntity | null>(null);\n const state = deps.useDataTableState({ pageSize: 20 });\n const query = deps.hooks.useEntities(state.query);\n const remove = deps.hooks.useDelete();\n const replicate = deps.hooks.useReplicate();\n\n const openEditor = useCallback((entity: TEntity | null) => {\n setEditing(entity);\n setEditorOpen(true);\n }, []);\n\n const columns = useMemo(\n () =>\n deps.buildColumns({\n onEdit: (entity) => openEditor(entity),\n onReplicate: async (entity) => {\n const title = await deps.requestReplicateTitle(entity);\n if (!title) return;\n await replicate.mutateAsync({ id: entity.id, input: { title } });\n },\n onDelete: setPendingDelete,\n runtimeHref: deps.runtimeHref,\n }),\n [replicate, openEditor],\n );\n\n const controller = deps.useDataTable({\n columns,\n data: query.data?.items ?? [],\n rowCount: query.data?.total ?? 0,\n state,\n getRowId: (row) => row.id,\n });\n\n return (\n <div className=\"space-y-6\">\n <deps.DataGrid\n title={deps.labels.title}\n description={deps.labels.description}\n controller={controller}\n isLoading={query.isPending}\n searchPlaceholder={deps.labels.searchPlaceholder}\n emptyTitle={deps.labels.emptyTitle}\n emptyDescription={deps.labels.emptyDescription}\n onRowClick={openEditor}\n toolbarExtra={\n <deps.AddButton label={deps.labels.addLabel} onAdd={() => openEditor(null)} />\n }\n />\n\n <deps.EditorDialog\n open={isEditorOpen}\n editing={editing}\n onClose={() => setEditorOpen(false)}\n />\n\n <deps.DeleteDialog\n entity={pendingDelete}\n title={deps.labels.deleteTitle}\n description={deps.labels.deleteDescription(pendingDelete)}\n isDeleting={remove.isPending}\n onClose={() => setPendingDelete(null)}\n onConfirm={async () => {\n if (!pendingDelete) return;\n await remove.mutateAsync(pendingDelete.id);\n setPendingDelete(null);\n }}\n />\n </div>\n );\n };\n}\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport { useEffect } from \"react\";\nimport { FormProvider, type Resolver, type UseFormReturn, useForm } from \"react-hook-form\";\nimport {\n type BuilderViewEditorEntity,\n type BuilderViewEditorValues,\n builderViewEditorValuesFromEntity,\n} from \"./editorState\";\n\ntype BuilderOptionEntity = {\n id: string;\n title: string;\n};\n\ntype BuilderViewDialogSaveMutation<TInput> = (args: {\n id?: string;\n input: TInput;\n}) => Promise<unknown>;\n\ntype BuilderViewDialogNotifications = {\n success(message: string): void;\n error(error: unknown): void;\n};\n\ntype BuilderViewDialogLabels = {\n created: string;\n saved: string;\n};\n\nexport type BuilderViewDialogProps<TView, TForm, TList, TInput> = {\n open: boolean;\n editing: TView | null;\n forms: TForm[];\n lists: TList[];\n onClose(): void;\n onSave: BuilderViewDialogSaveMutation<TInput>;\n isSaving: boolean;\n};\n\nexport type BuilderViewDialogShellProps<TView> = {\n open: boolean;\n editing: TView | null;\n onClose(): void;\n children: ReactNode;\n};\n\nexport type BuilderViewDialogBodyProps<TForm, TList> = {\n form: UseFormReturn<BuilderViewEditorValues>;\n editing: BuilderViewEditorEntity | null;\n forms: TForm[];\n lists: TList[];\n permissionOptions: Array<{ value: string; label: string }>;\n noneValue: string;\n isSaving: boolean;\n onClose(): void;\n};\n\nexport type BuilderViewDialogDependencies<\n TView extends BuilderViewEditorEntity & { id: string },\n TForm extends BuilderOptionEntity,\n TList extends BuilderOptionEntity,\n TInput,\n> = {\n emptyValues: BuilderViewEditorValues;\n defaultPermission: string;\n permissionOptions: Array<{ value: string; label: string }>;\n noneValue: string;\n resolver?: Resolver<BuilderViewEditorValues>;\n labels: BuilderViewDialogLabels;\n buildInput(values: BuilderViewEditorValues): TInput;\n notifications: BuilderViewDialogNotifications;\n Shell(props: BuilderViewDialogShellProps<TView>): ReactNode;\n Body(props: BuilderViewDialogBodyProps<TForm, TList>): ReactNode;\n};\n\nexport function createBuilderViewDialogComponent<\n TView extends BuilderViewEditorEntity & { id: string },\n TForm extends BuilderOptionEntity,\n TList extends BuilderOptionEntity,\n TInput,\n>(deps: BuilderViewDialogDependencies<TView, TForm, TList, TInput>) {\n return function BuilderViewDialog({\n open,\n editing,\n forms,\n lists,\n onClose,\n onSave,\n isSaving,\n }: BuilderViewDialogProps<TView, TForm, TList, TInput>) {\n const form = useForm<BuilderViewEditorValues>({\n resolver: deps.resolver,\n defaultValues: deps.emptyValues,\n });\n\n useEffect(() => {\n if (!open) return;\n form.reset(\n builderViewEditorValuesFromEntity(editing, deps.emptyValues, deps.defaultPermission),\n );\n }, [editing, form, open]);\n\n const onSubmit = form.handleSubmit(async (values) => {\n try {\n await onSave({ id: editing?.id, input: deps.buildInput(values) });\n onClose();\n deps.notifications.success(editing ? deps.labels.saved : deps.labels.created);\n } catch (error) {\n deps.notifications.error(error);\n }\n });\n\n return (\n <deps.Shell open={open} editing={editing} onClose={onClose}>\n <FormProvider {...form}>\n <form onSubmit={onSubmit} noValidate>\n {deps.Body({\n form,\n editing,\n forms,\n lists,\n permissionOptions: deps.permissionOptions,\n noneValue: deps.noneValue,\n isSaving,\n onClose,\n })}\n </form>\n </FormProvider>\n </deps.Shell>\n );\n };\n}\n","export type BuilderApiQueryValue = string | number | boolean | null | undefined;\nexport type BuilderApiQuery = Record<string, BuilderApiQueryValue>;\n\nexport type BuilderApiTransport = {\n get<T>(path: string, options?: { query?: BuilderApiQuery }): Promise<T>;\n post<T>(path: string, body?: unknown, options?: { query?: BuilderApiQuery }): Promise<T>;\n patch<T>(path: string, body?: unknown, options?: { query?: BuilderApiQuery }): Promise<T>;\n delete<T>(path: string, options?: { query?: BuilderApiQuery }): Promise<T>;\n};\n\nexport type BuilderFieldOptionsQuery = {\n search?: string;\n depends?: Record<string, string | undefined>;\n};\n\nexport type BuilderApiContracts = {\n BuilderDbTable: unknown;\n BuilderForm: { id: string };\n BuilderList: { id: string };\n BuilderView: { id: string };\n BuilderViewEntry: { id: string };\n ListBuilderFormsQuery: object;\n ListBuilderFormsResponse: unknown;\n CreateBuilderFormInput: unknown;\n UpdateBuilderFormInput: unknown;\n ListBuilderListsQuery: object;\n ListBuilderListsResponse: unknown;\n CreateBuilderListInput: unknown;\n UpdateBuilderListInput: unknown;\n ListBuilderViewsQuery: object;\n ListBuilderViewsResponse: unknown;\n CreateBuilderViewInput: unknown;\n UpdateBuilderViewInput: unknown;\n ReplicateBuilderEntityInput: unknown;\n CreateBuilderViewEntryInput: unknown;\n CreateCompositeBuilderViewEntryInput: unknown;\n UpdateCompositeBuilderViewEntryInput: unknown;\n UpdateBuilderViewEntryInput: unknown;\n ListBuilderFieldOptionsQuery: BuilderFieldOptionsQuery;\n ListBuilderFieldOptionsResponse: unknown;\n RunBuilderFieldTriggerInput: unknown;\n BuilderFieldTriggerEvent: string;\n BuilderFieldTriggerResponse: unknown;\n ListBuilderViewEntriesQuery: object;\n ListBuilderViewEntriesResponse: unknown;\n};\n\nfunction queryParams(query: object): BuilderApiQuery {\n return { ...query } as BuilderApiQuery;\n}\n\nfunction fieldOptionsQueryParams(query: BuilderFieldOptionsQuery): BuilderApiQuery {\n const flatQuery: BuilderApiQuery = { search: query.search };\n for (const [key, value] of Object.entries(query.depends ?? {})) {\n flatQuery[`depends.${key}`] = value;\n }\n return flatQuery;\n}\n\nexport function createBuilderApiClient<C extends BuilderApiContracts>(\n transport: BuilderApiTransport,\n) {\n return {\n listBuilderForms: (query: C[\"ListBuilderFormsQuery\"]) =>\n transport.get<C[\"ListBuilderFormsResponse\"]>(\"/builder/forms\", {\n query: queryParams(query),\n }),\n\n listBuilderDbTables: () => transport.get<C[\"BuilderDbTable\"][]>(\"/builder/datasources/tables\"),\n\n listBuilderFormOptions: () => transport.get<C[\"BuilderForm\"][]>(\"/builder/forms/options\"),\n\n getBuilderForm: (id: string) =>\n transport.get<C[\"BuilderForm\"]>(`/builder/forms/${encodeURIComponent(id)}`),\n\n createBuilderForm: (input: C[\"CreateBuilderFormInput\"]) =>\n transport.post<C[\"BuilderForm\"]>(\"/builder/forms\", input),\n\n updateBuilderForm: (id: string, input: C[\"UpdateBuilderFormInput\"]) =>\n transport.patch<C[\"BuilderForm\"]>(`/builder/forms/${encodeURIComponent(id)}`, input),\n\n replicateBuilderForm: (id: string, input: C[\"ReplicateBuilderEntityInput\"]) =>\n transport.post<C[\"BuilderForm\"]>(`/builder/forms/${encodeURIComponent(id)}/replicate`, input),\n\n deleteBuilderForm: (id: string) =>\n transport.delete<void>(`/builder/forms/${encodeURIComponent(id)}`),\n\n listBuilderLists: (query: C[\"ListBuilderListsQuery\"]) =>\n transport.get<C[\"ListBuilderListsResponse\"]>(\"/builder/lists\", {\n query: queryParams(query),\n }),\n\n listBuilderListOptions: () => transport.get<C[\"BuilderList\"][]>(\"/builder/lists/options\"),\n\n getBuilderList: (id: string) =>\n transport.get<C[\"BuilderList\"]>(`/builder/lists/${encodeURIComponent(id)}`),\n\n createBuilderList: (input: C[\"CreateBuilderListInput\"]) =>\n transport.post<C[\"BuilderList\"]>(\"/builder/lists\", input),\n\n updateBuilderList: (id: string, input: C[\"UpdateBuilderListInput\"]) =>\n transport.patch<C[\"BuilderList\"]>(`/builder/lists/${encodeURIComponent(id)}`, input),\n\n replicateBuilderList: (id: string, input: C[\"ReplicateBuilderEntityInput\"]) =>\n transport.post<C[\"BuilderList\"]>(`/builder/lists/${encodeURIComponent(id)}/replicate`, input),\n\n deleteBuilderList: (id: string) =>\n transport.delete<void>(`/builder/lists/${encodeURIComponent(id)}`),\n\n listBuilderViews: (query: C[\"ListBuilderViewsQuery\"]) =>\n transport.get<C[\"ListBuilderViewsResponse\"]>(\"/builder/views\", {\n query: queryParams(query),\n }),\n\n getBuilderView: (id: string) =>\n transport.get<C[\"BuilderView\"]>(`/builder/views/${encodeURIComponent(id)}`),\n\n createBuilderView: (input: C[\"CreateBuilderViewInput\"]) =>\n transport.post<C[\"BuilderView\"]>(\"/builder/views\", input),\n\n updateBuilderView: (id: string, input: C[\"UpdateBuilderViewInput\"]) =>\n transport.patch<C[\"BuilderView\"]>(`/builder/views/${encodeURIComponent(id)}`, input),\n\n replicateBuilderView: (id: string, input: C[\"ReplicateBuilderEntityInput\"]) =>\n transport.post<C[\"BuilderView\"]>(`/builder/views/${encodeURIComponent(id)}/replicate`, input),\n\n deleteBuilderView: (id: string) =>\n transport.delete<void>(`/builder/views/${encodeURIComponent(id)}`),\n\n getRuntimeBuilderForm: (id: string) =>\n transport.get<C[\"BuilderForm\"]>(`/builder/runtime/forms/${encodeURIComponent(id)}`),\n\n createRuntimeBuilderFormEntry: (formId: string, input: C[\"CreateBuilderViewEntryInput\"]) =>\n transport.post<C[\"BuilderViewEntry\"]>(\n `/builder/runtime/forms/${encodeURIComponent(formId)}/entries`,\n input,\n ),\n\n listRuntimeBuilderFormFieldOptions: (\n formId: string,\n fieldKey: string,\n query: C[\"ListBuilderFieldOptionsQuery\"],\n ) =>\n transport.get<C[\"ListBuilderFieldOptionsResponse\"]>(\n `/builder/runtime/forms/${encodeURIComponent(formId)}/fields/${encodeURIComponent(fieldKey)}/options`,\n { query: fieldOptionsQueryParams(query) },\n ),\n\n runRuntimeBuilderFormFieldTrigger: (\n formId: string,\n fieldKey: string,\n event: C[\"BuilderFieldTriggerEvent\"],\n input: C[\"RunBuilderFieldTriggerInput\"],\n ) =>\n transport.post<C[\"BuilderFieldTriggerResponse\"]>(\n `/builder/runtime/forms/${encodeURIComponent(formId)}/fields/${encodeURIComponent(fieldKey)}/triggers/${encodeURIComponent(event)}`,\n input,\n ),\n\n getRuntimeBuilderList: (id: string) =>\n transport.get<C[\"BuilderList\"]>(`/builder/runtime/lists/${encodeURIComponent(id)}`),\n\n listRuntimeBuilderListEntries: (listId: string, query: C[\"ListBuilderViewEntriesQuery\"]) =>\n transport.get<C[\"ListBuilderViewEntriesResponse\"]>(\n `/builder/runtime/lists/${encodeURIComponent(listId)}/entries`,\n { query: queryParams(query) },\n ),\n\n getRuntimeBuilderView: (id: string) =>\n transport.get<C[\"BuilderView\"]>(`/builder/runtime/views/${encodeURIComponent(id)}`),\n\n runRuntimeBuilderViewFieldTrigger: (\n viewId: string,\n fieldKey: string,\n event: C[\"BuilderFieldTriggerEvent\"],\n input: C[\"RunBuilderFieldTriggerInput\"],\n ) =>\n transport.post<C[\"BuilderFieldTriggerResponse\"]>(\n `/builder/runtime/views/${encodeURIComponent(viewId)}/fields/${encodeURIComponent(fieldKey)}/triggers/${encodeURIComponent(event)}`,\n input,\n ),\n\n listBuilderViewEntries: (viewId: string, query: C[\"ListBuilderViewEntriesQuery\"]) =>\n transport.get<C[\"ListBuilderViewEntriesResponse\"]>(\n `/builder/runtime/views/${encodeURIComponent(viewId)}/entries`,\n { query: queryParams(query) },\n ),\n\n createBuilderViewEntry: (viewId: string, input: C[\"CreateBuilderViewEntryInput\"]) =>\n transport.post<C[\"BuilderViewEntry\"]>(\n `/builder/runtime/views/${encodeURIComponent(viewId)}/entries`,\n input,\n ),\n\n createCompositeBuilderViewEntry: (\n viewId: string,\n input: C[\"CreateCompositeBuilderViewEntryInput\"],\n ) =>\n transport.post<C[\"BuilderViewEntry\"]>(\n `/builder/runtime/views/${encodeURIComponent(viewId)}/composite-entries`,\n input,\n ),\n\n updateCompositeBuilderViewEntry: (\n viewId: string,\n id: string,\n input: C[\"UpdateCompositeBuilderViewEntryInput\"],\n ) =>\n transport.patch<C[\"BuilderViewEntry\"]>(\n `/builder/runtime/views/${encodeURIComponent(viewId)}/composite-entries/${encodeURIComponent(id)}`,\n input,\n ),\n\n updateBuilderViewEntry: (viewId: string, id: string, input: C[\"UpdateBuilderViewEntryInput\"]) =>\n transport.patch<C[\"BuilderViewEntry\"]>(\n `/builder/runtime/views/${encodeURIComponent(viewId)}/entries/${encodeURIComponent(id)}`,\n input,\n ),\n\n deleteBuilderViewEntry: (viewId: string, id: string) =>\n transport.delete<void>(\n `/builder/runtime/views/${encodeURIComponent(viewId)}/entries/${encodeURIComponent(id)}`,\n ),\n };\n}\n\nexport type BuilderApiClient<C extends BuilderApiContracts> = ReturnType<\n typeof createBuilderApiClient<C>\n>;\n","\"use client\";\n\nimport type { ComponentType, ReactNode } from \"react\";\nimport { useMemo } from \"react\";\nimport { FormProvider, useForm } from \"react-hook-form\";\nimport type { BuilderApiContracts } from \"../api\";\nimport type { BuilderHooks } from \"../hooks\";\nimport {\n type BuilderRuntimeFormSchemaLike,\n type BuilderRuntimeFormValues,\n createBuilderFormDefaultValues,\n} from \"../runtime\";\n\nexport type DynamicFormContracts = BuilderApiContracts & {\n BuilderForm: {\n id: string;\n title: string;\n schema: BuilderRuntimeFormSchemaLike;\n };\n CreateBuilderViewEntryInput: BuilderRuntimeFormValues;\n};\n\nexport type DynamicFormProps = {\n formId: string;\n};\n\nexport type DynamicFormShellProps = {\n title: string;\n children: ReactNode;\n};\n\nexport type DynamicFormFieldsProps<TSchema> = {\n formId: string;\n schema: TSchema;\n namePrefix: \"values\";\n};\n\nexport type DynamicFormSubmitProps = {\n isSaving: boolean;\n};\n\nexport type DynamicFormErrorStateProps = {\n title: string;\n description: string;\n};\n\nexport type DynamicFormNotifications = {\n success(message: string): void;\n error(message: string): void;\n errorMessage(error: unknown, fallback: string): string;\n};\n\nexport type DynamicFormDependencies<C extends DynamicFormContracts> = {\n hooks: Pick<BuilderHooks<C>, \"useRuntimeBuilderForm\" | \"useSaveRuntimeBuilderFormEntry\">;\n FormShell: ComponentType<DynamicFormShellProps>;\n FormFields: ComponentType<DynamicFormFieldsProps<C[\"BuilderForm\"][\"schema\"]>>;\n SubmitButton: ComponentType<DynamicFormSubmitProps>;\n ErrorState: ComponentType<DynamicFormErrorStateProps>;\n notifications: DynamicFormNotifications;\n};\n\nexport function createDynamicFormComponent<C extends DynamicFormContracts>(\n deps: DynamicFormDependencies<C>,\n) {\n return function DynamicForm({ formId }: DynamicFormProps) {\n const query = deps.hooks.useRuntimeBuilderForm(formId);\n const save = deps.hooks.useSaveRuntimeBuilderFormEntry(formId);\n const formValues = useMemo(\n () => (query.data ? createBuilderFormDefaultValues(query.data.schema) : undefined),\n [query.data],\n );\n const form = useForm<BuilderRuntimeFormValues>({\n defaultValues: createBuilderFormDefaultValues(query.data?.schema),\n values: formValues,\n });\n\n const onSubmit = form.handleSubmit(async (values) => {\n try {\n await save.mutateAsync(values as C[\"CreateBuilderViewEntryInput\"]);\n form.reset(createBuilderFormDefaultValues(query.data?.schema));\n deps.notifications.success(\"Form хадгалагдлаа\");\n } catch (error) {\n deps.notifications.error(deps.notifications.errorMessage(error, \"Хадгалахад алдаа гарлаа\"));\n }\n });\n\n if (query.isError) {\n return (\n <deps.ErrorState\n title=\"Form нээгдсэнгүй\"\n description={`«${formId}» id-тай form олдсонгүй.`}\n />\n );\n }\n\n if (!query.data) return null;\n\n return (\n <deps.FormShell title={query.data.title}>\n <FormProvider {...form}>\n <form onSubmit={onSubmit} noValidate className=\"space-y-6\">\n <deps.FormFields formId={formId} schema={query.data.schema} namePrefix=\"values\" />\n <deps.SubmitButton isSaving={save.isPending} />\n </form>\n </FormProvider>\n </deps.FormShell>\n );\n };\n}\n","export type BuilderRuntimeFieldLike = {\n key: string;\n type: string;\n};\n\nexport type BuilderRuntimeFormSchemaLike = {\n fields: readonly BuilderRuntimeFieldLike[];\n};\n\nexport type BuilderRuntimeViewLike = {\n form?: {\n schema: BuilderRuntimeFormSchemaLike;\n } | null;\n};\n\nexport type BuilderRuntimeEntryLike = {\n id: string;\n values: Record<string, unknown>;\n version: number;\n};\n\nexport type BuilderRuntimeFormValues = {\n values: Record<string, unknown>;\n};\n\nexport type BuilderRuntimeEntryValues = BuilderRuntimeFormValues & {\n version: number;\n};\n\nfunction emptyFieldValue(field: BuilderRuntimeFieldLike) {\n return field.type === \"checkbox\" ? false : \"\";\n}\n\nexport function createBuilderFormDefaultValues(\n schema?: BuilderRuntimeFormSchemaLike,\n): BuilderRuntimeFormValues {\n const values: Record<string, unknown> = {};\n for (const field of schema?.fields ?? []) {\n values[field.key] = emptyFieldValue(field);\n }\n return { values };\n}\n\nexport function createBuilderEntryDefaultValues(\n view: BuilderRuntimeViewLike,\n editing: BuilderRuntimeEntryLike | null,\n): BuilderRuntimeEntryValues {\n const values: Record<string, unknown> = {};\n for (const field of view.form?.schema.fields ?? []) {\n const existing = editing?.values[field.key];\n values[field.key] = existing === undefined ? emptyFieldValue(field) : existing;\n }\n return { values, version: editing?.version ?? 0 };\n}\n\nexport function formatBuilderRuntimeValue(value: unknown, locale = \"mn-MN\") {\n if (value === null || value === undefined || value === \"\") return \"—\";\n if (typeof value === \"boolean\") return value ? \"Тийм\" : \"Үгүй\";\n if (typeof value === \"number\") return new Intl.NumberFormat(locale).format(value);\n return String(value);\n}\n","\"use client\";\n\nimport type { ComponentType } from \"react\";\nimport { useMemo } from \"react\";\nimport type { BuilderApiContracts } from \"../api\";\nimport type { BuilderHooks } from \"../hooks\";\n\nexport type DynamicListContracts = BuilderApiContracts & {\n BuilderList: {\n id: string;\n title: string;\n description?: string | null;\n };\n BuilderViewEntry: {\n id: string;\n };\n ListBuilderViewEntriesResponse: {\n items: Array<BuilderApiContracts[\"BuilderViewEntry\"]>;\n total: number;\n };\n};\n\nexport type DynamicListProps = {\n listId: string;\n};\n\nexport type DynamicListDataGridProps<TController> = {\n title?: string;\n description?: string;\n controller: TController;\n isLoading?: boolean;\n searchPlaceholder?: string;\n emptyTitle?: string;\n emptyDescription?: string;\n};\n\nexport type DynamicListErrorStateProps = {\n title: string;\n description: string;\n};\n\nexport type DynamicListDependencies<\n C extends DynamicListContracts,\n TColumn,\n TState extends { query: C[\"ListBuilderViewEntriesQuery\"] },\n TController,\n> = {\n hooks: Pick<BuilderHooks<C>, \"useRuntimeBuilderList\" | \"useRuntimeBuilderListEntries\">;\n buildColumns(list: C[\"BuilderList\"]): TColumn[];\n useDataTableState(args?: { pageSize?: number }): TState;\n useDataTable(args: {\n columns: TColumn[];\n data: C[\"BuilderViewEntry\"][];\n rowCount: number;\n state: TState;\n getRowId(row: C[\"BuilderViewEntry\"]): string;\n }): TController;\n DataGrid: ComponentType<DynamicListDataGridProps<TController>>;\n ErrorState: ComponentType<DynamicListErrorStateProps>;\n};\n\nexport function createDynamicListComponent<\n C extends DynamicListContracts,\n TColumn,\n TState extends { query: C[\"ListBuilderViewEntriesQuery\"] },\n TController,\n>(deps: DynamicListDependencies<C, TColumn, TState, TController>) {\n return function DynamicList({ listId }: DynamicListProps) {\n const query = deps.hooks.useRuntimeBuilderList(listId);\n const state = deps.useDataTableState({ pageSize: 20 });\n const entriesQuery = deps.hooks.useRuntimeBuilderListEntries(listId, state.query);\n const columns = useMemo(() => (query.data ? deps.buildColumns(query.data) : []), [query.data]);\n const entries = entriesQuery.data?.items ?? [];\n const controller = deps.useDataTable({\n columns,\n data: entries as C[\"BuilderViewEntry\"][],\n rowCount: entriesQuery.data?.total ?? 0,\n state,\n getRowId: (row) => row.id,\n });\n\n if (query.isError) {\n return (\n <deps.ErrorState\n title=\"List нээгдсэнгүй\"\n description={`«${listId}» id-тай list олдсонгүй.`}\n />\n );\n }\n\n return (\n <deps.DataGrid\n title={query.data?.title ?? \"Dynamic List\"}\n description={query.data?.description ?? `/winu/list?id=${listId}`}\n controller={controller}\n isLoading={query.isPending || entriesQuery.isPending}\n searchPlaceholder=\"Мөр хайх...\"\n emptyTitle=\"Мөр алга\"\n emptyDescription=\"Энэ list-ийн datasource дээр мөр алга.\"\n />\n );\n };\n}\n","\"use client\";\n\nimport type { ComponentType, ReactNode } from \"react\";\nimport { useMemo, useState } from \"react\";\nimport type { BuilderApiContracts } from \"../api\";\nimport type { BuilderHooks } from \"../hooks\";\nimport type { BuilderRuntimeEntryLike } from \"../runtime\";\n\nexport type DynamicViewContracts = BuilderApiContracts & {\n BuilderView: {\n id: string;\n title: string;\n description?: string | null;\n form?: unknown | null;\n };\n BuilderViewEntry: BuilderRuntimeEntryLike;\n ListBuilderViewEntriesResponse: {\n items: Array<BuilderApiContracts[\"BuilderViewEntry\"]>;\n total: number;\n };\n};\n\nexport type DynamicViewProps = {\n viewId: string;\n};\n\nexport type DynamicViewColumnActions<TEntry> = {\n onEdit(entry: TEntry): void;\n onDelete(entry: TEntry): void;\n};\n\nexport type DynamicViewDataGridProps<TController> = {\n title?: string;\n description?: string;\n controller: TController;\n isLoading?: boolean;\n searchPlaceholder?: string;\n emptyTitle?: string;\n emptyDescription?: string;\n onRowClick?: (row: unknown) => void;\n toolbarExtra?: ReactNode;\n};\n\nexport type DynamicViewAddButtonProps = {\n disabled: boolean;\n onAdd(): void;\n};\n\nexport type DynamicViewEntryDialogProps<TView, TEntry, TInput> = {\n open: boolean;\n view: TView;\n editing: TEntry | null;\n onClose(): void;\n onSave(args: { id?: string; input: TInput }): Promise<unknown>;\n isSaving: boolean;\n};\n\nexport type DynamicViewDeleteDialogProps<TEntry> = {\n entry: TEntry | null;\n isDeleting: boolean;\n onClose(): void;\n onConfirm(): Promise<void>;\n};\n\nexport type DynamicViewErrorStateProps = {\n title: string;\n description: string;\n};\n\nexport type DynamicViewDependencies<\n C extends DynamicViewContracts,\n TColumn,\n TState extends { query: C[\"ListBuilderViewEntriesQuery\"] },\n TController,\n> = {\n hooks: Pick<\n BuilderHooks<C>,\n | \"useBuilderViewEntries\"\n | \"useDeleteBuilderViewEntry\"\n | \"useRuntimeBuilderView\"\n | \"useSaveBuilderViewEntry\"\n >;\n buildColumns(\n view: C[\"BuilderView\"],\n actions: DynamicViewColumnActions<C[\"BuilderViewEntry\"]>,\n ): TColumn[];\n useDataTableState(args?: { pageSize?: number }): TState;\n useDataTable(args: {\n columns: TColumn[];\n data: C[\"BuilderViewEntry\"][];\n rowCount: number;\n state: TState;\n getRowId(row: C[\"BuilderViewEntry\"]): string;\n }): TController;\n DataGrid: ComponentType<DynamicViewDataGridProps<TController>>;\n AddButton: ComponentType<DynamicViewAddButtonProps>;\n EntryDialog: ComponentType<\n DynamicViewEntryDialogProps<\n C[\"BuilderView\"],\n C[\"BuilderViewEntry\"],\n C[\"UpdateBuilderViewEntryInput\"]\n >\n >;\n DeleteDialog: ComponentType<DynamicViewDeleteDialogProps<C[\"BuilderViewEntry\"]>>;\n ErrorState: ComponentType<DynamicViewErrorStateProps>;\n};\n\nexport function createDynamicViewComponent<\n C extends DynamicViewContracts,\n TColumn,\n TState extends { query: C[\"ListBuilderViewEntriesQuery\"] },\n TController,\n>(deps: DynamicViewDependencies<C, TColumn, TState, TController>) {\n return function DynamicView({ viewId }: DynamicViewProps) {\n const [editing, setEditing] = useState<C[\"BuilderViewEntry\"] | null>(null);\n const [isDialogOpen, setDialogOpen] = useState(false);\n const [pendingDelete, setPendingDelete] = useState<C[\"BuilderViewEntry\"] | null>(null);\n\n const viewQuery = deps.hooks.useRuntimeBuilderView(viewId);\n const state = deps.useDataTableState({ pageSize: 20 });\n const entriesQuery = deps.hooks.useBuilderViewEntries(viewId, state.query);\n const save = deps.hooks.useSaveBuilderViewEntry(viewId);\n const remove = deps.hooks.useDeleteBuilderViewEntry(viewId);\n const view = viewQuery.data;\n\n const columns = useMemo(\n () =>\n view\n ? deps.buildColumns(view, {\n onEdit: (entry) => {\n setEditing(entry);\n setDialogOpen(true);\n },\n onDelete: setPendingDelete,\n })\n : [],\n [view],\n );\n\n const controller = deps.useDataTable({\n columns,\n data: (entriesQuery.data?.items ?? []) as C[\"BuilderViewEntry\"][],\n rowCount: entriesQuery.data?.total ?? 0,\n state,\n getRowId: (row) => row.id,\n });\n\n if (viewQuery.isError) {\n return (\n <deps.ErrorState\n title=\"View нээгдсэнгүй\"\n description={`«${viewId}» id-тай view олдсонгүй.`}\n />\n );\n }\n\n return (\n <div className=\"space-y-6\">\n <deps.DataGrid\n title={view?.title ?? \"Dynamic View\"}\n description={view?.description ?? `/winu/view?id=${viewId}`}\n controller={controller}\n isLoading={viewQuery.isPending || entriesQuery.isPending}\n searchPlaceholder=\"Мөр хайх...\"\n emptyTitle=\"Мөр алга\"\n emptyDescription=\"Энэ view дээр эхний мөрөө нэмээрэй.\"\n onRowClick={(entry) => {\n setEditing(entry as C[\"BuilderViewEntry\"]);\n setDialogOpen(true);\n }}\n toolbarExtra={\n <deps.AddButton\n disabled={!view?.form}\n onAdd={() => {\n setEditing(null);\n setDialogOpen(true);\n }}\n />\n }\n />\n\n {view ? (\n <deps.EntryDialog\n open={isDialogOpen}\n view={view}\n editing={editing}\n onClose={() => setDialogOpen(false)}\n onSave={save.mutateAsync}\n isSaving={save.isPending}\n />\n ) : null}\n\n <deps.DeleteDialog\n entry={pendingDelete}\n isDeleting={remove.isPending}\n onClose={() => setPendingDelete(null)}\n onConfirm={async () => {\n if (!pendingDelete) return;\n await remove.mutateAsync(pendingDelete.id);\n setPendingDelete(null);\n }}\n />\n </div>\n );\n };\n}\n","\"use client\";\n\nimport type { ComponentType, ReactNode } from \"react\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { FormProvider, useForm } from \"react-hook-form\";\nimport {\n type BuilderRuntimeEntryLike,\n type BuilderRuntimeEntryValues,\n type BuilderRuntimeFormSchemaLike,\n type BuilderRuntimeViewLike,\n createBuilderEntryDefaultValues,\n} from \"../runtime\";\n\ntype BuilderRuntimeDatasourceLike =\n | {\n type: \"dbTable\";\n tableName: string;\n }\n | {\n type: string;\n }\n | null;\n\nexport type RuntimeEntryDialogSubformLike = {\n key: string;\n};\n\nexport type RuntimeEntryDialogViewLike = BuilderRuntimeViewLike & {\n id: string;\n title: string;\n list?: {\n source?: BuilderRuntimeDatasourceLike;\n } | null;\n form?: {\n id: string;\n source?: BuilderRuntimeDatasourceLike;\n schema: BuilderRuntimeFormSchemaLike & {\n subforms?: readonly RuntimeEntryDialogSubformLike[];\n };\n } | null;\n};\n\nexport type RuntimeEntryDialogSaveArgs<TInput> = {\n id?: string;\n input: TInput;\n};\n\nexport type RuntimeEntryDialogProps<TView, TEntry, TInput> = {\n open: boolean;\n view: TView;\n editing: TEntry | null;\n onClose: () => void;\n onSave: (args: RuntimeEntryDialogSaveArgs<TInput>) => Promise<unknown>;\n isSaving: boolean;\n};\n\nexport type RuntimeEntryDialogShellProps = {\n open: boolean;\n title: string;\n description: string;\n onClose: () => void;\n children: ReactNode;\n};\n\nexport type RuntimeEntryDialogExtraItem = {\n key: string;\n render: () => ReactNode;\n};\n\nexport type RuntimeEntryDialogFieldsProps<TSchema> = {\n formId: string;\n viewId: string;\n entry?: BuilderRuntimeEntryLike | null;\n schema: TSchema;\n namePrefix: \"values\";\n extraItems?: RuntimeEntryDialogExtraItem[];\n};\n\nexport type RuntimeEntryDialogActionsProps = {\n isSaving: boolean;\n onClose: () => void;\n};\n\nexport type RuntimeEntryDialogNotifications = {\n success(message: string): void;\n error(message: string): void;\n errorMessage(error: unknown, fallback: string): string;\n};\n\nexport type RuntimeEntryDialogDraftRowsChange<TEntry> = {\n subformKey: string;\n dataKey: string;\n rows: TEntry[];\n};\n\nexport type RuntimeEntryDialogSubformFieldProps<TSubform, TEntry> = {\n subform: TSubform;\n parentEntry?: TEntry | null;\n draftRows?: TEntry[];\n onDraftRowsChange?(args: RuntimeEntryDialogDraftRowsChange<TEntry>): void;\n};\n\ntype RuntimeEntryDialogDraftSubform<TEntry> = {\n dataKey: string;\n rows: TEntry[];\n};\n\ntype RuntimeCompositeData = Record<\n string,\n Record<string, unknown> | Array<Record<string, unknown>>\n>;\n\ntype RuntimeCompositeCreateInput = {\n data: RuntimeCompositeData;\n};\n\ntype RuntimeCompositeUpdateInput = {\n data: RuntimeCompositeData;\n};\n\ntype RuntimeMutation<TInput> = {\n mutateAsync(input: TInput): Promise<unknown>;\n isPending: boolean;\n};\n\nexport type RuntimeEntryDialogDependencies<\n TView extends RuntimeEntryDialogViewLike,\n TEntry extends BuilderRuntimeEntryLike = BuilderRuntimeEntryLike,\n> = {\n DialogShell: ComponentType<RuntimeEntryDialogShellProps>;\n FormFields: ComponentType<RuntimeEntryDialogFieldsProps<NonNullable<TView[\"form\"]>[\"schema\"]>>;\n Actions: ComponentType<RuntimeEntryDialogActionsProps>;\n formClassName?: string;\n SubformField?: ComponentType<\n RuntimeEntryDialogSubformFieldProps<\n NonNullable<NonNullable<TView[\"form\"]>[\"schema\"][\"subforms\"]>[number],\n TEntry\n >\n >;\n useCreateCompositeEntry?(viewId: string): RuntimeMutation<RuntimeCompositeCreateInput>;\n useUpdateCompositeEntry?(\n viewId: string,\n ): RuntimeMutation<{ id: string; input: RuntimeCompositeUpdateInput }>;\n notifications: RuntimeEntryDialogNotifications;\n};\n\nfunction isDbTableSource(\n source: BuilderRuntimeDatasourceLike | undefined,\n): source is { type: \"dbTable\"; tableName: string } {\n return source?.type === \"dbTable\" && \"tableName\" in source;\n}\n\nfunction runtimeViewTableName(view: RuntimeEntryDialogViewLike) {\n const listSource = view.list?.source;\n if (isDbTableSource(listSource)) return listSource.tableName;\n const formSource = view.form?.source;\n return isDbTableSource(formSource) ? formSource.tableName : undefined;\n}\n\nfunction cleanRowValues(values: Record<string, unknown>) {\n return Object.fromEntries(\n Object.entries(values).filter(([key]) => key === \"_delete\" || !key.startsWith(\"_\")),\n );\n}\n\nfunction childRowPayload(row: BuilderRuntimeEntryLike, includeIdentity: boolean) {\n const values = cleanRowValues(row.values);\n if (!includeIdentity || row.values._draftNew === true) return values;\n return {\n id: row.id,\n version: row.version,\n ...values,\n };\n}\n\nexport function createRuntimeEntryDialogComponent<\n TView extends RuntimeEntryDialogViewLike,\n TEntry extends BuilderRuntimeEntryLike,\n TInput extends BuilderRuntimeEntryValues,\n>(deps: RuntimeEntryDialogDependencies<TView, TEntry>) {\n return function RuntimeEntryDialog({\n open,\n view,\n editing,\n onClose,\n onSave,\n isSaving,\n }: RuntimeEntryDialogProps<TView, TEntry, TInput>) {\n const [draftSubforms, setDraftSubforms] = useState<\n Record<string, RuntimeEntryDialogDraftSubform<TEntry>>\n >({});\n const compositeCreate = deps.useCreateCompositeEntry?.(view.id);\n const compositeUpdate = deps.useUpdateCompositeEntry?.(view.id);\n const form = useForm<BuilderRuntimeEntryValues>({\n defaultValues: createBuilderEntryDefaultValues(view, editing),\n values: open ? createBuilderEntryDefaultValues(view, editing) : undefined,\n });\n const mainTableName = runtimeViewTableName(view);\n const hasDraftRows = useMemo(\n () => Object.values(draftSubforms).some((draft) => draft.rows.length > 0),\n [draftSubforms],\n );\n\n useEffect(() => {\n if (open) setDraftSubforms({});\n }, [open]);\n\n const onSubmit = form.handleSubmit(async (values) => {\n try {\n if (!editing && hasDraftRows) {\n if (!mainTableName) throw new Error(\"Main form datasource table олдсонгүй\");\n if (!compositeCreate) throw new Error(\"Composite create handler тохируулагдаагүй байна\");\n await compositeCreate.mutateAsync({\n data: {\n [mainTableName]: values.values,\n ...Object.fromEntries(\n Object.values(draftSubforms).map((draft) => [\n draft.dataKey,\n draft.rows\n .filter((row) => row.values._delete !== true)\n .map((row) => childRowPayload(row, false)),\n ]),\n ),\n },\n });\n } else if (editing && hasDraftRows) {\n if (!mainTableName) throw new Error(\"Main form datasource table олдсонгүй\");\n if (!compositeUpdate) throw new Error(\"Composite update handler тохируулагдаагүй байна\");\n await compositeUpdate.mutateAsync({\n id: editing.id,\n input: {\n data: {\n [mainTableName]: {\n id: editing.id,\n version: values.version,\n ...values.values,\n },\n ...Object.fromEntries(\n Object.values(draftSubforms).map((draft) => [\n draft.dataKey,\n draft.rows.map((row) => childRowPayload(row, true)),\n ]),\n ),\n },\n },\n });\n } else {\n await onSave({ id: editing?.id, input: values as TInput });\n }\n onClose();\n deps.notifications.success(editing ? \"Мөр хадгалагдлаа\" : \"Мөр нэмэгдлээ\");\n } catch (error) {\n deps.notifications.error(deps.notifications.errorMessage(error, \"Хадгалахад алдаа гарлаа\"));\n }\n });\n\n const saving = isSaving || Boolean(compositeCreate?.isPending || compositeUpdate?.isPending);\n const extraItems: RuntimeEntryDialogExtraItem[] | undefined =\n deps.SubformField && view.form?.schema.subforms?.length\n ? view.form.schema.subforms.map((subform) => ({\n key: subform.key,\n render: () =>\n deps.SubformField ? (\n <deps.SubformField\n subform={subform}\n parentEntry={editing}\n draftRows={draftSubforms[subform.key]?.rows ?? []}\n onDraftRowsChange={({ subformKey, dataKey, rows }) => {\n setDraftSubforms((current) => ({\n ...current,\n [subformKey]: { dataKey, rows: rows as TEntry[] },\n }));\n }}\n />\n ) : null,\n }))\n : undefined;\n\n return (\n <deps.DialogShell\n open={open}\n title={editing ? \"Мөр засах\" : \"Мөр нэмэх\"}\n description={view.title}\n onClose={onClose}\n >\n <FormProvider {...form}>\n <form onSubmit={onSubmit} noValidate className={deps.formClassName}>\n {view.form ? (\n <deps.FormFields\n formId={view.form.id}\n viewId={view.id}\n entry={editing}\n schema={view.form.schema}\n namePrefix=\"values\"\n extraItems={extraItems}\n />\n ) : null}\n <deps.Actions isSaving={saving} onClose={onClose} />\n </form>\n </FormProvider>\n </deps.DialogShell>\n );\n };\n}\n","\"use client\";\n\nimport type { ComponentType, ReactNode } from \"react\";\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport { FormProvider, useForm } from \"react-hook-form\";\nimport type { BuilderApiContracts } from \"../api\";\nimport type { BuilderHooks } from \"../hooks\";\nimport {\n type BuilderRuntimeEntryLike,\n type BuilderRuntimeEntryValues,\n type BuilderRuntimeFormSchemaLike,\n createBuilderEntryDefaultValues,\n} from \"../runtime\";\nimport type { RuntimeEntryDialogDraftRowsChange } from \"./RuntimeEntryDialog\";\n\ntype RuntimeDatasourceLike =\n | {\n type: \"dbTable\";\n tableName: string;\n }\n | {\n type: string;\n }\n | null;\n\nexport type RuntimeSubformLike = {\n key: string;\n label: string;\n viewId: string;\n parentField: string;\n childField: string;\n buttonLabel?: string;\n};\n\nexport type RuntimeSubformViewLike = {\n id: string;\n title: string;\n form?: {\n id: string;\n schema: BuilderRuntimeFormSchemaLike;\n } | null;\n list?: {\n source?: RuntimeDatasourceLike;\n schema: {\n columns: readonly {\n key: string;\n label: string;\n sortable: boolean;\n align: \"left\" | \"right\";\n }[];\n };\n } | null;\n};\n\nexport type RuntimeSubformEntryLike = BuilderRuntimeEntryLike & {\n viewId: string;\n createdAt: string;\n updatedAt: string;\n};\n\ntype RuntimeSubformContracts = BuilderApiContracts & {\n BuilderView: RuntimeSubformViewLike;\n BuilderViewEntry: RuntimeSubformEntryLike;\n ListBuilderViewEntriesResponse: {\n items: RuntimeSubformEntryLike[];\n total: number;\n };\n UpdateBuilderViewEntryInput: BuilderRuntimeEntryValues;\n};\n\ntype ParentEntryLike = {\n id: string;\n values: Record<string, unknown>;\n};\n\nexport type RuntimeSubformFieldProps<TSubform, TEntry> = {\n subform: TSubform;\n parentEntry?: ParentEntryLike | null;\n draftRows?: TEntry[];\n onDraftRowsChange?(args: RuntimeEntryDialogDraftRowsChange<TEntry>): void;\n};\n\nexport type RuntimeSubformShellProps = {\n label: string;\n buttonLabel: string;\n canOpen: boolean;\n missingParentDescription?: ReactNode;\n onAdd(): void;\n children: ReactNode;\n};\n\nexport type RuntimeSubformDataPanelProps<TController, TEntry> = {\n controller: TController;\n isLoading: boolean;\n showDraftDelete: boolean;\n onRowClick(entry: TEntry): void;\n onDeleteSelected(): void;\n};\n\nexport type RuntimeSubformDialogShellProps = {\n open: boolean;\n title: string;\n description: string;\n onClose(): void;\n children: ReactNode;\n};\n\nexport type RuntimeSubformDialogFieldsProps<TSchema> = {\n formId: string;\n viewId: string;\n schema: TSchema;\n namePrefix: \"values\";\n};\n\nexport type RuntimeSubformDialogActionsProps = {\n isSaving: boolean;\n onClose(): void;\n};\n\nexport type RuntimeSubformNotifications = {\n success(message: string): void;\n error(message: string): void;\n errorMessage(error: unknown, fallback: string): string;\n};\n\nexport type RuntimeSubformFieldDependencies<\n C extends RuntimeSubformContracts,\n TColumn,\n TState extends { query: C[\"ListBuilderViewEntriesQuery\"] },\n TController extends { selectedIds: string[]; clearSelection(): void },\n> = {\n hooks: Pick<\n BuilderHooks<C>,\n \"useBuilderViewEntries\" | \"useRuntimeBuilderView\" | \"useSaveBuilderViewEntry\"\n >;\n buildColumns(view: C[\"BuilderView\"]): TColumn[];\n useDataTableState(args?: { pageSize?: number }): TState;\n useDataTable(args: {\n columns: TColumn[];\n data: C[\"BuilderViewEntry\"][];\n rowCount: number;\n state: TState;\n getRowId(row: C[\"BuilderViewEntry\"]): string;\n }): TController;\n Shell: ComponentType<RuntimeSubformShellProps>;\n DataPanel: ComponentType<RuntimeSubformDataPanelProps<TController, C[\"BuilderViewEntry\"]>>;\n DialogShell: ComponentType<RuntimeSubformDialogShellProps>;\n DialogFields: ComponentType<\n RuntimeSubformDialogFieldsProps<NonNullable<C[\"BuilderView\"][\"form\"]>[\"schema\"]>\n >;\n DialogActions: ComponentType<RuntimeSubformDialogActionsProps>;\n dialogFormClassName?: string;\n notifications: RuntimeSubformNotifications;\n};\n\nfunction subformButtonLabel(subform: RuntimeSubformLike) {\n return subform.buttonLabel?.trim() || subform.label;\n}\n\nfunction parentValue(entry: ParentEntryLike | null | undefined, field: string) {\n if (!entry) return undefined;\n const value = field === \"id\" ? entry.id : entry.values[field];\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\" || typeof value === \"boolean\") return String(value);\n return undefined;\n}\n\nfunction isDbTableSource(\n source: RuntimeDatasourceLike | undefined,\n): source is { type: \"dbTable\"; tableName: string } {\n return source?.type === \"dbTable\" && \"tableName\" in source;\n}\n\nfunction subformFallbackKey(view: RuntimeSubformViewLike) {\n return view.id;\n}\n\nfunction viewTableName(view: RuntimeSubformViewLike) {\n const source = view.list?.source;\n return isDbTableSource(source) ? source.tableName : subformFallbackKey(view);\n}\n\nfunction draftEntry<TEntry extends RuntimeSubformEntryLike>(\n values: BuilderRuntimeEntryValues,\n editing: TEntry | null,\n) {\n const now = new Date().toISOString();\n return {\n id: editing?.id ?? crypto.randomUUID(),\n viewId: editing?.viewId ?? \"\",\n values: editing ? values.values : { ...values.values, _draftNew: true },\n version: editing?.version ?? 0,\n createdAt: editing?.createdAt ?? now,\n updatedAt: now,\n } satisfies RuntimeSubformEntryLike;\n}\n\ntype RuntimeSubformEntryDialogProps<C extends RuntimeSubformContracts> = {\n open: boolean;\n title: string;\n view: C[\"BuilderView\"];\n childField: string;\n parentValue?: string;\n editing: C[\"BuilderViewEntry\"] | null;\n isSaving: boolean;\n deps: Pick<\n RuntimeSubformFieldDependencies<\n C,\n unknown,\n { query: C[\"ListBuilderViewEntriesQuery\"] },\n { selectedIds: string[]; clearSelection(): void }\n >,\n \"DialogActions\" | \"DialogFields\" | \"DialogShell\" | \"dialogFormClassName\" | \"notifications\"\n >;\n onClose(): void;\n onSave(args: { id?: string; input: C[\"UpdateBuilderViewEntryInput\"] }): Promise<unknown>;\n};\n\nfunction RuntimeSubformEntryDialog<C extends RuntimeSubformContracts>({\n open,\n title,\n view,\n childField,\n parentValue: linkedParentValue,\n editing,\n isSaving,\n deps,\n onClose,\n onSave,\n}: RuntimeSubformEntryDialogProps<C>) {\n const defaultValues = useMemo(() => {\n const values = createBuilderEntryDefaultValues(view, editing);\n if (linkedParentValue) {\n values.values[childField] = editing?.values[childField] ?? linkedParentValue;\n }\n return values;\n }, [childField, editing, linkedParentValue, view]);\n const form = useForm<BuilderRuntimeEntryValues>({\n defaultValues,\n values: open ? defaultValues : undefined,\n });\n\n const onSubmit = form.handleSubmit(async (values) => {\n try {\n await onSave({\n id: editing?.id,\n input: {\n ...values,\n values: {\n ...values.values,\n ...(linkedParentValue ? { [childField]: linkedParentValue } : {}),\n },\n } as C[\"UpdateBuilderViewEntryInput\"],\n });\n onClose();\n deps.notifications.success(editing ? \"Section хадгалагдлаа\" : \"Section нэмэгдлээ\");\n } catch (error) {\n deps.notifications.error(\n deps.notifications.errorMessage(error, \"Subform хадгалахад алдаа гарлаа\"),\n );\n }\n });\n\n return (\n <deps.DialogShell open={open} title={title} description={view.title} onClose={onClose}>\n <FormProvider {...form}>\n <form\n className={deps.dialogFormClassName}\n onSubmit={(event) => {\n event.stopPropagation();\n void onSubmit(event);\n }}\n noValidate\n >\n {view.form ? (\n <deps.DialogFields\n formId={view.form.id}\n viewId={view.id}\n schema={view.form.schema}\n namePrefix=\"values\"\n />\n ) : null}\n <deps.DialogActions isSaving={isSaving} onClose={onClose} />\n </form>\n </FormProvider>\n </deps.DialogShell>\n );\n}\n\nexport function createRuntimeSubformFieldComponent<\n C extends RuntimeSubformContracts,\n TSubform extends RuntimeSubformLike,\n TColumn,\n TState extends { query: C[\"ListBuilderViewEntriesQuery\"] },\n TController extends { selectedIds: string[]; clearSelection(): void },\n>(deps: RuntimeSubformFieldDependencies<C, TColumn, TState, TController>) {\n return function RuntimeSubformField({\n subform,\n parentEntry,\n draftRows = [],\n onDraftRowsChange,\n }: RuntimeSubformFieldProps<TSubform, C[\"BuilderViewEntry\"]>) {\n const [isEntryDialogOpen, setEntryDialogOpen] = useState(false);\n const [editing, setEditing] = useState<C[\"BuilderViewEntry\"] | null>(null);\n const initializedDraft = useRef(false);\n const linkedValue = parentValue(parentEntry, subform.parentField);\n const isDraftMode = Boolean(onDraftRowsChange);\n const canFetchBackendRows = Boolean(linkedValue);\n const canUseBackendRows = canFetchBackendRows && !isDraftMode;\n const isReady = Boolean(\n subform.viewId && subform.childField && (linkedValue || onDraftRowsChange),\n );\n const tableState = deps.useDataTableState({ pageSize: 5 });\n const query = useMemo<C[\"ListBuilderViewEntriesQuery\"]>(\n () =>\n ({\n ...tableState.query,\n filterField: subform.childField,\n filterValue: linkedValue ?? \"\",\n }) as C[\"ListBuilderViewEntriesQuery\"],\n [linkedValue, subform.childField, tableState.query],\n );\n const viewQuery = deps.hooks.useRuntimeBuilderView(subform.viewId, Boolean(subform.viewId));\n const entriesQuery = deps.hooks.useBuilderViewEntries(\n subform.viewId,\n query,\n isReady && (canUseBackendRows || (isDraftMode && canFetchBackendRows)),\n );\n const save = deps.hooks.useSaveBuilderViewEntry(subform.viewId);\n const view = viewQuery.data as C[\"BuilderView\"] | undefined;\n const columns = useMemo(() => (view ? deps.buildColumns(view) : []), [view]);\n const rows = (canUseBackendRows ? (entriesQuery.data?.items ?? []) : draftRows).filter(\n (row) => row.values._delete !== true,\n );\n const table = deps.useDataTable({\n columns,\n data: rows,\n rowCount: canUseBackendRows ? (entriesQuery.data?.total ?? 0) : rows.length,\n state: tableState,\n getRowId: (row) => row.id,\n });\n const canOpen = isReady && Boolean(view?.form) && !viewQuery.isPending;\n const selectedIds = new Set(table.selectedIds);\n\n useEffect(() => {\n if (!isDraftMode || !view || initializedDraft.current || !entriesQuery.data) return;\n initializedDraft.current = true;\n onDraftRowsChange?.({\n subformKey: subform.key,\n dataKey: viewTableName(view),\n rows: entriesQuery.data.items,\n });\n }, [entriesQuery.data, isDraftMode, onDraftRowsChange, subform.key, view]);\n\n return (\n <deps.Shell\n label={subform.label}\n buttonLabel={subformButtonLabel(subform)}\n canOpen={canOpen}\n missingParentDescription={\n !linkedValue && !onDraftRowsChange\n ? `Эхлээд parent мөрийг хадгална, эсвэл ${subform.parentField} талбарын утгыг бөглөнө.`\n : undefined\n }\n onAdd={() => {\n setEditing(null);\n setEntryDialogOpen(true);\n }}\n >\n {view?.list && (linkedValue || draftRows.length > 0) ? (\n <deps.DataPanel\n controller={table}\n isLoading={viewQuery.isPending || (canUseBackendRows && entriesQuery.isPending)}\n showDraftDelete={isDraftMode && table.selectedIds.length > 0}\n onRowClick={(entry) => {\n setEditing(entry);\n setEntryDialogOpen(true);\n }}\n onDeleteSelected={() => {\n if (!view) return;\n onDraftRowsChange?.({\n subformKey: subform.key,\n dataKey: viewTableName(view),\n rows: draftRows\n .filter((row) => !(selectedIds.has(row.id) && row.values._draftNew === true))\n .map((row) =>\n selectedIds.has(row.id)\n ? { ...row, values: { ...row.values, _delete: true } }\n : row,\n ),\n });\n table.clearSelection();\n }}\n />\n ) : null}\n\n {view ? (\n <RuntimeSubformEntryDialog<C>\n open={isEntryDialogOpen}\n title={subform.label}\n view={view}\n childField={subform.childField}\n parentValue={linkedValue}\n editing={editing}\n isSaving={canUseBackendRows ? save.isPending : false}\n deps={deps}\n onClose={() => {\n setEntryDialogOpen(false);\n setEditing(null);\n }}\n onSave={async (args) => {\n if (!isDraftMode && canUseBackendRows) {\n await save.mutateAsync(args);\n await entriesQuery.refetch();\n return;\n }\n if (!onDraftRowsChange) return;\n const nextEntry = {\n ...draftEntry(args.input, editing),\n viewId: view.id,\n } as C[\"BuilderViewEntry\"];\n onDraftRowsChange({\n subformKey: subform.key,\n dataKey: viewTableName(view),\n rows: editing\n ? draftRows.map((row) => (row.id === editing.id ? nextEntry : row))\n : [...draftRows, nextEntry],\n });\n }}\n />\n ) : null}\n </deps.Shell>\n );\n };\n}\n","\"use client\";\n\nimport { keepPreviousData, useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport type { BuilderApiClient, BuilderApiContracts } from \"../api\";\n\nexport function createBuilderKeys<C extends BuilderApiContracts>() {\n const builderKeys = {\n forms: [\"builder\", \"forms\"] as const,\n dbTables: () => [\"builder\", \"datasources\", \"tables\"] as const,\n formList: (query: C[\"ListBuilderFormsQuery\"]) => [...builderKeys.forms, \"list\", query] as const,\n form: (id: string) => [...builderKeys.forms, \"detail\", id] as const,\n formOptions: () => [...builderKeys.forms, \"options\"] as const,\n lists: [\"builder\", \"lists\"] as const,\n listList: (query: C[\"ListBuilderListsQuery\"]) => [...builderKeys.lists, \"list\", query] as const,\n list: (id: string) => [...builderKeys.lists, \"detail\", id] as const,\n listOptions: () => [...builderKeys.lists, \"options\"] as const,\n views: [\"builder\", \"views\"] as const,\n viewList: (query: C[\"ListBuilderViewsQuery\"]) => [...builderKeys.views, \"list\", query] as const,\n runtimeForm: (id: string) => [\"builder\", \"runtime\", \"form\", id] as const,\n runtimeFieldOptions: (\n formId: string,\n fieldKey: string,\n query: C[\"ListBuilderFieldOptionsQuery\"],\n ) => [...builderKeys.runtimeForm(formId), \"fields\", fieldKey, \"options\", query] as const,\n runtimeFormEntries: (id: string) => [...builderKeys.runtimeForm(id), \"entries\"] as const,\n runtimeList: (id: string) => [\"builder\", \"runtime\", \"list\", id] as const,\n runtimeListEntries: (id: string, query: C[\"ListBuilderViewEntriesQuery\"]) =>\n [...builderKeys.runtimeList(id), \"entries\", query] as const,\n runtimeView: (id: string) => [\"builder\", \"runtime\", \"view\", id] as const,\n entries: (id: string, query: C[\"ListBuilderViewEntriesQuery\"]) =>\n [...builderKeys.runtimeView(id), \"entries\", query] as const,\n };\n\n return builderKeys;\n}\n\nexport function createBuilderHooks<C extends BuilderApiContracts>(client: BuilderApiClient<C>) {\n const builderKeys = createBuilderKeys<C>();\n\n function invalidateRuntimeViewEntries(\n queryClient: ReturnType<typeof useQueryClient>,\n viewId: string,\n ) {\n return Promise.all([\n queryClient.invalidateQueries({ queryKey: builderKeys.runtimeView(viewId) }),\n queryClient.invalidateQueries({ queryKey: [...builderKeys.runtimeView(viewId), \"entries\"] }),\n ]);\n }\n\n function useBuilderDbTables() {\n return useQuery({ queryKey: builderKeys.dbTables(), queryFn: client.listBuilderDbTables });\n }\n\n function useBuilderForms(query: C[\"ListBuilderFormsQuery\"]) {\n return useQuery({\n queryKey: builderKeys.formList(query),\n queryFn: () => client.listBuilderForms(query),\n placeholderData: keepPreviousData,\n });\n }\n\n function useBuilderFormOptions() {\n return useQuery({\n queryKey: builderKeys.formOptions(),\n queryFn: client.listBuilderFormOptions,\n });\n }\n\n function useBuilderForm(id?: string) {\n return useQuery({\n queryKey: builderKeys.form(id ?? \"\"),\n queryFn: () => client.getBuilderForm(id ?? \"\"),\n enabled: Boolean(id),\n });\n }\n\n function useSaveBuilderForm() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ id, input }: { id?: string; input: C[\"UpdateBuilderFormInput\"] }) =>\n id\n ? client.updateBuilderForm(id, input)\n : client.createBuilderForm(input as unknown as C[\"CreateBuilderFormInput\"]),\n onSuccess: (form) => {\n queryClient.invalidateQueries({ queryKey: builderKeys.forms });\n queryClient.invalidateQueries({ queryKey: builderKeys.form(form.id) });\n queryClient.invalidateQueries({ queryKey: builderKeys.runtimeForm(form.id) });\n },\n });\n }\n\n function useReplicateBuilderForm() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ id, input }: { id: string; input: C[\"ReplicateBuilderEntityInput\"] }) =>\n client.replicateBuilderForm(id, input),\n onSuccess: () => queryClient.invalidateQueries({ queryKey: builderKeys.forms }),\n });\n }\n\n function useDeleteBuilderForm() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: client.deleteBuilderForm,\n onSuccess: () => queryClient.invalidateQueries({ queryKey: builderKeys.forms }),\n });\n }\n\n function useBuilderLists(query: C[\"ListBuilderListsQuery\"]) {\n return useQuery({\n queryKey: builderKeys.listList(query),\n queryFn: () => client.listBuilderLists(query),\n placeholderData: keepPreviousData,\n });\n }\n\n function useBuilderListOptions() {\n return useQuery({\n queryKey: builderKeys.listOptions(),\n queryFn: client.listBuilderListOptions,\n });\n }\n\n function useBuilderList(id?: string) {\n return useQuery({\n queryKey: builderKeys.list(id ?? \"\"),\n queryFn: () => client.getBuilderList(id ?? \"\"),\n enabled: Boolean(id),\n });\n }\n\n function useSaveBuilderList() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ id, input }: { id?: string; input: C[\"UpdateBuilderListInput\"] }) =>\n id\n ? client.updateBuilderList(id, input)\n : client.createBuilderList(input as unknown as C[\"CreateBuilderListInput\"]),\n onSuccess: (list) => {\n queryClient.invalidateQueries({ queryKey: builderKeys.lists });\n queryClient.invalidateQueries({ queryKey: builderKeys.list(list.id) });\n queryClient.invalidateQueries({ queryKey: builderKeys.runtimeList(list.id) });\n },\n });\n }\n\n function useReplicateBuilderList() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ id, input }: { id: string; input: C[\"ReplicateBuilderEntityInput\"] }) =>\n client.replicateBuilderList(id, input),\n onSuccess: () => queryClient.invalidateQueries({ queryKey: builderKeys.lists }),\n });\n }\n\n function useDeleteBuilderList() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: client.deleteBuilderList,\n onSuccess: () => queryClient.invalidateQueries({ queryKey: builderKeys.lists }),\n });\n }\n\n function useBuilderViews(query: C[\"ListBuilderViewsQuery\"]) {\n return useQuery({\n queryKey: builderKeys.viewList(query),\n queryFn: () => client.listBuilderViews(query),\n placeholderData: keepPreviousData,\n });\n }\n\n function useSaveBuilderView() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ id, input }: { id?: string; input: C[\"UpdateBuilderViewInput\"] }) =>\n id\n ? client.updateBuilderView(id, input)\n : client.createBuilderView(input as unknown as C[\"CreateBuilderViewInput\"]),\n onSuccess: () => queryClient.invalidateQueries({ queryKey: builderKeys.views }),\n });\n }\n\n function useReplicateBuilderView() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ id, input }: { id: string; input: C[\"ReplicateBuilderEntityInput\"] }) =>\n client.replicateBuilderView(id, input),\n onSuccess: () => queryClient.invalidateQueries({ queryKey: builderKeys.views }),\n });\n }\n\n function useDeleteBuilderView() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: client.deleteBuilderView,\n onSuccess: () => queryClient.invalidateQueries({ queryKey: builderKeys.views }),\n });\n }\n\n function useRuntimeBuilderForm(id: string) {\n return useQuery({\n queryKey: builderKeys.runtimeForm(id),\n queryFn: () => client.getRuntimeBuilderForm(id),\n });\n }\n\n function useRuntimeBuilderFormFieldOptions(\n formId: string | undefined,\n fieldKey: string,\n query: C[\"ListBuilderFieldOptionsQuery\"],\n enabled = true,\n ) {\n return useQuery({\n queryKey: builderKeys.runtimeFieldOptions(formId ?? \"\", fieldKey, query),\n queryFn: () => client.listRuntimeBuilderFormFieldOptions(formId ?? \"\", fieldKey, query),\n enabled: Boolean(formId) && enabled,\n });\n }\n\n function useRunRuntimeBuilderFieldTrigger() {\n return useMutation({\n mutationFn: (args: {\n formId?: string;\n viewId?: string;\n fieldKey: string;\n event: C[\"BuilderFieldTriggerEvent\"];\n input: C[\"RunBuilderFieldTriggerInput\"];\n }) => {\n if (args.viewId) {\n return client.runRuntimeBuilderViewFieldTrigger(\n args.viewId,\n args.fieldKey,\n args.event,\n args.input,\n );\n }\n if (args.formId) {\n return client.runRuntimeBuilderFormFieldTrigger(\n args.formId,\n args.fieldKey,\n args.event,\n args.input,\n );\n }\n throw new Error(\"formId эсвэл viewId шаардлагатай\");\n },\n });\n }\n\n function useRuntimeBuilderList(id: string) {\n return useQuery({\n queryKey: builderKeys.runtimeList(id),\n queryFn: () => client.getRuntimeBuilderList(id),\n });\n }\n\n function useRuntimeBuilderListEntries(id: string, query: C[\"ListBuilderViewEntriesQuery\"]) {\n return useQuery({\n queryKey: builderKeys.runtimeListEntries(id, query),\n queryFn: () => client.listRuntimeBuilderListEntries(id, query),\n placeholderData: keepPreviousData,\n });\n }\n\n function useSaveRuntimeBuilderFormEntry(formId: string) {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (input: C[\"CreateBuilderViewEntryInput\"]) =>\n client.createRuntimeBuilderFormEntry(formId, input),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: builderKeys.runtimeFormEntries(formId) });\n queryClient.invalidateQueries({ queryKey: builderKeys.runtimeForm(formId) });\n queryClient.invalidateQueries({ queryKey: [\"builder\", \"runtime\", \"list\"] });\n },\n });\n }\n\n function useRuntimeBuilderView(id: string, enabled = true) {\n return useQuery({\n queryKey: builderKeys.runtimeView(id),\n queryFn: () => client.getRuntimeBuilderView(id),\n enabled: Boolean(id) && enabled,\n });\n }\n\n function useBuilderViewEntries(\n id: string,\n query: C[\"ListBuilderViewEntriesQuery\"],\n enabled = true,\n ) {\n return useQuery({\n queryKey: builderKeys.entries(id, query),\n queryFn: () => client.listBuilderViewEntries(id, query),\n placeholderData: keepPreviousData,\n enabled: Boolean(id) && enabled,\n });\n }\n\n function useSaveBuilderViewEntry(viewId: string) {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({ id, input }: { id?: string; input: C[\"UpdateBuilderViewEntryInput\"] }) =>\n id\n ? client.updateBuilderViewEntry(viewId, id, input)\n : client.createBuilderViewEntry(\n viewId,\n input as unknown as C[\"CreateBuilderViewEntryInput\"],\n ),\n onSuccess: () => invalidateRuntimeViewEntries(queryClient, viewId),\n });\n }\n\n function useCreateCompositeBuilderViewEntry(viewId: string) {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (input: C[\"CreateCompositeBuilderViewEntryInput\"]) =>\n client.createCompositeBuilderViewEntry(viewId, input),\n onSuccess: () => invalidateRuntimeViewEntries(queryClient, viewId),\n });\n }\n\n function useUpdateCompositeBuilderViewEntry(viewId: string) {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: ({\n id,\n input,\n }: {\n id: string;\n input: C[\"UpdateCompositeBuilderViewEntryInput\"];\n }) => client.updateCompositeBuilderViewEntry(viewId, id, input),\n onSuccess: () => invalidateRuntimeViewEntries(queryClient, viewId),\n });\n }\n\n function useDeleteBuilderViewEntry(id: string) {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (entryId: string) => client.deleteBuilderViewEntry(id, entryId),\n onSuccess: () => invalidateRuntimeViewEntries(queryClient, id),\n });\n }\n\n return {\n builderKeys,\n useBuilderDbTables,\n useBuilderForm,\n useBuilderFormOptions,\n useBuilderForms,\n useBuilderList,\n useBuilderListOptions,\n useBuilderLists,\n useBuilderViewEntries,\n useBuilderViews,\n useDeleteBuilderForm,\n useDeleteBuilderList,\n useDeleteBuilderView,\n useDeleteBuilderViewEntry,\n useCreateCompositeBuilderViewEntry,\n useReplicateBuilderForm,\n useReplicateBuilderList,\n useReplicateBuilderView,\n useRuntimeBuilderForm,\n useRuntimeBuilderFormFieldOptions,\n useRuntimeBuilderList,\n useRuntimeBuilderListEntries,\n useRuntimeBuilderView,\n useRunRuntimeBuilderFieldTrigger,\n useSaveBuilderForm,\n useSaveBuilderList,\n useSaveBuilderView,\n useSaveBuilderViewEntry,\n useSaveRuntimeBuilderFormEntry,\n useUpdateCompositeBuilderViewEntry,\n };\n}\n\nexport type BuilderHooks<C extends BuilderApiContracts> = ReturnType<typeof createBuilderHooks<C>>;\n","export const builderUiPackage = {\n name: \"@duke333/builder-ui\",\n version: \"0.1.0\",\n} as const;\n\nexport {\n BUILDER_EDITOR_NONE_VALUE,\n type BuilderEditorDbTable,\n type BuilderEditorSelectOption,\n type BuilderEditorTriggerValues,\n type BuilderEntityDialogManagerDependencies,\n type BuilderEntityManagerActions,\n type BuilderEntityManagerAddButtonProps,\n type BuilderEntityManagerDataGridProps,\n type BuilderEntityManagerDeleteDialogProps,\n type BuilderEntityManagerDependencies,\n type BuilderEntityManagerDialogAddButtonProps,\n type BuilderEntityManagerEditorDialogProps,\n type BuilderEntityManagerEntity,\n type BuilderEntityManagerHookResult,\n type BuilderEntityManagerLabels,\n type BuilderEntityManagerMutation,\n type BuilderFormEditorBodyProps,\n type BuilderFormEditorEntity,\n type BuilderFormEditorFieldValues,\n type BuilderFormEditorPageDependencies,\n type BuilderFormEditorValues,\n type BuilderListEditorBodyProps,\n type BuilderListEditorColumnValues,\n type BuilderListEditorEntity,\n type BuilderListEditorPageDependencies,\n type BuilderListEditorValues,\n type BuilderViewDialogBodyProps,\n type BuilderViewDialogDependencies,\n type BuilderViewDialogProps,\n type BuilderViewDialogShellProps,\n type BuilderViewEditorEntity,\n type BuilderViewEditorValues,\n builderEditorOptionsToText,\n builderEditorSearchFieldsToText,\n builderEditorTextToOptions,\n builderEditorTextToSearchFields,\n builderFormEditorFieldsFromTable,\n builderFormEditorInputFromValues,\n builderFormEditorValuesFromEntity,\n builderListEditorColumnsFromTable,\n builderListEditorInputFromValues,\n builderListEditorValuesFromEntity,\n builderViewEditorInputFromValues,\n builderViewEditorValuesFromEntity,\n createBuilderEntityDialogManagerComponent,\n createBuilderEntityManagerComponent,\n createBuilderFormEditorPageComponent,\n createBuilderListEditorPageComponent,\n createBuilderViewDialogComponent,\n getBuilderEditorTriggerRoute,\n} from \"./admin\";\nexport {\n type BuilderApiClient,\n type BuilderApiContracts,\n type BuilderApiQuery,\n type BuilderApiQueryValue,\n type BuilderApiTransport,\n type BuilderFieldOptionsQuery,\n createBuilderApiClient,\n} from \"./api\";\nexport {\n createDynamicFormComponent,\n createDynamicListComponent,\n createDynamicViewComponent,\n createRuntimeEntryDialogComponent,\n type DynamicFormContracts,\n type DynamicFormDependencies,\n type DynamicFormErrorStateProps,\n type DynamicFormFieldsProps,\n type DynamicFormNotifications,\n type DynamicFormProps,\n type DynamicFormShellProps,\n type DynamicFormSubmitProps,\n type DynamicListContracts,\n type DynamicListDataGridProps,\n type DynamicListDependencies,\n type DynamicListErrorStateProps,\n type DynamicListProps,\n type DynamicViewAddButtonProps,\n type DynamicViewColumnActions,\n type DynamicViewContracts,\n type DynamicViewDataGridProps,\n type DynamicViewDeleteDialogProps,\n type DynamicViewDependencies,\n type DynamicViewEntryDialogProps,\n type DynamicViewErrorStateProps,\n type DynamicViewProps,\n type RuntimeEntryDialogActionsProps,\n type RuntimeEntryDialogDependencies,\n type RuntimeEntryDialogFieldsProps,\n type RuntimeEntryDialogNotifications,\n type RuntimeEntryDialogProps,\n type RuntimeEntryDialogSaveArgs,\n type RuntimeEntryDialogShellProps,\n type RuntimeEntryDialogViewLike,\n} from \"./components\";\nexport { type BuilderHooks, createBuilderHooks, createBuilderKeys } from \"./hooks\";\nexport {\n type BuilderRuntimeEntryLike,\n type BuilderRuntimeEntryValues,\n type BuilderRuntimeFieldLike,\n type BuilderRuntimeFormSchemaLike,\n type BuilderRuntimeFormValues,\n type BuilderRuntimeViewLike,\n createBuilderEntryDefaultValues,\n createBuilderFormDefaultValues,\n formatBuilderRuntimeValue,\n} from \"./runtime\";\n"],"mappings":"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","names":["jsx","useEffect","FormProvider","useForm","jsx","useForm","useEffect","FormProvider","useMemo","FormProvider","useForm","jsx","jsxs","useMemo","useForm","FormProvider","useMemo","jsx","useMemo","useState","jsx","jsxs","useEffect","useMemo","useState","FormProvider","useForm","jsx","jsxs","useState","useForm","useMemo","useEffect","FormProvider","useEffect","useMemo","useState","FormProvider","useForm","jsx","jsxs"]}
@@ -0,0 +1,28 @@
1
+ type BuilderRuntimeFieldLike = {
2
+ key: string;
3
+ type: string;
4
+ };
5
+ type BuilderRuntimeFormSchemaLike = {
6
+ fields: readonly BuilderRuntimeFieldLike[];
7
+ };
8
+ type BuilderRuntimeViewLike = {
9
+ form?: {
10
+ schema: BuilderRuntimeFormSchemaLike;
11
+ } | null;
12
+ };
13
+ type BuilderRuntimeEntryLike = {
14
+ id: string;
15
+ values: Record<string, unknown>;
16
+ version: number;
17
+ };
18
+ type BuilderRuntimeFormValues = {
19
+ values: Record<string, unknown>;
20
+ };
21
+ type BuilderRuntimeEntryValues = BuilderRuntimeFormValues & {
22
+ version: number;
23
+ };
24
+ declare function createBuilderFormDefaultValues(schema?: BuilderRuntimeFormSchemaLike): BuilderRuntimeFormValues;
25
+ declare function createBuilderEntryDefaultValues(view: BuilderRuntimeViewLike, editing: BuilderRuntimeEntryLike | null): BuilderRuntimeEntryValues;
26
+ declare function formatBuilderRuntimeValue(value: unknown, locale?: string): string;
27
+
28
+ export { type BuilderRuntimeEntryLike, type BuilderRuntimeEntryValues, type BuilderRuntimeFieldLike, type BuilderRuntimeFormSchemaLike, type BuilderRuntimeFormValues, type BuilderRuntimeViewLike, createBuilderEntryDefaultValues, createBuilderFormDefaultValues, formatBuilderRuntimeValue };
@@ -0,0 +1,31 @@
1
+ // src/runtime/runtimeUtils.ts
2
+ function emptyFieldValue(field) {
3
+ return field.type === "checkbox" ? false : "";
4
+ }
5
+ function createBuilderFormDefaultValues(schema) {
6
+ const values = {};
7
+ for (const field of schema?.fields ?? []) {
8
+ values[field.key] = emptyFieldValue(field);
9
+ }
10
+ return { values };
11
+ }
12
+ function createBuilderEntryDefaultValues(view, editing) {
13
+ const values = {};
14
+ for (const field of view.form?.schema.fields ?? []) {
15
+ const existing = editing?.values[field.key];
16
+ values[field.key] = existing === void 0 ? emptyFieldValue(field) : existing;
17
+ }
18
+ return { values, version: editing?.version ?? 0 };
19
+ }
20
+ function formatBuilderRuntimeValue(value, locale = "mn-MN") {
21
+ if (value === null || value === void 0 || value === "") return "\u2014";
22
+ if (typeof value === "boolean") return value ? "\u0422\u0438\u0439\u043C" : "\u04AE\u0433\u04AF\u0439";
23
+ if (typeof value === "number") return new Intl.NumberFormat(locale).format(value);
24
+ return String(value);
25
+ }
26
+ export {
27
+ createBuilderEntryDefaultValues,
28
+ createBuilderFormDefaultValues,
29
+ formatBuilderRuntimeValue
30
+ };
31
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/runtime/runtimeUtils.ts"],"sourcesContent":["export type BuilderRuntimeFieldLike = {\n key: string;\n type: string;\n};\n\nexport type BuilderRuntimeFormSchemaLike = {\n fields: readonly BuilderRuntimeFieldLike[];\n};\n\nexport type BuilderRuntimeViewLike = {\n form?: {\n schema: BuilderRuntimeFormSchemaLike;\n } | null;\n};\n\nexport type BuilderRuntimeEntryLike = {\n id: string;\n values: Record<string, unknown>;\n version: number;\n};\n\nexport type BuilderRuntimeFormValues = {\n values: Record<string, unknown>;\n};\n\nexport type BuilderRuntimeEntryValues = BuilderRuntimeFormValues & {\n version: number;\n};\n\nfunction emptyFieldValue(field: BuilderRuntimeFieldLike) {\n return field.type === \"checkbox\" ? false : \"\";\n}\n\nexport function createBuilderFormDefaultValues(\n schema?: BuilderRuntimeFormSchemaLike,\n): BuilderRuntimeFormValues {\n const values: Record<string, unknown> = {};\n for (const field of schema?.fields ?? []) {\n values[field.key] = emptyFieldValue(field);\n }\n return { values };\n}\n\nexport function createBuilderEntryDefaultValues(\n view: BuilderRuntimeViewLike,\n editing: BuilderRuntimeEntryLike | null,\n): BuilderRuntimeEntryValues {\n const values: Record<string, unknown> = {};\n for (const field of view.form?.schema.fields ?? []) {\n const existing = editing?.values[field.key];\n values[field.key] = existing === undefined ? emptyFieldValue(field) : existing;\n }\n return { values, version: editing?.version ?? 0 };\n}\n\nexport function formatBuilderRuntimeValue(value: unknown, locale = \"mn-MN\") {\n if (value === null || value === undefined || value === \"\") return \"—\";\n if (typeof value === \"boolean\") return value ? \"Тийм\" : \"Үгүй\";\n if (typeof value === \"number\") return new Intl.NumberFormat(locale).format(value);\n return String(value);\n}\n"],"mappings":";AA6BA,SAAS,gBAAgB,OAAgC;AACvD,SAAO,MAAM,SAAS,aAAa,QAAQ;AAC7C;AAEO,SAAS,+BACd,QAC0B;AAC1B,QAAM,SAAkC,CAAC;AACzC,aAAW,SAAS,QAAQ,UAAU,CAAC,GAAG;AACxC,WAAO,MAAM,GAAG,IAAI,gBAAgB,KAAK;AAAA,EAC3C;AACA,SAAO,EAAE,OAAO;AAClB;AAEO,SAAS,gCACd,MACA,SAC2B;AAC3B,QAAM,SAAkC,CAAC;AACzC,aAAW,SAAS,KAAK,MAAM,OAAO,UAAU,CAAC,GAAG;AAClD,UAAM,WAAW,SAAS,OAAO,MAAM,GAAG;AAC1C,WAAO,MAAM,GAAG,IAAI,aAAa,SAAY,gBAAgB,KAAK,IAAI;AAAA,EACxE;AACA,SAAO,EAAE,QAAQ,SAAS,SAAS,WAAW,EAAE;AAClD;AAEO,SAAS,0BAA0B,OAAgB,SAAS,SAAS;AAC1E,MAAI,UAAU,QAAQ,UAAU,UAAa,UAAU,GAAI,QAAO;AAClE,MAAI,OAAO,UAAU,UAAW,QAAO,QAAQ,6BAAS;AACxD,MAAI,OAAO,UAAU,SAAU,QAAO,IAAI,KAAK,aAAa,MAAM,EAAE,OAAO,KAAK;AAChF,SAAO,OAAO,KAAK;AACrB;","names":[]}
package/package.json ADDED
@@ -0,0 +1,61 @@
1
+ {
2
+ "name": "@duke333/builder-ui",
3
+ "version": "0.1.0",
4
+ "description": "React UI, hooks, and runtime helpers for Winu Builder.",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "main": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "files": [
10
+ "dist"
11
+ ],
12
+ "publishConfig": {
13
+ "access": "public"
14
+ },
15
+ "exports": {
16
+ ".": {
17
+ "types": "./dist/index.d.ts",
18
+ "import": "./dist/index.js"
19
+ },
20
+ "./admin": {
21
+ "types": "./dist/admin/index.d.ts",
22
+ "import": "./dist/admin/index.js"
23
+ },
24
+ "./api": {
25
+ "types": "./dist/api/index.d.ts",
26
+ "import": "./dist/api/index.js"
27
+ },
28
+ "./components": {
29
+ "types": "./dist/components/index.d.ts",
30
+ "import": "./dist/components/index.js"
31
+ },
32
+ "./hooks": {
33
+ "types": "./dist/hooks/index.d.ts",
34
+ "import": "./dist/hooks/index.js"
35
+ },
36
+ "./runtime": {
37
+ "types": "./dist/runtime/index.d.ts",
38
+ "import": "./dist/runtime/index.js"
39
+ }
40
+ },
41
+ "devDependencies": {
42
+ "@tanstack/react-query": "^5.101.4",
43
+ "@types/react": "^19",
44
+ "react-hook-form": "7.85.0",
45
+ "tsup": "^8.5.1",
46
+ "typescript": "^5",
47
+ "vitest": "^4.1.10"
48
+ },
49
+ "peerDependencies": {
50
+ "@tanstack/react-query": "^5.101.4",
51
+ "react": ">=18.2.0 <20",
52
+ "react-dom": ">=18.2.0 <20",
53
+ "react-hook-form": ">=7.85.0 <8"
54
+ },
55
+ "scripts": {
56
+ "build": "tsup",
57
+ "typecheck": "tsc --noEmit",
58
+ "test": "vitest",
59
+ "test:run": "vitest --run --passWithNoTests"
60
+ }
61
+ }