@riverbankcms/sdk 0.6.1 → 0.7.2

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 (172) hide show
  1. package/README.md +175 -0
  2. package/dist/cli/index.js +42 -95
  3. package/dist/cli/index.js.map +1 -1
  4. package/dist/cli/init-docs/content/agents-section.md +50 -0
  5. package/dist/cli/init-docs/content/cli-reference.md +574 -0
  6. package/dist/cli/init-docs/content/content-management.md +384 -0
  7. package/dist/cli/init-docs/content/context-brand.md +125 -0
  8. package/dist/cli/init-docs/content/context-brief.md +77 -0
  9. package/dist/cli/init-docs/content/context-knowledge.md +111 -0
  10. package/dist/cli/init-docs/content/getting-started.md +130 -0
  11. package/dist/cli/init-docs/content/site-workflows-readme.md +96 -0
  12. package/dist/cli/init-docs/content/workflow-add-block.md +228 -0
  13. package/dist/cli/init-docs/content/workflow-create-page.md +193 -0
  14. package/dist/cli/init-docs/content/workflow-publish.md +280 -0
  15. package/dist/client/client.d.mts +2 -2
  16. package/dist/client/client.d.ts +2 -2
  17. package/dist/client/client.js +536 -71
  18. package/dist/client/client.js.map +1 -1
  19. package/dist/client/client.mjs +536 -78
  20. package/dist/client/client.mjs.map +1 -1
  21. package/dist/client/hooks.d.mts +2 -2
  22. package/dist/client/hooks.d.ts +2 -2
  23. package/dist/client/usePage-C9tJpuKa.d.mts +6813 -0
  24. package/dist/client/usePage-Db9kzA41.d.ts +6813 -0
  25. package/dist/server/{Layout-wBtJLTVX.d.ts → Layout-Ce7PU9I5.d.ts} +1 -1
  26. package/dist/server/{Layout-B7cvis7r.d.mts → Layout-WllR8Zug.d.mts} +1 -1
  27. package/dist/server/{chunk-I7ZR2WO3.mjs → chunk-5JT452F2.mjs} +537 -76
  28. package/dist/server/chunk-5JT452F2.mjs.map +1 -0
  29. package/dist/server/{chunk-Z5ZA6Q4D.mjs → chunk-74XUVNOO.mjs} +5 -3
  30. package/dist/server/chunk-74XUVNOO.mjs.map +1 -0
  31. package/dist/server/{chunk-3B364WO2.js → chunk-7BVRA5MY.js} +4 -49
  32. package/dist/server/chunk-7BVRA5MY.js.map +1 -0
  33. package/dist/server/chunk-AET56TQX.mjs +45 -0
  34. package/dist/server/chunk-AET56TQX.mjs.map +1 -0
  35. package/dist/server/chunk-ARNCLSQT.mjs +52 -0
  36. package/dist/server/chunk-ARNCLSQT.mjs.map +1 -0
  37. package/dist/server/chunk-BNQV3PXP.js +69 -0
  38. package/dist/server/chunk-BNQV3PXP.js.map +1 -0
  39. package/dist/server/{chunk-IVHIQFJH.js → chunk-HMENX4Y7.js} +543 -82
  40. package/dist/server/chunk-HMENX4Y7.js.map +1 -0
  41. package/dist/server/{chunk-I2D7KOEA.js → chunk-JWRNMNWI.js} +5 -3
  42. package/dist/server/chunk-JWRNMNWI.js.map +1 -0
  43. package/dist/server/chunk-LQUKXIW7.mjs +13 -0
  44. package/dist/server/chunk-LQUKXIW7.mjs.map +1 -0
  45. package/dist/server/{chunk-XXFF4RVR.mjs → chunk-RBJFXNDM.mjs} +1 -46
  46. package/dist/server/chunk-RBJFXNDM.mjs.map +1 -0
  47. package/dist/server/chunk-SWYWZT3L.mjs +69 -0
  48. package/dist/server/chunk-SWYWZT3L.mjs.map +1 -0
  49. package/dist/server/chunk-T26N3P26.js +52 -0
  50. package/dist/server/chunk-T26N3P26.js.map +1 -0
  51. package/dist/server/chunk-VODFQMUW.js +45 -0
  52. package/dist/server/chunk-VODFQMUW.js.map +1 -0
  53. package/dist/server/chunk-WYNEYDXO.js +13 -0
  54. package/dist/server/chunk-WYNEYDXO.js.map +1 -0
  55. package/dist/server/{components-CICSJyp_.d.ts → components--LT61IKp.d.ts} +2 -2
  56. package/dist/server/{components-CMMwDXTW.d.mts → components-RPzRQve6.d.mts} +2 -2
  57. package/dist/server/components.d.mts +4 -4
  58. package/dist/server/components.d.ts +4 -4
  59. package/dist/server/components.js +5 -4
  60. package/dist/server/components.js.map +1 -1
  61. package/dist/server/components.mjs +5 -4
  62. package/dist/server/config-validation.js +0 -1
  63. package/dist/server/config-validation.js.map +1 -1
  64. package/dist/server/config-validation.mjs +0 -1
  65. package/dist/server/config.js +0 -1
  66. package/dist/server/config.js.map +1 -1
  67. package/dist/server/config.mjs +0 -1
  68. package/dist/server/config.mjs.map +1 -1
  69. package/dist/server/data.d.mts +1 -1
  70. package/dist/server/data.d.ts +1 -1
  71. package/dist/server/data.js +0 -1
  72. package/dist/server/data.js.map +1 -1
  73. package/dist/server/data.mjs +0 -1
  74. package/dist/server/env.d.mts +23 -0
  75. package/dist/server/env.d.ts +23 -0
  76. package/dist/server/env.js +7 -0
  77. package/dist/server/env.js.map +1 -0
  78. package/dist/server/env.mjs +7 -0
  79. package/dist/server/index-BL66CU6d.d.mts +130 -0
  80. package/dist/server/{index-Bucs6UqG.d.mts → index-Bkva0WAj.d.mts} +1 -1
  81. package/dist/server/index-CJk9iQQW.d.ts +130 -0
  82. package/dist/server/{index-Cp7tJuRt.d.ts → index-CSBWKA3r.d.ts} +1 -1
  83. package/dist/server/index.d.mts +3 -3
  84. package/dist/server/index.d.ts +3 -3
  85. package/dist/server/index.js +2 -3
  86. package/dist/server/index.js.map +1 -1
  87. package/dist/server/index.mjs +1 -2
  88. package/dist/server/index.mjs.map +1 -1
  89. package/dist/server/{loadContent-Buvmudee.d.ts → loadContent-CXUWMuzY.d.ts} +11 -3
  90. package/dist/server/{loadContent-BS-3wesN.d.mts → loadContent-F_tAS0Nl.d.mts} +11 -3
  91. package/dist/server/{loadPage-IDGVDFBB.js → loadPage-6I7F6GRF.js} +1 -2
  92. package/dist/server/loadPage-6I7F6GRF.js.map +1 -0
  93. package/dist/server/{loadPage-B8mQUUSo.d.mts → loadPage-CxlYLe5K.d.mts} +1 -1
  94. package/dist/server/{loadPage-DNQTTRHL.mjs → loadPage-JI2SML4M.mjs} +1 -2
  95. package/dist/server/{loadPage-DP3nrHBi.d.ts → loadPage-i2r-X5b9.d.ts} +1 -1
  96. package/dist/server/metadata.d.mts +8 -135
  97. package/dist/server/metadata.d.ts +8 -135
  98. package/dist/server/metadata.js +4 -65
  99. package/dist/server/metadata.js.map +1 -1
  100. package/dist/server/metadata.mjs +4 -65
  101. package/dist/server/metadata.mjs.map +1 -1
  102. package/dist/server/navigation.js +0 -1
  103. package/dist/server/navigation.js.map +1 -1
  104. package/dist/server/navigation.mjs +0 -1
  105. package/dist/server/next/revalidate.d.mts +66 -0
  106. package/dist/server/next/revalidate.d.ts +66 -0
  107. package/dist/server/next/revalidate.js +59 -0
  108. package/dist/server/next/revalidate.js.map +1 -0
  109. package/dist/server/next/revalidate.mjs +59 -0
  110. package/dist/server/next/revalidate.mjs.map +1 -0
  111. package/dist/server/next/tags.d.mts +78 -0
  112. package/dist/server/next/tags.d.ts +78 -0
  113. package/dist/server/next/tags.js +34 -0
  114. package/dist/server/next/tags.js.map +1 -0
  115. package/dist/server/next/tags.mjs +34 -0
  116. package/dist/server/next/tags.mjs.map +1 -0
  117. package/dist/server/next.d.mts +432 -0
  118. package/dist/server/next.d.ts +432 -0
  119. package/dist/server/next.js +217 -0
  120. package/dist/server/next.js.map +1 -0
  121. package/dist/server/next.mjs +217 -0
  122. package/dist/server/next.mjs.map +1 -0
  123. package/dist/server/rendering/server.d.mts +3 -3
  124. package/dist/server/rendering/server.d.ts +3 -3
  125. package/dist/server/rendering/server.js +5 -4
  126. package/dist/server/rendering/server.js.map +1 -1
  127. package/dist/server/rendering/server.mjs +5 -4
  128. package/dist/server/rendering.d.mts +6 -6
  129. package/dist/server/rendering.d.ts +6 -6
  130. package/dist/server/rendering.js +7 -6
  131. package/dist/server/rendering.js.map +1 -1
  132. package/dist/server/rendering.mjs +9 -8
  133. package/dist/server/routing.d.mts +2 -2
  134. package/dist/server/routing.d.ts +2 -2
  135. package/dist/server/routing.js +2 -4
  136. package/dist/server/routing.js.map +1 -1
  137. package/dist/server/routing.mjs +1 -3
  138. package/dist/server/routing.mjs.map +1 -1
  139. package/dist/server/server.d.mts +4 -4
  140. package/dist/server/server.d.ts +4 -4
  141. package/dist/server/server.js +4 -5
  142. package/dist/server/server.js.map +1 -1
  143. package/dist/server/server.mjs +5 -6
  144. package/dist/server/theme-bridge.js +0 -1
  145. package/dist/server/theme-bridge.js.map +1 -1
  146. package/dist/server/theme-bridge.mjs +0 -1
  147. package/dist/server/theme-bridge.mjs.map +1 -1
  148. package/dist/server/theme.js +1 -3
  149. package/dist/server/theme.js.map +1 -1
  150. package/dist/server/theme.mjs +0 -2
  151. package/dist/server/theme.mjs.map +1 -1
  152. package/dist/server/{types-BvcJU7zk.d.ts → types-DnkRh0UL.d.ts} +118 -9
  153. package/dist/server/{types-1cLz0vnq.d.mts → types-MF2AWoKv.d.mts} +118 -9
  154. package/dist/server/webhooks.d.mts +75 -0
  155. package/dist/server/webhooks.d.ts +75 -0
  156. package/dist/server/webhooks.js +11 -0
  157. package/dist/server/webhooks.js.map +1 -0
  158. package/dist/server/webhooks.mjs +11 -0
  159. package/dist/server/webhooks.mjs.map +1 -0
  160. package/package.json +33 -1
  161. package/dist/server/chunk-3B364WO2.js.map +0 -1
  162. package/dist/server/chunk-BJTO5JO5.mjs +0 -11
  163. package/dist/server/chunk-DGUM43GV.js +0 -11
  164. package/dist/server/chunk-DGUM43GV.js.map +0 -1
  165. package/dist/server/chunk-I2D7KOEA.js.map +0 -1
  166. package/dist/server/chunk-I7ZR2WO3.mjs.map +0 -1
  167. package/dist/server/chunk-IVHIQFJH.js.map +0 -1
  168. package/dist/server/chunk-XXFF4RVR.mjs.map +0 -1
  169. package/dist/server/chunk-Z5ZA6Q4D.mjs.map +0 -1
  170. package/dist/server/loadPage-IDGVDFBB.js.map +0 -1
  171. /package/dist/server/{chunk-BJTO5JO5.mjs.map → env.mjs.map} +0 -0
  172. /package/dist/server/{loadPage-DNQTTRHL.mjs.map → loadPage-JI2SML4M.mjs.map} +0 -0
@@ -0,0 +1,432 @@
1
+ import { ReactNode, ComponentType } from 'react';
2
+ import { R as RiverbankClient } from './types-DnkRh0UL.js';
3
+ import { R as RiverbankSiteConfig } from './types-DLBhEPSt.js';
4
+ import { B as BlockOverrides } from './loadPage-i2r-X5b9.js';
5
+ import './schema-Z6-afHJG.js';
6
+ import { M as Metadata } from './index-CJk9iQQW.js';
7
+ import { b as LoadContentResult } from './loadContent-CXUWMuzY.js';
8
+ import './types-CVykEqXN.js';
9
+ import '@riverbankcms/ai';
10
+ import 'zod';
11
+ import './link-DjxLyC82.js';
12
+ import '@riverbankcms/media-storage-supabase';
13
+ import '@riverbankcms/db';
14
+ import './blockKinds-B6MWzNWp.js';
15
+ import 'react/jsx-runtime';
16
+ import './core-DsNWrl3o.js';
17
+ import './types-DuQCNVV0.js';
18
+
19
+ /**
20
+ * Type definitions for Next.js integration helpers.
21
+ *
22
+ * These types define the options and props for the `createCatchAllPage()` factory,
23
+ * which simplifies catch-all routing for Riverbank CMS sites.
24
+ */
25
+
26
+ /**
27
+ * Context passed to escape hatch callbacks.
28
+ */
29
+ interface CatchAllContext {
30
+ /** Loaded content (page or entry) */
31
+ content: LoadContentResult;
32
+ /** Resolved URL path (e.g., '/about', '/blog/my-post') */
33
+ path: string;
34
+ /** Whether preview mode is enabled */
35
+ preview: boolean;
36
+ /** Search parameters from the URL (for filtering, pagination, etc.) */
37
+ searchParams: Record<string, string | string[] | undefined>;
38
+ }
39
+ /**
40
+ * Options for the `createCatchAllPage()` factory.
41
+ *
42
+ * @example Basic usage
43
+ * ```tsx
44
+ * const { Page, generateMetadata } = createCatchAllPage({
45
+ * getClient: getRiverbankClient,
46
+ * config,
47
+ * blockOverrides: { hero: MyCustomHero },
48
+ * });
49
+ * ```
50
+ *
51
+ * @example With maintenance mode
52
+ * ```tsx
53
+ * const { Page, generateMetadata } = createCatchAllPage({
54
+ * getClient,
55
+ * config,
56
+ * beforeRender: async () => {
57
+ * if (process.env.MAINTENANCE_MODE === 'true') {
58
+ * return <MaintenancePage />;
59
+ * }
60
+ * return null; // Continue with normal rendering
61
+ * },
62
+ * });
63
+ * ```
64
+ */
65
+ interface CreateCatchAllPageOptions {
66
+ /**
67
+ * Function that returns the Riverbank client.
68
+ * Called fresh on each request to support different caching strategies.
69
+ */
70
+ getClient: () => RiverbankClient;
71
+ /**
72
+ * Site configuration from `defineConfig()`.
73
+ * Provides siteId and content type routing information.
74
+ */
75
+ config: RiverbankSiteConfig;
76
+ /**
77
+ * Custom block component overrides for rendering.
78
+ * Keys can be full block kind ("block.hero") or short form ("hero").
79
+ */
80
+ blockOverrides?: BlockOverrides;
81
+ /**
82
+ * Override site URL for metadata generation.
83
+ * Defaults to `config.liveUrl` or `config.previewUrl` based on preview mode.
84
+ */
85
+ siteUrl?: string;
86
+ /**
87
+ * Intercept before rendering to implement maintenance mode, access control, etc.
88
+ *
89
+ * Return a React node to short-circuit rendering, or `null` to continue
90
+ * with normal page/entry rendering.
91
+ *
92
+ * @example Maintenance mode
93
+ * ```tsx
94
+ * beforeRender: async () => {
95
+ * if (process.env.MAINTENANCE_MODE === 'true') {
96
+ * return <MaintenancePage />;
97
+ * }
98
+ * return null;
99
+ * }
100
+ * ```
101
+ *
102
+ * @example Access control
103
+ * ```tsx
104
+ * beforeRender: async ({ path }) => {
105
+ * if (path.startsWith('/members')) {
106
+ * const session = await getSession();
107
+ * if (!session) return <LoginPage redirect={path} />;
108
+ * }
109
+ * return null;
110
+ * }
111
+ * ```
112
+ */
113
+ beforeRender?: (context: CatchAllContext) => ReactNode | null | Promise<ReactNode | null>;
114
+ /**
115
+ * Custom metadata generator. If provided, replaces default metadata generation.
116
+ *
117
+ * Use this when you need full control over SEO metadata, such as adding
118
+ * product-specific Open Graph tags for e-commerce sites.
119
+ *
120
+ * @example Custom product metadata
121
+ * ```tsx
122
+ * customMetadata: async ({ content }) => {
123
+ * if (isEntryContent(content) && content.entry.type === 'product') {
124
+ * return {
125
+ * title: `${content.entry.title} | Shop`,
126
+ * openGraph: { type: 'product' },
127
+ * };
128
+ * }
129
+ * // Use default for other content types
130
+ * return generatePageMetadata({ page, site, path, siteUrl });
131
+ * }
132
+ * ```
133
+ */
134
+ customMetadata?: (context: CatchAllContext) => Metadata | Promise<Metadata>;
135
+ /**
136
+ * Wrapper component around rendered content.
137
+ *
138
+ * Useful for adding analytics scripts, error boundaries, or layout wrappers
139
+ * that should wrap all page content.
140
+ *
141
+ * @example Analytics wrapper
142
+ * ```tsx
143
+ * wrapper: ({ children }) => (
144
+ * <>
145
+ * {children}
146
+ * <AnalyticsScript siteId={config.siteId} />
147
+ * </>
148
+ * )
149
+ * ```
150
+ */
151
+ wrapper?: ComponentType<{
152
+ children: ReactNode;
153
+ }>;
154
+ }
155
+ /**
156
+ * Next.js page props for catch-all routes.
157
+ *
158
+ * This matches the signature expected by Next.js 15+ App Router pages
159
+ * with the `[[...slug]]` pattern.
160
+ */
161
+ interface CatchAllPageProps {
162
+ /** Route parameters containing the slug segments */
163
+ params: Promise<{
164
+ slug?: string[];
165
+ }>;
166
+ /** Optional search parameters from the URL */
167
+ searchParams?: Promise<Record<string, string | string[] | undefined>>;
168
+ }
169
+ /**
170
+ * Result of the `createCatchAllPage()` factory.
171
+ */
172
+ interface CreateCatchAllPageResult {
173
+ /**
174
+ * React component to use as the default export of your catch-all page.
175
+ *
176
+ * @example
177
+ * ```tsx
178
+ * const { Page, generateMetadata } = createCatchAllPage({ ... });
179
+ * export default Page;
180
+ * ```
181
+ */
182
+ Page: (props: CatchAllPageProps) => Promise<ReactNode>;
183
+ /**
184
+ * Metadata generation function for Next.js `generateMetadata`.
185
+ *
186
+ * @example
187
+ * ```tsx
188
+ * const { Page, generateMetadata } = createCatchAllPage({ ... });
189
+ * export { generateMetadata };
190
+ * ```
191
+ */
192
+ generateMetadata: (props: CatchAllPageProps) => Promise<Metadata>;
193
+ }
194
+
195
+ /**
196
+ * Next.js catch-all page factory for Riverbank CMS.
197
+ *
198
+ * Provides a simple, opinionated way to render CMS content in Next.js catch-all routes.
199
+ * Reduces typical page.tsx boilerplate from ~160 lines to ~10 lines.
200
+ *
201
+ * @example
202
+ * ```tsx
203
+ * // src/app/[[...slug]]/page.tsx
204
+ * import { createCatchAllPage } from '@riverbankcms/sdk/next';
205
+ * import { getRiverbankClient } from '@/lib/builder-client';
206
+ * import config from '@/riverbank.config';
207
+ *
208
+ * const { Page, generateMetadata } = createCatchAllPage({
209
+ * getClient: getRiverbankClient,
210
+ * config,
211
+ * blockOverrides: { hero: MyCustomHero },
212
+ * });
213
+ *
214
+ * export default Page;
215
+ * export { generateMetadata };
216
+ * ```
217
+ */
218
+
219
+ /**
220
+ * Factory function to create a Next.js catch-all page component and metadata generator.
221
+ *
222
+ * This provides a simple, opinionated setup for rendering Riverbank CMS content
223
+ * in external SDK sites. It handles:
224
+ *
225
+ * - Page and content entry routing
226
+ * - Preview mode detection (via `RIVERBANK_PREVIEW_MODE` env var)
227
+ * - SEO metadata generation
228
+ * - Block overrides for custom components
229
+ * - 404 handling for missing content
230
+ *
231
+ * ## Escape Hatches
232
+ *
233
+ * For customization beyond the defaults, use these options:
234
+ *
235
+ * - `beforeRender`: Intercept before rendering (maintenance mode, access control)
236
+ * - `customMetadata`: Full control over SEO metadata
237
+ * - `wrapper`: Wrap all content (analytics, error boundaries)
238
+ *
239
+ * For maximum control, use the lower-level helpers directly:
240
+ * - `loadContent()` from `@riverbankcms/sdk/rendering`
241
+ * - `Page` component from `@riverbankcms/sdk/rendering`
242
+ * - `generatePageMetadata()` from `@riverbankcms/sdk/metadata`
243
+ *
244
+ * @param options - Configuration options
245
+ * @returns Object with `Page` component and `generateMetadata` function
246
+ *
247
+ * @example Basic usage
248
+ * ```tsx
249
+ * const { Page, generateMetadata } = createCatchAllPage({
250
+ * getClient: getRiverbankClient,
251
+ * config,
252
+ * });
253
+ *
254
+ * export default Page;
255
+ * export { generateMetadata };
256
+ * ```
257
+ *
258
+ * @example With maintenance mode
259
+ * ```tsx
260
+ * const { Page, generateMetadata } = createCatchAllPage({
261
+ * getClient,
262
+ * config,
263
+ * beforeRender: async () => {
264
+ * if (process.env.MAINTENANCE_MODE === 'true') {
265
+ * return <MaintenancePage />;
266
+ * }
267
+ * return null;
268
+ * },
269
+ * });
270
+ * ```
271
+ */
272
+ declare function createCatchAllPage(options: CreateCatchAllPageOptions): CreateCatchAllPageResult;
273
+
274
+ /**
275
+ * Static params generation for Next.js SSG
276
+ *
277
+ * Provides helpers for generating static params from published CMS routes.
278
+ *
279
+ * @example
280
+ * ```tsx
281
+ * // app/[[...slug]]/page.tsx
282
+ * import { generateAllStaticParams } from '@riverbankcms/sdk/next';
283
+ *
284
+ * export { generateAllStaticParams as generateStaticParams };
285
+ * ```
286
+ */
287
+ /**
288
+ * Environment variable validation result
289
+ */
290
+ type StaticParamsEnvResult = {
291
+ valid: true;
292
+ config: {
293
+ apiKey: string;
294
+ siteId: string;
295
+ baseUrl: string;
296
+ };
297
+ } | {
298
+ valid: false;
299
+ missingVars: string[];
300
+ };
301
+ /**
302
+ * Validate that all required environment variables are set.
303
+ *
304
+ * Required env vars:
305
+ * - RIVERBANK_API_KEY: API key for published content
306
+ * - RIVERBANK_SITE_ID: Site ID
307
+ * - NEXT_PUBLIC_DASHBOARD_URL: Dashboard API URL
308
+ *
309
+ * @returns Validation result with config or missing vars
310
+ */
311
+ declare function validateStaticParamsEnv(): StaticParamsEnvResult;
312
+ /**
313
+ * Convert a route path to a Next.js slug array.
314
+ *
315
+ * @param path - The route path (e.g., '/about', '/blog/post')
316
+ * @returns The slug array for Next.js catch-all route
317
+ *
318
+ * @example
319
+ * ```ts
320
+ * pathToSlugArray('/') // []
321
+ * pathToSlugArray('/about') // ['about']
322
+ * pathToSlugArray('/blog/post') // ['blog', 'post']
323
+ * ```
324
+ */
325
+ declare function pathToSlugArray(path: string): string[];
326
+ /**
327
+ * Generate static params for all published routes.
328
+ *
329
+ * This function fetches all published routes from the CMS and converts them
330
+ * to the static params format expected by Next.js catch-all routes.
331
+ *
332
+ * Requires environment variables:
333
+ * - RIVERBANK_API_KEY: API key for published content
334
+ * - RIVERBANK_SITE_ID: Site ID
335
+ * - NEXT_PUBLIC_DASHBOARD_URL: Dashboard API URL
336
+ *
337
+ * @throws Error if required env vars are missing (prevents silent empty SSG in CI)
338
+ * @returns Array of static params objects for Next.js
339
+ *
340
+ * @example
341
+ * ```tsx
342
+ * // app/[[...slug]]/page.tsx
343
+ * import { generateAllStaticParams } from '@riverbankcms/sdk/next';
344
+ *
345
+ * export { generateAllStaticParams as generateStaticParams };
346
+ *
347
+ * // Or with custom logic:
348
+ * export async function generateStaticParams() {
349
+ * const params = await generateAllStaticParams();
350
+ * // Filter or modify params as needed
351
+ * return params.filter(p => !p.slug.includes('private'));
352
+ * }
353
+ * ```
354
+ */
355
+ declare function generateAllStaticParams(): Promise<{
356
+ slug: string[];
357
+ }[]>;
358
+
359
+ /**
360
+ * Next.js integration helpers for Riverbank CMS SDK.
361
+ *
362
+ * Provides opinionated factories for common Next.js patterns, reducing
363
+ * boilerplate while maintaining full customizability through escape hatches.
364
+ *
365
+ * @example Basic catch-all page
366
+ * ```tsx
367
+ * // src/app/[[...slug]]/page.tsx
368
+ * import { createCatchAllPage } from '@riverbankcms/sdk/next';
369
+ * import { getRiverbankClient } from '@/lib/builder-client';
370
+ * import config from '@/riverbank.config';
371
+ *
372
+ * const { Page, generateMetadata } = createCatchAllPage({
373
+ * getClient: getRiverbankClient,
374
+ * config,
375
+ * });
376
+ *
377
+ * export default Page;
378
+ * export { generateMetadata };
379
+ * ```
380
+ *
381
+ * @example With customization
382
+ * ```tsx
383
+ * const { Page, generateMetadata } = createCatchAllPage({
384
+ * getClient,
385
+ * config,
386
+ * blockOverrides: { hero: MyCustomHero },
387
+ * beforeRender: async () => {
388
+ * if (process.env.MAINTENANCE_MODE === 'true') {
389
+ * return <MaintenancePage />;
390
+ * }
391
+ * return null;
392
+ * },
393
+ * });
394
+ * ```
395
+ *
396
+ * @packageDocumentation
397
+ */
398
+
399
+ /**
400
+ * ISR revalidation duration in seconds for production mode.
401
+ * 5 minutes provides a good balance between freshness and performance.
402
+ */
403
+ declare const ISR_REVALIDATE_SECONDS = 300;
404
+ interface ISRConfig {
405
+ /**
406
+ * Revalidation interval in seconds.
407
+ * - 0: Dynamic rendering (no caching) - used in preview mode
408
+ * - 300: 5 minute ISR - used in production mode
409
+ */
410
+ revalidate: number | false;
411
+ /**
412
+ * Whether the current environment is in preview mode.
413
+ * Useful for conditional rendering or data fetching behavior.
414
+ */
415
+ isPreview: boolean;
416
+ }
417
+ /**
418
+ * Get ISR configuration based on the current environment.
419
+ *
420
+ * @example
421
+ * ```tsx
422
+ * // app/[[...slug]]/page.tsx
423
+ * import { getISRConfig } from '@riverbankcms/sdk/next';
424
+ *
425
+ * export const revalidate = getISRConfig().revalidate;
426
+ * ```
427
+ *
428
+ * @returns ISR configuration with revalidate interval and preview flag
429
+ */
430
+ declare function getISRConfig(): ISRConfig;
431
+
432
+ export { type CatchAllContext, type CatchAllPageProps, type CreateCatchAllPageOptions, type CreateCatchAllPageResult, type ISRConfig, ISR_REVALIDATE_SECONDS, type StaticParamsEnvResult, createCatchAllPage, generateAllStaticParams, getISRConfig, pathToSlugArray, validateStaticParamsEnv };
@@ -0,0 +1,217 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }
2
+
3
+
4
+ var _chunkBNQV3PXPjs = require('./chunk-BNQV3PXP.js');
5
+
6
+
7
+ var _chunkWYNEYDXOjs = require('./chunk-WYNEYDXO.js');
8
+
9
+
10
+ var _chunkHMENX4Y7js = require('./chunk-HMENX4Y7.js');
11
+
12
+
13
+
14
+
15
+ var _chunkJWRNMNWIjs = require('./chunk-JWRNMNWI.js');
16
+
17
+
18
+ var _chunkT26N3P26js = require('./chunk-T26N3P26.js');
19
+ require('./chunk-7UPVCT3K.js');
20
+ require('./chunk-RVDS7VSP.js');
21
+ require('./chunk-YYO3RIFO.js');
22
+
23
+ // src/next/catch-all.tsx
24
+ var _navigation = require('next/navigation');
25
+ var _jsxruntime = require('react/jsx-runtime');
26
+ function isPreviewMode2() {
27
+ return process.env.RIVERBANK_PREVIEW_MODE === "true";
28
+ }
29
+ function slugToPath(slug) {
30
+ if (!slug || slug.length === 0) return "/";
31
+ return "/" + slug.join("/");
32
+ }
33
+ function createCatchAllPage(options) {
34
+ const {
35
+ getClient,
36
+ config,
37
+ blockOverrides,
38
+ siteUrl,
39
+ beforeRender,
40
+ customMetadata,
41
+ wrapper: Wrapper
42
+ } = options;
43
+ async function Page2({ params, searchParams: searchParamsPromise }) {
44
+ const [{ slug }, searchParams] = await Promise.all([
45
+ params,
46
+ _nullishCoalesce(searchParamsPromise, () => ( Promise.resolve({})))
47
+ ]);
48
+ const path = slugToPath(slug);
49
+ const preview = isPreviewMode2();
50
+ const client = getClient();
51
+ let content;
52
+ try {
53
+ content = await _chunkJWRNMNWIjs.loadContent.call(void 0, {
54
+ client,
55
+ siteId: config.siteId,
56
+ path,
57
+ preview
58
+ });
59
+ } catch (error) {
60
+ console.debug("[createCatchAllPage] Failed to load content for path:", path, error);
61
+ return _navigation.notFound.call(void 0, );
62
+ }
63
+ if (beforeRender) {
64
+ const intercepted = await beforeRender({ content, path, preview, searchParams });
65
+ if (intercepted !== null) {
66
+ return Wrapper ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Wrapper, { children: intercepted }) : intercepted;
67
+ }
68
+ }
69
+ let rendered;
70
+ if (_chunkJWRNMNWIjs.isPageContent.call(void 0, content)) {
71
+ rendered = /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
72
+ _chunkT26N3P26js.Page,
73
+ {
74
+ page: content.page,
75
+ theme: content.theme,
76
+ siteId: content.siteId,
77
+ resolvedData: content.resolvedData,
78
+ blockOverrides
79
+ }
80
+ );
81
+ } else if (_chunkJWRNMNWIjs.isEntryContent.call(void 0, content)) {
82
+ if (!content.templatePage) {
83
+ return _navigation.notFound.call(void 0, );
84
+ }
85
+ rendered = /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
86
+ _chunkT26N3P26js.Page,
87
+ {
88
+ page: content.templatePage,
89
+ theme: content.theme,
90
+ siteId: content.siteId,
91
+ resolvedData: content.resolvedData,
92
+ blockOverrides,
93
+ dataContext: {
94
+ contentEntry: content.dataContext.contentEntry
95
+ }
96
+ }
97
+ );
98
+ } else {
99
+ return _navigation.notFound.call(void 0, );
100
+ }
101
+ return Wrapper ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Wrapper, { children: rendered }) : rendered;
102
+ }
103
+ async function generateMetadataFn({ params, searchParams: searchParamsPromise }) {
104
+ const [{ slug }, searchParams] = await Promise.all([
105
+ params,
106
+ _nullishCoalesce(searchParamsPromise, () => ( Promise.resolve({})))
107
+ ]);
108
+ const path = slugToPath(slug);
109
+ const preview = isPreviewMode2();
110
+ try {
111
+ const content = await _chunkJWRNMNWIjs.loadContent.call(void 0, {
112
+ client: getClient(),
113
+ siteId: config.siteId,
114
+ path,
115
+ preview
116
+ });
117
+ if (customMetadata) {
118
+ return customMetadata({ content, path, preview, searchParams });
119
+ }
120
+ const resolvedUrl = _nullishCoalesce(_nullishCoalesce(siteUrl, () => ( (preview ? config.previewUrl : config.liveUrl))), () => ( ""));
121
+ if (!resolvedUrl) {
122
+ console.warn(
123
+ "[createCatchAllPage] No siteUrl configured. OpenGraph and Twitter tags will have relative URLs which may cause social sharing previews to fail. Set siteUrl option, or config.liveUrl/config.previewUrl in your riverbank.config."
124
+ );
125
+ }
126
+ const page = _chunkJWRNMNWIjs.isPageContent.call(void 0, content) ? content.page : _chunkJWRNMNWIjs.isEntryContent.call(void 0, content) ? {
127
+ name: _nullishCoalesce(content.entry.metaTitle, () => ( content.entry.title)),
128
+ purpose: _nullishCoalesce(content.entry.metaDescription, () => ( void 0))
129
+ } : { name: "Page" };
130
+ const metadataGenerator = preview ? _chunkBNQV3PXPjs.generatePreviewMetadata : _chunkBNQV3PXPjs.generatePageMetadata;
131
+ return metadataGenerator({
132
+ page,
133
+ site: content.site,
134
+ path,
135
+ siteUrl: resolvedUrl
136
+ });
137
+ } catch (error) {
138
+ console.debug("[createCatchAllPage] Failed to generate metadata for path:", path, error);
139
+ return {
140
+ title: "Page Not Found",
141
+ robots: { index: false, follow: false }
142
+ };
143
+ }
144
+ }
145
+ return {
146
+ Page: Page2,
147
+ generateMetadata: generateMetadataFn
148
+ };
149
+ }
150
+
151
+ // src/rendering/hooks/usePage.ts
152
+ var _react = require('react');
153
+
154
+ // src/rendering/hooks/useContent.ts
155
+
156
+
157
+ // src/next/static-params.ts
158
+ function validateStaticParamsEnv() {
159
+ const apiKey = process.env.RIVERBANK_API_KEY;
160
+ const siteId = process.env.RIVERBANK_SITE_ID;
161
+ const baseUrl = process.env.NEXT_PUBLIC_DASHBOARD_URL;
162
+ const missingVars = [];
163
+ if (!apiKey) missingVars.push("RIVERBANK_API_KEY");
164
+ if (!siteId) missingVars.push("RIVERBANK_SITE_ID");
165
+ if (!baseUrl) missingVars.push("NEXT_PUBLIC_DASHBOARD_URL");
166
+ if (missingVars.length > 0) {
167
+ return { valid: false, missingVars };
168
+ }
169
+ return {
170
+ valid: true,
171
+ config: { apiKey, siteId, baseUrl }
172
+ };
173
+ }
174
+ function pathToSlugArray(path) {
175
+ if (path === "/") return [];
176
+ return path.slice(1).split("/");
177
+ }
178
+ async function generateAllStaticParams() {
179
+ const envResult = validateStaticParamsEnv();
180
+ if (!envResult.valid) {
181
+ throw new Error(
182
+ `[Riverbank] generateAllStaticParams requires env vars: ${envResult.missingVars.join(", ")}. This error prevents accidentally deploying with zero static pages.`
183
+ );
184
+ }
185
+ const { apiKey, siteId: _siteId, baseUrl } = envResult.config;
186
+ const _client = _chunkHMENX4Y7js.createRiverbankClient.call(void 0, {
187
+ apiKey,
188
+ baseUrl,
189
+ // Disable caching for build-time fetches
190
+ cache: { enabled: false },
191
+ // Disable resilience for build-time fetches (want fast failure)
192
+ resilience: { enabled: false }
193
+ });
194
+ console.warn(
195
+ "[Riverbank] generateAllStaticParams: getAllPublishedRoutes API not yet implemented. Pages will be generated on-demand with ISR."
196
+ );
197
+ return [{ slug: [] }];
198
+ }
199
+
200
+ // src/next/index.ts
201
+ var ISR_REVALIDATE_SECONDS = 300;
202
+ function getISRConfig() {
203
+ const preview = _chunkWYNEYDXOjs.isPreviewMode.call(void 0, );
204
+ return {
205
+ revalidate: preview ? 0 : ISR_REVALIDATE_SECONDS,
206
+ isPreview: preview
207
+ };
208
+ }
209
+
210
+
211
+
212
+
213
+
214
+
215
+
216
+ exports.ISR_REVALIDATE_SECONDS = ISR_REVALIDATE_SECONDS; exports.createCatchAllPage = createCatchAllPage; exports.generateAllStaticParams = generateAllStaticParams; exports.getISRConfig = getISRConfig; exports.pathToSlugArray = pathToSlugArray; exports.validateStaticParamsEnv = validateStaticParamsEnv;
217
+ //# sourceMappingURL=next.js.map