@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,235 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
// src/hooks/index.ts
|
|
3
|
+
import { use } from "react";
|
|
4
|
+
|
|
5
|
+
// src/rendering/hooks/usePage.ts
|
|
6
|
+
import { useState, useEffect } from "react";
|
|
7
|
+
|
|
8
|
+
// src/data/prefetchBlockData.ts
|
|
9
|
+
import { prefetchBlockData as prefetchBlockDataCore } from "@riverbankcms/blocks/system/data";
|
|
10
|
+
var SUPPORTED_LOADER_ENDPOINTS = [
|
|
11
|
+
"listPublishedEntries",
|
|
12
|
+
"getPublishedEntryPreview",
|
|
13
|
+
"listPublicEvents",
|
|
14
|
+
"getPublicFormById",
|
|
15
|
+
"getPublicBookingServices"
|
|
16
|
+
];
|
|
17
|
+
async function prefetchBlockData(page, context, client, options) {
|
|
18
|
+
const { customBlocks } = options ?? {};
|
|
19
|
+
const customBlockMap = new Map(
|
|
20
|
+
(customBlocks ?? []).map((block) => [block.id, block])
|
|
21
|
+
);
|
|
22
|
+
return prefetchBlockDataCore(page, context, {
|
|
23
|
+
apiClient: async ({ endpoint, params }) => {
|
|
24
|
+
if (!isSupportedEndpoint(endpoint)) {
|
|
25
|
+
throw new Error(
|
|
26
|
+
`Unsupported loader endpoint: ${endpoint}. SDK only supports: ${SUPPORTED_LOADER_ENDPOINTS.join(", ")}`
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
switch (endpoint) {
|
|
30
|
+
case "listPublishedEntries": {
|
|
31
|
+
const { siteId, type, orderBy, limit, stage, mode, entryIds } = params ?? {};
|
|
32
|
+
if (!siteId || !type) {
|
|
33
|
+
throw new Error("listPublishedEntries requires siteId and type params");
|
|
34
|
+
}
|
|
35
|
+
const parsedLimit = typeof limit === "string" ? Number.parseInt(limit, 10) : typeof limit === "number" ? limit : void 0;
|
|
36
|
+
const order = orderBy === "newest" || orderBy === "oldest" || orderBy === "title" || orderBy === "order" ? orderBy : void 0;
|
|
37
|
+
let parsedEntryIds;
|
|
38
|
+
if (mode === "manual" && Array.isArray(entryIds)) {
|
|
39
|
+
parsedEntryIds = entryIds.map((item) => {
|
|
40
|
+
if (typeof item === "object" && item !== null && "entryId" in item) {
|
|
41
|
+
return item.entryId;
|
|
42
|
+
}
|
|
43
|
+
if (typeof item === "string") {
|
|
44
|
+
return item;
|
|
45
|
+
}
|
|
46
|
+
return null;
|
|
47
|
+
}).filter((id) => id !== null);
|
|
48
|
+
}
|
|
49
|
+
return await client.getEntries({
|
|
50
|
+
siteId,
|
|
51
|
+
contentType: type,
|
|
52
|
+
limit: parsedLimit,
|
|
53
|
+
order,
|
|
54
|
+
preview: stage === "preview",
|
|
55
|
+
// Manual mode - pass entry IDs for hydration
|
|
56
|
+
mode: mode === "manual" ? "manual" : void 0,
|
|
57
|
+
entryIds: parsedEntryIds
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
case "getPublishedEntryPreview": {
|
|
61
|
+
const { siteId, type, slug } = params ?? {};
|
|
62
|
+
if (!siteId || !type || !slug) {
|
|
63
|
+
throw new Error("getPublishedEntryPreview requires siteId, type, and slug params");
|
|
64
|
+
}
|
|
65
|
+
return await client.getEntry({ siteId, contentType: type, slug });
|
|
66
|
+
}
|
|
67
|
+
case "listPublicEvents": {
|
|
68
|
+
const { siteId, limit, from, to, stage } = params ?? {};
|
|
69
|
+
if (!siteId) {
|
|
70
|
+
throw new Error("listPublicEvents requires siteId param");
|
|
71
|
+
}
|
|
72
|
+
const parsedLimit = typeof limit === "string" ? Number.parseInt(limit, 10) : typeof limit === "number" ? limit : void 0;
|
|
73
|
+
return await client.listPublicEvents({ siteId, limit: parsedLimit, from, to, stage });
|
|
74
|
+
}
|
|
75
|
+
case "getPublicFormById": {
|
|
76
|
+
const { formId } = params ?? {};
|
|
77
|
+
if (!formId) {
|
|
78
|
+
throw new Error("getPublicFormById requires formId param");
|
|
79
|
+
}
|
|
80
|
+
return await client.getPublicFormById({ formId });
|
|
81
|
+
}
|
|
82
|
+
case "getPublicBookingServices": {
|
|
83
|
+
const { siteId, ids } = params ?? {};
|
|
84
|
+
if (!siteId) {
|
|
85
|
+
throw new Error("getPublicBookingServices requires siteId param");
|
|
86
|
+
}
|
|
87
|
+
return await client.getPublicBookingServices({ siteId, ids });
|
|
88
|
+
}
|
|
89
|
+
default: {
|
|
90
|
+
const _exhaustive = endpoint;
|
|
91
|
+
throw new Error(`Unhandled endpoint: ${_exhaustive}`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
isValidEndpoint: isSupportedEndpoint,
|
|
96
|
+
onError: (error, { block, loader }) => {
|
|
97
|
+
console.warn("[prefetchBlockData] failed to prefetch block data", {
|
|
98
|
+
block,
|
|
99
|
+
loader,
|
|
100
|
+
error
|
|
101
|
+
});
|
|
102
|
+
},
|
|
103
|
+
// Provide custom block loader lookup for SDK custom blocks
|
|
104
|
+
getCustomBlockLoaders: (blockKind) => {
|
|
105
|
+
const customBlock = customBlockMap.get(blockKind);
|
|
106
|
+
if (!customBlock?.dataLoaders) return void 0;
|
|
107
|
+
const loaders = {};
|
|
108
|
+
for (const [key, loader] of Object.entries(customBlock.dataLoaders)) {
|
|
109
|
+
loaders[key] = {
|
|
110
|
+
endpoint: loader.endpoint,
|
|
111
|
+
params: loader.params,
|
|
112
|
+
mode: loader.mode
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
return loaders;
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
function isSupportedEndpoint(endpoint) {
|
|
120
|
+
return SUPPORTED_LOADER_ENDPOINTS.includes(endpoint);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// src/rendering/hooks/usePage.ts
|
|
124
|
+
function usePage(params) {
|
|
125
|
+
const { client, siteId, path, pageId, preview = false } = params;
|
|
126
|
+
const [result, setResult] = useState({
|
|
127
|
+
loading: true,
|
|
128
|
+
error: null,
|
|
129
|
+
page: null,
|
|
130
|
+
theme: null,
|
|
131
|
+
siteId,
|
|
132
|
+
resolvedData: null,
|
|
133
|
+
sdkConfig: null
|
|
134
|
+
});
|
|
135
|
+
useEffect(() => {
|
|
136
|
+
let cancelled = false;
|
|
137
|
+
async function fetchPage() {
|
|
138
|
+
try {
|
|
139
|
+
const [site, pageResponse] = await Promise.all([
|
|
140
|
+
client.getSite({ id: siteId }),
|
|
141
|
+
client.getPage({ siteId, path, preview })
|
|
142
|
+
]);
|
|
143
|
+
if (cancelled) return;
|
|
144
|
+
if ("entry" in pageResponse) {
|
|
145
|
+
throw new Error(
|
|
146
|
+
"This path resolves to a content entry, not a page. Use useContent() instead, which handles both pages and entries. For entries, useContent() returns the raw entry data for custom rendering."
|
|
147
|
+
);
|
|
148
|
+
}
|
|
149
|
+
const { page: pageData } = pageResponse;
|
|
150
|
+
const blocks = pageData.blocks.map((block) => {
|
|
151
|
+
if (!block || typeof block !== "object") {
|
|
152
|
+
throw new Error("Invalid block format in API response");
|
|
153
|
+
}
|
|
154
|
+
if (typeof block.id !== "string" && block.id !== null) {
|
|
155
|
+
throw new Error(`Invalid block id: expected string or null, got ${typeof block.id}`);
|
|
156
|
+
}
|
|
157
|
+
if (typeof block.kind !== "string") {
|
|
158
|
+
throw new Error(`Invalid block kind: expected string, got ${typeof block.kind}`);
|
|
159
|
+
}
|
|
160
|
+
if (typeof block.purpose !== "string") {
|
|
161
|
+
throw new Error(`Invalid block purpose: expected string, got ${typeof block.purpose}`);
|
|
162
|
+
}
|
|
163
|
+
return {
|
|
164
|
+
id: block.id,
|
|
165
|
+
kind: block.kind,
|
|
166
|
+
purpose: block.purpose
|
|
167
|
+
};
|
|
168
|
+
});
|
|
169
|
+
const pageOutline = {
|
|
170
|
+
name: pageData.name,
|
|
171
|
+
path: pageData.path,
|
|
172
|
+
purpose: pageData.purpose,
|
|
173
|
+
blocks
|
|
174
|
+
};
|
|
175
|
+
const resolvedData = await prefetchBlockData(
|
|
176
|
+
pageOutline,
|
|
177
|
+
{
|
|
178
|
+
siteId,
|
|
179
|
+
pageId: pageId ?? pageData.id,
|
|
180
|
+
previewStage: preview ? "preview" : "published"
|
|
181
|
+
},
|
|
182
|
+
client
|
|
183
|
+
);
|
|
184
|
+
if (cancelled) return;
|
|
185
|
+
setResult({
|
|
186
|
+
loading: false,
|
|
187
|
+
error: null,
|
|
188
|
+
page: pageOutline,
|
|
189
|
+
theme: site.theme,
|
|
190
|
+
siteId,
|
|
191
|
+
resolvedData,
|
|
192
|
+
sdkConfig: site.sdkConfig ?? null
|
|
193
|
+
});
|
|
194
|
+
} catch (error) {
|
|
195
|
+
if (cancelled) return;
|
|
196
|
+
setResult({
|
|
197
|
+
loading: false,
|
|
198
|
+
error: error instanceof Error ? error : new Error(String(error)),
|
|
199
|
+
page: null,
|
|
200
|
+
theme: null,
|
|
201
|
+
siteId,
|
|
202
|
+
resolvedData: null,
|
|
203
|
+
sdkConfig: null
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
fetchPage();
|
|
208
|
+
return () => {
|
|
209
|
+
cancelled = true;
|
|
210
|
+
};
|
|
211
|
+
}, [client, siteId, path, pageId, preview]);
|
|
212
|
+
return result;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
// src/hooks/index.ts
|
|
216
|
+
function useSite(client, params) {
|
|
217
|
+
return use(client.getSite(params));
|
|
218
|
+
}
|
|
219
|
+
function usePageRaw(client, params) {
|
|
220
|
+
return use(client.getPage(params));
|
|
221
|
+
}
|
|
222
|
+
function useEntries(client, params) {
|
|
223
|
+
return use(client.getEntries(params));
|
|
224
|
+
}
|
|
225
|
+
function useEntry(client, params) {
|
|
226
|
+
return use(client.getEntry(params));
|
|
227
|
+
}
|
|
228
|
+
export {
|
|
229
|
+
useEntries,
|
|
230
|
+
useEntry,
|
|
231
|
+
usePage,
|
|
232
|
+
usePageRaw,
|
|
233
|
+
useSite
|
|
234
|
+
};
|
|
235
|
+
//# sourceMappingURL=hooks.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/hooks/index.ts","../../src/rendering/hooks/usePage.ts","../../src/data/prefetchBlockData.ts"],"sourcesContent":["/**\n * React hooks for Riverbank CMS\n *\n * These hooks provide a convenient way to fetch Builder content\n * in React components (both Server and Client Components).\n */\n\nimport { use } from 'react';\nimport type { RiverbankClient, SiteResponse } from '../client/types';\n\n// Re-export full client-side page hook with loading states and block data prefetching\nexport { usePage } from '../rendering/hooks/usePage';\nexport type { UsePageParams, UsePageResult } from '../rendering/hooks/usePage';\n\n/**\n * Hook to fetch site data (Server Component compatible)\n *\n * @example Server Component\n * ```tsx\n * const site = use(client.getSite({ slug: 'my-site' }));\n * ```\n *\n * @example Client Component\n * ```tsx\n * 'use client';\n * const [site, setSite] = useState(null);\n * useEffect(() => {\n * client.getSite({ slug: 'my-site' }).then(setSite);\n * }, []);\n * ```\n */\nexport function useSite(\n client: RiverbankClient,\n params: { slug?: string; domain?: string; id?: string }\n): SiteResponse {\n // In React Server Components, use() unwraps the promise\n return use(client.getSite(params));\n}\n\n/**\n * Simple hook to fetch raw page data (Server Component compatible)\n *\n * For a more complete client-side hook with loading states and prefetched data,\n * use the usePage export from this module instead.\n *\n * @example\n * ```tsx\n * const page = use(client.getPage({ siteId: site.site.id, path: '/' }));\n * ```\n */\nexport function usePageRaw(client: RiverbankClient, params: { siteId: string; path: string }) {\n return use(client.getPage(params));\n}\n\n/**\n * Hook to fetch content entries\n *\n * @example\n * ```tsx\n * const entries = use(client.getEntries({ siteId: site.site.id, contentType: 'blog' }));\n * ```\n */\nexport function useEntries(client: RiverbankClient, params: { siteId: string; contentType: string }) {\n return use(client.getEntries(params));\n}\n\n/**\n * Hook to fetch a single content entry\n *\n * @example\n * ```tsx\n * const entry = use(client.getEntry({ siteId: site.site.id, contentType: 'blog', slug: 'my-post' }));\n * ```\n */\nexport function useEntry(\n client: RiverbankClient,\n params: { siteId: string; contentType: string; slug: string }\n) {\n return use(client.getEntry(params));\n}\n\n/**\n * Note: These hooks use React's use() API which works in Server Components.\n * For Client Components, you'll want to wrap these with useState/useEffect\n * or use a data fetching library like SWR or React Query.\n *\n * Example with useState:\n * ```tsx\n * 'use client';\n * import { useState, useEffect } from 'react';\n *\n * function MyComponent({ client }) {\n * const [site, setSite] = useState(null);\n * const [loading, setLoading] = useState(true);\n *\n * useEffect(() => {\n * client.getSite({ slug: 'my-site' })\n * .then(setSite)\n * .finally(() => setLoading(false));\n * }, []);\n *\n * if (loading) return <div>Loading...</div>;\n * return <div>{site.site.title}</div>;\n * }\n * ```\n */\n","/**\n * Client-side React hook to fetch page data.\n *\n * Use this in client components for dynamic page loading.\n */\n\nimport { useState, useEffect } from 'react';\nimport type { RiverbankClient } from '../../client/types';\nimport type { PageProps } from '../components/Page';\nimport type { RuntimeSdkConfig } from '../helpers/loadPage';\nimport { prefetchBlockData } from '../../data/prefetchBlockData';\n\nexport type UsePageParams = {\n client: RiverbankClient;\n siteId: string;\n path: string;\n pageId?: string;\n /**\n * If true, fetches draft/unpublished content instead of published content.\n * This affects both the page structure and block data loaders.\n * Requires API key with site access.\n *\n * @default false\n */\n preview?: boolean;\n};\n\nexport type UsePageResult =\n | { loading: true; error: null; page: null; theme: null; siteId: string; resolvedData: null; sdkConfig: null }\n | { loading: false; error: Error; page: null; theme: null; siteId: string; resolvedData: null; sdkConfig: null }\n | { loading: false; error: null; sdkConfig: RuntimeSdkConfig | null } & Omit<PageProps, 'registry' | 'wrapBlock' | 'usePlaceholders' | 'sdkConfig'>;\n\n/**\n * Client-side React hook to fetch all data needed for <Page> component.\n *\n * Fetches site data, page data, and prefetches block data loaders.\n * Returns loading and error states for proper UI handling.\n *\n * IMPORTANT: The client object should be stable across renders to avoid\n * unnecessary re-fetches. Create it outside your component or use useMemo:\n *\n * ```tsx\n * // ✅ Good - stable reference\n * const client = useMemo(\n * () => createRiverbankClient({ apiKey, baseUrl }),\n * [apiKey, baseUrl]\n * );\n *\n * // ❌ Bad - new client on every render (causes infinite loops)\n * const client = createRiverbankClient({ apiKey, baseUrl });\n * ```\n *\n * @example Basic usage\n * ```tsx\n * import { createRiverbankClient } from '@riverbankcms/sdk';\n * import { usePage, Page } from '@riverbankcms/sdk/rendering';\n *\n * const client = createRiverbankClient({\n * apiKey: process.env.NEXT_PUBLIC_RIVERBANK_API_KEY!,\n * baseUrl: process.env.NEXT_PUBLIC_DASHBOARD_URL + '/api',\n * });\n *\n * function MyPage({ path }: { path: string }) {\n * const pageData = usePage({ client, siteId: 'site-123', path });\n *\n * if (pageData.loading) {\n * return <div>Loading...</div>;\n * }\n *\n * if (pageData.error) {\n * return <div>Error: {pageData.error.message}</div>;\n * }\n *\n * return <Page {...pageData} />;\n * }\n * ```\n *\n * @example With custom loading/error states\n * ```tsx\n * function MyPage({ path }: { path: string }) {\n * const pageData = usePage({ client, siteId: 'site-123', path });\n *\n * if (pageData.loading) {\n * return <Skeleton />;\n * }\n *\n * if (pageData.error) {\n * return (\n * <ErrorBoundary\n * error={pageData.error}\n * onRetry={() => window.location.reload()}\n * />\n * );\n * }\n *\n * return <Page {...pageData} />;\n * }\n * ```\n */\nexport function usePage(params: UsePageParams): UsePageResult {\n const { client, siteId, path, pageId, preview = false } = params;\n\n const [result, setResult] = useState<UsePageResult>({\n loading: true,\n error: null,\n page: null,\n theme: null,\n siteId,\n resolvedData: null,\n sdkConfig: null,\n });\n\n useEffect(() => {\n let cancelled = false;\n\n async function fetchPage() {\n try {\n // Fetch site and page data in parallel\n const [site, pageResponse] = await Promise.all([\n client.getSite({ id: siteId }),\n client.getPage({ siteId, path, preview }),\n ]);\n\n // If component unmounted, don't update state\n if (cancelled) return;\n\n // Extract page data (getContentByPath can return page or entry)\n if ('entry' in pageResponse) {\n throw new Error(\n 'This path resolves to a content entry, not a page. ' +\n 'Use useContent() instead, which handles both pages and entries. ' +\n 'For entries, useContent() returns the raw entry data for custom rendering.'\n );\n }\n\n const { page: pageData } = pageResponse;\n\n // Convert API response blocks to PageOutline format\n // API returns blocks with full content, but PageOutline only needs structure\n const blocks = pageData.blocks.map((block) => {\n if (!block || typeof block !== 'object') {\n throw new Error('Invalid block format in API response');\n }\n if (typeof block.id !== 'string' && block.id !== null) {\n throw new Error(`Invalid block id: expected string or null, got ${typeof block.id}`);\n }\n if (typeof block.kind !== 'string') {\n throw new Error(`Invalid block kind: expected string, got ${typeof block.kind}`);\n }\n if (typeof block.purpose !== 'string') {\n throw new Error(`Invalid block purpose: expected string, got ${typeof block.purpose}`);\n }\n return {\n id: block.id,\n kind: block.kind,\n purpose: block.purpose,\n };\n });\n\n const pageOutline = {\n name: pageData.name,\n path: pageData.path,\n purpose: pageData.purpose,\n blocks,\n };\n\n // Prefetch block data loaders\n const resolvedData = await prefetchBlockData(\n pageOutline,\n {\n siteId,\n pageId: pageId ?? pageData.id,\n previewStage: preview ? 'preview' : 'published',\n },\n client\n );\n\n // If component unmounted, don't update state\n if (cancelled) return;\n\n setResult({\n loading: false,\n error: null,\n page: pageOutline,\n theme: site.theme,\n siteId,\n resolvedData,\n sdkConfig: site.sdkConfig ?? null,\n });\n } catch (error) {\n if (cancelled) return;\n\n setResult({\n loading: false,\n error: error instanceof Error ? error : new Error(String(error)),\n page: null,\n theme: null,\n siteId,\n resolvedData: null,\n sdkConfig: null,\n });\n }\n }\n\n fetchPage();\n\n return () => {\n cancelled = true;\n };\n }, [client, siteId, path, pageId, preview]);\n\n return result;\n}\n","/**\n * SDK wrapper for block data prefetching.\n * Uses the shared core implementation from @riverbankcms/blocks with the SDK client.\n */\n\nimport type { BlockDataLoader, PageOutline, SdkCustomBlock } from '@riverbankcms/blocks';\nimport { prefetchBlockData as prefetchBlockDataCore } from '@riverbankcms/blocks/system/data';\nimport type { PrefetchContext, ResolvedBlockData } from '@riverbankcms/blocks/system/data';\nimport type { RiverbankClient } from '../client/types';\n\nexport type { PrefetchContext, ResolvedBlockData };\n\n/**\n * Supported loader endpoints for SDK data fetching.\n * Only these endpoints can be used in block data loaders when using the SDK.\n *\n * This is the SINGLE SOURCE OF TRUTH for whitelisted endpoints.\n * - Zod validation schema derives from this array\n * - TypeScript types derive from this array\n * - Runtime validation uses this array\n */\nexport const SUPPORTED_LOADER_ENDPOINTS = [\n 'listPublishedEntries',\n 'getPublishedEntryPreview',\n 'listPublicEvents',\n 'getPublicFormById',\n 'getPublicBookingServices',\n] as const;\n\n/**\n * Union type of all supported loader endpoints.\n * Derived from SUPPORTED_LOADER_ENDPOINTS array.\n */\nexport type SupportedLoaderEndpoint = typeof SUPPORTED_LOADER_ENDPOINTS[number];\n\n/**\n * Options for SDK block data prefetching.\n */\nexport type SdkPrefetchOptions = {\n /**\n * SDK custom blocks from site config.\n * Used to look up data loaders for custom.* blocks.\n */\n customBlocks?: SdkCustomBlock[];\n};\n\n/**\n * Prefetch block data for SDK-based applications.\n * Maps loader endpoints to corresponding SDK client methods.\n *\n * Supports both system blocks and SDK custom blocks with data loaders.\n *\n * @example\n * ```typescript\n * import { createRiverbankClient } from '@riverbankcms/sdk';\n * import { prefetchBlockData } from '@riverbankcms/sdk/data';\n *\n * const client = createRiverbankClient({ apiKey, baseUrl });\n * const page = await client.getPage({ siteId, path: '/' });\n *\n * // Basic usage (system blocks only)\n * const blockData = await prefetchBlockData(page.outline, {\n * siteId: page.siteId,\n * pageId: page.id,\n * }, client);\n *\n * // With custom blocks from SDK config\n * const blockData = await prefetchBlockData(page.outline, context, client, {\n * customBlocks: site.sdkConfig?.customBlocks,\n * });\n * ```\n */\nexport async function prefetchBlockData(\n page: PageOutline,\n context: PrefetchContext,\n client: RiverbankClient,\n options?: SdkPrefetchOptions,\n): Promise<ResolvedBlockData> {\n const { customBlocks } = options ?? {};\n\n // Build lookup map for custom block loaders\n // Key is string (blockKind from page) matching block.id (custom.xxx)\n const customBlockMap = new Map<string, SdkCustomBlock>(\n (customBlocks ?? []).map((block) => [block.id as string, block])\n );\n\n return prefetchBlockDataCore(page, context, {\n apiClient: async ({ endpoint, params }) => {\n // Only support whitelisted loader endpoints\n if (!isSupportedEndpoint(endpoint)) {\n throw new Error(\n `Unsupported loader endpoint: ${endpoint}. ` +\n `SDK only supports: ${SUPPORTED_LOADER_ENDPOINTS.join(', ')}`\n );\n }\n\n // Map endpoint to SDK client method\n switch (endpoint) {\n case 'listPublishedEntries': {\n const { siteId, type, orderBy, limit, stage, mode, entryIds } = params ?? {};\n if (!siteId || !type) {\n throw new Error('listPublishedEntries requires siteId and type params');\n }\n\n // Parse limit if provided (can come as string from bindings)\n const parsedLimit = typeof limit === 'string'\n ? Number.parseInt(limit, 10)\n : typeof limit === 'number'\n ? limit\n : undefined;\n\n // Map orderBy to order param (matching embed block field values)\n const order = (orderBy === 'newest' || orderBy === 'oldest' || orderBy === 'title' || orderBy === 'order')\n ? orderBy as 'newest' | 'oldest' | 'title' | 'order'\n : undefined;\n\n // Extract entry IDs for manual mode\n // entryIds comes from binding to entries field which contains { entryId: \"uuid\" } objects\n let parsedEntryIds: string[] | undefined;\n if (mode === 'manual' && Array.isArray(entryIds)) {\n parsedEntryIds = entryIds\n .map((item: unknown) => {\n if (typeof item === 'object' && item !== null && 'entryId' in item) {\n return (item as { entryId: string }).entryId;\n }\n // Also support direct string IDs\n if (typeof item === 'string') {\n return item;\n }\n return null;\n })\n .filter((id): id is string => id !== null);\n }\n\n return await client.getEntries({\n siteId,\n contentType: type,\n limit: parsedLimit,\n order,\n preview: stage === 'preview',\n // Manual mode - pass entry IDs for hydration\n mode: mode === 'manual' ? 'manual' : undefined,\n entryIds: parsedEntryIds,\n });\n }\n\n case 'getPublishedEntryPreview': {\n const { siteId, type, slug } = params ?? {};\n if (!siteId || !type || !slug) {\n throw new Error('getPublishedEntryPreview requires siteId, type, and slug params');\n }\n return await client.getEntry({ siteId, contentType: type, slug });\n }\n case 'listPublicEvents': {\n const { siteId, limit, from, to, stage } = params ?? {};\n if (!siteId) {\n throw new Error('listPublicEvents requires siteId param');\n }\n const parsedLimit =\n typeof limit === 'string'\n ? Number.parseInt(limit, 10)\n : typeof limit === 'number'\n ? limit\n : undefined;\n return await client.listPublicEvents({ siteId, limit: parsedLimit, from, to, stage });\n }\n case 'getPublicFormById': {\n const { formId } = params ?? {};\n if (!formId) {\n throw new Error('getPublicFormById requires formId param');\n }\n return await client.getPublicFormById({ formId });\n }\n case 'getPublicBookingServices': {\n const { siteId, ids } = params ?? {};\n if (!siteId) {\n throw new Error('getPublicBookingServices requires siteId param');\n }\n return await client.getPublicBookingServices({ siteId, ids });\n }\n\n default: {\n // TypeScript should never reach here due to isSupportedEndpoint check\n const _exhaustive: never = endpoint;\n throw new Error(`Unhandled endpoint: ${_exhaustive}`);\n }\n }\n },\n isValidEndpoint: isSupportedEndpoint,\n onError: (error, { block, loader }) => {\n console.warn('[prefetchBlockData] failed to prefetch block data', {\n block,\n loader,\n error,\n });\n },\n // Provide custom block loader lookup for SDK custom blocks\n getCustomBlockLoaders: (blockKind): Record<string, BlockDataLoader> | undefined => {\n const customBlock = customBlockMap.get(blockKind);\n if (!customBlock?.dataLoaders) return undefined;\n\n // Convert SdkConfigLoader to BlockDataLoader\n // SdkConfigLoader.endpoint is SdkLoaderEndpoint (string union) -> string\n // SdkConfigLoader.params is Record<string, LoaderParamValue> -> Record<string, unknown>\n // Both are structurally compatible via covariance\n const loaders: Record<string, BlockDataLoader> = {};\n for (const [key, loader] of Object.entries(customBlock.dataLoaders)) {\n loaders[key] = {\n endpoint: loader.endpoint,\n params: loader.params,\n mode: loader.mode,\n };\n }\n return loaders;\n },\n });\n}\n\n/**\n * Type guard for supported loader endpoints\n */\nfunction isSupportedEndpoint(endpoint: string): endpoint is SupportedLoaderEndpoint {\n return SUPPORTED_LOADER_ENDPOINTS.includes(endpoint as SupportedLoaderEndpoint);\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { clientComponentRegistry } from '@riverbankcms/blocks/client';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { clientComponentRegistry } from '@riverbankcms/blocks/client';
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
"use strict";
|
|
3
|
+
"use client";
|
|
4
|
+
var __defProp = Object.defineProperty;
|
|
5
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
6
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
21
|
+
|
|
22
|
+
// src/rendering/client.ts
|
|
23
|
+
var client_exports = {};
|
|
24
|
+
__export(client_exports, {
|
|
25
|
+
clientComponentRegistry: () => import_client.clientComponentRegistry
|
|
26
|
+
});
|
|
27
|
+
module.exports = __toCommonJS(client_exports);
|
|
28
|
+
var import_client = require("@riverbankcms/blocks/client");
|
|
29
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
30
|
+
0 && (module.exports = {
|
|
31
|
+
clientComponentRegistry
|
|
32
|
+
});
|
|
33
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/rendering/client.ts"],"sourcesContent":["'use client';\n\n// Client component registry for interactive block components.\n// Re-exported for consumers who need to provide a custom registry.\nexport { clientComponentRegistry } from '@riverbankcms/blocks/client';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA,oBAAwC;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/rendering/client.ts"],"sourcesContent":["'use client';\n\n// Client component registry for interactive block components.\n// Re-exported for consumers who need to provide a custom registry.\nexport { clientComponentRegistry } from '@riverbankcms/blocks/client';\n"],"mappings":";;;AAIA,SAAS,+BAA+B;","names":[]}
|