@riverbankcms/sdk 0.4.2 → 0.5.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 (180) hide show
  1. package/README.md +84 -0
  2. package/dist/cli/index.js +3104 -120
  3. package/dist/cli/index.js.map +1 -1
  4. package/dist/client/analytics.js +1 -1
  5. package/dist/client/analytics.js.map +1 -1
  6. package/dist/client/analytics.mjs +1 -1
  7. package/dist/client/analytics.mjs.map +1 -1
  8. package/dist/client/bookings.js +6 -6
  9. package/dist/client/bookings.js.map +1 -1
  10. package/dist/client/bookings.mjs +6 -6
  11. package/dist/client/bookings.mjs.map +1 -1
  12. package/dist/client/client.d.mts +2 -2
  13. package/dist/client/client.d.ts +2 -2
  14. package/dist/client/client.js +1368 -520
  15. package/dist/client/client.js.map +1 -1
  16. package/dist/client/client.mjs +1368 -520
  17. package/dist/client/client.mjs.map +1 -1
  18. package/dist/client/hooks.d.mts +2 -2
  19. package/dist/client/hooks.d.ts +2 -2
  20. package/dist/client/hooks.js +26 -11
  21. package/dist/client/hooks.js.map +1 -1
  22. package/dist/client/hooks.mjs +26 -11
  23. package/dist/client/hooks.mjs.map +1 -1
  24. package/dist/client/rendering/client.js +24 -14
  25. package/dist/client/rendering/client.js.map +1 -1
  26. package/dist/client/rendering/client.mjs +24 -14
  27. package/dist/client/rendering/client.mjs.map +1 -1
  28. package/dist/client/usePage--fGlyrgj.d.mts +6439 -0
  29. package/dist/client/usePage-BTPnCuWC.d.mts +6511 -0
  30. package/dist/client/usePage-BafOS9UT.d.mts +6512 -0
  31. package/dist/client/usePage-Bnx-kA6x.d.mts +6670 -0
  32. package/dist/client/usePage-CE7X5NcN.d.ts +6439 -0
  33. package/dist/client/usePage-DoPI6b8V.d.ts +6511 -0
  34. package/dist/client/usePage-QNWArrVO.d.ts +6670 -0
  35. package/dist/client/usePage-fBgPB6Oq.d.ts +6512 -0
  36. package/dist/server/{Layout-kRv5sU81.d.ts → Layout-B-q2Py4v.d.ts} +4 -4
  37. package/dist/server/{Layout-ByUnm35V.d.mts → Layout-Cc5HUXAH.d.mts} +4 -4
  38. package/dist/server/{chunk-6JBKKV3G.js → chunk-2KCF2DNK.js} +30 -10
  39. package/dist/server/chunk-2KCF2DNK.js.map +1 -0
  40. package/dist/server/{chunk-N3PX76AP.mjs → chunk-4HIRA33Z.mjs} +247 -135
  41. package/dist/server/chunk-4HIRA33Z.mjs.map +1 -0
  42. package/dist/server/chunk-5STV4MWD.js +189 -0
  43. package/dist/server/chunk-5STV4MWD.js.map +1 -0
  44. package/dist/server/{chunk-R5B6IOFQ.js → chunk-6OSNCH4F.js} +247 -135
  45. package/dist/server/chunk-6OSNCH4F.js.map +1 -0
  46. package/dist/server/{chunk-TKMA6D6U.js → chunk-7UPVCT3K.js} +1215 -497
  47. package/dist/server/chunk-7UPVCT3K.js.map +1 -0
  48. package/dist/server/{chunk-7DS4Q3GA.mjs → chunk-AEFWG657.mjs} +3 -3
  49. package/dist/server/chunk-AEFWG657.mjs.map +1 -0
  50. package/dist/server/{chunk-USQF2XTU.mjs → chunk-BYBJA6SP.mjs} +26 -11
  51. package/dist/server/chunk-BYBJA6SP.mjs.map +1 -0
  52. package/dist/server/{chunk-ZEAJW6T3.mjs → chunk-C6FIJC7T.mjs} +4 -3
  53. package/dist/server/chunk-C6FIJC7T.mjs.map +1 -0
  54. package/dist/server/{chunk-TO7FD6TQ.js → chunk-I2D7KOEA.js} +4 -4
  55. package/dist/server/{chunk-TO7FD6TQ.js.map → chunk-I2D7KOEA.js.map} +1 -1
  56. package/dist/server/chunk-KFLZGNPO.mjs +189 -0
  57. package/dist/server/chunk-KFLZGNPO.mjs.map +1 -0
  58. package/dist/server/chunk-L5EA4FXU.mjs +134 -0
  59. package/dist/server/chunk-L5EA4FXU.mjs.map +1 -0
  60. package/dist/server/{chunk-TNRADRPH.mjs → chunk-LNOUXALA.mjs} +1137 -419
  61. package/dist/server/chunk-LNOUXALA.mjs.map +1 -0
  62. package/dist/server/{chunk-SPXMMX3C.mjs → chunk-OSF34JTQ.mjs} +4 -4
  63. package/dist/server/{chunk-SWPHIUVE.js → chunk-P3NNN73G.js} +5 -4
  64. package/dist/server/chunk-P3NNN73G.js.map +1 -0
  65. package/dist/server/{chunk-I6K5REFT.mjs → chunk-P4K63SBZ.mjs} +24 -4
  66. package/dist/server/chunk-P4K63SBZ.mjs.map +1 -0
  67. package/dist/server/{chunk-HOY77YBF.js → chunk-RVDS7VSP.js} +5 -5
  68. package/dist/server/chunk-RVDS7VSP.js.map +1 -0
  69. package/dist/server/{chunk-NW5KHH4A.js → chunk-TT5JWA4X.js} +9 -9
  70. package/dist/server/{chunk-NW5KHH4A.js.map → chunk-TT5JWA4X.js.map} +1 -1
  71. package/dist/server/chunk-VSFQRHYZ.js +134 -0
  72. package/dist/server/chunk-VSFQRHYZ.js.map +1 -0
  73. package/dist/server/{chunk-EGTDJ4PL.js → chunk-YYO3RIFO.js} +26 -11
  74. package/dist/server/chunk-YYO3RIFO.js.map +1 -0
  75. package/dist/server/{chunk-OP2GHK27.mjs → chunk-Z5ZA6Q4D.mjs} +2 -2
  76. package/dist/server/{components-D1Z2mSDr.d.ts → components-CU46ZkAv.d.mts} +20 -75
  77. package/dist/server/{components-CY8jDQjv.d.mts → components-DvozDwRN.d.ts} +20 -75
  78. package/dist/server/components.d.mts +11 -8
  79. package/dist/server/components.d.ts +11 -8
  80. package/dist/server/components.js +5 -4
  81. package/dist/server/components.js.map +1 -1
  82. package/dist/server/components.mjs +4 -3
  83. package/dist/server/config-validation.d.mts +3 -3
  84. package/dist/server/config-validation.d.ts +3 -3
  85. package/dist/server/config-validation.js +9 -5
  86. package/dist/server/config-validation.js.map +1 -1
  87. package/dist/server/config-validation.mjs +8 -4
  88. package/dist/server/config.d.mts +243 -5
  89. package/dist/server/config.d.ts +243 -5
  90. package/dist/server/config.js +72 -5
  91. package/dist/server/config.js.map +1 -1
  92. package/dist/server/config.mjs +72 -5
  93. package/dist/server/config.mjs.map +1 -1
  94. package/dist/server/core-DsNWrl3o.d.mts +44 -0
  95. package/dist/server/core-DsNWrl3o.d.ts +44 -0
  96. package/dist/server/data.d.mts +4 -3
  97. package/dist/server/data.d.ts +4 -3
  98. package/dist/server/data.js +3 -3
  99. package/dist/server/data.mjs +2 -2
  100. package/dist/server/{index-DCIz9Ptv.d.ts → index-CJfMXZQr.d.ts} +2 -1
  101. package/dist/server/{index-DFQwtj3J.d.mts → index-Q7RLMAQ6.d.mts} +2 -1
  102. package/dist/server/index.d.mts +63 -6
  103. package/dist/server/index.d.ts +63 -6
  104. package/dist/server/index.js +91 -2
  105. package/dist/server/index.js.map +1 -1
  106. package/dist/server/index.mjs +90 -1
  107. package/dist/server/index.mjs.map +1 -1
  108. package/dist/server/link-DjxLyC82.d.mts +23 -0
  109. package/dist/server/link-DjxLyC82.d.ts +23 -0
  110. package/dist/server/{loadContent-CWuE8FCx.d.mts → loadContent-DgpSKWqY.d.mts} +4 -4
  111. package/dist/server/{loadContent-DynBuR5f.d.ts → loadContent-GPvUI1bN.d.ts} +4 -4
  112. package/dist/server/{loadPage-B8RmlYgV.d.mts → loadPage-DGnIK7s4.d.mts} +17 -47
  113. package/dist/server/loadPage-DNQTTRHL.mjs +11 -0
  114. package/dist/server/{loadPage-BTkKpizX.d.ts → loadPage-DW9WB-u9.d.ts} +17 -47
  115. package/dist/server/loadPage-IDGVDFBB.js +11 -0
  116. package/dist/server/{loadPage-DUHBXDEW.js.map → loadPage-IDGVDFBB.js.map} +1 -1
  117. package/dist/server/metadata.d.mts +6 -4
  118. package/dist/server/metadata.d.ts +6 -4
  119. package/dist/server/navigation.d.mts +199 -29
  120. package/dist/server/navigation.d.ts +199 -29
  121. package/dist/server/navigation.js +27 -43
  122. package/dist/server/navigation.js.map +1 -1
  123. package/dist/server/navigation.mjs +20 -36
  124. package/dist/server/navigation.mjs.map +1 -1
  125. package/dist/server/rendering/server.d.mts +8 -6
  126. package/dist/server/rendering/server.d.ts +8 -6
  127. package/dist/server/rendering/server.js +7 -6
  128. package/dist/server/rendering/server.js.map +1 -1
  129. package/dist/server/rendering/server.mjs +6 -5
  130. package/dist/server/rendering.d.mts +14 -10
  131. package/dist/server/rendering.d.ts +14 -10
  132. package/dist/server/rendering.js +9 -8
  133. package/dist/server/rendering.js.map +1 -1
  134. package/dist/server/rendering.mjs +8 -7
  135. package/dist/server/richTextSchema-DURiozvD.d.mts +62 -0
  136. package/dist/server/richTextSchema-DURiozvD.d.ts +62 -0
  137. package/dist/server/routing.d.mts +178 -11
  138. package/dist/server/routing.d.ts +178 -11
  139. package/dist/server/routing.js +95 -2
  140. package/dist/server/routing.js.map +1 -1
  141. package/dist/server/routing.mjs +94 -1
  142. package/dist/server/routing.mjs.map +1 -1
  143. package/dist/server/{schema-Bpy9N5ZI.d.ts → schema-Z6-afHJG.d.mts} +1 -1
  144. package/dist/server/{schema-Bpy9N5ZI.d.mts → schema-Z6-afHJG.d.ts} +1 -1
  145. package/dist/server/server.d.mts +9 -7
  146. package/dist/server/server.d.ts +9 -7
  147. package/dist/server/server.js +6 -6
  148. package/dist/server/server.mjs +5 -5
  149. package/dist/server/theme-bridge.js +8 -8
  150. package/dist/server/theme-bridge.mjs +2 -2
  151. package/dist/server/{types-oCM-fw4O.d.ts → types-0f4PIlgx.d.mts} +55 -2
  152. package/dist/server/{types-txWsSxN7.d.mts → types-BjgZt8xJ.d.mts} +63 -2
  153. package/dist/server/{types-BiRZnxDx.d.ts → types-C28kMfa1.d.ts} +256 -82
  154. package/dist/server/{types-CL916r6x.d.ts → types-DLBhEPSt.d.ts} +63 -2
  155. package/dist/server/{types-CdrJqlKx.d.mts → types-DuzJZKJI.d.mts} +256 -82
  156. package/dist/server/{types-DkKEctWn.d.mts → types-kOQyCFXO.d.ts} +55 -2
  157. package/dist/server/{validation-DzvDwwRo.d.mts → validation-BGuRo8P1.d.mts} +18 -5
  158. package/dist/server/{validation-CoU8uAiu.d.ts → validation-DU2YE7u5.d.ts} +18 -5
  159. package/package.json +5 -3
  160. package/dist/server/chunk-6JBKKV3G.js.map +0 -1
  161. package/dist/server/chunk-7BOIO2S7.mjs +0 -833
  162. package/dist/server/chunk-7BOIO2S7.mjs.map +0 -1
  163. package/dist/server/chunk-7DS4Q3GA.mjs.map +0 -1
  164. package/dist/server/chunk-BLKVTULP.js +0 -833
  165. package/dist/server/chunk-BLKVTULP.js.map +0 -1
  166. package/dist/server/chunk-EGTDJ4PL.js.map +0 -1
  167. package/dist/server/chunk-HOY77YBF.js.map +0 -1
  168. package/dist/server/chunk-I6K5REFT.mjs.map +0 -1
  169. package/dist/server/chunk-N3PX76AP.mjs.map +0 -1
  170. package/dist/server/chunk-R5B6IOFQ.js.map +0 -1
  171. package/dist/server/chunk-SWPHIUVE.js.map +0 -1
  172. package/dist/server/chunk-TKMA6D6U.js.map +0 -1
  173. package/dist/server/chunk-TNRADRPH.mjs.map +0 -1
  174. package/dist/server/chunk-USQF2XTU.mjs.map +0 -1
  175. package/dist/server/chunk-ZEAJW6T3.mjs.map +0 -1
  176. package/dist/server/loadPage-DUHBXDEW.js +0 -11
  177. package/dist/server/loadPage-LYVKY3WZ.mjs +0 -11
  178. /package/dist/server/{chunk-SPXMMX3C.mjs.map → chunk-OSF34JTQ.mjs.map} +0 -0
  179. /package/dist/server/{chunk-OP2GHK27.mjs.map → chunk-Z5ZA6Q4D.mjs.map} +0 -0
  180. /package/dist/server/{loadPage-LYVKY3WZ.mjs.map → loadPage-DNQTTRHL.mjs.map} +0 -0
@@ -2,13 +2,13 @@ import {
2
2
  buildThemeRuntime,
3
3
  getDefaultComponentRegistry,
4
4
  makeDefaultBlockComponent
5
- } from "./chunk-TNRADRPH.mjs";
5
+ } from "./chunk-LNOUXALA.mjs";
6
6
  import {
7
7
  prefetchBlockData
8
- } from "./chunk-7DS4Q3GA.mjs";
8
+ } from "./chunk-AEFWG657.mjs";
9
9
  import {
10
10
  getBlockDefinition
11
- } from "./chunk-USQF2XTU.mjs";
11
+ } from "./chunk-BYBJA6SP.mjs";
12
12
 
13
13
  // src/rendering/components/Block.tsx
14
14
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -89,4 +89,4 @@ async function Block({
89
89
  export {
90
90
  Block
91
91
  };
92
- //# sourceMappingURL=chunk-SPXMMX3C.mjs.map
92
+ //# sourceMappingURL=chunk-OSF34JTQ.mjs.map
@@ -4,7 +4,7 @@
4
4
  var _chunkY7347JMZjs = require('./chunk-Y7347JMZ.js');
5
5
 
6
6
 
7
- var _chunkHOY77YBFjs = require('./chunk-HOY77YBF.js');
7
+ var _chunkRVDS7VSPjs = require('./chunk-RVDS7VSP.js');
8
8
 
9
9
  // src/rendering/helpers/loadPage.ts
10
10
  async function loadPage(params) {
@@ -55,7 +55,7 @@ async function loadPage(params) {
55
55
  previewStage: preview ? "preview" : "published",
56
56
  searchParams
57
57
  };
58
- const configData = await _chunkHOY77YBFjs.prefetchBlockData.call(void 0,
58
+ const configData = await _chunkRVDS7VSPjs.prefetchBlockData.call(void 0,
59
59
  pageOutline,
60
60
  prefetchContext,
61
61
  client,
@@ -74,7 +74,8 @@ async function loadPage(params) {
74
74
  theme: site.theme,
75
75
  sdkConfig: _nullishCoalesce(site.sdkConfig, () => ( null)),
76
76
  siteId,
77
- resolvedData
77
+ resolvedData,
78
+ supabaseUrl: site.supabaseUrl
78
79
  // Note: routeMap is optional and can be built from site data if needed for internal links.
79
80
  // Consumers can construct it from site.pages and pass explicitly via Page component props.
80
81
  // Example: const routeMap = site.pages.reduce((map, p) => ({ ...map, [p.id]: p.path }), {});
@@ -84,4 +85,4 @@ async function loadPage(params) {
84
85
 
85
86
 
86
87
  exports.loadPage = loadPage;
87
- //# sourceMappingURL=chunk-SWPHIUVE.js.map
88
+ //# sourceMappingURL=chunk-P3NNN73G.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/chunk-P3NNN73G.js","../../src/rendering/helpers/loadPage.ts"],"names":[],"mappings":"AAAA;AACE;AACA;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACA;AC6IA,MAAA,SAAsB,QAAA,CAAS,MAAA,EAAiD;AAC9E,EAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,QAAA,EAAU,KAAA,EAAO,mBAAA,EAAqB,aAAa,EAAA,EAAI,MAAA;AAG7F,EAAA,MAAM,CAAC,IAAA,EAAM,YAAY,EAAA,EAAI,MAAM,OAAA,CAAQ,GAAA,CAAI;AAAA,IAC7C,MAAA,CAAO,OAAA,CAAQ,EAAE,EAAA,EAAI,OAAO,CAAC,CAAA;AAAA,IAC7B,MAAA,CAAO,OAAA,CAAQ,EAAE,MAAA,EAAQ,IAAA,EAAM,QAAQ,CAAC;AAAA,EAC1C,CAAC,CAAA;AAGD,EAAA,GAAA,CAAI,QAAA,GAAW,YAAA,EAAc;AAC3B,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,IAGF,CAAA;AAAA,EACF;AAEA,EAAA,MAAM,EAAE,IAAA,EAAM,SAAS,EAAA,EAAI,YAAA;AAI3B,EAAA,MAAM,OAAA,EAAS,QAAA,CAAS,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,EAAA,GAAU;AAC5C,IAAA,GAAA,CAAI,CAAC,MAAA,GAAS,OAAO,MAAA,IAAU,QAAA,EAAU;AACvC,MAAA,MAAM,IAAI,KAAA,CAAM,sCAAsC,CAAA;AAAA,IACxD;AACA,IAAA,GAAA,CAAI,OAAO,KAAA,CAAM,GAAA,IAAO,SAAA,GAAY,KAAA,CAAM,GAAA,IAAO,IAAA,EAAM;AACrD,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,+CAAA,EAAkD,OAAO,KAAA,CAAM,EAAE,CAAA,CAAA;AACnF,IAAA;AACoC,IAAA;AAC6C,MAAA;AACjF,IAAA;AACuC,IAAA;AACuC,MAAA;AAC9E,IAAA;AAKmB,IAAA;AAQZ,IAAA;AACU,MAAA;AACE,MAAA;AACG,MAAA;AAAA;AAEY,MAAA;AAAA;AAEe,MAAA;AACjD,IAAA;AACD,EAAA;AAEmB,EAAA;AACH,IAAA;AACA,IAAA;AACG,IAAA;AAClB,IAAA;AACF,EAAA;AAQI,EAAA;AACF,IAAA;AAC2B,IAAA;AACS,IAAA;AACpC,IAAA;AACF,EAAA;AAOyB,EAAA;AACvB,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AAAA;AAEgC,MAAA;AAChC,IAAA;AACF,EAAA;AAGmB,EAAA;AACqD,EAAA;AACE,IAAA;AAClB,IAAA;AACxD,EAAA;AAEO,EAAA;AACC,IAAA;AACM,IAAA;AACiB,IAAA;AAC7B,IAAA;AACA,IAAA;AACkB,IAAA;AAAA;AAAA;AAAA;AAIpB,EAAA;AACF;ADjLwF;AACA;AACA;AACA","file":"/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/chunk-P3NNN73G.js","sourcesContent":[null,"/**\n * Server-side helper to fetch all data needed for <Page> component.\n *\n * Use this in server components, getServerSideProps, or API routes.\n */\n\nimport type { RiverbankClient, SiteResponse } from '../../client/types';\nimport type { PageProps } from '../components/Page';\nimport { prefetchBlockData } from '../../data/prefetchBlockData';\nimport { executeCodeLoaders, mergeLoaderResults } from '../../data/executeCodeLoaders';\nimport type { DataLoaderOverrides } from '../../data/types';\n\n/**\n * SDK config from API response (without siteId which is stripped at storage).\n * This is the runtime representation - for defining configs, use RiverbankSiteConfig.\n */\nexport type RuntimeSdkConfig = NonNullable<SiteResponse['sdkConfig']>;\n\nexport type LoadPageParams = {\n client: RiverbankClient;\n siteId: string;\n path: string;\n pageId?: string;\n /**\n * If true, fetches draft/unpublished content instead of published content.\n * This affects both the page structure and block data loaders.\n * Requires API key with site access.\n *\n * @default false\n */\n preview?: boolean;\n /**\n * Code-based data loaders for custom blocks.\n *\n * Use this to fetch data from external APIs (not just whitelisted CMS endpoints).\n * Keys are block kinds (e.g., 'custom.featured-products').\n *\n * Config-based loaders (defined in riverbank.config.ts) run first.\n * Code loaders run second and take precedence on key conflicts.\n *\n * @example\n * ```typescript\n * const pageData = await loadPage({\n * client,\n * siteId: 'site-123',\n * path: '/',\n * dataLoaderOverrides: {\n * 'custom.featured-products': {\n * products: async (ctx) => {\n * const res = await fetch(`https://api.shop.com/products?category=${ctx.content.categoryId}`);\n * return res.json();\n * },\n * },\n * },\n * });\n * ```\n */\n dataLoaderOverrides?: DataLoaderOverrides;\n /**\n * URL search parameters from the page request.\n * Passed to code-based data loaders for pagination, filtering, etc.\n *\n * @example\n * ```typescript\n * // In Next.js App Router\n * export default async function Page({ params, searchParams }) {\n * const pageData = await loadPage({\n * client,\n * siteId: 'site-123',\n * path: `/${params.slug || ''}`,\n * searchParams: await searchParams,\n * });\n * return <Page {...pageData} />;\n * }\n * ```\n */\n searchParams?: Record<string, string | string[] | undefined>;\n};\n\nexport type LoadPageResult = Omit<PageProps, 'registry' | 'wrapBlock' | 'usePlaceholders' | 'blockOverrides'> & {\n /**\n * SDK site configuration, if available.\n * Contains SDK-defined theme palette, section backgrounds, and style options.\n */\n sdkConfig: RuntimeSdkConfig | null;\n /**\n * Supabase storage URL for direct image access.\n * SDK sites use this instead of NEXT_PUBLIC_SUPABASE_URL env var.\n */\n supabaseUrl?: string;\n};\n\n/**\n * Server-side helper to fetch all data needed for <Page> component.\n *\n * Fetches site data, page data, and prefetches block data loaders in parallel.\n *\n * @example Next.js App Router (published content)\n * ```tsx\n * import { createRiverbankClient } from '@riverbankcms/sdk';\n * import { loadPage, Page } from '@riverbankcms/sdk/rendering';\n *\n * const client = createRiverbankClient({\n * apiKey: process.env.RIVERBANK_API_KEY!,\n * baseUrl: process.env.NEXT_PUBLIC_DASHBOARD_URL + '/api',\n * });\n *\n * export default async function PageRoute({ params }) {\n * const pageData = await loadPage({\n * client,\n * siteId: 'site-123',\n * path: `/${params.slug || ''}`,\n * });\n *\n * return <Page {...pageData} />;\n * }\n * ```\n *\n * @example Next.js App Router (preview/draft content)\n * ```tsx\n * export default async function PreviewRoute({ params, searchParams }) {\n * const pageData = await loadPage({\n * client,\n * siteId: searchParams.siteId,\n * path: `/${params.slug || ''}`,\n * preview: true, // Fetch draft content\n * });\n *\n * return <Page {...pageData} />;\n * }\n * ```\n *\n * @example Next.js Pages Router (getServerSideProps)\n * ```tsx\n * export async function getServerSideProps({ params }) {\n * const pageData = await loadPage({\n * client,\n * siteId: 'site-123',\n * path: `/${params.slug || ''}`,\n * });\n *\n * return { props: pageData };\n * }\n *\n * export default function PageRoute(props) {\n * return <Page {...props} />;\n * }\n * ```\n */\nexport async function loadPage(params: LoadPageParams): Promise<LoadPageResult> {\n const { client, siteId, path, pageId, preview = false, dataLoaderOverrides, searchParams } = params;\n\n // Fetch site and page data in parallel\n const [site, pageResponse] = await Promise.all([\n client.getSite({ id: siteId }),\n client.getPage({ siteId, path, preview }),\n ]);\n\n // Extract page data (getContentByPath can return page or entry)\n if ('entry' in pageResponse) {\n throw new Error(\n 'This path resolves to a content entry, not a page. ' +\n 'Use loadContent() instead, which handles both pages and entries. ' +\n 'For entries, loadContent() returns the raw entry data for custom rendering.'\n );\n }\n\n const { page: pageData } = pageResponse;\n\n // Convert API response blocks to PageOutline format with content\n // API returns blocks with full content - PageRenderer needs the content field for rendering\n const blocks = pageData.blocks.map((block) => {\n if (!block || typeof block !== 'object') {\n throw new Error('Invalid block format in API response');\n }\n if (typeof block.id !== 'string' && block.id !== null) {\n throw new Error(`Invalid block id: expected string or null, got ${typeof block.id}`);\n }\n if (typeof block.kind !== 'string') {\n throw new Error(`Invalid block kind: expected string, got ${typeof block.kind}`);\n }\n if (typeof block.purpose !== 'string') {\n throw new Error(`Invalid block purpose: expected string, got ${typeof block.purpose}`);\n }\n\n // Include content for rendering\n // API provides `content` (active content for the requested stage)\n // and optionally `draftContent` for preview mode\n const typedBlock = block as {\n id: string | null;\n kind: string;\n purpose: string;\n content?: Record<string, unknown>;\n draftContent?: { data: Record<string, unknown> } | null;\n };\n\n return {\n id: typedBlock.id,\n kind: typedBlock.kind,\n purpose: typedBlock.purpose,\n // Include content for PageRenderer's getRenderableContent()\n content: typedBlock.content ?? {},\n // Include draftContent if available (for preview mode)\n draftContent: typedBlock.draftContent?.data ?? null,\n };\n });\n\n const pageOutline = {\n name: pageData.name,\n path: pageData.path,\n purpose: pageData.purpose,\n blocks,\n };\n\n // Build prefetch context\n const prefetchContext: {\n siteId: string;\n pageId: string;\n previewStage: 'published' | 'preview';\n searchParams?: Record<string, string | string[] | undefined>;\n } = {\n siteId,\n pageId: pageId ?? pageData.id,\n previewStage: preview ? 'preview' : 'published',\n searchParams,\n };\n\n // Prefetch block data loaders (config-based loaders for CMS endpoints)\n // Note: searchParams is intentionally NOT passed to config-based loaders.\n // Config loaders call CMS endpoints which don't need URL params.\n // Only code-based loaders (dataLoaderOverrides) receive searchParams for\n // custom pagination, filtering, and sorting via external APIs.\n const configData = await prefetchBlockData(\n pageOutline,\n prefetchContext,\n client,\n {\n // Pass custom blocks so their config-based loaders are discovered\n customBlocks: site.sdkConfig?.customBlocks,\n }\n );\n\n // Execute code-based loaders (external APIs) and merge results\n let resolvedData = configData;\n if (dataLoaderOverrides && Object.keys(dataLoaderOverrides).length > 0) {\n const codeData = await executeCodeLoaders(pageOutline, prefetchContext, dataLoaderOverrides);\n resolvedData = mergeLoaderResults(configData, codeData);\n }\n\n return {\n page: pageOutline,\n theme: site.theme,\n sdkConfig: site.sdkConfig ?? null,\n siteId,\n resolvedData,\n supabaseUrl: site.supabaseUrl,\n // Note: routeMap is optional and can be built from site data if needed for internal links.\n // Consumers can construct it from site.pages and pass explicitly via Page component props.\n // Example: const routeMap = site.pages.reduce((map, p) => ({ ...map, [p.id]: p.path }), {});\n };\n}\n"]}
@@ -3,12 +3,12 @@ import {
3
3
  } from "./chunk-D2QLTPUJ.mjs";
4
4
  import {
5
5
  SUPPORTED_LOADER_ENDPOINTS
6
- } from "./chunk-7DS4Q3GA.mjs";
6
+ } from "./chunk-AEFWG657.mjs";
7
7
  import {
8
8
  blockCategoryEnum,
9
9
  fieldSchema,
10
10
  getBlockDefinition
11
- } from "./chunk-USQF2XTU.mjs";
11
+ } from "./chunk-BYBJA6SP.mjs";
12
12
 
13
13
  // src/config/validation.ts
14
14
  import { z as z2 } from "zod";
@@ -218,6 +218,15 @@ var sdkThemePaletteSchema = z2.record(z2.string(), z2.string());
218
218
  var sdkThemeConfigSchema = z2.object({
219
219
  palette: sdkThemePaletteSchema
220
220
  });
221
+ var sdkSiteUrlSchema = z2.string().url("Must be a valid URL").refine((url) => {
222
+ try {
223
+ const parsed = new URL(url);
224
+ const isLocal = ["localhost", "lvh.me"].includes(parsed.hostname) || parsed.hostname.endsWith(".local") || parsed.hostname.endsWith(".test") || parsed.hostname.endsWith(".lvh.me");
225
+ return parsed.protocol === "https:" || isLocal;
226
+ } catch {
227
+ return false;
228
+ }
229
+ }, { message: "Production URLs must use HTTPS" }).transform((url) => url.replace(/\/$/, ""));
221
230
  var sectionBackgroundSchema = z2.object({
222
231
  id: z2.string(),
223
232
  label: z2.string(),
@@ -351,6 +360,10 @@ function validateFieldIdConflicts(blockFieldExtensions) {
351
360
  }
352
361
  return conflicts;
353
362
  }
363
+ var syncConfigSchema = z2.object({
364
+ existingEntries: z2.enum(["skip", "update"]).optional(),
365
+ contentTarget: z2.enum(["draft", "publish"]).optional()
366
+ }).optional();
354
367
  var sdkCustomBlockSchema = z2.object({
355
368
  // Block ID must start with 'custom.'
356
369
  id: z2.string().min(8).regex(/^custom\.[a-z][a-z0-9-]*$/, {
@@ -379,6 +392,8 @@ var sdkCustomBlockSchema = z2.object({
379
392
  );
380
393
  var riverbankSiteConfigSchema = z2.object({
381
394
  siteId: z2.string().uuid(),
395
+ previewUrl: sdkSiteUrlSchema.optional(),
396
+ liveUrl: sdkSiteUrlSchema.optional(),
382
397
  theme: sdkThemeConfigSchema.optional(),
383
398
  styles: siteStyleConfigSchema,
384
399
  customBlocks: z2.array(sdkCustomBlockSchema).max(20, "Maximum 20 custom blocks per site").refine(
@@ -391,7 +406,10 @@ var riverbankSiteConfigSchema = z2.object({
391
406
  ).optional(),
392
407
  blockFieldOptions: blockFieldOptionsSchema,
393
408
  blockFieldExtensions: blockFieldExtensionsSchema,
394
- content: contentConfigSchema.optional()
409
+ content: contentConfigSchema.optional(),
410
+ // CLI-related configuration (Phase 4)
411
+ contentDir: z2.string().optional(),
412
+ sync: syncConfigSchema
395
413
  }).strict();
396
414
 
397
415
  export {
@@ -405,6 +423,7 @@ export {
405
423
  contentConfigSchema,
406
424
  sdkThemePaletteSchema,
407
425
  sdkThemeConfigSchema,
426
+ sdkSiteUrlSchema,
408
427
  sectionBackgroundSchema,
409
428
  sectionSpacingSchema,
410
429
  containerMaxWidthSchema,
@@ -423,7 +442,8 @@ export {
423
442
  blockFieldExtensionSchema,
424
443
  blockFieldExtensionsSchema,
425
444
  validateFieldIdConflicts,
445
+ syncConfigSchema,
426
446
  sdkCustomBlockSchema,
427
447
  riverbankSiteConfigSchema
428
448
  };
429
- //# sourceMappingURL=chunk-I6K5REFT.mjs.map
449
+ //# sourceMappingURL=chunk-P4K63SBZ.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/config/validation.ts","../../src/config/content-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, type SdkCustomBlock, type FieldDefinition } from '@riverbankcms/blocks';\nimport type { RiverbankSiteConfig, BlockFieldOptionsMap, BlockFieldExtensionsMap, BlockFieldExtension, SyncConfig } from './types';\nimport { contentConfigSchema } from './content-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 = ['localhost', 'lvh.me'].includes(parsed.hostname)\n || parsed.hostname.endsWith('.local')\n || parsed.hostname.endsWith('.test')\n || parsed.hostname.endsWith('.lvh.me');\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 return data.fields.every((field: FieldDefinition) => {\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.bodyText', '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 z.string().regex(/^block\\.[a-z][a-zA-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 */\nexport const syncConfigSchema: z.ZodType<SyncConfig> = z.object({\n existingEntries: z.enum(['skip', 'update']).optional(),\n contentTarget: z.enum(['draft', 'publish']).optional(),\n}).optional() as z.ZodType<SyncConfig>;\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}).refine(\n // Validate titleSource references a valid field if provided\n (data) => {\n if (!data.titleSource) return true;\n return data.fields.some(f => f.id === data.titleSource);\n },\n {\n message: \"titleSource must reference a valid field ID\",\n path: [\"titleSource\"],\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 */\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 customBlocks: z.array(sdkCustomBlockSchema)\n .max(20, \"Maximum 20 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}).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';\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 */\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 any[] 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 })\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 ) as z.ZodType<ContentTypeConfig>;\n\n// ============================================================================\n// Block Config Schema\n// ============================================================================\n\n/**\n * Block kind validation.\n * Must be either a system block kind (e.g., 'block.hero') or a custom block kind (e.g., 'custom.myBlock').\n */\nconst blockKindSchema = z.string().refine(\n (kind) => {\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 {\n message:\n 'Block kind must be a system block (e.g., \"block.hero\") or a custom block (e.g., \"custom.myBlock\")',\n }\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 title: z.string().optional(),\n summary: z.string().optional(),\n metaTitle: z.string().optional(),\n metaDescription: z.string().optional(),\n});\n\n// ============================================================================\n// Navigation Config Schema\n// ============================================================================\n\nconst pageLinkSchema = z.object({\n kind: z.literal('page'),\n identifier: z.string().min(1),\n});\n\nconst entryLinkSchema = z.object({\n kind: z.literal('entry'),\n identifier: z.string().min(1),\n});\n\nconst externalLinkSchema = z.object({\n kind: z.literal('external'),\n href: z.string().url('Invalid URL'),\n});\n\nconst dropdownLinkSchema = z.object({\n kind: z.literal('dropdown'),\n});\n\nconst navigationLinkSchema = z.discriminatedUnion('kind', [\n pageLinkSchema,\n entryLinkSchema,\n externalLinkSchema,\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'; identifier: string }\n | { kind: 'external'; href: string }\n | { kind: 'dropdown' };\n isCta?: boolean;\n children?: Array<{\n label: string;\n link:\n | { kind: 'page'; identifier: string }\n | { kind: 'entry'; identifier: string }\n | { kind: 'external'; href: 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.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 items: z.array(navigationItemConfigSchema),\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"],"mappings":"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","names":["z","z"]}
@@ -1,7 +1,7 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
2
2
 
3
3
 
4
- var _chunkEGTDJ4PLjs = require('./chunk-EGTDJ4PL.js');
4
+ var _chunkYYO3RIFOjs = require('./chunk-YYO3RIFO.js');
5
5
 
6
6
  // ../blocks/src/system/runtime/bindings.ts
7
7
  var shouldLogWarnings = isNonProductionEnv();
@@ -11,7 +11,7 @@ function resolveParamsBindings(input, vm, meta) {
11
11
  const maybeBind = input.$bind;
12
12
  if (maybeBind && typeof maybeBind === "object") {
13
13
  try {
14
- const binding = _chunkEGTDJ4PLjs.bindingSchema.parse(maybeBind);
14
+ const binding = _chunkYYO3RIFOjs.bindingSchema.parse(maybeBind);
15
15
  const value = resolveBinding(binding.from, vm);
16
16
  if (value === void 0 || value === null) {
17
17
  return binding.fallback;
@@ -60,7 +60,7 @@ function splitPath(path) {
60
60
  for (const raw of parts) {
61
61
  if (!raw) continue;
62
62
  const baseMatch = raw.match(/^([^\[]+)/);
63
- if (baseMatch) {
63
+ if (baseMatch && baseMatch[1]) {
64
64
  segments.push(baseMatch[1]);
65
65
  }
66
66
  const bracketMatches = raw.matchAll(BRACKET_ACCESS_REGEX);
@@ -159,7 +159,7 @@ async function prefetchBlockData(page, context, options) {
159
159
  const blockId = block.id;
160
160
  if (!blockId) continue;
161
161
  let loaders;
162
- const def = _chunkEGTDJ4PLjs.getBlockDefinition.call(void 0, block.kind);
162
+ const def = _chunkYYO3RIFOjs.getBlockDefinition.call(void 0, block.kind);
163
163
  if (def) {
164
164
  loaders = normalizeDataLoaders(def);
165
165
  } else if (getCustomBlockLoaders) {
@@ -330,4 +330,4 @@ function isSupportedEndpoint(endpoint) {
330
330
 
331
331
 
332
332
  exports.SUPPORTED_LOADER_ENDPOINTS = SUPPORTED_LOADER_ENDPOINTS; exports.prefetchBlockData = prefetchBlockData2;
333
- //# sourceMappingURL=chunk-HOY77YBF.js.map
333
+ //# sourceMappingURL=chunk-RVDS7VSP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/chunk-RVDS7VSP.js","../../../blocks/src/system/runtime/bindings.ts","../../../blocks/src/system/data/utils.ts","../../../blocks/src/system/data/prefetchBlockData.ts","../../src/data/prefetchBlockData.ts"],"names":["prefetchBlockData"],"mappings":"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","file":"/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/chunk-RVDS7VSP.js","sourcesContent":[null,"import { bindingSchema } from \"../node\";\n\nconst shouldLogWarnings = isNonProductionEnv();\n\nexport function resolveParamsBindings(\n input: unknown,\n vm: { content: Record<string, unknown>; $root?: Record<string, unknown> },\n meta?: { blockKind?: string },\n): unknown {\n if (input === null || typeof input !== \"object\") return input;\n if (Array.isArray(input)) return input.map((v) => resolveParamsBindings(v, vm, meta));\n\n // Binding object: { $bind: { from: '...', fallback: ... } }\n const maybeBind = (input as any).$bind;\n if (maybeBind && typeof maybeBind === \"object\") {\n try {\n const binding = bindingSchema.parse(maybeBind);\n const value = resolveBinding(binding.from, vm);\n // Return fallback if value is undefined/null\n if (value === undefined || value === null) {\n return binding.fallback;\n }\n return value;\n } catch (err) {\n if (shouldLogWarnings) {\n console.warn(\n `bindings: failed to parse loader param binding for block \"${meta?.blockKind ?? 'unknown'}\"`,\n err,\n );\n }\n return undefined;\n }\n }\n\n // Recurse object\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(input as Record<string, unknown>)) {\n out[k] = resolveParamsBindings(v, vm, meta);\n }\n return out;\n}\n\nexport function resolveBinding(\n path: string,\n vm: { content: Record<string, unknown>; $root?: Record<string, unknown> },\n): unknown {\n const segments = splitPath(path);\n if (!segments.length) return undefined;\n const [first, ...rest] = segments;\n let source: unknown = vm;\n if (first === \"$root\") {\n source = vm;\n return readFromSource(source as any, [first, ...rest]);\n }\n if (first === \"content\") {\n source = vm.content;\n return readFromSource(source, rest);\n }\n // Fallback: look in content first, then vm\n const contentResult = readFromSource(vm.content, segments);\n if (contentResult !== undefined) {\n return contentResult;\n }\n return readFromSource(vm as any, segments);\n}\n\nexport function splitPath(path: string): Array<string | number> {\n const PATH_SEPARATOR_REGEX = /\\./g;\n const BRACKET_ACCESS_REGEX = /\\[(?<token>[^\\]]+)\\]/g;\n const segments: Array<string | number> = [];\n const parts = path.split(PATH_SEPARATOR_REGEX);\n for (const raw of parts) {\n if (!raw) continue;\n const baseMatch = raw.match(/^([^\\[]+)/);\n if (baseMatch && baseMatch[1]) {\n segments.push(baseMatch[1]);\n }\n const bracketMatches = raw.matchAll(BRACKET_ACCESS_REGEX);\n for (const match of bracketMatches) {\n const token = match.groups?.token ?? \"\";\n if (token.startsWith(\"\\\"\") || token.startsWith(\"'\")) {\n segments.push(token.slice(1, -1));\n } else if (/^\\d+$/.test(token)) {\n segments.push(Number(token));\n } else {\n segments.push(token);\n }\n }\n if (!baseMatch && !raw.includes(\"[\")) {\n segments.push(raw);\n }\n }\n return segments;\n}\n\nexport function readFromSource(source: unknown, segments: Array<string | number>): unknown {\n return segments.reduce<unknown>((current, segment) => {\n if (current === undefined || current === null) return undefined;\n if (typeof segment === \"number\") {\n if (Array.isArray(current)) return current[segment];\n return undefined;\n }\n if (\n typeof current === \"object\" &&\n current !== null &&\n segment in (current as Record<string, unknown>)\n ) {\n return (current as Record<string, unknown>)[segment];\n }\n return undefined;\n }, source);\n}\n\nfunction isNonProductionEnv(): boolean {\n if (typeof globalThis === \"undefined\") {\n return true;\n }\n const maybeProcess = (globalThis as { process?: { env?: { NODE_ENV?: string } } }).process;\n const nodeEnv = maybeProcess?.env?.NODE_ENV;\n return nodeEnv !== \"production\";\n}\n\n","/**\n * Utility functions for block data loading.\n * Pure functions with no side effects.\n */\n\nimport type { BlockDataLoader } from '../registry';\nimport type { DataLoaderEntry } from './types';\n\n/**\n * Normalize data loaders from block definition\n */\nexport function normalizeDataLoaders(\n def: { dataLoaders?: Record<string, BlockDataLoader> } | null\n): DataLoaderEntry[] {\n if (!def?.dataLoaders) {\n return [];\n }\n return Object.entries(def.dataLoaders).map(([key, loader]) => ({ key, loader }));\n}\n\n/**\n * Normalize block content for data loading.\n * Priority: draftContent > content > publishedContent\n */\nexport function normalizeContent(block: {\n content?: unknown;\n draftContent?: unknown;\n publishedContent?: unknown;\n}): Record<string, unknown> {\n const source = block.draftContent ?? block.content ?? block.publishedContent ?? {};\n if (!isRecord(source)) return {};\n\n // Unwrap data wrapper if present and valid\n if ('data' in source) {\n const data = (source as { data?: unknown }).data;\n if (isRecord(data)) {\n return data;\n }\n // If data is null/undefined/non-record, treat as empty\n if (data === null || data === undefined) {\n return {};\n }\n }\n\n return source as Record<string, unknown>;\n}\n\n/**\n * Normalize params for API calls.\n * Converts all values to strings.\n */\nexport function normalizeParams(input: unknown): Record<string, string> {\n if (!input || typeof input !== 'object') return {};\n const entries = Object.entries(input as Record<string, unknown>).map(([key, value]) => [\n key,\n coerceToString(value),\n ]);\n return Object.fromEntries(entries);\n}\n\n/**\n * Coerce value to string for API params\n */\nexport function coerceToString(value: unknown): string {\n if (value === null || value === undefined) return '';\n if (Array.isArray(value)) return value.map(coerceToString).join(',');\n return String(value);\n}\n\n/**\n * Extract data from API response.\n * Unwraps common response wrappers: { data }, { form }, { entries }, { services }\n *\n * Note: We check that properties are NOT functions to avoid returning\n * built-in methods like Array.prototype.entries\n */\nexport function coercePayload(payload: unknown): unknown {\n if (payload && typeof payload === 'object' && !Array.isArray(payload)) {\n const record = payload as Record<string, unknown>;\n if ('data' in record && typeof record.data !== 'function') return record.data;\n if ('form' in record && typeof record.form !== 'function') return record.form;\n if ('entries' in record && typeof record.entries !== 'function') return record.entries;\n if ('services' in record && typeof record.services !== 'function') return record.services;\n }\n return payload;\n}\n\n/**\n * Type guard for record objects\n */\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n","/**\n * Core block data prefetching logic (framework-agnostic).\n *\n * This module provides the shared implementation for prefetching block data loaders.\n * It works with any API client by accepting it as a parameter (dependency injection).\n *\n * Usage:\n * - Frontend: provide internal API client\n * - SDK: provide SDK client with endpoint mapping\n */\n\nimport { getBlockDefinition, type BlockDataLoader } from '../registry';\nimport { resolveParamsBindings } from '../runtime/bindings';\nimport type { PageOutline } from '../../structure/schema';\nimport type { ApiClient, DataLoaderEntry, PrefetchContext, ResolvedBlockData } from './types';\nimport {\n normalizeDataLoaders,\n normalizeContent,\n normalizeParams,\n coercePayload,\n} from './utils';\n\nexport type PrefetchBlockDataOptions = {\n /**\n * API client function that makes the actual requests.\n * This allows the caller to provide their own client (internal or SDK).\n */\n apiClient: ApiClient;\n\n /**\n * Validation function to check if endpoint is valid.\n * Different environments have different endpoint registries.\n */\n isValidEndpoint?: (endpoint: string) => boolean;\n\n /**\n * Error handler for failed data fetches.\n * By default, errors are logged and suppressed (data loading is best-effort).\n */\n onError?: (error: unknown, context: { block: string; loader: string }) => void;\n\n /**\n * Custom block data loader lookup.\n *\n * Called for blocks that aren't found in the system registry.\n * Returns data loaders for SDK custom blocks.\n *\n * @param blockKind - The block's kind (e.g., 'custom.team-member')\n * @returns Record of data loaders, or undefined if not a custom block\n */\n getCustomBlockLoaders?: (blockKind: string) => Record<string, BlockDataLoader> | undefined;\n};\n\n/**\n * Core data prefetching logic (framework-agnostic).\n *\n * This function is shared between frontend and SDK implementations.\n * It handles:\n * - Extracting data loaders from block definitions\n * - Resolving loader params with block content\n * - Executing server-mode loaders in parallel\n * - Organizing results by block ID and loader key\n *\n * @example\n * ```typescript\n * const resolved = await prefetchBlockData(page, context, {\n * apiClient: async ({ endpoint, params }) => {\n * return await myApiClient({ endpoint, params });\n * },\n * isValidEndpoint: (endpoint) => endpoint in API_ENDPOINTS,\n * });\n * ```\n */\nexport async function prefetchBlockData(\n page: PageOutline,\n context: PrefetchContext,\n options: PrefetchBlockDataOptions\n): Promise<ResolvedBlockData> {\n const { apiClient, isValidEndpoint, onError, getCustomBlockLoaders } = options;\n\n const results: ResolvedBlockData = {};\n const tasks: Array<Promise<void>> = [];\n\n for (const block of page.blocks) {\n const blockId = block.id;\n if (!blockId) continue;\n\n // Get loaders from system block definition OR custom block lookup\n let loaders: DataLoaderEntry[];\n const def = getBlockDefinition(block.kind);\n\n if (def) {\n // System block - use normalizeDataLoaders\n loaders = normalizeDataLoaders(def);\n } else if (getCustomBlockLoaders) {\n // Custom block - check callback\n const customLoaders = getCustomBlockLoaders(block.kind);\n loaders = customLoaders\n ? Object.entries(customLoaders).map(([key, loader]) => ({ key, loader }))\n : [];\n } else {\n loaders = [];\n }\n\n if (loaders.length === 0) continue;\n\n const root = {\n siteId: context.siteId,\n pageId: context.pageId,\n previewStage: context.previewStage,\n };\n const normalizedContent = normalizeContent(block as { content?: unknown; draftContent?: unknown; publishedContent?: unknown });\n const vm = { content: normalizedContent, $root: root };\n\n for (const { key, loader } of loaders) {\n // Skip client-mode loaders (they run in browser)\n if (loader.mode === 'client') {\n continue;\n }\n\n // Resolve params using block content\n const rawParams = resolveParamsBindings(loader.params, vm, {\n blockKind: block.kind,\n });\n const params = normalizeParams(rawParams);\n\n const endpoint = loader.endpoint;\n\n // Validate endpoint if validator provided\n if (isValidEndpoint && !isValidEndpoint(endpoint)) {\n continue;\n }\n\n tasks.push(\n (async () => {\n try {\n const payload = await apiClient({ endpoint, params });\n const data = coercePayload(payload);\n\n if (!results[blockId]) {\n results[blockId] = {};\n }\n results[blockId]![key] = data;\n } catch (error) {\n // Call error handler if provided, otherwise fail silently\n // Data loading is best-effort - failures shouldn't break the page\n if (onError) {\n onError(error, { block: block.kind, loader: key });\n }\n }\n })()\n );\n }\n }\n\n if (tasks.length > 0) {\n await Promise.all(tasks);\n }\n\n return results;\n}\n","/**\n * SDK wrapper for block data prefetching.\n * Uses the shared core implementation from @riverbankcms/blocks with the SDK client.\n */\n\nimport type { BlockDataLoader, PageOutline, SdkCustomBlock } from '@riverbankcms/blocks';\nimport { prefetchBlockData as prefetchBlockDataCore } from '@riverbankcms/blocks/system/data';\nimport type { PrefetchContext, ResolvedBlockData } from '@riverbankcms/blocks/system/data';\nimport type { RiverbankClient } from '../client/types';\n\nexport type { PrefetchContext, ResolvedBlockData };\n\n/**\n * Supported loader endpoints for SDK data fetching.\n * Only these endpoints can be used in block data loaders when using the SDK.\n *\n * This is the SINGLE SOURCE OF TRUTH for whitelisted endpoints.\n * - Zod validation schema derives from this array\n * - TypeScript types derive from this array\n * - Runtime validation uses this array\n */\nexport const SUPPORTED_LOADER_ENDPOINTS = [\n 'listPublishedEntries',\n 'getPublishedEntryPreview',\n 'listPublicEvents',\n 'getPublicFormById',\n 'getPublicBookingServices',\n] as const;\n\n/**\n * Union type of all supported loader endpoints.\n * Derived from SUPPORTED_LOADER_ENDPOINTS array.\n */\nexport type SupportedLoaderEndpoint = typeof SUPPORTED_LOADER_ENDPOINTS[number];\n\n/**\n * Options for SDK block data prefetching.\n */\nexport type SdkPrefetchOptions = {\n /**\n * SDK custom blocks from site config.\n * Used to look up data loaders for custom.* blocks.\n */\n customBlocks?: SdkCustomBlock[];\n};\n\n/**\n * Prefetch block data for SDK-based applications.\n * Maps loader endpoints to corresponding SDK client methods.\n *\n * Supports both system blocks and SDK custom blocks with data loaders.\n *\n * @example\n * ```typescript\n * import { createRiverbankClient } from '@riverbankcms/sdk';\n * import { prefetchBlockData } from '@riverbankcms/sdk/data';\n *\n * const client = createRiverbankClient({ apiKey, baseUrl });\n * const page = await client.getPage({ siteId, path: '/' });\n *\n * // Basic usage (system blocks only)\n * const blockData = await prefetchBlockData(page.outline, {\n * siteId: page.siteId,\n * pageId: page.id,\n * }, client);\n *\n * // With custom blocks from SDK config\n * const blockData = await prefetchBlockData(page.outline, context, client, {\n * customBlocks: site.sdkConfig?.customBlocks,\n * });\n * ```\n */\nexport async function prefetchBlockData(\n page: PageOutline,\n context: PrefetchContext,\n client: RiverbankClient,\n options?: SdkPrefetchOptions,\n): Promise<ResolvedBlockData> {\n const { customBlocks } = options ?? {};\n\n // Build lookup map for custom block loaders\n // Key is string (blockKind from page) matching block.id (custom.xxx)\n const customBlockMap = new Map<string, SdkCustomBlock>(\n (customBlocks ?? []).map((block) => [block.id as string, block])\n );\n\n return prefetchBlockDataCore(page, context, {\n apiClient: async ({ endpoint, params }) => {\n // Only support whitelisted loader endpoints\n if (!isSupportedEndpoint(endpoint)) {\n throw new Error(\n `Unsupported loader endpoint: ${endpoint}. ` +\n `SDK only supports: ${SUPPORTED_LOADER_ENDPOINTS.join(', ')}`\n );\n }\n\n // Map endpoint to SDK client method\n switch (endpoint) {\n case 'listPublishedEntries': {\n const { siteId, type, orderBy, limit, stage, mode, entryIds } = params ?? {};\n if (!siteId || !type) {\n throw new Error('listPublishedEntries requires siteId and type params');\n }\n\n // Parse limit if provided (can come as string from bindings)\n const parsedLimit = typeof limit === 'string'\n ? Number.parseInt(limit, 10)\n : typeof limit === 'number'\n ? limit\n : undefined;\n\n // Map orderBy to order param (matching embed block field values)\n const order = (orderBy === 'newest' || orderBy === 'oldest' || orderBy === 'title' || orderBy === 'order')\n ? orderBy as 'newest' | 'oldest' | 'title' | 'order'\n : undefined;\n\n // Extract entry IDs for manual mode\n // entryIds comes from binding to entries field which contains { entryId: \"uuid\" } objects\n let parsedEntryIds: string[] | undefined;\n if (mode === 'manual' && Array.isArray(entryIds)) {\n parsedEntryIds = entryIds\n .map((item: unknown) => {\n if (typeof item === 'object' && item !== null && 'entryId' in item) {\n return (item as { entryId: string }).entryId;\n }\n // Also support direct string IDs\n if (typeof item === 'string') {\n return item;\n }\n return null;\n })\n .filter((id): id is string => id !== null);\n }\n\n return await client.getEntries({\n siteId,\n contentType: type,\n limit: parsedLimit,\n order,\n preview: stage === 'preview',\n // Manual mode - pass entry IDs for hydration\n mode: mode === 'manual' ? 'manual' : undefined,\n entryIds: parsedEntryIds,\n });\n }\n\n case 'getPublishedEntryPreview': {\n const { siteId, type, slug } = params ?? {};\n if (!siteId || !type || !slug) {\n throw new Error('getPublishedEntryPreview requires siteId, type, and slug params');\n }\n return await client.getEntry({ siteId, contentType: type, slug });\n }\n case 'listPublicEvents': {\n const { siteId, limit, from, to, stage } = params ?? {};\n if (!siteId) {\n throw new Error('listPublicEvents requires siteId param');\n }\n const parsedLimit =\n typeof limit === 'string'\n ? Number.parseInt(limit, 10)\n : typeof limit === 'number'\n ? limit\n : undefined;\n return await client.listPublicEvents({ siteId, limit: parsedLimit, from, to, stage });\n }\n case 'getPublicFormById': {\n const { formId } = params ?? {};\n if (!formId) {\n throw new Error('getPublicFormById requires formId param');\n }\n return await client.getPublicFormById({ formId });\n }\n case 'getPublicBookingServices': {\n const { siteId, ids } = params ?? {};\n if (!siteId) {\n throw new Error('getPublicBookingServices requires siteId param');\n }\n return await client.getPublicBookingServices({ siteId, ids });\n }\n\n default: {\n // TypeScript should never reach here due to isSupportedEndpoint check\n const _exhaustive: never = endpoint;\n throw new Error(`Unhandled endpoint: ${_exhaustive}`);\n }\n }\n },\n isValidEndpoint: isSupportedEndpoint,\n onError: (error, { block, loader }) => {\n console.warn('[prefetchBlockData] failed to prefetch block data', {\n block,\n loader,\n error,\n });\n },\n // Provide custom block loader lookup for SDK custom blocks\n getCustomBlockLoaders: (blockKind): Record<string, BlockDataLoader> | undefined => {\n const customBlock = customBlockMap.get(blockKind);\n if (!customBlock?.dataLoaders) return undefined;\n\n // Convert SdkConfigLoader to BlockDataLoader\n // SdkConfigLoader.endpoint is SdkLoaderEndpoint (string union) -> string\n // SdkConfigLoader.params is Record<string, LoaderParamValue> -> Record<string, unknown>\n // Both are structurally compatible via covariance\n const loaders: Record<string, BlockDataLoader> = {};\n for (const [key, loader] of Object.entries(customBlock.dataLoaders)) {\n loaders[key] = {\n endpoint: loader.endpoint,\n params: loader.params,\n mode: loader.mode,\n };\n }\n return loaders;\n },\n });\n}\n\n/**\n * Type guard for supported loader endpoints\n */\nfunction isSupportedEndpoint(endpoint: string): endpoint is SupportedLoaderEndpoint {\n return SUPPORTED_LOADER_ENDPOINTS.includes(endpoint as SupportedLoaderEndpoint);\n}\n"]}
@@ -2,13 +2,13 @@
2
2
 
3
3
 
4
4
 
5
- var _chunkTKMA6D6Ujs = require('./chunk-TKMA6D6U.js');
5
+ var _chunk7UPVCT3Kjs = require('./chunk-7UPVCT3K.js');
6
6
 
7
7
 
8
- var _chunkHOY77YBFjs = require('./chunk-HOY77YBF.js');
8
+ var _chunkRVDS7VSPjs = require('./chunk-RVDS7VSP.js');
9
9
 
10
10
 
11
- var _chunkEGTDJ4PLjs = require('./chunk-EGTDJ4PL.js');
11
+ var _chunkYYO3RIFOjs = require('./chunk-YYO3RIFO.js');
12
12
 
13
13
  // src/rendering/components/Block.tsx
14
14
  var _jsxruntime = require('react/jsx-runtime');
@@ -24,14 +24,14 @@ async function Block({
24
24
  usePlaceholders: _usePlaceholders = false,
25
25
  override: OverrideComponent
26
26
  }) {
27
- const definition = _chunkEGTDJ4PLjs.getBlockDefinition.call(void 0, blockKind);
27
+ const definition = _chunkYYO3RIFOjs.getBlockDefinition.call(void 0, blockKind);
28
28
  if (!definition && !OverrideComponent) {
29
29
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "p-4 border border-red-300 bg-red-50 rounded", children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "p", { className: "text-red-800 font-semibold", children: [
30
30
  "Unknown block type: ",
31
31
  blockKind
32
32
  ] }) });
33
33
  }
34
- const themeRuntime = _chunkTKMA6D6Ujs.buildThemeRuntime.call(void 0, theme);
34
+ const themeRuntime = _chunk7UPVCT3Kjs.buildThemeRuntime.call(void 0, theme);
35
35
  let resolvedData;
36
36
  if (client && blockId && definition) {
37
37
  const pageOutline = {
@@ -44,7 +44,7 @@ async function Block({
44
44
  purpose: "preview"
45
45
  }]
46
46
  };
47
- const allResolvedData = await _chunkHOY77YBFjs.prefetchBlockData.call(void 0,
47
+ const allResolvedData = await _chunkRVDS7VSPjs.prefetchBlockData.call(void 0,
48
48
  pageOutline,
49
49
  { siteId, pageId, previewStage },
50
50
  client
@@ -70,8 +70,8 @@ async function Block({
70
70
  blockKind
71
71
  ] }) });
72
72
  }
73
- const BlockComponent = _chunkTKMA6D6Ujs.makeDefaultBlockComponent.call(void 0, { manifest: definition.manifest });
74
- const registry = _chunkTKMA6D6Ujs.getDefaultComponentRegistry.call(void 0, );
73
+ const BlockComponent = _chunk7UPVCT3Kjs.makeDefaultBlockComponent.call(void 0, { manifest: definition.manifest });
74
+ const registry = _chunk7UPVCT3Kjs.getDefaultComponentRegistry.call(void 0, );
75
75
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
76
76
  BlockComponent,
77
77
  {
@@ -89,4 +89,4 @@ async function Block({
89
89
 
90
90
 
91
91
  exports.Block = Block;
92
- //# sourceMappingURL=chunk-NW5KHH4A.js.map
92
+ //# sourceMappingURL=chunk-TT5JWA4X.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/chunk-NW5KHH4A.js","../../src/rendering/components/Block.tsx"],"names":[],"mappings":"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","file":"/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/chunk-NW5KHH4A.js","sourcesContent":[null,"/**\n * Block component for rendering individual CMS blocks\n *\n * Renders a single block with its content and data.\n */\n\nimport * as React from 'react';\nimport { getBlockDefinition, makeDefaultBlockComponent, buildThemeRuntime, getDefaultComponentRegistry } from '@riverbankcms/blocks';\nimport type { Theme } from '@riverbankcms/blocks';\nimport type { RiverbankClient } from '../../client/types';\nimport type { BlockKind } from '../../types';\nimport { prefetchBlockData } from '../../data/prefetchBlockData';\n\n/**\n * Override component for custom block rendering.\n * Receives the same props as default block components.\n */\nexport type BlockOverrideComponent = React.ComponentType<{\n content: Record<string, unknown>;\n theme?: Record<string, unknown>;\n themeConfig?: Theme;\n data?: Record<string, unknown>;\n blockId?: string | null;\n blockKind?: BlockKind;\n}>;\n\nexport type BlockProps = {\n // Block identification\n blockKind: BlockKind;\n blockId?: string | null;\n\n // Block content\n content: Record<string, unknown>;\n\n // Required styling\n theme: Theme;\n siteId: string;\n\n // Optional data context for loaders\n pageId?: string;\n previewStage?: 'published' | 'preview';\n client?: RiverbankClient;\n\n // Optional customization\n usePlaceholders?: boolean;\n\n /**\n * Custom component to override default block rendering.\n * When provided, renders this component instead of the manifest-based default.\n * This is SSR-safe - no context or hooks required.\n *\n * @example\n * ```tsx\n * <Block\n * blockKind=\"block.hero\"\n * content={heroContent}\n * theme={theme}\n * siteId={siteId}\n * override={MyCustomHero}\n * />\n * ```\n */\n override?: BlockOverrideComponent;\n};\n\n/**\n * Renders a single CMS block with optional data loading.\n *\n * Use this component when you want to render individual blocks outside of a full page context,\n * or when mixing CMS blocks with custom JSX.\n *\n * @example Basic usage\n * ```tsx\n * <Block\n * blockKind=\"block.hero\"\n * content={{ headline: 'Welcome', subheadline: 'To our site' }}\n * theme={theme}\n * siteId=\"site-123\"\n * />\n * ```\n *\n * @example With data loading\n * ```tsx\n * <Block\n * blockKind=\"block.blog-listing\"\n * blockId=\"block-456\"\n * content={blockContent}\n * theme={theme}\n * siteId=\"site-123\"\n * pageId=\"page-789\"\n * client={client}\n * />\n * ```\n */\nexport async function Block({\n blockKind,\n blockId,\n content,\n theme,\n siteId,\n pageId,\n previewStage,\n client,\n usePlaceholders: _usePlaceholders = false,\n override: OverrideComponent,\n}: BlockProps) {\n // Get block definition (needed for data loaders even if using override)\n const definition = getBlockDefinition(blockKind);\n if (!definition && !OverrideComponent) {\n return (\n <div className=\"p-4 border border-red-300 bg-red-50 rounded\">\n <p className=\"text-red-800 font-semibold\">Unknown block type: {blockKind}</p>\n </div>\n );\n }\n\n // Build theme tokens\n const themeRuntime = buildThemeRuntime(theme);\n\n // Prefetch block data if client is provided and block has an ID\n let resolvedData: Record<string, unknown> | undefined;\n if (client && blockId && definition) {\n const pageOutline = {\n name: 'Single Block',\n path: '/block',\n purpose: 'Block preview',\n blocks: [{\n id: blockId,\n kind: blockKind,\n purpose: 'preview',\n }],\n };\n\n const allResolvedData = await prefetchBlockData(\n pageOutline,\n { siteId, pageId, previewStage },\n client\n );\n\n resolvedData = allResolvedData[blockId];\n }\n\n // If override component provided, use it instead of manifest-based rendering\n if (OverrideComponent) {\n return (\n <OverrideComponent\n content={content}\n theme={themeRuntime.tokens}\n themeConfig={theme}\n data={resolvedData}\n blockId={blockId ?? null}\n blockKind={blockKind}\n />\n );\n }\n\n // Fallback to manifest-based rendering\n if (!definition) {\n return (\n <div className=\"p-4 border border-red-300 bg-red-50 rounded\">\n <p className=\"text-red-800 font-semibold\">Unknown block type: {blockKind}</p>\n </div>\n );\n }\n\n // Create block component from manifest\n const BlockComponent = makeDefaultBlockComponent({ manifest: definition.manifest });\n\n // Get default component registry\n const registry = getDefaultComponentRegistry();\n\n return (\n <BlockComponent\n blockId={blockId ?? undefined}\n blockKind={blockKind}\n theme={themeRuntime.tokens}\n themeConfig={theme}\n content={content}\n data={resolvedData}\n registry={registry}\n />\n );\n}\n"]}
1
+ {"version":3,"sources":["/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/chunk-TT5JWA4X.js","../../src/rendering/components/Block.tsx"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACA;ACkGM,+CAAA;AAhBN,MAAA,SAAsB,KAAA,CAAM;AAAA,EAC1B,SAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAAA,EACA,MAAA;AAAA,EACA,eAAA,EAAiB,iBAAA,EAAmB,KAAA;AAAA,EACpC,QAAA,EAAU;AACZ,CAAA,EAAe;AAEb,EAAA,MAAM,WAAA,EAAa,iDAAA,SAA4B,CAAA;AAC/C,EAAA,GAAA,CAAI,CAAC,WAAA,GAAc,CAAC,iBAAA,EAAmB;AACrC,IAAA,uBACE,6BAAA,KAAC,EAAA,EAAI,SAAA,EAAU,6CAAA,EACb,QAAA,kBAAA,8BAAA,GAAC,EAAA,EAAE,SAAA,EAAU,4BAAA,EAA6B,QAAA,EAAA;AAAA,MAAA,sBAAA;AAAA,MAAqB;AAAA,IAAA,EAAA,CAAU,EAAA,CAC3E,CAAA;AAAA,EAEJ;AAGA,EAAA,MAAM,aAAA,EAAe,gDAAA,KAAuB,CAAA;AAG5C,EAAA,IAAI,YAAA;AACJ,EAAA,GAAA,CAAI,OAAA,GAAU,QAAA,GAAW,UAAA,EAAY;AACnC,IAAA,MAAM,YAAA,EAAc;AAAA,MAClB,IAAA,EAAM,cAAA;AAAA,MACN,IAAA,EAAM,QAAA;AAAA,MACN,OAAA,EAAS,eAAA;AAAA,MACT,MAAA,EAAQ,CAAC;AAAA,QACP,EAAA,EAAI,OAAA;AAAA,QACJ,IAAA,EAAM,SAAA;AAAA,QACN,OAAA,EAAS;AAAA,MACX,CAAC;AAAA,IACH,CAAA;AAEA,IAAA,MAAM,gBAAA,EAAkB,MAAM,gDAAA;AAAA,MAC5B,WAAA;AAAA,MACA,EAAE,MAAA,EAAQ,MAAA,EAAQ,aAAa,CAAA;AAAA,MAC/B;AAAA,IACF,CAAA;AAEA,IAAA,aAAA,EAAe,eAAA,CAAgB,OAAO,CAAA;AAAA,EACxC;AAGA,EAAA,GAAA,CAAI,iBAAA,EAAmB;AACrB,IAAA,uBACE,6BAAA;AAAA,MAAC,iBAAA;AAAA,MAAA;AAAA,QACC,OAAA;AAAA,QACA,KAAA,EAAO,YAAA,CAAa,MAAA;AAAA,QACpB,WAAA,EAAa,KAAA;AAAA,QACb,IAAA,EAAM,YAAA;AAAA,QACN,OAAA,mBAAS,OAAA,UAAW,MAAA;AAAA,QACpB;AAAA,MAAA;AAAA,IACF,CAAA;AAAA,EAEJ;AAGA,EAAA,GAAA,CAAI,CAAC,UAAA,EAAY;AACf,IAAA,uBACE,6BAAA,KAAC,EAAA,EAAI,SAAA,EAAU,6CAAA,EACb,QAAA,kBAAA,8BAAA,GAAC,EAAA,EAAE,SAAA,EAAU,4BAAA,EAA6B,QAAA,EAAA;AAAA,MAAA,sBAAA;AAAA,MAAqB;AAAA,IAAA,EAAA,CAAU,EAAA,CAC3E,CAAA;AAAA,EAEJ;AAGA,EAAA,MAAM,eAAA,EAAiB,wDAAA,EAA4B,QAAA,EAAU,UAAA,CAAW,SAAS,CAAC,CAAA;AAGlF,EAAA,MAAM,SAAA,EAAW,0DAAA,CAA4B;AAE7C,EAAA,uBACE,6BAAA;AAAA,IAAC,cAAA;AAAA,IAAA;AAAA,MACC,OAAA,mBAAS,OAAA,UAAW,KAAA,GAAA;AAAA,MACpB,SAAA;AAAA,MACA,KAAA,EAAO,YAAA,CAAa,MAAA;AAAA,MACpB,WAAA,EAAa,KAAA;AAAA,MACb,OAAA;AAAA,MACA,IAAA,EAAM,YAAA;AAAA,MACN;AAAA,IAAA;AAAA,EACF,CAAA;AAEJ;AD/FA;AACA;AACE;AACF,sBAAC","file":"/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/chunk-TT5JWA4X.js","sourcesContent":[null,"/**\n * Block component for rendering individual CMS blocks\n *\n * Renders a single block with its content and data.\n */\n\nimport * as React from 'react';\nimport { getBlockDefinition, makeDefaultBlockComponent, buildThemeRuntime, getDefaultComponentRegistry } from '@riverbankcms/blocks';\nimport type { Theme } from '@riverbankcms/blocks';\nimport type { RiverbankClient } from '../../client/types';\nimport type { BlockKind } from '../../types';\nimport { prefetchBlockData } from '../../data/prefetchBlockData';\n\n/**\n * Override component for custom block rendering.\n * Receives the same props as default block components.\n */\nexport type BlockOverrideComponent = React.ComponentType<{\n content: Record<string, unknown>;\n theme?: Record<string, unknown>;\n themeConfig?: Theme;\n data?: Record<string, unknown>;\n blockId?: string | null;\n blockKind?: BlockKind;\n}>;\n\nexport type BlockProps = {\n // Block identification\n blockKind: BlockKind;\n blockId?: string | null;\n\n // Block content\n content: Record<string, unknown>;\n\n // Required styling\n theme: Theme;\n siteId: string;\n\n // Optional data context for loaders\n pageId?: string;\n previewStage?: 'published' | 'preview';\n client?: RiverbankClient;\n\n // Optional customization\n usePlaceholders?: boolean;\n\n /**\n * Custom component to override default block rendering.\n * When provided, renders this component instead of the manifest-based default.\n * This is SSR-safe - no context or hooks required.\n *\n * @example\n * ```tsx\n * <Block\n * blockKind=\"block.hero\"\n * content={heroContent}\n * theme={theme}\n * siteId={siteId}\n * override={MyCustomHero}\n * />\n * ```\n */\n override?: BlockOverrideComponent;\n};\n\n/**\n * Renders a single CMS block with optional data loading.\n *\n * Use this component when you want to render individual blocks outside of a full page context,\n * or when mixing CMS blocks with custom JSX.\n *\n * @example Basic usage\n * ```tsx\n * <Block\n * blockKind=\"block.hero\"\n * content={{ headline: 'Welcome', subheadline: 'To our site' }}\n * theme={theme}\n * siteId=\"site-123\"\n * />\n * ```\n *\n * @example With data loading\n * ```tsx\n * <Block\n * blockKind=\"block.blog-listing\"\n * blockId=\"block-456\"\n * content={blockContent}\n * theme={theme}\n * siteId=\"site-123\"\n * pageId=\"page-789\"\n * client={client}\n * />\n * ```\n */\nexport async function Block({\n blockKind,\n blockId,\n content,\n theme,\n siteId,\n pageId,\n previewStage,\n client,\n usePlaceholders: _usePlaceholders = false,\n override: OverrideComponent,\n}: BlockProps) {\n // Get block definition (needed for data loaders even if using override)\n const definition = getBlockDefinition(blockKind);\n if (!definition && !OverrideComponent) {\n return (\n <div className=\"p-4 border border-red-300 bg-red-50 rounded\">\n <p className=\"text-red-800 font-semibold\">Unknown block type: {blockKind}</p>\n </div>\n );\n }\n\n // Build theme tokens\n const themeRuntime = buildThemeRuntime(theme);\n\n // Prefetch block data if client is provided and block has an ID\n let resolvedData: Record<string, unknown> | undefined;\n if (client && blockId && definition) {\n const pageOutline = {\n name: 'Single Block',\n path: '/block',\n purpose: 'Block preview',\n blocks: [{\n id: blockId,\n kind: blockKind,\n purpose: 'preview',\n }],\n };\n\n const allResolvedData = await prefetchBlockData(\n pageOutline,\n { siteId, pageId, previewStage },\n client\n );\n\n resolvedData = allResolvedData[blockId];\n }\n\n // If override component provided, use it instead of manifest-based rendering\n if (OverrideComponent) {\n return (\n <OverrideComponent\n content={content}\n theme={themeRuntime.tokens}\n themeConfig={theme}\n data={resolvedData}\n blockId={blockId ?? null}\n blockKind={blockKind}\n />\n );\n }\n\n // Fallback to manifest-based rendering\n if (!definition) {\n return (\n <div className=\"p-4 border border-red-300 bg-red-50 rounded\">\n <p className=\"text-red-800 font-semibold\">Unknown block type: {blockKind}</p>\n </div>\n );\n }\n\n // Create block component from manifest\n const BlockComponent = makeDefaultBlockComponent({ manifest: definition.manifest });\n\n // Get default component registry\n const registry = getDefaultComponentRegistry();\n\n return (\n <BlockComponent\n blockId={blockId ?? undefined}\n blockKind={blockKind}\n theme={themeRuntime.tokens}\n themeConfig={theme}\n content={content}\n data={resolvedData}\n registry={registry}\n />\n );\n}\n"]}
@@ -0,0 +1,134 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
2
+
3
+
4
+ var _chunk5STV4MWDjs = require('./chunk-5STV4MWD.js');
5
+
6
+
7
+
8
+
9
+ var _chunk7UPVCT3Kjs = require('./chunk-7UPVCT3K.js');
10
+
11
+
12
+
13
+ var _chunkYYO3RIFOjs = require('./chunk-YYO3RIFO.js');
14
+
15
+ // src/rendering/components/Page.tsx
16
+ var _jsxruntime = require('react/jsx-runtime');
17
+ function Page({
18
+ page,
19
+ theme,
20
+ themeTokens: providedTokens,
21
+ siteId,
22
+ resolvedData,
23
+ routeMap,
24
+ wrapBlock,
25
+ registry,
26
+ usePlaceholders = false,
27
+ blockOverrides,
28
+ sdkConfig,
29
+ supabaseUrl,
30
+ dataContext
31
+ }) {
32
+ const baseTokens = _nullishCoalesce(providedTokens, () => ( _chunk7UPVCT3Kjs.buildThemeRuntime.call(void 0, theme).tokens));
33
+ const themeTokens = _optionalChain([sdkConfig, 'optionalAccess', _ => _.theme, 'optionalAccess', _2 => _2.palette]) ? { ...baseTokens, palette: { ...baseTokens.palette, ...sdkConfig.theme.palette } } : baseTokens;
34
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
35
+ _chunk7UPVCT3Kjs.PageRenderer,
36
+ {
37
+ theme,
38
+ page,
39
+ themeTokens,
40
+ usePlaceholders,
41
+ dataContext: {
42
+ siteId,
43
+ resolvedData,
44
+ routes: routeMap,
45
+ occurrenceContext: _nullishCoalesce(_optionalChain([dataContext, 'optionalAccess', _3 => _3.occurrenceContext]), () => ( null)),
46
+ contentEntry: _nullishCoalesce(_optionalChain([dataContext, 'optionalAccess', _4 => _4.contentEntry]), () => ( null)),
47
+ supabaseUrl
48
+ },
49
+ routeMap,
50
+ wrapBlock,
51
+ registry,
52
+ blockOverrides,
53
+ sdkConfig
54
+ }
55
+ );
56
+ }
57
+
58
+ // src/rendering/components/Layout.tsx
59
+
60
+ async function Layout({
61
+ siteData: providedSiteData,
62
+ client,
63
+ siteId,
64
+ slug,
65
+ domain,
66
+ children,
67
+ header = true,
68
+ footer = true,
69
+ headerVariant
70
+ }) {
71
+ let siteData = providedSiteData;
72
+ if (!siteData) {
73
+ if (!client) {
74
+ throw new Error("Layout: must provide either siteData or client");
75
+ }
76
+ if (!siteId && !slug && !domain) {
77
+ throw new Error("Layout: must provide siteId, slug, or domain when using client");
78
+ }
79
+ siteData = await client.getSite({ id: siteId, slug, domain });
80
+ }
81
+ const { site, theme, navigation, layout, routes } = siteData;
82
+ const themeRuntime = _chunk7UPVCT3Kjs.buildThemeRuntime.call(void 0, theme);
83
+ const menuViewModel = _chunk5STV4MWDjs.buildSimpleMenu.call(void 0, navigation, routes);
84
+ const logoViewModel = _chunk5STV4MWDjs.buildSimpleLogo.call(void 0, _nullishCoalesce(layout.logo, () => ( null)), site.title);
85
+ const headerData = {
86
+ menu: menuViewModel,
87
+ logo: logoViewModel,
88
+ site,
89
+ theme,
90
+ routes
91
+ };
92
+ const headerContent = headerVariant ? { ...layout.header, variant: headerVariant } : layout.header;
93
+ const themeWithVariant = headerVariant ? {
94
+ ...theme,
95
+ header: { ...theme.header, variant: headerVariant }
96
+ } : theme;
97
+ const viewModelOverrides = {
98
+ $root: {
99
+ siteId: site.id,
100
+ routes,
101
+ theme: themeWithVariant
102
+ },
103
+ site,
104
+ menu: menuViewModel,
105
+ content: {
106
+ logo: logoViewModel
107
+ }
108
+ };
109
+ let headerElement = null;
110
+ if (header === true) {
111
+ headerElement = _chunk7UPVCT3Kjs.renderBlock.call(void 0, _chunkYYO3RIFOjs.siteHeaderManifest, headerContent, {
112
+ theme: themeRuntime.tokens,
113
+ themeConfig: themeWithVariant,
114
+ viewModelOverrides
115
+ });
116
+ } else if (typeof header === "function") {
117
+ headerElement = header(headerData);
118
+ }
119
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
120
+ headerElement,
121
+ children,
122
+ footer && _chunk7UPVCT3Kjs.renderBlock.call(void 0, _chunkYYO3RIFOjs.siteFooterManifest, layout.footer, {
123
+ theme: themeRuntime.tokens,
124
+ themeConfig: theme,
125
+ viewModelOverrides
126
+ })
127
+ ] });
128
+ }
129
+
130
+
131
+
132
+
133
+ exports.Page = Page; exports.Layout = Layout;
134
+ //# sourceMappingURL=chunk-VSFQRHYZ.js.map