@riverbankcms/sdk 0.4.0 → 0.4.1
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/dist/server/{chunk-M5KTLZTD.mjs → chunk-A2FZMRDW.mjs} +3 -2
- package/dist/server/chunk-A2FZMRDW.mjs.map +1 -0
- package/dist/server/{chunk-FPYK6527.js → chunk-SWPHIUVE.js} +7 -6
- package/dist/server/chunk-SWPHIUVE.js.map +1 -0
- package/dist/server/{chunk-G4CKM4EN.js → chunk-Y7347JMZ.js} +3 -2
- package/dist/server/chunk-Y7347JMZ.js.map +1 -0
- package/dist/server/{chunk-VVFYHAUD.mjs → chunk-ZEAJW6T3.mjs} +5 -4
- package/dist/server/chunk-ZEAJW6T3.mjs.map +1 -0
- package/dist/server/{components-Ci5nlyUj.d.mts → components-Bo3LPpVb.d.mts} +1 -1
- package/dist/server/{components-BYxloYJm.d.ts → components-ClFs4PUa.d.ts} +1 -1
- package/dist/server/components.d.mts +3 -3
- package/dist/server/components.d.ts +3 -3
- package/dist/server/data.d.mts +5 -3
- package/dist/server/data.d.ts +5 -3
- package/dist/server/data.js +2 -2
- package/dist/server/data.mjs +1 -1
- package/dist/server/{loadContent-BqQ-VPMW.d.ts → loadContent-C2SwqmXy.d.ts} +2 -2
- package/dist/server/{loadContent-Czu7xTOU.d.mts → loadContent-C_FipaAC.d.mts} +2 -2
- package/dist/server/loadPage-DUHBXDEW.js +11 -0
- package/dist/server/{loadPage-E3ZC6NHB.js.map → loadPage-DUHBXDEW.js.map} +1 -1
- package/dist/server/{loadPage-E7L7NMR3.mjs → loadPage-LYVKY3WZ.mjs} +3 -3
- package/dist/server/{loadPage-Dw57_n5N.d.mts → loadPage-mavT3Jae.d.mts} +20 -1
- package/dist/server/{loadPage-BElEkA_J.d.ts → loadPage-naVvoua8.d.ts} +20 -1
- package/dist/server/metadata.d.mts +2 -2
- package/dist/server/metadata.d.ts +2 -2
- package/dist/server/rendering/server.d.mts +2 -2
- package/dist/server/rendering/server.d.ts +2 -2
- package/dist/server/rendering.d.mts +5 -5
- package/dist/server/rendering.d.ts +5 -5
- package/dist/server/rendering.js +3 -3
- package/dist/server/rendering.mjs +2 -2
- package/dist/server/routing.d.mts +2 -2
- package/dist/server/routing.d.ts +2 -2
- package/dist/server/routing.js +1 -1
- package/dist/server/routing.mjs +1 -1
- package/dist/server/server.d.mts +3 -3
- package/dist/server/server.d.ts +3 -3
- package/dist/server/server.js +3 -3
- package/dist/server/server.mjs +2 -2
- package/dist/server/{types-BuZJWVmj.d.mts → types-CbagRQ_7.d.mts} +15 -0
- package/dist/server/{types-DSFvXKhO.d.ts → types-DuQCNVV0.d.ts} +15 -0
- package/package.json +1 -1
- package/dist/server/chunk-FPYK6527.js.map +0 -1
- package/dist/server/chunk-G4CKM4EN.js.map +0 -1
- package/dist/server/chunk-M5KTLZTD.mjs.map +0 -1
- package/dist/server/chunk-VVFYHAUD.mjs.map +0 -1
- package/dist/server/loadPage-E3ZC6NHB.js +0 -11
- /package/dist/server/{loadPage-E7L7NMR3.mjs.map → loadPage-LYVKY3WZ.mjs.map} +0 -0
|
@@ -18,7 +18,8 @@ async function executeCodeLoaders(page, context, overrides) {
|
|
|
18
18
|
blockId,
|
|
19
19
|
blockKind: block.kind,
|
|
20
20
|
content,
|
|
21
|
-
previewStage: context.previewStage ?? "published"
|
|
21
|
+
previewStage: context.previewStage ?? "published",
|
|
22
|
+
searchParams: context.searchParams ?? {}
|
|
22
23
|
};
|
|
23
24
|
const data = await loaderFn(loaderContext);
|
|
24
25
|
if (!results[blockId]) {
|
|
@@ -54,4 +55,4 @@ export {
|
|
|
54
55
|
executeCodeLoaders,
|
|
55
56
|
mergeLoaderResults
|
|
56
57
|
};
|
|
57
|
-
//# sourceMappingURL=chunk-
|
|
58
|
+
//# sourceMappingURL=chunk-A2FZMRDW.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/data/executeCodeLoaders.ts"],"sourcesContent":["/**\n * Execute code-based data loaders for SDK custom blocks.\n *\n * Code loaders are user-defined async functions that can fetch data\n * from any API (not just whitelisted CMS endpoints). They run\n * server-side during loadPage().\n */\n\nimport type { PageOutline } from '@riverbankcms/blocks';\nimport type { PrefetchContext, ResolvedBlockData } from '@riverbankcms/blocks/system/data';\nimport type { BlockKind } from '../types';\nimport type { DataLoaderContext, DataLoaderOverrides } from './types';\n\n/**\n * Execute code-based data loaders for blocks on a page.\n *\n * Iterates through page blocks and executes any registered loader\n * functions for matching block kinds. Runs all loaders in parallel.\n *\n * @param page - Page outline with blocks to process\n * @param context - Prefetch context (siteId, pageId, previewStage)\n * @param overrides - Map of block kinds to loader functions\n * @returns Resolved data keyed by blockId, then loader key\n *\n * @example\n * ```typescript\n * const codeData = await executeCodeLoaders(page, context, {\n * 'custom.featured-products': {\n * products: async (ctx) => fetchProducts(ctx.content.categoryId),\n * },\n * });\n * // codeData: { 'block-123': { products: [...] } }\n * ```\n */\nexport async function executeCodeLoaders(\n page: PageOutline,\n context: PrefetchContext & {\n searchParams?: Record<string, string | string[] | undefined>;\n },\n overrides: DataLoaderOverrides,\n): Promise<ResolvedBlockData> {\n const results: ResolvedBlockData = {};\n const tasks: Promise<void>[] = [];\n\n for (const block of page.blocks) {\n const blockId = block.id;\n if (!blockId) continue;\n\n // Look up loaders for this block kind\n const blockLoaders = overrides[block.kind];\n if (!blockLoaders) continue;\n\n // Get block content (prefer draft in preview mode)\n const content = (\n (block as { draftContent?: unknown }).draftContent ??\n (block as { content?: unknown }).content ??\n {}\n ) as Record<string, unknown>;\n\n // Execute each loader for this block\n for (const [key, loaderFn] of Object.entries(blockLoaders)) {\n tasks.push(\n (async () => {\n try {\n const loaderContext: DataLoaderContext = {\n siteId: context.siteId ?? '',\n pageId: context.pageId ?? '',\n blockId,\n blockKind: block.kind as BlockKind,\n content,\n previewStage: context.previewStage ?? 'published',\n searchParams: context.searchParams ?? {},\n };\n\n const data = await loaderFn(loaderContext);\n\n if (!results[blockId]) {\n results[blockId] = {};\n }\n results[blockId]![key] = data;\n } catch (error) {\n // Log but don't throw - data loading is best-effort\n // SDK users should handle missing data gracefully in components\n console.warn('[executeCodeLoaders] Loader failed:', {\n blockKind: block.kind,\n loaderKey: key,\n error,\n });\n }\n })(),\n );\n }\n }\n\n await Promise.all(tasks);\n return results;\n}\n\n/**\n * Merge resolved data from config loaders and code loaders.\n *\n * Code loader results take precedence on key conflicts.\n *\n * @param configResults - Data from config-based loaders (CMS endpoints)\n * @param codeResults - Data from code-based loaders (external APIs)\n * @returns Merged data with code results overwriting config on conflicts\n */\nexport function mergeLoaderResults(\n configResults: ResolvedBlockData,\n codeResults: ResolvedBlockData,\n): ResolvedBlockData {\n const merged: ResolvedBlockData = { ...configResults };\n\n for (const [blockId, loaderData] of Object.entries(codeResults)) {\n if (!merged[blockId]) {\n merged[blockId] = {};\n }\n // Code loaders take precedence on key conflicts\n merged[blockId] = { ...merged[blockId], ...loaderData };\n }\n\n return merged;\n}\n"],"mappings":";AAkCA,eAAsB,mBACpB,MACA,SAGA,WAC4B;AAC5B,QAAM,UAA6B,CAAC;AACpC,QAAM,QAAyB,CAAC;AAEhC,aAAW,SAAS,KAAK,QAAQ;AAC/B,UAAM,UAAU,MAAM;AACtB,QAAI,CAAC,QAAS;AAGd,UAAM,eAAe,UAAU,MAAM,IAAI;AACzC,QAAI,CAAC,aAAc;AAGnB,UAAM,UACH,MAAqC,gBACrC,MAAgC,WACjC,CAAC;AAIH,eAAW,CAAC,KAAK,QAAQ,KAAK,OAAO,QAAQ,YAAY,GAAG;AAC1D,YAAM;AAAA,SACH,YAAY;AACX,cAAI;AACF,kBAAM,gBAAmC;AAAA,cACvC,QAAQ,QAAQ,UAAU;AAAA,cAC1B,QAAQ,QAAQ,UAAU;AAAA,cAC1B;AAAA,cACA,WAAW,MAAM;AAAA,cACjB;AAAA,cACA,cAAc,QAAQ,gBAAgB;AAAA,cACtC,cAAc,QAAQ,gBAAgB,CAAC;AAAA,YACzC;AAEA,kBAAM,OAAO,MAAM,SAAS,aAAa;AAEzC,gBAAI,CAAC,QAAQ,OAAO,GAAG;AACrB,sBAAQ,OAAO,IAAI,CAAC;AAAA,YACtB;AACA,oBAAQ,OAAO,EAAG,GAAG,IAAI;AAAA,UAC3B,SAAS,OAAO;AAGd,oBAAQ,KAAK,uCAAuC;AAAA,cAClD,WAAW,MAAM;AAAA,cACjB,WAAW;AAAA,cACX;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF,GAAG;AAAA,MACL;AAAA,IACF;AAAA,EACF;AAEA,QAAM,QAAQ,IAAI,KAAK;AACvB,SAAO;AACT;AAWO,SAAS,mBACd,eACA,aACmB;AACnB,QAAM,SAA4B,EAAE,GAAG,cAAc;AAErD,aAAW,CAAC,SAAS,UAAU,KAAK,OAAO,QAAQ,WAAW,GAAG;AAC/D,QAAI,CAAC,OAAO,OAAO,GAAG;AACpB,aAAO,OAAO,IAAI,CAAC;AAAA,IACrB;AAEA,WAAO,OAAO,IAAI,EAAE,GAAG,OAAO,OAAO,GAAG,GAAG,WAAW;AAAA,EACxD;AAEA,SAAO;AACT;","names":[]}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
var
|
|
4
|
+
var _chunkY7347JMZjs = require('./chunk-Y7347JMZ.js');
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
var _chunkHOY77YBFjs = require('./chunk-HOY77YBF.js');
|
|
8
8
|
|
|
9
9
|
// src/rendering/helpers/loadPage.ts
|
|
10
10
|
async function loadPage(params) {
|
|
11
|
-
const { client, siteId, path, pageId, preview = false, dataLoaderOverrides } = params;
|
|
11
|
+
const { client, siteId, path, pageId, preview = false, dataLoaderOverrides, searchParams } = params;
|
|
12
12
|
const [site, pageResponse] = await Promise.all([
|
|
13
13
|
client.getSite({ id: siteId }),
|
|
14
14
|
client.getPage({ siteId, path, preview })
|
|
@@ -52,7 +52,8 @@ async function loadPage(params) {
|
|
|
52
52
|
const prefetchContext = {
|
|
53
53
|
siteId,
|
|
54
54
|
pageId: _nullishCoalesce(pageId, () => ( pageData.id)),
|
|
55
|
-
previewStage: preview ? "preview" : "published"
|
|
55
|
+
previewStage: preview ? "preview" : "published",
|
|
56
|
+
searchParams
|
|
56
57
|
};
|
|
57
58
|
const configData = await _chunkHOY77YBFjs.prefetchBlockData.call(void 0,
|
|
58
59
|
pageOutline,
|
|
@@ -65,8 +66,8 @@ async function loadPage(params) {
|
|
|
65
66
|
);
|
|
66
67
|
let resolvedData = configData;
|
|
67
68
|
if (dataLoaderOverrides && Object.keys(dataLoaderOverrides).length > 0) {
|
|
68
|
-
const codeData = await
|
|
69
|
-
resolvedData =
|
|
69
|
+
const codeData = await _chunkY7347JMZjs.executeCodeLoaders.call(void 0, pageOutline, prefetchContext, dataLoaderOverrides);
|
|
70
|
+
resolvedData = _chunkY7347JMZjs.mergeLoaderResults.call(void 0, configData, codeData);
|
|
70
71
|
}
|
|
71
72
|
return {
|
|
72
73
|
page: pageOutline,
|
|
@@ -83,4 +84,4 @@ async function loadPage(params) {
|
|
|
83
84
|
|
|
84
85
|
|
|
85
86
|
exports.loadPage = loadPage;
|
|
86
|
-
//# sourceMappingURL=chunk-
|
|
87
|
+
//# sourceMappingURL=chunk-SWPHIUVE.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/chunk-SWPHIUVE.js","../../src/rendering/helpers/loadPage.ts"],"names":[],"mappings":"AAAA;AACE;AACA;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACA;ACwIA,MAAA,SAAsB,QAAA,CAAS,MAAA,EAAiD;AAC9E,EAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,QAAA,EAAU,KAAA,EAAO,mBAAA,EAAqB,aAAa,EAAA,EAAI,MAAA;AAG7F,EAAA,MAAM,CAAC,IAAA,EAAM,YAAY,EAAA,EAAI,MAAM,OAAA,CAAQ,GAAA,CAAI;AAAA,IAC7C,MAAA,CAAO,OAAA,CAAQ,EAAE,EAAA,EAAI,OAAO,CAAC,CAAA;AAAA,IAC7B,MAAA,CAAO,OAAA,CAAQ,EAAE,MAAA,EAAQ,IAAA,EAAM,QAAQ,CAAC;AAAA,EAC1C,CAAC,CAAA;AAGD,EAAA,GAAA,CAAI,QAAA,GAAW,YAAA,EAAc;AAC3B,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,IAGF,CAAA;AAAA,EACF;AAEA,EAAA,MAAM,EAAE,IAAA,EAAM,SAAS,EAAA,EAAI,YAAA;AAI3B,EAAA,MAAM,OAAA,EAAS,QAAA,CAAS,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,EAAA,GAAU;AAC5C,IAAA,GAAA,CAAI,CAAC,MAAA,GAAS,OAAO,MAAA,IAAU,QAAA,EAAU;AACvC,MAAA,MAAM,IAAI,KAAA,CAAM,sCAAsC,CAAA;AAAA,IACxD;AACA,IAAA,GAAA,CAAI,OAAO,KAAA,CAAM,GAAA,IAAO,SAAA,GAAY,KAAA,CAAM,GAAA,IAAO,IAAA,EAAM;AACrD,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,+CAAA,EAAkD,OAAO,KAAA,CAAM,EAAE,CAAA,CAAA;AACnF,IAAA;AACoC,IAAA;AAC6C,MAAA;AACjF,IAAA;AACuC,IAAA;AACuC,MAAA;AAC9E,IAAA;AAKmB,IAAA;AAQZ,IAAA;AACU,MAAA;AACE,MAAA;AACG,MAAA;AAAA;AAEY,MAAA;AAAA;AAEe,MAAA;AACjD,IAAA;AACD,EAAA;AAEmB,EAAA;AACH,IAAA;AACA,IAAA;AACG,IAAA;AAClB,IAAA;AACF,EAAA;AAQI,EAAA;AACF,IAAA;AAC2B,IAAA;AACS,IAAA;AACpC,IAAA;AACF,EAAA;AAOyB,EAAA;AACvB,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AAAA;AAEgC,MAAA;AAChC,IAAA;AACF,EAAA;AAGmB,EAAA;AACqD,EAAA;AACE,IAAA;AAClB,IAAA;AACxD,EAAA;AAEO,EAAA;AACC,IAAA;AACM,IAAA;AACiB,IAAA;AAC7B,IAAA;AACA,IAAA;AAAA;AAAA;AAAA;AAIF,EAAA;AACF;AD5KwF;AACA;AACA;AACA","file":"/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/chunk-SWPHIUVE.js","sourcesContent":[null,"/**\n * Server-side helper to fetch all data needed for <Page> component.\n *\n * Use this in server components, getServerSideProps, or API routes.\n */\n\nimport type { RiverbankClient, SiteResponse } from '../../client/types';\nimport type { PageProps } from '../components/Page';\nimport { prefetchBlockData } from '../../data/prefetchBlockData';\nimport { executeCodeLoaders, mergeLoaderResults } from '../../data/executeCodeLoaders';\nimport type { DataLoaderOverrides } from '../../data/types';\n\n/**\n * SDK config from API response (without siteId which is stripped at storage).\n * This is the runtime representation - for defining configs, use RiverbankSiteConfig.\n */\nexport type RuntimeSdkConfig = NonNullable<SiteResponse['sdkConfig']>;\n\nexport type LoadPageParams = {\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 * Code-based data loaders for custom blocks.\n *\n * Use this to fetch data from external APIs (not just whitelisted CMS endpoints).\n * Keys are block kinds (e.g., 'custom.featured-products').\n *\n * Config-based loaders (defined in riverbank.config.ts) run first.\n * Code loaders run second and take precedence on key conflicts.\n *\n * @example\n * ```typescript\n * const pageData = await loadPage({\n * client,\n * siteId: 'site-123',\n * path: '/',\n * dataLoaderOverrides: {\n * 'custom.featured-products': {\n * products: async (ctx) => {\n * const res = await fetch(`https://api.shop.com/products?category=${ctx.content.categoryId}`);\n * return res.json();\n * },\n * },\n * },\n * });\n * ```\n */\n dataLoaderOverrides?: DataLoaderOverrides;\n /**\n * URL search parameters from the page request.\n * Passed to code-based data loaders for pagination, filtering, etc.\n *\n * @example\n * ```typescript\n * // In Next.js App Router\n * export default async function Page({ params, searchParams }) {\n * const pageData = await loadPage({\n * client,\n * siteId: 'site-123',\n * path: `/${params.slug || ''}`,\n * searchParams: await searchParams,\n * });\n * return <Page {...pageData} />;\n * }\n * ```\n */\n searchParams?: Record<string, string | string[] | undefined>;\n};\n\nexport type LoadPageResult = Omit<PageProps, 'registry' | 'wrapBlock' | 'usePlaceholders' | 'blockOverrides'> & {\n /**\n * SDK site configuration, if available.\n * Contains SDK-defined theme palette, section backgrounds, and style options.\n */\n sdkConfig: RuntimeSdkConfig | null;\n};\n\n/**\n * Server-side helper to fetch all data needed for <Page> component.\n *\n * Fetches site data, page data, and prefetches block data loaders in parallel.\n *\n * @example Next.js App Router (published content)\n * ```tsx\n * import { createRiverbankClient } from '@riverbankcms/sdk';\n * import { loadPage, Page } from '@riverbankcms/sdk/rendering';\n *\n * const client = createRiverbankClient({\n * apiKey: process.env.RIVERBANK_API_KEY!,\n * baseUrl: process.env.NEXT_PUBLIC_DASHBOARD_URL + '/api',\n * });\n *\n * export default async function PageRoute({ params }) {\n * const pageData = await loadPage({\n * client,\n * siteId: 'site-123',\n * path: `/${params.slug || ''}`,\n * });\n *\n * return <Page {...pageData} />;\n * }\n * ```\n *\n * @example Next.js App Router (preview/draft content)\n * ```tsx\n * export default async function PreviewRoute({ params, searchParams }) {\n * const pageData = await loadPage({\n * client,\n * siteId: searchParams.siteId,\n * path: `/${params.slug || ''}`,\n * preview: true, // Fetch draft content\n * });\n *\n * return <Page {...pageData} />;\n * }\n * ```\n *\n * @example Next.js Pages Router (getServerSideProps)\n * ```tsx\n * export async function getServerSideProps({ params }) {\n * const pageData = await loadPage({\n * client,\n * siteId: 'site-123',\n * path: `/${params.slug || ''}`,\n * });\n *\n * return { props: pageData };\n * }\n *\n * export default function PageRoute(props) {\n * return <Page {...props} />;\n * }\n * ```\n */\nexport async function loadPage(params: LoadPageParams): Promise<LoadPageResult> {\n const { client, siteId, path, pageId, preview = false, dataLoaderOverrides, searchParams } = params;\n\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 // 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 loadContent() instead, which handles both pages and entries. ' +\n 'For entries, loadContent() 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 with content\n // API returns blocks with full content - PageRenderer needs the content field for rendering\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\n // Include content for rendering\n // API provides `content` (active content for the requested stage)\n // and optionally `draftContent` for preview mode\n const typedBlock = block as {\n id: string | null;\n kind: string;\n purpose: string;\n content?: Record<string, unknown>;\n draftContent?: { data: Record<string, unknown> } | null;\n };\n\n return {\n id: typedBlock.id,\n kind: typedBlock.kind,\n purpose: typedBlock.purpose,\n // Include content for PageRenderer's getRenderableContent()\n content: typedBlock.content ?? {},\n // Include draftContent if available (for preview mode)\n draftContent: typedBlock.draftContent?.data ?? null,\n };\n });\n\n const pageOutline = {\n name: pageData.name,\n path: pageData.path,\n purpose: pageData.purpose,\n blocks,\n };\n\n // Build prefetch context\n const prefetchContext: {\n siteId: string;\n pageId: string;\n previewStage: 'published' | 'preview';\n searchParams?: Record<string, string | string[] | undefined>;\n } = {\n siteId,\n pageId: pageId ?? pageData.id,\n previewStage: preview ? 'preview' : 'published',\n searchParams,\n };\n\n // Prefetch block data loaders (config-based loaders for CMS endpoints)\n // Note: searchParams is intentionally NOT passed to config-based loaders.\n // Config loaders call CMS endpoints which don't need URL params.\n // Only code-based loaders (dataLoaderOverrides) receive searchParams for\n // custom pagination, filtering, and sorting via external APIs.\n const configData = await prefetchBlockData(\n pageOutline,\n prefetchContext,\n client,\n {\n // Pass custom blocks so their config-based loaders are discovered\n customBlocks: site.sdkConfig?.customBlocks,\n }\n );\n\n // Execute code-based loaders (external APIs) and merge results\n let resolvedData = configData;\n if (dataLoaderOverrides && Object.keys(dataLoaderOverrides).length > 0) {\n const codeData = await executeCodeLoaders(pageOutline, prefetchContext, dataLoaderOverrides);\n resolvedData = mergeLoaderResults(configData, codeData);\n }\n\n return {\n page: pageOutline,\n theme: site.theme,\n sdkConfig: site.sdkConfig ?? null,\n siteId,\n resolvedData,\n // Note: routeMap is optional and can be built from site data if needed for internal links.\n // Consumers can construct it from site.pages and pass explicitly via Page component props.\n // Example: const routeMap = site.pages.reduce((map, p) => ({ ...map, [p.id]: p.path }), {});\n };\n}\n"]}
|
|
@@ -18,7 +18,8 @@ async function executeCodeLoaders(page, context, overrides) {
|
|
|
18
18
|
blockId,
|
|
19
19
|
blockKind: block.kind,
|
|
20
20
|
content,
|
|
21
|
-
previewStage: _nullishCoalesce(context.previewStage, () => ( "published"))
|
|
21
|
+
previewStage: _nullishCoalesce(context.previewStage, () => ( "published")),
|
|
22
|
+
searchParams: _nullishCoalesce(context.searchParams, () => ( {}))
|
|
22
23
|
};
|
|
23
24
|
const data = await loaderFn(loaderContext);
|
|
24
25
|
if (!results[blockId]) {
|
|
@@ -54,4 +55,4 @@ function mergeLoaderResults(configResults, codeResults) {
|
|
|
54
55
|
|
|
55
56
|
|
|
56
57
|
exports.executeCodeLoaders = executeCodeLoaders; exports.mergeLoaderResults = mergeLoaderResults;
|
|
57
|
-
//# sourceMappingURL=chunk-
|
|
58
|
+
//# sourceMappingURL=chunk-Y7347JMZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/chunk-Y7347JMZ.js","../../src/data/executeCodeLoaders.ts"],"names":[],"mappings":"AAAA;ACkCA,MAAA,SAAsB,kBAAA,CACpB,IAAA,EACA,OAAA,EAGA,SAAA,EAC4B;AAC5B,EAAA,MAAM,QAAA,EAA6B,CAAC,CAAA;AACpC,EAAA,MAAM,MAAA,EAAyB,CAAC,CAAA;AAEhC,EAAA,IAAA,CAAA,MAAW,MAAA,GAAS,IAAA,CAAK,MAAA,EAAQ;AAC/B,IAAA,MAAM,QAAA,EAAU,KAAA,CAAM,EAAA;AACtB,IAAA,GAAA,CAAI,CAAC,OAAA,EAAS,QAAA;AAGd,IAAA,MAAM,aAAA,EAAe,SAAA,CAAU,KAAA,CAAM,IAAI,CAAA;AACzC,IAAA,GAAA,CAAI,CAAC,YAAA,EAAc,QAAA;AAGnB,IAAA,MAAM,QAAA,oCACH,KAAA,CAAqC,YAAA,UACrC,KAAA,CAAgC,SAAA,UACjC,CAAC,GAAA;AAIH,IAAA,IAAA,CAAA,MAAW,CAAC,GAAA,EAAK,QAAQ,EAAA,GAAK,MAAA,CAAO,OAAA,CAAQ,YAAY,CAAA,EAAG;AAC1D,MAAA,KAAA,CAAM,IAAA;AAAA,QAAA,CACH,MAAA,CAAA,EAAA,GAAY;AACX,UAAA,IAAI;AACF,YAAA,MAAM,cAAA,EAAmC;AAAA,cACvC,MAAA,mBAAQ,OAAA,CAAQ,MAAA,UAAU,IAAA;AAAA,cAC1B,MAAA,mBAAQ,OAAA,CAAQ,MAAA,UAAU,IAAA;AAAA,cAC1B,OAAA;AAAA,cACA,SAAA,EAAW,KAAA,CAAM,IAAA;AAAA,cACjB,OAAA;AAAA,cACA,YAAA,mBAAc,OAAA,CAAQ,YAAA,UAAgB,aAAA;AAAA,cACtC,YAAA,mBAAc,OAAA,CAAQ,YAAA,UAAgB,CAAC;AAAA,YACzC,CAAA;AAEA,YAAA,MAAM,KAAA,EAAO,MAAM,QAAA,CAAS,aAAa,CAAA;AAEzC,YAAA,GAAA,CAAI,CAAC,OAAA,CAAQ,OAAO,CAAA,EAAG;AACrB,cAAA,OAAA,CAAQ,OAAO,EAAA,EAAI,CAAC,CAAA;AAAA,YACtB;AACA,YAAA,OAAA,CAAQ,OAAO,CAAA,CAAG,GAAG,EAAA,EAAI,IAAA;AAAA,UAC3B,EAAA,MAAA,CAAS,KAAA,EAAO;AAGd,YAAA,OAAA,CAAQ,IAAA,CAAK,qCAAA,EAAuC;AAAA,cAClD,SAAA,EAAW,KAAA,CAAM,IAAA;AAAA,cACjB,SAAA,EAAW,GAAA;AAAA,cACX;AAAA,YACF,CAAC,CAAA;AAAA,UACH;AAAA,QACF,CAAA,CAAA,CAAG;AAAA,MACL,CAAA;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA;AACvB,EAAA,OAAO,OAAA;AACT;AAWO,SAAS,kBAAA,CACd,aAAA,EACA,WAAA,EACmB;AACnB,EAAA,MAAM,OAAA,EAA4B,EAAE,GAAG,cAAc,CAAA;AAErD,EAAA,IAAA,CAAA,MAAW,CAAC,OAAA,EAAS,UAAU,EAAA,GAAK,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC/D,IAAA,GAAA,CAAI,CAAC,MAAA,CAAO,OAAO,CAAA,EAAG;AACpB,MAAA,MAAA,CAAO,OAAO,EAAA,EAAI,CAAC,CAAA;AAAA,IACrB;AAEA,IAAA,MAAA,CAAO,OAAO,EAAA,EAAI,EAAE,GAAG,MAAA,CAAO,OAAO,CAAA,EAAG,GAAG,WAAW,CAAA;AAAA,EACxD;AAEA,EAAA,OAAO,MAAA;AACT;ADtEA;AACA;AACE;AACA;AACF,iGAAC","file":"/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/chunk-Y7347JMZ.js","sourcesContent":[null,"/**\n * Execute code-based data loaders for SDK custom blocks.\n *\n * Code loaders are user-defined async functions that can fetch data\n * from any API (not just whitelisted CMS endpoints). They run\n * server-side during loadPage().\n */\n\nimport type { PageOutline } from '@riverbankcms/blocks';\nimport type { PrefetchContext, ResolvedBlockData } from '@riverbankcms/blocks/system/data';\nimport type { BlockKind } from '../types';\nimport type { DataLoaderContext, DataLoaderOverrides } from './types';\n\n/**\n * Execute code-based data loaders for blocks on a page.\n *\n * Iterates through page blocks and executes any registered loader\n * functions for matching block kinds. Runs all loaders in parallel.\n *\n * @param page - Page outline with blocks to process\n * @param context - Prefetch context (siteId, pageId, previewStage)\n * @param overrides - Map of block kinds to loader functions\n * @returns Resolved data keyed by blockId, then loader key\n *\n * @example\n * ```typescript\n * const codeData = await executeCodeLoaders(page, context, {\n * 'custom.featured-products': {\n * products: async (ctx) => fetchProducts(ctx.content.categoryId),\n * },\n * });\n * // codeData: { 'block-123': { products: [...] } }\n * ```\n */\nexport async function executeCodeLoaders(\n page: PageOutline,\n context: PrefetchContext & {\n searchParams?: Record<string, string | string[] | undefined>;\n },\n overrides: DataLoaderOverrides,\n): Promise<ResolvedBlockData> {\n const results: ResolvedBlockData = {};\n const tasks: Promise<void>[] = [];\n\n for (const block of page.blocks) {\n const blockId = block.id;\n if (!blockId) continue;\n\n // Look up loaders for this block kind\n const blockLoaders = overrides[block.kind];\n if (!blockLoaders) continue;\n\n // Get block content (prefer draft in preview mode)\n const content = (\n (block as { draftContent?: unknown }).draftContent ??\n (block as { content?: unknown }).content ??\n {}\n ) as Record<string, unknown>;\n\n // Execute each loader for this block\n for (const [key, loaderFn] of Object.entries(blockLoaders)) {\n tasks.push(\n (async () => {\n try {\n const loaderContext: DataLoaderContext = {\n siteId: context.siteId ?? '',\n pageId: context.pageId ?? '',\n blockId,\n blockKind: block.kind as BlockKind,\n content,\n previewStage: context.previewStage ?? 'published',\n searchParams: context.searchParams ?? {},\n };\n\n const data = await loaderFn(loaderContext);\n\n if (!results[blockId]) {\n results[blockId] = {};\n }\n results[blockId]![key] = data;\n } catch (error) {\n // Log but don't throw - data loading is best-effort\n // SDK users should handle missing data gracefully in components\n console.warn('[executeCodeLoaders] Loader failed:', {\n blockKind: block.kind,\n loaderKey: key,\n error,\n });\n }\n })(),\n );\n }\n }\n\n await Promise.all(tasks);\n return results;\n}\n\n/**\n * Merge resolved data from config loaders and code loaders.\n *\n * Code loader results take precedence on key conflicts.\n *\n * @param configResults - Data from config-based loaders (CMS endpoints)\n * @param codeResults - Data from code-based loaders (external APIs)\n * @returns Merged data with code results overwriting config on conflicts\n */\nexport function mergeLoaderResults(\n configResults: ResolvedBlockData,\n codeResults: ResolvedBlockData,\n): ResolvedBlockData {\n const merged: ResolvedBlockData = { ...configResults };\n\n for (const [blockId, loaderData] of Object.entries(codeResults)) {\n if (!merged[blockId]) {\n merged[blockId] = {};\n }\n // Code loaders take precedence on key conflicts\n merged[blockId] = { ...merged[blockId], ...loaderData };\n }\n\n return merged;\n}\n"]}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import {
|
|
2
2
|
executeCodeLoaders,
|
|
3
3
|
mergeLoaderResults
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-A2FZMRDW.mjs";
|
|
5
5
|
import {
|
|
6
6
|
prefetchBlockData
|
|
7
7
|
} from "./chunk-7DS4Q3GA.mjs";
|
|
8
8
|
|
|
9
9
|
// src/rendering/helpers/loadPage.ts
|
|
10
10
|
async function loadPage(params) {
|
|
11
|
-
const { client, siteId, path, pageId, preview = false, dataLoaderOverrides } = params;
|
|
11
|
+
const { client, siteId, path, pageId, preview = false, dataLoaderOverrides, searchParams } = params;
|
|
12
12
|
const [site, pageResponse] = await Promise.all([
|
|
13
13
|
client.getSite({ id: siteId }),
|
|
14
14
|
client.getPage({ siteId, path, preview })
|
|
@@ -52,7 +52,8 @@ async function loadPage(params) {
|
|
|
52
52
|
const prefetchContext = {
|
|
53
53
|
siteId,
|
|
54
54
|
pageId: pageId ?? pageData.id,
|
|
55
|
-
previewStage: preview ? "preview" : "published"
|
|
55
|
+
previewStage: preview ? "preview" : "published",
|
|
56
|
+
searchParams
|
|
56
57
|
};
|
|
57
58
|
const configData = await prefetchBlockData(
|
|
58
59
|
pageOutline,
|
|
@@ -83,4 +84,4 @@ async function loadPage(params) {
|
|
|
83
84
|
export {
|
|
84
85
|
loadPage
|
|
85
86
|
};
|
|
86
|
-
//# sourceMappingURL=chunk-
|
|
87
|
+
//# sourceMappingURL=chunk-ZEAJW6T3.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/rendering/helpers/loadPage.ts"],"sourcesContent":["/**\n * Server-side helper to fetch all data needed for <Page> component.\n *\n * Use this in server components, getServerSideProps, or API routes.\n */\n\nimport type { RiverbankClient, SiteResponse } from '../../client/types';\nimport type { PageProps } from '../components/Page';\nimport { prefetchBlockData } from '../../data/prefetchBlockData';\nimport { executeCodeLoaders, mergeLoaderResults } from '../../data/executeCodeLoaders';\nimport type { DataLoaderOverrides } from '../../data/types';\n\n/**\n * SDK config from API response (without siteId which is stripped at storage).\n * This is the runtime representation - for defining configs, use RiverbankSiteConfig.\n */\nexport type RuntimeSdkConfig = NonNullable<SiteResponse['sdkConfig']>;\n\nexport type LoadPageParams = {\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 * Code-based data loaders for custom blocks.\n *\n * Use this to fetch data from external APIs (not just whitelisted CMS endpoints).\n * Keys are block kinds (e.g., 'custom.featured-products').\n *\n * Config-based loaders (defined in riverbank.config.ts) run first.\n * Code loaders run second and take precedence on key conflicts.\n *\n * @example\n * ```typescript\n * const pageData = await loadPage({\n * client,\n * siteId: 'site-123',\n * path: '/',\n * dataLoaderOverrides: {\n * 'custom.featured-products': {\n * products: async (ctx) => {\n * const res = await fetch(`https://api.shop.com/products?category=${ctx.content.categoryId}`);\n * return res.json();\n * },\n * },\n * },\n * });\n * ```\n */\n dataLoaderOverrides?: DataLoaderOverrides;\n /**\n * URL search parameters from the page request.\n * Passed to code-based data loaders for pagination, filtering, etc.\n *\n * @example\n * ```typescript\n * // In Next.js App Router\n * export default async function Page({ params, searchParams }) {\n * const pageData = await loadPage({\n * client,\n * siteId: 'site-123',\n * path: `/${params.slug || ''}`,\n * searchParams: await searchParams,\n * });\n * return <Page {...pageData} />;\n * }\n * ```\n */\n searchParams?: Record<string, string | string[] | undefined>;\n};\n\nexport type LoadPageResult = Omit<PageProps, 'registry' | 'wrapBlock' | 'usePlaceholders' | 'blockOverrides'> & {\n /**\n * SDK site configuration, if available.\n * Contains SDK-defined theme palette, section backgrounds, and style options.\n */\n sdkConfig: RuntimeSdkConfig | null;\n};\n\n/**\n * Server-side helper to fetch all data needed for <Page> component.\n *\n * Fetches site data, page data, and prefetches block data loaders in parallel.\n *\n * @example Next.js App Router (published content)\n * ```tsx\n * import { createRiverbankClient } from '@riverbankcms/sdk';\n * import { loadPage, Page } from '@riverbankcms/sdk/rendering';\n *\n * const client = createRiverbankClient({\n * apiKey: process.env.RIVERBANK_API_KEY!,\n * baseUrl: process.env.NEXT_PUBLIC_DASHBOARD_URL + '/api',\n * });\n *\n * export default async function PageRoute({ params }) {\n * const pageData = await loadPage({\n * client,\n * siteId: 'site-123',\n * path: `/${params.slug || ''}`,\n * });\n *\n * return <Page {...pageData} />;\n * }\n * ```\n *\n * @example Next.js App Router (preview/draft content)\n * ```tsx\n * export default async function PreviewRoute({ params, searchParams }) {\n * const pageData = await loadPage({\n * client,\n * siteId: searchParams.siteId,\n * path: `/${params.slug || ''}`,\n * preview: true, // Fetch draft content\n * });\n *\n * return <Page {...pageData} />;\n * }\n * ```\n *\n * @example Next.js Pages Router (getServerSideProps)\n * ```tsx\n * export async function getServerSideProps({ params }) {\n * const pageData = await loadPage({\n * client,\n * siteId: 'site-123',\n * path: `/${params.slug || ''}`,\n * });\n *\n * return { props: pageData };\n * }\n *\n * export default function PageRoute(props) {\n * return <Page {...props} />;\n * }\n * ```\n */\nexport async function loadPage(params: LoadPageParams): Promise<LoadPageResult> {\n const { client, siteId, path, pageId, preview = false, dataLoaderOverrides, searchParams } = params;\n\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 // 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 loadContent() instead, which handles both pages and entries. ' +\n 'For entries, loadContent() 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 with content\n // API returns blocks with full content - PageRenderer needs the content field for rendering\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\n // Include content for rendering\n // API provides `content` (active content for the requested stage)\n // and optionally `draftContent` for preview mode\n const typedBlock = block as {\n id: string | null;\n kind: string;\n purpose: string;\n content?: Record<string, unknown>;\n draftContent?: { data: Record<string, unknown> } | null;\n };\n\n return {\n id: typedBlock.id,\n kind: typedBlock.kind,\n purpose: typedBlock.purpose,\n // Include content for PageRenderer's getRenderableContent()\n content: typedBlock.content ?? {},\n // Include draftContent if available (for preview mode)\n draftContent: typedBlock.draftContent?.data ?? null,\n };\n });\n\n const pageOutline = {\n name: pageData.name,\n path: pageData.path,\n purpose: pageData.purpose,\n blocks,\n };\n\n // Build prefetch context\n const prefetchContext: {\n siteId: string;\n pageId: string;\n previewStage: 'published' | 'preview';\n searchParams?: Record<string, string | string[] | undefined>;\n } = {\n siteId,\n pageId: pageId ?? pageData.id,\n previewStage: preview ? 'preview' : 'published',\n searchParams,\n };\n\n // Prefetch block data loaders (config-based loaders for CMS endpoints)\n // Note: searchParams is intentionally NOT passed to config-based loaders.\n // Config loaders call CMS endpoints which don't need URL params.\n // Only code-based loaders (dataLoaderOverrides) receive searchParams for\n // custom pagination, filtering, and sorting via external APIs.\n const configData = await prefetchBlockData(\n pageOutline,\n prefetchContext,\n client,\n {\n // Pass custom blocks so their config-based loaders are discovered\n customBlocks: site.sdkConfig?.customBlocks,\n }\n );\n\n // Execute code-based loaders (external APIs) and merge results\n let resolvedData = configData;\n if (dataLoaderOverrides && Object.keys(dataLoaderOverrides).length > 0) {\n const codeData = await executeCodeLoaders(pageOutline, prefetchContext, dataLoaderOverrides);\n resolvedData = mergeLoaderResults(configData, codeData);\n }\n\n return {\n page: pageOutline,\n theme: site.theme,\n sdkConfig: site.sdkConfig ?? null,\n siteId,\n resolvedData,\n // Note: routeMap is optional and can be built from site data if needed for internal links.\n // Consumers can construct it from site.pages and pass explicitly via Page component props.\n // Example: const routeMap = site.pages.reduce((map, p) => ({ ...map, [p.id]: p.path }), {});\n };\n}\n"],"mappings":";;;;;;;;;AAgJA,eAAsB,SAAS,QAAiD;AAC9E,QAAM,EAAE,QAAQ,QAAQ,MAAM,QAAQ,UAAU,OAAO,qBAAqB,aAAa,IAAI;AAG7F,QAAM,CAAC,MAAM,YAAY,IAAI,MAAM,QAAQ,IAAI;AAAA,IAC7C,OAAO,QAAQ,EAAE,IAAI,OAAO,CAAC;AAAA,IAC7B,OAAO,QAAQ,EAAE,QAAQ,MAAM,QAAQ,CAAC;AAAA,EAC1C,CAAC;AAGD,MAAI,WAAW,cAAc;AAC3B,UAAM,IAAI;AAAA,MACR;AAAA,IAGF;AAAA,EACF;AAEA,QAAM,EAAE,MAAM,SAAS,IAAI;AAI3B,QAAM,SAAS,SAAS,OAAO,IAAI,CAAC,UAAU;AAC5C,QAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC,YAAM,IAAI,MAAM,sCAAsC;AAAA,IACxD;AACA,QAAI,OAAO,MAAM,OAAO,YAAY,MAAM,OAAO,MAAM;AACrD,YAAM,IAAI,MAAM,kDAAkD,OAAO,MAAM,EAAE,EAAE;AAAA,IACrF;AACA,QAAI,OAAO,MAAM,SAAS,UAAU;AAClC,YAAM,IAAI,MAAM,4CAA4C,OAAO,MAAM,IAAI,EAAE;AAAA,IACjF;AACA,QAAI,OAAO,MAAM,YAAY,UAAU;AACrC,YAAM,IAAI,MAAM,+CAA+C,OAAO,MAAM,OAAO,EAAE;AAAA,IACvF;AAKA,UAAM,aAAa;AAQnB,WAAO;AAAA,MACL,IAAI,WAAW;AAAA,MACf,MAAM,WAAW;AAAA,MACjB,SAAS,WAAW;AAAA;AAAA,MAEpB,SAAS,WAAW,WAAW,CAAC;AAAA;AAAA,MAEhC,cAAc,WAAW,cAAc,QAAQ;AAAA,IACjD;AAAA,EACF,CAAC;AAED,QAAM,cAAc;AAAA,IAClB,MAAM,SAAS;AAAA,IACf,MAAM,SAAS;AAAA,IACf,SAAS,SAAS;AAAA,IAClB;AAAA,EACF;AAGA,QAAM,kBAKF;AAAA,IACF;AAAA,IACA,QAAQ,UAAU,SAAS;AAAA,IAC3B,cAAc,UAAU,YAAY;AAAA,IACpC;AAAA,EACF;AAOA,QAAM,aAAa,MAAM;AAAA,IACvB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,MAEE,cAAc,KAAK,WAAW;AAAA,IAChC;AAAA,EACF;AAGA,MAAI,eAAe;AACnB,MAAI,uBAAuB,OAAO,KAAK,mBAAmB,EAAE,SAAS,GAAG;AACtE,UAAM,WAAW,MAAM,mBAAmB,aAAa,iBAAiB,mBAAmB;AAC3F,mBAAe,mBAAmB,YAAY,QAAQ;AAAA,EACxD;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,OAAO,KAAK;AAAA,IACZ,WAAW,KAAK,aAAa;AAAA,IAC7B;AAAA,IACA;AAAA;AAAA;AAAA;AAAA,EAIF;AACF;","names":[]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { T as ThemeTokens } from './loadPage-
|
|
1
|
+
import { T as ThemeTokens } from './loadPage-mavT3Jae.mjs';
|
|
2
2
|
import './Layout-B_zUr9ci.mjs';
|
|
3
3
|
import { T as Theme, H as HydratedTheme, e as ExpandedPalette } from './types-BA-J9K8r.mjs';
|
|
4
4
|
import './schema-Bpy9N5ZI.mjs';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { T as ThemeTokens } from './loadPage-
|
|
1
|
+
import { T as ThemeTokens } from './loadPage-naVvoua8.js';
|
|
2
2
|
import './Layout-CHG77dhK.js';
|
|
3
3
|
import { T as Theme, H as HydratedTheme, e as ExpandedPalette } from './types-5XdVD2J1.js';
|
|
4
4
|
import './schema-Bpy9N5ZI.js';
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
export { e as BlockOverrideComponent, B as BlockOverrides, b as Page, P as PageProps, c as PageRenderer, d as RouteMap, S as SystemBlockComponentProps, T as ThemeTokens } from './loadPage-
|
|
1
|
+
export { e as BlockOverrideComponent, B as BlockOverrides, b as Page, P as PageProps, c as PageRenderer, d as RouteMap, S as SystemBlockComponentProps, T as ThemeTokens } from './loadPage-mavT3Jae.mjs';
|
|
2
2
|
export { H as HeaderData, L as Layout, a as LayoutProps } from './Layout-B_zUr9ci.mjs';
|
|
3
3
|
export { T as Theme } from './types-BA-J9K8r.mjs';
|
|
4
4
|
export { P as PageOutline } from './schema-Bpy9N5ZI.mjs';
|
|
5
|
-
export { e as BackgroundInput, B as BodyTextContent, H as HeroContent, f as ResolvedBackground, R as RichText, c as RichTextPrimitiveProps, S as SectionBackground, g as SectionBackgroundProps, T as TipTapNode, b as buildThemeRuntime, d as resolveBackground, r as resolveImageUrl } from './components-
|
|
5
|
+
export { e as BackgroundInput, B as BodyTextContent, H as HeroContent, f as ResolvedBackground, R as RichText, c as RichTextPrimitiveProps, S as SectionBackground, g as SectionBackgroundProps, T as TipTapNode, b as buildThemeRuntime, d as resolveBackground, r as resolveImageUrl } from './components-Bo3LPpVb.mjs';
|
|
6
6
|
import './types-BC9eB2KH.mjs';
|
|
7
7
|
import 'react/jsx-runtime';
|
|
8
8
|
import 'react';
|
|
9
9
|
import 'zod';
|
|
10
|
-
import './types-
|
|
10
|
+
import './types-CbagRQ_7.mjs';
|
|
11
11
|
import './blockKinds-B6MWzNWp.mjs';
|
|
12
12
|
import '@riverbankcms/site-renderer';
|
|
13
13
|
import '@riverbankcms/ai';
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
export { e as BlockOverrideComponent, B as BlockOverrides, b as Page, P as PageProps, c as PageRenderer, d as RouteMap, S as SystemBlockComponentProps, T as ThemeTokens } from './loadPage-
|
|
1
|
+
export { e as BlockOverrideComponent, B as BlockOverrides, b as Page, P as PageProps, c as PageRenderer, d as RouteMap, S as SystemBlockComponentProps, T as ThemeTokens } from './loadPage-naVvoua8.js';
|
|
2
2
|
export { H as HeaderData, L as Layout, a as LayoutProps } from './Layout-CHG77dhK.js';
|
|
3
3
|
export { T as Theme } from './types-5XdVD2J1.js';
|
|
4
4
|
export { P as PageOutline } from './schema-Bpy9N5ZI.js';
|
|
5
|
-
export { e as BackgroundInput, B as BodyTextContent, H as HeroContent, f as ResolvedBackground, R as RichText, c as RichTextPrimitiveProps, S as SectionBackground, g as SectionBackgroundProps, T as TipTapNode, b as buildThemeRuntime, d as resolveBackground, r as resolveImageUrl } from './components-
|
|
5
|
+
export { e as BackgroundInput, B as BodyTextContent, H as HeroContent, f as ResolvedBackground, R as RichText, c as RichTextPrimitiveProps, S as SectionBackground, g as SectionBackgroundProps, T as TipTapNode, b as buildThemeRuntime, d as resolveBackground, r as resolveImageUrl } from './components-ClFs4PUa.js';
|
|
6
6
|
import './types-CAnC529E.js';
|
|
7
7
|
import 'react/jsx-runtime';
|
|
8
8
|
import 'react';
|
|
9
9
|
import 'zod';
|
|
10
|
-
import './types-
|
|
10
|
+
import './types-DuQCNVV0.js';
|
|
11
11
|
import './blockKinds-B6MWzNWp.js';
|
|
12
12
|
import '@riverbankcms/site-renderer';
|
|
13
13
|
import '@riverbankcms/ai';
|
package/dist/server/data.d.mts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { P as PageOutline, S as SdkCustomBlock } from './schema-Bpy9N5ZI.mjs';
|
|
2
|
-
import { P as PrefetchContext, R as ResolvedBlockData, D as DataLoaderOverrides } from './types-
|
|
3
|
-
export { B as BlockLoaderMap, a as DataLoaderContext, b as DataLoaderFn } from './types-
|
|
2
|
+
import { P as PrefetchContext, R as ResolvedBlockData, D as DataLoaderOverrides } from './types-CbagRQ_7.mjs';
|
|
3
|
+
export { B as BlockLoaderMap, a as DataLoaderContext, b as DataLoaderFn } from './types-CbagRQ_7.mjs';
|
|
4
4
|
import { R as RiverbankClient } from './types-BC9eB2KH.mjs';
|
|
5
5
|
import 'zod';
|
|
6
6
|
import './blockKinds-B6MWzNWp.mjs';
|
|
@@ -96,7 +96,9 @@ declare function prefetchBlockData(page: PageOutline, context: PrefetchContext,
|
|
|
96
96
|
* // codeData: { 'block-123': { products: [...] } }
|
|
97
97
|
* ```
|
|
98
98
|
*/
|
|
99
|
-
declare function executeCodeLoaders(page: PageOutline, context: PrefetchContext
|
|
99
|
+
declare function executeCodeLoaders(page: PageOutline, context: PrefetchContext & {
|
|
100
|
+
searchParams?: Record<string, string | string[] | undefined>;
|
|
101
|
+
}, overrides: DataLoaderOverrides): Promise<ResolvedBlockData>;
|
|
100
102
|
/**
|
|
101
103
|
* Merge resolved data from config loaders and code loaders.
|
|
102
104
|
*
|
package/dist/server/data.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { P as PageOutline, S as SdkCustomBlock } from './schema-Bpy9N5ZI.js';
|
|
2
|
-
import { P as PrefetchContext, R as ResolvedBlockData, D as DataLoaderOverrides } from './types-
|
|
3
|
-
export { B as BlockLoaderMap, a as DataLoaderContext, b as DataLoaderFn } from './types-
|
|
2
|
+
import { P as PrefetchContext, R as ResolvedBlockData, D as DataLoaderOverrides } from './types-DuQCNVV0.js';
|
|
3
|
+
export { B as BlockLoaderMap, a as DataLoaderContext, b as DataLoaderFn } from './types-DuQCNVV0.js';
|
|
4
4
|
import { R as RiverbankClient } from './types-CAnC529E.js';
|
|
5
5
|
import 'zod';
|
|
6
6
|
import './blockKinds-B6MWzNWp.js';
|
|
@@ -96,7 +96,9 @@ declare function prefetchBlockData(page: PageOutline, context: PrefetchContext,
|
|
|
96
96
|
* // codeData: { 'block-123': { products: [...] } }
|
|
97
97
|
* ```
|
|
98
98
|
*/
|
|
99
|
-
declare function executeCodeLoaders(page: PageOutline, context: PrefetchContext
|
|
99
|
+
declare function executeCodeLoaders(page: PageOutline, context: PrefetchContext & {
|
|
100
|
+
searchParams?: Record<string, string | string[] | undefined>;
|
|
101
|
+
}, overrides: DataLoaderOverrides): Promise<ResolvedBlockData>;
|
|
100
102
|
/**
|
|
101
103
|
* Merge resolved data from config loaders and code loaders.
|
|
102
104
|
*
|
package/dist/server/data.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
var
|
|
4
|
+
var _chunkY7347JMZjs = require('./chunk-Y7347JMZ.js');
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
|
|
@@ -13,5 +13,5 @@ require('./chunk-DGUM43GV.js');
|
|
|
13
13
|
|
|
14
14
|
|
|
15
15
|
|
|
16
|
-
exports.SUPPORTED_LOADER_ENDPOINTS = _chunkHOY77YBFjs.SUPPORTED_LOADER_ENDPOINTS; exports.executeCodeLoaders =
|
|
16
|
+
exports.SUPPORTED_LOADER_ENDPOINTS = _chunkHOY77YBFjs.SUPPORTED_LOADER_ENDPOINTS; exports.executeCodeLoaders = _chunkY7347JMZjs.executeCodeLoaders; exports.mergeLoaderResults = _chunkY7347JMZjs.mergeLoaderResults; exports.prefetchBlockData = _chunkHOY77YBFjs.prefetchBlockData;
|
|
17
17
|
//# sourceMappingURL=data.js.map
|
package/dist/server/data.mjs
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { T as Theme } from './types-5XdVD2J1.js';
|
|
2
2
|
import './schema-Bpy9N5ZI.js';
|
|
3
3
|
import { R as RiverbankClient } from './types-CAnC529E.js';
|
|
4
|
-
import { P as PageProps } from './loadPage-
|
|
5
|
-
import { R as ResolvedBlockData } from './types-
|
|
4
|
+
import { P as PageProps } from './loadPage-naVvoua8.js';
|
|
5
|
+
import { R as ResolvedBlockData } from './types-DuQCNVV0.js';
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
8
|
* Server-side helper to fetch content (page or entry) by path.
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { T as Theme } from './types-BA-J9K8r.mjs';
|
|
2
2
|
import './schema-Bpy9N5ZI.mjs';
|
|
3
3
|
import { R as RiverbankClient } from './types-BC9eB2KH.mjs';
|
|
4
|
-
import { P as PageProps } from './loadPage-
|
|
5
|
-
import { R as ResolvedBlockData } from './types-
|
|
4
|
+
import { P as PageProps } from './loadPage-mavT3Jae.mjs';
|
|
5
|
+
import { R as ResolvedBlockData } from './types-CbagRQ_7.mjs';
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
8
|
* Server-side helper to fetch content (page or entry) by path.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
|
+
|
|
3
|
+
var _chunkSWPHIUVEjs = require('./chunk-SWPHIUVE.js');
|
|
4
|
+
require('./chunk-Y7347JMZ.js');
|
|
5
|
+
require('./chunk-HOY77YBF.js');
|
|
6
|
+
require('./chunk-EGTDJ4PL.js');
|
|
7
|
+
require('./chunk-DGUM43GV.js');
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
exports.loadPage = _chunkSWPHIUVEjs.loadPage;
|
|
11
|
+
//# sourceMappingURL=loadPage-DUHBXDEW.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/loadPage-
|
|
1
|
+
{"version":3,"sources":["/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/loadPage-DUHBXDEW.js"],"names":[],"mappings":"AAAA;AACE;AACF,sDAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B;AACE;AACF,6CAAC","file":"/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/loadPage-DUHBXDEW.js"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
loadPage
|
|
3
|
-
} from "./chunk-
|
|
4
|
-
import "./chunk-
|
|
3
|
+
} from "./chunk-ZEAJW6T3.mjs";
|
|
4
|
+
import "./chunk-A2FZMRDW.mjs";
|
|
5
5
|
import "./chunk-7DS4Q3GA.mjs";
|
|
6
6
|
import "./chunk-USQF2XTU.mjs";
|
|
7
7
|
import "./chunk-BJTO5JO5.mjs";
|
|
8
8
|
export {
|
|
9
9
|
loadPage
|
|
10
10
|
};
|
|
11
|
-
//# sourceMappingURL=loadPage-
|
|
11
|
+
//# sourceMappingURL=loadPage-LYVKY3WZ.mjs.map
|
|
@@ -5,7 +5,7 @@ import React__default, { ComponentType } from 'react';
|
|
|
5
5
|
import { P as PageOutline, S as SdkCustomBlock } from './schema-Bpy9N5ZI.mjs';
|
|
6
6
|
import { z } from 'zod';
|
|
7
7
|
import { T as Theme } from './types-BA-J9K8r.mjs';
|
|
8
|
-
import { R as ResolvedBlockData, D as DataLoaderOverrides } from './types-
|
|
8
|
+
import { R as ResolvedBlockData, D as DataLoaderOverrides } from './types-CbagRQ_7.mjs';
|
|
9
9
|
|
|
10
10
|
declare const colorTokens: readonly ["background/base", "background/elevated", "surface/base", "surface/subtle", "surface/inverted", "content/primary", "content/secondary", "accent/primary", "accent/secondary", "border/base"];
|
|
11
11
|
declare const typographyTokens: readonly ["display/hero", "display/section", "heading/large", "heading/medium", "heading/small", "body/normal", "body/small", "caption"];
|
|
@@ -288,6 +288,25 @@ type LoadPageParams = {
|
|
|
288
288
|
* ```
|
|
289
289
|
*/
|
|
290
290
|
dataLoaderOverrides?: DataLoaderOverrides;
|
|
291
|
+
/**
|
|
292
|
+
* URL search parameters from the page request.
|
|
293
|
+
* Passed to code-based data loaders for pagination, filtering, etc.
|
|
294
|
+
*
|
|
295
|
+
* @example
|
|
296
|
+
* ```typescript
|
|
297
|
+
* // In Next.js App Router
|
|
298
|
+
* export default async function Page({ params, searchParams }) {
|
|
299
|
+
* const pageData = await loadPage({
|
|
300
|
+
* client,
|
|
301
|
+
* siteId: 'site-123',
|
|
302
|
+
* path: `/${params.slug || ''}`,
|
|
303
|
+
* searchParams: await searchParams,
|
|
304
|
+
* });
|
|
305
|
+
* return <Page {...pageData} />;
|
|
306
|
+
* }
|
|
307
|
+
* ```
|
|
308
|
+
*/
|
|
309
|
+
searchParams?: Record<string, string | string[] | undefined>;
|
|
291
310
|
};
|
|
292
311
|
type LoadPageResult = Omit<PageProps, 'registry' | 'wrapBlock' | 'usePlaceholders' | 'blockOverrides'> & {
|
|
293
312
|
/**
|
|
@@ -5,7 +5,7 @@ import React__default, { ComponentType } from 'react';
|
|
|
5
5
|
import { P as PageOutline, S as SdkCustomBlock } from './schema-Bpy9N5ZI.js';
|
|
6
6
|
import { z } from 'zod';
|
|
7
7
|
import { T as Theme } from './types-5XdVD2J1.js';
|
|
8
|
-
import { R as ResolvedBlockData, D as DataLoaderOverrides } from './types-
|
|
8
|
+
import { R as ResolvedBlockData, D as DataLoaderOverrides } from './types-DuQCNVV0.js';
|
|
9
9
|
|
|
10
10
|
declare const colorTokens: readonly ["background/base", "background/elevated", "surface/base", "surface/subtle", "surface/inverted", "content/primary", "content/secondary", "accent/primary", "accent/secondary", "border/base"];
|
|
11
11
|
declare const typographyTokens: readonly ["display/hero", "display/section", "heading/large", "heading/medium", "heading/small", "body/normal", "body/small", "caption"];
|
|
@@ -288,6 +288,25 @@ type LoadPageParams = {
|
|
|
288
288
|
* ```
|
|
289
289
|
*/
|
|
290
290
|
dataLoaderOverrides?: DataLoaderOverrides;
|
|
291
|
+
/**
|
|
292
|
+
* URL search parameters from the page request.
|
|
293
|
+
* Passed to code-based data loaders for pagination, filtering, etc.
|
|
294
|
+
*
|
|
295
|
+
* @example
|
|
296
|
+
* ```typescript
|
|
297
|
+
* // In Next.js App Router
|
|
298
|
+
* export default async function Page({ params, searchParams }) {
|
|
299
|
+
* const pageData = await loadPage({
|
|
300
|
+
* client,
|
|
301
|
+
* siteId: 'site-123',
|
|
302
|
+
* path: `/${params.slug || ''}`,
|
|
303
|
+
* searchParams: await searchParams,
|
|
304
|
+
* });
|
|
305
|
+
* return <Page {...pageData} />;
|
|
306
|
+
* }
|
|
307
|
+
* ```
|
|
308
|
+
*/
|
|
309
|
+
searchParams?: Record<string, string | string[] | undefined>;
|
|
291
310
|
};
|
|
292
311
|
type LoadPageResult = Omit<PageProps, 'registry' | 'wrapBlock' | 'usePlaceholders' | 'blockOverrides'> & {
|
|
293
312
|
/**
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as LoadPageResult } from './loadPage-
|
|
1
|
+
import { a as LoadPageResult } from './loadPage-mavT3Jae.mjs';
|
|
2
2
|
import { S as SiteResponse } from './types-BC9eB2KH.mjs';
|
|
3
3
|
import 'react/jsx-runtime';
|
|
4
4
|
import 'react';
|
|
@@ -8,7 +8,7 @@ import './types-BA-J9K8r.mjs';
|
|
|
8
8
|
import '@riverbankcms/ai';
|
|
9
9
|
import '@riverbankcms/media-storage-supabase';
|
|
10
10
|
import '@riverbankcms/db';
|
|
11
|
-
import './types-
|
|
11
|
+
import './types-CbagRQ_7.mjs';
|
|
12
12
|
import './blockKinds-B6MWzNWp.mjs';
|
|
13
13
|
|
|
14
14
|
/**
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as LoadPageResult } from './loadPage-
|
|
1
|
+
import { a as LoadPageResult } from './loadPage-naVvoua8.js';
|
|
2
2
|
import { S as SiteResponse } from './types-CAnC529E.js';
|
|
3
3
|
import 'react/jsx-runtime';
|
|
4
4
|
import 'react';
|
|
@@ -8,7 +8,7 @@ import './types-5XdVD2J1.js';
|
|
|
8
8
|
import '@riverbankcms/ai';
|
|
9
9
|
import '@riverbankcms/media-storage-supabase';
|
|
10
10
|
import '@riverbankcms/db';
|
|
11
|
-
import './types-
|
|
11
|
+
import './types-DuQCNVV0.js';
|
|
12
12
|
import './blockKinds-B6MWzNWp.js';
|
|
13
13
|
|
|
14
14
|
/**
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { b as Page, P as PageProps } from '../loadPage-
|
|
1
|
+
export { b as Page, P as PageProps } from '../loadPage-mavT3Jae.mjs';
|
|
2
2
|
export { H as HeaderData, L as Layout, a as LayoutProps } from '../Layout-B_zUr9ci.mjs';
|
|
3
3
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
4
4
|
import * as React from 'react';
|
|
@@ -7,7 +7,7 @@ import '../schema-Bpy9N5ZI.mjs';
|
|
|
7
7
|
import { R as RiverbankClient } from '../types-BC9eB2KH.mjs';
|
|
8
8
|
import { B as BlockKind } from '../blockKinds-B6MWzNWp.mjs';
|
|
9
9
|
import 'zod';
|
|
10
|
-
import '../types-
|
|
10
|
+
import '../types-CbagRQ_7.mjs';
|
|
11
11
|
import '@riverbankcms/site-renderer';
|
|
12
12
|
import '@riverbankcms/ai';
|
|
13
13
|
import '@riverbankcms/media-storage-supabase';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { b as Page, P as PageProps } from '../loadPage-
|
|
1
|
+
export { b as Page, P as PageProps } from '../loadPage-naVvoua8.js';
|
|
2
2
|
export { H as HeaderData, L as Layout, a as LayoutProps } from '../Layout-CHG77dhK.js';
|
|
3
3
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
4
4
|
import * as React from 'react';
|
|
@@ -7,7 +7,7 @@ import '../schema-Bpy9N5ZI.js';
|
|
|
7
7
|
import { R as RiverbankClient } from '../types-CAnC529E.js';
|
|
8
8
|
import { B as BlockKind } from '../blockKinds-B6MWzNWp.js';
|
|
9
9
|
import 'zod';
|
|
10
|
-
import '../types-
|
|
10
|
+
import '../types-DuQCNVV0.js';
|
|
11
11
|
import '@riverbankcms/site-renderer';
|
|
12
12
|
import '@riverbankcms/ai';
|
|
13
13
|
import '@riverbankcms/media-storage-supabase';
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
export { e as BlockOverrideComponent, B as BlockOverrides, L as LoadPageParams, a as LoadPageResult, b as Page, P as PageProps, c as PageRenderer, d as RouteMap, S as SystemBlockComponentProps, T as ThemeTokens, l as loadPage } from './loadPage-
|
|
1
|
+
export { e as BlockOverrideComponent, B as BlockOverrides, L as LoadPageParams, a as LoadPageResult, b as Page, P as PageProps, c as PageRenderer, d as RouteMap, S as SystemBlockComponentProps, T as ThemeTokens, l as loadPage } from './loadPage-mavT3Jae.mjs';
|
|
2
2
|
export { H as HeaderData, L as Layout, a as LayoutProps } from './Layout-B_zUr9ci.mjs';
|
|
3
3
|
export { Block, BlockProps } from './rendering/server.mjs';
|
|
4
|
-
export { C as ContentEntryData, L as LoadContentParams, b as LoadContentResult, a as isEntryContent, i as isPageContent, l as loadContent } from './loadContent-
|
|
4
|
+
export { C as ContentEntryData, L as LoadContentParams, b as LoadContentResult, a as isEntryContent, i as isPageContent, l as loadContent } from './loadContent-C_FipaAC.mjs';
|
|
5
5
|
export { C as CustomLinkValue, E as ExternalLinkValue, I as InternalLinkValue, d as LinkValue, c as SiteFooterContent, S as SiteHeaderContent, T as Theme } from './types-BA-J9K8r.mjs';
|
|
6
6
|
export { P as PageOutline } from './schema-Bpy9N5ZI.mjs';
|
|
7
|
-
import { G as GradientConfig, M as Media } from './components-
|
|
8
|
-
export { e as BackgroundInput, B as BodyTextContent, H as HeroContent, a as HeroMedia, f as ResolvedBackground, R as RichText, c as RichTextPrimitiveProps, S as SectionBackground, g as SectionBackgroundProps, T as TipTapNode, b as buildThemeRuntime, d as resolveBackground, r as resolveImageUrl } from './components-
|
|
7
|
+
import { G as GradientConfig, M as Media } from './components-Bo3LPpVb.mjs';
|
|
8
|
+
export { e as BackgroundInput, B as BodyTextContent, H as HeroContent, a as HeroMedia, f as ResolvedBackground, R as RichText, c as RichTextPrimitiveProps, S as SectionBackground, g as SectionBackgroundProps, T as TipTapNode, b as buildThemeRuntime, d as resolveBackground, r as resolveImageUrl } from './components-Bo3LPpVb.mjs';
|
|
9
9
|
import './types-BC9eB2KH.mjs';
|
|
10
10
|
import 'react/jsx-runtime';
|
|
11
11
|
import 'react';
|
|
12
12
|
import 'zod';
|
|
13
|
-
import './types-
|
|
13
|
+
import './types-CbagRQ_7.mjs';
|
|
14
14
|
import './blockKinds-B6MWzNWp.mjs';
|
|
15
15
|
import '@riverbankcms/site-renderer';
|
|
16
16
|
import '@riverbankcms/ai';
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
export { e as BlockOverrideComponent, B as BlockOverrides, L as LoadPageParams, a as LoadPageResult, b as Page, P as PageProps, c as PageRenderer, d as RouteMap, S as SystemBlockComponentProps, T as ThemeTokens, l as loadPage } from './loadPage-
|
|
1
|
+
export { e as BlockOverrideComponent, B as BlockOverrides, L as LoadPageParams, a as LoadPageResult, b as Page, P as PageProps, c as PageRenderer, d as RouteMap, S as SystemBlockComponentProps, T as ThemeTokens, l as loadPage } from './loadPage-naVvoua8.js';
|
|
2
2
|
export { H as HeaderData, L as Layout, a as LayoutProps } from './Layout-CHG77dhK.js';
|
|
3
3
|
export { Block, BlockProps } from './rendering/server.js';
|
|
4
|
-
export { C as ContentEntryData, L as LoadContentParams, b as LoadContentResult, a as isEntryContent, i as isPageContent, l as loadContent } from './loadContent-
|
|
4
|
+
export { C as ContentEntryData, L as LoadContentParams, b as LoadContentResult, a as isEntryContent, i as isPageContent, l as loadContent } from './loadContent-C2SwqmXy.js';
|
|
5
5
|
export { C as CustomLinkValue, E as ExternalLinkValue, I as InternalLinkValue, d as LinkValue, c as SiteFooterContent, S as SiteHeaderContent, T as Theme } from './types-5XdVD2J1.js';
|
|
6
6
|
export { P as PageOutline } from './schema-Bpy9N5ZI.js';
|
|
7
|
-
import { G as GradientConfig, M as Media } from './components-
|
|
8
|
-
export { e as BackgroundInput, B as BodyTextContent, H as HeroContent, a as HeroMedia, f as ResolvedBackground, R as RichText, c as RichTextPrimitiveProps, S as SectionBackground, g as SectionBackgroundProps, T as TipTapNode, b as buildThemeRuntime, d as resolveBackground, r as resolveImageUrl } from './components-
|
|
7
|
+
import { G as GradientConfig, M as Media } from './components-ClFs4PUa.js';
|
|
8
|
+
export { e as BackgroundInput, B as BodyTextContent, H as HeroContent, a as HeroMedia, f as ResolvedBackground, R as RichText, c as RichTextPrimitiveProps, S as SectionBackground, g as SectionBackgroundProps, T as TipTapNode, b as buildThemeRuntime, d as resolveBackground, r as resolveImageUrl } from './components-ClFs4PUa.js';
|
|
9
9
|
import './types-CAnC529E.js';
|
|
10
10
|
import 'react/jsx-runtime';
|
|
11
11
|
import 'react';
|
|
12
12
|
import 'zod';
|
|
13
|
-
import './types-
|
|
13
|
+
import './types-DuQCNVV0.js';
|
|
14
14
|
import './blockKinds-B6MWzNWp.js';
|
|
15
15
|
import '@riverbankcms/site-renderer';
|
|
16
16
|
import '@riverbankcms/ai';
|
package/dist/server/rendering.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
var _chunkTO7FD6TQjs = require('./chunk-TO7FD6TQ.js');
|
|
6
6
|
|
|
7
7
|
|
|
8
|
-
var
|
|
8
|
+
var _chunkSWPHIUVEjs = require('./chunk-SWPHIUVE.js');
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
var _chunkBUCJWG6Gjs = require('./chunk-BUCJWG6G.js');
|
|
@@ -21,7 +21,7 @@ var _chunkP6CDRJN3js = require('./chunk-P6CDRJN3.js');
|
|
|
21
21
|
|
|
22
22
|
|
|
23
23
|
var _chunkIT5ICP43js = require('./chunk-IT5ICP43.js');
|
|
24
|
-
require('./chunk-
|
|
24
|
+
require('./chunk-Y7347JMZ.js');
|
|
25
25
|
require('./chunk-HOY77YBF.js');
|
|
26
26
|
require('./chunk-EGTDJ4PL.js');
|
|
27
27
|
require('./chunk-DGUM43GV.js');
|
|
@@ -39,5 +39,5 @@ require('./chunk-DGUM43GV.js');
|
|
|
39
39
|
|
|
40
40
|
|
|
41
41
|
|
|
42
|
-
exports.Block = _chunkBUCJWG6Gjs.Block; exports.Layout = _chunkP6CDRJN3js.Layout; exports.Page = _chunkP6CDRJN3js.Page; exports.PageRenderer = _chunkIT5ICP43js.PageRenderer; exports.RichText = _chunkIT5ICP43js.RichText; exports.SectionBackground = _chunkIT5ICP43js.SectionBackground; exports.buildThemeRuntime = _chunkIT5ICP43js.buildThemeRuntime; exports.isEntryContent = _chunkTO7FD6TQjs.isEntryContent; exports.isPageContent = _chunkTO7FD6TQjs.isPageContent; exports.loadContent = _chunkTO7FD6TQjs.loadContent; exports.loadPage =
|
|
42
|
+
exports.Block = _chunkBUCJWG6Gjs.Block; exports.Layout = _chunkP6CDRJN3js.Layout; exports.Page = _chunkP6CDRJN3js.Page; exports.PageRenderer = _chunkIT5ICP43js.PageRenderer; exports.RichText = _chunkIT5ICP43js.RichText; exports.SectionBackground = _chunkIT5ICP43js.SectionBackground; exports.buildThemeRuntime = _chunkIT5ICP43js.buildThemeRuntime; exports.isEntryContent = _chunkTO7FD6TQjs.isEntryContent; exports.isPageContent = _chunkTO7FD6TQjs.isPageContent; exports.loadContent = _chunkTO7FD6TQjs.loadContent; exports.loadPage = _chunkSWPHIUVEjs.loadPage; exports.resolveBackground = _chunkIT5ICP43js.resolveBackground; exports.resolveImageUrl = _chunkIT5ICP43js.resolveImageUrl;
|
|
43
43
|
//# sourceMappingURL=rendering.js.map
|
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
} from "./chunk-OP2GHK27.mjs";
|
|
6
6
|
import {
|
|
7
7
|
loadPage
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-ZEAJW6T3.mjs";
|
|
9
9
|
import {
|
|
10
10
|
Block
|
|
11
11
|
} from "./chunk-XK2YIISA.mjs";
|
|
@@ -21,7 +21,7 @@ import {
|
|
|
21
21
|
resolveBackground,
|
|
22
22
|
resolveImageUrl
|
|
23
23
|
} from "./chunk-NKXS4TBK.mjs";
|
|
24
|
-
import "./chunk-
|
|
24
|
+
import "./chunk-A2FZMRDW.mjs";
|
|
25
25
|
import "./chunk-7DS4Q3GA.mjs";
|
|
26
26
|
import "./chunk-USQF2XTU.mjs";
|
|
27
27
|
import "./chunk-BJTO5JO5.mjs";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { R as RiverbankClient } from './types-BC9eB2KH.mjs';
|
|
2
|
-
import { a as LoadPageResult } from './loadPage-
|
|
2
|
+
import { a as LoadPageResult } from './loadPage-mavT3Jae.mjs';
|
|
3
3
|
import './types-BA-J9K8r.mjs';
|
|
4
4
|
import '@riverbankcms/ai';
|
|
5
5
|
import './schema-Bpy9N5ZI.mjs';
|
|
@@ -8,7 +8,7 @@ import '@riverbankcms/media-storage-supabase';
|
|
|
8
8
|
import '@riverbankcms/db';
|
|
9
9
|
import 'react/jsx-runtime';
|
|
10
10
|
import 'react';
|
|
11
|
-
import './types-
|
|
11
|
+
import './types-CbagRQ_7.mjs';
|
|
12
12
|
import './blockKinds-B6MWzNWp.mjs';
|
|
13
13
|
|
|
14
14
|
/**
|
package/dist/server/routing.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { R as RiverbankClient } from './types-CAnC529E.js';
|
|
2
|
-
import { a as LoadPageResult } from './loadPage-
|
|
2
|
+
import { a as LoadPageResult } from './loadPage-naVvoua8.js';
|
|
3
3
|
import './types-5XdVD2J1.js';
|
|
4
4
|
import '@riverbankcms/ai';
|
|
5
5
|
import './schema-Bpy9N5ZI.js';
|
|
@@ -8,7 +8,7 @@ import '@riverbankcms/media-storage-supabase';
|
|
|
8
8
|
import '@riverbankcms/db';
|
|
9
9
|
import 'react/jsx-runtime';
|
|
10
10
|
import 'react';
|
|
11
|
-
import './types-
|
|
11
|
+
import './types-DuQCNVV0.js';
|
|
12
12
|
import './blockKinds-B6MWzNWp.js';
|
|
13
13
|
|
|
14
14
|
/**
|
package/dist/server/routing.js
CHANGED
|
@@ -10,7 +10,7 @@ async function resolveRoute(params) {
|
|
|
10
10
|
preview
|
|
11
11
|
});
|
|
12
12
|
if (pageResponse) {
|
|
13
|
-
const { loadPage } = await Promise.resolve().then(() => _interopRequireWildcard(require("./loadPage-
|
|
13
|
+
const { loadPage } = await Promise.resolve().then(() => _interopRequireWildcard(require("./loadPage-DUHBXDEW.js")));
|
|
14
14
|
const pageData = await loadPage({
|
|
15
15
|
client,
|
|
16
16
|
siteId,
|
package/dist/server/routing.mjs
CHANGED
|
@@ -10,7 +10,7 @@ async function resolveRoute(params) {
|
|
|
10
10
|
preview
|
|
11
11
|
});
|
|
12
12
|
if (pageResponse) {
|
|
13
|
-
const { loadPage } = await import("./loadPage-
|
|
13
|
+
const { loadPage } = await import("./loadPage-LYVKY3WZ.mjs");
|
|
14
14
|
const pageData = await loadPage({
|
|
15
15
|
client,
|
|
16
16
|
siteId,
|
package/dist/server/server.d.mts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export { c as createRiverbankClient } from './index-Dj7VKH34.mjs';
|
|
2
2
|
export { E as EntriesResponse, b as EntryResponse, P as PageResponse, R as RiverbankClient, a as RiverbankClientConfig, S as SiteResponse } from './types-BC9eB2KH.mjs';
|
|
3
|
-
export { L as LoadPageParams, a as LoadPageResult, R as RuntimeSdkConfig, l as loadPage } from './loadPage-
|
|
4
|
-
export { C as ContentEntryData, E as EntryContentResult, L as LoadContentParams, b as LoadContentResult, P as PageContentResult, a as isEntryContent, i as isPageContent, l as loadContent } from './loadContent-
|
|
3
|
+
export { L as LoadPageParams, a as LoadPageResult, R as RuntimeSdkConfig, l as loadPage } from './loadPage-mavT3Jae.mjs';
|
|
4
|
+
export { C as ContentEntryData, E as EntryContentResult, L as LoadContentParams, b as LoadContentResult, P as PageContentResult, a as isEntryContent, i as isPageContent, l as loadContent } from './loadContent-C_FipaAC.mjs';
|
|
5
5
|
import './types-BA-J9K8r.mjs';
|
|
6
6
|
import '@riverbankcms/ai';
|
|
7
7
|
import './schema-Bpy9N5ZI.mjs';
|
|
@@ -10,5 +10,5 @@ import '@riverbankcms/media-storage-supabase';
|
|
|
10
10
|
import '@riverbankcms/db';
|
|
11
11
|
import 'react/jsx-runtime';
|
|
12
12
|
import 'react';
|
|
13
|
-
import './types-
|
|
13
|
+
import './types-CbagRQ_7.mjs';
|
|
14
14
|
import './blockKinds-B6MWzNWp.mjs';
|
package/dist/server/server.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export { c as createRiverbankClient } from './index-DbSfrRA0.js';
|
|
2
2
|
export { E as EntriesResponse, b as EntryResponse, P as PageResponse, R as RiverbankClient, a as RiverbankClientConfig, S as SiteResponse } from './types-CAnC529E.js';
|
|
3
|
-
export { L as LoadPageParams, a as LoadPageResult, R as RuntimeSdkConfig, l as loadPage } from './loadPage-
|
|
4
|
-
export { C as ContentEntryData, E as EntryContentResult, L as LoadContentParams, b as LoadContentResult, P as PageContentResult, a as isEntryContent, i as isPageContent, l as loadContent } from './loadContent-
|
|
3
|
+
export { L as LoadPageParams, a as LoadPageResult, R as RuntimeSdkConfig, l as loadPage } from './loadPage-naVvoua8.js';
|
|
4
|
+
export { C as ContentEntryData, E as EntryContentResult, L as LoadContentParams, b as LoadContentResult, P as PageContentResult, a as isEntryContent, i as isPageContent, l as loadContent } from './loadContent-C2SwqmXy.js';
|
|
5
5
|
import './types-5XdVD2J1.js';
|
|
6
6
|
import '@riverbankcms/ai';
|
|
7
7
|
import './schema-Bpy9N5ZI.js';
|
|
@@ -10,5 +10,5 @@ import '@riverbankcms/media-storage-supabase';
|
|
|
10
10
|
import '@riverbankcms/db';
|
|
11
11
|
import 'react/jsx-runtime';
|
|
12
12
|
import 'react';
|
|
13
|
-
import './types-
|
|
13
|
+
import './types-DuQCNVV0.js';
|
|
14
14
|
import './blockKinds-B6MWzNWp.js';
|
package/dist/server/server.js
CHANGED
|
@@ -8,8 +8,8 @@ var _chunkR5B6IOFQjs = require('./chunk-R5B6IOFQ.js');
|
|
|
8
8
|
var _chunkTO7FD6TQjs = require('./chunk-TO7FD6TQ.js');
|
|
9
9
|
|
|
10
10
|
|
|
11
|
-
var
|
|
12
|
-
require('./chunk-
|
|
11
|
+
var _chunkSWPHIUVEjs = require('./chunk-SWPHIUVE.js');
|
|
12
|
+
require('./chunk-Y7347JMZ.js');
|
|
13
13
|
require('./chunk-HOY77YBF.js');
|
|
14
14
|
require('./chunk-EGTDJ4PL.js');
|
|
15
15
|
require('./chunk-DGUM43GV.js');
|
|
@@ -19,5 +19,5 @@ require('./chunk-DGUM43GV.js');
|
|
|
19
19
|
|
|
20
20
|
|
|
21
21
|
|
|
22
|
-
exports.createRiverbankClient = _chunkR5B6IOFQjs.createRiverbankClient; exports.isEntryContent = _chunkTO7FD6TQjs.isEntryContent; exports.isPageContent = _chunkTO7FD6TQjs.isPageContent; exports.loadContent = _chunkTO7FD6TQjs.loadContent; exports.loadPage =
|
|
22
|
+
exports.createRiverbankClient = _chunkR5B6IOFQjs.createRiverbankClient; exports.isEntryContent = _chunkTO7FD6TQjs.isEntryContent; exports.isPageContent = _chunkTO7FD6TQjs.isPageContent; exports.loadContent = _chunkTO7FD6TQjs.loadContent; exports.loadPage = _chunkSWPHIUVEjs.loadPage;
|
|
23
23
|
//# sourceMappingURL=server.js.map
|
package/dist/server/server.mjs
CHANGED
|
@@ -8,8 +8,8 @@ import {
|
|
|
8
8
|
} from "./chunk-OP2GHK27.mjs";
|
|
9
9
|
import {
|
|
10
10
|
loadPage
|
|
11
|
-
} from "./chunk-
|
|
12
|
-
import "./chunk-
|
|
11
|
+
} from "./chunk-ZEAJW6T3.mjs";
|
|
12
|
+
import "./chunk-A2FZMRDW.mjs";
|
|
13
13
|
import "./chunk-7DS4Q3GA.mjs";
|
|
14
14
|
import "./chunk-USQF2XTU.mjs";
|
|
15
15
|
import "./chunk-BJTO5JO5.mjs";
|
|
@@ -55,6 +55,21 @@ interface DataLoaderContext {
|
|
|
55
55
|
content: Record<string, unknown>;
|
|
56
56
|
/** Whether fetching preview/draft content */
|
|
57
57
|
previewStage: 'published' | 'preview';
|
|
58
|
+
/**
|
|
59
|
+
* URL search parameters from the page request.
|
|
60
|
+
* Use for pagination, filtering, or sorting based on URL params.
|
|
61
|
+
*
|
|
62
|
+
* Always defined (defaults to empty object if not provided to loadPage).
|
|
63
|
+
* This allows loaders to safely access properties without null checks.
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* ```typescript
|
|
67
|
+
* const page = parseInt(searchParams?.page as string || '1', 10);
|
|
68
|
+
* const limit = parseInt(content.postsPerPage as string || '12', 10);
|
|
69
|
+
* const offset = (page - 1) * limit;
|
|
70
|
+
* ```
|
|
71
|
+
*/
|
|
72
|
+
searchParams: Record<string, string | string[] | undefined>;
|
|
58
73
|
}
|
|
59
74
|
/**
|
|
60
75
|
* A code-based data loader function.
|
|
@@ -55,6 +55,21 @@ interface DataLoaderContext {
|
|
|
55
55
|
content: Record<string, unknown>;
|
|
56
56
|
/** Whether fetching preview/draft content */
|
|
57
57
|
previewStage: 'published' | 'preview';
|
|
58
|
+
/**
|
|
59
|
+
* URL search parameters from the page request.
|
|
60
|
+
* Use for pagination, filtering, or sorting based on URL params.
|
|
61
|
+
*
|
|
62
|
+
* Always defined (defaults to empty object if not provided to loadPage).
|
|
63
|
+
* This allows loaders to safely access properties without null checks.
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* ```typescript
|
|
67
|
+
* const page = parseInt(searchParams?.page as string || '1', 10);
|
|
68
|
+
* const limit = parseInt(content.postsPerPage as string || '12', 10);
|
|
69
|
+
* const offset = (page - 1) * limit;
|
|
70
|
+
* ```
|
|
71
|
+
*/
|
|
72
|
+
searchParams: Record<string, string | string[] | undefined>;
|
|
58
73
|
}
|
|
59
74
|
/**
|
|
60
75
|
* A code-based data loader function.
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/chunk-FPYK6527.js","../../src/rendering/helpers/loadPage.ts"],"names":[],"mappings":"AAAA;AACE;AACA;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACA;ACqHA,MAAA,SAAsB,QAAA,CAAS,MAAA,EAAiD;AAC9E,EAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,QAAA,EAAU,KAAA,EAAO,oBAAoB,EAAA,EAAI,MAAA;AAG/E,EAAA,MAAM,CAAC,IAAA,EAAM,YAAY,EAAA,EAAI,MAAM,OAAA,CAAQ,GAAA,CAAI;AAAA,IAC7C,MAAA,CAAO,OAAA,CAAQ,EAAE,EAAA,EAAI,OAAO,CAAC,CAAA;AAAA,IAC7B,MAAA,CAAO,OAAA,CAAQ,EAAE,MAAA,EAAQ,IAAA,EAAM,QAAQ,CAAC;AAAA,EAC1C,CAAC,CAAA;AAGD,EAAA,GAAA,CAAI,QAAA,GAAW,YAAA,EAAc;AAC3B,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,IAGF,CAAA;AAAA,EACF;AAEA,EAAA,MAAM,EAAE,IAAA,EAAM,SAAS,EAAA,EAAI,YAAA;AAI3B,EAAA,MAAM,OAAA,EAAS,QAAA,CAAS,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,EAAA,GAAU;AAC5C,IAAA,GAAA,CAAI,CAAC,MAAA,GAAS,OAAO,MAAA,IAAU,QAAA,EAAU;AACvC,MAAA,MAAM,IAAI,KAAA,CAAM,sCAAsC,CAAA;AAAA,IACxD;AACA,IAAA,GAAA,CAAI,OAAO,KAAA,CAAM,GAAA,IAAO,SAAA,GAAY,KAAA,CAAM,GAAA,IAAO,IAAA,EAAM;AACrD,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,+CAAA,EAAkD,OAAO,KAAA,CAAM,EAAE,CAAA,CAAA;AACnF,IAAA;AACoC,IAAA;AAC6C,MAAA;AACjF,IAAA;AACuC,IAAA;AACuC,MAAA;AAC9E,IAAA;AAKmB,IAAA;AAQZ,IAAA;AACU,MAAA;AACE,MAAA;AACG,MAAA;AAAA;AAEY,MAAA;AAAA;AAEe,MAAA;AACjD,IAAA;AACD,EAAA;AAEmB,EAAA;AACH,IAAA;AACA,IAAA;AACG,IAAA;AAClB,IAAA;AACF,EAAA;AAGmG,EAAA;AACjG,IAAA;AAC2B,IAAA;AACS,IAAA;AACtC,EAAA;AAGyB,EAAA;AACvB,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AAAA;AAEgC,MAAA;AAChC,IAAA;AACF,EAAA;AAGmB,EAAA;AACqD,EAAA;AACE,IAAA;AAClB,IAAA;AACxD,EAAA;AAEO,EAAA;AACC,IAAA;AACM,IAAA;AACiB,IAAA;AAC7B,IAAA;AACA,IAAA;AAAA;AAAA;AAAA;AAIF,EAAA;AACF;ADhJwF;AACA;AACA;AACA","file":"/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/chunk-FPYK6527.js","sourcesContent":[null,"/**\n * Server-side helper to fetch all data needed for <Page> component.\n *\n * Use this in server components, getServerSideProps, or API routes.\n */\n\nimport type { RiverbankClient, SiteResponse } from '../../client/types';\nimport type { PageProps } from '../components/Page';\nimport { prefetchBlockData } from '../../data/prefetchBlockData';\nimport { executeCodeLoaders, mergeLoaderResults } from '../../data/executeCodeLoaders';\nimport type { DataLoaderOverrides } from '../../data/types';\n\n/**\n * SDK config from API response (without siteId which is stripped at storage).\n * This is the runtime representation - for defining configs, use RiverbankSiteConfig.\n */\nexport type RuntimeSdkConfig = NonNullable<SiteResponse['sdkConfig']>;\n\nexport type LoadPageParams = {\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 * Code-based data loaders for custom blocks.\n *\n * Use this to fetch data from external APIs (not just whitelisted CMS endpoints).\n * Keys are block kinds (e.g., 'custom.featured-products').\n *\n * Config-based loaders (defined in riverbank.config.ts) run first.\n * Code loaders run second and take precedence on key conflicts.\n *\n * @example\n * ```typescript\n * const pageData = await loadPage({\n * client,\n * siteId: 'site-123',\n * path: '/',\n * dataLoaderOverrides: {\n * 'custom.featured-products': {\n * products: async (ctx) => {\n * const res = await fetch(`https://api.shop.com/products?category=${ctx.content.categoryId}`);\n * return res.json();\n * },\n * },\n * },\n * });\n * ```\n */\n dataLoaderOverrides?: DataLoaderOverrides;\n};\n\nexport type LoadPageResult = Omit<PageProps, 'registry' | 'wrapBlock' | 'usePlaceholders' | 'blockOverrides'> & {\n /**\n * SDK site configuration, if available.\n * Contains SDK-defined theme palette, section backgrounds, and style options.\n */\n sdkConfig: RuntimeSdkConfig | null;\n};\n\n/**\n * Server-side helper to fetch all data needed for <Page> component.\n *\n * Fetches site data, page data, and prefetches block data loaders in parallel.\n *\n * @example Next.js App Router (published content)\n * ```tsx\n * import { createRiverbankClient } from '@riverbankcms/sdk';\n * import { loadPage, Page } from '@riverbankcms/sdk/rendering';\n *\n * const client = createRiverbankClient({\n * apiKey: process.env.RIVERBANK_API_KEY!,\n * baseUrl: process.env.NEXT_PUBLIC_DASHBOARD_URL + '/api',\n * });\n *\n * export default async function PageRoute({ params }) {\n * const pageData = await loadPage({\n * client,\n * siteId: 'site-123',\n * path: `/${params.slug || ''}`,\n * });\n *\n * return <Page {...pageData} />;\n * }\n * ```\n *\n * @example Next.js App Router (preview/draft content)\n * ```tsx\n * export default async function PreviewRoute({ params, searchParams }) {\n * const pageData = await loadPage({\n * client,\n * siteId: searchParams.siteId,\n * path: `/${params.slug || ''}`,\n * preview: true, // Fetch draft content\n * });\n *\n * return <Page {...pageData} />;\n * }\n * ```\n *\n * @example Next.js Pages Router (getServerSideProps)\n * ```tsx\n * export async function getServerSideProps({ params }) {\n * const pageData = await loadPage({\n * client,\n * siteId: 'site-123',\n * path: `/${params.slug || ''}`,\n * });\n *\n * return { props: pageData };\n * }\n *\n * export default function PageRoute(props) {\n * return <Page {...props} />;\n * }\n * ```\n */\nexport async function loadPage(params: LoadPageParams): Promise<LoadPageResult> {\n const { client, siteId, path, pageId, preview = false, dataLoaderOverrides } = params;\n\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 // 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 loadContent() instead, which handles both pages and entries. ' +\n 'For entries, loadContent() 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 with content\n // API returns blocks with full content - PageRenderer needs the content field for rendering\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\n // Include content for rendering\n // API provides `content` (active content for the requested stage)\n // and optionally `draftContent` for preview mode\n const typedBlock = block as {\n id: string | null;\n kind: string;\n purpose: string;\n content?: Record<string, unknown>;\n draftContent?: { data: Record<string, unknown> } | null;\n };\n\n return {\n id: typedBlock.id,\n kind: typedBlock.kind,\n purpose: typedBlock.purpose,\n // Include content for PageRenderer's getRenderableContent()\n content: typedBlock.content ?? {},\n // Include draftContent if available (for preview mode)\n draftContent: typedBlock.draftContent?.data ?? null,\n };\n });\n\n const pageOutline = {\n name: pageData.name,\n path: pageData.path,\n purpose: pageData.purpose,\n blocks,\n };\n\n // Build prefetch context\n const prefetchContext: { siteId: string; pageId: string; previewStage: 'published' | 'preview' } = {\n siteId,\n pageId: pageId ?? pageData.id,\n previewStage: preview ? 'preview' : 'published',\n };\n\n // Prefetch block data loaders (config-based loaders for CMS endpoints)\n const configData = await prefetchBlockData(\n pageOutline,\n prefetchContext,\n client,\n {\n // Pass custom blocks so their config-based loaders are discovered\n customBlocks: site.sdkConfig?.customBlocks,\n }\n );\n\n // Execute code-based loaders (external APIs) and merge results\n let resolvedData = configData;\n if (dataLoaderOverrides && Object.keys(dataLoaderOverrides).length > 0) {\n const codeData = await executeCodeLoaders(pageOutline, prefetchContext, dataLoaderOverrides);\n resolvedData = mergeLoaderResults(configData, codeData);\n }\n\n return {\n page: pageOutline,\n theme: site.theme,\n sdkConfig: site.sdkConfig ?? null,\n siteId,\n resolvedData,\n // Note: routeMap is optional and can be built from site data if needed for internal links.\n // Consumers can construct it from site.pages and pass explicitly via Page component props.\n // Example: const routeMap = site.pages.reduce((map, p) => ({ ...map, [p.id]: p.path }), {});\n };\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/chunk-G4CKM4EN.js","../../src/data/executeCodeLoaders.ts"],"names":[],"mappings":"AAAA;ACkCA,MAAA,SAAsB,kBAAA,CACpB,IAAA,EACA,OAAA,EACA,SAAA,EAC4B;AAC5B,EAAA,MAAM,QAAA,EAA6B,CAAC,CAAA;AACpC,EAAA,MAAM,MAAA,EAAyB,CAAC,CAAA;AAEhC,EAAA,IAAA,CAAA,MAAW,MAAA,GAAS,IAAA,CAAK,MAAA,EAAQ;AAC/B,IAAA,MAAM,QAAA,EAAU,KAAA,CAAM,EAAA;AACtB,IAAA,GAAA,CAAI,CAAC,OAAA,EAAS,QAAA;AAGd,IAAA,MAAM,aAAA,EAAe,SAAA,CAAU,KAAA,CAAM,IAAI,CAAA;AACzC,IAAA,GAAA,CAAI,CAAC,YAAA,EAAc,QAAA;AAGnB,IAAA,MAAM,QAAA,oCACH,KAAA,CAAqC,YAAA,UACrC,KAAA,CAAgC,SAAA,UACjC,CAAC,GAAA;AAIH,IAAA,IAAA,CAAA,MAAW,CAAC,GAAA,EAAK,QAAQ,EAAA,GAAK,MAAA,CAAO,OAAA,CAAQ,YAAY,CAAA,EAAG;AAC1D,MAAA,KAAA,CAAM,IAAA;AAAA,QAAA,CACH,MAAA,CAAA,EAAA,GAAY;AACX,UAAA,IAAI;AACF,YAAA,MAAM,cAAA,EAAmC;AAAA,cACvC,MAAA,mBAAQ,OAAA,CAAQ,MAAA,UAAU,IAAA;AAAA,cAC1B,MAAA,mBAAQ,OAAA,CAAQ,MAAA,UAAU,IAAA;AAAA,cAC1B,OAAA;AAAA,cACA,SAAA,EAAW,KAAA,CAAM,IAAA;AAAA,cACjB,OAAA;AAAA,cACA,YAAA,mBAAc,OAAA,CAAQ,YAAA,UAAgB;AAAA,YACxC,CAAA;AAEA,YAAA,MAAM,KAAA,EAAO,MAAM,QAAA,CAAS,aAAa,CAAA;AAEzC,YAAA,GAAA,CAAI,CAAC,OAAA,CAAQ,OAAO,CAAA,EAAG;AACrB,cAAA,OAAA,CAAQ,OAAO,EAAA,EAAI,CAAC,CAAA;AAAA,YACtB;AACA,YAAA,OAAA,CAAQ,OAAO,CAAA,CAAG,GAAG,EAAA,EAAI,IAAA;AAAA,UAC3B,EAAA,MAAA,CAAS,KAAA,EAAO;AAGd,YAAA,OAAA,CAAQ,IAAA,CAAK,qCAAA,EAAuC;AAAA,cAClD,SAAA,EAAW,KAAA,CAAM,IAAA;AAAA,cACjB,SAAA,EAAW,GAAA;AAAA,cACX;AAAA,YACF,CAAC,CAAA;AAAA,UACH;AAAA,QACF,CAAA,CAAA,CAAG;AAAA,MACL,CAAA;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA;AACvB,EAAA,OAAO,OAAA;AACT;AAWO,SAAS,kBAAA,CACd,aAAA,EACA,WAAA,EACmB;AACnB,EAAA,MAAM,OAAA,EAA4B,EAAE,GAAG,cAAc,CAAA;AAErD,EAAA,IAAA,CAAA,MAAW,CAAC,OAAA,EAAS,UAAU,EAAA,GAAK,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC/D,IAAA,GAAA,CAAI,CAAC,MAAA,CAAO,OAAO,CAAA,EAAG;AACpB,MAAA,MAAA,CAAO,OAAO,EAAA,EAAI,CAAC,CAAA;AAAA,IACrB;AAEA,IAAA,MAAA,CAAO,OAAO,EAAA,EAAI,EAAE,GAAG,MAAA,CAAO,OAAO,CAAA,EAAG,GAAG,WAAW,CAAA;AAAA,EACxD;AAEA,EAAA,OAAO,MAAA;AACT;ADpEA;AACA;AACE;AACA;AACF,iGAAC","file":"/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/chunk-G4CKM4EN.js","sourcesContent":[null,"/**\n * Execute code-based data loaders for SDK custom blocks.\n *\n * Code loaders are user-defined async functions that can fetch data\n * from any API (not just whitelisted CMS endpoints). They run\n * server-side during loadPage().\n */\n\nimport type { PageOutline } from '@riverbankcms/blocks';\nimport type { PrefetchContext, ResolvedBlockData } from '@riverbankcms/blocks/system/data';\nimport type { BlockKind } from '../types';\nimport type { DataLoaderContext, DataLoaderOverrides } from './types';\n\n/**\n * Execute code-based data loaders for blocks on a page.\n *\n * Iterates through page blocks and executes any registered loader\n * functions for matching block kinds. Runs all loaders in parallel.\n *\n * @param page - Page outline with blocks to process\n * @param context - Prefetch context (siteId, pageId, previewStage)\n * @param overrides - Map of block kinds to loader functions\n * @returns Resolved data keyed by blockId, then loader key\n *\n * @example\n * ```typescript\n * const codeData = await executeCodeLoaders(page, context, {\n * 'custom.featured-products': {\n * products: async (ctx) => fetchProducts(ctx.content.categoryId),\n * },\n * });\n * // codeData: { 'block-123': { products: [...] } }\n * ```\n */\nexport async function executeCodeLoaders(\n page: PageOutline,\n context: PrefetchContext,\n overrides: DataLoaderOverrides,\n): Promise<ResolvedBlockData> {\n const results: ResolvedBlockData = {};\n const tasks: Promise<void>[] = [];\n\n for (const block of page.blocks) {\n const blockId = block.id;\n if (!blockId) continue;\n\n // Look up loaders for this block kind\n const blockLoaders = overrides[block.kind];\n if (!blockLoaders) continue;\n\n // Get block content (prefer draft in preview mode)\n const content = (\n (block as { draftContent?: unknown }).draftContent ??\n (block as { content?: unknown }).content ??\n {}\n ) as Record<string, unknown>;\n\n // Execute each loader for this block\n for (const [key, loaderFn] of Object.entries(blockLoaders)) {\n tasks.push(\n (async () => {\n try {\n const loaderContext: DataLoaderContext = {\n siteId: context.siteId ?? '',\n pageId: context.pageId ?? '',\n blockId,\n blockKind: block.kind as BlockKind,\n content,\n previewStage: context.previewStage ?? 'published',\n };\n\n const data = await loaderFn(loaderContext);\n\n if (!results[blockId]) {\n results[blockId] = {};\n }\n results[blockId]![key] = data;\n } catch (error) {\n // Log but don't throw - data loading is best-effort\n // SDK users should handle missing data gracefully in components\n console.warn('[executeCodeLoaders] Loader failed:', {\n blockKind: block.kind,\n loaderKey: key,\n error,\n });\n }\n })(),\n );\n }\n }\n\n await Promise.all(tasks);\n return results;\n}\n\n/**\n * Merge resolved data from config loaders and code loaders.\n *\n * Code loader results take precedence on key conflicts.\n *\n * @param configResults - Data from config-based loaders (CMS endpoints)\n * @param codeResults - Data from code-based loaders (external APIs)\n * @returns Merged data with code results overwriting config on conflicts\n */\nexport function mergeLoaderResults(\n configResults: ResolvedBlockData,\n codeResults: ResolvedBlockData,\n): ResolvedBlockData {\n const merged: ResolvedBlockData = { ...configResults };\n\n for (const [blockId, loaderData] of Object.entries(codeResults)) {\n if (!merged[blockId]) {\n merged[blockId] = {};\n }\n // Code loaders take precedence on key conflicts\n merged[blockId] = { ...merged[blockId], ...loaderData };\n }\n\n return merged;\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/data/executeCodeLoaders.ts"],"sourcesContent":["/**\n * Execute code-based data loaders for SDK custom blocks.\n *\n * Code loaders are user-defined async functions that can fetch data\n * from any API (not just whitelisted CMS endpoints). They run\n * server-side during loadPage().\n */\n\nimport type { PageOutline } from '@riverbankcms/blocks';\nimport type { PrefetchContext, ResolvedBlockData } from '@riverbankcms/blocks/system/data';\nimport type { BlockKind } from '../types';\nimport type { DataLoaderContext, DataLoaderOverrides } from './types';\n\n/**\n * Execute code-based data loaders for blocks on a page.\n *\n * Iterates through page blocks and executes any registered loader\n * functions for matching block kinds. Runs all loaders in parallel.\n *\n * @param page - Page outline with blocks to process\n * @param context - Prefetch context (siteId, pageId, previewStage)\n * @param overrides - Map of block kinds to loader functions\n * @returns Resolved data keyed by blockId, then loader key\n *\n * @example\n * ```typescript\n * const codeData = await executeCodeLoaders(page, context, {\n * 'custom.featured-products': {\n * products: async (ctx) => fetchProducts(ctx.content.categoryId),\n * },\n * });\n * // codeData: { 'block-123': { products: [...] } }\n * ```\n */\nexport async function executeCodeLoaders(\n page: PageOutline,\n context: PrefetchContext,\n overrides: DataLoaderOverrides,\n): Promise<ResolvedBlockData> {\n const results: ResolvedBlockData = {};\n const tasks: Promise<void>[] = [];\n\n for (const block of page.blocks) {\n const blockId = block.id;\n if (!blockId) continue;\n\n // Look up loaders for this block kind\n const blockLoaders = overrides[block.kind];\n if (!blockLoaders) continue;\n\n // Get block content (prefer draft in preview mode)\n const content = (\n (block as { draftContent?: unknown }).draftContent ??\n (block as { content?: unknown }).content ??\n {}\n ) as Record<string, unknown>;\n\n // Execute each loader for this block\n for (const [key, loaderFn] of Object.entries(blockLoaders)) {\n tasks.push(\n (async () => {\n try {\n const loaderContext: DataLoaderContext = {\n siteId: context.siteId ?? '',\n pageId: context.pageId ?? '',\n blockId,\n blockKind: block.kind as BlockKind,\n content,\n previewStage: context.previewStage ?? 'published',\n };\n\n const data = await loaderFn(loaderContext);\n\n if (!results[blockId]) {\n results[blockId] = {};\n }\n results[blockId]![key] = data;\n } catch (error) {\n // Log but don't throw - data loading is best-effort\n // SDK users should handle missing data gracefully in components\n console.warn('[executeCodeLoaders] Loader failed:', {\n blockKind: block.kind,\n loaderKey: key,\n error,\n });\n }\n })(),\n );\n }\n }\n\n await Promise.all(tasks);\n return results;\n}\n\n/**\n * Merge resolved data from config loaders and code loaders.\n *\n * Code loader results take precedence on key conflicts.\n *\n * @param configResults - Data from config-based loaders (CMS endpoints)\n * @param codeResults - Data from code-based loaders (external APIs)\n * @returns Merged data with code results overwriting config on conflicts\n */\nexport function mergeLoaderResults(\n configResults: ResolvedBlockData,\n codeResults: ResolvedBlockData,\n): ResolvedBlockData {\n const merged: ResolvedBlockData = { ...configResults };\n\n for (const [blockId, loaderData] of Object.entries(codeResults)) {\n if (!merged[blockId]) {\n merged[blockId] = {};\n }\n // Code loaders take precedence on key conflicts\n merged[blockId] = { ...merged[blockId], ...loaderData };\n }\n\n return merged;\n}\n"],"mappings":";AAkCA,eAAsB,mBACpB,MACA,SACA,WAC4B;AAC5B,QAAM,UAA6B,CAAC;AACpC,QAAM,QAAyB,CAAC;AAEhC,aAAW,SAAS,KAAK,QAAQ;AAC/B,UAAM,UAAU,MAAM;AACtB,QAAI,CAAC,QAAS;AAGd,UAAM,eAAe,UAAU,MAAM,IAAI;AACzC,QAAI,CAAC,aAAc;AAGnB,UAAM,UACH,MAAqC,gBACrC,MAAgC,WACjC,CAAC;AAIH,eAAW,CAAC,KAAK,QAAQ,KAAK,OAAO,QAAQ,YAAY,GAAG;AAC1D,YAAM;AAAA,SACH,YAAY;AACX,cAAI;AACF,kBAAM,gBAAmC;AAAA,cACvC,QAAQ,QAAQ,UAAU;AAAA,cAC1B,QAAQ,QAAQ,UAAU;AAAA,cAC1B;AAAA,cACA,WAAW,MAAM;AAAA,cACjB;AAAA,cACA,cAAc,QAAQ,gBAAgB;AAAA,YACxC;AAEA,kBAAM,OAAO,MAAM,SAAS,aAAa;AAEzC,gBAAI,CAAC,QAAQ,OAAO,GAAG;AACrB,sBAAQ,OAAO,IAAI,CAAC;AAAA,YACtB;AACA,oBAAQ,OAAO,EAAG,GAAG,IAAI;AAAA,UAC3B,SAAS,OAAO;AAGd,oBAAQ,KAAK,uCAAuC;AAAA,cAClD,WAAW,MAAM;AAAA,cACjB,WAAW;AAAA,cACX;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF,GAAG;AAAA,MACL;AAAA,IACF;AAAA,EACF;AAEA,QAAM,QAAQ,IAAI,KAAK;AACvB,SAAO;AACT;AAWO,SAAS,mBACd,eACA,aACmB;AACnB,QAAM,SAA4B,EAAE,GAAG,cAAc;AAErD,aAAW,CAAC,SAAS,UAAU,KAAK,OAAO,QAAQ,WAAW,GAAG;AAC/D,QAAI,CAAC,OAAO,OAAO,GAAG;AACpB,aAAO,OAAO,IAAI,CAAC;AAAA,IACrB;AAEA,WAAO,OAAO,IAAI,EAAE,GAAG,OAAO,OAAO,GAAG,GAAG,WAAW;AAAA,EACxD;AAEA,SAAO;AACT;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/rendering/helpers/loadPage.ts"],"sourcesContent":["/**\n * Server-side helper to fetch all data needed for <Page> component.\n *\n * Use this in server components, getServerSideProps, or API routes.\n */\n\nimport type { RiverbankClient, SiteResponse } from '../../client/types';\nimport type { PageProps } from '../components/Page';\nimport { prefetchBlockData } from '../../data/prefetchBlockData';\nimport { executeCodeLoaders, mergeLoaderResults } from '../../data/executeCodeLoaders';\nimport type { DataLoaderOverrides } from '../../data/types';\n\n/**\n * SDK config from API response (without siteId which is stripped at storage).\n * This is the runtime representation - for defining configs, use RiverbankSiteConfig.\n */\nexport type RuntimeSdkConfig = NonNullable<SiteResponse['sdkConfig']>;\n\nexport type LoadPageParams = {\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 * Code-based data loaders for custom blocks.\n *\n * Use this to fetch data from external APIs (not just whitelisted CMS endpoints).\n * Keys are block kinds (e.g., 'custom.featured-products').\n *\n * Config-based loaders (defined in riverbank.config.ts) run first.\n * Code loaders run second and take precedence on key conflicts.\n *\n * @example\n * ```typescript\n * const pageData = await loadPage({\n * client,\n * siteId: 'site-123',\n * path: '/',\n * dataLoaderOverrides: {\n * 'custom.featured-products': {\n * products: async (ctx) => {\n * const res = await fetch(`https://api.shop.com/products?category=${ctx.content.categoryId}`);\n * return res.json();\n * },\n * },\n * },\n * });\n * ```\n */\n dataLoaderOverrides?: DataLoaderOverrides;\n};\n\nexport type LoadPageResult = Omit<PageProps, 'registry' | 'wrapBlock' | 'usePlaceholders' | 'blockOverrides'> & {\n /**\n * SDK site configuration, if available.\n * Contains SDK-defined theme palette, section backgrounds, and style options.\n */\n sdkConfig: RuntimeSdkConfig | null;\n};\n\n/**\n * Server-side helper to fetch all data needed for <Page> component.\n *\n * Fetches site data, page data, and prefetches block data loaders in parallel.\n *\n * @example Next.js App Router (published content)\n * ```tsx\n * import { createRiverbankClient } from '@riverbankcms/sdk';\n * import { loadPage, Page } from '@riverbankcms/sdk/rendering';\n *\n * const client = createRiverbankClient({\n * apiKey: process.env.RIVERBANK_API_KEY!,\n * baseUrl: process.env.NEXT_PUBLIC_DASHBOARD_URL + '/api',\n * });\n *\n * export default async function PageRoute({ params }) {\n * const pageData = await loadPage({\n * client,\n * siteId: 'site-123',\n * path: `/${params.slug || ''}`,\n * });\n *\n * return <Page {...pageData} />;\n * }\n * ```\n *\n * @example Next.js App Router (preview/draft content)\n * ```tsx\n * export default async function PreviewRoute({ params, searchParams }) {\n * const pageData = await loadPage({\n * client,\n * siteId: searchParams.siteId,\n * path: `/${params.slug || ''}`,\n * preview: true, // Fetch draft content\n * });\n *\n * return <Page {...pageData} />;\n * }\n * ```\n *\n * @example Next.js Pages Router (getServerSideProps)\n * ```tsx\n * export async function getServerSideProps({ params }) {\n * const pageData = await loadPage({\n * client,\n * siteId: 'site-123',\n * path: `/${params.slug || ''}`,\n * });\n *\n * return { props: pageData };\n * }\n *\n * export default function PageRoute(props) {\n * return <Page {...props} />;\n * }\n * ```\n */\nexport async function loadPage(params: LoadPageParams): Promise<LoadPageResult> {\n const { client, siteId, path, pageId, preview = false, dataLoaderOverrides } = params;\n\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 // 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 loadContent() instead, which handles both pages and entries. ' +\n 'For entries, loadContent() 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 with content\n // API returns blocks with full content - PageRenderer needs the content field for rendering\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\n // Include content for rendering\n // API provides `content` (active content for the requested stage)\n // and optionally `draftContent` for preview mode\n const typedBlock = block as {\n id: string | null;\n kind: string;\n purpose: string;\n content?: Record<string, unknown>;\n draftContent?: { data: Record<string, unknown> } | null;\n };\n\n return {\n id: typedBlock.id,\n kind: typedBlock.kind,\n purpose: typedBlock.purpose,\n // Include content for PageRenderer's getRenderableContent()\n content: typedBlock.content ?? {},\n // Include draftContent if available (for preview mode)\n draftContent: typedBlock.draftContent?.data ?? null,\n };\n });\n\n const pageOutline = {\n name: pageData.name,\n path: pageData.path,\n purpose: pageData.purpose,\n blocks,\n };\n\n // Build prefetch context\n const prefetchContext: { siteId: string; pageId: string; previewStage: 'published' | 'preview' } = {\n siteId,\n pageId: pageId ?? pageData.id,\n previewStage: preview ? 'preview' : 'published',\n };\n\n // Prefetch block data loaders (config-based loaders for CMS endpoints)\n const configData = await prefetchBlockData(\n pageOutline,\n prefetchContext,\n client,\n {\n // Pass custom blocks so their config-based loaders are discovered\n customBlocks: site.sdkConfig?.customBlocks,\n }\n );\n\n // Execute code-based loaders (external APIs) and merge results\n let resolvedData = configData;\n if (dataLoaderOverrides && Object.keys(dataLoaderOverrides).length > 0) {\n const codeData = await executeCodeLoaders(pageOutline, prefetchContext, dataLoaderOverrides);\n resolvedData = mergeLoaderResults(configData, codeData);\n }\n\n return {\n page: pageOutline,\n theme: site.theme,\n sdkConfig: site.sdkConfig ?? null,\n siteId,\n resolvedData,\n // Note: routeMap is optional and can be built from site data if needed for internal links.\n // Consumers can construct it from site.pages and pass explicitly via Page component props.\n // Example: const routeMap = site.pages.reduce((map, p) => ({ ...map, [p.id]: p.path }), {});\n };\n}\n"],"mappings":";;;;;;;;;AA6HA,eAAsB,SAAS,QAAiD;AAC9E,QAAM,EAAE,QAAQ,QAAQ,MAAM,QAAQ,UAAU,OAAO,oBAAoB,IAAI;AAG/E,QAAM,CAAC,MAAM,YAAY,IAAI,MAAM,QAAQ,IAAI;AAAA,IAC7C,OAAO,QAAQ,EAAE,IAAI,OAAO,CAAC;AAAA,IAC7B,OAAO,QAAQ,EAAE,QAAQ,MAAM,QAAQ,CAAC;AAAA,EAC1C,CAAC;AAGD,MAAI,WAAW,cAAc;AAC3B,UAAM,IAAI;AAAA,MACR;AAAA,IAGF;AAAA,EACF;AAEA,QAAM,EAAE,MAAM,SAAS,IAAI;AAI3B,QAAM,SAAS,SAAS,OAAO,IAAI,CAAC,UAAU;AAC5C,QAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC,YAAM,IAAI,MAAM,sCAAsC;AAAA,IACxD;AACA,QAAI,OAAO,MAAM,OAAO,YAAY,MAAM,OAAO,MAAM;AACrD,YAAM,IAAI,MAAM,kDAAkD,OAAO,MAAM,EAAE,EAAE;AAAA,IACrF;AACA,QAAI,OAAO,MAAM,SAAS,UAAU;AAClC,YAAM,IAAI,MAAM,4CAA4C,OAAO,MAAM,IAAI,EAAE;AAAA,IACjF;AACA,QAAI,OAAO,MAAM,YAAY,UAAU;AACrC,YAAM,IAAI,MAAM,+CAA+C,OAAO,MAAM,OAAO,EAAE;AAAA,IACvF;AAKA,UAAM,aAAa;AAQnB,WAAO;AAAA,MACL,IAAI,WAAW;AAAA,MACf,MAAM,WAAW;AAAA,MACjB,SAAS,WAAW;AAAA;AAAA,MAEpB,SAAS,WAAW,WAAW,CAAC;AAAA;AAAA,MAEhC,cAAc,WAAW,cAAc,QAAQ;AAAA,IACjD;AAAA,EACF,CAAC;AAED,QAAM,cAAc;AAAA,IAClB,MAAM,SAAS;AAAA,IACf,MAAM,SAAS;AAAA,IACf,SAAS,SAAS;AAAA,IAClB;AAAA,EACF;AAGA,QAAM,kBAA6F;AAAA,IACjG;AAAA,IACA,QAAQ,UAAU,SAAS;AAAA,IAC3B,cAAc,UAAU,YAAY;AAAA,EACtC;AAGA,QAAM,aAAa,MAAM;AAAA,IACvB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,MAEE,cAAc,KAAK,WAAW;AAAA,IAChC;AAAA,EACF;AAGA,MAAI,eAAe;AACnB,MAAI,uBAAuB,OAAO,KAAK,mBAAmB,EAAE,SAAS,GAAG;AACtE,UAAM,WAAW,MAAM,mBAAmB,aAAa,iBAAiB,mBAAmB;AAC3F,mBAAe,mBAAmB,YAAY,QAAQ;AAAA,EACxD;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,OAAO,KAAK;AAAA,IACZ,WAAW,KAAK,aAAa;AAAA,IAC7B;AAAA,IACA;AAAA;AAAA;AAAA;AAAA,EAIF;AACF;","names":[]}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
|
-
|
|
3
|
-
var _chunkFPYK6527js = require('./chunk-FPYK6527.js');
|
|
4
|
-
require('./chunk-G4CKM4EN.js');
|
|
5
|
-
require('./chunk-HOY77YBF.js');
|
|
6
|
-
require('./chunk-EGTDJ4PL.js');
|
|
7
|
-
require('./chunk-DGUM43GV.js');
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
exports.loadPage = _chunkFPYK6527js.loadPage;
|
|
11
|
-
//# sourceMappingURL=loadPage-E3ZC6NHB.js.map
|
|
File without changes
|