@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.
- package/README.md +175 -0
- package/dist/cli/index.js +42 -95
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init-docs/content/agents-section.md +50 -0
- package/dist/cli/init-docs/content/cli-reference.md +574 -0
- package/dist/cli/init-docs/content/content-management.md +384 -0
- package/dist/cli/init-docs/content/context-brand.md +125 -0
- package/dist/cli/init-docs/content/context-brief.md +77 -0
- package/dist/cli/init-docs/content/context-knowledge.md +111 -0
- package/dist/cli/init-docs/content/getting-started.md +130 -0
- package/dist/cli/init-docs/content/site-workflows-readme.md +96 -0
- package/dist/cli/init-docs/content/workflow-add-block.md +228 -0
- package/dist/cli/init-docs/content/workflow-create-page.md +193 -0
- package/dist/cli/init-docs/content/workflow-publish.md +280 -0
- package/dist/client/client.d.mts +2 -2
- package/dist/client/client.d.ts +2 -2
- package/dist/client/client.js +536 -71
- package/dist/client/client.js.map +1 -1
- package/dist/client/client.mjs +536 -78
- package/dist/client/client.mjs.map +1 -1
- package/dist/client/hooks.d.mts +2 -2
- package/dist/client/hooks.d.ts +2 -2
- package/dist/client/usePage-C9tJpuKa.d.mts +6813 -0
- package/dist/client/usePage-Db9kzA41.d.ts +6813 -0
- package/dist/server/{Layout-wBtJLTVX.d.ts → Layout-Ce7PU9I5.d.ts} +1 -1
- package/dist/server/{Layout-B7cvis7r.d.mts → Layout-WllR8Zug.d.mts} +1 -1
- package/dist/server/{chunk-I7ZR2WO3.mjs → chunk-5JT452F2.mjs} +537 -76
- package/dist/server/chunk-5JT452F2.mjs.map +1 -0
- package/dist/server/{chunk-Z5ZA6Q4D.mjs → chunk-74XUVNOO.mjs} +5 -3
- package/dist/server/chunk-74XUVNOO.mjs.map +1 -0
- package/dist/server/{chunk-3B364WO2.js → chunk-7BVRA5MY.js} +4 -49
- package/dist/server/chunk-7BVRA5MY.js.map +1 -0
- package/dist/server/chunk-AET56TQX.mjs +45 -0
- package/dist/server/chunk-AET56TQX.mjs.map +1 -0
- package/dist/server/chunk-ARNCLSQT.mjs +52 -0
- package/dist/server/chunk-ARNCLSQT.mjs.map +1 -0
- package/dist/server/chunk-BNQV3PXP.js +69 -0
- package/dist/server/chunk-BNQV3PXP.js.map +1 -0
- package/dist/server/{chunk-IVHIQFJH.js → chunk-HMENX4Y7.js} +543 -82
- package/dist/server/chunk-HMENX4Y7.js.map +1 -0
- package/dist/server/{chunk-I2D7KOEA.js → chunk-JWRNMNWI.js} +5 -3
- package/dist/server/chunk-JWRNMNWI.js.map +1 -0
- package/dist/server/chunk-LQUKXIW7.mjs +13 -0
- package/dist/server/chunk-LQUKXIW7.mjs.map +1 -0
- package/dist/server/{chunk-XXFF4RVR.mjs → chunk-RBJFXNDM.mjs} +1 -46
- package/dist/server/chunk-RBJFXNDM.mjs.map +1 -0
- package/dist/server/chunk-SWYWZT3L.mjs +69 -0
- package/dist/server/chunk-SWYWZT3L.mjs.map +1 -0
- package/dist/server/chunk-T26N3P26.js +52 -0
- package/dist/server/chunk-T26N3P26.js.map +1 -0
- package/dist/server/chunk-VODFQMUW.js +45 -0
- package/dist/server/chunk-VODFQMUW.js.map +1 -0
- package/dist/server/chunk-WYNEYDXO.js +13 -0
- package/dist/server/chunk-WYNEYDXO.js.map +1 -0
- package/dist/server/{components-CICSJyp_.d.ts → components--LT61IKp.d.ts} +2 -2
- package/dist/server/{components-CMMwDXTW.d.mts → components-RPzRQve6.d.mts} +2 -2
- package/dist/server/components.d.mts +4 -4
- package/dist/server/components.d.ts +4 -4
- package/dist/server/components.js +5 -4
- package/dist/server/components.js.map +1 -1
- package/dist/server/components.mjs +5 -4
- package/dist/server/config-validation.js +0 -1
- package/dist/server/config-validation.js.map +1 -1
- package/dist/server/config-validation.mjs +0 -1
- package/dist/server/config.js +0 -1
- package/dist/server/config.js.map +1 -1
- package/dist/server/config.mjs +0 -1
- package/dist/server/config.mjs.map +1 -1
- package/dist/server/data.d.mts +1 -1
- package/dist/server/data.d.ts +1 -1
- package/dist/server/data.js +0 -1
- package/dist/server/data.js.map +1 -1
- package/dist/server/data.mjs +0 -1
- package/dist/server/env.d.mts +23 -0
- package/dist/server/env.d.ts +23 -0
- package/dist/server/env.js +7 -0
- package/dist/server/env.js.map +1 -0
- package/dist/server/env.mjs +7 -0
- package/dist/server/index-BL66CU6d.d.mts +130 -0
- package/dist/server/{index-Bucs6UqG.d.mts → index-Bkva0WAj.d.mts} +1 -1
- package/dist/server/index-CJk9iQQW.d.ts +130 -0
- package/dist/server/{index-Cp7tJuRt.d.ts → index-CSBWKA3r.d.ts} +1 -1
- package/dist/server/index.d.mts +3 -3
- package/dist/server/index.d.ts +3 -3
- package/dist/server/index.js +2 -3
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +1 -2
- package/dist/server/index.mjs.map +1 -1
- package/dist/server/{loadContent-Buvmudee.d.ts → loadContent-CXUWMuzY.d.ts} +11 -3
- package/dist/server/{loadContent-BS-3wesN.d.mts → loadContent-F_tAS0Nl.d.mts} +11 -3
- package/dist/server/{loadPage-IDGVDFBB.js → loadPage-6I7F6GRF.js} +1 -2
- package/dist/server/loadPage-6I7F6GRF.js.map +1 -0
- package/dist/server/{loadPage-B8mQUUSo.d.mts → loadPage-CxlYLe5K.d.mts} +1 -1
- package/dist/server/{loadPage-DNQTTRHL.mjs → loadPage-JI2SML4M.mjs} +1 -2
- package/dist/server/{loadPage-DP3nrHBi.d.ts → loadPage-i2r-X5b9.d.ts} +1 -1
- package/dist/server/metadata.d.mts +8 -135
- package/dist/server/metadata.d.ts +8 -135
- package/dist/server/metadata.js +4 -65
- package/dist/server/metadata.js.map +1 -1
- package/dist/server/metadata.mjs +4 -65
- package/dist/server/metadata.mjs.map +1 -1
- package/dist/server/navigation.js +0 -1
- package/dist/server/navigation.js.map +1 -1
- package/dist/server/navigation.mjs +0 -1
- package/dist/server/next/revalidate.d.mts +66 -0
- package/dist/server/next/revalidate.d.ts +66 -0
- package/dist/server/next/revalidate.js +59 -0
- package/dist/server/next/revalidate.js.map +1 -0
- package/dist/server/next/revalidate.mjs +59 -0
- package/dist/server/next/revalidate.mjs.map +1 -0
- package/dist/server/next/tags.d.mts +78 -0
- package/dist/server/next/tags.d.ts +78 -0
- package/dist/server/next/tags.js +34 -0
- package/dist/server/next/tags.js.map +1 -0
- package/dist/server/next/tags.mjs +34 -0
- package/dist/server/next/tags.mjs.map +1 -0
- package/dist/server/next.d.mts +432 -0
- package/dist/server/next.d.ts +432 -0
- package/dist/server/next.js +217 -0
- package/dist/server/next.js.map +1 -0
- package/dist/server/next.mjs +217 -0
- package/dist/server/next.mjs.map +1 -0
- package/dist/server/rendering/server.d.mts +3 -3
- package/dist/server/rendering/server.d.ts +3 -3
- package/dist/server/rendering/server.js +5 -4
- package/dist/server/rendering/server.js.map +1 -1
- package/dist/server/rendering/server.mjs +5 -4
- package/dist/server/rendering.d.mts +6 -6
- package/dist/server/rendering.d.ts +6 -6
- package/dist/server/rendering.js +7 -6
- package/dist/server/rendering.js.map +1 -1
- package/dist/server/rendering.mjs +9 -8
- package/dist/server/routing.d.mts +2 -2
- package/dist/server/routing.d.ts +2 -2
- package/dist/server/routing.js +2 -4
- package/dist/server/routing.js.map +1 -1
- package/dist/server/routing.mjs +1 -3
- package/dist/server/routing.mjs.map +1 -1
- package/dist/server/server.d.mts +4 -4
- package/dist/server/server.d.ts +4 -4
- package/dist/server/server.js +4 -5
- package/dist/server/server.js.map +1 -1
- package/dist/server/server.mjs +5 -6
- package/dist/server/theme-bridge.js +0 -1
- package/dist/server/theme-bridge.js.map +1 -1
- package/dist/server/theme-bridge.mjs +0 -1
- package/dist/server/theme-bridge.mjs.map +1 -1
- package/dist/server/theme.js +1 -3
- package/dist/server/theme.js.map +1 -1
- package/dist/server/theme.mjs +0 -2
- package/dist/server/theme.mjs.map +1 -1
- package/dist/server/{types-BvcJU7zk.d.ts → types-DnkRh0UL.d.ts} +118 -9
- package/dist/server/{types-1cLz0vnq.d.mts → types-MF2AWoKv.d.mts} +118 -9
- package/dist/server/webhooks.d.mts +75 -0
- package/dist/server/webhooks.d.ts +75 -0
- package/dist/server/webhooks.js +11 -0
- package/dist/server/webhooks.js.map +1 -0
- package/dist/server/webhooks.mjs +11 -0
- package/dist/server/webhooks.mjs.map +1 -0
- package/package.json +33 -1
- package/dist/server/chunk-3B364WO2.js.map +0 -1
- package/dist/server/chunk-BJTO5JO5.mjs +0 -11
- package/dist/server/chunk-DGUM43GV.js +0 -11
- package/dist/server/chunk-DGUM43GV.js.map +0 -1
- package/dist/server/chunk-I2D7KOEA.js.map +0 -1
- package/dist/server/chunk-I7ZR2WO3.mjs.map +0 -1
- package/dist/server/chunk-IVHIQFJH.js.map +0 -1
- package/dist/server/chunk-XXFF4RVR.mjs.map +0 -1
- package/dist/server/chunk-Z5ZA6Q4D.mjs.map +0 -1
- package/dist/server/loadPage-IDGVDFBB.js.map +0 -1
- /package/dist/server/{chunk-BJTO5JO5.mjs.map → env.mjs.map} +0 -0
- /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
|