@riverbankcms/sdk 0.8.1 → 0.9.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 (187) hide show
  1. package/README.md +298 -2
  2. package/dist/cli/index.js +1996 -618
  3. package/dist/cli/index.js.map +1 -1
  4. package/dist/cli/init-docs/content/agents-section.md +11 -0
  5. package/dist/cli/init-docs/content/cli-reference.md +15 -1
  6. package/dist/cli/init-docs/content/workflow-add-block.md +7 -0
  7. package/dist/cli/init-docs/content/workflow-block-extensions.md +361 -0
  8. package/dist/cli/init-docs/content/workflow-cmsify-page.md +357 -0
  9. package/dist/cli/init-docs/content/workflow-content-types.md +328 -0
  10. package/dist/cli/init-docs/content/workflow-create-page.md +9 -0
  11. package/dist/cli/init-docs/content/workflow-custom-block.md +446 -0
  12. package/dist/client/client.d.mts +2 -2
  13. package/dist/client/client.d.ts +2 -2
  14. package/dist/client/client.js +262 -17
  15. package/dist/client/client.js.map +1 -1
  16. package/dist/client/client.mjs +262 -17
  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 +6 -6
  21. package/dist/client/hooks.js.map +1 -1
  22. package/dist/client/hooks.mjs +6 -6
  23. package/dist/client/hooks.mjs.map +1 -1
  24. package/dist/client/rendering/client.js +29 -6
  25. package/dist/client/rendering/client.js.map +1 -1
  26. package/dist/client/rendering/client.mjs +29 -6
  27. package/dist/client/rendering/client.mjs.map +1 -1
  28. package/dist/client/usePage--LiGLbVz.d.mts +7195 -0
  29. package/dist/client/usePage-BwQJlxpe.d.mts +7218 -0
  30. package/dist/client/usePage-Ds-ow1-d.d.ts +7195 -0
  31. package/dist/client/usePage-Duc2GC-H.d.ts +7218 -0
  32. package/dist/client/usePage-DyzrgxqR.d.mts +7215 -0
  33. package/dist/client/usePage-lTWkuVMZ.d.ts +7215 -0
  34. package/dist/server/{Layout-CZ-kxKfl.d.ts → Layout-BHGokJmV.d.ts} +1 -1
  35. package/dist/server/{Layout-ESG8zvrk.d.mts → Layout-CXkMcTR4.d.mts} +1 -1
  36. package/dist/server/chunk-274Y2CUE.js +341 -0
  37. package/dist/server/chunk-274Y2CUE.js.map +1 -0
  38. package/dist/server/{chunk-IJTJH4J3.js → chunk-2WL52ZOE.js} +8 -8
  39. package/dist/server/{chunk-IJTJH4J3.js.map → chunk-2WL52ZOE.js.map} +1 -1
  40. package/dist/server/{chunk-DAXWU3S3.js → chunk-5HGVBSWA.js} +9 -9
  41. package/dist/server/{chunk-DAXWU3S3.js.map → chunk-5HGVBSWA.js.map} +1 -1
  42. package/dist/server/chunk-7WJGJY3B.js +7 -0
  43. package/dist/server/chunk-7WJGJY3B.js.map +1 -0
  44. package/dist/server/chunk-AGAOKSPY.mjs +22 -0
  45. package/dist/server/chunk-AGAOKSPY.mjs.map +1 -0
  46. package/dist/server/{chunk-A3UZ2LDH.mjs → chunk-BOYBN4KN.mjs} +3 -3
  47. package/dist/server/chunk-BOYBN4KN.mjs.map +1 -0
  48. package/dist/server/{chunk-FUFPKTSI.mjs → chunk-CKZDJBMC.mjs} +33 -9
  49. package/dist/server/chunk-CKZDJBMC.mjs.map +1 -0
  50. package/dist/server/{chunk-PGZJUNCY.mjs → chunk-E4R5ILRE.mjs} +3 -3
  51. package/dist/server/{chunk-MFNWLB5G.js → chunk-EC2AA2IP.js} +275 -297
  52. package/dist/server/chunk-EC2AA2IP.js.map +1 -0
  53. package/dist/server/{chunk-HE3RTUDX.js → chunk-F4U4LC5D.js} +8 -8
  54. package/dist/server/{chunk-HE3RTUDX.js.map → chunk-F4U4LC5D.js.map} +1 -1
  55. package/dist/server/{chunk-T5PAA22U.mjs → chunk-H44G72AB.mjs} +2 -2
  56. package/dist/server/{chunk-KGORQCHF.js → chunk-JVLQDZTZ.js} +6 -6
  57. package/dist/server/{chunk-KGORQCHF.js.map → chunk-JVLQDZTZ.js.map} +1 -1
  58. package/dist/server/{chunk-ADD3O2QO.mjs → chunk-KKUR3PDT.mjs} +4 -4
  59. package/dist/server/chunk-NTG7XP3E.js +264 -0
  60. package/dist/server/chunk-NTG7XP3E.js.map +1 -0
  61. package/dist/server/{chunk-TR7MSLWL.mjs → chunk-OSTUHBFE.mjs} +3 -3
  62. package/dist/server/chunk-PAHSKNY5.mjs +264 -0
  63. package/dist/server/chunk-PAHSKNY5.mjs.map +1 -0
  64. package/dist/server/chunk-PSN6HXUD.js +22 -0
  65. package/dist/server/chunk-PSN6HXUD.js.map +1 -0
  66. package/dist/server/{chunk-GRFFJUCO.mjs → chunk-QS6ZTLLB.mjs} +242 -264
  67. package/dist/server/chunk-QS6ZTLLB.mjs.map +1 -0
  68. package/dist/server/{chunk-K44OPKLA.js → chunk-R6T3Z4W5.js} +3 -3
  69. package/dist/server/{chunk-K44OPKLA.js.map → chunk-R6T3Z4W5.js.map} +1 -1
  70. package/dist/server/{chunk-KDCVCDW6.js → chunk-RIROJYPX.js} +4 -4
  71. package/dist/server/{chunk-KDCVCDW6.js.map → chunk-RIROJYPX.js.map} +1 -1
  72. package/dist/server/chunk-SVEQVEA5.mjs +341 -0
  73. package/dist/server/chunk-SVEQVEA5.mjs.map +1 -0
  74. package/dist/server/{chunk-HDHY4236.mjs → chunk-TBN35TGI.mjs} +6 -6
  75. package/dist/server/{chunk-HDHY4236.mjs.map → chunk-TBN35TGI.mjs.map} +1 -1
  76. package/dist/server/{chunk-5GCSRTIU.mjs → chunk-TBX6CXBM.mjs} +2 -2
  77. package/dist/server/{chunk-6ERSDFTY.js → chunk-U2F4BWKW.js} +3 -3
  78. package/dist/server/chunk-U2F4BWKW.js.map +1 -0
  79. package/dist/server/chunk-WWGVFOLS.mjs +7 -0
  80. package/dist/server/chunk-WWGVFOLS.mjs.map +1 -0
  81. package/dist/server/{chunk-TLZHVGTL.js → chunk-X4REO3S7.js} +4 -4
  82. package/dist/server/{chunk-TLZHVGTL.js.map → chunk-X4REO3S7.js.map} +1 -1
  83. package/dist/server/{chunk-BNHK7YOC.mjs → chunk-YUD7ONZG.mjs} +2 -2
  84. package/dist/server/{chunk-F2NDLDDA.js → chunk-ZJXFRSTC.js} +92 -68
  85. package/dist/server/chunk-ZJXFRSTC.js.map +1 -0
  86. package/dist/server/{components-iEDvl2Yw.d.mts → components-Bqn4xmR6.d.mts} +74 -5
  87. package/dist/server/{components-CE48wJM1.d.ts → components-C7j9yzAt.d.ts} +74 -5
  88. package/dist/server/components.d.mts +5 -5
  89. package/dist/server/components.d.ts +5 -5
  90. package/dist/server/components.js +7 -5
  91. package/dist/server/components.js.map +1 -1
  92. package/dist/server/components.mjs +6 -4
  93. package/dist/server/config-validation.js +5 -5
  94. package/dist/server/config-validation.mjs +4 -4
  95. package/dist/server/config.js +5 -5
  96. package/dist/server/config.mjs +4 -4
  97. package/dist/server/data.d.mts +2 -2
  98. package/dist/server/data.d.ts +2 -2
  99. package/dist/server/data.js +3 -3
  100. package/dist/server/data.mjs +2 -2
  101. package/dist/server/{index-BHLK2mgQ.d.ts → index-Bns_1a4N.d.ts} +1 -1
  102. package/dist/server/{index-DTBg8eXj.d.ts → index-CHp2kyp0.d.ts} +2 -2
  103. package/dist/server/{index-Cgvb5fVQ.d.mts → index-CPDT8kn9.d.mts} +1 -1
  104. package/dist/server/{index-BrH_NIRO.d.mts → index-Cm9nMPkf.d.mts} +2 -2
  105. package/dist/server/index.d.mts +193 -215
  106. package/dist/server/index.d.ts +193 -215
  107. package/dist/server/index.js +9 -288
  108. package/dist/server/index.js.map +1 -1
  109. package/dist/server/index.mjs +10 -289
  110. package/dist/server/index.mjs.map +1 -1
  111. package/dist/server/{loadContent-BUK6IVJf.d.ts → loadContent-DD7J5_WO.d.ts} +3 -3
  112. package/dist/server/{loadContent-au9Weoy0.d.mts → loadContent-DTEgYI-l.d.mts} +3 -3
  113. package/dist/server/{loadPage-DiHEl8BA.d.mts → loadPage-B578Xg2W.d.mts} +2 -2
  114. package/dist/server/{loadPage-JOIbF7ih.d.ts → loadPage-Dkiimbsg.d.ts} +2 -2
  115. package/dist/server/loadPage-IBX7FXGH.mjs +11 -0
  116. package/dist/server/loadPage-KG74OG4V.js +11 -0
  117. package/dist/server/{loadPage-CMHYAW2J.js.map → loadPage-KG74OG4V.js.map} +1 -1
  118. package/dist/server/metadata.d.mts +4 -4
  119. package/dist/server/metadata.d.ts +4 -4
  120. package/dist/server/navigation.d.mts +2 -2
  121. package/dist/server/navigation.d.ts +2 -2
  122. package/dist/server/next.d.mts +5 -5
  123. package/dist/server/next.d.ts +5 -5
  124. package/dist/server/next.js +17 -14
  125. package/dist/server/next.js.map +1 -1
  126. package/dist/server/next.mjs +9 -6
  127. package/dist/server/next.mjs.map +1 -1
  128. package/dist/server/prebuild-loader.d.mts +87 -0
  129. package/dist/server/prebuild-loader.d.ts +87 -0
  130. package/dist/server/prebuild-loader.js +15 -0
  131. package/dist/server/prebuild-loader.js.map +1 -0
  132. package/dist/server/prebuild-loader.mjs +15 -0
  133. package/dist/server/prebuild-loader.mjs.map +1 -0
  134. package/dist/server/prebuild-types.d.mts +201 -0
  135. package/dist/server/prebuild-types.d.ts +201 -0
  136. package/dist/server/prebuild-types.js +1 -0
  137. package/dist/server/prebuild-types.js.map +1 -0
  138. package/dist/server/prebuild-types.mjs +1 -0
  139. package/dist/server/prebuild-types.mjs.map +1 -0
  140. package/dist/server/prebuild.d.mts +46 -0
  141. package/dist/server/prebuild.d.ts +46 -0
  142. package/dist/server/prebuild.js +10 -0
  143. package/dist/server/prebuild.js.map +1 -0
  144. package/dist/server/prebuild.mjs +10 -0
  145. package/dist/server/prebuild.mjs.map +1 -0
  146. package/dist/server/rendering/server.d.mts +4 -4
  147. package/dist/server/rendering/server.d.ts +4 -4
  148. package/dist/server/rendering/server.js +7 -7
  149. package/dist/server/rendering/server.mjs +6 -6
  150. package/dist/server/rendering.d.mts +8 -8
  151. package/dist/server/rendering.d.ts +8 -8
  152. package/dist/server/rendering.js +11 -9
  153. package/dist/server/rendering.js.map +1 -1
  154. package/dist/server/rendering.mjs +10 -8
  155. package/dist/server/routing.d.mts +3 -3
  156. package/dist/server/routing.d.ts +3 -3
  157. package/dist/server/routing.js +1 -1
  158. package/dist/server/routing.mjs +1 -1
  159. package/dist/server/server.d.mts +5 -5
  160. package/dist/server/server.d.ts +5 -5
  161. package/dist/server/server.js +9 -6
  162. package/dist/server/server.js.map +1 -1
  163. package/dist/server/server.mjs +8 -5
  164. package/dist/server/theme-bridge.js +8 -8
  165. package/dist/server/theme-bridge.mjs +2 -2
  166. package/dist/server/{types-BAM1kcGA.d.mts → types-B6P_iaDz.d.mts} +295 -1
  167. package/dist/server/{types-_SNCu2ZZ.d.ts → types-C4jfCjaP.d.ts} +295 -1
  168. package/dist/server/{types-DDNKxQXw.d.mts → types-CSvCkmYi.d.mts} +12 -3
  169. package/dist/server/{types-CmBB0Osp.d.ts → types-gKcrQV09.d.ts} +12 -3
  170. package/dist/styles/index.css +419 -0
  171. package/package.json +17 -3
  172. package/dist/server/chunk-6ERSDFTY.js.map +0 -1
  173. package/dist/server/chunk-A3UZ2LDH.mjs.map +0 -1
  174. package/dist/server/chunk-F2NDLDDA.js.map +0 -1
  175. package/dist/server/chunk-FUFPKTSI.mjs.map +0 -1
  176. package/dist/server/chunk-GRFFJUCO.mjs.map +0 -1
  177. package/dist/server/chunk-MFNWLB5G.js.map +0 -1
  178. package/dist/server/loadPage-AWYZ2QA2.mjs +0 -11
  179. package/dist/server/loadPage-CMHYAW2J.js +0 -11
  180. package/src/styles/index.css +0 -10
  181. /package/dist/server/{chunk-PGZJUNCY.mjs.map → chunk-E4R5ILRE.mjs.map} +0 -0
  182. /package/dist/server/{chunk-T5PAA22U.mjs.map → chunk-H44G72AB.mjs.map} +0 -0
  183. /package/dist/server/{chunk-ADD3O2QO.mjs.map → chunk-KKUR3PDT.mjs.map} +0 -0
  184. /package/dist/server/{chunk-TR7MSLWL.mjs.map → chunk-OSTUHBFE.mjs.map} +0 -0
  185. /package/dist/server/{chunk-5GCSRTIU.mjs.map → chunk-TBX6CXBM.mjs.map} +0 -0
  186. /package/dist/server/{chunk-BNHK7YOC.mjs.map → chunk-YUD7ONZG.mjs.map} +0 -0
  187. /package/dist/server/{loadPage-AWYZ2QA2.mjs.map → loadPage-IBX7FXGH.mjs.map} +0 -0
@@ -1,6 +1,6 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import { buildMenu, buildLogo } from './navigation.js';
3
- import { S as SiteResponse, R as RiverbankClient } from './types-CmBB0Osp.js';
3
+ import { S as SiteResponse, R as RiverbankClient } from './types-gKcrQV09.js';
4
4
 
5
5
  type HeaderData = {
6
6
  menu: ReturnType<typeof buildMenu>;
@@ -1,6 +1,6 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import { buildMenu, buildLogo } from './navigation.mjs';
3
- import { S as SiteResponse, R as RiverbankClient } from './types-DDNKxQXw.mjs';
3
+ import { S as SiteResponse, R as RiverbankClient } from './types-CSvCkmYi.mjs';
4
4
 
5
5
  type HeaderData = {
6
6
  menu: ReturnType<typeof buildMenu>;
@@ -0,0 +1,341 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } 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
+ var _chunk7WJGJY3Bjs = require('./chunk-7WJGJY3B.js');
4
+
5
+
6
+
7
+
8
+ var _chunkPSN6HXUDjs = require('./chunk-PSN6HXUD.js');
9
+
10
+ // src/prebuild/index.ts
11
+ var _fs = require('fs'); var fs = _interopRequireWildcard(_fs);
12
+ var _path = require('path'); var path = _interopRequireWildcard(_path);
13
+ var _crypto = require('crypto'); var crypto = _interopRequireWildcard(_crypto);
14
+ _chunkPSN6HXUDjs.init_constants.call(void 0, );
15
+ var MANIFEST_VERSION = "1.0.0";
16
+ var MANIFEST_FILENAME = "manifest.json";
17
+ function pathToFilename(routePath) {
18
+ if (routePath === "/") return "_home.json";
19
+ return routePath.slice(1).replace(/[^a-zA-Z0-9\-\/]/g, "_").replace(/\//g, "-") + ".json";
20
+ }
21
+ function ensureDir(dirPath) {
22
+ if (!fs.existsSync(dirPath)) {
23
+ fs.mkdirSync(dirPath, { recursive: true });
24
+ }
25
+ }
26
+ function writeJsonFile(filePath, data) {
27
+ const content = JSON.stringify(data, null, 2);
28
+ fs.writeFileSync(filePath, content, "utf-8");
29
+ return Buffer.byteLength(content, "utf-8");
30
+ }
31
+ function calculateChecksum(data) {
32
+ const { checksum: _, ...rest } = data;
33
+ const content = JSON.stringify(rest);
34
+ return crypto.createHash("sha256").update(content).digest("hex");
35
+ }
36
+ async function fetchAllEntries(client, siteId, contentType, onProgress) {
37
+ const allEntries = [];
38
+ let offset = 0;
39
+ let hasMore = true;
40
+ while (hasMore) {
41
+ _optionalChain([onProgress, 'optionalCall', _2 => _2(`${contentType} (batch ${Math.floor(offset / _chunkPSN6HXUDjs.PREBUILD_PAGE_SIZE) + 1})`)]);
42
+ const response = await client.getEntries({
43
+ siteId,
44
+ contentType,
45
+ limit: _chunkPSN6HXUDjs.PREBUILD_PAGE_SIZE,
46
+ offset,
47
+ preview: false
48
+ // Published content only
49
+ });
50
+ allEntries.push(...response.entries);
51
+ offset += _chunkPSN6HXUDjs.PREBUILD_PAGE_SIZE;
52
+ hasMore = response.entries.length === _chunkPSN6HXUDjs.PREBUILD_PAGE_SIZE;
53
+ }
54
+ return allEntries;
55
+ }
56
+ async function prebuildSite(client, siteId, outputDir) {
57
+ const site = await client.getSite({ id: siteId });
58
+ const filename = "site.json";
59
+ const filePath = path.join(outputDir, filename);
60
+ const cacheFile = {
61
+ data: site,
62
+ generatedAt: (/* @__PURE__ */ new Date()).toISOString()
63
+ };
64
+ const size = writeJsonFile(filePath, cacheFile);
65
+ return { files: [filename], size, siteData: site };
66
+ }
67
+ async function prebuildPages(client, siteId, routes, outputDir, onProgress) {
68
+ const pagesDir = path.join(outputDir, "pages");
69
+ ensureDir(pagesDir);
70
+ const files = [];
71
+ const pathMappings = {};
72
+ let totalSize = 0;
73
+ const publishedPaths = Object.entries(routes).filter(([_, route]) => route.status === "published").map(([_, route]) => route.path);
74
+ const pageIndex = [];
75
+ const total = publishedPaths.length;
76
+ let current = 0;
77
+ for (const pagePath of publishedPaths) {
78
+ current++;
79
+ _optionalChain([onProgress, 'optionalCall', _3 => _3({
80
+ current,
81
+ total,
82
+ item: `Page: ${pagePath}`,
83
+ contentType: "pages"
84
+ })]);
85
+ try {
86
+ const pageData = await client.getPage({ siteId, path: pagePath, preview: false });
87
+ const filename = pathToFilename(pagePath);
88
+ const filePath = path.join(pagesDir, filename);
89
+ const cacheFile = {
90
+ data: pageData,
91
+ path: pagePath,
92
+ generatedAt: (/* @__PURE__ */ new Date()).toISOString()
93
+ };
94
+ totalSize += writeJsonFile(filePath, cacheFile);
95
+ files.push(`pages/${filename}`);
96
+ pathMappings[pagePath] = `pages/${filename}`;
97
+ if ("page" in pageData) {
98
+ pageIndex.push({
99
+ path: pagePath,
100
+ pageId: pageData.page.routeId || "",
101
+ title: pageData.page.name || "Untitled"
102
+ });
103
+ }
104
+ } catch (error) {
105
+ console.warn(`[Prebuild] Failed to fetch page ${pagePath}:`, error.message);
106
+ }
107
+ }
108
+ const indexFile = {
109
+ pages: pageIndex,
110
+ totalCount: pageIndex.length,
111
+ generatedAt: (/* @__PURE__ */ new Date()).toISOString()
112
+ };
113
+ const indexPath = path.join(pagesDir, "_index.json");
114
+ totalSize += writeJsonFile(indexPath, indexFile);
115
+ files.push("pages/_index.json");
116
+ return { files, size: totalSize, pathMappings };
117
+ }
118
+ async function prebuildEntries(client, siteId, contentTypes, outputDir, onProgress) {
119
+ const entriesDir = path.join(outputDir, "entries");
120
+ ensureDir(entriesDir);
121
+ const files = [];
122
+ let totalSize = 0;
123
+ const total = contentTypes.length;
124
+ let current = 0;
125
+ for (const contentType of contentTypes) {
126
+ current++;
127
+ const entries = await fetchAllEntries(
128
+ client,
129
+ siteId,
130
+ contentType,
131
+ (item) => {
132
+ _optionalChain([onProgress, 'optionalCall', _4 => _4({
133
+ current,
134
+ total,
135
+ item: `Entries: ${item}`,
136
+ contentType: "entries"
137
+ })]);
138
+ }
139
+ );
140
+ const typeDir = path.join(entriesDir, contentType);
141
+ ensureDir(typeDir);
142
+ const cacheFile = {
143
+ entries,
144
+ contentType,
145
+ totalCount: entries.length,
146
+ generatedAt: (/* @__PURE__ */ new Date()).toISOString()
147
+ };
148
+ const filename = `entries/${contentType}/all.json`;
149
+ const filePath = path.join(entriesDir, contentType, "all.json");
150
+ totalSize += writeJsonFile(filePath, cacheFile);
151
+ files.push(filename);
152
+ }
153
+ return { files, size: totalSize };
154
+ }
155
+ async function prebuildNavigation(siteData, outputDir, onProgress) {
156
+ const navDir = path.join(outputDir, "navigation");
157
+ ensureDir(navDir);
158
+ const files = [];
159
+ let totalSize = 0;
160
+ const menus = siteData.navigation || [];
161
+ _optionalChain([onProgress, 'optionalCall', _5 => _5({
162
+ current: 1,
163
+ total: 1,
164
+ item: "Navigation menus",
165
+ contentType: "navigation"
166
+ })]);
167
+ const cacheFile = {
168
+ menus: menus.map((menu) => ({
169
+ identifier: menu.identifier,
170
+ id: menu.id,
171
+ name: menu.name,
172
+ items: menu.items
173
+ })),
174
+ generatedAt: (/* @__PURE__ */ new Date()).toISOString()
175
+ };
176
+ const filename = "navigation/menus.json";
177
+ const filePath = path.join(navDir, "menus.json");
178
+ totalSize += writeJsonFile(filePath, cacheFile);
179
+ files.push(filename);
180
+ return { files, size: totalSize };
181
+ }
182
+ async function prebuildForms(client, siteId, outputDir, onProgress) {
183
+ const formsDir = path.join(outputDir, "forms");
184
+ ensureDir(formsDir);
185
+ const files = [];
186
+ let totalSize = 0;
187
+ _optionalChain([onProgress, 'optionalCall', _6 => _6({
188
+ current: 1,
189
+ total: 1,
190
+ item: "Forms",
191
+ contentType: "forms"
192
+ })]);
193
+ try {
194
+ const response = await client.getForms({ siteId });
195
+ const forms = response.forms || [];
196
+ const cacheFile = {
197
+ forms: forms.map((form) => ({
198
+ id: form.id,
199
+ slug: form.slug,
200
+ name: form.name,
201
+ schema: form.schema,
202
+ settings: form.settings
203
+ })),
204
+ totalCount: forms.length,
205
+ generatedAt: (/* @__PURE__ */ new Date()).toISOString()
206
+ };
207
+ const filename = "forms/forms.json";
208
+ const filePath = path.join(formsDir, "forms.json");
209
+ totalSize += writeJsonFile(filePath, cacheFile);
210
+ files.push(filename);
211
+ } catch (error) {
212
+ console.warn("[Prebuild] Failed to fetch forms:", error.message);
213
+ }
214
+ return { files, size: totalSize };
215
+ }
216
+ async function prebuildCache(options) {
217
+ const {
218
+ client,
219
+ siteId,
220
+ outputDir = _chunkPSN6HXUDjs.DEFAULT_PREBUILD_DIR,
221
+ include = ["site", "pages", "entries", "navigation", "forms"],
222
+ contentTypes,
223
+ onProgress
224
+ } = options;
225
+ const generatedAt = (/* @__PURE__ */ new Date()).toISOString();
226
+ const files = [];
227
+ let totalSize = 0;
228
+ const errors = [];
229
+ let siteData = null;
230
+ let pagePathMappings = {};
231
+ ensureDir(outputDir);
232
+ if (include.includes("site") || include.includes("pages") || include.includes("navigation")) {
233
+ try {
234
+ const result = await prebuildSite(client, siteId, outputDir);
235
+ siteData = result.siteData;
236
+ if (include.includes("site")) {
237
+ files.push(...result.files);
238
+ totalSize += result.size;
239
+ }
240
+ _optionalChain([onProgress, 'optionalCall', _7 => _7({ current: 1, total: 4, item: "Site data", contentType: "site" })]);
241
+ } catch (error) {
242
+ errors.push(`Site prebuild failed: ${error.message}`);
243
+ }
244
+ }
245
+ if (include.includes("pages") && siteData) {
246
+ try {
247
+ const result = await prebuildPages(
248
+ client,
249
+ siteId,
250
+ siteData.routes,
251
+ outputDir,
252
+ onProgress
253
+ );
254
+ files.push(...result.files);
255
+ totalSize += result.size;
256
+ pagePathMappings = result.pathMappings;
257
+ } catch (error) {
258
+ errors.push(`Pages prebuild failed: ${error.message}`);
259
+ }
260
+ }
261
+ if (include.includes("entries")) {
262
+ try {
263
+ const typesToPrebuild = contentTypes || [];
264
+ if (typesToPrebuild.length > 0) {
265
+ const result = await prebuildEntries(
266
+ client,
267
+ siteId,
268
+ typesToPrebuild,
269
+ outputDir,
270
+ onProgress
271
+ );
272
+ files.push(...result.files);
273
+ totalSize += result.size;
274
+ } else {
275
+ console.warn("[Prebuild] No contentTypes provided - skipping entries prebuild");
276
+ }
277
+ } catch (error) {
278
+ errors.push(`Entries prebuild failed: ${error.message}`);
279
+ }
280
+ }
281
+ if (include.includes("navigation") && siteData) {
282
+ try {
283
+ const result = await prebuildNavigation(siteData, outputDir, onProgress);
284
+ files.push(...result.files);
285
+ totalSize += result.size;
286
+ } catch (error) {
287
+ errors.push(`Navigation prebuild failed: ${error.message}`);
288
+ }
289
+ }
290
+ if (include.includes("forms")) {
291
+ try {
292
+ const result = await prebuildForms(client, siteId, outputDir, onProgress);
293
+ files.push(...result.files);
294
+ totalSize += result.size;
295
+ } catch (error) {
296
+ errors.push(`Forms prebuild failed: ${error.message}`);
297
+ }
298
+ }
299
+ const keyToFile = {};
300
+ if (files.includes("site.json")) {
301
+ keyToFile[`site:${siteId}`] = "site.json";
302
+ }
303
+ for (const [pagePath, file] of Object.entries(pagePathMappings)) {
304
+ keyToFile[`page:${siteId}:${pagePath}:false`] = file;
305
+ }
306
+ for (const file of files.filter((f) => f.startsWith("entries/") && f.endsWith("/all.json"))) {
307
+ const contentType = file.split("/")[1];
308
+ keyToFile[`entries-all:${siteId}:${contentType}`] = file;
309
+ }
310
+ if (files.includes("forms/forms.json")) {
311
+ keyToFile[`forms:${siteId}`] = "forms/forms.json";
312
+ }
313
+ const manifest = {
314
+ version: MANIFEST_VERSION,
315
+ generatedAt,
316
+ siteId,
317
+ sdkVersion: _chunk7WJGJY3Bjs.SDK_VERSION,
318
+ keyToFile,
319
+ includedTypes: include,
320
+ fileCount: files.length,
321
+ totalSize
322
+ };
323
+ const checksum = calculateChecksum(manifest);
324
+ manifest.checksum = checksum;
325
+ const manifestPath = path.join(outputDir, MANIFEST_FILENAME);
326
+ writeJsonFile(manifestPath, manifest);
327
+ return {
328
+ success: errors.length === 0,
329
+ outputDir,
330
+ files,
331
+ totalSize,
332
+ generatedAt,
333
+ checksum,
334
+ errors: errors.length > 0 ? errors : void 0
335
+ };
336
+ }
337
+
338
+
339
+
340
+ exports.prebuildCache = prebuildCache;
341
+ //# sourceMappingURL=chunk-274Y2CUE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/chunk-274Y2CUE.js","../../src/prebuild/index.ts"],"names":[],"mappings":"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","file":"/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/chunk-274Y2CUE.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,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 _chunk6ERSDFTYjs = require('./chunk-6ERSDFTY.js');
4
+ var _chunkU2F4BWKWjs = require('./chunk-U2F4BWKW.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 = _chunk6ERSDFTYjs.bindingSchema.parse(maybeBind);
14
+ const binding = _chunkU2F4BWKWjs.bindingSchema.parse(maybeBind);
15
15
  const value = resolveBinding(binding.from, vm);
16
16
  if (value === void 0 || value === null) {
17
17
  return binding.fallback;
@@ -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 = _chunk6ERSDFTYjs.getBlockDefinition.call(void 0, block.kind);
162
+ const def = _chunkU2F4BWKWjs.getBlockDefinition.call(void 0, block.kind);
163
163
  if (def) {
164
164
  loaders = normalizeDataLoaders(def);
165
165
  } else if (getCustomBlockLoaders) {
@@ -279,11 +279,11 @@ async function prefetchBlockData2(page, context, client, options) {
279
279
  return await client.listPublicEvents({ siteId, limit: parsedLimit, from, to, stage });
280
280
  }
281
281
  case "getPublicFormById": {
282
- const { formId } = _nullishCoalesce(params, () => ( {}));
283
- if (!formId) {
284
- throw new Error("getPublicFormById requires formId param");
282
+ const { formSlug } = _nullishCoalesce(params, () => ( {}));
283
+ if (!formSlug) {
284
+ throw new Error("getPublicFormById requires formSlug param");
285
285
  }
286
- return await client.getPublicFormById({ formId });
286
+ return await client.getPublicFormById({ formId: formSlug, siteId: context.siteId });
287
287
  }
288
288
  case "getPublicBookingServices": {
289
289
  const { siteId, ids } = _nullishCoalesce(params, () => ( {}));
@@ -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-IJTJH4J3.js.map
333
+ //# sourceMappingURL=chunk-2WL52ZOE.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/chunk-IJTJH4J3.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-IJTJH4J3.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"]}
1
+ {"version":3,"sources":["/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/chunk-2WL52ZOE.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-2WL52ZOE.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 { formSlug } = params ?? {};\n if (!formSlug) {\n throw new Error('getPublicFormById requires formSlug param');\n }\n // Pass siteId from context for slug-based lookups\n return await client.getPublicFormById({ formId: formSlug, siteId: context.siteId });\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"]}