@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.
Files changed (157) hide show
  1. package/README.md +1892 -0
  2. package/dist/cli/index.js +327 -0
  3. package/dist/cli/index.js.map +1 -0
  4. package/dist/client/analytics.d.mts +103 -0
  5. package/dist/client/analytics.d.ts +103 -0
  6. package/dist/client/analytics.js +197 -0
  7. package/dist/client/analytics.js.map +1 -0
  8. package/dist/client/analytics.mjs +169 -0
  9. package/dist/client/analytics.mjs.map +1 -0
  10. package/dist/client/bookings.d.mts +89 -0
  11. package/dist/client/bookings.d.ts +89 -0
  12. package/dist/client/bookings.js +34 -0
  13. package/dist/client/bookings.js.map +1 -0
  14. package/dist/client/bookings.mjs +11 -0
  15. package/dist/client/bookings.mjs.map +1 -0
  16. package/dist/client/client.d.mts +195 -0
  17. package/dist/client/client.d.ts +195 -0
  18. package/dist/client/client.js +606 -0
  19. package/dist/client/client.js.map +1 -0
  20. package/dist/client/client.mjs +572 -0
  21. package/dist/client/client.mjs.map +1 -0
  22. package/dist/client/hooks.d.mts +71 -0
  23. package/dist/client/hooks.d.ts +71 -0
  24. package/dist/client/hooks.js +264 -0
  25. package/dist/client/hooks.js.map +1 -0
  26. package/dist/client/hooks.mjs +235 -0
  27. package/dist/client/hooks.mjs.map +1 -0
  28. package/dist/client/rendering/client.d.mts +1 -0
  29. package/dist/client/rendering/client.d.ts +1 -0
  30. package/dist/client/rendering/client.js +33 -0
  31. package/dist/client/rendering/client.js.map +1 -0
  32. package/dist/client/rendering/client.mjs +8 -0
  33. package/dist/client/rendering/client.mjs.map +1 -0
  34. package/dist/client/usePage-BvKAa3Zw.d.mts +366 -0
  35. package/dist/client/usePage-BvKAa3Zw.d.ts +366 -0
  36. package/dist/server/chunk-2RW5HAQQ.mjs +86 -0
  37. package/dist/server/chunk-2RW5HAQQ.mjs.map +1 -0
  38. package/dist/server/chunk-3KKZVGH4.mjs +179 -0
  39. package/dist/server/chunk-3KKZVGH4.mjs.map +1 -0
  40. package/dist/server/chunk-4Z3GPTCS.js +179 -0
  41. package/dist/server/chunk-4Z3GPTCS.js.map +1 -0
  42. package/dist/server/chunk-4Z5FBFRL.mjs +211 -0
  43. package/dist/server/chunk-4Z5FBFRL.mjs.map +1 -0
  44. package/dist/server/chunk-ADREPXFU.js +86 -0
  45. package/dist/server/chunk-ADREPXFU.js.map +1 -0
  46. package/dist/server/chunk-F472SMKX.js +140 -0
  47. package/dist/server/chunk-F472SMKX.js.map +1 -0
  48. package/dist/server/chunk-GWBMJPLH.mjs +57 -0
  49. package/dist/server/chunk-GWBMJPLH.mjs.map +1 -0
  50. package/dist/server/chunk-JB4LIEFS.js +85 -0
  51. package/dist/server/chunk-JB4LIEFS.js.map +1 -0
  52. package/dist/server/chunk-PEAXKTDU.mjs +140 -0
  53. package/dist/server/chunk-PEAXKTDU.mjs.map +1 -0
  54. package/dist/server/chunk-QQ6U4QX6.js +120 -0
  55. package/dist/server/chunk-QQ6U4QX6.js.map +1 -0
  56. package/dist/server/chunk-R5YGLRUG.mjs +122 -0
  57. package/dist/server/chunk-R5YGLRUG.mjs.map +1 -0
  58. package/dist/server/chunk-SW7LE4M3.js +211 -0
  59. package/dist/server/chunk-SW7LE4M3.js.map +1 -0
  60. package/dist/server/chunk-W3K7LVPS.mjs +120 -0
  61. package/dist/server/chunk-W3K7LVPS.mjs.map +1 -0
  62. package/dist/server/chunk-WKG57P2H.mjs +85 -0
  63. package/dist/server/chunk-WKG57P2H.mjs.map +1 -0
  64. package/dist/server/chunk-YHEZMVTS.js +122 -0
  65. package/dist/server/chunk-YHEZMVTS.js.map +1 -0
  66. package/dist/server/chunk-YXDDFG3N.js +57 -0
  67. package/dist/server/chunk-YXDDFG3N.js.map +1 -0
  68. package/dist/server/components.d.mts +49 -0
  69. package/dist/server/components.d.ts +49 -0
  70. package/dist/server/components.js +22 -0
  71. package/dist/server/components.js.map +1 -0
  72. package/dist/server/components.mjs +22 -0
  73. package/dist/server/components.mjs.map +1 -0
  74. package/dist/server/config-validation.d.mts +300 -0
  75. package/dist/server/config-validation.d.ts +300 -0
  76. package/dist/server/config-validation.js +50 -0
  77. package/dist/server/config-validation.js.map +1 -0
  78. package/dist/server/config-validation.mjs +50 -0
  79. package/dist/server/config-validation.mjs.map +1 -0
  80. package/dist/server/config.d.mts +38 -0
  81. package/dist/server/config.d.ts +38 -0
  82. package/dist/server/config.js +44 -0
  83. package/dist/server/config.js.map +1 -0
  84. package/dist/server/config.mjs +44 -0
  85. package/dist/server/config.mjs.map +1 -0
  86. package/dist/server/data.d.mts +108 -0
  87. package/dist/server/data.d.ts +108 -0
  88. package/dist/server/data.js +15 -0
  89. package/dist/server/data.js.map +1 -0
  90. package/dist/server/data.mjs +15 -0
  91. package/dist/server/data.mjs.map +1 -0
  92. package/dist/server/index-B0yI_V6Z.d.mts +18 -0
  93. package/dist/server/index-C6M0Wfjq.d.ts +18 -0
  94. package/dist/server/index.d.mts +5 -0
  95. package/dist/server/index.d.ts +5 -0
  96. package/dist/server/index.js +12 -0
  97. package/dist/server/index.js.map +1 -0
  98. package/dist/server/index.mjs +12 -0
  99. package/dist/server/index.mjs.map +1 -0
  100. package/dist/server/loadContent-CJcbYF3J.d.ts +152 -0
  101. package/dist/server/loadContent-zhlL4YSE.d.mts +152 -0
  102. package/dist/server/loadPage-BYmVMk0V.d.ts +216 -0
  103. package/dist/server/loadPage-CCf15nt8.d.mts +216 -0
  104. package/dist/server/loadPage-DVH3DW6E.js +9 -0
  105. package/dist/server/loadPage-DVH3DW6E.js.map +1 -0
  106. package/dist/server/loadPage-PHQZ6XQZ.mjs +9 -0
  107. package/dist/server/loadPage-PHQZ6XQZ.mjs.map +1 -0
  108. package/dist/server/metadata.d.mts +135 -0
  109. package/dist/server/metadata.d.ts +135 -0
  110. package/dist/server/metadata.js +68 -0
  111. package/dist/server/metadata.js.map +1 -0
  112. package/dist/server/metadata.mjs +68 -0
  113. package/dist/server/metadata.mjs.map +1 -0
  114. package/dist/server/rendering/server.d.mts +83 -0
  115. package/dist/server/rendering/server.d.ts +83 -0
  116. package/dist/server/rendering/server.js +14 -0
  117. package/dist/server/rendering/server.js.map +1 -0
  118. package/dist/server/rendering/server.mjs +14 -0
  119. package/dist/server/rendering/server.mjs.map +1 -0
  120. package/dist/server/rendering.d.mts +12 -0
  121. package/dist/server/rendering.d.ts +12 -0
  122. package/dist/server/rendering.js +40 -0
  123. package/dist/server/rendering.js.map +1 -0
  124. package/dist/server/rendering.mjs +40 -0
  125. package/dist/server/rendering.mjs.map +1 -0
  126. package/dist/server/routing.d.mts +115 -0
  127. package/dist/server/routing.d.ts +115 -0
  128. package/dist/server/routing.js +57 -0
  129. package/dist/server/routing.js.map +1 -0
  130. package/dist/server/routing.mjs +57 -0
  131. package/dist/server/routing.mjs.map +1 -0
  132. package/dist/server/server.d.mts +9 -0
  133. package/dist/server/server.d.ts +9 -0
  134. package/dist/server/server.js +21 -0
  135. package/dist/server/server.js.map +1 -0
  136. package/dist/server/server.mjs +21 -0
  137. package/dist/server/server.mjs.map +1 -0
  138. package/dist/server/theme-bridge.d.mts +232 -0
  139. package/dist/server/theme-bridge.d.ts +232 -0
  140. package/dist/server/theme-bridge.js +231 -0
  141. package/dist/server/theme-bridge.js.map +1 -0
  142. package/dist/server/theme-bridge.mjs +231 -0
  143. package/dist/server/theme-bridge.mjs.map +1 -0
  144. package/dist/server/theme.d.mts +40 -0
  145. package/dist/server/theme.d.ts +40 -0
  146. package/dist/server/theme.js +17 -0
  147. package/dist/server/theme.js.map +1 -0
  148. package/dist/server/theme.mjs +17 -0
  149. package/dist/server/theme.mjs.map +1 -0
  150. package/dist/server/types-BCeqWtI2.d.mts +333 -0
  151. package/dist/server/types-BCeqWtI2.d.ts +333 -0
  152. package/dist/server/types-Bbo01M7P.d.mts +76 -0
  153. package/dist/server/types-Bbo01M7P.d.ts +76 -0
  154. package/dist/server/types-C6gmRHLe.d.mts +150 -0
  155. package/dist/server/types-C6gmRHLe.d.ts +150 -0
  156. package/package.json +147 -0
  157. package/src/styles/index.css +10 -0
@@ -0,0 +1,366 @@
1
+ import { APIEndpoints } from '@riverbankcms/api';
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
+
6
+ type SiteResponse = NonNullable<APIEndpoints['getSite']['response']>;
7
+ type PageResponse = NonNullable<APIEndpoints['getContentByPath']['response']>;
8
+ type EntriesResponse = NonNullable<APIEndpoints['listPublishedEntries']['response']>;
9
+ type EntryResponse = NonNullable<APIEndpoints['getPublishedEntryPreview']['response']>;
10
+ type PublicFormResponse = NonNullable<APIEndpoints['getPublicFormById']['response']>;
11
+ type PublicBookingServicesResponse = NonNullable<APIEndpoints['getPublicBookingServices']['response']>;
12
+ type PublicEventsResponse = NonNullable<APIEndpoints['listPublicEvents']['response']>;
13
+ /**
14
+ * Configuration for creating a Riverbank CMS client
15
+ */
16
+ interface RiverbankClientConfig {
17
+ /**
18
+ * API key for authentication (format: bld_live_... or bld_test_...)
19
+ */
20
+ apiKey: string;
21
+ /**
22
+ * Base URL for the Riverbank CMS API (required; e.g. https://dashboard.example.com/api)
23
+ */
24
+ baseUrl: string;
25
+ /**
26
+ * Cache configuration
27
+ */
28
+ cache?: {
29
+ /**
30
+ * Enable caching (default: true)
31
+ */
32
+ enabled?: boolean;
33
+ /**
34
+ * Time-to-live for cached responses in seconds
35
+ * @default 300 (5 minutes)
36
+ */
37
+ ttl?: number;
38
+ /**
39
+ * Maximum number of cached responses
40
+ * @default 100
41
+ */
42
+ maxSize?: number;
43
+ };
44
+ }
45
+ /**
46
+ * Riverbank CMS client interface
47
+ */
48
+ interface RiverbankClient {
49
+ /**
50
+ * Fetch site data by slug, domain, or ID
51
+ */
52
+ getSite(params: {
53
+ slug?: string;
54
+ domain?: string;
55
+ id?: string;
56
+ }): Promise<SiteResponse>;
57
+ /**
58
+ * Fetch a specific page by path
59
+ *
60
+ * @param params.preview - If true, returns draft content instead of published content (requires API key with site access)
61
+ */
62
+ getPage(params: {
63
+ siteId: string;
64
+ path: string;
65
+ preview?: boolean;
66
+ }): Promise<PageResponse>;
67
+ /**
68
+ * Fetch published content entries with optional pagination, sorting, and preview mode
69
+ *
70
+ * @param params.siteId - The site ID
71
+ * @param params.contentType - The content type key (e.g., 'blog-post', 'product')
72
+ * @param params.limit - Maximum number of entries to return
73
+ * @param params.order - Sort order: 'newest' (published_at desc) or 'oldest' (published_at asc)
74
+ * @param params.preview - If true, includes draft entries (requires API key with site access)
75
+ * @param params.mode - 'query' for automatic fetching, 'manual' for specific entry IDs
76
+ * @param params.entryIds - Array of entry IDs to fetch (only used when mode is 'manual')
77
+ *
78
+ * @example
79
+ * ```ts
80
+ * // Fetch latest 10 blog posts
81
+ * const entries = await client.getEntries({
82
+ * siteId: 'site-id',
83
+ * contentType: 'blog-post',
84
+ * limit: 10,
85
+ * order: 'newest',
86
+ * });
87
+ *
88
+ * // Fetch draft entries for preview
89
+ * const drafts = await client.getEntries({
90
+ * siteId: 'site-id',
91
+ * contentType: 'blog-post',
92
+ * preview: true,
93
+ * });
94
+ *
95
+ * // Fetch specific entries by ID (manual mode)
96
+ * const specific = await client.getEntries({
97
+ * siteId: 'site-id',
98
+ * contentType: 'blog-post',
99
+ * mode: 'manual',
100
+ * entryIds: ['uuid-1', 'uuid-2'],
101
+ * });
102
+ * ```
103
+ */
104
+ getEntries(params: {
105
+ siteId: string;
106
+ contentType: string;
107
+ limit?: number;
108
+ /** Sort order for entries. 'order' uses custom ordering (default behavior). */
109
+ order?: 'newest' | 'oldest' | 'title' | 'order';
110
+ preview?: boolean;
111
+ /** Selection mode: 'query' for automatic, 'manual' for specific entry IDs */
112
+ mode?: 'query' | 'manual';
113
+ /** Entry IDs to fetch when mode is 'manual' */
114
+ entryIds?: string[];
115
+ }): Promise<EntriesResponse>;
116
+ /**
117
+ * Fetch a specific content entry by slug
118
+ */
119
+ getEntry(params: {
120
+ siteId: string;
121
+ contentType: string;
122
+ slug: string;
123
+ }): Promise<EntryResponse>;
124
+ /**
125
+ * Fetch a public form definition by ID
126
+ */
127
+ getPublicFormById(params: {
128
+ formId: string;
129
+ }): Promise<PublicFormResponse>;
130
+ /**
131
+ * Fetch public booking services for a site
132
+ */
133
+ getPublicBookingServices(params: {
134
+ siteId: string;
135
+ ids?: string;
136
+ }): Promise<PublicBookingServicesResponse>;
137
+ /**
138
+ * List public events for a site (optionally time-filtered)
139
+ */
140
+ listPublicEvents(params: {
141
+ siteId: string;
142
+ limit?: number;
143
+ from?: string;
144
+ to?: string;
145
+ stage?: string;
146
+ }): Promise<PublicEventsResponse>;
147
+ /**
148
+ * Force clear the cache
149
+ */
150
+ clearCache(): void;
151
+ }
152
+
153
+ /**
154
+ * Server-side helper to fetch all data needed for <Page> component.
155
+ *
156
+ * Use this in server components, getServerSideProps, or API routes.
157
+ */
158
+
159
+ /**
160
+ * SDK config from API response (without siteId which is stripped at storage).
161
+ * This is the runtime representation - for defining configs, use RiverbankSiteConfig.
162
+ */
163
+ type RuntimeSdkConfig = NonNullable<SiteResponse['sdkConfig']>;
164
+
165
+ type PageProps = {
166
+ page: PageOutline;
167
+ theme: Theme;
168
+ siteId: string;
169
+ themeTokens?: ThemeTokens;
170
+ resolvedData?: ResolvedBlockData;
171
+ routeMap?: RouteMap;
172
+ /**
173
+ * SDK site configuration containing theme palette overrides.
174
+ * When provided, the SDK palette tokens are merged into the theme tokens,
175
+ * allowing blocks to use SDK-defined color tokens for section backgrounds.
176
+ */
177
+ sdkConfig?: RuntimeSdkConfig | null;
178
+ /**
179
+ * Additional context data for content entry pages.
180
+ * Used to pass occurrence context and content entry data to blocks.
181
+ */
182
+ dataContext?: {
183
+ /** Occurrence context for event pages (from URL like /events/yoga/2025-01-15) */
184
+ occurrenceContext?: OccurrenceContextData | null;
185
+ /** Content entry data for template pages */
186
+ contentEntry?: Record<string, unknown> | null;
187
+ };
188
+ wrapBlock?: (blockId: string, rendered: React.ReactNode) => React.ReactNode;
189
+ registry?: Parameters<typeof PageRenderer>[0]['registry'];
190
+ usePlaceholders?: boolean;
191
+ /**
192
+ * Custom components to override default block rendering.
193
+ * Keys can be full block kind ("block.hero") or short form ("hero").
194
+ *
195
+ * This is SSR-safe - no context or hooks required.
196
+ *
197
+ * @example
198
+ * ```tsx
199
+ * <Page
200
+ * {...pageData}
201
+ * blockOverrides={{
202
+ * 'hero': MyCustomHero,
203
+ * 'block.testimonials': MyCustomTestimonials,
204
+ * }}
205
+ * />
206
+ * ```
207
+ */
208
+ blockOverrides?: BlockOverrides;
209
+ };
210
+ /**
211
+ * Pure renderer for Riverbank CMS pages.
212
+ *
213
+ * This component expects all data to be provided via props.
214
+ * For data fetching, use:
215
+ * - Server-side: `await loadPage({ client, siteId, path })`
216
+ * - Client-side: `usePage({ client, siteId, path })`
217
+ *
218
+ * @example Server-side (Next.js App Router)
219
+ * ```tsx
220
+ * import { createRiverbankClient } from '@riverbankcms/sdk';
221
+ * import { loadPage, Page } from '@riverbankcms/sdk/rendering';
222
+ *
223
+ * const client = createRiverbankClient({ apiKey, baseUrl });
224
+ *
225
+ * export default async function PageRoute({ params }) {
226
+ * const pageData = await loadPage({
227
+ * client,
228
+ * siteId: 'site-id',
229
+ * path: `/${params.slug}`,
230
+ * });
231
+ *
232
+ * return <Page {...pageData} />;
233
+ * }
234
+ * ```
235
+ *
236
+ * @example Client-side
237
+ * ```tsx
238
+ * import { createRiverbankClient } from '@riverbankcms/sdk';
239
+ * import { usePage, Page } from '@riverbankcms/sdk/rendering';
240
+ *
241
+ * const client = createRiverbankClient({ apiKey, baseUrl });
242
+ *
243
+ * function MyPage({ path }) {
244
+ * const pageData = usePage({ client, siteId: 'site-id', path });
245
+ *
246
+ * if (pageData.loading) return <LoadingState />;
247
+ * if (pageData.error) return <ErrorState error={pageData.error} />;
248
+ * if (!pageData.page) return <NotFound />;
249
+ *
250
+ * return <Page {...pageData} />;
251
+ * }
252
+ * ```
253
+ */
254
+ declare function Page({ page, theme, themeTokens: providedTokens, siteId, resolvedData, routeMap, wrapBlock, registry, usePlaceholders, blockOverrides, sdkConfig, dataContext, }: PageProps): react_jsx_runtime.JSX.Element;
255
+
256
+ /**
257
+ * Client-side React hook to fetch page data.
258
+ *
259
+ * Use this in client components for dynamic page loading.
260
+ */
261
+
262
+ type UsePageParams = {
263
+ client: RiverbankClient;
264
+ siteId: string;
265
+ path: string;
266
+ pageId?: string;
267
+ /**
268
+ * If true, fetches draft/unpublished content instead of published content.
269
+ * This affects both the page structure and block data loaders.
270
+ * Requires API key with site access.
271
+ *
272
+ * @default false
273
+ */
274
+ preview?: boolean;
275
+ };
276
+ type UsePageResult = {
277
+ loading: true;
278
+ error: null;
279
+ page: null;
280
+ theme: null;
281
+ siteId: string;
282
+ resolvedData: null;
283
+ sdkConfig: null;
284
+ } | {
285
+ loading: false;
286
+ error: Error;
287
+ page: null;
288
+ theme: null;
289
+ siteId: string;
290
+ resolvedData: null;
291
+ sdkConfig: null;
292
+ } | {
293
+ loading: false;
294
+ error: null;
295
+ sdkConfig: RuntimeSdkConfig | null;
296
+ } & Omit<PageProps, 'registry' | 'wrapBlock' | 'usePlaceholders' | 'sdkConfig'>;
297
+ /**
298
+ * Client-side React hook to fetch all data needed for <Page> component.
299
+ *
300
+ * Fetches site data, page data, and prefetches block data loaders.
301
+ * Returns loading and error states for proper UI handling.
302
+ *
303
+ * IMPORTANT: The client object should be stable across renders to avoid
304
+ * unnecessary re-fetches. Create it outside your component or use useMemo:
305
+ *
306
+ * ```tsx
307
+ * // ✅ Good - stable reference
308
+ * const client = useMemo(
309
+ * () => createRiverbankClient({ apiKey, baseUrl }),
310
+ * [apiKey, baseUrl]
311
+ * );
312
+ *
313
+ * // ❌ Bad - new client on every render (causes infinite loops)
314
+ * const client = createRiverbankClient({ apiKey, baseUrl });
315
+ * ```
316
+ *
317
+ * @example Basic usage
318
+ * ```tsx
319
+ * import { createRiverbankClient } from '@riverbankcms/sdk';
320
+ * import { usePage, Page } from '@riverbankcms/sdk/rendering';
321
+ *
322
+ * const client = createRiverbankClient({
323
+ * apiKey: process.env.NEXT_PUBLIC_RIVERBANK_API_KEY!,
324
+ * baseUrl: process.env.NEXT_PUBLIC_DASHBOARD_URL + '/api',
325
+ * });
326
+ *
327
+ * function MyPage({ path }: { path: string }) {
328
+ * const pageData = usePage({ client, siteId: 'site-123', path });
329
+ *
330
+ * if (pageData.loading) {
331
+ * return <div>Loading...</div>;
332
+ * }
333
+ *
334
+ * if (pageData.error) {
335
+ * return <div>Error: {pageData.error.message}</div>;
336
+ * }
337
+ *
338
+ * return <Page {...pageData} />;
339
+ * }
340
+ * ```
341
+ *
342
+ * @example With custom loading/error states
343
+ * ```tsx
344
+ * function MyPage({ path }: { path: string }) {
345
+ * const pageData = usePage({ client, siteId: 'site-123', path });
346
+ *
347
+ * if (pageData.loading) {
348
+ * return <Skeleton />;
349
+ * }
350
+ *
351
+ * if (pageData.error) {
352
+ * return (
353
+ * <ErrorBoundary
354
+ * error={pageData.error}
355
+ * onRetry={() => window.location.reload()}
356
+ * />
357
+ * );
358
+ * }
359
+ *
360
+ * return <Page {...pageData} />;
361
+ * }
362
+ * ```
363
+ */
364
+ declare function usePage(params: UsePageParams): UsePageResult;
365
+
366
+ export { type PageResponse as P, type RiverbankClient as R, type SiteResponse as S, type UsePageParams as U, type UsePageResult as a, type PageProps as b, type RiverbankClientConfig as c, Page as d, usePage as u };