@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,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Code-based data loader types for SDK custom blocks.
|
|
3
|
+
*
|
|
4
|
+
* These types enable SDK sites to define loader functions that fetch
|
|
5
|
+
* data from external APIs (not just CMS endpoints).
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Context provided to code-based data loaders.
|
|
9
|
+
*
|
|
10
|
+
* Contains block metadata and page context for making informed
|
|
11
|
+
* data fetching decisions.
|
|
12
|
+
*/
|
|
13
|
+
interface DataLoaderContext {
|
|
14
|
+
/** Site ID from page context */
|
|
15
|
+
siteId: string;
|
|
16
|
+
/** Page ID from page context */
|
|
17
|
+
pageId: string;
|
|
18
|
+
/** Unique block instance ID */
|
|
19
|
+
blockId: string;
|
|
20
|
+
/** Block kind (e.g., 'custom.featured-products') */
|
|
21
|
+
blockKind: string;
|
|
22
|
+
/**
|
|
23
|
+
* The block's CMS content.
|
|
24
|
+
* Use this to access field values for parameterizing API calls.
|
|
25
|
+
*/
|
|
26
|
+
content: Record<string, unknown>;
|
|
27
|
+
/** Whether fetching preview/draft content */
|
|
28
|
+
previewStage: 'published' | 'preview';
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* A code-based data loader function.
|
|
32
|
+
*
|
|
33
|
+
* Receives context about the block and returns fetched data.
|
|
34
|
+
* Runs server-side during `loadPage()`.
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* ```typescript
|
|
38
|
+
* const productsLoader: DataLoaderFn = async (ctx) => {
|
|
39
|
+
* const categoryId = ctx.content.categoryId;
|
|
40
|
+
* const response = await fetch(`https://api.shop.com/products?category=${categoryId}`);
|
|
41
|
+
* return response.json();
|
|
42
|
+
* };
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
type DataLoaderFn = (context: DataLoaderContext) => Promise<unknown>;
|
|
46
|
+
/**
|
|
47
|
+
* Map of loader key to loader function for a block kind.
|
|
48
|
+
*
|
|
49
|
+
* Keys become the property names in the `data` prop passed to the component.
|
|
50
|
+
*/
|
|
51
|
+
type BlockLoaderMap = Record<string, DataLoaderFn>;
|
|
52
|
+
/**
|
|
53
|
+
* Registry of code-based data loaders.
|
|
54
|
+
*
|
|
55
|
+
* Keys are block kinds (e.g., 'custom.featured-products').
|
|
56
|
+
* Values are maps of loader keys to loader functions.
|
|
57
|
+
*
|
|
58
|
+
* @example
|
|
59
|
+
* ```typescript
|
|
60
|
+
* const dataLoaderOverrides: DataLoaderOverrides = {
|
|
61
|
+
* 'custom.featured-products': {
|
|
62
|
+
* products: async (ctx) => {
|
|
63
|
+
* return fetchProducts(ctx.content.categoryId);
|
|
64
|
+
* },
|
|
65
|
+
* },
|
|
66
|
+
* 'custom.instagram-feed': {
|
|
67
|
+
* posts: async (ctx) => {
|
|
68
|
+
* return fetchInstagramPosts(ctx.content.accessToken);
|
|
69
|
+
* },
|
|
70
|
+
* },
|
|
71
|
+
* };
|
|
72
|
+
* ```
|
|
73
|
+
*/
|
|
74
|
+
type DataLoaderOverrides = Record<string, BlockLoaderMap>;
|
|
75
|
+
|
|
76
|
+
export type { BlockLoaderMap as B, DataLoaderOverrides as D, DataLoaderContext as a, DataLoaderFn as b };
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Code-based data loader types for SDK custom blocks.
|
|
3
|
+
*
|
|
4
|
+
* These types enable SDK sites to define loader functions that fetch
|
|
5
|
+
* data from external APIs (not just CMS endpoints).
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Context provided to code-based data loaders.
|
|
9
|
+
*
|
|
10
|
+
* Contains block metadata and page context for making informed
|
|
11
|
+
* data fetching decisions.
|
|
12
|
+
*/
|
|
13
|
+
interface DataLoaderContext {
|
|
14
|
+
/** Site ID from page context */
|
|
15
|
+
siteId: string;
|
|
16
|
+
/** Page ID from page context */
|
|
17
|
+
pageId: string;
|
|
18
|
+
/** Unique block instance ID */
|
|
19
|
+
blockId: string;
|
|
20
|
+
/** Block kind (e.g., 'custom.featured-products') */
|
|
21
|
+
blockKind: string;
|
|
22
|
+
/**
|
|
23
|
+
* The block's CMS content.
|
|
24
|
+
* Use this to access field values for parameterizing API calls.
|
|
25
|
+
*/
|
|
26
|
+
content: Record<string, unknown>;
|
|
27
|
+
/** Whether fetching preview/draft content */
|
|
28
|
+
previewStage: 'published' | 'preview';
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* A code-based data loader function.
|
|
32
|
+
*
|
|
33
|
+
* Receives context about the block and returns fetched data.
|
|
34
|
+
* Runs server-side during `loadPage()`.
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* ```typescript
|
|
38
|
+
* const productsLoader: DataLoaderFn = async (ctx) => {
|
|
39
|
+
* const categoryId = ctx.content.categoryId;
|
|
40
|
+
* const response = await fetch(`https://api.shop.com/products?category=${categoryId}`);
|
|
41
|
+
* return response.json();
|
|
42
|
+
* };
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
type DataLoaderFn = (context: DataLoaderContext) => Promise<unknown>;
|
|
46
|
+
/**
|
|
47
|
+
* Map of loader key to loader function for a block kind.
|
|
48
|
+
*
|
|
49
|
+
* Keys become the property names in the `data` prop passed to the component.
|
|
50
|
+
*/
|
|
51
|
+
type BlockLoaderMap = Record<string, DataLoaderFn>;
|
|
52
|
+
/**
|
|
53
|
+
* Registry of code-based data loaders.
|
|
54
|
+
*
|
|
55
|
+
* Keys are block kinds (e.g., 'custom.featured-products').
|
|
56
|
+
* Values are maps of loader keys to loader functions.
|
|
57
|
+
*
|
|
58
|
+
* @example
|
|
59
|
+
* ```typescript
|
|
60
|
+
* const dataLoaderOverrides: DataLoaderOverrides = {
|
|
61
|
+
* 'custom.featured-products': {
|
|
62
|
+
* products: async (ctx) => {
|
|
63
|
+
* return fetchProducts(ctx.content.categoryId);
|
|
64
|
+
* },
|
|
65
|
+
* },
|
|
66
|
+
* 'custom.instagram-feed': {
|
|
67
|
+
* posts: async (ctx) => {
|
|
68
|
+
* return fetchInstagramPosts(ctx.content.accessToken);
|
|
69
|
+
* },
|
|
70
|
+
* },
|
|
71
|
+
* };
|
|
72
|
+
* ```
|
|
73
|
+
*/
|
|
74
|
+
type DataLoaderOverrides = Record<string, BlockLoaderMap>;
|
|
75
|
+
|
|
76
|
+
export type { BlockLoaderMap as B, DataLoaderOverrides as D, DataLoaderContext as a, DataLoaderFn as b };
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { APIEndpoints } from '@riverbankcms/api';
|
|
2
|
+
|
|
3
|
+
type SiteResponse = NonNullable<APIEndpoints['getSite']['response']>;
|
|
4
|
+
type PageResponse = NonNullable<APIEndpoints['getContentByPath']['response']>;
|
|
5
|
+
type EntriesResponse = NonNullable<APIEndpoints['listPublishedEntries']['response']>;
|
|
6
|
+
type EntryResponse = NonNullable<APIEndpoints['getPublishedEntryPreview']['response']>;
|
|
7
|
+
type PublicFormResponse = NonNullable<APIEndpoints['getPublicFormById']['response']>;
|
|
8
|
+
type PublicBookingServicesResponse = NonNullable<APIEndpoints['getPublicBookingServices']['response']>;
|
|
9
|
+
type PublicEventsResponse = NonNullable<APIEndpoints['listPublicEvents']['response']>;
|
|
10
|
+
/**
|
|
11
|
+
* Configuration for creating a Riverbank CMS client
|
|
12
|
+
*/
|
|
13
|
+
interface RiverbankClientConfig {
|
|
14
|
+
/**
|
|
15
|
+
* API key for authentication (format: bld_live_... or bld_test_...)
|
|
16
|
+
*/
|
|
17
|
+
apiKey: string;
|
|
18
|
+
/**
|
|
19
|
+
* Base URL for the Riverbank CMS API (required; e.g. https://dashboard.example.com/api)
|
|
20
|
+
*/
|
|
21
|
+
baseUrl: string;
|
|
22
|
+
/**
|
|
23
|
+
* Cache configuration
|
|
24
|
+
*/
|
|
25
|
+
cache?: {
|
|
26
|
+
/**
|
|
27
|
+
* Enable caching (default: true)
|
|
28
|
+
*/
|
|
29
|
+
enabled?: boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Time-to-live for cached responses in seconds
|
|
32
|
+
* @default 300 (5 minutes)
|
|
33
|
+
*/
|
|
34
|
+
ttl?: number;
|
|
35
|
+
/**
|
|
36
|
+
* Maximum number of cached responses
|
|
37
|
+
* @default 100
|
|
38
|
+
*/
|
|
39
|
+
maxSize?: number;
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Riverbank CMS client interface
|
|
44
|
+
*/
|
|
45
|
+
interface RiverbankClient {
|
|
46
|
+
/**
|
|
47
|
+
* Fetch site data by slug, domain, or ID
|
|
48
|
+
*/
|
|
49
|
+
getSite(params: {
|
|
50
|
+
slug?: string;
|
|
51
|
+
domain?: string;
|
|
52
|
+
id?: string;
|
|
53
|
+
}): Promise<SiteResponse>;
|
|
54
|
+
/**
|
|
55
|
+
* Fetch a specific page by path
|
|
56
|
+
*
|
|
57
|
+
* @param params.preview - If true, returns draft content instead of published content (requires API key with site access)
|
|
58
|
+
*/
|
|
59
|
+
getPage(params: {
|
|
60
|
+
siteId: string;
|
|
61
|
+
path: string;
|
|
62
|
+
preview?: boolean;
|
|
63
|
+
}): Promise<PageResponse>;
|
|
64
|
+
/**
|
|
65
|
+
* Fetch published content entries with optional pagination, sorting, and preview mode
|
|
66
|
+
*
|
|
67
|
+
* @param params.siteId - The site ID
|
|
68
|
+
* @param params.contentType - The content type key (e.g., 'blog-post', 'product')
|
|
69
|
+
* @param params.limit - Maximum number of entries to return
|
|
70
|
+
* @param params.order - Sort order: 'newest' (published_at desc) or 'oldest' (published_at asc)
|
|
71
|
+
* @param params.preview - If true, includes draft entries (requires API key with site access)
|
|
72
|
+
* @param params.mode - 'query' for automatic fetching, 'manual' for specific entry IDs
|
|
73
|
+
* @param params.entryIds - Array of entry IDs to fetch (only used when mode is 'manual')
|
|
74
|
+
*
|
|
75
|
+
* @example
|
|
76
|
+
* ```ts
|
|
77
|
+
* // Fetch latest 10 blog posts
|
|
78
|
+
* const entries = await client.getEntries({
|
|
79
|
+
* siteId: 'site-id',
|
|
80
|
+
* contentType: 'blog-post',
|
|
81
|
+
* limit: 10,
|
|
82
|
+
* order: 'newest',
|
|
83
|
+
* });
|
|
84
|
+
*
|
|
85
|
+
* // Fetch draft entries for preview
|
|
86
|
+
* const drafts = await client.getEntries({
|
|
87
|
+
* siteId: 'site-id',
|
|
88
|
+
* contentType: 'blog-post',
|
|
89
|
+
* preview: true,
|
|
90
|
+
* });
|
|
91
|
+
*
|
|
92
|
+
* // Fetch specific entries by ID (manual mode)
|
|
93
|
+
* const specific = await client.getEntries({
|
|
94
|
+
* siteId: 'site-id',
|
|
95
|
+
* contentType: 'blog-post',
|
|
96
|
+
* mode: 'manual',
|
|
97
|
+
* entryIds: ['uuid-1', 'uuid-2'],
|
|
98
|
+
* });
|
|
99
|
+
* ```
|
|
100
|
+
*/
|
|
101
|
+
getEntries(params: {
|
|
102
|
+
siteId: string;
|
|
103
|
+
contentType: string;
|
|
104
|
+
limit?: number;
|
|
105
|
+
/** Sort order for entries. 'order' uses custom ordering (default behavior). */
|
|
106
|
+
order?: 'newest' | 'oldest' | 'title' | 'order';
|
|
107
|
+
preview?: boolean;
|
|
108
|
+
/** Selection mode: 'query' for automatic, 'manual' for specific entry IDs */
|
|
109
|
+
mode?: 'query' | 'manual';
|
|
110
|
+
/** Entry IDs to fetch when mode is 'manual' */
|
|
111
|
+
entryIds?: string[];
|
|
112
|
+
}): Promise<EntriesResponse>;
|
|
113
|
+
/**
|
|
114
|
+
* Fetch a specific content entry by slug
|
|
115
|
+
*/
|
|
116
|
+
getEntry(params: {
|
|
117
|
+
siteId: string;
|
|
118
|
+
contentType: string;
|
|
119
|
+
slug: string;
|
|
120
|
+
}): Promise<EntryResponse>;
|
|
121
|
+
/**
|
|
122
|
+
* Fetch a public form definition by ID
|
|
123
|
+
*/
|
|
124
|
+
getPublicFormById(params: {
|
|
125
|
+
formId: string;
|
|
126
|
+
}): Promise<PublicFormResponse>;
|
|
127
|
+
/**
|
|
128
|
+
* Fetch public booking services for a site
|
|
129
|
+
*/
|
|
130
|
+
getPublicBookingServices(params: {
|
|
131
|
+
siteId: string;
|
|
132
|
+
ids?: string;
|
|
133
|
+
}): Promise<PublicBookingServicesResponse>;
|
|
134
|
+
/**
|
|
135
|
+
* List public events for a site (optionally time-filtered)
|
|
136
|
+
*/
|
|
137
|
+
listPublicEvents(params: {
|
|
138
|
+
siteId: string;
|
|
139
|
+
limit?: number;
|
|
140
|
+
from?: string;
|
|
141
|
+
to?: string;
|
|
142
|
+
stage?: string;
|
|
143
|
+
}): Promise<PublicEventsResponse>;
|
|
144
|
+
/**
|
|
145
|
+
* Force clear the cache
|
|
146
|
+
*/
|
|
147
|
+
clearCache(): void;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
export type { EntriesResponse as E, PageResponse as P, RiverbankClient as R, SiteResponse as S, RiverbankClientConfig as a, EntryResponse as b };
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { APIEndpoints } from '@riverbankcms/api';
|
|
2
|
+
|
|
3
|
+
type SiteResponse = NonNullable<APIEndpoints['getSite']['response']>;
|
|
4
|
+
type PageResponse = NonNullable<APIEndpoints['getContentByPath']['response']>;
|
|
5
|
+
type EntriesResponse = NonNullable<APIEndpoints['listPublishedEntries']['response']>;
|
|
6
|
+
type EntryResponse = NonNullable<APIEndpoints['getPublishedEntryPreview']['response']>;
|
|
7
|
+
type PublicFormResponse = NonNullable<APIEndpoints['getPublicFormById']['response']>;
|
|
8
|
+
type PublicBookingServicesResponse = NonNullable<APIEndpoints['getPublicBookingServices']['response']>;
|
|
9
|
+
type PublicEventsResponse = NonNullable<APIEndpoints['listPublicEvents']['response']>;
|
|
10
|
+
/**
|
|
11
|
+
* Configuration for creating a Riverbank CMS client
|
|
12
|
+
*/
|
|
13
|
+
interface RiverbankClientConfig {
|
|
14
|
+
/**
|
|
15
|
+
* API key for authentication (format: bld_live_... or bld_test_...)
|
|
16
|
+
*/
|
|
17
|
+
apiKey: string;
|
|
18
|
+
/**
|
|
19
|
+
* Base URL for the Riverbank CMS API (required; e.g. https://dashboard.example.com/api)
|
|
20
|
+
*/
|
|
21
|
+
baseUrl: string;
|
|
22
|
+
/**
|
|
23
|
+
* Cache configuration
|
|
24
|
+
*/
|
|
25
|
+
cache?: {
|
|
26
|
+
/**
|
|
27
|
+
* Enable caching (default: true)
|
|
28
|
+
*/
|
|
29
|
+
enabled?: boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Time-to-live for cached responses in seconds
|
|
32
|
+
* @default 300 (5 minutes)
|
|
33
|
+
*/
|
|
34
|
+
ttl?: number;
|
|
35
|
+
/**
|
|
36
|
+
* Maximum number of cached responses
|
|
37
|
+
* @default 100
|
|
38
|
+
*/
|
|
39
|
+
maxSize?: number;
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Riverbank CMS client interface
|
|
44
|
+
*/
|
|
45
|
+
interface RiverbankClient {
|
|
46
|
+
/**
|
|
47
|
+
* Fetch site data by slug, domain, or ID
|
|
48
|
+
*/
|
|
49
|
+
getSite(params: {
|
|
50
|
+
slug?: string;
|
|
51
|
+
domain?: string;
|
|
52
|
+
id?: string;
|
|
53
|
+
}): Promise<SiteResponse>;
|
|
54
|
+
/**
|
|
55
|
+
* Fetch a specific page by path
|
|
56
|
+
*
|
|
57
|
+
* @param params.preview - If true, returns draft content instead of published content (requires API key with site access)
|
|
58
|
+
*/
|
|
59
|
+
getPage(params: {
|
|
60
|
+
siteId: string;
|
|
61
|
+
path: string;
|
|
62
|
+
preview?: boolean;
|
|
63
|
+
}): Promise<PageResponse>;
|
|
64
|
+
/**
|
|
65
|
+
* Fetch published content entries with optional pagination, sorting, and preview mode
|
|
66
|
+
*
|
|
67
|
+
* @param params.siteId - The site ID
|
|
68
|
+
* @param params.contentType - The content type key (e.g., 'blog-post', 'product')
|
|
69
|
+
* @param params.limit - Maximum number of entries to return
|
|
70
|
+
* @param params.order - Sort order: 'newest' (published_at desc) or 'oldest' (published_at asc)
|
|
71
|
+
* @param params.preview - If true, includes draft entries (requires API key with site access)
|
|
72
|
+
* @param params.mode - 'query' for automatic fetching, 'manual' for specific entry IDs
|
|
73
|
+
* @param params.entryIds - Array of entry IDs to fetch (only used when mode is 'manual')
|
|
74
|
+
*
|
|
75
|
+
* @example
|
|
76
|
+
* ```ts
|
|
77
|
+
* // Fetch latest 10 blog posts
|
|
78
|
+
* const entries = await client.getEntries({
|
|
79
|
+
* siteId: 'site-id',
|
|
80
|
+
* contentType: 'blog-post',
|
|
81
|
+
* limit: 10,
|
|
82
|
+
* order: 'newest',
|
|
83
|
+
* });
|
|
84
|
+
*
|
|
85
|
+
* // Fetch draft entries for preview
|
|
86
|
+
* const drafts = await client.getEntries({
|
|
87
|
+
* siteId: 'site-id',
|
|
88
|
+
* contentType: 'blog-post',
|
|
89
|
+
* preview: true,
|
|
90
|
+
* });
|
|
91
|
+
*
|
|
92
|
+
* // Fetch specific entries by ID (manual mode)
|
|
93
|
+
* const specific = await client.getEntries({
|
|
94
|
+
* siteId: 'site-id',
|
|
95
|
+
* contentType: 'blog-post',
|
|
96
|
+
* mode: 'manual',
|
|
97
|
+
* entryIds: ['uuid-1', 'uuid-2'],
|
|
98
|
+
* });
|
|
99
|
+
* ```
|
|
100
|
+
*/
|
|
101
|
+
getEntries(params: {
|
|
102
|
+
siteId: string;
|
|
103
|
+
contentType: string;
|
|
104
|
+
limit?: number;
|
|
105
|
+
/** Sort order for entries. 'order' uses custom ordering (default behavior). */
|
|
106
|
+
order?: 'newest' | 'oldest' | 'title' | 'order';
|
|
107
|
+
preview?: boolean;
|
|
108
|
+
/** Selection mode: 'query' for automatic, 'manual' for specific entry IDs */
|
|
109
|
+
mode?: 'query' | 'manual';
|
|
110
|
+
/** Entry IDs to fetch when mode is 'manual' */
|
|
111
|
+
entryIds?: string[];
|
|
112
|
+
}): Promise<EntriesResponse>;
|
|
113
|
+
/**
|
|
114
|
+
* Fetch a specific content entry by slug
|
|
115
|
+
*/
|
|
116
|
+
getEntry(params: {
|
|
117
|
+
siteId: string;
|
|
118
|
+
contentType: string;
|
|
119
|
+
slug: string;
|
|
120
|
+
}): Promise<EntryResponse>;
|
|
121
|
+
/**
|
|
122
|
+
* Fetch a public form definition by ID
|
|
123
|
+
*/
|
|
124
|
+
getPublicFormById(params: {
|
|
125
|
+
formId: string;
|
|
126
|
+
}): Promise<PublicFormResponse>;
|
|
127
|
+
/**
|
|
128
|
+
* Fetch public booking services for a site
|
|
129
|
+
*/
|
|
130
|
+
getPublicBookingServices(params: {
|
|
131
|
+
siteId: string;
|
|
132
|
+
ids?: string;
|
|
133
|
+
}): Promise<PublicBookingServicesResponse>;
|
|
134
|
+
/**
|
|
135
|
+
* List public events for a site (optionally time-filtered)
|
|
136
|
+
*/
|
|
137
|
+
listPublicEvents(params: {
|
|
138
|
+
siteId: string;
|
|
139
|
+
limit?: number;
|
|
140
|
+
from?: string;
|
|
141
|
+
to?: string;
|
|
142
|
+
stage?: string;
|
|
143
|
+
}): Promise<PublicEventsResponse>;
|
|
144
|
+
/**
|
|
145
|
+
* Force clear the cache
|
|
146
|
+
*/
|
|
147
|
+
clearCache(): void;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
export type { EntriesResponse as E, PageResponse as P, RiverbankClient as R, SiteResponse as S, RiverbankClientConfig as a, EntryResponse as b };
|
package/package.json
ADDED
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@riverbankcms/sdk",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Riverbank CMS SDK for headless content consumption",
|
|
5
|
+
"main": "./dist/server/index.js",
|
|
6
|
+
"module": "./dist/server/index.mjs",
|
|
7
|
+
"types": "./dist/server/index.d.ts",
|
|
8
|
+
"bin": {
|
|
9
|
+
"riverbankcms": "./dist/cli/index.js"
|
|
10
|
+
},
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"types": "./dist/server/index.d.ts",
|
|
14
|
+
"import": "./dist/server/index.mjs",
|
|
15
|
+
"require": "./dist/server/index.js"
|
|
16
|
+
},
|
|
17
|
+
"./client": {
|
|
18
|
+
"types": "./dist/client/client.d.ts",
|
|
19
|
+
"import": "./dist/client/client.mjs",
|
|
20
|
+
"require": "./dist/client/client.js"
|
|
21
|
+
},
|
|
22
|
+
"./server": {
|
|
23
|
+
"types": "./dist/server/server.d.ts",
|
|
24
|
+
"import": "./dist/server/server.mjs",
|
|
25
|
+
"require": "./dist/server/server.js"
|
|
26
|
+
},
|
|
27
|
+
"./components": {
|
|
28
|
+
"types": "./dist/server/components.d.ts",
|
|
29
|
+
"import": "./dist/server/components.mjs",
|
|
30
|
+
"require": "./dist/server/components.js"
|
|
31
|
+
},
|
|
32
|
+
"./rendering": {
|
|
33
|
+
"types": "./dist/server/rendering.d.ts",
|
|
34
|
+
"import": "./dist/server/rendering.mjs",
|
|
35
|
+
"require": "./dist/server/rendering.js"
|
|
36
|
+
},
|
|
37
|
+
"./rendering/client": {
|
|
38
|
+
"types": "./dist/client/rendering/client.d.ts",
|
|
39
|
+
"import": "./dist/client/rendering/client.mjs",
|
|
40
|
+
"require": "./dist/client/rendering/client.js"
|
|
41
|
+
},
|
|
42
|
+
"./rendering/server": {
|
|
43
|
+
"types": "./dist/server/rendering/server.d.ts",
|
|
44
|
+
"import": "./dist/server/rendering/server.mjs",
|
|
45
|
+
"require": "./dist/server/rendering/server.js"
|
|
46
|
+
},
|
|
47
|
+
"./theme": {
|
|
48
|
+
"types": "./dist/server/theme.d.ts",
|
|
49
|
+
"import": "./dist/server/theme.mjs",
|
|
50
|
+
"require": "./dist/server/theme.js"
|
|
51
|
+
},
|
|
52
|
+
"./hooks": {
|
|
53
|
+
"types": "./dist/client/hooks.d.ts",
|
|
54
|
+
"import": "./dist/client/hooks.mjs",
|
|
55
|
+
"require": "./dist/client/hooks.js"
|
|
56
|
+
},
|
|
57
|
+
"./data": {
|
|
58
|
+
"types": "./dist/server/data.d.ts",
|
|
59
|
+
"import": "./dist/server/data.mjs",
|
|
60
|
+
"require": "./dist/server/data.js"
|
|
61
|
+
},
|
|
62
|
+
"./metadata": {
|
|
63
|
+
"types": "./dist/server/metadata.d.ts",
|
|
64
|
+
"import": "./dist/server/metadata.mjs",
|
|
65
|
+
"require": "./dist/server/metadata.js"
|
|
66
|
+
},
|
|
67
|
+
"./routing": {
|
|
68
|
+
"types": "./dist/server/routing.d.ts",
|
|
69
|
+
"import": "./dist/server/routing.mjs",
|
|
70
|
+
"require": "./dist/server/routing.js"
|
|
71
|
+
},
|
|
72
|
+
"./analytics": {
|
|
73
|
+
"types": "./dist/client/analytics.d.ts",
|
|
74
|
+
"import": "./dist/client/analytics.mjs",
|
|
75
|
+
"require": "./dist/client/analytics.js"
|
|
76
|
+
},
|
|
77
|
+
"./config": {
|
|
78
|
+
"types": "./dist/server/config.d.ts",
|
|
79
|
+
"import": "./dist/server/config.mjs",
|
|
80
|
+
"require": "./dist/server/config.js"
|
|
81
|
+
},
|
|
82
|
+
"./config/validation": {
|
|
83
|
+
"types": "./dist/server/config-validation.d.ts",
|
|
84
|
+
"import": "./dist/server/config-validation.mjs",
|
|
85
|
+
"require": "./dist/server/config-validation.js"
|
|
86
|
+
},
|
|
87
|
+
"./bookings": {
|
|
88
|
+
"types": "./dist/client/bookings.d.ts",
|
|
89
|
+
"import": "./dist/client/bookings.mjs",
|
|
90
|
+
"require": "./dist/client/bookings.js"
|
|
91
|
+
},
|
|
92
|
+
"./theme-bridge": {
|
|
93
|
+
"types": "./dist/server/theme-bridge.d.ts",
|
|
94
|
+
"import": "./dist/server/theme-bridge.mjs",
|
|
95
|
+
"require": "./dist/server/theme-bridge.js"
|
|
96
|
+
},
|
|
97
|
+
"./styles.css": "./src/styles/index.css"
|
|
98
|
+
},
|
|
99
|
+
"files": [
|
|
100
|
+
"dist",
|
|
101
|
+
"src/styles",
|
|
102
|
+
"README.md"
|
|
103
|
+
],
|
|
104
|
+
"scripts": {
|
|
105
|
+
"build": "tsup",
|
|
106
|
+
"dev": "tsup --watch",
|
|
107
|
+
"typecheck": "tsc --noEmit",
|
|
108
|
+
"lint": "eslint src",
|
|
109
|
+
"test": "vitest run",
|
|
110
|
+
"verify": "pnpm test"
|
|
111
|
+
},
|
|
112
|
+
"dependencies": {
|
|
113
|
+
"@riverbankcms/api": "workspace:*",
|
|
114
|
+
"@riverbankcms/blocks": "workspace:*",
|
|
115
|
+
"@riverbankcms/site-renderer": "workspace:*",
|
|
116
|
+
"commander": "^12.1.0",
|
|
117
|
+
"jiti": "^2.6.1",
|
|
118
|
+
"zod": "^4.1.1"
|
|
119
|
+
},
|
|
120
|
+
"peerDependencies": {
|
|
121
|
+
"react": "19.1.0",
|
|
122
|
+
"react-dom": "19.1.0"
|
|
123
|
+
},
|
|
124
|
+
"devDependencies": {
|
|
125
|
+
"@types/node": "^22.0.0",
|
|
126
|
+
"@types/react": "^19.1.0",
|
|
127
|
+
"@types/react-dom": "^19.1.0",
|
|
128
|
+
"eslint": "^9.15.0",
|
|
129
|
+
"tsup": "^8.3.5",
|
|
130
|
+
"typescript": "^5.6.3",
|
|
131
|
+
"vitest": "^1.6.1"
|
|
132
|
+
},
|
|
133
|
+
"repository": {
|
|
134
|
+
"type": "git",
|
|
135
|
+
"url": "https://github.com/riverbankcms/riverbankcms.git",
|
|
136
|
+
"directory": "packages/sdk"
|
|
137
|
+
},
|
|
138
|
+
"keywords": [
|
|
139
|
+
"headless-cms",
|
|
140
|
+
"riverbankcms",
|
|
141
|
+
"cms",
|
|
142
|
+
"content",
|
|
143
|
+
"sdk"
|
|
144
|
+
],
|
|
145
|
+
"license": "MIT",
|
|
146
|
+
"private": false
|
|
147
|
+
}
|