@riverbankcms/sdk 0.22.0 → 0.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. package/README.md +15 -0
  2. package/dist/_dts/blocks/src/system/defineBlock.d.ts +2 -2
  3. package/dist/_dts/blocks/src/system/fragments/utils/toRepeaterSchema.d.ts +1 -0
  4. package/dist/_dts/blocks/src/system/manifest/fieldPath.d.ts +1 -1
  5. package/dist/_dts/blocks/src/system/manifest/schema.d.ts +3 -3
  6. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +20 -6
  7. package/dist/_dts/sdk/src/components.d.ts +1 -1
  8. package/dist/_dts/sdk/src/manifest/prompt/examples/types.d.ts +1 -1
  9. package/dist/_dts/sdk/src/manifest/validation/output-schema.d.ts +1 -1
  10. package/dist/_dts/sdk/src/rendering/components/Layout.d.ts +13 -2
  11. package/dist/_dts/sdk/src/rendering/server.d.ts +1 -1
  12. package/dist/_dts/sdk/src/version.d.ts +1 -1
  13. package/dist/_dts/sdk/src/zod/titleSourceSchema.d.ts +3 -0
  14. package/dist/cli/index.js +38 -16
  15. package/dist/cli/index.js.map +1 -1
  16. package/dist/client/client.js +16 -4
  17. package/dist/client/client.js.map +1 -1
  18. package/dist/client/client.mjs +16 -4
  19. package/dist/client/client.mjs.map +1 -1
  20. package/dist/client/hooks.js +15 -3
  21. package/dist/client/hooks.js.map +1 -1
  22. package/dist/client/hooks.mjs +15 -3
  23. package/dist/client/hooks.mjs.map +1 -1
  24. package/dist/server/{chunk-QE4VT6ZZ.js → chunk-2VZTRLVN.js} +2 -2
  25. package/dist/server/{chunk-QE4VT6ZZ.js.map → chunk-2VZTRLVN.js.map} +1 -1
  26. package/dist/server/{chunk-2M7734OW.mjs → chunk-2Y65RENO.mjs} +2 -2
  27. package/dist/server/{chunk-ZUEYJXML.js → chunk-36KFN6AU.js} +6 -6
  28. package/dist/server/{chunk-ZUEYJXML.js.map → chunk-36KFN6AU.js.map} +1 -1
  29. package/dist/server/{chunk-53NRFMMN.js → chunk-377J7BKC.js} +16 -4
  30. package/dist/server/chunk-377J7BKC.js.map +1 -0
  31. package/dist/server/chunk-3OR6EF3W.js +11 -0
  32. package/dist/server/chunk-3OR6EF3W.js.map +1 -0
  33. package/dist/server/chunk-3YMYSDUU.mjs +7 -0
  34. package/dist/server/{chunk-VHVKDZCV.mjs.map → chunk-3YMYSDUU.mjs.map} +1 -1
  35. package/dist/server/{chunk-WUAHP5L2.mjs → chunk-7NJZJL2D.mjs} +4 -4
  36. package/dist/server/{chunk-PY2A4FGZ.js → chunk-ACLGZTVX.js} +3 -3
  37. package/dist/server/{chunk-PY2A4FGZ.js.map → chunk-ACLGZTVX.js.map} +1 -1
  38. package/dist/server/{chunk-D5NOG6VZ.mjs → chunk-DHFU2AQ7.mjs} +2 -2
  39. package/dist/server/{chunk-7XBBV6UY.mjs → chunk-DWMPTB3G.mjs} +2 -2
  40. package/dist/server/{chunk-J2ZBKZVF.mjs → chunk-E5G5COYU.mjs} +21 -15
  41. package/dist/server/chunk-E5G5COYU.mjs.map +1 -0
  42. package/dist/server/{chunk-H3SRB5G4.js → chunk-EFQNS3HS.js} +6 -6
  43. package/dist/server/{chunk-H3SRB5G4.js.map → chunk-EFQNS3HS.js.map} +1 -1
  44. package/dist/server/{chunk-PTHRXZUJ.js → chunk-END3H7C6.js} +32 -26
  45. package/dist/server/chunk-END3H7C6.js.map +1 -0
  46. package/dist/server/{chunk-TOBOHAEX.js → chunk-FKMJDBEA.js} +5 -5
  47. package/dist/server/{chunk-TOBOHAEX.js.map → chunk-FKMJDBEA.js.map} +1 -1
  48. package/dist/server/{chunk-TU3WAJPX.js → chunk-GTE6ZI5W.js} +13 -10
  49. package/dist/server/chunk-GTE6ZI5W.js.map +1 -0
  50. package/dist/server/{chunk-ZIY3QZJ3.mjs → chunk-HQZKJ5MH.mjs} +2 -2
  51. package/dist/server/{chunk-UK7SLIIG.js → chunk-IH2NRKKI.js} +3 -3
  52. package/dist/server/{chunk-UK7SLIIG.js.map → chunk-IH2NRKKI.js.map} +1 -1
  53. package/dist/server/{chunk-OPW33AGO.mjs → chunk-JMKX5FTE.mjs} +16 -4
  54. package/dist/server/chunk-JMKX5FTE.mjs.map +1 -0
  55. package/dist/server/{chunk-RVLBSKSU.mjs → chunk-KNF42IKQ.mjs} +2 -2
  56. package/dist/server/{chunk-7ORXXMTP.js → chunk-QIBPYE44.js} +9 -9
  57. package/dist/server/{chunk-7ORXXMTP.js.map → chunk-QIBPYE44.js.map} +1 -1
  58. package/dist/server/{chunk-3Z25JQ6H.mjs → chunk-QOBADLB4.mjs} +2 -2
  59. package/dist/server/{chunk-OOIGZH5B.mjs → chunk-RFQZDDUM.mjs} +2 -2
  60. package/dist/server/{chunk-33KZRQJY.mjs → chunk-T3ZGODHW.mjs} +2 -2
  61. package/dist/server/{chunk-CCAD7BUN.mjs → chunk-TCRV6VRW.mjs} +8 -5
  62. package/dist/server/chunk-TCRV6VRW.mjs.map +1 -0
  63. package/dist/server/{chunk-Z4AMGXH2.js → chunk-UZMAP5RH.js} +3 -3
  64. package/dist/server/{chunk-Z4AMGXH2.js.map → chunk-UZMAP5RH.js.map} +1 -1
  65. package/dist/server/chunk-VRDQJRYS.mjs +11 -0
  66. package/dist/server/chunk-VRDQJRYS.mjs.map +1 -0
  67. package/dist/server/{chunk-V5EQHRVR.js → chunk-WEEEYI47.js} +4 -4
  68. package/dist/server/{chunk-V5EQHRVR.js.map → chunk-WEEEYI47.js.map} +1 -1
  69. package/dist/server/{chunk-KAVH2CX7.js → chunk-X5XHOSOM.js} +49 -49
  70. package/dist/server/{chunk-KAVH2CX7.js.map → chunk-X5XHOSOM.js.map} +1 -1
  71. package/dist/server/components.js +5 -5
  72. package/dist/server/components.mjs +4 -4
  73. package/dist/server/config-validation.js +6 -5
  74. package/dist/server/config-validation.js.map +1 -1
  75. package/dist/server/config-validation.mjs +5 -4
  76. package/dist/server/config.js +6 -5
  77. package/dist/server/config.js.map +1 -1
  78. package/dist/server/config.mjs +5 -4
  79. package/dist/server/config.mjs.map +1 -1
  80. package/dist/server/data.js +3 -3
  81. package/dist/server/data.mjs +2 -2
  82. package/dist/server/index.js +4 -4
  83. package/dist/server/index.mjs +3 -3
  84. package/dist/server/{loadPage-3F57VAE2.mjs → loadPage-EZXWZ7SJ.mjs} +4 -4
  85. package/dist/server/{loadPage-JRS5JUAY.js → loadPage-G74D6VXZ.js} +5 -5
  86. package/dist/server/{loadPage-JRS5JUAY.js.map → loadPage-G74D6VXZ.js.map} +1 -1
  87. package/dist/server/next.js +17 -17
  88. package/dist/server/next.mjs +7 -7
  89. package/dist/server/page-converter.js +16 -10
  90. package/dist/server/page-converter.js.map +1 -1
  91. package/dist/server/page-converter.mjs +9 -3
  92. package/dist/server/page-converter.mjs.map +1 -1
  93. package/dist/server/prebuild.js +3 -3
  94. package/dist/server/prebuild.mjs +2 -2
  95. package/dist/server/rendering/server.js +7 -7
  96. package/dist/server/rendering/server.mjs +6 -6
  97. package/dist/server/rendering.js +9 -9
  98. package/dist/server/rendering.mjs +8 -8
  99. package/dist/server/routing.js +1 -1
  100. package/dist/server/routing.mjs +1 -1
  101. package/dist/server/server.js +7 -7
  102. package/dist/server/server.mjs +6 -6
  103. package/dist/server/theme-bridge.js +10 -10
  104. package/dist/server/theme-bridge.mjs +2 -2
  105. package/dist/server/theme.js +4 -4
  106. package/dist/server/theme.mjs +2 -2
  107. package/package.json +1 -1
  108. package/dist/server/chunk-53NRFMMN.js.map +0 -1
  109. package/dist/server/chunk-CCAD7BUN.mjs.map +0 -1
  110. package/dist/server/chunk-J2ZBKZVF.mjs.map +0 -1
  111. package/dist/server/chunk-OPW33AGO.mjs.map +0 -1
  112. package/dist/server/chunk-PTHRXZUJ.js.map +0 -1
  113. package/dist/server/chunk-TU3WAJPX.js.map +0 -1
  114. package/dist/server/chunk-VHVKDZCV.mjs +0 -7
  115. /package/dist/server/{chunk-2M7734OW.mjs.map → chunk-2Y65RENO.mjs.map} +0 -0
  116. /package/dist/server/{chunk-WUAHP5L2.mjs.map → chunk-7NJZJL2D.mjs.map} +0 -0
  117. /package/dist/server/{chunk-D5NOG6VZ.mjs.map → chunk-DHFU2AQ7.mjs.map} +0 -0
  118. /package/dist/server/{chunk-7XBBV6UY.mjs.map → chunk-DWMPTB3G.mjs.map} +0 -0
  119. /package/dist/server/{chunk-ZIY3QZJ3.mjs.map → chunk-HQZKJ5MH.mjs.map} +0 -0
  120. /package/dist/server/{chunk-RVLBSKSU.mjs.map → chunk-KNF42IKQ.mjs.map} +0 -0
  121. /package/dist/server/{chunk-3Z25JQ6H.mjs.map → chunk-QOBADLB4.mjs.map} +0 -0
  122. /package/dist/server/{chunk-OOIGZH5B.mjs.map → chunk-RFQZDDUM.mjs.map} +0 -0
  123. /package/dist/server/{chunk-33KZRQJY.mjs.map → chunk-T3ZGODHW.mjs.map} +0 -0
  124. /package/dist/server/{loadPage-3F57VAE2.mjs.map → loadPage-EZXWZ7SJ.mjs.map} +0 -0
@@ -5,7 +5,7 @@ import {
5
5
  PageRenderer,
6
6
  ThemeScope,
7
7
  buildThemeRuntime
8
- } from "./chunk-3Z25JQ6H.mjs";
8
+ } from "./chunk-QOBADLB4.mjs";
9
9
 
10
10
  // src/rendering/components/Page.tsx
11
11
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
@@ -74,4 +74,4 @@ function Page({
74
74
  export {
75
75
  Page
76
76
  };
77
- //# sourceMappingURL=chunk-RVLBSKSU.mjs.map
77
+ //# sourceMappingURL=chunk-KNF42IKQ.mjs.map
@@ -2,13 +2,13 @@
2
2
 
3
3
 
4
4
 
5
- var _chunkKAVH2CX7js = require('./chunk-KAVH2CX7.js');
5
+ var _chunkX5XHOSOMjs = require('./chunk-X5XHOSOM.js');
6
6
 
7
7
 
8
- var _chunkH3SRB5G4js = require('./chunk-H3SRB5G4.js');
8
+ var _chunkEFQNS3HSjs = require('./chunk-EFQNS3HS.js');
9
9
 
10
10
 
11
- var _chunk53NRFMMNjs = require('./chunk-53NRFMMN.js');
11
+ var _chunk377J7BKCjs = require('./chunk-377J7BKC.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 = _chunk53NRFMMNjs.getBlockDefinition.call(void 0, blockKind);
27
+ const definition = _chunk377J7BKCjs.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 = _chunkKAVH2CX7js.buildThemeRuntime.call(void 0, theme);
34
+ const themeRuntime = _chunkX5XHOSOMjs.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 _chunkH3SRB5G4js.prefetchBlockData.call(void 0,
47
+ const allResolvedData = await _chunkEFQNS3HSjs.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 = _chunkKAVH2CX7js.makeDefaultBlockComponent.call(void 0, { manifest: definition.manifest });
74
- const registry = _chunkKAVH2CX7js.getDefaultComponentRegistry.call(void 0, );
73
+ const BlockComponent = _chunkX5XHOSOMjs.makeDefaultBlockComponent.call(void 0, { manifest: definition.manifest });
74
+ const registry = _chunkX5XHOSOMjs.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-7ORXXMTP.js.map
92
+ //# sourceMappingURL=chunk-QIBPYE44.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/will/Projects/Business/cms/main-branch/packages/sdk/dist/server/chunk-7ORXXMTP.js","../../src/rendering/components/Block.tsx"],"names":[],"mappings":"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","file":"/Users/will/Projects/Business/cms/main-branch/packages/sdk/dist/server/chunk-7ORXXMTP.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/main-branch/packages/sdk/dist/server/chunk-QIBPYE44.js","../../src/rendering/components/Block.tsx"],"names":[],"mappings":"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","file":"/Users/will/Projects/Business/cms/main-branch/packages/sdk/dist/server/chunk-QIBPYE44.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"]}
@@ -83,7 +83,7 @@ import {
83
83
  runTransforms,
84
84
  testimonialsCarouselFragment,
85
85
  testimonialsHeadingFragment
86
- } from "./chunk-OPW33AGO.mjs";
86
+ } from "./chunk-JMKX5FTE.mjs";
87
87
  import {
88
88
  ImagePresets,
89
89
  backgroundColorStyle,
@@ -19936,4 +19936,4 @@ export {
19936
19936
  resolveBackground,
19937
19937
  SectionBackground
19938
19938
  };
19939
- //# sourceMappingURL=chunk-3Z25JQ6H.mjs.map
19939
+ //# sourceMappingURL=chunk-QOBADLB4.mjs.map
@@ -6,7 +6,7 @@ import {
6
6
  ThemeScope,
7
7
  buildThemeRuntime,
8
8
  getDefaultComponentRegistry
9
- } from "./chunk-3Z25JQ6H.mjs";
9
+ } from "./chunk-QOBADLB4.mjs";
10
10
 
11
11
  // src/rendering/components/Page.server.tsx
12
12
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
@@ -76,4 +76,4 @@ function Page({
76
76
  export {
77
77
  Page
78
78
  };
79
- //# sourceMappingURL=chunk-OOIGZH5B.mjs.map
79
+ //# sourceMappingURL=chunk-RFQZDDUM.mjs.map
@@ -4,7 +4,7 @@ import {
4
4
  defaultTransforms,
5
5
  getBlockDefinition,
6
6
  runTransforms
7
- } from "./chunk-OPW33AGO.mjs";
7
+ } from "./chunk-JMKX5FTE.mjs";
8
8
  import {
9
9
  isObjectRecord
10
10
  } from "./chunk-ADKFU25P.mjs";
@@ -485,4 +485,4 @@ export {
485
485
  SUPPORTED_LOADER_ENDPOINTS,
486
486
  prefetchBlockData2 as prefetchBlockData
487
487
  };
488
- //# sourceMappingURL=chunk-33KZRQJY.mjs.map
488
+ //# sourceMappingURL=chunk-T3ZGODHW.mjs.map
@@ -12,11 +12,11 @@ import {
12
12
  buildThemeRuntime,
13
13
  renderBlock,
14
14
  resolveFooterRenderPlan
15
- } from "./chunk-3Z25JQ6H.mjs";
15
+ } from "./chunk-QOBADLB4.mjs";
16
16
  import {
17
17
  siteFooterManifest,
18
18
  siteHeaderManifest
19
- } from "./chunk-OPW33AGO.mjs";
19
+ } from "./chunk-JMKX5FTE.mjs";
20
20
 
21
21
  // src/rendering/components/Layout.tsx
22
22
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
@@ -31,7 +31,8 @@ async function Layout({
31
31
  footer = true,
32
32
  headerVariant,
33
33
  hasPortalSession = false,
34
- previewStage = "published"
34
+ previewStage = "published",
35
+ useThemeScope = true
35
36
  }) {
36
37
  let siteData = providedSiteData;
37
38
  if (!siteData) {
@@ -63,6 +64,7 @@ async function Layout({
63
64
  };
64
65
  const footerData = {
65
66
  menu: menuViewModel,
67
+ footerMenu: footerMenuViewModel,
66
68
  logo: logoViewModel,
67
69
  site,
68
70
  theme,
@@ -149,14 +151,15 @@ async function Layout({
149
151
  } else if (typeof footer === "function") {
150
152
  footerElement = footer(footerData);
151
153
  }
152
- return /* @__PURE__ */ jsxs(ThemeScope, { theme, children: [
154
+ const content = /* @__PURE__ */ jsxs(Fragment, { children: [
153
155
  headerElement,
154
156
  children,
155
157
  footerElement
156
158
  ] });
159
+ return useThemeScope ? /* @__PURE__ */ jsx(ThemeScope, { theme, children: content }) : content;
157
160
  }
158
161
 
159
162
  export {
160
163
  Layout
161
164
  };
162
- //# sourceMappingURL=chunk-CCAD7BUN.mjs.map
165
+ //# sourceMappingURL=chunk-TCRV6VRW.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/rendering/components/Layout.tsx"],"sourcesContent":["/**\n * Layout component with header and footer\n *\n * Renders site header and footer around content. Fetches site data if not provided.\n */\n\nimport { PageRenderer, renderBlock, resolveFooterRenderPlan, siteFooterManifest, siteHeaderManifest, buildThemeRuntime, ThemeScope } from '@riverbankcms/blocks';\nimport { getRiverbankEnv } from '../../env';\nimport { buildMenu, buildFooterMenu, buildLogo } from '../../navigation';\nimport type { RiverbankClient, SiteResponse } from '../../client/types';\n\nexport type HeaderData = {\n menu: ReturnType<typeof buildMenu>;\n logo: ReturnType<typeof buildLogo>;\n site: SiteResponse['site'];\n theme: SiteResponse['theme'];\n routes: SiteResponse['routes'];\n};\n\nexport type FooterData = {\n menu: ReturnType<typeof buildMenu>;\n footerMenu: ReturnType<typeof buildFooterMenu>;\n logo: ReturnType<typeof buildLogo>;\n site: SiteResponse['site'];\n theme: SiteResponse['theme'];\n routes: SiteResponse['routes'];\n};\n\nexport type LayoutProps = {\n // Option 1: Pass pre-fetched site data\n siteData?: SiteResponse;\n\n // Option 2: Fetch site data (provide client + identifier)\n client?: RiverbankClient;\n siteId?: string;\n slug?: string;\n domain?: string;\n\n // Content\n children: React.ReactNode;\n\n // Control rendering\n header?: boolean | ((data: HeaderData) => React.ReactNode);\n footer?: boolean | ((data: FooterData) => React.ReactNode);\n\n // Header variant override (if using default header)\n headerVariant?: 'classic' | 'centered' | 'transparent' | 'floating' | 'editorial';\n /**\n * Whether the current request has an active portal session.\n * Used to resolve portal navigation labels (e.g. \"Login\" vs \"My account\").\n *\n * @default false\n */\n hasPortalSession?: boolean;\n /** Render stage for internal links and block transforms. */\n previewStage?: 'published' | 'preview';\n\n /**\n * Wrap layout content in ThemeScope to inject theme CSS variables and styles.\n * Enable this to use built-in theme styling from the CMS.\n * Disable if you're bringing your own styles and want to avoid SDK-injected theme variables.\n *\n * Note: Disabling this while using the default header/footer (blocks) may result in unstyled output.\n *\n * @default true\n */\n useThemeScope?: boolean;\n};\n\n/**\n * Layout component that wraps content with site header and footer.\n *\n * @example With pre-fetched site data (recommended)\n * ```tsx\n * const site = await client.getSite({ slug: 'my-site' });\n *\n * <Layout siteData={site}>\n * <Page {...pageData} />\n * </Layout>\n * ```\n *\n * @example With automatic fetching\n * ```tsx\n * <Layout client={client} slug=\"my-site\">\n * <Page {...pageData} />\n * </Layout>\n * ```\n */\nexport async function Layout({\n siteData: providedSiteData,\n client,\n siteId,\n slug,\n domain,\n children,\n header = true,\n footer = true,\n headerVariant,\n hasPortalSession = false,\n previewStage = 'published',\n useThemeScope = true,\n}: LayoutProps) {\n // Fetch site data if not provided\n let siteData = providedSiteData;\n if (!siteData) {\n if (!client) {\n throw new Error('Layout: must provide either siteData or client');\n }\n if (!siteId && !slug && !domain) {\n throw new Error('Layout: must provide siteId, slug, or domain when using client');\n }\n\n siteData = await client.getSite({ id: siteId, slug, domain });\n }\n\n const { site, theme, navigation, layout, routes } = siteData;\n const footerBlocks = siteData.footerBlocks ?? [];\n const themeRuntime = buildThemeRuntime(theme);\n const navigationOptions = {\n hasPortalSession,\n previewStage,\n portalEnabled: siteData.portalEnabled ?? false,\n };\n\n // Build view models for header/footer\n const menuViewModel = buildMenu(navigation, routes, navigationOptions);\n const footerMenuViewModel = buildFooterMenu(navigation, routes, navigationOptions);\n const logoViewModel = buildLogo(layout.logo ?? null, site.title);\n\n // Prepare header data for custom headers\n const headerData: HeaderData = {\n menu: menuViewModel,\n logo: logoViewModel,\n site,\n theme,\n routes,\n };\n\n const footerData: FooterData = {\n menu: menuViewModel,\n footerMenu: footerMenuViewModel,\n logo: logoViewModel,\n site,\n theme,\n routes,\n };\n\n // Override header variant if specified\n const headerContent = headerVariant\n ? { ...layout.header, variant: headerVariant }\n : layout.header;\n\n // Override theme header variant if specified\n const themeWithVariant = headerVariant\n ? {\n ...theme,\n header: { ...theme.header, variant: headerVariant },\n }\n : theme;\n\n // Get API base URL for client-side components\n // This is resolved on the server where env vars are available\n let apiBaseUrl: string | undefined;\n try {\n const env = getRiverbankEnv();\n apiBaseUrl = env.baseUrl;\n } catch {\n // Silently fail if env vars not configured - client components will fall back to their own resolution\n }\n\n const viewModelOverrides = {\n $root: {\n siteId: site.id,\n apiBaseUrl,\n previewStage,\n routes,\n theme: themeWithVariant,\n },\n site,\n menu: menuViewModel,\n footerMenu: footerMenuViewModel,\n content: {\n logo: logoViewModel,\n },\n };\n\n // Render header based on type\n let headerElement: React.ReactNode = null;\n if (header === true) {\n // Default header rendering\n headerElement = renderBlock(siteHeaderManifest, headerContent, {\n theme: themeRuntime.tokens,\n themeConfig: themeWithVariant,\n viewModelOverrides,\n });\n } else if (typeof header === 'function') {\n // Custom header rendering\n headerElement = header(headerData);\n }\n\n // Render footer based on type\n let footerElement: React.ReactNode = null;\n if (footer === true) {\n const isSdkSite = Boolean(site.is_sdk_site);\n const footerPlan = resolveFooterRenderPlan({\n isSdkSite,\n mode: theme.footer?.mode,\n });\n\n const footerBlocksElement =\n footerPlan.renderFooterBlocks && footerBlocks.length > 0\n ? (\n <PageRenderer\n theme={theme}\n page={{\n name: 'Footer blocks',\n path: '/__footer',\n purpose: 'footer',\n blocks: footerBlocks,\n }}\n routeMap={routes}\n dataContext={{\n previewStage,\n siteId: site.id,\n apiBaseUrl,\n routes,\n }}\n sdkConfig={siteData.sdkConfig ?? null}\n />\n )\n : null;\n\n if (footerPlan.renderFooterBlocks && !footerBlocksElement && process.env.NODE_ENV !== 'production') {\n console.debug('[sdk] Footer mode renders blocks, but footerBlocks is empty/missing', {\n siteId: site.id,\n mode: footerPlan.mode,\n });\n }\n\n const defaultFooterElement = footerPlan.renderDefaultFooter\n ? renderBlock(siteFooterManifest, layout.footer, {\n theme: themeRuntime.tokens,\n themeConfig: theme,\n viewModelOverrides,\n })\n : null;\n\n footerElement =\n footerPlan.mode === 'default+blocks'\n ? (\n <>\n {footerBlocksElement}\n {defaultFooterElement}\n </>\n )\n : footerPlan.mode === 'blocks'\n ? footerBlocksElement\n : footerPlan.mode === 'none'\n ? null\n : defaultFooterElement;\n } else if (typeof footer === 'function') {\n // Custom footer rendering\n footerElement = footer(footerData);\n }\n\n const content = (\n <>\n {headerElement}\n {children}\n {footerElement}\n </>\n );\n\n return useThemeScope ? <ThemeScope theme={theme}>{content}</ThemeScope> : content;\n}\n"],"mappings":"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","names":[]}
@@ -4,7 +4,7 @@
4
4
  var _chunkGPJB33BKjs = require('./chunk-GPJB33BK.js');
5
5
 
6
6
 
7
- var _chunkQE4VT6ZZjs = require('./chunk-QE4VT6ZZ.js');
7
+ var _chunk2VZTRLVNjs = require('./chunk-2VZTRLVN.js');
8
8
 
9
9
  // src/prebuild/index.ts
10
10
  var _fs = require('fs'); var fs = _interopRequireWildcard(_fs);
@@ -312,7 +312,7 @@ async function prebuildCache(options) {
312
312
  version: MANIFEST_VERSION,
313
313
  generatedAt,
314
314
  siteId,
315
- sdkVersion: _chunkQE4VT6ZZjs.SDK_VERSION,
315
+ sdkVersion: _chunk2VZTRLVNjs.SDK_VERSION,
316
316
  keyToFile,
317
317
  includedTypes: include,
318
318
  fileCount: files.length,
@@ -336,4 +336,4 @@ async function prebuildCache(options) {
336
336
 
337
337
 
338
338
  exports.prebuildCache = prebuildCache;
339
- //# sourceMappingURL=chunk-Z4AMGXH2.js.map
339
+ //# sourceMappingURL=chunk-UZMAP5RH.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/will/Projects/Business/cms/main-branch/packages/sdk/dist/server/chunk-Z4AMGXH2.js","../../src/prebuild/index.ts"],"names":[],"mappings":"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","file":"/Users/will/Projects/Business/cms/main-branch/packages/sdk/dist/server/chunk-Z4AMGXH2.js","sourcesContent":[null,"/**\n * Prebuild cache generation\n *\n * Exports static content at build time for use as a last-resort fallback\n * when the CMS is unavailable.\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as crypto from 'crypto';\nimport type {\n PrebuildOptions,\n PrebuildResult,\n PrebuildProgress,\n PrebuildManifest,\n SiteCacheFile,\n PageCacheFile,\n PageIndexFile,\n EntriesCacheFile,\n NavigationCacheFile,\n FormsCacheFile,\n} from './types';\nimport type { RiverbankClient, SiteResponse, EntriesResponse } from '../client/types';\nimport { SDK_VERSION } from '../version';\nimport { PREBUILD_PAGE_SIZE, DEFAULT_PREBUILD_DIR } from '../constants';\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst MANIFEST_VERSION = '1.0.0';\nconst MANIFEST_FILENAME = 'manifest.json';\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/**\n * Convert a URL path to a safe filename.\n * Sanitizes special characters that are invalid on some filesystems.\n * e.g., '/about/team' -> 'about-team.json'\n * e.g., '/api/users?id=1' -> 'api-users_id_1.json'\n * Note: '/' becomes '_home.json' to avoid collision with '_index.json' (page listing)\n */\nfunction pathToFilename(routePath: string): string {\n if (routePath === '/') return '_home.json';\n return (\n routePath\n .slice(1)\n // Replace special characters with underscores (?, *, :, etc.)\n .replace(/[^a-zA-Z0-9\\-\\/]/g, '_')\n // Replace slashes with dashes\n .replace(/\\//g, '-') + '.json'\n );\n}\n\n/**\n * Ensure a directory exists, creating it recursively if needed.\n */\nfunction ensureDir(dirPath: string): void {\n if (!fs.existsSync(dirPath)) {\n fs.mkdirSync(dirPath, { recursive: true });\n }\n}\n\n/**\n * Write JSON data to a file.\n */\nfunction writeJsonFile(filePath: string, data: unknown): number {\n const content = JSON.stringify(data, null, 2);\n fs.writeFileSync(filePath, content, 'utf-8');\n return Buffer.byteLength(content, 'utf-8');\n}\n\n/**\n * Calculate SHA256 checksum of object (excluding checksum field).\n */\nfunction calculateChecksum(data: Record<string, unknown>): string {\n const { checksum: _, ...rest } = data;\n const content = JSON.stringify(rest);\n return crypto.createHash('sha256').update(content).digest('hex');\n}\n\n// ============================================================================\n// Entry Fetching\n// ============================================================================\n\n/**\n * Fetch all entries for a content type using pagination.\n * Loops until all entries are retrieved.\n */\nasync function fetchAllEntries(\n client: RiverbankClient,\n siteId: string,\n contentType: string,\n onProgress?: (item: string) => void\n): Promise<EntriesResponse['entries']> {\n const allEntries: EntriesResponse['entries'] = [];\n let offset = 0;\n let hasMore = true;\n\n while (hasMore) {\n onProgress?.(`${contentType} (batch ${Math.floor(offset / PREBUILD_PAGE_SIZE) + 1})`);\n\n const response = await client.getEntries({\n siteId,\n contentType,\n limit: PREBUILD_PAGE_SIZE,\n offset,\n preview: false, // Published content only\n });\n\n allEntries.push(...response.entries);\n offset += PREBUILD_PAGE_SIZE;\n hasMore = response.entries.length === PREBUILD_PAGE_SIZE;\n }\n\n return allEntries;\n}\n\n// ============================================================================\n// Content Type Prebuild Functions\n// ============================================================================\n\nasync function prebuildSite(\n client: RiverbankClient,\n siteId: string,\n outputDir: string\n): Promise<{ files: string[]; size: number; siteData: SiteResponse }> {\n const site = await client.getSite({ id: siteId });\n const filename = 'site.json';\n const filePath = path.join(outputDir, filename);\n\n const cacheFile: SiteCacheFile = {\n data: site,\n generatedAt: new Date().toISOString(),\n };\n\n const size = writeJsonFile(filePath, cacheFile);\n return { files: [filename], size, siteData: site };\n}\n\nasync function prebuildPages(\n client: RiverbankClient,\n siteId: string,\n routes: Record<string, { path: string; status: string | null }>,\n outputDir: string,\n onProgress?: (progress: PrebuildProgress) => void\n): Promise<{ files: string[]; size: number; pathMappings: Record<string, string> }> {\n const pagesDir = path.join(outputDir, 'pages');\n ensureDir(pagesDir);\n\n const files: string[] = [];\n const pathMappings: Record<string, string> = {}; // path -> filename\n let totalSize = 0;\n\n // Filter to published routes only\n const publishedPaths = Object.entries(routes)\n .filter(([_, route]) => route.status === 'published')\n .map(([_, route]) => route.path);\n\n // Create page index\n const pageIndex: PageIndexFile['pages'] = [];\n\n const total = publishedPaths.length;\n let current = 0;\n\n for (const pagePath of publishedPaths) {\n current++;\n onProgress?.({\n current,\n total,\n item: `Page: ${pagePath}`,\n contentType: 'pages',\n });\n\n try {\n const pageData = await client.getPage({ siteId, path: pagePath, preview: false });\n const filename = pathToFilename(pagePath);\n const filePath = path.join(pagesDir, filename);\n\n const cacheFile: PageCacheFile = {\n data: pageData,\n path: pagePath,\n generatedAt: new Date().toISOString(),\n };\n\n totalSize += writeJsonFile(filePath, cacheFile);\n files.push(`pages/${filename}`);\n pathMappings[pagePath] = `pages/${filename}`;\n\n // Add to index (only for page type responses)\n if ('page' in pageData) {\n pageIndex.push({\n path: pagePath,\n pageId: pageData.page.routeId || '',\n title: pageData.page.name || 'Untitled',\n });\n }\n } catch (error) {\n // Log but continue - partial prebuild is okay\n console.warn(`[Prebuild] Failed to fetch page ${pagePath}:`, (error as Error).message);\n }\n }\n\n // Write page index (uses _index.json to avoid collision with home page)\n const indexFile: PageIndexFile = {\n pages: pageIndex,\n totalCount: pageIndex.length,\n generatedAt: new Date().toISOString(),\n };\n const indexPath = path.join(pagesDir, '_index.json');\n totalSize += writeJsonFile(indexPath, indexFile);\n files.push('pages/_index.json');\n\n return { files, size: totalSize, pathMappings };\n}\n\nasync function prebuildEntries(\n client: RiverbankClient,\n siteId: string,\n contentTypes: string[],\n outputDir: string,\n onProgress?: (progress: PrebuildProgress) => void\n): Promise<{ files: string[]; size: number }> {\n const entriesDir = path.join(outputDir, 'entries');\n ensureDir(entriesDir);\n\n const files: string[] = [];\n let totalSize = 0;\n\n const total = contentTypes.length;\n let current = 0;\n\n for (const contentType of contentTypes) {\n current++;\n\n const entries = await fetchAllEntries(\n client,\n siteId,\n contentType,\n (item) => {\n onProgress?.({\n current,\n total,\n item: `Entries: ${item}`,\n contentType: 'entries',\n });\n }\n );\n\n // Create content type directory\n const typeDir = path.join(entriesDir, contentType);\n ensureDir(typeDir);\n\n const cacheFile: EntriesCacheFile = {\n entries,\n contentType,\n totalCount: entries.length,\n generatedAt: new Date().toISOString(),\n };\n\n const filename = `entries/${contentType}/all.json`;\n const filePath = path.join(entriesDir, contentType, 'all.json');\n totalSize += writeJsonFile(filePath, cacheFile);\n files.push(filename);\n }\n\n return { files, size: totalSize };\n}\n\nasync function prebuildNavigation(\n siteData: SiteResponse,\n outputDir: string,\n onProgress?: (progress: PrebuildProgress) => void\n): Promise<{ files: string[]; size: number }> {\n const navDir = path.join(outputDir, 'navigation');\n ensureDir(navDir);\n\n const files: string[] = [];\n let totalSize = 0;\n\n // Navigation data comes from site response\n const menus = siteData.navigation || [];\n\n onProgress?.({\n current: 1,\n total: 1,\n item: 'Navigation menus',\n contentType: 'navigation',\n });\n\n const cacheFile: NavigationCacheFile = {\n menus: menus.map((menu) => ({\n identifier: menu.identifier,\n id: menu.id,\n name: menu.name,\n items: menu.items,\n })),\n generatedAt: new Date().toISOString(),\n };\n\n const filename = 'navigation/menus.json';\n const filePath = path.join(navDir, 'menus.json');\n totalSize += writeJsonFile(filePath, cacheFile);\n files.push(filename);\n\n return { files, size: totalSize };\n}\n\nasync function prebuildForms(\n client: RiverbankClient,\n siteId: string,\n outputDir: string,\n onProgress?: (progress: PrebuildProgress) => void\n): Promise<{ files: string[]; size: number }> {\n const formsDir = path.join(outputDir, 'forms');\n ensureDir(formsDir);\n\n const files: string[] = [];\n let totalSize = 0;\n\n onProgress?.({\n current: 1,\n total: 1,\n item: 'Forms',\n contentType: 'forms',\n });\n\n try {\n // Fetch forms via the public API endpoint\n const response = await client.getForms({ siteId });\n const forms = response.forms || [];\n\n const cacheFile: FormsCacheFile = {\n forms: forms.map((form) => ({\n id: form.id,\n slug: form.slug,\n name: form.name,\n schema: form.schema,\n settings: form.settings,\n })),\n totalCount: forms.length,\n generatedAt: new Date().toISOString(),\n };\n\n const filename = 'forms/forms.json';\n const filePath = path.join(formsDir, 'forms.json');\n totalSize += writeJsonFile(filePath, cacheFile);\n files.push(filename);\n } catch (error) {\n console.warn('[Prebuild] Failed to fetch forms:', (error as Error).message);\n }\n\n return { files, size: totalSize };\n}\n\n// ============================================================================\n// Main Prebuild Function\n// ============================================================================\n\n/**\n * Generate a prebuild cache for the specified site.\n *\n * The prebuild cache contains static JSON files that can serve as a\n * last-resort fallback when the CMS is unavailable.\n *\n * @param options - Prebuild configuration\n * @returns Result with generated files and metadata\n *\n * @example\n * ```typescript\n * import { createRiverbankClient, prebuildCache } from '@riverbankcms/sdk';\n *\n * const client = createRiverbankClient({ apiKey, baseUrl });\n *\n * const result = await prebuildCache({\n * client,\n * siteId: 'your-site-id',\n * outputDir: '.riverbank-cache',\n * onProgress: (p) => console.log(`${p.current}/${p.total}: ${p.item}`),\n * });\n *\n * console.log(`Generated ${result.files.length} files (${result.totalSize} bytes)`);\n * ```\n */\nexport async function prebuildCache(options: PrebuildOptions): Promise<PrebuildResult> {\n const {\n client,\n siteId,\n outputDir = DEFAULT_PREBUILD_DIR,\n include = ['site', 'pages', 'entries', 'navigation', 'forms'],\n contentTypes,\n onProgress,\n } = options;\n\n const generatedAt = new Date().toISOString();\n const files: string[] = [];\n let totalSize = 0;\n const errors: string[] = [];\n let siteData: SiteResponse | null = null;\n let pagePathMappings: Record<string, string> = {}; // path -> filename\n\n // Ensure output directory exists\n ensureDir(outputDir);\n\n // -------------------------------------------------------------------------\n // 1. Prebuild site data (always needed for routes and navigation)\n // -------------------------------------------------------------------------\n if (include.includes('site') || include.includes('pages') || include.includes('navigation')) {\n try {\n const result = await prebuildSite(client, siteId, outputDir);\n siteData = result.siteData;\n if (include.includes('site')) {\n files.push(...result.files);\n totalSize += result.size;\n }\n onProgress?.({ current: 1, total: 4, item: 'Site data', contentType: 'site' });\n } catch (error) {\n errors.push(`Site prebuild failed: ${(error as Error).message}`);\n }\n }\n\n // -------------------------------------------------------------------------\n // 2. Prebuild pages\n // -------------------------------------------------------------------------\n if (include.includes('pages') && siteData) {\n try {\n const result = await prebuildPages(\n client,\n siteId,\n siteData.routes,\n outputDir,\n onProgress\n );\n files.push(...result.files);\n totalSize += result.size;\n pagePathMappings = result.pathMappings;\n } catch (error) {\n errors.push(`Pages prebuild failed: ${(error as Error).message}`);\n }\n }\n\n // -------------------------------------------------------------------------\n // 3. Prebuild entries\n // -------------------------------------------------------------------------\n if (include.includes('entries')) {\n try {\n // Content types must be explicitly provided via options.contentTypes\n // (The API's sdkConfig doesn't include content type definitions)\n const typesToPrebuild = contentTypes || [];\n\n if (typesToPrebuild.length > 0) {\n const result = await prebuildEntries(\n client,\n siteId,\n typesToPrebuild,\n outputDir,\n onProgress\n );\n files.push(...result.files);\n totalSize += result.size;\n } else {\n console.warn('[Prebuild] No contentTypes provided - skipping entries prebuild');\n }\n } catch (error) {\n errors.push(`Entries prebuild failed: ${(error as Error).message}`);\n }\n }\n\n // -------------------------------------------------------------------------\n // 4. Prebuild navigation\n // -------------------------------------------------------------------------\n if (include.includes('navigation') && siteData) {\n try {\n const result = await prebuildNavigation(siteData, outputDir, onProgress);\n files.push(...result.files);\n totalSize += result.size;\n } catch (error) {\n errors.push(`Navigation prebuild failed: ${(error as Error).message}`);\n }\n }\n\n // -------------------------------------------------------------------------\n // 5. Prebuild forms\n // -------------------------------------------------------------------------\n if (include.includes('forms')) {\n try {\n const result = await prebuildForms(client, siteId, outputDir, onProgress);\n files.push(...result.files);\n totalSize += result.size;\n } catch (error) {\n errors.push(`Forms prebuild failed: ${(error as Error).message}`);\n }\n }\n\n // -------------------------------------------------------------------------\n // 6. Generate manifest\n // -------------------------------------------------------------------------\n const keyToFile: Record<string, string> = {};\n\n // Map cache keys to files\n if (files.includes('site.json')) {\n keyToFile[`site:${siteId}`] = 'site.json';\n }\n\n // Use path mappings for pages (avoids lossy filename-to-path conversion)\n for (const [pagePath, file] of Object.entries(pagePathMappings)) {\n keyToFile[`page:${siteId}:${pagePath}:false`] = file;\n }\n\n // Add entries keys (entries/{contentType}/all.json)\n for (const file of files.filter((f) => f.startsWith('entries/') && f.endsWith('/all.json'))) {\n const contentType = file.split('/')[1];\n keyToFile[`entries-all:${siteId}:${contentType}`] = file;\n }\n\n // Add forms key\n if (files.includes('forms/forms.json')) {\n keyToFile[`forms:${siteId}`] = 'forms/forms.json';\n }\n\n const manifest: Omit<PrebuildManifest, 'checksum'> & { checksum?: string } = {\n version: MANIFEST_VERSION,\n generatedAt,\n siteId,\n sdkVersion: SDK_VERSION,\n keyToFile,\n includedTypes: include,\n fileCount: files.length,\n totalSize,\n };\n\n // Calculate checksum\n const checksum = calculateChecksum(manifest as Record<string, unknown>);\n (manifest as PrebuildManifest).checksum = checksum;\n\n const manifestPath = path.join(outputDir, MANIFEST_FILENAME);\n writeJsonFile(manifestPath, manifest);\n\n return {\n success: errors.length === 0,\n outputDir,\n files,\n totalSize,\n generatedAt,\n checksum,\n errors: errors.length > 0 ? errors : undefined,\n };\n}\n\n// Re-export types\nexport type {\n PrebuildOptions,\n PrebuildResult,\n PrebuildProgress,\n PrebuildManifest,\n PrebuildContentType,\n} from './types';\n"]}
1
+ {"version":3,"sources":["/Users/will/Projects/Business/cms/main-branch/packages/sdk/dist/server/chunk-UZMAP5RH.js","../../src/prebuild/index.ts"],"names":[],"mappings":"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","file":"/Users/will/Projects/Business/cms/main-branch/packages/sdk/dist/server/chunk-UZMAP5RH.js","sourcesContent":[null,"/**\n * Prebuild cache generation\n *\n * Exports static content at build time for use as a last-resort fallback\n * when the CMS is unavailable.\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as crypto from 'crypto';\nimport type {\n PrebuildOptions,\n PrebuildResult,\n PrebuildProgress,\n PrebuildManifest,\n SiteCacheFile,\n PageCacheFile,\n PageIndexFile,\n EntriesCacheFile,\n NavigationCacheFile,\n FormsCacheFile,\n} from './types';\nimport type { RiverbankClient, SiteResponse, EntriesResponse } from '../client/types';\nimport { SDK_VERSION } from '../version';\nimport { PREBUILD_PAGE_SIZE, DEFAULT_PREBUILD_DIR } from '../constants';\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst MANIFEST_VERSION = '1.0.0';\nconst MANIFEST_FILENAME = 'manifest.json';\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/**\n * Convert a URL path to a safe filename.\n * Sanitizes special characters that are invalid on some filesystems.\n * e.g., '/about/team' -> 'about-team.json'\n * e.g., '/api/users?id=1' -> 'api-users_id_1.json'\n * Note: '/' becomes '_home.json' to avoid collision with '_index.json' (page listing)\n */\nfunction pathToFilename(routePath: string): string {\n if (routePath === '/') return '_home.json';\n return (\n routePath\n .slice(1)\n // Replace special characters with underscores (?, *, :, etc.)\n .replace(/[^a-zA-Z0-9\\-\\/]/g, '_')\n // Replace slashes with dashes\n .replace(/\\//g, '-') + '.json'\n );\n}\n\n/**\n * Ensure a directory exists, creating it recursively if needed.\n */\nfunction ensureDir(dirPath: string): void {\n if (!fs.existsSync(dirPath)) {\n fs.mkdirSync(dirPath, { recursive: true });\n }\n}\n\n/**\n * Write JSON data to a file.\n */\nfunction writeJsonFile(filePath: string, data: unknown): number {\n const content = JSON.stringify(data, null, 2);\n fs.writeFileSync(filePath, content, 'utf-8');\n return Buffer.byteLength(content, 'utf-8');\n}\n\n/**\n * Calculate SHA256 checksum of object (excluding checksum field).\n */\nfunction calculateChecksum(data: Record<string, unknown>): string {\n const { checksum: _, ...rest } = data;\n const content = JSON.stringify(rest);\n return crypto.createHash('sha256').update(content).digest('hex');\n}\n\n// ============================================================================\n// Entry Fetching\n// ============================================================================\n\n/**\n * Fetch all entries for a content type using pagination.\n * Loops until all entries are retrieved.\n */\nasync function fetchAllEntries(\n client: RiverbankClient,\n siteId: string,\n contentType: string,\n onProgress?: (item: string) => void\n): Promise<EntriesResponse['entries']> {\n const allEntries: EntriesResponse['entries'] = [];\n let offset = 0;\n let hasMore = true;\n\n while (hasMore) {\n onProgress?.(`${contentType} (batch ${Math.floor(offset / PREBUILD_PAGE_SIZE) + 1})`);\n\n const response = await client.getEntries({\n siteId,\n contentType,\n limit: PREBUILD_PAGE_SIZE,\n offset,\n preview: false, // Published content only\n });\n\n allEntries.push(...response.entries);\n offset += PREBUILD_PAGE_SIZE;\n hasMore = response.entries.length === PREBUILD_PAGE_SIZE;\n }\n\n return allEntries;\n}\n\n// ============================================================================\n// Content Type Prebuild Functions\n// ============================================================================\n\nasync function prebuildSite(\n client: RiverbankClient,\n siteId: string,\n outputDir: string\n): Promise<{ files: string[]; size: number; siteData: SiteResponse }> {\n const site = await client.getSite({ id: siteId });\n const filename = 'site.json';\n const filePath = path.join(outputDir, filename);\n\n const cacheFile: SiteCacheFile = {\n data: site,\n generatedAt: new Date().toISOString(),\n };\n\n const size = writeJsonFile(filePath, cacheFile);\n return { files: [filename], size, siteData: site };\n}\n\nasync function prebuildPages(\n client: RiverbankClient,\n siteId: string,\n routes: Record<string, { path: string; status: string | null }>,\n outputDir: string,\n onProgress?: (progress: PrebuildProgress) => void\n): Promise<{ files: string[]; size: number; pathMappings: Record<string, string> }> {\n const pagesDir = path.join(outputDir, 'pages');\n ensureDir(pagesDir);\n\n const files: string[] = [];\n const pathMappings: Record<string, string> = {}; // path -> filename\n let totalSize = 0;\n\n // Filter to published routes only\n const publishedPaths = Object.entries(routes)\n .filter(([_, route]) => route.status === 'published')\n .map(([_, route]) => route.path);\n\n // Create page index\n const pageIndex: PageIndexFile['pages'] = [];\n\n const total = publishedPaths.length;\n let current = 0;\n\n for (const pagePath of publishedPaths) {\n current++;\n onProgress?.({\n current,\n total,\n item: `Page: ${pagePath}`,\n contentType: 'pages',\n });\n\n try {\n const pageData = await client.getPage({ siteId, path: pagePath, preview: false });\n const filename = pathToFilename(pagePath);\n const filePath = path.join(pagesDir, filename);\n\n const cacheFile: PageCacheFile = {\n data: pageData,\n path: pagePath,\n generatedAt: new Date().toISOString(),\n };\n\n totalSize += writeJsonFile(filePath, cacheFile);\n files.push(`pages/${filename}`);\n pathMappings[pagePath] = `pages/${filename}`;\n\n // Add to index (only for page type responses)\n if ('page' in pageData) {\n pageIndex.push({\n path: pagePath,\n pageId: pageData.page.routeId || '',\n title: pageData.page.name || 'Untitled',\n });\n }\n } catch (error) {\n // Log but continue - partial prebuild is okay\n console.warn(`[Prebuild] Failed to fetch page ${pagePath}:`, (error as Error).message);\n }\n }\n\n // Write page index (uses _index.json to avoid collision with home page)\n const indexFile: PageIndexFile = {\n pages: pageIndex,\n totalCount: pageIndex.length,\n generatedAt: new Date().toISOString(),\n };\n const indexPath = path.join(pagesDir, '_index.json');\n totalSize += writeJsonFile(indexPath, indexFile);\n files.push('pages/_index.json');\n\n return { files, size: totalSize, pathMappings };\n}\n\nasync function prebuildEntries(\n client: RiverbankClient,\n siteId: string,\n contentTypes: string[],\n outputDir: string,\n onProgress?: (progress: PrebuildProgress) => void\n): Promise<{ files: string[]; size: number }> {\n const entriesDir = path.join(outputDir, 'entries');\n ensureDir(entriesDir);\n\n const files: string[] = [];\n let totalSize = 0;\n\n const total = contentTypes.length;\n let current = 0;\n\n for (const contentType of contentTypes) {\n current++;\n\n const entries = await fetchAllEntries(\n client,\n siteId,\n contentType,\n (item) => {\n onProgress?.({\n current,\n total,\n item: `Entries: ${item}`,\n contentType: 'entries',\n });\n }\n );\n\n // Create content type directory\n const typeDir = path.join(entriesDir, contentType);\n ensureDir(typeDir);\n\n const cacheFile: EntriesCacheFile = {\n entries,\n contentType,\n totalCount: entries.length,\n generatedAt: new Date().toISOString(),\n };\n\n const filename = `entries/${contentType}/all.json`;\n const filePath = path.join(entriesDir, contentType, 'all.json');\n totalSize += writeJsonFile(filePath, cacheFile);\n files.push(filename);\n }\n\n return { files, size: totalSize };\n}\n\nasync function prebuildNavigation(\n siteData: SiteResponse,\n outputDir: string,\n onProgress?: (progress: PrebuildProgress) => void\n): Promise<{ files: string[]; size: number }> {\n const navDir = path.join(outputDir, 'navigation');\n ensureDir(navDir);\n\n const files: string[] = [];\n let totalSize = 0;\n\n // Navigation data comes from site response\n const menus = siteData.navigation || [];\n\n onProgress?.({\n current: 1,\n total: 1,\n item: 'Navigation menus',\n contentType: 'navigation',\n });\n\n const cacheFile: NavigationCacheFile = {\n menus: menus.map((menu) => ({\n identifier: menu.identifier,\n id: menu.id,\n name: menu.name,\n items: menu.items,\n })),\n generatedAt: new Date().toISOString(),\n };\n\n const filename = 'navigation/menus.json';\n const filePath = path.join(navDir, 'menus.json');\n totalSize += writeJsonFile(filePath, cacheFile);\n files.push(filename);\n\n return { files, size: totalSize };\n}\n\nasync function prebuildForms(\n client: RiverbankClient,\n siteId: string,\n outputDir: string,\n onProgress?: (progress: PrebuildProgress) => void\n): Promise<{ files: string[]; size: number }> {\n const formsDir = path.join(outputDir, 'forms');\n ensureDir(formsDir);\n\n const files: string[] = [];\n let totalSize = 0;\n\n onProgress?.({\n current: 1,\n total: 1,\n item: 'Forms',\n contentType: 'forms',\n });\n\n try {\n // Fetch forms via the public API endpoint\n const response = await client.getForms({ siteId });\n const forms = response.forms || [];\n\n const cacheFile: FormsCacheFile = {\n forms: forms.map((form) => ({\n id: form.id,\n slug: form.slug,\n name: form.name,\n schema: form.schema,\n settings: form.settings,\n })),\n totalCount: forms.length,\n generatedAt: new Date().toISOString(),\n };\n\n const filename = 'forms/forms.json';\n const filePath = path.join(formsDir, 'forms.json');\n totalSize += writeJsonFile(filePath, cacheFile);\n files.push(filename);\n } catch (error) {\n console.warn('[Prebuild] Failed to fetch forms:', (error as Error).message);\n }\n\n return { files, size: totalSize };\n}\n\n// ============================================================================\n// Main Prebuild Function\n// ============================================================================\n\n/**\n * Generate a prebuild cache for the specified site.\n *\n * The prebuild cache contains static JSON files that can serve as a\n * last-resort fallback when the CMS is unavailable.\n *\n * @param options - Prebuild configuration\n * @returns Result with generated files and metadata\n *\n * @example\n * ```typescript\n * import { createRiverbankClient, prebuildCache } from '@riverbankcms/sdk';\n *\n * const client = createRiverbankClient({ apiKey, baseUrl });\n *\n * const result = await prebuildCache({\n * client,\n * siteId: 'your-site-id',\n * outputDir: '.riverbank-cache',\n * onProgress: (p) => console.log(`${p.current}/${p.total}: ${p.item}`),\n * });\n *\n * console.log(`Generated ${result.files.length} files (${result.totalSize} bytes)`);\n * ```\n */\nexport async function prebuildCache(options: PrebuildOptions): Promise<PrebuildResult> {\n const {\n client,\n siteId,\n outputDir = DEFAULT_PREBUILD_DIR,\n include = ['site', 'pages', 'entries', 'navigation', 'forms'],\n contentTypes,\n onProgress,\n } = options;\n\n const generatedAt = new Date().toISOString();\n const files: string[] = [];\n let totalSize = 0;\n const errors: string[] = [];\n let siteData: SiteResponse | null = null;\n let pagePathMappings: Record<string, string> = {}; // path -> filename\n\n // Ensure output directory exists\n ensureDir(outputDir);\n\n // -------------------------------------------------------------------------\n // 1. Prebuild site data (always needed for routes and navigation)\n // -------------------------------------------------------------------------\n if (include.includes('site') || include.includes('pages') || include.includes('navigation')) {\n try {\n const result = await prebuildSite(client, siteId, outputDir);\n siteData = result.siteData;\n if (include.includes('site')) {\n files.push(...result.files);\n totalSize += result.size;\n }\n onProgress?.({ current: 1, total: 4, item: 'Site data', contentType: 'site' });\n } catch (error) {\n errors.push(`Site prebuild failed: ${(error as Error).message}`);\n }\n }\n\n // -------------------------------------------------------------------------\n // 2. Prebuild pages\n // -------------------------------------------------------------------------\n if (include.includes('pages') && siteData) {\n try {\n const result = await prebuildPages(\n client,\n siteId,\n siteData.routes,\n outputDir,\n onProgress\n );\n files.push(...result.files);\n totalSize += result.size;\n pagePathMappings = result.pathMappings;\n } catch (error) {\n errors.push(`Pages prebuild failed: ${(error as Error).message}`);\n }\n }\n\n // -------------------------------------------------------------------------\n // 3. Prebuild entries\n // -------------------------------------------------------------------------\n if (include.includes('entries')) {\n try {\n // Content types must be explicitly provided via options.contentTypes\n // (The API's sdkConfig doesn't include content type definitions)\n const typesToPrebuild = contentTypes || [];\n\n if (typesToPrebuild.length > 0) {\n const result = await prebuildEntries(\n client,\n siteId,\n typesToPrebuild,\n outputDir,\n onProgress\n );\n files.push(...result.files);\n totalSize += result.size;\n } else {\n console.warn('[Prebuild] No contentTypes provided - skipping entries prebuild');\n }\n } catch (error) {\n errors.push(`Entries prebuild failed: ${(error as Error).message}`);\n }\n }\n\n // -------------------------------------------------------------------------\n // 4. Prebuild navigation\n // -------------------------------------------------------------------------\n if (include.includes('navigation') && siteData) {\n try {\n const result = await prebuildNavigation(siteData, outputDir, onProgress);\n files.push(...result.files);\n totalSize += result.size;\n } catch (error) {\n errors.push(`Navigation prebuild failed: ${(error as Error).message}`);\n }\n }\n\n // -------------------------------------------------------------------------\n // 5. Prebuild forms\n // -------------------------------------------------------------------------\n if (include.includes('forms')) {\n try {\n const result = await prebuildForms(client, siteId, outputDir, onProgress);\n files.push(...result.files);\n totalSize += result.size;\n } catch (error) {\n errors.push(`Forms prebuild failed: ${(error as Error).message}`);\n }\n }\n\n // -------------------------------------------------------------------------\n // 6. Generate manifest\n // -------------------------------------------------------------------------\n const keyToFile: Record<string, string> = {};\n\n // Map cache keys to files\n if (files.includes('site.json')) {\n keyToFile[`site:${siteId}`] = 'site.json';\n }\n\n // Use path mappings for pages (avoids lossy filename-to-path conversion)\n for (const [pagePath, file] of Object.entries(pagePathMappings)) {\n keyToFile[`page:${siteId}:${pagePath}:false`] = file;\n }\n\n // Add entries keys (entries/{contentType}/all.json)\n for (const file of files.filter((f) => f.startsWith('entries/') && f.endsWith('/all.json'))) {\n const contentType = file.split('/')[1];\n keyToFile[`entries-all:${siteId}:${contentType}`] = file;\n }\n\n // Add forms key\n if (files.includes('forms/forms.json')) {\n keyToFile[`forms:${siteId}`] = 'forms/forms.json';\n }\n\n const manifest: Omit<PrebuildManifest, 'checksum'> & { checksum?: string } = {\n version: MANIFEST_VERSION,\n generatedAt,\n siteId,\n sdkVersion: SDK_VERSION,\n keyToFile,\n includedTypes: include,\n fileCount: files.length,\n totalSize,\n };\n\n // Calculate checksum\n const checksum = calculateChecksum(manifest as Record<string, unknown>);\n (manifest as PrebuildManifest).checksum = checksum;\n\n const manifestPath = path.join(outputDir, MANIFEST_FILENAME);\n writeJsonFile(manifestPath, manifest);\n\n return {\n success: errors.length === 0,\n outputDir,\n files,\n totalSize,\n generatedAt,\n checksum,\n errors: errors.length > 0 ? errors : undefined,\n };\n}\n\n// Re-export types\nexport type {\n PrebuildOptions,\n PrebuildResult,\n PrebuildProgress,\n PrebuildManifest,\n PrebuildContentType,\n} from './types';\n"]}
@@ -0,0 +1,11 @@
1
+ // src/zod/titleSourceSchema.ts
2
+ import { z } from "zod";
3
+ var titleSourceValueSchema = z.union([
4
+ z.string().min(1),
5
+ z.array(z.string().min(1)).min(1)
6
+ ]);
7
+
8
+ export {
9
+ titleSourceValueSchema
10
+ };
11
+ //# sourceMappingURL=chunk-VRDQJRYS.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/zod/titleSourceSchema.ts"],"sourcesContent":["import { z } from 'zod';\n\nexport const titleSourceValueSchema = z.union([\n z.string().min(1),\n z.array(z.string().min(1)).min(1),\n]);\n\nexport type TitleSourceValue = z.infer<typeof titleSourceValueSchema>;\n\n"],"mappings":";AAAA,SAAS,SAAS;AAEX,IAAM,yBAAyB,EAAE,MAAM;AAAA,EAC5C,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAChB,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC;AAClC,CAAC;","names":[]}
@@ -3,7 +3,7 @@
3
3
  var _chunk4TP7FU44js = require('./chunk-4TP7FU44.js');
4
4
 
5
5
 
6
- var _chunkH3SRB5G4js = require('./chunk-H3SRB5G4.js');
6
+ var _chunkEFQNS3HSjs = require('./chunk-EFQNS3HS.js');
7
7
 
8
8
 
9
9
  var _chunkNICYAKAPjs = require('./chunk-NICYAKAP.js');
@@ -276,7 +276,7 @@ async function loadContent(params) {
276
276
  purpose: pageData.purpose,
277
277
  blocks
278
278
  };
279
- const resolvedData = await _chunkH3SRB5G4js.prefetchBlockData.call(void 0,
279
+ const resolvedData = await _chunkEFQNS3HSjs.prefetchBlockData.call(void 0,
280
280
  pageOutline,
281
281
  {
282
282
  siteId,
@@ -363,7 +363,7 @@ async function processEntryTemplate(templates, entry, context, client, options)
363
363
  purpose: "entry-template",
364
364
  blocks
365
365
  };
366
- const resolvedData = await _chunkH3SRB5G4js.prefetchBlockData.call(void 0,
366
+ const resolvedData = await _chunkEFQNS3HSjs.prefetchBlockData.call(void 0,
367
367
  templatePage,
368
368
  {
369
369
  siteId: context.siteId,
@@ -402,4 +402,4 @@ function resolveTemplateBlock(block, bindingContext) {
402
402
 
403
403
 
404
404
  exports.isPageContent = isPageContent; exports.isEntryContent = isEntryContent; exports.loadContent = loadContent;
405
- //# sourceMappingURL=chunk-V5EQHRVR.js.map
405
+ //# sourceMappingURL=chunk-WEEEYI47.js.map