@riverbankcms/sdk 0.2.1 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +255 -1
- package/dist/cli/index.js +249 -40
- package/dist/cli/index.js.map +1 -1
- package/dist/client/bookings.js +15 -1
- package/dist/client/bookings.js.map +1 -1
- package/dist/client/bookings.mjs +15 -1
- package/dist/client/bookings.mjs.map +1 -1
- package/dist/client/client.d.mts +2 -2
- package/dist/client/client.d.ts +2 -2
- package/dist/client/client.js +51 -6
- package/dist/client/client.js.map +1 -1
- package/dist/client/client.mjs +51 -6
- package/dist/client/client.mjs.map +1 -1
- package/dist/client/hooks.d.mts +2 -2
- package/dist/client/hooks.d.ts +2 -2
- package/dist/client/rendering/client.js +114 -116
- package/dist/client/rendering/client.js.map +1 -1
- package/dist/client/rendering/client.mjs +114 -116
- package/dist/client/rendering/client.mjs.map +1 -1
- package/dist/client/usePage-BcjWPXvh.d.mts +6388 -0
- package/dist/client/usePage-C3ZKNwY7.d.mts +6393 -0
- package/dist/client/usePage-CrKw1H6Y.d.ts +6338 -0
- package/dist/client/usePage-CyYpOJud.d.ts +6388 -0
- package/dist/client/usePage-DMI8ImsU.d.mts +6338 -0
- package/dist/client/usePage-gpVaeWDy.d.ts +6393 -0
- package/dist/server/{Layout-DK_9OOgb.d.mts → Layout-B_zUr9ci.d.mts} +1 -1
- package/dist/server/{Layout-CLg8oH_S.d.ts → Layout-CHG77dhK.d.ts} +1 -1
- package/dist/server/blockKinds-B6MWzNWp.d.mts +16 -0
- package/dist/server/blockKinds-B6MWzNWp.d.ts +16 -0
- package/dist/server/chunk-BOHTTHY5.mjs +406 -0
- package/dist/server/chunk-BOHTTHY5.mjs.map +1 -0
- package/dist/server/{chunk-5R4NMVXA.js → chunk-BUCJWG6G.js} +5 -5
- package/dist/server/chunk-BUCJWG6G.js.map +1 -0
- package/dist/server/chunk-D2QLTPUJ.mjs +33 -0
- package/dist/server/chunk-D2QLTPUJ.mjs.map +1 -0
- package/dist/server/{chunk-62ZJI564.js → chunk-FPYK6527.js} +4 -4
- package/dist/server/{chunk-62ZJI564.js.map → chunk-FPYK6527.js.map} +1 -1
- package/dist/server/{chunk-YXDDFG3N.js → chunk-G4CKM4EN.js} +1 -1
- package/dist/server/chunk-G4CKM4EN.js.map +1 -0
- package/dist/server/chunk-GERCMTPQ.js +33 -0
- package/dist/server/chunk-GERCMTPQ.js.map +1 -0
- package/dist/server/{chunk-SF63XAX7.js → chunk-IT5ICP43.js} +24 -4
- package/dist/server/chunk-IT5ICP43.js.map +1 -0
- package/dist/server/{chunk-GWBMJPLH.mjs → chunk-M5KTLZTD.mjs} +1 -1
- package/dist/server/chunk-M5KTLZTD.mjs.map +1 -0
- package/dist/server/{chunk-3J46ILMJ.mjs → chunk-N3PX76AP.mjs} +29 -4
- package/dist/server/chunk-N3PX76AP.mjs.map +1 -0
- package/dist/server/{chunk-O5DC7MYW.mjs → chunk-NKXS4TBK.mjs} +24 -4
- package/dist/server/chunk-NKXS4TBK.mjs.map +1 -0
- package/dist/server/{chunk-INWKF3IC.js → chunk-P6CDRJN3.js} +8 -8
- package/dist/server/{chunk-INWKF3IC.js.map → chunk-P6CDRJN3.js.map} +1 -1
- package/dist/server/{chunk-GKYNDDJS.js → chunk-R5B6IOFQ.js} +29 -4
- package/dist/server/chunk-R5B6IOFQ.js.map +1 -0
- package/dist/server/{chunk-FK64TZBT.mjs → chunk-SFQ7VF3G.mjs} +2 -2
- package/dist/server/{chunk-JTAERCX2.mjs → chunk-VVFYHAUD.mjs} +2 -2
- package/dist/server/{chunk-PN3CHDVX.mjs → chunk-XK2YIISA.mjs} +2 -2
- package/dist/server/chunk-XK2YIISA.mjs.map +1 -0
- package/dist/server/chunk-ZIM53VP6.js +406 -0
- package/dist/server/chunk-ZIM53VP6.js.map +1 -0
- package/dist/server/{components-DhIcstww.d.ts → components-BYxloYJm.d.ts} +3 -3
- package/dist/server/{components-BzdA6NAc.d.mts → components-Ci5nlyUj.d.mts} +3 -3
- package/dist/server/components.d.mts +7 -5
- package/dist/server/components.d.ts +7 -5
- package/dist/server/components.js +3 -3
- package/dist/server/components.mjs +2 -2
- package/dist/server/config-validation.d.mts +5 -300
- package/dist/server/config-validation.d.ts +5 -300
- package/dist/server/config-validation.js +6 -3
- package/dist/server/config-validation.js.map +1 -1
- package/dist/server/config-validation.mjs +5 -2
- package/dist/server/config.d.mts +43 -4
- package/dist/server/config.d.ts +43 -4
- package/dist/server/config.js +27 -3
- package/dist/server/config.js.map +1 -1
- package/dist/server/config.mjs +26 -2
- package/dist/server/config.mjs.map +1 -1
- package/dist/server/data.d.mts +5 -3
- package/dist/server/data.d.ts +5 -3
- package/dist/server/data.js +2 -2
- package/dist/server/data.mjs +1 -1
- package/dist/server/{index-BB28KAui.d.ts → index-DbSfrRA0.d.ts} +1 -1
- package/dist/server/{index-C_FVup_o.d.mts → index-Dj7VKH34.d.mts} +1 -1
- package/dist/server/index.d.mts +19 -4
- package/dist/server/index.d.ts +19 -4
- package/dist/server/index.js +6 -2
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +5 -1
- package/dist/server/{loadContent-AQOBf_gP.d.ts → loadContent-BqQ-VPMW.d.ts} +4 -3
- package/dist/server/{loadContent-DBmprsB4.d.mts → loadContent-Czu7xTOU.d.mts} +4 -3
- package/dist/server/{loadPage-BMg8PJxJ.d.ts → loadPage-BElEkA_J.d.ts} +3 -2
- package/dist/server/{loadPage-pg4HimlK.d.mts → loadPage-Dw57_n5N.d.mts} +3 -2
- package/dist/server/loadPage-E3ZC6NHB.js +11 -0
- package/dist/server/{loadPage-3ECPF426.js.map → loadPage-E3ZC6NHB.js.map} +1 -1
- package/dist/server/{loadPage-LW273NYO.mjs → loadPage-E7L7NMR3.mjs} +3 -3
- package/dist/server/metadata.d.mts +5 -3
- package/dist/server/metadata.d.ts +5 -3
- package/dist/server/navigation.d.mts +100 -0
- package/dist/server/navigation.d.ts +100 -0
- package/dist/server/navigation.js +44 -0
- package/dist/server/navigation.js.map +1 -0
- package/dist/server/navigation.mjs +44 -0
- package/dist/server/navigation.mjs.map +1 -0
- package/dist/server/rendering/server.d.mts +8 -6
- package/dist/server/rendering/server.d.ts +8 -6
- package/dist/server/rendering/server.js +4 -4
- package/dist/server/rendering/server.mjs +3 -3
- package/dist/server/rendering.d.mts +9 -7
- package/dist/server/rendering.d.ts +9 -7
- package/dist/server/rendering.js +6 -6
- package/dist/server/rendering.mjs +5 -5
- package/dist/server/routing.d.mts +5 -3
- package/dist/server/routing.d.ts +5 -3
- package/dist/server/routing.js +1 -1
- package/dist/server/routing.mjs +1 -1
- package/dist/server/server.d.mts +7 -5
- package/dist/server/server.d.ts +7 -5
- package/dist/server/server.js +4 -4
- package/dist/server/server.mjs +3 -3
- package/dist/server/theme-bridge.js +7 -7
- package/dist/server/theme-bridge.mjs +1 -1
- package/dist/server/{types-BprgZt-t.d.ts → types-5XdVD2J1.d.ts} +43 -147
- package/dist/server/{types-C0G9IxWO.d.mts → types-BA-J9K8r.d.mts} +43 -147
- package/dist/server/types-BC9eB2KH.d.mts +198 -0
- package/dist/server/{types-_nDnPHpv.d.ts → types-BuZJWVmj.d.mts} +4 -1
- package/dist/server/types-CAnC529E.d.ts +198 -0
- package/dist/server/{types--u4GLCAY.d.ts → types-CMqVHYLG.d.ts} +266 -4
- package/dist/server/{types-_zWJTgv0.d.mts → types-CYfHxUhe.d.mts} +266 -4
- package/dist/server/{types-_nDnPHpv.d.mts → types-DSFvXKhO.d.ts} +4 -1
- package/dist/server/validation-C7W2Fe0i.d.ts +459 -0
- package/dist/server/validation-hg1sqhrt.d.mts +459 -0
- package/package.json +23 -17
- package/dist/server/chunk-3J46ILMJ.mjs.map +0 -1
- package/dist/server/chunk-5R4NMVXA.js.map +0 -1
- package/dist/server/chunk-BPKYRPCQ.mjs +0 -215
- package/dist/server/chunk-BPKYRPCQ.mjs.map +0 -1
- package/dist/server/chunk-GKYNDDJS.js.map +0 -1
- package/dist/server/chunk-GWBMJPLH.mjs.map +0 -1
- package/dist/server/chunk-O5DC7MYW.mjs.map +0 -1
- package/dist/server/chunk-PN3CHDVX.mjs.map +0 -1
- package/dist/server/chunk-SF63XAX7.js.map +0 -1
- package/dist/server/chunk-XLVL5WPH.js +0 -215
- package/dist/server/chunk-XLVL5WPH.js.map +0 -1
- package/dist/server/chunk-YXDDFG3N.js.map +0 -1
- package/dist/server/loadPage-3ECPF426.js +0 -11
- /package/dist/server/{chunk-FK64TZBT.mjs.map → chunk-SFQ7VF3G.mjs.map} +0 -0
- /package/dist/server/{chunk-JTAERCX2.mjs.map → chunk-VVFYHAUD.mjs.map} +0 -0
- /package/dist/server/{loadPage-LW273NYO.mjs.map → loadPage-E7L7NMR3.mjs.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/chunk-
|
|
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"]}
|
|
@@ -0,0 +1 @@
|
|
|
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"]}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});// ../blocks/src/system/constants/blockKinds.ts
|
|
2
|
+
var SYSTEM_BLOCK_KINDS = [
|
|
3
|
+
// Layout blocks
|
|
4
|
+
"block.hero",
|
|
5
|
+
"block.columns",
|
|
6
|
+
"block.ctaFull",
|
|
7
|
+
"block.singleButton",
|
|
8
|
+
// Content blocks
|
|
9
|
+
"block.bodyText",
|
|
10
|
+
"block.faq",
|
|
11
|
+
"block.testimonials",
|
|
12
|
+
"block.embed",
|
|
13
|
+
// Blog blocks
|
|
14
|
+
"block.blogPost",
|
|
15
|
+
"block.blogPlaceholder",
|
|
16
|
+
"block.blogListing",
|
|
17
|
+
// Site structure blocks
|
|
18
|
+
"block.siteHeader",
|
|
19
|
+
"block.siteFooter",
|
|
20
|
+
// Form/booking blocks
|
|
21
|
+
"block.form",
|
|
22
|
+
"block.appointment-booking",
|
|
23
|
+
"block.event-registration",
|
|
24
|
+
// Event display blocks
|
|
25
|
+
"block.event-spotlight",
|
|
26
|
+
"block.event-listing",
|
|
27
|
+
"block.event-calendar"
|
|
28
|
+
];
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
exports.SYSTEM_BLOCK_KINDS = SYSTEM_BLOCK_KINDS;
|
|
33
|
+
//# sourceMappingURL=chunk-GERCMTPQ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/chunk-GERCMTPQ.js","../../../blocks/src/system/constants/blockKinds.ts"],"names":[],"mappings":"AAAA;ACOO,IAAM,mBAAA,EAAqB;AAAA;AAAA,EAEhC,YAAA;AAAA,EACA,eAAA;AAAA,EACA,eAAA;AAAA,EACA,oBAAA;AAAA;AAAA,EAEA,gBAAA;AAAA,EACA,WAAA;AAAA,EACA,oBAAA;AAAA,EACA,aAAA;AAAA;AAAA,EAEA,gBAAA;AAAA,EACA,uBAAA;AAAA,EACA,mBAAA;AAAA;AAAA,EAEA,kBAAA;AAAA,EACA,kBAAA;AAAA;AAAA,EAEA,YAAA;AAAA,EACA,2BAAA;AAAA,EACA,0BAAA;AAAA;AAAA,EAEA,uBAAA;AAAA,EACA,qBAAA;AAAA,EACA;AACF,CAAA;ADLA;AACA;AACE;AACF,gDAAC","file":"/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/chunk-GERCMTPQ.js","sourcesContent":[null,"/**\n * System block kind identifiers.\n * Single source of truth - derive types from this array.\n *\n * Note: Block IDs use mixed naming conventions (camelCase and kebab-case)\n * for historical reasons. New blocks should prefer camelCase.\n */\nexport const SYSTEM_BLOCK_KINDS = [\n // Layout blocks\n 'block.hero',\n 'block.columns',\n 'block.ctaFull',\n 'block.singleButton',\n // Content blocks\n 'block.bodyText',\n 'block.faq',\n 'block.testimonials',\n 'block.embed',\n // Blog blocks\n 'block.blogPost',\n 'block.blogPlaceholder',\n 'block.blogListing',\n // Site structure blocks\n 'block.siteHeader',\n 'block.siteFooter',\n // Form/booking blocks\n 'block.form',\n 'block.appointment-booking',\n 'block.event-registration',\n // Event display blocks\n 'block.event-spotlight',\n 'block.event-listing',\n 'block.event-calendar',\n] as const;\n\n/** System block kind type derived from the const array */\nexport type SystemBlockKind = (typeof SYSTEM_BLOCK_KINDS)[number];\n\n/** Custom block kinds follow the `custom.${string}` pattern */\nexport type CustomBlockKind = `custom.${string}`;\n\n/** Union of all valid block kinds */\nexport type BlockKind = SystemBlockKind | CustomBlockKind;\n"]}
|
|
@@ -123,9 +123,26 @@ var getImageUrl = (asset, params = {}, basePath = DEFAULT_BASE_PATH) => {
|
|
|
123
123
|
return query ? `${path}?${query}` : path;
|
|
124
124
|
};
|
|
125
125
|
|
|
126
|
-
// ../blocks/src/system/runtime/
|
|
127
|
-
|
|
126
|
+
// ../blocks/src/system/runtime/utils/api-url.ts
|
|
127
|
+
function resolveMultiEnvDashboardUrl() {
|
|
128
|
+
const env = process.env.RIVERBANK_ENV;
|
|
129
|
+
if (!env) return null;
|
|
130
|
+
const envKey = `RIVERBANK_${env.toUpperCase()}_DASHBOARD_URL`;
|
|
131
|
+
const dashboardUrl = process.env[envKey];
|
|
132
|
+
if (dashboardUrl) {
|
|
133
|
+
return dashboardUrl.replace(/\/$/, "");
|
|
134
|
+
}
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
128
137
|
function getCmsApiUrl() {
|
|
138
|
+
const multiEnvDashboard = resolveMultiEnvDashboardUrl();
|
|
139
|
+
if (multiEnvDashboard) {
|
|
140
|
+
return `${multiEnvDashboard}/api`;
|
|
141
|
+
}
|
|
142
|
+
const builderApiUrl = process.env.NEXT_PUBLIC_BUILDER_API_URL;
|
|
143
|
+
if (builderApiUrl) {
|
|
144
|
+
return builderApiUrl.replace(/\/$/, "");
|
|
145
|
+
}
|
|
129
146
|
const dashboardUrl = process.env.NEXT_PUBLIC_DASHBOARD_URL;
|
|
130
147
|
if (dashboardUrl) {
|
|
131
148
|
const base = dashboardUrl.replace(/\/$/, "");
|
|
@@ -136,9 +153,12 @@ function getCmsApiUrl() {
|
|
|
136
153
|
return legacyApiUrl.replace(/\/$/, "");
|
|
137
154
|
}
|
|
138
155
|
throw new Error(
|
|
139
|
-
"
|
|
156
|
+
"Dashboard URL not configured. Either:\n 1. Set RIVERBANK_ENV with RIVERBANK_LOCAL_DASHBOARD_URL / RIVERBANK_REMOTE_DASHBOARD_URL\n 2. Set NEXT_PUBLIC_BUILDER_API_URL (SDK sites)\n 3. Set NEXT_PUBLIC_DASHBOARD_URL (frontend app)"
|
|
140
157
|
);
|
|
141
158
|
}
|
|
159
|
+
|
|
160
|
+
// ../blocks/src/system/runtime/nodes/media.tsx
|
|
161
|
+
var _jsxruntime = require('react/jsx-runtime');
|
|
142
162
|
var debugMediaNodeLog = (...args) => {
|
|
143
163
|
if (typeof window !== "undefined" && window.__DEBUG_MEDIA_NODE__) {
|
|
144
164
|
console.log("[MediaNode]", ...args);
|
|
@@ -9603,4 +9623,4 @@ chroma-js/src/utils/contrastAPCA.js:
|
|
|
9603
9623
|
* https://readtech.org/ARC/
|
|
9604
9624
|
*)
|
|
9605
9625
|
*/
|
|
9606
|
-
//# sourceMappingURL=chunk-
|
|
9626
|
+
//# sourceMappingURL=chunk-IT5ICP43.js.map
|