@riverbankcms/sdk 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1892 -0
- package/dist/cli/index.js +327 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/client/analytics.d.mts +103 -0
- package/dist/client/analytics.d.ts +103 -0
- package/dist/client/analytics.js +197 -0
- package/dist/client/analytics.js.map +1 -0
- package/dist/client/analytics.mjs +169 -0
- package/dist/client/analytics.mjs.map +1 -0
- package/dist/client/bookings.d.mts +89 -0
- package/dist/client/bookings.d.ts +89 -0
- package/dist/client/bookings.js +34 -0
- package/dist/client/bookings.js.map +1 -0
- package/dist/client/bookings.mjs +11 -0
- package/dist/client/bookings.mjs.map +1 -0
- package/dist/client/client.d.mts +195 -0
- package/dist/client/client.d.ts +195 -0
- package/dist/client/client.js +606 -0
- package/dist/client/client.js.map +1 -0
- package/dist/client/client.mjs +572 -0
- package/dist/client/client.mjs.map +1 -0
- package/dist/client/hooks.d.mts +71 -0
- package/dist/client/hooks.d.ts +71 -0
- package/dist/client/hooks.js +264 -0
- package/dist/client/hooks.js.map +1 -0
- package/dist/client/hooks.mjs +235 -0
- package/dist/client/hooks.mjs.map +1 -0
- package/dist/client/rendering/client.d.mts +1 -0
- package/dist/client/rendering/client.d.ts +1 -0
- package/dist/client/rendering/client.js +33 -0
- package/dist/client/rendering/client.js.map +1 -0
- package/dist/client/rendering/client.mjs +8 -0
- package/dist/client/rendering/client.mjs.map +1 -0
- package/dist/client/usePage-BvKAa3Zw.d.mts +366 -0
- package/dist/client/usePage-BvKAa3Zw.d.ts +366 -0
- package/dist/server/chunk-2RW5HAQQ.mjs +86 -0
- package/dist/server/chunk-2RW5HAQQ.mjs.map +1 -0
- package/dist/server/chunk-3KKZVGH4.mjs +179 -0
- package/dist/server/chunk-3KKZVGH4.mjs.map +1 -0
- package/dist/server/chunk-4Z3GPTCS.js +179 -0
- package/dist/server/chunk-4Z3GPTCS.js.map +1 -0
- package/dist/server/chunk-4Z5FBFRL.mjs +211 -0
- package/dist/server/chunk-4Z5FBFRL.mjs.map +1 -0
- package/dist/server/chunk-ADREPXFU.js +86 -0
- package/dist/server/chunk-ADREPXFU.js.map +1 -0
- package/dist/server/chunk-F472SMKX.js +140 -0
- package/dist/server/chunk-F472SMKX.js.map +1 -0
- package/dist/server/chunk-GWBMJPLH.mjs +57 -0
- package/dist/server/chunk-GWBMJPLH.mjs.map +1 -0
- package/dist/server/chunk-JB4LIEFS.js +85 -0
- package/dist/server/chunk-JB4LIEFS.js.map +1 -0
- package/dist/server/chunk-PEAXKTDU.mjs +140 -0
- package/dist/server/chunk-PEAXKTDU.mjs.map +1 -0
- package/dist/server/chunk-QQ6U4QX6.js +120 -0
- package/dist/server/chunk-QQ6U4QX6.js.map +1 -0
- package/dist/server/chunk-R5YGLRUG.mjs +122 -0
- package/dist/server/chunk-R5YGLRUG.mjs.map +1 -0
- package/dist/server/chunk-SW7LE4M3.js +211 -0
- package/dist/server/chunk-SW7LE4M3.js.map +1 -0
- package/dist/server/chunk-W3K7LVPS.mjs +120 -0
- package/dist/server/chunk-W3K7LVPS.mjs.map +1 -0
- package/dist/server/chunk-WKG57P2H.mjs +85 -0
- package/dist/server/chunk-WKG57P2H.mjs.map +1 -0
- package/dist/server/chunk-YHEZMVTS.js +122 -0
- package/dist/server/chunk-YHEZMVTS.js.map +1 -0
- package/dist/server/chunk-YXDDFG3N.js +57 -0
- package/dist/server/chunk-YXDDFG3N.js.map +1 -0
- package/dist/server/components.d.mts +49 -0
- package/dist/server/components.d.ts +49 -0
- package/dist/server/components.js +22 -0
- package/dist/server/components.js.map +1 -0
- package/dist/server/components.mjs +22 -0
- package/dist/server/components.mjs.map +1 -0
- package/dist/server/config-validation.d.mts +300 -0
- package/dist/server/config-validation.d.ts +300 -0
- package/dist/server/config-validation.js +50 -0
- package/dist/server/config-validation.js.map +1 -0
- package/dist/server/config-validation.mjs +50 -0
- package/dist/server/config-validation.mjs.map +1 -0
- package/dist/server/config.d.mts +38 -0
- package/dist/server/config.d.ts +38 -0
- package/dist/server/config.js +44 -0
- package/dist/server/config.js.map +1 -0
- package/dist/server/config.mjs +44 -0
- package/dist/server/config.mjs.map +1 -0
- package/dist/server/data.d.mts +108 -0
- package/dist/server/data.d.ts +108 -0
- package/dist/server/data.js +15 -0
- package/dist/server/data.js.map +1 -0
- package/dist/server/data.mjs +15 -0
- package/dist/server/data.mjs.map +1 -0
- package/dist/server/index-B0yI_V6Z.d.mts +18 -0
- package/dist/server/index-C6M0Wfjq.d.ts +18 -0
- package/dist/server/index.d.mts +5 -0
- package/dist/server/index.d.ts +5 -0
- package/dist/server/index.js +12 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/index.mjs +12 -0
- package/dist/server/index.mjs.map +1 -0
- package/dist/server/loadContent-CJcbYF3J.d.ts +152 -0
- package/dist/server/loadContent-zhlL4YSE.d.mts +152 -0
- package/dist/server/loadPage-BYmVMk0V.d.ts +216 -0
- package/dist/server/loadPage-CCf15nt8.d.mts +216 -0
- package/dist/server/loadPage-DVH3DW6E.js +9 -0
- package/dist/server/loadPage-DVH3DW6E.js.map +1 -0
- package/dist/server/loadPage-PHQZ6XQZ.mjs +9 -0
- package/dist/server/loadPage-PHQZ6XQZ.mjs.map +1 -0
- package/dist/server/metadata.d.mts +135 -0
- package/dist/server/metadata.d.ts +135 -0
- package/dist/server/metadata.js +68 -0
- package/dist/server/metadata.js.map +1 -0
- package/dist/server/metadata.mjs +68 -0
- package/dist/server/metadata.mjs.map +1 -0
- package/dist/server/rendering/server.d.mts +83 -0
- package/dist/server/rendering/server.d.ts +83 -0
- package/dist/server/rendering/server.js +14 -0
- package/dist/server/rendering/server.js.map +1 -0
- package/dist/server/rendering/server.mjs +14 -0
- package/dist/server/rendering/server.mjs.map +1 -0
- package/dist/server/rendering.d.mts +12 -0
- package/dist/server/rendering.d.ts +12 -0
- package/dist/server/rendering.js +40 -0
- package/dist/server/rendering.js.map +1 -0
- package/dist/server/rendering.mjs +40 -0
- package/dist/server/rendering.mjs.map +1 -0
- package/dist/server/routing.d.mts +115 -0
- package/dist/server/routing.d.ts +115 -0
- package/dist/server/routing.js +57 -0
- package/dist/server/routing.js.map +1 -0
- package/dist/server/routing.mjs +57 -0
- package/dist/server/routing.mjs.map +1 -0
- package/dist/server/server.d.mts +9 -0
- package/dist/server/server.d.ts +9 -0
- package/dist/server/server.js +21 -0
- package/dist/server/server.js.map +1 -0
- package/dist/server/server.mjs +21 -0
- package/dist/server/server.mjs.map +1 -0
- package/dist/server/theme-bridge.d.mts +232 -0
- package/dist/server/theme-bridge.d.ts +232 -0
- package/dist/server/theme-bridge.js +231 -0
- package/dist/server/theme-bridge.js.map +1 -0
- package/dist/server/theme-bridge.mjs +231 -0
- package/dist/server/theme-bridge.mjs.map +1 -0
- package/dist/server/theme.d.mts +40 -0
- package/dist/server/theme.d.ts +40 -0
- package/dist/server/theme.js +17 -0
- package/dist/server/theme.js.map +1 -0
- package/dist/server/theme.mjs +17 -0
- package/dist/server/theme.mjs.map +1 -0
- package/dist/server/types-BCeqWtI2.d.mts +333 -0
- package/dist/server/types-BCeqWtI2.d.ts +333 -0
- package/dist/server/types-Bbo01M7P.d.mts +76 -0
- package/dist/server/types-Bbo01M7P.d.ts +76 -0
- package/dist/server/types-C6gmRHLe.d.mts +150 -0
- package/dist/server/types-C6gmRHLe.d.ts +150 -0
- package/package.json +147 -0
- package/src/styles/index.css +10 -0
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { Theme } from '@riverbankcms/blocks';
|
|
2
|
+
import { R as RiverbankClient } from './types-C6gmRHLe.js';
|
|
3
|
+
import { b as PageProps } from './loadPage-BYmVMk0V.js';
|
|
4
|
+
import { ResolvedBlockData } from '@riverbankcms/blocks/system/data';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Server-side helper to fetch content (page or entry) by path.
|
|
8
|
+
*
|
|
9
|
+
* Use this for dynamic routing where a path could resolve to either
|
|
10
|
+
* a page or a content entry.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
type LoadContentParams = {
|
|
14
|
+
client: RiverbankClient;
|
|
15
|
+
siteId: string;
|
|
16
|
+
path: string;
|
|
17
|
+
/**
|
|
18
|
+
* If true, fetches draft/unpublished content instead of published content.
|
|
19
|
+
* This affects both pages and entries.
|
|
20
|
+
* Requires API key with site access.
|
|
21
|
+
*
|
|
22
|
+
* @default false
|
|
23
|
+
*/
|
|
24
|
+
preview?: boolean;
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Content entry data returned when a path resolves to an entry
|
|
28
|
+
*/
|
|
29
|
+
type ContentEntryData = {
|
|
30
|
+
id: string;
|
|
31
|
+
/** Content type key (e.g., 'blog-post', 'product') */
|
|
32
|
+
type: string | null;
|
|
33
|
+
title: string;
|
|
34
|
+
slug: string | null;
|
|
35
|
+
path: string | null;
|
|
36
|
+
status: string;
|
|
37
|
+
publishAt: string | null;
|
|
38
|
+
/** The raw content fields - use these to render your own UI */
|
|
39
|
+
content: Record<string, unknown>;
|
|
40
|
+
metaTitle: string | null;
|
|
41
|
+
metaDescription: string | null;
|
|
42
|
+
createdAt: string;
|
|
43
|
+
updatedAt: string;
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* Result when path resolves to a page
|
|
47
|
+
*/
|
|
48
|
+
type PageContentResult = {
|
|
49
|
+
type: 'page';
|
|
50
|
+
/** Page outline ready for rendering with <Page> component */
|
|
51
|
+
page: PageProps['page'];
|
|
52
|
+
/** Site theme for styling */
|
|
53
|
+
theme: Theme;
|
|
54
|
+
/** Site ID */
|
|
55
|
+
siteId: string;
|
|
56
|
+
/** Pre-fetched block data for data loaders */
|
|
57
|
+
resolvedData: ResolvedBlockData;
|
|
58
|
+
};
|
|
59
|
+
/**
|
|
60
|
+
* Result when path resolves to a content entry
|
|
61
|
+
*/
|
|
62
|
+
type EntryContentResult = {
|
|
63
|
+
type: 'entry';
|
|
64
|
+
/** Raw entry data - render this however you want */
|
|
65
|
+
entry: ContentEntryData;
|
|
66
|
+
/** Template page for rendering the entry (if available) */
|
|
67
|
+
templatePage: PageProps['page'] | null;
|
|
68
|
+
/** Pre-fetched block data for template page data loaders */
|
|
69
|
+
resolvedData: ResolvedBlockData;
|
|
70
|
+
/** Data context for template blocks (includes entry content for bindings) */
|
|
71
|
+
dataContext: {
|
|
72
|
+
contentEntry: Record<string, unknown>;
|
|
73
|
+
};
|
|
74
|
+
/** Site theme for styling (useful if rendering with SDK components) */
|
|
75
|
+
theme: Theme;
|
|
76
|
+
/** Site ID */
|
|
77
|
+
siteId: string;
|
|
78
|
+
};
|
|
79
|
+
/**
|
|
80
|
+
* Discriminated union result from loadContent
|
|
81
|
+
*/
|
|
82
|
+
type LoadContentResult = PageContentResult | EntryContentResult;
|
|
83
|
+
/**
|
|
84
|
+
* Type guard to check if result is a page
|
|
85
|
+
*/
|
|
86
|
+
declare function isPageContent(result: LoadContentResult): result is PageContentResult;
|
|
87
|
+
/**
|
|
88
|
+
* Type guard to check if result is an entry
|
|
89
|
+
*/
|
|
90
|
+
declare function isEntryContent(result: LoadContentResult): result is EntryContentResult;
|
|
91
|
+
/**
|
|
92
|
+
* Server-side helper to fetch content by path.
|
|
93
|
+
*
|
|
94
|
+
* Returns a discriminated union - either page data (ready for `<Page>` component)
|
|
95
|
+
* or raw entry data (for custom rendering).
|
|
96
|
+
*
|
|
97
|
+
* @example Dynamic routing with both pages and entries
|
|
98
|
+
* ```tsx
|
|
99
|
+
* import { loadContent, Page, isPageContent } from '@riverbankcms/sdk';
|
|
100
|
+
*
|
|
101
|
+
* export default async function DynamicRoute({ params }) {
|
|
102
|
+
* const content = await loadContent({
|
|
103
|
+
* client,
|
|
104
|
+
* siteId: 'site-123',
|
|
105
|
+
* path: `/${params.slug?.join('/') || ''}`,
|
|
106
|
+
* });
|
|
107
|
+
*
|
|
108
|
+
* if (isPageContent(content)) {
|
|
109
|
+
* return <Page {...content} />;
|
|
110
|
+
* }
|
|
111
|
+
*
|
|
112
|
+
* // Render entry with custom UI
|
|
113
|
+
* return (
|
|
114
|
+
* <article>
|
|
115
|
+
* <h1>{content.entry.title}</h1>
|
|
116
|
+
* <div>{content.entry.content.body}</div>
|
|
117
|
+
* </article>
|
|
118
|
+
* );
|
|
119
|
+
* }
|
|
120
|
+
* ```
|
|
121
|
+
*
|
|
122
|
+
* @example Entry-specific rendering based on content type
|
|
123
|
+
* ```tsx
|
|
124
|
+
* const content = await loadContent({ client, siteId, path });
|
|
125
|
+
*
|
|
126
|
+
* if (content.type === 'entry') {
|
|
127
|
+
* switch (content.entry.type) {
|
|
128
|
+
* case 'blog-post':
|
|
129
|
+
* return <BlogPost entry={content.entry} theme={content.theme} />;
|
|
130
|
+
* case 'product':
|
|
131
|
+
* return <ProductPage entry={content.entry} theme={content.theme} />;
|
|
132
|
+
* default:
|
|
133
|
+
* return <GenericEntry entry={content.entry} />;
|
|
134
|
+
* }
|
|
135
|
+
* }
|
|
136
|
+
*
|
|
137
|
+
* return <Page {...content} />;
|
|
138
|
+
* ```
|
|
139
|
+
*
|
|
140
|
+
* @example Preview mode for draft content
|
|
141
|
+
* ```tsx
|
|
142
|
+
* const content = await loadContent({
|
|
143
|
+
* client,
|
|
144
|
+
* siteId,
|
|
145
|
+
* path,
|
|
146
|
+
* preview: true, // Fetches draft content for both pages and entries
|
|
147
|
+
* });
|
|
148
|
+
* ```
|
|
149
|
+
*/
|
|
150
|
+
declare function loadContent(params: LoadContentParams): Promise<LoadContentResult>;
|
|
151
|
+
|
|
152
|
+
export { type ContentEntryData as C, type EntryContentResult as E, type LoadContentParams as L, type PageContentResult as P, isEntryContent as a, type LoadContentResult as b, isPageContent as i, loadContent as l };
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { Theme } from '@riverbankcms/blocks';
|
|
2
|
+
import { R as RiverbankClient } from './types-C6gmRHLe.mjs';
|
|
3
|
+
import { b as PageProps } from './loadPage-CCf15nt8.mjs';
|
|
4
|
+
import { ResolvedBlockData } from '@riverbankcms/blocks/system/data';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Server-side helper to fetch content (page or entry) by path.
|
|
8
|
+
*
|
|
9
|
+
* Use this for dynamic routing where a path could resolve to either
|
|
10
|
+
* a page or a content entry.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
type LoadContentParams = {
|
|
14
|
+
client: RiverbankClient;
|
|
15
|
+
siteId: string;
|
|
16
|
+
path: string;
|
|
17
|
+
/**
|
|
18
|
+
* If true, fetches draft/unpublished content instead of published content.
|
|
19
|
+
* This affects both pages and entries.
|
|
20
|
+
* Requires API key with site access.
|
|
21
|
+
*
|
|
22
|
+
* @default false
|
|
23
|
+
*/
|
|
24
|
+
preview?: boolean;
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Content entry data returned when a path resolves to an entry
|
|
28
|
+
*/
|
|
29
|
+
type ContentEntryData = {
|
|
30
|
+
id: string;
|
|
31
|
+
/** Content type key (e.g., 'blog-post', 'product') */
|
|
32
|
+
type: string | null;
|
|
33
|
+
title: string;
|
|
34
|
+
slug: string | null;
|
|
35
|
+
path: string | null;
|
|
36
|
+
status: string;
|
|
37
|
+
publishAt: string | null;
|
|
38
|
+
/** The raw content fields - use these to render your own UI */
|
|
39
|
+
content: Record<string, unknown>;
|
|
40
|
+
metaTitle: string | null;
|
|
41
|
+
metaDescription: string | null;
|
|
42
|
+
createdAt: string;
|
|
43
|
+
updatedAt: string;
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* Result when path resolves to a page
|
|
47
|
+
*/
|
|
48
|
+
type PageContentResult = {
|
|
49
|
+
type: 'page';
|
|
50
|
+
/** Page outline ready for rendering with <Page> component */
|
|
51
|
+
page: PageProps['page'];
|
|
52
|
+
/** Site theme for styling */
|
|
53
|
+
theme: Theme;
|
|
54
|
+
/** Site ID */
|
|
55
|
+
siteId: string;
|
|
56
|
+
/** Pre-fetched block data for data loaders */
|
|
57
|
+
resolvedData: ResolvedBlockData;
|
|
58
|
+
};
|
|
59
|
+
/**
|
|
60
|
+
* Result when path resolves to a content entry
|
|
61
|
+
*/
|
|
62
|
+
type EntryContentResult = {
|
|
63
|
+
type: 'entry';
|
|
64
|
+
/** Raw entry data - render this however you want */
|
|
65
|
+
entry: ContentEntryData;
|
|
66
|
+
/** Template page for rendering the entry (if available) */
|
|
67
|
+
templatePage: PageProps['page'] | null;
|
|
68
|
+
/** Pre-fetched block data for template page data loaders */
|
|
69
|
+
resolvedData: ResolvedBlockData;
|
|
70
|
+
/** Data context for template blocks (includes entry content for bindings) */
|
|
71
|
+
dataContext: {
|
|
72
|
+
contentEntry: Record<string, unknown>;
|
|
73
|
+
};
|
|
74
|
+
/** Site theme for styling (useful if rendering with SDK components) */
|
|
75
|
+
theme: Theme;
|
|
76
|
+
/** Site ID */
|
|
77
|
+
siteId: string;
|
|
78
|
+
};
|
|
79
|
+
/**
|
|
80
|
+
* Discriminated union result from loadContent
|
|
81
|
+
*/
|
|
82
|
+
type LoadContentResult = PageContentResult | EntryContentResult;
|
|
83
|
+
/**
|
|
84
|
+
* Type guard to check if result is a page
|
|
85
|
+
*/
|
|
86
|
+
declare function isPageContent(result: LoadContentResult): result is PageContentResult;
|
|
87
|
+
/**
|
|
88
|
+
* Type guard to check if result is an entry
|
|
89
|
+
*/
|
|
90
|
+
declare function isEntryContent(result: LoadContentResult): result is EntryContentResult;
|
|
91
|
+
/**
|
|
92
|
+
* Server-side helper to fetch content by path.
|
|
93
|
+
*
|
|
94
|
+
* Returns a discriminated union - either page data (ready for `<Page>` component)
|
|
95
|
+
* or raw entry data (for custom rendering).
|
|
96
|
+
*
|
|
97
|
+
* @example Dynamic routing with both pages and entries
|
|
98
|
+
* ```tsx
|
|
99
|
+
* import { loadContent, Page, isPageContent } from '@riverbankcms/sdk';
|
|
100
|
+
*
|
|
101
|
+
* export default async function DynamicRoute({ params }) {
|
|
102
|
+
* const content = await loadContent({
|
|
103
|
+
* client,
|
|
104
|
+
* siteId: 'site-123',
|
|
105
|
+
* path: `/${params.slug?.join('/') || ''}`,
|
|
106
|
+
* });
|
|
107
|
+
*
|
|
108
|
+
* if (isPageContent(content)) {
|
|
109
|
+
* return <Page {...content} />;
|
|
110
|
+
* }
|
|
111
|
+
*
|
|
112
|
+
* // Render entry with custom UI
|
|
113
|
+
* return (
|
|
114
|
+
* <article>
|
|
115
|
+
* <h1>{content.entry.title}</h1>
|
|
116
|
+
* <div>{content.entry.content.body}</div>
|
|
117
|
+
* </article>
|
|
118
|
+
* );
|
|
119
|
+
* }
|
|
120
|
+
* ```
|
|
121
|
+
*
|
|
122
|
+
* @example Entry-specific rendering based on content type
|
|
123
|
+
* ```tsx
|
|
124
|
+
* const content = await loadContent({ client, siteId, path });
|
|
125
|
+
*
|
|
126
|
+
* if (content.type === 'entry') {
|
|
127
|
+
* switch (content.entry.type) {
|
|
128
|
+
* case 'blog-post':
|
|
129
|
+
* return <BlogPost entry={content.entry} theme={content.theme} />;
|
|
130
|
+
* case 'product':
|
|
131
|
+
* return <ProductPage entry={content.entry} theme={content.theme} />;
|
|
132
|
+
* default:
|
|
133
|
+
* return <GenericEntry entry={content.entry} />;
|
|
134
|
+
* }
|
|
135
|
+
* }
|
|
136
|
+
*
|
|
137
|
+
* return <Page {...content} />;
|
|
138
|
+
* ```
|
|
139
|
+
*
|
|
140
|
+
* @example Preview mode for draft content
|
|
141
|
+
* ```tsx
|
|
142
|
+
* const content = await loadContent({
|
|
143
|
+
* client,
|
|
144
|
+
* siteId,
|
|
145
|
+
* path,
|
|
146
|
+
* preview: true, // Fetches draft content for both pages and entries
|
|
147
|
+
* });
|
|
148
|
+
* ```
|
|
149
|
+
*/
|
|
150
|
+
declare function loadContent(params: LoadContentParams): Promise<LoadContentResult>;
|
|
151
|
+
|
|
152
|
+
export { type ContentEntryData as C, type EntryContentResult as E, type LoadContentParams as L, type PageContentResult as P, isEntryContent as a, type LoadContentResult as b, isPageContent as i, loadContent as l };
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import { R as RiverbankClient, S as SiteResponse } from './types-C6gmRHLe.js';
|
|
2
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
3
|
+
import { PageOutline, Theme, ThemeTokens, RouteMap, OccurrenceContextData, PageRenderer, BlockOverrides } from '@riverbankcms/blocks';
|
|
4
|
+
import { ResolvedBlockData } from '@riverbankcms/blocks/system/data';
|
|
5
|
+
import { D as DataLoaderOverrides } from './types-Bbo01M7P.js';
|
|
6
|
+
|
|
7
|
+
type PageProps = {
|
|
8
|
+
page: PageOutline;
|
|
9
|
+
theme: Theme;
|
|
10
|
+
siteId: string;
|
|
11
|
+
themeTokens?: ThemeTokens;
|
|
12
|
+
resolvedData?: ResolvedBlockData;
|
|
13
|
+
routeMap?: RouteMap;
|
|
14
|
+
/**
|
|
15
|
+
* SDK site configuration containing theme palette overrides.
|
|
16
|
+
* When provided, the SDK palette tokens are merged into the theme tokens,
|
|
17
|
+
* allowing blocks to use SDK-defined color tokens for section backgrounds.
|
|
18
|
+
*/
|
|
19
|
+
sdkConfig?: RuntimeSdkConfig | null;
|
|
20
|
+
/**
|
|
21
|
+
* Additional context data for content entry pages.
|
|
22
|
+
* Used to pass occurrence context and content entry data to blocks.
|
|
23
|
+
*/
|
|
24
|
+
dataContext?: {
|
|
25
|
+
/** Occurrence context for event pages (from URL like /events/yoga/2025-01-15) */
|
|
26
|
+
occurrenceContext?: OccurrenceContextData | null;
|
|
27
|
+
/** Content entry data for template pages */
|
|
28
|
+
contentEntry?: Record<string, unknown> | null;
|
|
29
|
+
};
|
|
30
|
+
wrapBlock?: (blockId: string, rendered: React.ReactNode) => React.ReactNode;
|
|
31
|
+
registry?: Parameters<typeof PageRenderer>[0]['registry'];
|
|
32
|
+
usePlaceholders?: boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Custom components to override default block rendering.
|
|
35
|
+
* Keys can be full block kind ("block.hero") or short form ("hero").
|
|
36
|
+
*
|
|
37
|
+
* This is SSR-safe - no context or hooks required.
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* ```tsx
|
|
41
|
+
* <Page
|
|
42
|
+
* {...pageData}
|
|
43
|
+
* blockOverrides={{
|
|
44
|
+
* 'hero': MyCustomHero,
|
|
45
|
+
* 'block.testimonials': MyCustomTestimonials,
|
|
46
|
+
* }}
|
|
47
|
+
* />
|
|
48
|
+
* ```
|
|
49
|
+
*/
|
|
50
|
+
blockOverrides?: BlockOverrides;
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* Pure renderer for Riverbank CMS pages.
|
|
54
|
+
*
|
|
55
|
+
* This component expects all data to be provided via props.
|
|
56
|
+
* For data fetching, use:
|
|
57
|
+
* - Server-side: `await loadPage({ client, siteId, path })`
|
|
58
|
+
* - Client-side: `usePage({ client, siteId, path })`
|
|
59
|
+
*
|
|
60
|
+
* @example Server-side (Next.js App Router)
|
|
61
|
+
* ```tsx
|
|
62
|
+
* import { createRiverbankClient } from '@riverbankcms/sdk';
|
|
63
|
+
* import { loadPage, Page } from '@riverbankcms/sdk/rendering';
|
|
64
|
+
*
|
|
65
|
+
* const client = createRiverbankClient({ apiKey, baseUrl });
|
|
66
|
+
*
|
|
67
|
+
* export default async function PageRoute({ params }) {
|
|
68
|
+
* const pageData = await loadPage({
|
|
69
|
+
* client,
|
|
70
|
+
* siteId: 'site-id',
|
|
71
|
+
* path: `/${params.slug}`,
|
|
72
|
+
* });
|
|
73
|
+
*
|
|
74
|
+
* return <Page {...pageData} />;
|
|
75
|
+
* }
|
|
76
|
+
* ```
|
|
77
|
+
*
|
|
78
|
+
* @example Client-side
|
|
79
|
+
* ```tsx
|
|
80
|
+
* import { createRiverbankClient } from '@riverbankcms/sdk';
|
|
81
|
+
* import { usePage, Page } from '@riverbankcms/sdk/rendering';
|
|
82
|
+
*
|
|
83
|
+
* const client = createRiverbankClient({ apiKey, baseUrl });
|
|
84
|
+
*
|
|
85
|
+
* function MyPage({ path }) {
|
|
86
|
+
* const pageData = usePage({ client, siteId: 'site-id', path });
|
|
87
|
+
*
|
|
88
|
+
* if (pageData.loading) return <LoadingState />;
|
|
89
|
+
* if (pageData.error) return <ErrorState error={pageData.error} />;
|
|
90
|
+
* if (!pageData.page) return <NotFound />;
|
|
91
|
+
*
|
|
92
|
+
* return <Page {...pageData} />;
|
|
93
|
+
* }
|
|
94
|
+
* ```
|
|
95
|
+
*/
|
|
96
|
+
declare function Page({ page, theme, themeTokens: providedTokens, siteId, resolvedData, routeMap, wrapBlock, registry, usePlaceholders, blockOverrides, sdkConfig, dataContext, }: PageProps): react_jsx_runtime.JSX.Element;
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Server-side helper to fetch all data needed for <Page> component.
|
|
100
|
+
*
|
|
101
|
+
* Use this in server components, getServerSideProps, or API routes.
|
|
102
|
+
*/
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* SDK config from API response (without siteId which is stripped at storage).
|
|
106
|
+
* This is the runtime representation - for defining configs, use RiverbankSiteConfig.
|
|
107
|
+
*/
|
|
108
|
+
type RuntimeSdkConfig = NonNullable<SiteResponse['sdkConfig']>;
|
|
109
|
+
type LoadPageParams = {
|
|
110
|
+
client: RiverbankClient;
|
|
111
|
+
siteId: string;
|
|
112
|
+
path: string;
|
|
113
|
+
pageId?: string;
|
|
114
|
+
/**
|
|
115
|
+
* If true, fetches draft/unpublished content instead of published content.
|
|
116
|
+
* This affects both the page structure and block data loaders.
|
|
117
|
+
* Requires API key with site access.
|
|
118
|
+
*
|
|
119
|
+
* @default false
|
|
120
|
+
*/
|
|
121
|
+
preview?: boolean;
|
|
122
|
+
/**
|
|
123
|
+
* Code-based data loaders for custom blocks.
|
|
124
|
+
*
|
|
125
|
+
* Use this to fetch data from external APIs (not just whitelisted CMS endpoints).
|
|
126
|
+
* Keys are block kinds (e.g., 'custom.featured-products').
|
|
127
|
+
*
|
|
128
|
+
* Config-based loaders (defined in riverbank.config.ts) run first.
|
|
129
|
+
* Code loaders run second and take precedence on key conflicts.
|
|
130
|
+
*
|
|
131
|
+
* @example
|
|
132
|
+
* ```typescript
|
|
133
|
+
* const pageData = await loadPage({
|
|
134
|
+
* client,
|
|
135
|
+
* siteId: 'site-123',
|
|
136
|
+
* path: '/',
|
|
137
|
+
* dataLoaderOverrides: {
|
|
138
|
+
* 'custom.featured-products': {
|
|
139
|
+
* products: async (ctx) => {
|
|
140
|
+
* const res = await fetch(`https://api.shop.com/products?category=${ctx.content.categoryId}`);
|
|
141
|
+
* return res.json();
|
|
142
|
+
* },
|
|
143
|
+
* },
|
|
144
|
+
* },
|
|
145
|
+
* });
|
|
146
|
+
* ```
|
|
147
|
+
*/
|
|
148
|
+
dataLoaderOverrides?: DataLoaderOverrides;
|
|
149
|
+
};
|
|
150
|
+
type LoadPageResult = Omit<PageProps, 'registry' | 'wrapBlock' | 'usePlaceholders' | 'blockOverrides'> & {
|
|
151
|
+
/**
|
|
152
|
+
* SDK site configuration, if available.
|
|
153
|
+
* Contains SDK-defined theme palette, section backgrounds, and style options.
|
|
154
|
+
*/
|
|
155
|
+
sdkConfig: RuntimeSdkConfig | null;
|
|
156
|
+
};
|
|
157
|
+
/**
|
|
158
|
+
* Server-side helper to fetch all data needed for <Page> component.
|
|
159
|
+
*
|
|
160
|
+
* Fetches site data, page data, and prefetches block data loaders in parallel.
|
|
161
|
+
*
|
|
162
|
+
* @example Next.js App Router (published content)
|
|
163
|
+
* ```tsx
|
|
164
|
+
* import { createRiverbankClient } from '@riverbankcms/sdk';
|
|
165
|
+
* import { loadPage, Page } from '@riverbankcms/sdk/rendering';
|
|
166
|
+
*
|
|
167
|
+
* const client = createRiverbankClient({
|
|
168
|
+
* apiKey: process.env.RIVERBANK_API_KEY!,
|
|
169
|
+
* baseUrl: process.env.NEXT_PUBLIC_DASHBOARD_URL + '/api',
|
|
170
|
+
* });
|
|
171
|
+
*
|
|
172
|
+
* export default async function PageRoute({ params }) {
|
|
173
|
+
* const pageData = await loadPage({
|
|
174
|
+
* client,
|
|
175
|
+
* siteId: 'site-123',
|
|
176
|
+
* path: `/${params.slug || ''}`,
|
|
177
|
+
* });
|
|
178
|
+
*
|
|
179
|
+
* return <Page {...pageData} />;
|
|
180
|
+
* }
|
|
181
|
+
* ```
|
|
182
|
+
*
|
|
183
|
+
* @example Next.js App Router (preview/draft content)
|
|
184
|
+
* ```tsx
|
|
185
|
+
* export default async function PreviewRoute({ params, searchParams }) {
|
|
186
|
+
* const pageData = await loadPage({
|
|
187
|
+
* client,
|
|
188
|
+
* siteId: searchParams.siteId,
|
|
189
|
+
* path: `/${params.slug || ''}`,
|
|
190
|
+
* preview: true, // Fetch draft content
|
|
191
|
+
* });
|
|
192
|
+
*
|
|
193
|
+
* return <Page {...pageData} />;
|
|
194
|
+
* }
|
|
195
|
+
* ```
|
|
196
|
+
*
|
|
197
|
+
* @example Next.js Pages Router (getServerSideProps)
|
|
198
|
+
* ```tsx
|
|
199
|
+
* export async function getServerSideProps({ params }) {
|
|
200
|
+
* const pageData = await loadPage({
|
|
201
|
+
* client,
|
|
202
|
+
* siteId: 'site-123',
|
|
203
|
+
* path: `/${params.slug || ''}`,
|
|
204
|
+
* });
|
|
205
|
+
*
|
|
206
|
+
* return { props: pageData };
|
|
207
|
+
* }
|
|
208
|
+
*
|
|
209
|
+
* export default function PageRoute(props) {
|
|
210
|
+
* return <Page {...props} />;
|
|
211
|
+
* }
|
|
212
|
+
* ```
|
|
213
|
+
*/
|
|
214
|
+
declare function loadPage(params: LoadPageParams): Promise<LoadPageResult>;
|
|
215
|
+
|
|
216
|
+
export { type LoadPageParams as L, Page as P, type RuntimeSdkConfig as R, type LoadPageResult as a, type PageProps as b, loadPage as l };
|