@riverbankcms/sdk 0.22.0 → 0.25.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.
Files changed (124) hide show
  1. package/README.md +15 -0
  2. package/dist/_dts/blocks/src/system/defineBlock.d.ts +2 -2
  3. package/dist/_dts/blocks/src/system/fragments/utils/toRepeaterSchema.d.ts +1 -0
  4. package/dist/_dts/blocks/src/system/manifest/fieldPath.d.ts +1 -1
  5. package/dist/_dts/blocks/src/system/manifest/schema.d.ts +3 -3
  6. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +20 -6
  7. package/dist/_dts/sdk/src/components.d.ts +1 -1
  8. package/dist/_dts/sdk/src/manifest/prompt/examples/types.d.ts +1 -1
  9. package/dist/_dts/sdk/src/manifest/validation/output-schema.d.ts +1 -1
  10. package/dist/_dts/sdk/src/rendering/components/Layout.d.ts +13 -2
  11. package/dist/_dts/sdk/src/rendering/server.d.ts +1 -1
  12. package/dist/_dts/sdk/src/version.d.ts +1 -1
  13. package/dist/_dts/sdk/src/zod/titleSourceSchema.d.ts +3 -0
  14. package/dist/cli/index.js +38 -16
  15. package/dist/cli/index.js.map +1 -1
  16. package/dist/client/client.js +16 -4
  17. package/dist/client/client.js.map +1 -1
  18. package/dist/client/client.mjs +16 -4
  19. package/dist/client/client.mjs.map +1 -1
  20. package/dist/client/hooks.js +15 -3
  21. package/dist/client/hooks.js.map +1 -1
  22. package/dist/client/hooks.mjs +15 -3
  23. package/dist/client/hooks.mjs.map +1 -1
  24. package/dist/server/{chunk-QE4VT6ZZ.js → chunk-2VZTRLVN.js} +2 -2
  25. package/dist/server/{chunk-QE4VT6ZZ.js.map → chunk-2VZTRLVN.js.map} +1 -1
  26. package/dist/server/{chunk-2M7734OW.mjs → chunk-2Y65RENO.mjs} +2 -2
  27. package/dist/server/{chunk-ZUEYJXML.js → chunk-36KFN6AU.js} +6 -6
  28. package/dist/server/{chunk-ZUEYJXML.js.map → chunk-36KFN6AU.js.map} +1 -1
  29. package/dist/server/{chunk-53NRFMMN.js → chunk-377J7BKC.js} +16 -4
  30. package/dist/server/chunk-377J7BKC.js.map +1 -0
  31. package/dist/server/chunk-3OR6EF3W.js +11 -0
  32. package/dist/server/chunk-3OR6EF3W.js.map +1 -0
  33. package/dist/server/chunk-3YMYSDUU.mjs +7 -0
  34. package/dist/server/{chunk-VHVKDZCV.mjs.map → chunk-3YMYSDUU.mjs.map} +1 -1
  35. package/dist/server/{chunk-WUAHP5L2.mjs → chunk-7NJZJL2D.mjs} +4 -4
  36. package/dist/server/{chunk-PY2A4FGZ.js → chunk-ACLGZTVX.js} +3 -3
  37. package/dist/server/{chunk-PY2A4FGZ.js.map → chunk-ACLGZTVX.js.map} +1 -1
  38. package/dist/server/{chunk-D5NOG6VZ.mjs → chunk-DHFU2AQ7.mjs} +2 -2
  39. package/dist/server/{chunk-7XBBV6UY.mjs → chunk-DWMPTB3G.mjs} +2 -2
  40. package/dist/server/{chunk-J2ZBKZVF.mjs → chunk-E5G5COYU.mjs} +21 -15
  41. package/dist/server/chunk-E5G5COYU.mjs.map +1 -0
  42. package/dist/server/{chunk-H3SRB5G4.js → chunk-EFQNS3HS.js} +6 -6
  43. package/dist/server/{chunk-H3SRB5G4.js.map → chunk-EFQNS3HS.js.map} +1 -1
  44. package/dist/server/{chunk-PTHRXZUJ.js → chunk-END3H7C6.js} +32 -26
  45. package/dist/server/chunk-END3H7C6.js.map +1 -0
  46. package/dist/server/{chunk-TOBOHAEX.js → chunk-FKMJDBEA.js} +5 -5
  47. package/dist/server/{chunk-TOBOHAEX.js.map → chunk-FKMJDBEA.js.map} +1 -1
  48. package/dist/server/{chunk-TU3WAJPX.js → chunk-GTE6ZI5W.js} +13 -10
  49. package/dist/server/chunk-GTE6ZI5W.js.map +1 -0
  50. package/dist/server/{chunk-ZIY3QZJ3.mjs → chunk-HQZKJ5MH.mjs} +2 -2
  51. package/dist/server/{chunk-UK7SLIIG.js → chunk-IH2NRKKI.js} +3 -3
  52. package/dist/server/{chunk-UK7SLIIG.js.map → chunk-IH2NRKKI.js.map} +1 -1
  53. package/dist/server/{chunk-OPW33AGO.mjs → chunk-JMKX5FTE.mjs} +16 -4
  54. package/dist/server/chunk-JMKX5FTE.mjs.map +1 -0
  55. package/dist/server/{chunk-RVLBSKSU.mjs → chunk-KNF42IKQ.mjs} +2 -2
  56. package/dist/server/{chunk-7ORXXMTP.js → chunk-QIBPYE44.js} +9 -9
  57. package/dist/server/{chunk-7ORXXMTP.js.map → chunk-QIBPYE44.js.map} +1 -1
  58. package/dist/server/{chunk-3Z25JQ6H.mjs → chunk-QOBADLB4.mjs} +2 -2
  59. package/dist/server/{chunk-OOIGZH5B.mjs → chunk-RFQZDDUM.mjs} +2 -2
  60. package/dist/server/{chunk-33KZRQJY.mjs → chunk-T3ZGODHW.mjs} +2 -2
  61. package/dist/server/{chunk-CCAD7BUN.mjs → chunk-TCRV6VRW.mjs} +8 -5
  62. package/dist/server/chunk-TCRV6VRW.mjs.map +1 -0
  63. package/dist/server/{chunk-Z4AMGXH2.js → chunk-UZMAP5RH.js} +3 -3
  64. package/dist/server/{chunk-Z4AMGXH2.js.map → chunk-UZMAP5RH.js.map} +1 -1
  65. package/dist/server/chunk-VRDQJRYS.mjs +11 -0
  66. package/dist/server/chunk-VRDQJRYS.mjs.map +1 -0
  67. package/dist/server/{chunk-V5EQHRVR.js → chunk-WEEEYI47.js} +4 -4
  68. package/dist/server/{chunk-V5EQHRVR.js.map → chunk-WEEEYI47.js.map} +1 -1
  69. package/dist/server/{chunk-KAVH2CX7.js → chunk-X5XHOSOM.js} +49 -49
  70. package/dist/server/{chunk-KAVH2CX7.js.map → chunk-X5XHOSOM.js.map} +1 -1
  71. package/dist/server/components.js +5 -5
  72. package/dist/server/components.mjs +4 -4
  73. package/dist/server/config-validation.js +6 -5
  74. package/dist/server/config-validation.js.map +1 -1
  75. package/dist/server/config-validation.mjs +5 -4
  76. package/dist/server/config.js +6 -5
  77. package/dist/server/config.js.map +1 -1
  78. package/dist/server/config.mjs +5 -4
  79. package/dist/server/config.mjs.map +1 -1
  80. package/dist/server/data.js +3 -3
  81. package/dist/server/data.mjs +2 -2
  82. package/dist/server/index.js +4 -4
  83. package/dist/server/index.mjs +3 -3
  84. package/dist/server/{loadPage-3F57VAE2.mjs → loadPage-EZXWZ7SJ.mjs} +4 -4
  85. package/dist/server/{loadPage-JRS5JUAY.js → loadPage-G74D6VXZ.js} +5 -5
  86. package/dist/server/{loadPage-JRS5JUAY.js.map → loadPage-G74D6VXZ.js.map} +1 -1
  87. package/dist/server/next.js +17 -17
  88. package/dist/server/next.mjs +7 -7
  89. package/dist/server/page-converter.js +16 -10
  90. package/dist/server/page-converter.js.map +1 -1
  91. package/dist/server/page-converter.mjs +9 -3
  92. package/dist/server/page-converter.mjs.map +1 -1
  93. package/dist/server/prebuild.js +3 -3
  94. package/dist/server/prebuild.mjs +2 -2
  95. package/dist/server/rendering/server.js +7 -7
  96. package/dist/server/rendering/server.mjs +6 -6
  97. package/dist/server/rendering.js +9 -9
  98. package/dist/server/rendering.mjs +8 -8
  99. package/dist/server/routing.js +1 -1
  100. package/dist/server/routing.mjs +1 -1
  101. package/dist/server/server.js +7 -7
  102. package/dist/server/server.mjs +6 -6
  103. package/dist/server/theme-bridge.js +10 -10
  104. package/dist/server/theme-bridge.mjs +2 -2
  105. package/dist/server/theme.js +4 -4
  106. package/dist/server/theme.mjs +2 -2
  107. package/package.json +1 -1
  108. package/dist/server/chunk-53NRFMMN.js.map +0 -1
  109. package/dist/server/chunk-CCAD7BUN.mjs.map +0 -1
  110. package/dist/server/chunk-J2ZBKZVF.mjs.map +0 -1
  111. package/dist/server/chunk-OPW33AGO.mjs.map +0 -1
  112. package/dist/server/chunk-PTHRXZUJ.js.map +0 -1
  113. package/dist/server/chunk-TU3WAJPX.js.map +0 -1
  114. package/dist/server/chunk-VHVKDZCV.mjs +0 -7
  115. /package/dist/server/{chunk-2M7734OW.mjs.map → chunk-2Y65RENO.mjs.map} +0 -0
  116. /package/dist/server/{chunk-WUAHP5L2.mjs.map → chunk-7NJZJL2D.mjs.map} +0 -0
  117. /package/dist/server/{chunk-D5NOG6VZ.mjs.map → chunk-DHFU2AQ7.mjs.map} +0 -0
  118. /package/dist/server/{chunk-7XBBV6UY.mjs.map → chunk-DWMPTB3G.mjs.map} +0 -0
  119. /package/dist/server/{chunk-ZIY3QZJ3.mjs.map → chunk-HQZKJ5MH.mjs.map} +0 -0
  120. /package/dist/server/{chunk-RVLBSKSU.mjs.map → chunk-KNF42IKQ.mjs.map} +0 -0
  121. /package/dist/server/{chunk-3Z25JQ6H.mjs.map → chunk-QOBADLB4.mjs.map} +0 -0
  122. /package/dist/server/{chunk-OOIGZH5B.mjs.map → chunk-RFQZDDUM.mjs.map} +0 -0
  123. /package/dist/server/{chunk-33KZRQJY.mjs.map → chunk-T3ZGODHW.mjs.map} +0 -0
  124. /package/dist/server/{loadPage-3F57VAE2.mjs.map → loadPage-EZXWZ7SJ.mjs.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/rendering/components/Layout.tsx"],"sourcesContent":["/**\n * Layout component with header and footer\n *\n * Renders site header and footer around content. Fetches site data if not provided.\n */\n\nimport { PageRenderer, renderBlock, resolveFooterRenderPlan, siteFooterManifest, siteHeaderManifest, buildThemeRuntime, ThemeScope } from '@riverbankcms/blocks';\nimport { getRiverbankEnv } from '../../env';\nimport { buildMenu, buildFooterMenu, buildLogo } from '../../navigation';\nimport type { RiverbankClient, SiteResponse } from '../../client/types';\n\nexport type HeaderData = {\n menu: ReturnType<typeof buildMenu>;\n logo: ReturnType<typeof buildLogo>;\n site: SiteResponse['site'];\n theme: SiteResponse['theme'];\n routes: SiteResponse['routes'];\n};\n\nexport type FooterData = {\n menu: ReturnType<typeof buildMenu>;\n logo: ReturnType<typeof buildLogo>;\n site: SiteResponse['site'];\n theme: SiteResponse['theme'];\n routes: SiteResponse['routes'];\n};\n\nexport type LayoutProps = {\n // Option 1: Pass pre-fetched site data\n siteData?: SiteResponse;\n\n // Option 2: Fetch site data (provide client + identifier)\n client?: RiverbankClient;\n siteId?: string;\n slug?: string;\n domain?: string;\n\n // Content\n children: React.ReactNode;\n\n // Control rendering\n header?: boolean | ((data: HeaderData) => React.ReactNode);\n footer?: boolean | ((data: FooterData) => React.ReactNode);\n\n // Header variant override (if using default header)\n headerVariant?: 'classic' | 'centered' | 'transparent' | 'floating' | 'editorial';\n /**\n * Whether the current request has an active portal session.\n * Used to resolve portal navigation labels (e.g. \"Login\" vs \"My account\").\n *\n * @default false\n */\n hasPortalSession?: boolean;\n /** Render stage for internal links and block transforms. */\n previewStage?: 'published' | 'preview';\n};\n\n/**\n * Layout component that wraps content with site header and footer.\n *\n * @example With pre-fetched site data (recommended)\n * ```tsx\n * const site = await client.getSite({ slug: 'my-site' });\n *\n * <Layout siteData={site}>\n * <Page {...pageData} />\n * </Layout>\n * ```\n *\n * @example With automatic fetching\n * ```tsx\n * <Layout client={client} slug=\"my-site\">\n * <Page {...pageData} />\n * </Layout>\n * ```\n */\nexport async function Layout({\n siteData: providedSiteData,\n client,\n siteId,\n slug,\n domain,\n children,\n header = true,\n footer = true,\n headerVariant,\n hasPortalSession = false,\n previewStage = 'published',\n}: LayoutProps) {\n // Fetch site data if not provided\n let siteData = providedSiteData;\n if (!siteData) {\n if (!client) {\n throw new Error('Layout: must provide either siteData or client');\n }\n if (!siteId && !slug && !domain) {\n throw new Error('Layout: must provide siteId, slug, or domain when using client');\n }\n\n siteData = await client.getSite({ id: siteId, slug, domain });\n }\n\n const { site, theme, navigation, layout, routes } = siteData;\n const footerBlocks = siteData.footerBlocks ?? [];\n const themeRuntime = buildThemeRuntime(theme);\n const navigationOptions = {\n hasPortalSession,\n previewStage,\n portalEnabled: siteData.portalEnabled ?? false,\n };\n\n // Build view models for header/footer\n const menuViewModel = buildMenu(navigation, routes, navigationOptions);\n const footerMenuViewModel = buildFooterMenu(navigation, routes, navigationOptions);\n const logoViewModel = buildLogo(layout.logo ?? null, site.title);\n\n // Prepare header data for custom headers\n const headerData: HeaderData = {\n menu: menuViewModel,\n logo: logoViewModel,\n site,\n theme,\n routes,\n };\n\n const footerData: FooterData = {\n menu: menuViewModel,\n logo: logoViewModel,\n site,\n theme,\n routes,\n };\n\n // Override header variant if specified\n const headerContent = headerVariant\n ? { ...layout.header, variant: headerVariant }\n : layout.header;\n\n // Override theme header variant if specified\n const themeWithVariant = headerVariant\n ? {\n ...theme,\n header: { ...theme.header, variant: headerVariant },\n }\n : theme;\n\n // Get API base URL for client-side components\n // This is resolved on the server where env vars are available\n let apiBaseUrl: string | undefined;\n try {\n const env = getRiverbankEnv();\n apiBaseUrl = env.baseUrl;\n } catch {\n // Silently fail if env vars not configured - client components will fall back to their own resolution\n }\n\n const viewModelOverrides = {\n $root: {\n siteId: site.id,\n apiBaseUrl,\n previewStage,\n routes,\n theme: themeWithVariant,\n },\n site,\n menu: menuViewModel,\n footerMenu: footerMenuViewModel,\n content: {\n logo: logoViewModel,\n },\n };\n\n // Render header based on type\n let headerElement: React.ReactNode = null;\n if (header === true) {\n // Default header rendering\n headerElement = renderBlock(siteHeaderManifest, headerContent, {\n theme: themeRuntime.tokens,\n themeConfig: themeWithVariant,\n viewModelOverrides,\n });\n } else if (typeof header === 'function') {\n // Custom header rendering\n headerElement = header(headerData);\n }\n\n // Render footer based on type\n let footerElement: React.ReactNode = null;\n if (footer === true) {\n const isSdkSite = Boolean(site.is_sdk_site);\n const footerPlan = resolveFooterRenderPlan({\n isSdkSite,\n mode: theme.footer?.mode,\n });\n\n const footerBlocksElement =\n footerPlan.renderFooterBlocks && footerBlocks.length > 0\n ? (\n <PageRenderer\n theme={theme}\n page={{\n name: 'Footer blocks',\n path: '/__footer',\n purpose: 'footer',\n blocks: footerBlocks,\n }}\n routeMap={routes}\n dataContext={{\n previewStage,\n siteId: site.id,\n apiBaseUrl,\n routes,\n }}\n sdkConfig={siteData.sdkConfig ?? null}\n />\n )\n : null;\n\n if (footerPlan.renderFooterBlocks && !footerBlocksElement && process.env.NODE_ENV !== 'production') {\n console.debug('[sdk] Footer mode renders blocks, but footerBlocks is empty/missing', {\n siteId: site.id,\n mode: footerPlan.mode,\n });\n }\n\n const defaultFooterElement = footerPlan.renderDefaultFooter\n ? renderBlock(siteFooterManifest, layout.footer, {\n theme: themeRuntime.tokens,\n themeConfig: theme,\n viewModelOverrides,\n })\n : null;\n\n footerElement =\n footerPlan.mode === 'default+blocks'\n ? (\n <>\n {footerBlocksElement}\n {defaultFooterElement}\n </>\n )\n : footerPlan.mode === 'blocks'\n ? footerBlocksElement\n : footerPlan.mode === 'none'\n ? null\n : defaultFooterElement;\n } else if (typeof footer === 'function') {\n // Custom footer rendering\n footerElement = footer(footerData);\n }\n\n return (\n <ThemeScope theme={theme}>\n {headerElement}\n\n {children}\n\n {footerElement}\n </ThemeScope>\n );\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/config/validation.ts","../../src/config/content-validation.ts","../../src/config/layout-validation.ts","../../src/config/dashboard-validation.ts"],"sourcesContent":["/**\n * Zod validation schemas for SDK site configuration.\n *\n * These schemas are used to validate configuration fetched from\n * SDK sites before storing in the database.\n */\n\nimport { z } from 'zod';\nimport { blockCategoryEnum, fieldSchema, getBlockDefinition, NodeSchema, type SdkCustomBlock, type FieldDefinition } from '@riverbankcms/blocks';\nimport type { RiverbankSiteConfig, BlockFieldOptionsMap, BlockFieldExtensionsMap, BlockFieldExtension, SyncConfig } from './types';\nimport { contentConfigSchema } from './content-validation';\nimport { validateLayout } from './layout-validation';\nimport { dashboardConfigSchema } from './dashboard-validation';\n\n// Re-export content schemas for convenience\nexport { contentConfigSchema } from './content-validation';\nexport type { ContentConfigInput, ContentConfigOutput } from './content-validation';\n\n/**\n * Schema for SDK theme palette.\n * Maps token names to CSS color values.\n */\nexport const sdkThemePaletteSchema = z.record(z.string(), z.string());\n\n/**\n * Schema for SDK theme configuration.\n */\nexport const sdkThemeConfigSchema = z.object({\n palette: sdkThemePaletteSchema,\n});\n\n/**\n * Schema for SDK site URLs (previewUrl, liveUrl).\n * - Must be valid URL format\n * - Production URLs must use HTTPS (HTTP allowed for localhost/dev)\n * - Trailing slashes are stripped\n */\nexport const sdkSiteUrlSchema = z.string()\n .url('Must be a valid URL')\n .refine((url) => {\n try {\n const parsed = new URL(url);\n const isLocal = parsed.hostname === 'localhost'\n || parsed.hostname.endsWith('.localhost')\n || parsed.hostname.endsWith('.local')\n || parsed.hostname.endsWith('.test');\n return parsed.protocol === 'https:' || isLocal;\n } catch {\n return false;\n }\n }, { message: 'Production URLs must use HTTPS' })\n .transform((url) => url.replace(/\\/$/, '')); // Strip trailing slash\n\n/**\n * Schema for section background color options.\n */\nexport const sectionBackgroundSchema = z.object({\n id: z.string(),\n label: z.string(),\n token: z.string(), // Reference to theme palette token\n});\n\n/**\n * Schema for section spacing values.\n */\nexport const sectionSpacingSchema = z.enum(['compact', 'default', 'spacious']);\n\n/**\n * Schema for container max-width values.\n */\nexport const containerMaxWidthSchema = z.enum(['narrow', 'default', 'wide', 'full']);\n\n/**\n * Schema for container alignment values.\n */\nexport const containerAlignmentSchema = z.enum(['left', 'center', 'right']);\n\n/**\n * Schema for section options configuration.\n */\nexport const sectionOptionsSchema = z.object({\n backgroundColor: z.boolean().optional(),\n backgroundImage: z.boolean().optional(),\n backgroundGradient: z.boolean().optional(),\n spacing: z.union([\n z.array(sectionSpacingSchema),\n z.boolean(),\n ]).optional(),\n textColor: z.boolean().optional(),\n}).optional();\n\n/**\n * Schema for container options configuration.\n */\nexport const containerOptionsSchema = z.object({\n maxWidth: z.union([\n z.array(containerMaxWidthSchema),\n z.boolean(),\n ]).optional(),\n alignment: z.union([\n z.array(containerAlignmentSchema),\n z.boolean(),\n ]).optional(),\n}).optional();\n\n/**\n * Schema for site style configuration.\n */\nexport const siteStyleConfigSchema = z.object({\n sectionBackgrounds: z.array(sectionBackgroundSchema).optional(),\n sectionOptions: sectionOptionsSchema,\n containerOptions: containerOptionsSchema,\n}).optional();\n\n// ============================================================================\n// Data Loader Schemas\n// ============================================================================\n\nimport { SUPPORTED_LOADER_ENDPOINTS } from '../data/prefetchBlockData';\n\n/**\n * Whitelisted endpoints for SDK data loaders.\n *\n * These are the only CMS endpoints that can be called from config-based loaders.\n * This ensures SDK sites can only access safe, read-only public endpoints.\n *\n * Derived from SUPPORTED_LOADER_ENDPOINTS - the single source of truth.\n */\nexport const sdkLoaderEndpointSchema = z.enum(SUPPORTED_LOADER_ENDPOINTS);\n\n/**\n * A binding expression for dynamic loader params.\n *\n * @example\n * ```typescript\n * { $bind: { from: 'content.categoryId' } }\n * { $bind: { from: '$root.siteId' } }\n * { $bind: { from: 'content.limit', fallback: '10' } }\n * ```\n */\nexport const loaderParamBindingSchema = z.object({\n $bind: z.object({\n from: z.string().min(1, \"Binding path is required\"),\n fallback: z.string().optional(),\n }),\n});\n\n/**\n * A loader param value can be static or a binding expression.\n */\nexport const loaderParamValueSchema = z.union([\n z.string(),\n z.number(),\n z.boolean(),\n loaderParamBindingSchema,\n]);\n\n/**\n * Schema for config-based data loader.\n *\n * Config loaders execute server-side during loadPage() and are\n * restricted to whitelisted CMS endpoints.\n */\nexport const sdkConfigLoaderSchema = z.object({\n endpoint: sdkLoaderEndpointSchema,\n params: z.record(z.string(), loaderParamValueSchema),\n mode: z.enum(['server', 'client']).default('server'),\n});\n\n/**\n * Schema for the dataLoaders field on custom blocks.\n * Validates the loader configuration and limits the number of loaders.\n */\nexport const sdkDataLoadersSchema = z.record(z.string(), sdkConfigLoaderSchema)\n .refine(\n (loaders) => Object.keys(loaders).length <= 5,\n { message: \"Maximum 5 data loaders per block\" }\n )\n .optional();\n\n// ============================================================================\n// Custom Block Schema\n// ============================================================================\n\n/**\n * Schema for field select option.\n */\nexport const fieldSelectOptionSchema = z.object({\n value: z.string().min(1, \"Option value is required\"),\n label: z.string().min(1, \"Option label is required\"),\n});\n\n/**\n * Schema for per-field configuration within a block.\n */\nexport const blockFieldConfigSchema = z.object({\n options: z.array(fieldSelectOptionSchema).min(1, \"At least one option is required\").optional(),\n});\n\n/**\n * Schema for per-block field options.\n *\n * Block IDs must be either 'block.*' (system blocks) or 'custom.*' (custom blocks).\n * Field IDs can be any valid identifier string.\n */\nexport const blockFieldOptionsSchema: z.ZodType<BlockFieldOptionsMap> = z.record(\n z.string().regex(/^(block\\.|custom\\.)[a-z][a-z0-9-]*$/, {\n message: \"Block ID must be 'block.*' or 'custom.*' format\",\n }),\n z.record(\n z.string().min(1, \"Field ID is required\"),\n blockFieldConfigSchema\n )\n).optional() as z.ZodType<BlockFieldOptionsMap>;\n\n// ============================================================================\n// Block Field Extensions Schema\n// ============================================================================\n\n/**\n * Schema for block field extension configuration.\n *\n * Validates additional fields to be appended to a built-in block.\n * Includes refinement to ensure required fields have defaultValue.\n *\n * Note: Explicit type annotation required due to recursive fieldSchema complexity.\n */\nexport const blockFieldExtensionSchema: z.ZodType<BlockFieldExtension> = z.object({\n fields: fieldSchema.array().min(1, \"At least one field is required\"),\n}).refine(\n (data) => {\n // All required fields must have a defaultValue\n const fields = data.fields as FieldDefinition[]\n return fields.every((field) => {\n if (!field.required) return true;\n return field.defaultValue !== undefined;\n });\n },\n {\n message: \"Required fields must have a defaultValue to support existing blocks\",\n }\n) as z.ZodType<BlockFieldExtension>;\n\n/**\n * Schema for block field extensions map.\n *\n * Block IDs must be system blocks (e.g., 'block.body-text', 'block.hero').\n * Custom blocks ('custom.*') should define their fields directly, not via extensions.\n */\nexport const blockFieldExtensionsSchema: z.ZodType<BlockFieldExtensionsMap | undefined> = z.record(\n // System blocks are kebab-case: block.body-text, block.event-calendar, ...\n // Enforce: lowercase alphanumerics with single hyphens (no trailing hyphen, no consecutive hyphens).\n z.string().regex(/^block\\.[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/, {\n message: \"Block ID must be 'block.*' format (system blocks only)\",\n }),\n blockFieldExtensionSchema\n).optional() as z.ZodType<BlockFieldExtensionsMap | undefined>;\n\n/**\n * Validates that extended field IDs don't conflict with existing block fields.\n *\n * This validation should be called during config push to provide clear error messages.\n * Returns an array of conflict errors, or empty array if valid.\n *\n * @example\n * ```typescript\n * const conflicts = validateFieldIdConflicts(config.blockFieldExtensions);\n * if (conflicts.length > 0) {\n * throw new Error(conflicts.map(c => c.message).join('\\n'));\n * }\n * ```\n */\nexport function validateFieldIdConflicts(\n blockFieldExtensions?: BlockFieldExtensionsMap | null\n): { blockId: string; fieldId: string; message: string }[] {\n if (!blockFieldExtensions) return [];\n\n const conflicts: { blockId: string; fieldId: string; message: string }[] = [];\n\n for (const [blockId, extension] of Object.entries(blockFieldExtensions)) {\n const definition = getBlockDefinition(blockId);\n if (!definition) {\n conflicts.push({\n blockId,\n fieldId: '',\n message: `Unknown block type: ${blockId}`,\n });\n continue;\n }\n\n // Get all existing field IDs from the block manifest\n const existingFieldIds = new Set<string>();\n const collectFieldIds = (fields: FieldDefinition[] | undefined) => {\n if (!fields) return;\n for (const field of fields) {\n existingFieldIds.add(field.id);\n // Also collect nested field IDs from groups, modals, repeaters, tab groups\n if (field.type === 'group' || field.type === 'modal') {\n collectFieldIds(field.schema?.fields);\n } else if (field.type === 'repeater' && field.schema?.fields) {\n collectFieldIds(field.schema.fields);\n } else if (field.type === 'tabGroup') {\n for (const tab of field.tabs ?? []) {\n collectFieldIds(tab.fields);\n }\n }\n }\n };\n collectFieldIds(definition.manifest.fields);\n\n // Check for conflicts\n for (const field of extension.fields) {\n if (existingFieldIds.has(field.id)) {\n conflicts.push({\n blockId,\n fieldId: field.id,\n message: `Field ID \"${field.id}\" conflicts with existing field in ${blockId}`,\n });\n }\n }\n }\n\n return conflicts;\n}\n\n// ============================================================================\n// Sync Config Schema\n// ============================================================================\n\n/**\n * Schema for sync configuration.\n *\n * Controls how CLI push operations handle content synchronization.\n * Status changes (draft/published) are synced based on local file status.\n */\nexport const syncConfigSchema: z.ZodType<SyncConfig> = z.object({\n existingEntries: z.enum(['skip', 'update']).optional(),\n}).optional() as z.ZodType<SyncConfig>;\n\n// ============================================================================\n// Deploy Config Schema\n// ============================================================================\n\n/**\n * Schema for deploy configuration.\n *\n * Configures the `riverbankcms deploy` command behavior.\n */\nexport const deployConfigSchema = z.object({\n verifyCommand: z.string().optional(),\n prebuildOutput: z.string().optional(),\n}).optional();\n\n/**\n * Schema for SDK custom block definitions.\n *\n * Validates custom blocks defined in riverbank.config.ts.\n * Reuses fieldSchema from @riverbankcms/blocks for field validation.\n *\n * Note: Explicit type annotation required due to recursive fieldSchema complexity.\n */\nexport const sdkCustomBlockSchema: z.ZodType<SdkCustomBlock> = z.object({\n // Block ID must start with 'custom.'\n id: z.string()\n .min(8) // 'custom.' + at least 1 char\n .regex(/^custom\\.[a-z][a-z0-9-]*$/, {\n message: \"Block ID must start with 'custom.' followed by lowercase letters, numbers, or hyphens\",\n }),\n title: z.string().min(1, \"Title is required\"),\n titleSource: z.string().optional(),\n description: z.string().optional(),\n category: blockCategoryEnum,\n icon: z.string().optional(),\n tags: z.array(z.string()).optional(),\n // Reuse the exact field schema from @riverbankcms/blocks - all field types supported\n fields: fieldSchema.array().min(1, \"Custom blocks must have at least one field\"),\n // Data loaders for CMS endpoints\n dataLoaders: sdkDataLoadersSchema,\n // Optional declarative layout - when present, block can render without React override\n layout: NodeSchema.optional(),\n // Optional variants system (preferred when a block has multiple structural layouts)\n variants: z.record(z.string().min(1), NodeSchema).optional(),\n defaultVariant: z.string().min(1).optional(),\n variantOptions: z.record(\n z.string().min(1),\n z.object({\n label: z.string().min(1).optional(),\n description: z.string().min(1).optional(),\n icon: z.string().min(1).optional(),\n })\n ).optional(),\n}).refine(\n // Validate titleSource references a valid field if provided\n (data) => {\n if (!data.titleSource) return true;\n const fields = data.fields as FieldDefinition[]\n return fields.some((field) => field.id === data.titleSource)\n },\n {\n message: \"titleSource must reference a valid field ID\",\n path: [\"titleSource\"],\n }\n).superRefine((data, ctx) => {\n // Enforce a single layout strategy per block to keep runtime semantics clear.\n if (data.layout && data.variants) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"Custom block must define either `layout` or `variants`, not both\",\n path: [\"variants\"],\n });\n }\n\n // Validate layout uses only allowed node types and transform IDs\n if (data.layout) {\n const result = validateLayout(data.layout);\n if (!result.valid) {\n for (const error of result.errors) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: error.message,\n path: [\"layout\"],\n });\n }\n }\n }\n\n // Validate variants\n if (data.variants) {\n const keys = Object.keys(data.variants);\n if (keys.length === 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"`variants` must contain at least one variant key\",\n path: [\"variants\"],\n });\n }\n\n if (data.defaultVariant && !Object.prototype.hasOwnProperty.call(data.variants, data.defaultVariant)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"`defaultVariant` must be a key present in `variants`\",\n path: [\"defaultVariant\"],\n });\n }\n\n for (const [key, node] of Object.entries(data.variants)) {\n const result = validateLayout(node);\n if (!result.valid) {\n for (const error of result.errors) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `${key}: ${error.message}`,\n path: [\"variants\", key],\n });\n }\n }\n }\n\n if (data.variantOptions) {\n for (const key of Object.keys(data.variantOptions)) {\n if (!Object.prototype.hasOwnProperty.call(data.variants, key)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"`variantOptions` key must exist in `variants`\",\n path: [\"variantOptions\", key],\n });\n }\n }\n }\n }\n}) as z.ZodType<SdkCustomBlock>;\n\n/**\n * Schema for the complete SDK site configuration.\n *\n * Use this schema to validate configuration fetched from SDK sites\n * before storing in the database.\n *\n * @example\n * ```typescript\n * import { riverbankSiteConfigSchema } from '@riverbankcms/sdk/config/validation';\n *\n * const rawConfig = await response.json();\n * const config = riverbankSiteConfigSchema.parse(rawConfig);\n * ```\n */\n/**\n * Schema for theme source configuration.\n * Controls where the SDK site loads its theme from.\n */\nexport const themeSourceSchema = z.enum(['local', 'cms']).optional();\n\n/**\n * Schema for active theme name.\n * Validates theme name follows safe filename conventions.\n */\nexport const activeThemeSchema = z.string()\n .regex(/^[a-z0-9][a-z0-9-_]*$/, {\n message: \"Theme name must be lowercase alphanumeric with hyphens/underscores\",\n })\n .max(64, \"Theme name too long\")\n .optional();\n\n// ============================================================================\n// Layout Config (SDK-managed, synced via push-config)\n// ============================================================================\n\nfunction isValidConfigBlockKind(kind: string): boolean {\n // System blocks: block.*\n if (getBlockDefinition(kind)) return true;\n // Declarative custom blocks: custom.*\n return /^custom\\.[a-z][a-z0-9-]*$/.test(kind);\n}\n\nconst layoutBlockKindSchema = z.string().refine(isValidConfigBlockKind, {\n message: 'Block kind must be a system block (e.g., \"block.hero\") or a custom block (e.g., \"custom.my-block\")',\n});\n\nconst layoutFooterBlockSchema = z.object({\n id: z.string().min(1).optional(),\n kind: layoutBlockKindSchema,\n // Allow omitted content for blocks that rely on defaults.\n content: z.record(z.string(), z.unknown()).optional(),\n}).strict();\n\nexport const layoutConfigSchema = z.object({\n footerBlocks: z.array(layoutFooterBlockSchema).optional(),\n}).strict();\n\nexport const riverbankSiteConfigSchema: z.ZodType<RiverbankSiteConfig> = z.object({\n siteId: z.string().uuid(),\n previewUrl: sdkSiteUrlSchema.optional(),\n liveUrl: sdkSiteUrlSchema.optional(),\n theme: sdkThemeConfigSchema.optional(),\n styles: siteStyleConfigSchema,\n layout: layoutConfigSchema.optional(),\n customBlocks: z.array(sdkCustomBlockSchema)\n .max(100, \"Maximum 100 custom blocks per site\")\n .refine(\n // Ensure unique block IDs\n (blocks) => {\n const ids = blocks.map(b => b.id);\n return ids.length === new Set(ids).size;\n },\n { message: \"Block IDs must be unique\" }\n )\n .optional(),\n blockFieldOptions: blockFieldOptionsSchema,\n blockFieldExtensions: blockFieldExtensionsSchema,\n content: contentConfigSchema.optional(),\n // CLI-related configuration (Phase 4)\n contentDir: z.string().optional(),\n sync: syncConfigSchema,\n deploy: deployConfigSchema,\n // Theme sync configuration (Phase 5)\n themeSource: themeSourceSchema,\n activeTheme: activeThemeSchema,\n dashboard: dashboardConfigSchema.optional(),\n}).strict() as z.ZodType<RiverbankSiteConfig>;\n\n/**\n * Type inferred from the validation schema.\n * This should match the RiverbankSiteConfig type from ./types.ts\n */\nexport type ValidatedRiverbankSiteConfig = z.infer<typeof riverbankSiteConfigSchema>;\n\n/**\n * Type for a validated SDK custom block.\n */\nexport type ValidatedSdkCustomBlock = z.infer<typeof sdkCustomBlockSchema>;\n\n// ============================================================================\n// Compile-time type assertions\n//\n// These assertions ensure the Zod schemas stay in sync with the TypeScript types.\n// If the schema output diverges from the expected type, TypeScript will error here.\n// ============================================================================\n\n/** Asserts sdkCustomBlockSchema output matches SdkCustomBlock */\ntype _AssertSdkCustomBlockSchema = z.infer<typeof sdkCustomBlockSchema> extends SdkCustomBlock\n ? SdkCustomBlock extends z.infer<typeof sdkCustomBlockSchema>\n ? true\n : never\n : never;\n\n/** Asserts riverbankSiteConfigSchema output matches RiverbankSiteConfig */\ntype _AssertRiverbankSiteConfigSchema = z.infer<typeof riverbankSiteConfigSchema> extends RiverbankSiteConfig\n ? RiverbankSiteConfig extends z.infer<typeof riverbankSiteConfigSchema>\n ? true\n : never\n : never;\n\n// These assignments will fail to compile if the types don't match\nconst _checkSdkCustomBlock: _AssertSdkCustomBlockSchema = true;\nconst _checkRiverbankSiteConfig: _AssertRiverbankSiteConfigSchema = true;\n\n// Prevent unused variable warnings\nvoid _checkSdkCustomBlock;\nvoid _checkRiverbankSiteConfig;\n","/**\n * SDK Content Config Validation\n *\n * Zod schemas for validating SDK content configuration.\n */\n\nimport { z } from 'zod';\nimport { SYSTEM_BLOCK_KINDS } from '../types';\nimport type { ContentConfig, ContentTypeConfig } from './content-types';\nimport { collectPortalLinkStats, navigationLinkInputSchemaOptions } from '@riverbankcms/api';\n\n// Use looseObject for data fields that can contain arbitrary values\nconst jsonDataSchema = z.record(z.string(), z.any());\n\n// ============================================================================\n// Content Type Schema\n// ============================================================================\n\n/**\n * Content type key validation.\n * Must be lowercase, start with a letter, and contain only letters, numbers, and hyphens.\n */\nconst contentTypeKeySchema = z\n .string()\n .min(1)\n .regex(\n /^[a-z][a-z0-9-]*$/,\n 'Key must be lowercase, start with a letter, and contain only letters, numbers, and hyphens'\n );\n\n/**\n * Content type config schema.\n */\n// Template schema declared here for use in content type schema\n// (full definition is below in the Template Binding Schemas section)\nconst templateConfigSchemaForward = z\n .object({\n blocks: z.array(\n z.object({\n identifier: z.string().min(1),\n kind: z.string(),\n scope: z.enum(['entry', 'template']),\n bindings: z.record(z.string(), z.any()).optional(),\n content: z.record(z.string(), z.any()).optional(),\n })\n ),\n })\n .optional();\n\nexport const contentTypeConfigSchema: z.ZodType<ContentTypeConfig> = z\n .object({\n key: contentTypeKeySchema,\n name: z.string().min(1),\n description: z.string().optional(),\n hasPages: z.boolean(),\n routePattern: z.string().optional(),\n // Fields are validated as unknown[] here - deep field validation happens in @riverbankcms/blocks\n fields: z.array(z.any()).min(1, 'At least one field is required'),\n titleField: z.string().optional(),\n isSingleton: z.boolean().optional().default(false),\n template: templateConfigSchemaForward,\n })\n .refine(\n (data) => {\n // If hasPages is true, routePattern must be provided\n // For non-singletons, routePattern must contain {slug}\n // For singletons, routePattern can be a fixed path (no {slug} required)\n if (data.hasPages) {\n if (!data.routePattern) {\n return false;\n }\n // Non-singleton routable types require {slug} placeholder\n if (!data.isSingleton && !data.routePattern.includes('{slug}')) {\n return false;\n }\n }\n return true;\n },\n {\n message:\n 'routePattern is required when hasPages is true. Non-singleton types must include {slug} placeholder.',\n }\n )\n .refine(\n (data) => {\n // If hasPages is false, routePattern must NOT be defined\n if (!data.hasPages && data.routePattern) {\n return false;\n }\n return true;\n },\n { message: 'routePattern must not be defined when hasPages is false' }\n )\n .refine(\n (data) => {\n // If titleField is specified, it must reference a valid field ID\n if (!data.titleField) return true;\n return data.fields.some((f: { id?: string }) => f.id === data.titleField);\n },\n { message: 'titleField must reference a valid field ID from the fields array' }\n ) as z.ZodType<ContentTypeConfig>;\n\n// ============================================================================\n// Template Binding Schemas\n// ============================================================================\n\n/**\n * Binding source validation.\n * Validates the structure of binding sources for template blocks.\n */\nconst fieldBindingSchema = z.object({\n source: z.literal('field'),\n path: z.string().min(1, 'Field path is required'),\n});\n\nconst metaBindingSchema = z.object({\n source: z.literal('meta'),\n path: z.string().min(1, 'Meta path is required'),\n});\n\nconst literalBindingSchema = z.object({\n source: z.literal('literal'),\n value: z.unknown(),\n});\n\nconst transformBindingSchema = z.object({\n source: z.literal('transform'),\n path: z.string().min(1, 'Transform path is required'),\n transform: z.string().min(1, 'Transform name is required'),\n});\n\n// Forward declare the type for recursive reference\ntype BindingSourceType =\n | { source: 'field'; path: string }\n | { source: 'meta'; path: string }\n | { source: 'literal'; value: unknown }\n | { source: 'transform'; path: string; transform: string }\n | { source: 'fallback'; sources: BindingSourceType[] };\n\n// Base binding schemas (non-fallback)\nconst baseBindingSchema = z.discriminatedUnion('source', [\n fieldBindingSchema,\n metaBindingSchema,\n literalBindingSchema,\n transformBindingSchema,\n]);\n\n// Fallback binding schema - declared separately to handle recursion\nconst fallbackBindingSchema = z.object({\n source: z.literal('fallback'),\n sources: z.array(z.lazy((): z.ZodType<BindingSourceType> => bindingSourceSchema)).min(1, 'Fallback must have at least one source'),\n});\n\n// Fallback schema using z.lazy for recursive reference\nexport const bindingSourceSchema: z.ZodType<BindingSourceType> = z.union([\n baseBindingSchema,\n fallbackBindingSchema,\n]) as z.ZodType<BindingSourceType>;\n\n// ============================================================================\n// Block Kind Schema (shared between template blocks and regular blocks)\n// ============================================================================\n\n/**\n * Validates a block kind is either a system block (block.*) or custom block (custom.*).\n */\nfunction isValidBlockKind(kind: string): boolean {\n // Check if it's a system block kind\n if ((SYSTEM_BLOCK_KINDS as readonly string[]).includes(kind)) {\n return true;\n }\n // Check if it's a custom block kind (custom.${string})\n if (kind.startsWith('custom.') && kind.length > 7) {\n return true;\n }\n return false;\n}\n\nconst BLOCK_KIND_ERROR_MESSAGE =\n 'Block kind must be a system block (e.g., \"block.hero\") or a custom block (e.g., \"custom.myBlock\")';\n\nconst blockKindSchema = z.string().refine(isValidBlockKind, { message: BLOCK_KIND_ERROR_MESSAGE });\n\n/**\n * Template block config validation.\n */\nexport const templateBlockConfigSchema = z\n .object({\n identifier: z.string().min(1, 'Block identifier is required'),\n kind: blockKindSchema,\n scope: z.enum(['entry', 'template']),\n bindings: z.record(z.string(), bindingSourceSchema).optional(),\n content: jsonDataSchema.optional(),\n })\n .refine(\n (data) => {\n // Entry-scoped blocks should have bindings, not content\n if (data.scope === 'entry') {\n return data.bindings !== undefined || data.content === undefined;\n }\n return true;\n },\n { message: 'Entry-scoped blocks should define bindings, not static content' }\n )\n .refine(\n (data) => {\n // Template-scoped blocks should have content, not bindings\n if (data.scope === 'template') {\n return data.content !== undefined || data.bindings === undefined;\n }\n return true;\n },\n { message: 'Template-scoped blocks should define static content, not bindings' }\n );\n\n/**\n * Template config validation with unique identifier check.\n */\nexport const templateConfigSchema = z\n .object({\n blocks: z.array(templateBlockConfigSchema).min(1, 'Template must have at least one block'),\n })\n .refine(\n (data) => {\n // Validate unique block identifiers\n const identifiers = data.blocks.map((b) => b.identifier);\n const uniqueIdentifiers = new Set(identifiers);\n return identifiers.length === uniqueIdentifiers.size;\n },\n { message: 'Template block identifiers must be unique' }\n );\n\n// ============================================================================\n// Block Config Schema\n// ============================================================================\n\nexport const blockConfigSchema = z.object({\n kind: blockKindSchema,\n content: jsonDataSchema,\n orderIndex: z.number().optional(),\n});\n\n// ============================================================================\n// Page Config Schema\n// ============================================================================\n\nexport const pageConfigSchema = z.object({\n identifier: z.string().min(1, 'Identifier is required'),\n title: z.string().min(1, 'Title is required'),\n path: z.string().regex(/^\\//, 'Path must start with /'),\n purpose: z.string().default('content'),\n blocks: z.array(blockConfigSchema).optional(),\n status: z.enum(['draft', 'published']).default('draft'),\n metaTitle: z.string().optional(),\n metaDescription: z.string().optional(),\n});\n\n// ============================================================================\n// Entry Config Schema\n// ============================================================================\n\nexport const entryConfigSchema = z.object({\n identifier: z.string().min(1, 'Identifier is required'),\n contentType: z.string().min(1, 'Content type is required'),\n data: jsonDataSchema,\n status: z.enum(['draft', 'published']).default('draft'),\n slug: z.string().optional(),\n summary: z.string().optional(),\n // Hard remove legacy config-only titles: titles must live in entry `data`.\n title: z.any().optional().refine((value) => value === undefined, {\n message:\n 'Entry titles are now derived from entry data. Remove `title` and move it into `data` (e.g. `data.title`, or your configured `titleField`). Run `riverbankcms migrate entries` for guided migration.',\n }),\n metaTitle: z.string().optional(),\n metaDescription: z.string().optional(),\n});\n\n// ============================================================================\n// Navigation Config Schema\n// ============================================================================\n\n// Shared navigation link schemas are imported from @riverbankcms/api\n// to maintain a single source of truth and prevent schema drift.\n// Navigation-specific dropdown schema (no link, just a container for children).\nconst dropdownLinkSchema = z.object({\n kind: z.literal('dropdown'),\n});\n\nconst navigationLinkSchema = z.discriminatedUnion('kind', [\n ...navigationLinkInputSchemaOptions,\n dropdownLinkSchema,\n]);\n\n// Navigation item with recursive children support\nconst baseNavigationItemSchema = z.object({\n label: z.string().min(1, 'Label is required'),\n link: navigationLinkSchema,\n isCta: z.boolean().optional(),\n});\n\n// Using z.lazy for recursive type\nexport const navigationItemConfigSchema: z.ZodType<{\n label: string;\n link:\n | { kind: 'page'; identifier: string }\n | { kind: 'entry'; contentType: string; identifier: string }\n | { kind: 'external'; href: string }\n | { kind: 'url'; href: string }\n | { kind: 'portal'; path?: string; labels?: { loggedOut?: string; loggedIn?: string } }\n | { kind: 'dropdown' };\n isCta?: boolean;\n children?: Array<{\n label: string;\n link:\n | { kind: 'page'; identifier: string }\n | { kind: 'entry'; contentType: string; identifier: string }\n | { kind: 'external'; href: string }\n | { kind: 'url'; href: string }\n | { kind: 'portal'; path?: string; labels?: { loggedOut?: string; loggedIn?: string } }\n | { kind: 'dropdown' };\n isCta?: boolean;\n children?: unknown[];\n }>;\n}> = baseNavigationItemSchema.extend({\n children: z.lazy(() => z.array(navigationItemConfigSchema)).optional(),\n});\n\nexport const navigationMenuConfigSchema = z\n .object({\n identifier: z.string().min(1, 'Identifier is required'),\n name: z.string().min(1, 'Name is required'),\n isPrimary: z.boolean().optional(),\n isFooter: z.boolean().optional(),\n items: z.array(navigationItemConfigSchema),\n })\n .superRefine((menu, ctx) => {\n const portalStats = collectPortalLinkStats(menu.items as Array<{ label: string; link: { kind: string }; children?: unknown[] }>);\n if (portalStats.count > 1) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: 'Only one portal link is allowed per navigation menu',\n path: ['items'],\n });\n }\n if (portalStats.nestedLabels.length > 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Portal links must be root-level items: ${portalStats.nestedLabels.join(', ')}`,\n path: ['items'],\n });\n }\n if (portalStats.withChildrenLabels.length > 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Portal links cannot contain child items: ${portalStats.withChildrenLabels.join(', ')}`,\n path: ['items'],\n });\n }\n });\n\n// ============================================================================\n// Site Settings Schema\n// ============================================================================\n\nexport const siteSettingsConfigSchema = z.object({\n homepagePath: z.string().optional(),\n siteTitle: z.string().optional(),\n siteDescription: z.string().optional(),\n defaultTemplates: z.record(z.string(), z.string()).optional(),\n});\n\n// ============================================================================\n// Complete Content Config Schema\n// ============================================================================\n\nconst contentConfigBaseSchema = z.object({\n contentTypes: z.array(contentTypeConfigSchema).optional(),\n entries: z.array(entryConfigSchema).optional(),\n pages: z.array(pageConfigSchema).optional(),\n navigationMenus: z.array(navigationMenuConfigSchema).optional(),\n settings: siteSettingsConfigSchema.optional(),\n});\n\nexport const contentConfigSchema: z.ZodType<ContentConfig> = contentConfigBaseSchema\n .superRefine((data, ctx) => {\n // Validate unique content type keys\n if (data.contentTypes && data.contentTypes.length > 1) {\n const keys = data.contentTypes.map((ct) => ct.key);\n const duplicateKeys = keys.filter((key, i) => keys.indexOf(key) !== i);\n if (duplicateKeys.length > 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Content type keys must be unique. Duplicates: ${duplicateKeys.join(', ')}`,\n path: ['contentTypes'],\n });\n }\n }\n\n // Validate unique page identifiers\n if (data.pages && data.pages.length > 1) {\n const identifiers = data.pages.map((p) => p.identifier);\n const duplicateIds = identifiers.filter((id, i) => identifiers.indexOf(id) !== i);\n if (duplicateIds.length > 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Page identifiers must be unique. Duplicates: ${duplicateIds.join(', ')}`,\n path: ['pages'],\n });\n }\n\n // Validate unique page paths\n const paths = data.pages.map((p) => p.path);\n const duplicatePaths = paths.filter((path, i) => paths.indexOf(path) !== i);\n if (duplicatePaths.length > 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Page paths must be unique. Duplicates: ${duplicatePaths.join(', ')}`,\n path: ['pages'],\n });\n }\n }\n\n // Validate unique entry identifiers\n if (data.entries && data.entries.length > 1) {\n const identifiers = data.entries.map((e) => e.identifier);\n const duplicateIds = identifiers.filter((id, i) => identifiers.indexOf(id) !== i);\n if (duplicateIds.length > 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Entry identifiers must be unique. Duplicates: ${duplicateIds.join(', ')}`,\n path: ['entries'],\n });\n }\n }\n\n // Validate unique navigation menu identifiers\n if (data.navigationMenus && data.navigationMenus.length > 1) {\n const identifiers = data.navigationMenus.map((m) => m.identifier);\n const duplicateIds = identifiers.filter((id, i) => identifiers.indexOf(id) !== i);\n if (duplicateIds.length > 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Navigation menu identifiers must be unique. Duplicates: ${duplicateIds.join(', ')}`,\n path: ['navigationMenus'],\n });\n }\n }\n\n // Validate singleton content types have at most one entry\n if (data.contentTypes && data.entries) {\n const singletonKeys = new Set(\n data.contentTypes.filter((ct) => ct.isSingleton).map((ct) => ct.key)\n );\n\n for (const singletonKey of singletonKeys) {\n const entriesForType = data.entries.filter((e) => e.contentType === singletonKey);\n if (entriesForType.length > 1) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Singleton content type \"${singletonKey}\" cannot have more than one entry. Found ${entriesForType.length} entries.`,\n path: ['entries'],\n });\n }\n }\n }\n }) as z.ZodType<ContentConfig>;\n\n// ============================================================================\n// Type Exports\n// ============================================================================\n\nexport type ContentTypeConfigInput = z.input<typeof contentTypeConfigSchema>;\nexport type ContentTypeConfigOutput = z.output<typeof contentTypeConfigSchema>;\n\nexport type PageConfigInput = z.input<typeof pageConfigSchema>;\nexport type PageConfigOutput = z.output<typeof pageConfigSchema>;\n\nexport type EntryConfigInput = z.input<typeof entryConfigSchema>;\nexport type EntryConfigOutput = z.output<typeof entryConfigSchema>;\n\nexport type NavigationMenuConfigInput = z.input<typeof navigationMenuConfigSchema>;\nexport type NavigationMenuConfigOutput = z.output<typeof navigationMenuConfigSchema>;\n\nexport type ContentConfigInput = z.input<typeof contentConfigSchema>;\nexport type ContentConfigOutput = z.output<typeof contentConfigSchema>;\n\nexport type BindingSourceInput = z.input<typeof bindingSourceSchema>;\nexport type BindingSourceOutput = z.output<typeof bindingSourceSchema>;\n\nexport type TemplateBlockConfigInput = z.input<typeof templateBlockConfigSchema>;\nexport type TemplateBlockConfigOutput = z.output<typeof templateBlockConfigSchema>;\n\nexport type TemplateConfigInput = z.input<typeof templateConfigSchema>;\nexport type TemplateConfigOutput = z.output<typeof templateConfigSchema>;\n","/**\n * Validation functions for declarative node layouts in custom blocks.\n *\n * These functions validate that layouts only use allowed node types\n * and transform IDs. Used for strict save-time validation.\n */\n\nimport type { NodeDefinition } from '@riverbankcms/blocks';\nimport {\n ALLOWED_NODE_TYPES_SET,\n ALLOWED_TRANSFORM_IDS_SET,\n} from '@riverbankcms/blocks';\n\nexport interface LayoutValidationError {\n path: string;\n type: 'invalid_node_type' | 'invalid_transform_id';\n value: string;\n message: string;\n}\n\nexport interface LayoutValidationResult {\n valid: boolean;\n errors: LayoutValidationError[];\n}\n\n/**\n * Validate all node types in a layout tree.\n *\n * Recursively walks the node tree and checks that all `type` values\n * are in the allowed whitelist.\n *\n * @example\n * ```typescript\n * const result = validateLayoutNodeTypes(block.layout);\n * if (!result.valid) {\n * throw new Error(result.errors.map(e => e.message).join(', '));\n * }\n * ```\n */\nexport function validateLayoutNodeTypes(layout: NodeDefinition): LayoutValidationResult {\n const errors: LayoutValidationError[] = [];\n validateNodeTypesRecursive(layout, 'layout', errors);\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n\nfunction validateNodeTypesRecursive(\n node: NodeDefinition,\n path: string,\n errors: LayoutValidationError[]\n): void {\n // Validate the current node's type\n if (!ALLOWED_NODE_TYPES_SET.has(node.type)) {\n errors.push({\n path: `${path}.type`,\n type: 'invalid_node_type',\n value: node.type,\n message: `Unknown node type \"${node.type}\" at ${path}. Valid types: section, stack, text, etc.`,\n });\n }\n\n // Recursively validate children\n if (node.children && Array.isArray(node.children)) {\n node.children.forEach((child: NodeDefinition, index: number) => {\n validateNodeTypesRecursive(child, `${path}.children[${index}]`, errors);\n });\n }\n}\n\n/**\n * Validate all transform IDs in a layout tree.\n *\n * Recursively walks the node tree and checks that all transform IDs\n * in $bind.transforms are in the allowed whitelist.\n *\n * @example\n * ```typescript\n * const result = validateTransformIds(block.layout);\n * if (!result.valid) {\n * throw new Error(result.errors.map(e => e.message).join(', '));\n * }\n * ```\n */\nexport function validateTransformIds(layout: NodeDefinition): LayoutValidationResult {\n const errors: LayoutValidationError[] = [];\n validateTransformIdsRecursive(layout, 'layout', errors);\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n\nfunction validateTransformIdsRecursive(\n node: NodeDefinition,\n path: string,\n errors: LayoutValidationError[]\n): void {\n // Check transforms in $bind\n if (node.$bind?.transforms && Array.isArray(node.$bind.transforms)) {\n validateTransformList(node.$bind.transforms, `${path}.$bind.transforms`, errors);\n }\n\n // Check transforms in $repeat.collection (binding)\n if (node.$repeat?.collection?.transforms && Array.isArray(node.$repeat.collection.transforms)) {\n validateTransformList(node.$repeat.collection.transforms, `${path}.$repeat.collection.transforms`, errors);\n }\n\n // Check transforms in $when.when (binding)\n if (node.$when?.when?.transforms && Array.isArray(node.$when.when.transforms)) {\n validateTransformList(node.$when.when.transforms, `${path}.$when.when.transforms`, errors);\n }\n\n // Check transforms in $scopes[].from (each scope has a binding)\n if (node.$scopes && Array.isArray(node.$scopes)) {\n node.$scopes.forEach((scope: { from?: { transforms?: Array<{ id: string }> } }, index: number) => {\n if (scope.from?.transforms && Array.isArray(scope.from.transforms)) {\n validateTransformList(scope.from.transforms, `${path}.$scopes[${index}].from.transforms`, errors);\n }\n });\n }\n\n // Check transforms in props that might contain bindings\n if (node.props) {\n validatePropsTransforms(node.props, `${path}.props`, errors);\n }\n\n // Recursively validate children\n if (node.children && Array.isArray(node.children)) {\n node.children.forEach((child: NodeDefinition, index: number) => {\n validateTransformIdsRecursive(child, `${path}.children[${index}]`, errors);\n });\n }\n}\n\n/**\n * Validate a list of transforms against the allowed whitelist.\n */\nfunction validateTransformList(\n transforms: Array<{ id: string }>,\n path: string,\n errors: LayoutValidationError[]\n): void {\n transforms.forEach((transform, index) => {\n if (!ALLOWED_TRANSFORM_IDS_SET.has(transform.id)) {\n errors.push({\n path: `${path}[${index}].id`,\n type: 'invalid_transform_id',\n value: transform.id,\n message: `Unknown transform \"${transform.id}\" at ${path}. Valid transforms: string.uppercase, value.fallback, etc.`,\n });\n }\n });\n}\n\nfunction validatePropsTransforms(\n props: Record<string, unknown>,\n path: string,\n errors: LayoutValidationError[]\n): void {\n for (const [key, value] of Object.entries(props)) {\n if (isBindingObject(value)) {\n const binding = value as { $bind: { transforms?: Array<{ id: string }> } };\n if (binding.$bind.transforms && Array.isArray(binding.$bind.transforms)) {\n binding.$bind.transforms.forEach((transform, index) => {\n if (!ALLOWED_TRANSFORM_IDS_SET.has(transform.id)) {\n errors.push({\n path: `${path}.${key}.$bind.transforms[${index}].id`,\n type: 'invalid_transform_id',\n value: transform.id,\n message: `Unknown transform \"${transform.id}\" at ${path}.${key}. Valid transforms: string.uppercase, value.fallback, etc.`,\n });\n }\n });\n }\n } else if (value && typeof value === 'object' && !Array.isArray(value)) {\n // Recurse into nested objects\n validatePropsTransforms(value as Record<string, unknown>, `${path}.${key}`, errors);\n }\n }\n}\n\nfunction isBindingObject(value: unknown): boolean {\n return (\n value !== null &&\n typeof value === 'object' &&\n '$bind' in (value as Record<string, unknown>) &&\n typeof (value as Record<string, unknown>).$bind === 'object'\n );\n}\n\n/**\n * Validate a complete layout (both node types and transform IDs).\n *\n * Combines validateLayoutNodeTypes and validateTransformIds into\n * a single validation pass.\n *\n * @example\n * ```typescript\n * const result = validateLayout(block.layout);\n * if (!result.valid) {\n * return { error: result.errors.map(e => e.message).join(', ') };\n * }\n * ```\n */\nexport function validateLayout(layout: NodeDefinition): LayoutValidationResult {\n const nodeTypeResult = validateLayoutNodeTypes(layout);\n const transformResult = validateTransformIds(layout);\n\n return {\n valid: nodeTypeResult.valid && transformResult.valid,\n errors: [...nodeTypeResult.errors, ...transformResult.errors],\n };\n}\n","import { z } from 'zod';\n\nconst navIdListSchema = z.preprocess((value) => {\n if (!Array.isArray(value)) return undefined;\n const filtered = value.filter((v) => typeof v === 'string' && v.trim().length > 0);\n return filtered.length > 0 ? filtered : undefined;\n}, z.array(z.string()).max(200, 'Maximum 200 nav IDs').optional());\n\nexport const dashboardNavVisibilityBaseSchema = z\n .object({\n mode: z.enum(['augment', 'restrict']).optional(),\n allowIds: navIdListSchema,\n denyIds: navIdListSchema,\n })\n .strip();\n\nexport const dashboardNavVisibilityRolesSchema = z\n .object({\n administrator: dashboardNavVisibilityBaseSchema.optional(),\n editor: dashboardNavVisibilityBaseSchema.optional(),\n team_member: dashboardNavVisibilityBaseSchema.optional(),\n event_host: dashboardNavVisibilityBaseSchema.optional(),\n })\n .strip()\n .optional();\n\nexport const dashboardNavVisibilitySchema = dashboardNavVisibilityBaseSchema\n .extend({\n roles: dashboardNavVisibilityRolesSchema,\n })\n .strip();\n\nexport const dashboardNavigationConfigSchema = z\n .object({\n siteNav: dashboardNavVisibilitySchema.optional(),\n settingsNav: dashboardNavVisibilitySchema.optional(),\n })\n .strip();\n\nexport const dashboardConfigSchema = z\n .object({\n previewEditingEnabled: z.boolean().optional(),\n navigation: dashboardNavigationConfigSchema.optional(),\n })\n .strip();\n"],"mappings":"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","names":["z","z","z"]}