@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.
Files changed (48) hide show
  1. package/dist/server/{chunk-M5KTLZTD.mjs → chunk-A2FZMRDW.mjs} +3 -2
  2. package/dist/server/chunk-A2FZMRDW.mjs.map +1 -0
  3. package/dist/server/{chunk-FPYK6527.js → chunk-SWPHIUVE.js} +7 -6
  4. package/dist/server/chunk-SWPHIUVE.js.map +1 -0
  5. package/dist/server/{chunk-G4CKM4EN.js → chunk-Y7347JMZ.js} +3 -2
  6. package/dist/server/chunk-Y7347JMZ.js.map +1 -0
  7. package/dist/server/{chunk-VVFYHAUD.mjs → chunk-ZEAJW6T3.mjs} +5 -4
  8. package/dist/server/chunk-ZEAJW6T3.mjs.map +1 -0
  9. package/dist/server/{components-Ci5nlyUj.d.mts → components-Bo3LPpVb.d.mts} +1 -1
  10. package/dist/server/{components-BYxloYJm.d.ts → components-ClFs4PUa.d.ts} +1 -1
  11. package/dist/server/components.d.mts +3 -3
  12. package/dist/server/components.d.ts +3 -3
  13. package/dist/server/data.d.mts +5 -3
  14. package/dist/server/data.d.ts +5 -3
  15. package/dist/server/data.js +2 -2
  16. package/dist/server/data.mjs +1 -1
  17. package/dist/server/{loadContent-BqQ-VPMW.d.ts → loadContent-C2SwqmXy.d.ts} +2 -2
  18. package/dist/server/{loadContent-Czu7xTOU.d.mts → loadContent-C_FipaAC.d.mts} +2 -2
  19. package/dist/server/loadPage-DUHBXDEW.js +11 -0
  20. package/dist/server/{loadPage-E3ZC6NHB.js.map → loadPage-DUHBXDEW.js.map} +1 -1
  21. package/dist/server/{loadPage-E7L7NMR3.mjs → loadPage-LYVKY3WZ.mjs} +3 -3
  22. package/dist/server/{loadPage-Dw57_n5N.d.mts → loadPage-mavT3Jae.d.mts} +20 -1
  23. package/dist/server/{loadPage-BElEkA_J.d.ts → loadPage-naVvoua8.d.ts} +20 -1
  24. package/dist/server/metadata.d.mts +2 -2
  25. package/dist/server/metadata.d.ts +2 -2
  26. package/dist/server/rendering/server.d.mts +2 -2
  27. package/dist/server/rendering/server.d.ts +2 -2
  28. package/dist/server/rendering.d.mts +5 -5
  29. package/dist/server/rendering.d.ts +5 -5
  30. package/dist/server/rendering.js +3 -3
  31. package/dist/server/rendering.mjs +2 -2
  32. package/dist/server/routing.d.mts +2 -2
  33. package/dist/server/routing.d.ts +2 -2
  34. package/dist/server/routing.js +1 -1
  35. package/dist/server/routing.mjs +1 -1
  36. package/dist/server/server.d.mts +3 -3
  37. package/dist/server/server.d.ts +3 -3
  38. package/dist/server/server.js +3 -3
  39. package/dist/server/server.mjs +2 -2
  40. package/dist/server/{types-BuZJWVmj.d.mts → types-CbagRQ_7.d.mts} +15 -0
  41. package/dist/server/{types-DSFvXKhO.d.ts → types-DuQCNVV0.d.ts} +15 -0
  42. package/package.json +1 -1
  43. package/dist/server/chunk-FPYK6527.js.map +0 -1
  44. package/dist/server/chunk-G4CKM4EN.js.map +0 -1
  45. package/dist/server/chunk-M5KTLZTD.mjs.map +0 -1
  46. package/dist/server/chunk-VVFYHAUD.mjs.map +0 -1
  47. package/dist/server/loadPage-E3ZC6NHB.js +0 -11
  48. /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-M5KTLZTD.mjs.map
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 _chunkG4CKM4ENjs = require('./chunk-G4CKM4EN.js');
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 _chunkG4CKM4ENjs.executeCodeLoaders.call(void 0, pageOutline, prefetchContext, dataLoaderOverrides);
69
- resolvedData = _chunkG4CKM4ENjs.mergeLoaderResults.call(void 0, configData, codeData);
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-FPYK6527.js.map
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-G4CKM4EN.js.map
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-M5KTLZTD.mjs";
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-VVFYHAUD.mjs.map
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-Dw57_n5N.mjs';
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-BElEkA_J.js';
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-Dw57_n5N.mjs';
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-Ci5nlyUj.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-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-BuZJWVmj.mjs';
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-BElEkA_J.js';
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-BYxloYJm.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-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-DSFvXKhO.js';
10
+ import './types-DuQCNVV0.js';
11
11
  import './blockKinds-B6MWzNWp.js';
12
12
  import '@riverbankcms/site-renderer';
13
13
  import '@riverbankcms/ai';
@@ -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-BuZJWVmj.mjs';
3
- export { B as BlockLoaderMap, a as DataLoaderContext, b as DataLoaderFn } from './types-BuZJWVmj.mjs';
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, overrides: DataLoaderOverrides): Promise<ResolvedBlockData>;
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
  *
@@ -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-DSFvXKhO.js';
3
- export { B as BlockLoaderMap, a as DataLoaderContext, b as DataLoaderFn } from './types-DSFvXKhO.js';
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, overrides: DataLoaderOverrides): Promise<ResolvedBlockData>;
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
  *
@@ -1,7 +1,7 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
2
 
3
3
 
4
- var _chunkG4CKM4ENjs = require('./chunk-G4CKM4EN.js');
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 = _chunkG4CKM4ENjs.executeCodeLoaders; exports.mergeLoaderResults = _chunkG4CKM4ENjs.mergeLoaderResults; exports.prefetchBlockData = _chunkHOY77YBFjs.prefetchBlockData;
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
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  executeCodeLoaders,
3
3
  mergeLoaderResults
4
- } from "./chunk-M5KTLZTD.mjs";
4
+ } from "./chunk-A2FZMRDW.mjs";
5
5
  import {
6
6
  SUPPORTED_LOADER_ENDPOINTS,
7
7
  prefetchBlockData
@@ -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-BElEkA_J.js';
5
- import { R as ResolvedBlockData } from './types-DSFvXKhO.js';
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-Dw57_n5N.mjs';
5
- import { R as ResolvedBlockData } from './types-BuZJWVmj.mjs';
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-E3ZC6NHB.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-E3ZC6NHB.js"}
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-VVFYHAUD.mjs";
4
- import "./chunk-M5KTLZTD.mjs";
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-E7L7NMR3.mjs.map
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-BuZJWVmj.mjs';
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-DSFvXKhO.js';
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-Dw57_n5N.mjs';
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-BuZJWVmj.mjs';
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-BElEkA_J.js';
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-DSFvXKhO.js';
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-Dw57_n5N.mjs';
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-BuZJWVmj.mjs';
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-BElEkA_J.js';
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-DSFvXKhO.js';
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-Dw57_n5N.mjs';
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-Czu7xTOU.mjs';
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-Ci5nlyUj.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-Ci5nlyUj.mjs';
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-BuZJWVmj.mjs';
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-BElEkA_J.js';
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-BqQ-VPMW.js';
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-BYxloYJm.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-BYxloYJm.js';
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-DSFvXKhO.js';
13
+ import './types-DuQCNVV0.js';
14
14
  import './blockKinds-B6MWzNWp.js';
15
15
  import '@riverbankcms/site-renderer';
16
16
  import '@riverbankcms/ai';
@@ -5,7 +5,7 @@
5
5
  var _chunkTO7FD6TQjs = require('./chunk-TO7FD6TQ.js');
6
6
 
7
7
 
8
- var _chunkFPYK6527js = require('./chunk-FPYK6527.js');
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-G4CKM4EN.js');
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 = _chunkFPYK6527js.loadPage; exports.resolveBackground = _chunkIT5ICP43js.resolveBackground; exports.resolveImageUrl = _chunkIT5ICP43js.resolveImageUrl;
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-VVFYHAUD.mjs";
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-M5KTLZTD.mjs";
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-Dw57_n5N.mjs';
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-BuZJWVmj.mjs';
11
+ import './types-CbagRQ_7.mjs';
12
12
  import './blockKinds-B6MWzNWp.mjs';
13
13
 
14
14
  /**
@@ -1,5 +1,5 @@
1
1
  import { R as RiverbankClient } from './types-CAnC529E.js';
2
- import { a as LoadPageResult } from './loadPage-BElEkA_J.js';
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-DSFvXKhO.js';
11
+ import './types-DuQCNVV0.js';
12
12
  import './blockKinds-B6MWzNWp.js';
13
13
 
14
14
  /**
@@ -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-E3ZC6NHB.js")));
13
+ const { loadPage } = await Promise.resolve().then(() => _interopRequireWildcard(require("./loadPage-DUHBXDEW.js")));
14
14
  const pageData = await loadPage({
15
15
  client,
16
16
  siteId,
@@ -10,7 +10,7 @@ async function resolveRoute(params) {
10
10
  preview
11
11
  });
12
12
  if (pageResponse) {
13
- const { loadPage } = await import("./loadPage-E7L7NMR3.mjs");
13
+ const { loadPage } = await import("./loadPage-LYVKY3WZ.mjs");
14
14
  const pageData = await loadPage({
15
15
  client,
16
16
  siteId,
@@ -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-Dw57_n5N.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-Czu7xTOU.mjs';
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-BuZJWVmj.mjs';
13
+ import './types-CbagRQ_7.mjs';
14
14
  import './blockKinds-B6MWzNWp.mjs';
@@ -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-BElEkA_J.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-BqQ-VPMW.js';
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-DSFvXKhO.js';
13
+ import './types-DuQCNVV0.js';
14
14
  import './blockKinds-B6MWzNWp.js';
@@ -8,8 +8,8 @@ var _chunkR5B6IOFQjs = require('./chunk-R5B6IOFQ.js');
8
8
  var _chunkTO7FD6TQjs = require('./chunk-TO7FD6TQ.js');
9
9
 
10
10
 
11
- var _chunkFPYK6527js = require('./chunk-FPYK6527.js');
12
- require('./chunk-G4CKM4EN.js');
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 = _chunkFPYK6527js.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
@@ -8,8 +8,8 @@ import {
8
8
  } from "./chunk-OP2GHK27.mjs";
9
9
  import {
10
10
  loadPage
11
- } from "./chunk-VVFYHAUD.mjs";
12
- import "./chunk-M5KTLZTD.mjs";
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,6 +1,6 @@
1
1
  {
2
2
  "name": "@riverbankcms/sdk",
3
- "version": "0.4.0",
3
+ "version": "0.4.1",
4
4
  "description": "Riverbank CMS SDK for headless content consumption",
5
5
  "main": "./dist/server/index.js",
6
6
  "module": "./dist/server/index.mjs",
@@ -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