{"version":3,"file":"index.mjs","names":["actions: DropdownAction[]","onBootHandlers: OnBootHandler[]","onBeforeItemUpsertHandlers: OnBeforeItemUpsertHandler[]","onBeforeItemsDestroyHandlers: OnBeforeItemsDestroyHandler[]","onBeforeItemsPublishHandlers: OnBeforeItemsPublishHandler[]","onBeforeItemsUnpublishHandlers: OnBeforeItemsUnpublishHandler[]","overrides: FieldExtensionOverrideConfig[]","hiddenFieldPredicates: HiddenFieldPredicate[]","extension: ManualFieldExtension","result: FieldExtensionOverride","mainNavTabs: MainNavigationTabConfig[]","contentAreaItems: ContentAreaSidebarItemConfig[]","result: ItemFormSidebarPanel","result: ItemFormSidebar","config: Partial<FullConnectParameters>","internalConfig: PluginInternalConfig","connect","sdkConnect","apiKey: string | undefined | null","allFields: string[]"],"sources":["../src/registration/config.tsx","../src/utils/validation.ts","../src/registration/dropdowns.tsx","../src/registration/events.ts","../src/registration/fields.tsx","../src/registration/modals.tsx","../src/registration/outlets.tsx","../src/registration/pages.tsx","../src/registration/sidebars.tsx","../src/registration/structured-text.tsx","../src/factory.ts","../src/helpers.ts"],"sourcesContent":["import type { FullConnectParameters } from 'datocms-plugin-sdk';\n\nimport type { ConfigScreenConfig, PluginInternalConfig } from '../types';\n\nexport function createConfigScreenRegistration(\n  config: Partial<FullConnectParameters>,\n  internalConfig: PluginInternalConfig,\n) {\n  let isConfigured = false;\n\n  function configureConfigScreen(screenConfig: ConfigScreenConfig) {\n    if (isConfigured) {\n      const message = 'Config screen is already configured';\n\n      switch (internalConfig.duplicateIdHandling) {\n        case 'throw':\n          throw new Error(message);\n        case 'warn':\n          console.warn(`[datocms-plugin-kit] ${message}`);\n          break; // Continue to replace\n        case 'ignore':\n          break; // Continue to replace\n      }\n    }\n\n    // Register render hook\n    config.renderConfigScreen = (ctx) => {\n      const Component = screenConfig.component;\n      internalConfig.render(<Component ctx={ctx} />);\n    };\n\n    isConfigured = true;\n  }\n\n  return {\n    configureConfigScreen,\n  };\n}\n","export function validateUniqueId(\n  id: string,\n  existingIds: string[],\n  type: string,\n  mode: 'throw' | 'warn' | 'ignore' = 'warn',\n): boolean {\n  if (existingIds.includes(id)) {\n    const message = `${type} with id \"${id}\" is already registered`;\n\n    switch (mode) {\n      case 'throw':\n        throw new Error(message);\n      case 'warn':\n        console.warn(`[datocms-plugin-kit] ${message}`);\n        return false;\n      case 'ignore':\n        return false;\n    }\n  }\n\n  return true;\n}\n","import type { DropdownAction, FullConnectParameters, Icon } from 'datocms-plugin-sdk';\n\nimport type {\n  DropdownActionConfig,\n  FieldDropdownActionConfig,\n  ItemFormDropdownActionConfig,\n  ItemsDropdownActionConfig,\n  PluginInternalConfig,\n  UploadsDropdownActionConfig,\n} from '../types';\nimport { validateUniqueId } from '../utils/validation';\n\nexport function createDropdownActionRegistration(\n  config: Partial<FullConnectParameters>,\n  internalConfig: PluginInternalConfig,\n) {\n  // Store action configurations by type with specific types\n  const fieldActions = new Map<string, FieldDropdownActionConfig>();\n  const itemFormActions = new Map<string, ItemFormDropdownActionConfig>();\n  const itemsActions = new Map<string, ItemsDropdownActionConfig>();\n  const uploadsActions = new Map<string, UploadsDropdownActionConfig>();\n\n  function addDropdownAction(actionConfig: DropdownActionConfig) {\n    const {\n      type,\n      id,\n      label: _label,\n      icon: _icon,\n      execute: _execute,\n      shouldApply: _shouldApply,\n    } = actionConfig;\n\n    // Route to appropriate handler based on type\n    switch (type) {\n      case 'field': {\n        validateUniqueId(\n          id,\n          Array.from(fieldActions.keys()),\n          `${type} dropdown action`,\n          internalConfig.duplicateIdHandling,\n        );\n        // In warn/ignore mode, Map.set() below will naturally replace the old entry\n        // In throw mode, validateUniqueId already threw an error\n        fieldActions.set(id, actionConfig as FieldDropdownActionConfig);\n\n        // Register declaration hook\n        if (!config.fieldDropdownActions) {\n          config.fieldDropdownActions = (field, ctx) => {\n            const actions: DropdownAction[] = [];\n\n            for (const [actionId, action] of Array.from(fieldActions)) {\n              if (action.shouldApply && !action.shouldApply(field, ctx)) {\n                continue;\n              }\n              actions.push({\n                id: actionId,\n                label: action.label,\n                icon: action.icon as Icon | undefined,\n              });\n            }\n\n            return actions;\n          };\n        }\n\n        // Register execute hook\n        if (!config.executeFieldDropdownAction) {\n          config.executeFieldDropdownAction = async (actionId, ctx) => {\n            const action = fieldActions.get(actionId);\n            if (action) {\n              await action.execute(ctx);\n            }\n          };\n        }\n        break;\n      }\n\n      case 'itemForm': {\n        validateUniqueId(\n          id,\n          Array.from(itemFormActions.keys()),\n          `${type} dropdown action`,\n          internalConfig.duplicateIdHandling,\n        );\n        // In warn/ignore mode, Map.set() below will naturally replace the old entry\n        // In throw mode, validateUniqueId already threw an error\n        itemFormActions.set(id, actionConfig as ItemFormDropdownActionConfig);\n\n        // Register declaration hook\n        if (!config.itemFormDropdownActions) {\n          config.itemFormDropdownActions = (itemType, ctx) => {\n            const actions: DropdownAction[] = [];\n\n            for (const [actionId, action] of Array.from(itemFormActions)) {\n              if (action.shouldApply && !action.shouldApply(itemType, ctx)) {\n                continue;\n              }\n              actions.push({\n                id: actionId,\n                label: action.label,\n                icon: action.icon as Icon | undefined,\n              });\n            }\n\n            return actions;\n          };\n        }\n\n        // Register execute hook\n        if (!config.executeItemFormDropdownAction) {\n          config.executeItemFormDropdownAction = async (actionId, ctx) => {\n            const action = itemFormActions.get(actionId);\n            if (action) {\n              await action.execute(ctx);\n            }\n          };\n        }\n        break;\n      }\n\n      case 'items': {\n        validateUniqueId(\n          id,\n          Array.from(itemsActions.keys()),\n          `${type} dropdown action`,\n          internalConfig.duplicateIdHandling,\n        );\n        // In warn/ignore mode, Map.set() below will naturally replace the old entry\n        // In throw mode, validateUniqueId already threw an error\n        itemsActions.set(id, actionConfig as ItemsDropdownActionConfig);\n\n        // Register declaration hook\n        if (!config.itemsDropdownActions) {\n          config.itemsDropdownActions = (itemType, ctx) => {\n            const actions: DropdownAction[] = [];\n\n            for (const [actionId, action] of Array.from(itemsActions)) {\n              if (action.shouldApply && !action.shouldApply(itemType, ctx)) {\n                continue;\n              }\n              actions.push({\n                id: actionId,\n                label: action.label,\n                icon: action.icon as Icon | undefined,\n              });\n            }\n\n            return actions;\n          };\n        }\n\n        // Register execute hook\n        if (!config.executeItemsDropdownAction) {\n          config.executeItemsDropdownAction = async (actionId, _items, ctx) => {\n            const action = itemsActions.get(actionId);\n            if (action) {\n              await action.execute(ctx);\n            }\n          };\n        }\n        break;\n      }\n\n      case 'uploads': {\n        validateUniqueId(\n          id,\n          Array.from(uploadsActions.keys()),\n          `${type} dropdown action`,\n          internalConfig.duplicateIdHandling,\n        );\n        // In warn/ignore mode, Map.set() below will naturally replace the old entry\n        // In throw mode, validateUniqueId already threw an error\n        uploadsActions.set(id, actionConfig as UploadsDropdownActionConfig);\n\n        // Register declaration hook\n        if (!config.uploadsDropdownActions) {\n          config.uploadsDropdownActions = (ctx) => {\n            const actions: DropdownAction[] = [];\n\n            for (const [actionId, action] of Array.from(uploadsActions)) {\n              if (action.shouldApply && !action.shouldApply(ctx)) {\n                continue;\n              }\n              actions.push({\n                id: actionId,\n                label: action.label,\n                icon: action.icon as Icon | undefined,\n              });\n            }\n\n            return actions;\n          };\n        }\n\n        // Register execute hook\n        if (!config.executeUploadsDropdownAction) {\n          config.executeUploadsDropdownAction = async (actionId, _uploads, ctx) => {\n            const action = uploadsActions.get(actionId);\n            if (action) {\n              await action.execute(ctx);\n            }\n          };\n        }\n        break;\n      }\n\n      default:\n        throw new Error(`Unknown dropdown action type: ${type}`);\n    }\n  }\n\n  return {\n    addDropdownAction,\n  };\n}\n","import type { FullConnectParameters } from 'datocms-plugin-sdk';\n\nimport type {\n  OnBeforeItemsDestroyHandler,\n  OnBeforeItemsPublishHandler,\n  OnBeforeItemsUnpublishHandler,\n  OnBeforeItemUpsertHandler,\n  OnBootHandler,\n} from '../types';\n\nexport function createEventHooksRegistration(config: Partial<FullConnectParameters>) {\n  // Storage for multiple handlers per event type\n  const onBootHandlers: OnBootHandler[] = [];\n  const onBeforeItemUpsertHandlers: OnBeforeItemUpsertHandler[] = [];\n  const onBeforeItemsDestroyHandlers: OnBeforeItemsDestroyHandler[] = [];\n  const onBeforeItemsPublishHandlers: OnBeforeItemsPublishHandler[] = [];\n  const onBeforeItemsUnpublishHandlers: OnBeforeItemsUnpublishHandler[] = [];\n\n  function onBoot(handler: OnBootHandler) {\n    onBootHandlers.push(handler);\n\n    // Create a wrapper that calls all registered handlers in parallel\n    config.onBoot = async (ctx) => {\n      await Promise.all(onBootHandlers.map((h) => h(ctx)));\n    };\n  }\n\n  function onBeforeItemUpsert(handler: OnBeforeItemUpsertHandler) {\n    onBeforeItemUpsertHandlers.push(handler);\n\n    // Create a wrapper that calls all registered handlers in parallel\n    config.onBeforeItemUpsert = async (item, ctx) => {\n      try {\n        await Promise.all(\n          onBeforeItemUpsertHandlers.map((h) =>\n            (async () => {\n              try {\n                const result = await h(item, ctx);\n                if (result === false) {\n                  throw new Error('Handler returned false');\n                }\n              } catch (error) {\n                // Re-throw only our rejection, swallow handler errors\n                if (error instanceof Error && error.message === 'Handler returned false') {\n                  throw error;\n                }\n                // Handler threw an error - fulfill by not throwing\n              }\n            })(),\n          ),\n        );\n        return true;\n      } catch {\n        // One handler returned false\n        return false;\n      }\n    };\n  }\n\n  function onBeforeItemsDestroy(handler: OnBeforeItemsDestroyHandler) {\n    onBeforeItemsDestroyHandlers.push(handler);\n\n    // Create a wrapper that calls all registered handlers in parallel\n    config.onBeforeItemsDestroy = async (items, ctx) => {\n      try {\n        await Promise.all(\n          onBeforeItemsDestroyHandlers.map((h) =>\n            (async () => {\n              try {\n                const result = await h(items, ctx);\n                if (result === false) {\n                  throw new Error('Handler returned false');\n                }\n              } catch (error) {\n                // Re-throw only our rejection, swallow handler errors\n                if (error instanceof Error && error.message === 'Handler returned false') {\n                  throw error;\n                }\n                // Handler threw an error - fulfill by not throwing\n              }\n            })(),\n          ),\n        );\n        return true;\n      } catch {\n        // One handler returned false\n        return false;\n      }\n    };\n  }\n\n  function onBeforeItemsPublish(handler: OnBeforeItemsPublishHandler) {\n    onBeforeItemsPublishHandlers.push(handler);\n\n    // Create a wrapper that calls all registered handlers in parallel\n    config.onBeforeItemsPublish = async (items, ctx) => {\n      try {\n        await Promise.all(\n          onBeforeItemsPublishHandlers.map((h) =>\n            (async () => {\n              try {\n                const result = await h(items, ctx);\n                if (result === false) {\n                  throw new Error('Handler returned false');\n                }\n              } catch (error) {\n                // Re-throw only our rejection, swallow handler errors\n                if (error instanceof Error && error.message === 'Handler returned false') {\n                  throw error;\n                }\n                // Handler threw an error - fulfill by not throwing\n              }\n            })(),\n          ),\n        );\n        return true;\n      } catch {\n        // One handler returned false\n        return false;\n      }\n    };\n  }\n\n  function onBeforeItemsUnpublish(handler: OnBeforeItemsUnpublishHandler) {\n    onBeforeItemsUnpublishHandlers.push(handler);\n\n    // Create a wrapper that calls all registered handlers in parallel\n    config.onBeforeItemsUnpublish = async (items, ctx) => {\n      try {\n        await Promise.all(\n          onBeforeItemsUnpublishHandlers.map((h) =>\n            (async () => {\n              try {\n                const result = await h(items, ctx);\n                if (result === false) {\n                  throw new Error('Handler returned false');\n                }\n              } catch (error) {\n                // Re-throw only our rejection, swallow handler errors\n                if (error instanceof Error && error.message === 'Handler returned false') {\n                  throw error;\n                }\n                // Handler threw an error - fulfill by not throwing\n              }\n            })(),\n          ),\n        );\n        return true;\n      } catch {\n        // One handler returned false\n        return false;\n      }\n    };\n  }\n\n  return {\n    onBoot,\n    onBeforeItemUpsert,\n    onBeforeItemsDestroy,\n    onBeforeItemsPublish,\n    onBeforeItemsUnpublish,\n  };\n}\n","import type {\n  FieldExtensionOverride,\n  FullConnectParameters,\n  ManualFieldExtension,\n  RenderFieldExtensionCtx,\n} from 'datocms-plugin-sdk';\n\nimport type {\n  FieldExtensionConfig,\n  FieldExtensionOverrideConfig,\n  HiddenFieldPredicate,\n  PluginInternalConfig,\n} from '../types';\nimport { validateUniqueId } from '../utils/validation';\n\nconst HIDDEN_FIELD_EXTENSION_ID = '@oddcommon/datocms-plugin-kit/hidden-field';\n\n/**\n * Helper function to render a hidden field\n */\nfunction renderHiddenField(ctx: RenderFieldExtensionCtx) {\n  ctx.toggleField(ctx.fieldPath, false);\n  // Return null - we don't render anything for hidden fields\n  return null;\n}\n\nexport function createFieldExtensionRegistration(\n  config: Partial<FullConnectParameters>,\n  internalConfig: PluginInternalConfig,\n) {\n  const extensions = new Map<string, FieldExtensionConfig>();\n  const overrides: FieldExtensionOverrideConfig[] = [];\n  const hiddenFieldPredicates: HiddenFieldPredicate[] = [];\n\n  function addFieldExtension(extensionConfig: FieldExtensionConfig) {\n    const existingIds = Array.from(extensions.keys());\n    validateUniqueId(\n      extensionConfig.id,\n      existingIds,\n      'Field extension',\n      internalConfig.duplicateIdHandling,\n    );\n\n    // Store the config (Map.set naturally replaces if duplicate)\n    extensions.set(extensionConfig.id, extensionConfig);\n\n    // Register manual field extensions hook (single function that returns all extensions)\n    config.manualFieldExtensions = () => {\n      return Array.from(extensions.values()).map((ext) => {\n        const extension: ManualFieldExtension = {\n          id: ext.id,\n          name: ext.name,\n          type: ext.type,\n          fieldTypes: ext.fieldTypes,\n        };\n\n        // Add configurable flag if defined\n        if (ext.configurable !== undefined) {\n          extension.configurable = ext.configurable;\n        }\n\n        return extension;\n      });\n    };\n\n    // Register render hook for field extensions\n    if (!config.renderFieldExtension) {\n      config.renderFieldExtension = (extensionId, ctx) => {\n        // Handle built-in hidden field extension\n        if (extensionId === HIDDEN_FIELD_EXTENSION_ID) {\n          return internalConfig.render(renderHiddenField(ctx));\n        }\n\n        // Handle user-defined extensions\n        const extension = extensions.get(extensionId);\n        if (extension) {\n          const Component = extension.component;\n          internalConfig.render(<Component ctx={ctx} />);\n        }\n      };\n    }\n\n    // Register config screen render hook if configurable extensions exist\n    if (!config.renderManualFieldExtensionConfigScreen) {\n      config.renderManualFieldExtensionConfigScreen = (extensionId, ctx) => {\n        const extension = extensions.get(extensionId);\n        if (extension?.configComponent) {\n          const Component = extension.configComponent;\n          internalConfig.render(<Component ctx={ctx} />);\n        }\n      };\n    }\n\n    // Register validator hook\n    if (!config.validateManualFieldExtensionParameters) {\n      config.validateManualFieldExtensionParameters = (extensionId, params) => {\n        const extension = extensions.get(extensionId);\n        if (extension?.validateConfig) {\n          return extension.validateConfig(params);\n        }\n        return {};\n      };\n    }\n  }\n\n  function addHiddenField(predicate: HiddenFieldPredicate) {\n    // Store the predicate\n    hiddenFieldPredicates.push(predicate);\n\n    // Update overrideFieldExtensions to check hidden fields\n    updateOverrideFieldExtensions();\n  }\n\n  function overrideFieldExtension(overrideConfig: FieldExtensionOverrideConfig) {\n    // Store the override config\n    overrides.push(overrideConfig);\n\n    // Update overrideFieldExtensions\n    updateOverrideFieldExtensions();\n  }\n\n  function updateOverrideFieldExtensions() {\n    // Register overrideFieldExtensions hook (processes hidden fields and user overrides)\n    config.overrideFieldExtensions = (field, ctx) => {\n      // Check hidden field predicates first\n      for (const predicate of hiddenFieldPredicates) {\n        if (predicate(field, ctx)) {\n          return {\n            editor: { id: HIDDEN_FIELD_EXTENSION_ID },\n          };\n        }\n      }\n\n      // Check user-defined overrides\n      for (const override of overrides) {\n        if (override.shouldApply(field, ctx)) {\n          const result: FieldExtensionOverride = {};\n\n          if (override.editor) {\n            result.editor = override.editor;\n          }\n\n          if (override.addons && override.addons.length > 0) {\n            result.addons = override.addons;\n          }\n\n          return result;\n        }\n      }\n\n      // No override matched, return undefined to use default\n      return undefined;\n    };\n  }\n\n  return {\n    addFieldExtension,\n    overrideFieldExtension,\n    addHiddenField,\n  };\n}\n","import type { FullConnectParameters } from 'datocms-plugin-sdk';\n\nimport type { ModalConfig, PluginInternalConfig } from '../types';\nimport { validateUniqueId } from '../utils/validation';\n\nexport function createModalRegistration(\n  config: Partial<FullConnectParameters>,\n  internalConfig: PluginInternalConfig,\n) {\n  const modals = new Map<string, ModalConfig>();\n\n  function addModal(modalConfig: ModalConfig) {\n    const existingIds = Array.from(modals.keys());\n    validateUniqueId(modalConfig.id, existingIds, 'Modal', internalConfig.duplicateIdHandling);\n\n    // In warn/ignore mode, the Map.set() below will naturally replace the old entry\n    // In throw mode, validateUniqueId already threw an error\n\n    // Store the config\n    modals.set(modalConfig.id, modalConfig);\n\n    // Register render hook\n    if (!config.renderModal) {\n      config.renderModal = (modalId, ctx) => {\n        const modal = modals.get(modalId);\n        if (modal) {\n          const Component = modal.component;\n          internalConfig.render(<Component ctx={ctx} />);\n        }\n      };\n    }\n  }\n\n  return {\n    addModal,\n  };\n}\n","import type { FullConnectParameters } from 'datocms-plugin-sdk';\n\nimport type { CollectionOutletConfig, FormOutletConfig, PluginInternalConfig } from '../types';\nimport { validateUniqueId } from '../utils/validation';\n\nexport function createOutletRegistration(\n  config: Partial<FullConnectParameters>,\n  internalConfig: PluginInternalConfig,\n) {\n  const outlets = new Map<string, FormOutletConfig>();\n\n  function addFormOutlet(outletConfig: FormOutletConfig) {\n    const existingIds = Array.from(outlets.keys());\n    validateUniqueId(\n      outletConfig.id,\n      existingIds,\n      'Form outlet',\n      internalConfig.duplicateIdHandling,\n    );\n\n    // Store the config (Map.set naturally replaces if duplicate)\n    outlets.set(outletConfig.id, outletConfig);\n\n    // Register declaration hook (single function that returns all outlets)\n    config.itemFormOutlets = (model, ctx) => {\n      return Array.from(outlets.values())\n        .filter((outlet) => !outlet.shouldApply || outlet.shouldApply(model, ctx))\n        .map((outlet) => ({\n          id: outlet.id,\n          initialHeight: outlet.initialHeight ?? 0,\n        }));\n    };\n\n    // Register render hook\n    if (!config.renderItemFormOutlet) {\n      config.renderItemFormOutlet = (outletId, ctx) => {\n        const outlet = outlets.get(outletId);\n        if (outlet) {\n          const Component = outlet.component;\n          internalConfig.render(<Component ctx={ctx} />);\n        }\n      };\n    }\n  }\n\n  function addCollectionOutlet(_outletConfig: CollectionOutletConfig) {\n    // For collection outlets, we'll use a similar approach when implemented\n    // For now, just throw the not implemented error\n\n    // Similar implementation to addFormOutlet\n    // TODO: Implement in a future task\n    throw new Error('Collection outlets not yet implemented');\n  }\n\n  return {\n    addFormOutlet,\n    addCollectionOutlet,\n  };\n}\n","import type { FullConnectParameters } from 'datocms-plugin-sdk';\n\nimport type {\n  ContentAreaSidebarItemConfig,\n  MainNavigationTabConfig,\n  PageConfig,\n  PluginInternalConfig,\n} from '../types';\nimport { validateUniqueId } from '../utils/validation';\n\nexport function createPageRegistration(\n  config: Partial<FullConnectParameters>,\n  internalConfig: PluginInternalConfig,\n) {\n  const pages = new Map<string, PageConfig>();\n  const mainNavTabs: MainNavigationTabConfig[] = [];\n  const contentAreaItems: ContentAreaSidebarItemConfig[] = [];\n\n  function addPage(pageConfig: PageConfig) {\n    const existingIds = Array.from(pages.keys());\n    validateUniqueId(pageConfig.pageId, existingIds, 'Page', internalConfig.duplicateIdHandling);\n\n    // In warn/ignore mode, the Map.set() below will naturally replace the old entry\n    // In throw mode, validateUniqueId already threw an error\n\n    // Store the config\n    pages.set(pageConfig.pageId, pageConfig);\n\n    // Register render hook\n    if (!config.renderPage) {\n      config.renderPage = (pageId, ctx) => {\n        const page = pages.get(pageId);\n        if (page) {\n          const Component = page.component;\n          internalConfig.render(<Component ctx={ctx} />);\n        }\n      };\n    }\n  }\n\n  function addMainNavigationTab(tabConfig: MainNavigationTabConfig) {\n    mainNavTabs.push(tabConfig);\n\n    // Register/update the function that returns all tabs\n    config.mainNavigationTabs = (_ctx) => {\n      return mainNavTabs;\n    };\n  }\n\n  function addContentAreaSidebarItem(itemConfig: ContentAreaSidebarItemConfig) {\n    contentAreaItems.push(itemConfig);\n\n    // Register/update the function that returns all items\n    config.contentAreaSidebarItems = (_ctx) => {\n      return contentAreaItems;\n    };\n  }\n\n  function addSettingsAreaSidebarItem(_itemConfig: unknown) {\n    // Similar to addContentAreaSidebarItem\n    // TODO: Complete implementation\n    throw new Error('Settings area sidebar items not yet implemented');\n  }\n\n  return {\n    addPage,\n    addMainNavigationTab,\n    addContentAreaSidebarItem,\n    addSettingsAreaSidebarItem,\n  };\n}\n","import type {\n  FullConnectParameters,\n  ItemFormSidebar,\n  ItemFormSidebarPanel,\n} from 'datocms-plugin-sdk';\n\nimport type { PluginInternalConfig, SidebarConfig, SidebarPanelConfig } from '../types';\nimport { validateUniqueId } from '../utils/validation';\n\nexport function createSidebarRegistration(\n  config: Partial<FullConnectParameters>,\n  internalConfig: PluginInternalConfig,\n) {\n  const panels = new Map<string, SidebarPanelConfig>();\n  const sidebars = new Map<string, SidebarConfig>();\n\n  function addSidebarPanel(panelConfig: SidebarPanelConfig) {\n    const existingIds = Array.from(panels.keys());\n    validateUniqueId(\n      panelConfig.id,\n      existingIds,\n      'Sidebar panel',\n      internalConfig.duplicateIdHandling,\n    );\n\n    // Store the config (Map.set naturally replaces if duplicate)\n    panels.set(panelConfig.id, panelConfig);\n\n    // Register declaration hook (single function that returns all panels)\n    config.itemFormSidebarPanels = (_model, _ctx) => {\n      return Array.from(panels.values()).map((panel) => {\n        const result: ItemFormSidebarPanel = {\n          id: panel.id,\n          label: panel.label,\n        };\n        if (panel.startOpen !== undefined) result.startOpen = panel.startOpen;\n        if (panel.placement !== undefined) result.placement = panel.placement;\n        if (panel.rank !== undefined) result.rank = panel.rank;\n        return result;\n      });\n    };\n\n    // Register render hook\n    if (!config.renderItemFormSidebarPanel) {\n      config.renderItemFormSidebarPanel = (panelId, ctx) => {\n        const panel = panels.get(panelId);\n        if (panel) {\n          const Component = panel.component;\n          internalConfig.render(<Component ctx={ctx} />);\n        }\n      };\n    }\n  }\n\n  function addSidebar(sidebarConfig: SidebarConfig) {\n    const existingIds = Array.from(sidebars.keys());\n    validateUniqueId(sidebarConfig.id, existingIds, 'Sidebar', internalConfig.duplicateIdHandling);\n\n    // Store the config (Map.set naturally replaces if duplicate)\n    sidebars.set(sidebarConfig.id, sidebarConfig);\n\n    // Register declaration hook (single function that returns all sidebars)\n    config.itemFormSidebars = (model, ctx) => {\n      return Array.from(sidebars.values())\n        .filter((sidebar) => !sidebar.shouldApply || sidebar.shouldApply(model, ctx))\n        .map((sidebar) => {\n          const result: ItemFormSidebar = {\n            id: sidebar.id,\n            label: sidebar.label,\n          };\n          if (sidebar.preferredWidth !== undefined) result.preferredWidth = sidebar.preferredWidth;\n          return result;\n        });\n    };\n\n    // Register render hook\n    if (!config.renderItemFormSidebar) {\n      config.renderItemFormSidebar = (sidebarId, ctx) => {\n        const sidebar = sidebars.get(sidebarId);\n        if (sidebar) {\n          const Component = sidebar.component;\n          internalConfig.render(<Component ctx={ctx} />);\n        }\n      };\n    }\n  }\n\n  return {\n    addSidebarPanel,\n    addSidebar,\n  };\n}\n","import type { FullConnectParameters } from 'datocms-plugin-sdk';\n\nimport type {\n  CustomBlockStylesForStructuredTextFieldHandler,\n  CustomMarksForStructuredTextFieldHandler,\n  PluginInternalConfig,\n} from '../types';\n\nexport function createStructuredTextCustomizationRegistration(\n  config: Partial<FullConnectParameters>,\n  _internalConfig: PluginInternalConfig,\n) {\n  function customBlockStylesForStructuredTextField(\n    handler: CustomBlockStylesForStructuredTextFieldHandler,\n  ) {\n    if (config.customBlockStylesForStructuredTextField) {\n      console.warn(\n        '[datocms-plugin-kit] customBlockStylesForStructuredTextField is already registered. Replacing existing handler.',\n      );\n    }\n\n    config.customBlockStylesForStructuredTextField = handler;\n  }\n\n  function customMarksForStructuredTextField(handler: CustomMarksForStructuredTextFieldHandler) {\n    if (config.customMarksForStructuredTextField) {\n      console.warn(\n        '[datocms-plugin-kit] customMarksForStructuredTextField is already registered. Replacing existing handler.',\n      );\n    }\n\n    config.customMarksForStructuredTextField = handler;\n  }\n\n  return {\n    customBlockStylesForStructuredTextField,\n    customMarksForStructuredTextField,\n  };\n}\n","import { connect as sdkConnect } from 'datocms-plugin-sdk';\nimport type { FullConnectParameters } from 'datocms-plugin-sdk';\n\nimport { createConfigScreenRegistration } from './registration/config';\nimport { createDropdownActionRegistration } from './registration/dropdowns';\nimport { createEventHooksRegistration } from './registration/events';\nimport { createFieldExtensionRegistration } from './registration/fields';\nimport { createModalRegistration } from './registration/modals';\nimport { createOutletRegistration } from './registration/outlets';\nimport { createPageRegistration } from './registration/pages';\nimport { createSidebarRegistration } from './registration/sidebars';\nimport { createStructuredTextCustomizationRegistration } from './registration/structured-text';\nimport type { PluginInternalConfig, PluginOptions } from './types';\n\nexport function createPluginConfig(options: PluginOptions) {\n  const config: Partial<FullConnectParameters> = {};\n\n  // Create shared internal configuration\n  const internalConfig: PluginInternalConfig = {\n    render: options.render,\n    duplicateIdHandling: options.duplicateIdHandling ?? 'warn',\n  };\n\n  const { addFormOutlet, addCollectionOutlet } = createOutletRegistration(config, internalConfig);\n  const { addPage, addMainNavigationTab, addContentAreaSidebarItem, addSettingsAreaSidebarItem } =\n    createPageRegistration(config, internalConfig);\n  const { addSidebarPanel, addSidebar } = createSidebarRegistration(config, internalConfig);\n  const { addFieldExtension, overrideFieldExtension, addHiddenField } =\n    createFieldExtensionRegistration(config, internalConfig);\n  const { addModal } = createModalRegistration(config, internalConfig);\n  const { configureConfigScreen } = createConfigScreenRegistration(config, internalConfig);\n  const { addDropdownAction } = createDropdownActionRegistration(config, internalConfig);\n  const {\n    onBoot,\n    onBeforeItemUpsert,\n    onBeforeItemsDestroy,\n    onBeforeItemsPublish,\n    onBeforeItemsUnpublish,\n  } = createEventHooksRegistration(config);\n  const { customBlockStylesForStructuredTextField, customMarksForStructuredTextField } =\n    createStructuredTextCustomizationRegistration(config, internalConfig);\n\n  const connect = () => {\n    return sdkConnect(config);\n  };\n\n  return {\n    addFormOutlet,\n    addCollectionOutlet,\n    addPage,\n    addMainNavigationTab,\n    addContentAreaSidebarItem,\n    addSettingsAreaSidebarItem,\n    addSidebarPanel,\n    addSidebar,\n    addFieldExtension,\n    overrideFieldExtension,\n    addHiddenField,\n    addModal,\n    configureConfigScreen,\n    addDropdownAction,\n    onBoot,\n    onBeforeItemUpsert,\n    onBeforeItemsDestroy,\n    onBeforeItemsPublish,\n    onBeforeItemsUnpublish,\n    customBlockStylesForStructuredTextField,\n    customMarksForStructuredTextField,\n    connect,\n  };\n}\n","import type { Ctx, Field, ItemType } from 'datocms-plugin-sdk';\n\ntype CtxWithItemTypes = Ctx<{\n  itemTypes: Partial<Record<string, ItemType>>;\n}>;\n\n// ============================================================================\n// ItemType/Model Helpers\n// ============================================================================\n\n/**\n * Gets the ItemType (model) that a field belongs to\n */\nexport const getFieldItemType = (field: Field, ctx: CtxWithItemTypes): ItemType | null => {\n  const parentId = field.relationships?.item_type?.data?.id;\n  return parentId ? (ctx.itemTypes[parentId] ?? null) : null;\n};\n\n/**\n * Gets an ItemType by its API key\n */\nexport const getItemTypeByApiKey = (\n  apiKey: string,\n  ctx: CtxWithItemTypes,\n): ItemType | undefined => {\n  return Object.values(ctx.itemTypes).find((type) => type?.attributes.api_key === apiKey);\n};\n\n/**\n * Checks if an ItemType is a singleton model\n */\nexport const isSingletonModel = (itemType: ItemType): boolean => {\n  return itemType.attributes.singleton === true;\n};\n\n/**\n * Checks if an ItemType is a collection model\n */\nexport const isCollectionModel = (itemType: ItemType): boolean => {\n  return !isSingletonModel(itemType);\n};\n\n// ============================================================================\n// Field Relationship Helpers\n// ============================================================================\n\n/**\n * Checks if a field belongs to an ItemType with the given API key\n */\nexport const fieldBelongsToItemType = (\n  field: Field,\n  itemTypeApiKey: string,\n  ctx: CtxWithItemTypes,\n): boolean => {\n  const itemType = getFieldItemType(field, ctx);\n  const apiKey: string | undefined | null = itemType?.attributes.api_key;\n  return typeof apiKey === 'string' && apiKey === itemTypeApiKey;\n};\n\n/**\n * Gets all fields that belong to an ItemType with the given API key\n */\nexport const getFieldsByItemType = (itemTypeApiKey: string, ctx: CtxWithItemTypes): Field[] => {\n  return Object.values(ctx.fields).filter(\n    (field): field is Field =>\n      field !== null && field !== undefined && fieldBelongsToItemType(field, itemTypeApiKey, ctx),\n  );\n};\n\n/**\n * Gets all fields of a specific field type\n */\nexport const getAllFieldsOfType = (fieldType: string, ctx: Ctx): Field[] => {\n  return Object.values(ctx.fields).filter(\n    (field): field is Field =>\n      field !== null && field !== undefined && field.attributes.field_type === fieldType,\n  );\n};\n\n// ============================================================================\n// Context Helpers\n// ============================================================================\n\n/**\n * Checks if the context has all the specified fields by API key\n */\nexport const contextHasAllFields = (ctx: Ctx, fieldsApiKeys: string[]): boolean => {\n  const allFields: string[] = Object.entries(ctx.fields)\n    .map(([_, shell]) => shell?.attributes?.api_key)\n    .filter((apiKey): apiKey is string => typeof apiKey === 'string');\n  return fieldsApiKeys.every((apiKey) => allFields.includes(apiKey));\n};\n\n// ============================================================================\n// Field Type Checks\n// ============================================================================\n\n/**\n * Checks if a field is of a specific field type\n */\nexport const isFieldType = (field: Field, fieldType: string): boolean => {\n  return field.attributes.field_type === fieldType;\n};\n\n/**\n * Checks if a field is a string field\n */\nexport const isStringField = (field: Field): boolean => {\n  return isFieldType(field, 'string');\n};\n\n/**\n * Checks if a field is a text field\n */\nexport const isTextField = (field: Field): boolean => {\n  return isFieldType(field, 'text');\n};\n\n/**\n * Checks if a field is a JSON field\n */\nexport const isJsonField = (field: Field): boolean => {\n  return isFieldType(field, 'json');\n};\n\n/**\n * Checks if a field is a structured text field\n */\nexport const isStructuredTextField = (field: Field): boolean => {\n  return isFieldType(field, 'structured_text');\n};\n\n/**\n * Checks if a field is a link field (single or multiple)\n */\nexport const isLinkField = (field: Field): boolean => {\n  return ['link', 'links'].includes(field.attributes.field_type);\n};\n\n/**\n * Checks if a field is a file field (single or gallery)\n */\nexport const isFileField = (field: Field): boolean => {\n  return ['file', 'gallery'].includes(field.attributes.field_type);\n};\n\n/**\n * Checks if a field is a boolean field\n */\nexport const isBooleanField = (field: Field): boolean => {\n  return isFieldType(field, 'boolean');\n};\n\n/**\n * Checks if a field is a date field\n */\nexport const isDateField = (field: Field): boolean => {\n  return isFieldType(field, 'date');\n};\n\n/**\n * Checks if a field is a datetime field\n */\nexport const isDateTimeField = (field: Field): boolean => {\n  return isFieldType(field, 'date_time');\n};\n\n/**\n * Checks if a field is an integer field\n */\nexport const isIntegerField = (field: Field): boolean => {\n  return isFieldType(field, 'integer');\n};\n\n/**\n * Checks if a field is a float field\n */\nexport const isFloatField = (field: Field): boolean => {\n  return isFieldType(field, 'float');\n};\n\n/**\n * Checks if a field is a color field\n */\nexport const isColorField = (field: Field): boolean => {\n  return isFieldType(field, 'color');\n};\n\n/**\n * Checks if a field is a lat/lon field\n */\nexport const isLatLonField = (field: Field): boolean => {\n  return isFieldType(field, 'lat_lon');\n};\n\n/**\n * Checks if a field is a SEO field\n */\nexport const isSeoField = (field: Field): boolean => {\n  return isFieldType(field, 'seo');\n};\n\n/**\n * Checks if a field is a slug field\n */\nexport const isSlugField = (field: Field): boolean => {\n  return isFieldType(field, 'slug');\n};\n\n/**\n * Checks if a field is a video field\n */\nexport const isVideoField = (field: Field): boolean => {\n  return isFieldType(field, 'video');\n};\n\n// ============================================================================\n// Field Property Checks\n// ============================================================================\n\n/**\n * Checks if a field is required\n */\nexport const isFieldRequired = (field: Field): boolean => {\n  const validators = field.attributes.validators as Record<string, unknown> | undefined;\n  return validators !== undefined && 'required' in validators && validators.required !== undefined;\n};\n\n/**\n * Checks if a field is localized\n */\nexport const isLocalizedField = (field: Field): boolean => {\n  return field.attributes.localized === true;\n};\n\n/**\n * Checks if a field has a unique validator\n */\nexport const isUniqueField = (field: Field): boolean => {\n  const validators = field.attributes.validators as Record<string, unknown> | undefined;\n  return validators !== undefined && 'unique' in validators && validators.unique !== undefined;\n};\n\n/**\n * Gets all validators for a field\n */\nexport const getFieldValidators = (field: Field): Record<string, unknown> => {\n  return (field.attributes.validators as Record<string, unknown>) || {};\n};\n\n// ============================================================================\n// Field Extension Helpers\n// ============================================================================\n\n/**\n * Checks if a field has a specific field extension\n */\nexport const hasFieldExtension = (field: Field, extensionId: string): boolean => {\n  const relationships = field.relationships as Record<string, unknown> | undefined;\n  if (!relationships || !('field_extension' in relationships)) return false;\n  const fieldExtension = relationships.field_extension as { data?: { id?: string } } | undefined;\n  return fieldExtension?.data?.id === extensionId;\n};\n\n/**\n * Gets the field extension ID for a field\n */\nexport const getFieldExtensionId = (field: Field): string | null => {\n  const relationships = field.relationships as Record<string, unknown> | undefined;\n  if (!relationships || !('field_extension' in relationships)) return null;\n  const fieldExtension = relationships.field_extension as { data?: { id?: string } } | undefined;\n  return fieldExtension?.data?.id || null;\n};\n\n// ============================================================================\n// Validation Helpers\n// ============================================================================\n\n/**\n * Validates if a string is a valid DatoCMS API key\n */\nexport const isValidApiKey = (apiKey: string): boolean => {\n  return /^[a-z][a-z0-9_]*$/.test(apiKey);\n};\n\n// ============================================================================\n// Context Type Guards\n// ============================================================================\n\n/**\n * Type guard to check if context has form methods\n */\nexport const hasFormMethods = (\n  ctx: unknown,\n): ctx is Ctx & { formValues: unknown; setFieldValue: (field: string, value: unknown) => void } => {\n  return (\n    typeof ctx === 'object' &&\n    ctx !== null &&\n    'formValues' in ctx &&\n    'setFieldValue' in ctx &&\n    typeof (ctx as Record<string, unknown>).setFieldValue === 'function'\n  );\n};\n\n/**\n * Type guard to check if context has current user permissions\n */\nexport const hasCurrentUserPermissions = (\n  ctx: unknown,\n): ctx is Ctx & { currentUserAccessLevel: string } => {\n  return typeof ctx === 'object' && ctx !== null && 'currentUserAccessLevel' in ctx;\n};\n\n// ============================================================================\n// Structured Text Helpers\n// ============================================================================\n\ninterface StructuredTextDocument {\n  document?: {\n    children?: unknown[];\n  };\n}\n\n/**\n * Extracts plain text from structured text (simple implementation)\n */\nexport const extractTextFromStructuredText = (structuredText: StructuredTextDocument): string => {\n  if (!structuredText?.document) return '';\n  return JSON.stringify(structuredText.document);\n};\n\n/**\n * Checks if structured text is empty\n */\nexport const isStructuredTextEmpty = (structuredText: StructuredTextDocument): boolean => {\n  if (!structuredText?.document?.children) return true;\n  return structuredText.document.children.length === 0;\n};\n\n// ============================================================================\n// Asset/Upload Helpers\n// ============================================================================\n\ninterface Upload {\n  attributes?: {\n    url?: string;\n  };\n}\n\n/**\n * Gets the URL for an upload with optional imgix parameters\n */\nexport const getUploadUrl = (\n  upload: Upload,\n  imgixParams?: Record<string, string | number | boolean>,\n): string | null => {\n  const baseUrl = upload?.attributes?.url;\n  if (!baseUrl) return null;\n\n  if (imgixParams && Object.keys(imgixParams).length > 0) {\n    const params = new URLSearchParams(\n      Object.entries(imgixParams).map(([key, value]) => [key, String(value)]),\n    );\n    return `${baseUrl}?${params.toString()}`;\n  }\n\n  return baseUrl;\n};\n\n// ============================================================================\n// Conditional Helper Builders\n// ============================================================================\n\n/**\n * Creates a shouldApply function that matches specific ItemType API keys\n */\nexport const shouldApplyToItemTypes =\n  (...apiKeys: string[]) =>\n  (itemType: ItemType): boolean => {\n    return apiKeys.includes(itemType.attributes.api_key);\n  };\n\n/**\n * Creates a shouldApply function that matches specific field types\n */\nexport const shouldApplyToFieldTypes =\n  (...fieldTypes: string[]) =>\n  (field: Field): boolean => {\n    return fieldTypes.includes(field.attributes.field_type);\n  };\n"],"mappings":"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"}