/** * Form builder extension registry. * Extensions (e.g. welcome page from ivyforms-pro) register storage keys, defaults, and persistence rules. */ export type FormBuilderCanvasPlacement = 'prepend' | 'append' export interface FormBuilderExtension { /** Stable extension id (e.g. welcomePage). */ id: string /** Key on API payload / form extensionData map. */ storageKey: string getDefaults: () => Record normalize: (raw: Record | null | undefined) => Record /** When omitted, extension data is never auto-included on save. */ isActiveForFormType?: (formType: string) => boolean /** Passed to ivyforms/form_builder/settings_panel_component filter context. */ settingsPanelContext?: string /** When set, extension owns a builder canvas block at this placement (`id` is the selection id). */ builderCanvas?: FormBuilderCanvasPlacement } const extensions: FormBuilderExtension[] = [] export function registerFormBuilderExtension(extension: FormBuilderExtension): void { if (extensions.some((e) => e.id === extension.id)) { return } extensions.push(extension) } export function getFormBuilderExtensions(): readonly FormBuilderExtension[] { return extensions } export function getFormBuilderExtension(id: string): FormBuilderExtension | undefined { return extensions.find((e) => e.id === id) }