@riverbankcms/sdk 0.7.2 → 0.7.3

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 +54 -0
  2. package/dist/client/bookings.d.mts +2 -0
  3. package/dist/client/bookings.d.ts +2 -0
  4. package/dist/client/bookings.js +2956 -104
  5. package/dist/client/bookings.js.map +1 -1
  6. package/dist/client/bookings.mjs +2929 -70
  7. package/dist/client/bookings.mjs.map +1 -1
  8. package/dist/client/client.d.mts +2 -2
  9. package/dist/client/client.d.ts +2 -2
  10. package/dist/client/client.js +80 -11
  11. package/dist/client/client.js.map +1 -1
  12. package/dist/client/client.mjs +87 -11
  13. package/dist/client/client.mjs.map +1 -1
  14. package/dist/client/hooks.d.mts +2 -2
  15. package/dist/client/hooks.d.ts +2 -2
  16. package/dist/client/rendering/client.js +3070 -259
  17. package/dist/client/rendering/client.js.map +1 -1
  18. package/dist/client/rendering/client.mjs +3212 -395
  19. package/dist/client/rendering/client.mjs.map +1 -1
  20. package/dist/client/spam-protection.d.mts +55 -0
  21. package/dist/client/spam-protection.d.ts +55 -0
  22. package/dist/client/spam-protection.js +2915 -0
  23. package/dist/client/spam-protection.js.map +1 -0
  24. package/dist/client/spam-protection.mjs +2893 -0
  25. package/dist/client/spam-protection.mjs.map +1 -0
  26. package/dist/client/{usePage-Db9kzA41.d.ts → usePage-BYmJCCm1.d.ts} +14 -2
  27. package/dist/client/{usePage-C9tJpuKa.d.mts → usePage-DZtrWajy.d.mts} +14 -2
  28. package/dist/server/{Layout-Ce7PU9I5.d.ts → Layout-Yluyb6sK.d.ts} +1 -1
  29. package/dist/server/{Layout-WllR8Zug.d.mts → Layout-qWLdVm5-.d.mts} +1 -1
  30. package/dist/server/chunk-2IZ6S225.js +122 -0
  31. package/dist/server/chunk-2IZ6S225.js.map +1 -0
  32. package/dist/server/chunk-4CV4JOE5.js +27 -0
  33. package/dist/server/chunk-4CV4JOE5.js.map +1 -0
  34. package/dist/server/{chunk-AET56TQX.mjs → chunk-5LRR64Y6.mjs} +32 -5
  35. package/dist/server/chunk-5LRR64Y6.mjs.map +1 -0
  36. package/dist/server/{chunk-VODFQMUW.js → chunk-NBTRDLCM.js} +32 -5
  37. package/dist/server/chunk-NBTRDLCM.js.map +1 -0
  38. package/dist/server/chunk-NFEGQTCC.mjs +27 -0
  39. package/dist/server/{chunk-5JT452F2.mjs → chunk-NFQLH5IA.mjs} +340 -19
  40. package/dist/server/chunk-NFQLH5IA.mjs.map +1 -0
  41. package/dist/server/chunk-PPHZV6YD.mjs +122 -0
  42. package/dist/server/chunk-PPHZV6YD.mjs.map +1 -0
  43. package/dist/server/{chunk-HMENX4Y7.js → chunk-VLXTNB2C.js} +370 -49
  44. package/dist/server/chunk-VLXTNB2C.js.map +1 -0
  45. package/dist/server/{components-RPzRQve6.d.mts → components-DNHfSCML.d.mts} +3 -3
  46. package/dist/server/{components--LT61IKp.d.ts → components-Di5ME6He.d.ts} +3 -3
  47. package/dist/server/components.d.mts +5 -5
  48. package/dist/server/components.d.ts +5 -5
  49. package/dist/server/components.js +1 -0
  50. package/dist/server/components.js.map +1 -1
  51. package/dist/server/components.mjs +1 -0
  52. package/dist/server/config-validation.js +1 -0
  53. package/dist/server/config-validation.js.map +1 -1
  54. package/dist/server/config-validation.mjs +1 -0
  55. package/dist/server/config.js +1 -0
  56. package/dist/server/config.js.map +1 -1
  57. package/dist/server/config.mjs +1 -0
  58. package/dist/server/config.mjs.map +1 -1
  59. package/dist/server/data.d.mts +2 -2
  60. package/dist/server/data.d.ts +2 -2
  61. package/dist/server/data.js +1 -0
  62. package/dist/server/data.js.map +1 -1
  63. package/dist/server/data.mjs +1 -0
  64. package/dist/server/env.d.mts +91 -5
  65. package/dist/server/env.d.ts +91 -5
  66. package/dist/server/env.js +9 -2
  67. package/dist/server/env.js.map +1 -1
  68. package/dist/server/env.mjs +8 -1
  69. package/dist/server/{index-BL66CU6d.d.mts → index--Oyunk_B.d.mts} +2 -2
  70. package/dist/server/{index-CJk9iQQW.d.ts → index-C9Ra8dza.d.ts} +2 -2
  71. package/dist/server/{index-Bkva0WAj.d.mts → index-Clm3skz_.d.mts} +1 -1
  72. package/dist/server/{index-CSBWKA3r.d.ts → index-DLvNddi-.d.ts} +1 -1
  73. package/dist/server/index.d.mts +215 -4
  74. package/dist/server/index.d.ts +215 -4
  75. package/dist/server/index.js +301 -3
  76. package/dist/server/index.js.map +1 -1
  77. package/dist/server/index.mjs +301 -3
  78. package/dist/server/index.mjs.map +1 -1
  79. package/dist/server/{loadContent-CXUWMuzY.d.ts → loadContent-D7LQwI0o.d.ts} +3 -3
  80. package/dist/server/{loadContent-F_tAS0Nl.d.mts → loadContent-DVfuBLiZ.d.mts} +3 -3
  81. package/dist/server/{loadPage-6I7F6GRF.js → loadPage-AXNAERDS.js} +2 -1
  82. package/dist/server/loadPage-AXNAERDS.js.map +1 -0
  83. package/dist/server/{loadPage-i2r-X5b9.d.ts → loadPage-BmYJCe_V.d.ts} +2 -2
  84. package/dist/server/{loadPage-CxlYLe5K.d.mts → loadPage-BucnLHmE.d.mts} +2 -2
  85. package/dist/server/{loadPage-JI2SML4M.mjs → loadPage-XR7ORQ2E.mjs} +2 -1
  86. package/dist/server/loadPage-XR7ORQ2E.mjs.map +1 -0
  87. package/dist/server/metadata.d.mts +4 -4
  88. package/dist/server/metadata.d.ts +4 -4
  89. package/dist/server/metadata.js +1 -0
  90. package/dist/server/metadata.js.map +1 -1
  91. package/dist/server/metadata.mjs +1 -0
  92. package/dist/server/navigation.d.mts +2 -2
  93. package/dist/server/navigation.d.ts +2 -2
  94. package/dist/server/navigation.js +1 -0
  95. package/dist/server/navigation.js.map +1 -1
  96. package/dist/server/navigation.mjs +1 -0
  97. package/dist/server/next/revalidate.js +5 -4
  98. package/dist/server/next/revalidate.js.map +1 -1
  99. package/dist/server/next/revalidate.mjs +3 -2
  100. package/dist/server/next/revalidate.mjs.map +1 -1
  101. package/dist/server/next/tags.d.mts +3 -0
  102. package/dist/server/next/tags.d.ts +3 -0
  103. package/dist/server/next/tags.js +3 -1
  104. package/dist/server/next/tags.js.map +1 -1
  105. package/dist/server/next/tags.mjs +2 -0
  106. package/dist/server/next/tags.mjs.map +1 -1
  107. package/dist/server/next.d.mts +5 -5
  108. package/dist/server/next.d.ts +5 -5
  109. package/dist/server/next.js +5 -4
  110. package/dist/server/next.js.map +1 -1
  111. package/dist/server/next.mjs +3 -2
  112. package/dist/server/next.mjs.map +1 -1
  113. package/dist/server/rendering/server.d.mts +4 -4
  114. package/dist/server/rendering/server.d.ts +4 -4
  115. package/dist/server/rendering/server.js +1 -0
  116. package/dist/server/rendering/server.js.map +1 -1
  117. package/dist/server/rendering/server.mjs +1 -0
  118. package/dist/server/rendering.d.mts +7 -7
  119. package/dist/server/rendering.d.ts +7 -7
  120. package/dist/server/rendering.js +1 -0
  121. package/dist/server/rendering.js.map +1 -1
  122. package/dist/server/rendering.mjs +1 -0
  123. package/dist/server/routing.d.mts +3 -3
  124. package/dist/server/routing.d.ts +3 -3
  125. package/dist/server/routing.js +4 -2
  126. package/dist/server/routing.js.map +1 -1
  127. package/dist/server/routing.mjs +3 -1
  128. package/dist/server/routing.mjs.map +1 -1
  129. package/dist/server/server.d.mts +5 -5
  130. package/dist/server/server.d.ts +5 -5
  131. package/dist/server/server.js +3 -2
  132. package/dist/server/server.js.map +1 -1
  133. package/dist/server/server.mjs +2 -1
  134. package/dist/server/theme-bridge.js +1 -0
  135. package/dist/server/theme-bridge.js.map +1 -1
  136. package/dist/server/theme-bridge.mjs +1 -0
  137. package/dist/server/theme-bridge.mjs.map +1 -1
  138. package/dist/server/theme.js +3 -1
  139. package/dist/server/theme.js.map +1 -1
  140. package/dist/server/theme.mjs +2 -0
  141. package/dist/server/theme.mjs.map +1 -1
  142. package/dist/server/{types-DnkRh0UL.d.ts → types-BRQyLrQU.d.ts} +14 -2
  143. package/dist/server/{types-Dsu9wsUh.d.mts → types-BSV6Vc-P.d.mts} +2 -2
  144. package/dist/server/{types-MF2AWoKv.d.mts → types-C-LShyIg.d.mts} +14 -2
  145. package/dist/server/{types-CVykEqXN.d.ts → types-Dt98DeYa.d.ts} +2 -2
  146. package/dist/server/webhooks.d.mts +8 -2
  147. package/dist/server/webhooks.d.ts +8 -2
  148. package/dist/server/webhooks.js +3 -2
  149. package/dist/server/webhooks.js.map +1 -1
  150. package/dist/server/webhooks.mjs +2 -1
  151. package/package.json +7 -1
  152. package/dist/client/resolver-BhueZVxZ.d.mts +0 -61
  153. package/dist/client/resolver-BhueZVxZ.d.ts +0 -61
  154. package/dist/client/usePage--fGlyrgj.d.mts +0 -6439
  155. package/dist/client/usePage-BBcFCxOU.d.ts +0 -6297
  156. package/dist/client/usePage-BC8Q2E3t.d.mts +0 -6431
  157. package/dist/client/usePage-BTPnCuWC.d.mts +0 -6511
  158. package/dist/client/usePage-BXjk8BhD.d.mts +0 -6704
  159. package/dist/client/usePage-BafOS9UT.d.mts +0 -6512
  160. package/dist/client/usePage-BcjWPXvh.d.mts +0 -6388
  161. package/dist/client/usePage-BiOReg0_.d.ts +0 -6704
  162. package/dist/client/usePage-Bnx-kA6x.d.mts +0 -6670
  163. package/dist/client/usePage-BvKAa3Zw.d.mts +0 -366
  164. package/dist/client/usePage-BvKAa3Zw.d.ts +0 -366
  165. package/dist/client/usePage-BydHcMYB.d.mts +0 -6297
  166. package/dist/client/usePage-C3ZKNwY7.d.mts +0 -6393
  167. package/dist/client/usePage-CE7X5NcN.d.ts +0 -6439
  168. package/dist/client/usePage-CHEybPMD.d.ts +0 -6429
  169. package/dist/client/usePage-CrKw1H6Y.d.ts +0 -6338
  170. package/dist/client/usePage-CyYpOJud.d.ts +0 -6388
  171. package/dist/client/usePage-D4fxZbRR.d.mts +0 -6429
  172. package/dist/client/usePage-DMI8ImsU.d.mts +0 -6338
  173. package/dist/client/usePage-DoPI6b8V.d.ts +0 -6511
  174. package/dist/client/usePage-DpRNZUtP.d.ts +0 -6431
  175. package/dist/client/usePage-QNWArrVO.d.ts +0 -6670
  176. package/dist/client/usePage-fBgPB6Oq.d.ts +0 -6512
  177. package/dist/client/usePage-gpVaeWDy.d.ts +0 -6393
  178. package/dist/server/chunk-5JT452F2.mjs.map +0 -1
  179. package/dist/server/chunk-AET56TQX.mjs.map +0 -1
  180. package/dist/server/chunk-HMENX4Y7.js.map +0 -1
  181. package/dist/server/chunk-LQUKXIW7.mjs +0 -13
  182. package/dist/server/chunk-LQUKXIW7.mjs.map +0 -1
  183. package/dist/server/chunk-VODFQMUW.js.map +0 -1
  184. package/dist/server/chunk-WYNEYDXO.js +0 -13
  185. package/dist/server/chunk-WYNEYDXO.js.map +0 -1
  186. package/dist/server/loadPage-6I7F6GRF.js.map +0 -1
  187. /package/dist/server/{loadPage-JI2SML4M.mjs.map → chunk-NFEGQTCC.mjs.map} +0 -0
@@ -1,11 +1,305 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});
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
2
 
3
3
  var _chunkGERCMTPQjs = require('./chunk-GERCMTPQ.js');
4
4
 
5
5
 
6
6
 
7
7
 
8
- var _chunkHMENX4Y7js = require('./chunk-HMENX4Y7.js');
8
+
9
+
10
+
11
+
12
+
13
+
14
+
15
+
16
+ var _chunkVLXTNB2Cjs = require('./chunk-VLXTNB2C.js');
17
+ require('./chunk-4CV4JOE5.js');
18
+
19
+ // src/prebuild/index.ts
20
+ var _fs = require('fs'); var fs = _interopRequireWildcard(_fs);
21
+ var _path = require('path'); var path = _interopRequireWildcard(_path);
22
+ var _crypto = require('crypto'); var crypto = _interopRequireWildcard(_crypto);
23
+ _chunkVLXTNB2Cjs.init_constants.call(void 0, );
24
+ var MANIFEST_VERSION = "1.0.0";
25
+ var MANIFEST_FILENAME = "manifest.json";
26
+ function pathToFilename(routePath) {
27
+ if (routePath === "/") return "_home.json";
28
+ return routePath.slice(1).replace(/[^a-zA-Z0-9\-\/]/g, "_").replace(/\//g, "-") + ".json";
29
+ }
30
+ function ensureDir(dirPath) {
31
+ if (!fs.existsSync(dirPath)) {
32
+ fs.mkdirSync(dirPath, { recursive: true });
33
+ }
34
+ }
35
+ function writeJsonFile(filePath, data) {
36
+ const content = JSON.stringify(data, null, 2);
37
+ fs.writeFileSync(filePath, content, "utf-8");
38
+ return Buffer.byteLength(content, "utf-8");
39
+ }
40
+ function calculateChecksum(data) {
41
+ const { checksum: _, ...rest } = data;
42
+ const content = JSON.stringify(rest);
43
+ return crypto.createHash("sha256").update(content).digest("hex");
44
+ }
45
+ async function fetchAllEntries(client, siteId, contentType, onProgress) {
46
+ const allEntries = [];
47
+ let offset = 0;
48
+ let hasMore = true;
49
+ while (hasMore) {
50
+ _optionalChain([onProgress, 'optionalCall', _2 => _2(`${contentType} (batch ${Math.floor(offset / _chunkVLXTNB2Cjs.PREBUILD_PAGE_SIZE) + 1})`)]);
51
+ const response = await client.getEntries({
52
+ siteId,
53
+ contentType,
54
+ limit: _chunkVLXTNB2Cjs.PREBUILD_PAGE_SIZE,
55
+ offset,
56
+ preview: false
57
+ // Published content only
58
+ });
59
+ allEntries.push(...response.entries);
60
+ offset += _chunkVLXTNB2Cjs.PREBUILD_PAGE_SIZE;
61
+ hasMore = response.entries.length === _chunkVLXTNB2Cjs.PREBUILD_PAGE_SIZE;
62
+ }
63
+ return allEntries;
64
+ }
65
+ async function prebuildSite(client, siteId, outputDir) {
66
+ const site = await client.getSite({ id: siteId });
67
+ const filename = "site.json";
68
+ const filePath = path.join(outputDir, filename);
69
+ const cacheFile = {
70
+ data: site,
71
+ generatedAt: (/* @__PURE__ */ new Date()).toISOString()
72
+ };
73
+ const size = writeJsonFile(filePath, cacheFile);
74
+ return { files: [filename], size, siteData: site };
75
+ }
76
+ async function prebuildPages(client, siteId, routes, outputDir, onProgress) {
77
+ const pagesDir = path.join(outputDir, "pages");
78
+ ensureDir(pagesDir);
79
+ const files = [];
80
+ let totalSize = 0;
81
+ const publishedPaths = Object.entries(routes).filter(([_, route]) => route.status === "published").map(([_, route]) => route.path);
82
+ const pageIndex = [];
83
+ const total = publishedPaths.length;
84
+ let current = 0;
85
+ for (const pagePath of publishedPaths) {
86
+ current++;
87
+ _optionalChain([onProgress, 'optionalCall', _3 => _3({
88
+ current,
89
+ total,
90
+ item: `Page: ${pagePath}`,
91
+ contentType: "pages"
92
+ })]);
93
+ try {
94
+ const pageData = await client.getPage({ siteId, path: pagePath, preview: false });
95
+ const filename = pathToFilename(pagePath);
96
+ const filePath = path.join(pagesDir, filename);
97
+ const cacheFile = {
98
+ data: pageData,
99
+ path: pagePath,
100
+ generatedAt: (/* @__PURE__ */ new Date()).toISOString()
101
+ };
102
+ totalSize += writeJsonFile(filePath, cacheFile);
103
+ files.push(`pages/${filename}`);
104
+ if ("page" in pageData) {
105
+ pageIndex.push({
106
+ path: pagePath,
107
+ pageId: pageData.page.routeId || "",
108
+ title: pageData.page.name || "Untitled"
109
+ });
110
+ }
111
+ } catch (error) {
112
+ console.warn(`[Prebuild] Failed to fetch page ${pagePath}:`, error.message);
113
+ }
114
+ }
115
+ const indexFile = {
116
+ pages: pageIndex,
117
+ totalCount: pageIndex.length,
118
+ generatedAt: (/* @__PURE__ */ new Date()).toISOString()
119
+ };
120
+ const indexPath = path.join(pagesDir, "_index.json");
121
+ totalSize += writeJsonFile(indexPath, indexFile);
122
+ files.push("pages/_index.json");
123
+ return { files, size: totalSize };
124
+ }
125
+ async function prebuildEntries(client, siteId, contentTypes, outputDir, onProgress) {
126
+ const entriesDir = path.join(outputDir, "entries");
127
+ ensureDir(entriesDir);
128
+ const files = [];
129
+ let totalSize = 0;
130
+ const total = contentTypes.length;
131
+ let current = 0;
132
+ for (const contentType of contentTypes) {
133
+ current++;
134
+ const entries = await fetchAllEntries(
135
+ client,
136
+ siteId,
137
+ contentType,
138
+ (item) => {
139
+ _optionalChain([onProgress, 'optionalCall', _4 => _4({
140
+ current,
141
+ total,
142
+ item: `Entries: ${item}`,
143
+ contentType: "entries"
144
+ })]);
145
+ }
146
+ );
147
+ const typeDir = path.join(entriesDir, contentType);
148
+ ensureDir(typeDir);
149
+ const cacheFile = {
150
+ entries,
151
+ contentType,
152
+ totalCount: entries.length,
153
+ generatedAt: (/* @__PURE__ */ new Date()).toISOString()
154
+ };
155
+ const filename = `entries/${contentType}/all.json`;
156
+ const filePath = path.join(entriesDir, contentType, "all.json");
157
+ totalSize += writeJsonFile(filePath, cacheFile);
158
+ files.push(filename);
159
+ }
160
+ return { files, size: totalSize };
161
+ }
162
+ async function prebuildNavigation(siteData, outputDir, onProgress) {
163
+ const navDir = path.join(outputDir, "navigation");
164
+ ensureDir(navDir);
165
+ const files = [];
166
+ let totalSize = 0;
167
+ const menus = siteData.navigation || [];
168
+ _optionalChain([onProgress, 'optionalCall', _5 => _5({
169
+ current: 1,
170
+ total: 1,
171
+ item: "Navigation menus",
172
+ contentType: "navigation"
173
+ })]);
174
+ const cacheFile = {
175
+ menus: menus.map((menu) => ({
176
+ identifier: menu.identifier,
177
+ id: menu.id,
178
+ name: menu.name,
179
+ items: menu.items
180
+ })),
181
+ generatedAt: (/* @__PURE__ */ new Date()).toISOString()
182
+ };
183
+ const filename = "navigation/menus.json";
184
+ const filePath = path.join(navDir, "menus.json");
185
+ totalSize += writeJsonFile(filePath, cacheFile);
186
+ files.push(filename);
187
+ return { files, size: totalSize };
188
+ }
189
+ async function prebuildCache(options) {
190
+ const {
191
+ client,
192
+ siteId,
193
+ outputDir = _chunkVLXTNB2Cjs.DEFAULT_PREBUILD_DIR,
194
+ include = ["site", "pages", "entries", "navigation"],
195
+ contentTypes,
196
+ onProgress
197
+ } = options;
198
+ const generatedAt = (/* @__PURE__ */ new Date()).toISOString();
199
+ const files = [];
200
+ let totalSize = 0;
201
+ const errors = [];
202
+ let siteData = null;
203
+ ensureDir(outputDir);
204
+ if (include.includes("site") || include.includes("pages") || include.includes("navigation")) {
205
+ try {
206
+ const result = await prebuildSite(client, siteId, outputDir);
207
+ siteData = result.siteData;
208
+ if (include.includes("site")) {
209
+ files.push(...result.files);
210
+ totalSize += result.size;
211
+ }
212
+ _optionalChain([onProgress, 'optionalCall', _6 => _6({ current: 1, total: 4, item: "Site data", contentType: "site" })]);
213
+ } catch (error) {
214
+ errors.push(`Site prebuild failed: ${error.message}`);
215
+ }
216
+ }
217
+ if (include.includes("pages") && siteData) {
218
+ try {
219
+ const result = await prebuildPages(
220
+ client,
221
+ siteId,
222
+ siteData.routes,
223
+ outputDir,
224
+ onProgress
225
+ );
226
+ files.push(...result.files);
227
+ totalSize += result.size;
228
+ } catch (error) {
229
+ errors.push(`Pages prebuild failed: ${error.message}`);
230
+ }
231
+ }
232
+ if (include.includes("entries")) {
233
+ try {
234
+ const typesToPrebuild = contentTypes || [];
235
+ if (typesToPrebuild.length > 0) {
236
+ const result = await prebuildEntries(
237
+ client,
238
+ siteId,
239
+ typesToPrebuild,
240
+ outputDir,
241
+ onProgress
242
+ );
243
+ files.push(...result.files);
244
+ totalSize += result.size;
245
+ } else {
246
+ console.warn("[Prebuild] No contentTypes provided - skipping entries prebuild");
247
+ }
248
+ } catch (error) {
249
+ errors.push(`Entries prebuild failed: ${error.message}`);
250
+ }
251
+ }
252
+ if (include.includes("navigation") && siteData) {
253
+ try {
254
+ const result = await prebuildNavigation(siteData, outputDir, onProgress);
255
+ files.push(...result.files);
256
+ totalSize += result.size;
257
+ } catch (error) {
258
+ errors.push(`Navigation prebuild failed: ${error.message}`);
259
+ }
260
+ }
261
+ const keyToFile = {};
262
+ if (files.includes("site.json")) {
263
+ keyToFile[`site:${siteId}`] = "site.json";
264
+ }
265
+ for (const file of files) {
266
+ if (file.startsWith("pages/") && file !== "pages/_index.json") {
267
+ const filename = file.replace("pages/", "").replace(".json", "");
268
+ const pagePath = filename === "_home" ? "/" : "/" + filename.replace(/-/g, "/");
269
+ keyToFile[`page:${siteId}:${pagePath}:false`] = file;
270
+ }
271
+ if (file.startsWith("entries/") && file.endsWith("/all.json")) {
272
+ const contentType = file.split("/")[1];
273
+ keyToFile[`entries-all:${siteId}:${contentType}`] = file;
274
+ }
275
+ }
276
+ const manifest = {
277
+ version: MANIFEST_VERSION,
278
+ generatedAt,
279
+ siteId,
280
+ sdkVersion: _chunkVLXTNB2Cjs.SDK_VERSION,
281
+ keyToFile,
282
+ includedTypes: include,
283
+ fileCount: files.length,
284
+ totalSize
285
+ };
286
+ const checksum = calculateChecksum(manifest);
287
+ manifest.checksum = checksum;
288
+ const manifestPath = path.join(outputDir, MANIFEST_FILENAME);
289
+ writeJsonFile(manifestPath, manifest);
290
+ return {
291
+ success: errors.length === 0,
292
+ outputDir,
293
+ files,
294
+ totalSize,
295
+ generatedAt,
296
+ checksum,
297
+ errors: errors.length > 0 ? errors : void 0
298
+ };
299
+ }
300
+
301
+ // src/index.ts
302
+ _chunkVLXTNB2Cjs.init_loader.call(void 0, );
9
303
 
10
304
  // ../api/src/aiPlayground.ts
11
305
  var _zod = require('zod');
@@ -100,5 +394,9 @@ var MultiPageUpdateResponse = _zod.z.object({
100
394
 
101
395
 
102
396
 
103
- exports.API_ENDPOINTS = _chunkHMENX4Y7js.API_ENDPOINTS; exports.SYSTEM_BLOCK_KINDS = _chunkGERCMTPQjs.SYSTEM_BLOCK_KINDS; exports.buildEndpointURL = _chunkHMENX4Y7js.buildEndpointURL; exports.createRiverbankClient = _chunkHMENX4Y7js.createRiverbankClient;
397
+
398
+
399
+
400
+
401
+ exports.API_ENDPOINTS = _chunkVLXTNB2Cjs.API_ENDPOINTS; exports.PrebuildLoader = _chunkVLXTNB2Cjs.PrebuildLoader; exports.SYSTEM_BLOCK_KINDS = _chunkGERCMTPQjs.SYSTEM_BLOCK_KINDS; exports.buildEndpointURL = _chunkVLXTNB2Cjs.buildEndpointURL; exports.canUsePrebuild = _chunkVLXTNB2Cjs.canUsePrebuild; exports.createPrebuildLoader = _chunkVLXTNB2Cjs.createPrebuildLoader; exports.createRiverbankClient = _chunkVLXTNB2Cjs.createRiverbankClient; exports.prebuildCache = prebuildCache;
104
402
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/index.js","../../../api/src/aiPlayground.ts"],"names":[],"mappings":"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","file":"/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/index.js","sourcesContent":[null,"import { z } from 'zod';\n\n/**\n * RFC-6902 JSON Patch Operations\n * Standard JSON Patch format for AI Playground content updates\n */\n\nexport const Rfc6902PatchOp = z.discriminatedUnion('op', [\n // Standard RFC-6902 operations\n z.object({\n op: z.literal('add'),\n path: z.string(),\n value: z.unknown(),\n }),\n z.object({\n op: z.literal('remove'),\n path: z.string(),\n }),\n z.object({\n op: z.literal('replace'),\n path: z.string(),\n value: z.unknown(),\n }),\n z.object({\n op: z.literal('move'),\n from: z.string(),\n path: z.string(),\n }),\n z.object({\n op: z.literal('copy'),\n from: z.string(),\n path: z.string(),\n }),\n // Block-level operations (Phase 2)\n z.object({\n op: z.literal('add_block'),\n blockKind: z.string(),\n afterBlockId: z.string().nullable(),\n content: z.record(z.string(), z.unknown()),\n rationale: z.string(),\n }),\n z.object({\n op: z.literal('delete_block'),\n blockId: z.string(),\n rationale: z.string(),\n }),\n z.object({\n op: z.literal('reorder_block'),\n blockId: z.string(),\n afterBlockId: z.string().nullable(),\n rationale: z.string(),\n }),\n]);\n\nexport const PatchEnvelope = z.object({\n blockId: z.string(),\n blockKind: z.string().optional(),\n blockPurpose: z.string().optional().nullable(),\n ops: z.array(Rfc6902PatchOp),\n rationale: z.string(),\n currentContent: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport const ContentUpdateResponse = z.object({\n patches: z.array(PatchEnvelope),\n assistantMessage: z.string(),\n});\n\nexport const PlaygroundProposeRequest = z.object({\n request: z.string().min(1).max(2000),\n});\n\nexport const PlaygroundProposeResponse = z.object({\n patches: z.array(PatchEnvelope),\n assistantMessage: z.string(),\n validation: z.object({\n valid: z.boolean(),\n issues: z.array(z.string()),\n filtered: z.number(),\n }),\n});\n\n// Multi-page schemas (Phase 2)\nexport const MultiPagePatchEnvelope = z.object({\n pageId: z.string(),\n blockId: z.string().optional(), // Not present for page-level ops\n blockKind: z.string().optional(),\n blockPurpose: z.string().optional().nullable(),\n ops: z.array(Rfc6902PatchOp),\n rationale: z.string(),\n currentContent: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport const MultiPageUpdateResponse = z.object({\n patches: z.array(MultiPagePatchEnvelope),\n assistantMessage: z.string(),\n pagesModified: z.number(),\n toolCallsUsed: z.number(),\n});\n\n// Stream event types for real-time updates\nexport type StreamEvent =\n | { type: 'status'; message: string; detail?: string }\n | { type: 'tool_call'; tool: string; args: unknown }\n | { type: 'tool_result'; tool: string; summary: string }\n | { type: 'patch_group'; envelope: MultiPagePatchEnvelope }\n | { type: 'complete'; response: MultiPageUpdateResponse };\n\n// Types - export both the schemas and the inferred types\nexport type Rfc6902PatchOp = z.infer<typeof Rfc6902PatchOp>;\nexport type PatchEnvelope = z.infer<typeof PatchEnvelope>;\nexport type ContentUpdateResponse = z.infer<typeof ContentUpdateResponse>;\nexport type PlaygroundProposeRequest = z.infer<typeof PlaygroundProposeRequest>;\nexport type PlaygroundProposeResponse = z.infer<typeof PlaygroundProposeResponse>;\nexport type MultiPagePatchEnvelope = z.infer<typeof MultiPagePatchEnvelope>;\nexport type MultiPageUpdateResponse = z.infer<typeof MultiPageUpdateResponse>;\n\n// Re-export schemas for runtime validation\nexport {\n Rfc6902PatchOp as Rfc6902PatchOpSchema,\n PatchEnvelope as PatchEnvelopeSchema,\n ContentUpdateResponse as ContentUpdateResponseSchema,\n PlaygroundProposeRequest as PlaygroundProposeRequestSchema,\n PlaygroundProposeResponse as PlaygroundProposeResponseSchema,\n MultiPagePatchEnvelope as MultiPagePatchEnvelopeSchema,\n MultiPageUpdateResponse as MultiPageUpdateResponseSchema,\n};\n\n// Page context types for building AI prompts\nexport type AllowedField = {\n path: string;\n type: 'richtext' | 'plaintext' | 'url' | 'number' | 'boolean';\n};\n\nexport type BlockContext = {\n id: string;\n kind: string;\n purpose: string | null;\n orderIndex: number;\n allowedPaths: string[]; // Legacy, kept for backward compat\n allowedFields?: AllowedField[]; // New structured format with types\n content: Record<string, unknown>;\n};\n\nexport type PageContext = {\n site: {\n id: string;\n title: string;\n primaryDomain: string | null;\n };\n page: {\n id: string;\n path: string;\n title: string;\n slug: string | null;\n metaTitle: string | null;\n metaDescription: string | null;\n blocks: BlockContext[];\n };\n};\n"]}
1
+ {"version":3,"sources":["/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/index.js","../../src/prebuild/index.ts","../../src/index.ts","../../../api/src/aiPlayground.ts"],"names":[],"mappings":"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","file":"/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/index.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} 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 }> {\n const pagesDir = path.join(outputDir, 'pages');\n ensureDir(pagesDir);\n\n const files: string[] = [];\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\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 };\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\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'],\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\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 } 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. 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 for (const file of files) {\n if (file.startsWith('pages/') && file !== 'pages/_index.json') {\n // Extract path from filename\n // _home.json -> '/', about.json -> '/about', about-team.json -> '/about/team'\n const filename = file.replace('pages/', '').replace('.json', '');\n const pagePath = filename === '_home' ? '/' : '/' + filename.replace(/-/g, '/');\n keyToFile[`page:${siteId}:${pagePath}:false`] = file;\n }\n\n if (file.startsWith('entries/') && file.endsWith('/all.json')) {\n // entries/{contentType}/all.json\n const contentType = file.split('/')[1];\n keyToFile[`entries-all:${siteId}:${contentType}`] = file;\n }\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","/**\n * Riverbank CMS SDK\n *\n * A TypeScript SDK for consuming Riverbank CMS content in your own applications.\n *\n * @example\n * ```ts\n * import { createRiverbankClient } from '@riverbankcms/sdk';\n *\n * const client = createRiverbankClient({\n * apiKey: process.env.RIVERBANK_API_KEY!,\n * baseUrl: `${process.env.NEXT_PUBLIC_DASHBOARD_URL}/api`,\n * });\n *\n * const site = await client.getSite({ slug: 'my-site' });\n * ```\n *\n * @packageDocumentation\n */\n\n// Client factory and types (server-safe)\nexport { createRiverbankClient } from './client/index';\nexport type {\n RiverbankClient,\n RiverbankClientConfig,\n SiteResponse,\n PageResponse,\n EntriesResponse,\n EntriesResponseWithMeta,\n PaginationMeta,\n EntryResponse,\n // Resilience types\n ResilienceConfig,\n ResilienceStatus,\n ResilienceSource,\n CircuitState,\n RetryConfig,\n CircuitBreakerConfig,\n} from './client/types';\n\n// Prebuild cache generation (for build-time static export)\nexport { prebuildCache } from './prebuild/index';\nexport type {\n PrebuildOptions,\n PrebuildResult,\n PrebuildProgress,\n PrebuildManifest,\n PrebuildContentType,\n} from './prebuild/types';\n\n// Prebuild loader (for runtime fallback)\nexport {\n PrebuildLoader,\n createPrebuildLoader,\n canUsePrebuild,\n} from './prebuild/loader';\nexport type { PrebuildLoaderConfig, LoadResult } from './prebuild/loader';\n\n// Re-export API client type for convenience\nexport type { ApiClient } from '@riverbankcms/api';\n\n// Re-export endpoint utilities for building API URLs\nexport { buildEndpointURL, API_ENDPOINTS } from '@riverbankcms/api';\n\n// Note: For loadPage, Page, Layout, Block, import from '@riverbankcms/sdk/rendering'\n// Note: For client-side hooks (usePage, useContent), import from '@riverbankcms/sdk/client'\n\n// Site configuration types (for SDK sites defining their own config)\nexport type {\n RiverbankSiteConfig,\n SiteStyleConfig,\n SectionBackground,\n SectionOptionsConfig,\n ContainerOptionsConfig,\n SectionSpacing,\n ContainerMaxWidth,\n ContainerAlignment,\n} from './config';\n\n// Block kind types (single source of truth from @riverbankcms/blocks)\nexport {\n SYSTEM_BLOCK_KINDS,\n type SystemBlockKind,\n type CustomBlockKind,\n type BlockKind,\n} from './types';\n","import { z } from 'zod';\n\n/**\n * RFC-6902 JSON Patch Operations\n * Standard JSON Patch format for AI Playground content updates\n */\n\nexport const Rfc6902PatchOp = z.discriminatedUnion('op', [\n // Standard RFC-6902 operations\n z.object({\n op: z.literal('add'),\n path: z.string(),\n value: z.unknown(),\n }),\n z.object({\n op: z.literal('remove'),\n path: z.string(),\n }),\n z.object({\n op: z.literal('replace'),\n path: z.string(),\n value: z.unknown(),\n }),\n z.object({\n op: z.literal('move'),\n from: z.string(),\n path: z.string(),\n }),\n z.object({\n op: z.literal('copy'),\n from: z.string(),\n path: z.string(),\n }),\n // Block-level operations (Phase 2)\n z.object({\n op: z.literal('add_block'),\n blockKind: z.string(),\n afterBlockId: z.string().nullable(),\n content: z.record(z.string(), z.unknown()),\n rationale: z.string(),\n }),\n z.object({\n op: z.literal('delete_block'),\n blockId: z.string(),\n rationale: z.string(),\n }),\n z.object({\n op: z.literal('reorder_block'),\n blockId: z.string(),\n afterBlockId: z.string().nullable(),\n rationale: z.string(),\n }),\n]);\n\nexport const PatchEnvelope = z.object({\n blockId: z.string(),\n blockKind: z.string().optional(),\n blockPurpose: z.string().optional().nullable(),\n ops: z.array(Rfc6902PatchOp),\n rationale: z.string(),\n currentContent: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport const ContentUpdateResponse = z.object({\n patches: z.array(PatchEnvelope),\n assistantMessage: z.string(),\n});\n\nexport const PlaygroundProposeRequest = z.object({\n request: z.string().min(1).max(2000),\n});\n\nexport const PlaygroundProposeResponse = z.object({\n patches: z.array(PatchEnvelope),\n assistantMessage: z.string(),\n validation: z.object({\n valid: z.boolean(),\n issues: z.array(z.string()),\n filtered: z.number(),\n }),\n});\n\n// Multi-page schemas (Phase 2)\nexport const MultiPagePatchEnvelope = z.object({\n pageId: z.string(),\n blockId: z.string().optional(), // Not present for page-level ops\n blockKind: z.string().optional(),\n blockPurpose: z.string().optional().nullable(),\n ops: z.array(Rfc6902PatchOp),\n rationale: z.string(),\n currentContent: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport const MultiPageUpdateResponse = z.object({\n patches: z.array(MultiPagePatchEnvelope),\n assistantMessage: z.string(),\n pagesModified: z.number(),\n toolCallsUsed: z.number(),\n});\n\n// Stream event types for real-time updates\nexport type StreamEvent =\n | { type: 'status'; message: string; detail?: string }\n | { type: 'tool_call'; tool: string; args: unknown }\n | { type: 'tool_result'; tool: string; summary: string }\n | { type: 'patch_group'; envelope: MultiPagePatchEnvelope }\n | { type: 'complete'; response: MultiPageUpdateResponse };\n\n// Types - export both the schemas and the inferred types\nexport type Rfc6902PatchOp = z.infer<typeof Rfc6902PatchOp>;\nexport type PatchEnvelope = z.infer<typeof PatchEnvelope>;\nexport type ContentUpdateResponse = z.infer<typeof ContentUpdateResponse>;\nexport type PlaygroundProposeRequest = z.infer<typeof PlaygroundProposeRequest>;\nexport type PlaygroundProposeResponse = z.infer<typeof PlaygroundProposeResponse>;\nexport type MultiPagePatchEnvelope = z.infer<typeof MultiPagePatchEnvelope>;\nexport type MultiPageUpdateResponse = z.infer<typeof MultiPageUpdateResponse>;\n\n// Re-export schemas for runtime validation\nexport {\n Rfc6902PatchOp as Rfc6902PatchOpSchema,\n PatchEnvelope as PatchEnvelopeSchema,\n ContentUpdateResponse as ContentUpdateResponseSchema,\n PlaygroundProposeRequest as PlaygroundProposeRequestSchema,\n PlaygroundProposeResponse as PlaygroundProposeResponseSchema,\n MultiPagePatchEnvelope as MultiPagePatchEnvelopeSchema,\n MultiPageUpdateResponse as MultiPageUpdateResponseSchema,\n};\n\n// Page context types for building AI prompts\nexport type AllowedField = {\n path: string;\n type: 'richtext' | 'plaintext' | 'url' | 'number' | 'boolean';\n};\n\nexport type BlockContext = {\n id: string;\n kind: string;\n purpose: string | null;\n orderIndex: number;\n allowedPaths: string[]; // Legacy, kept for backward compat\n allowedFields?: AllowedField[]; // New structured format with types\n content: Record<string, unknown>;\n};\n\nexport type PageContext = {\n site: {\n id: string;\n title: string;\n primaryDomain: string | null;\n };\n page: {\n id: string;\n path: string;\n title: string;\n slug: string | null;\n metaTitle: string | null;\n metaDescription: string | null;\n blocks: BlockContext[];\n };\n};\n"]}