@riverbankcms/sdk 0.6.1 → 0.7.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/dist/client/client.js +1 -1
- package/dist/client/client.js.map +1 -1
- package/dist/client/client.mjs +1 -1
- package/dist/client/client.mjs.map +1 -1
- package/dist/server/{chunk-Z5ZA6Q4D.mjs → chunk-74XUVNOO.mjs} +5 -3
- package/dist/server/chunk-74XUVNOO.mjs.map +1 -0
- package/dist/server/{chunk-3B364WO2.js → chunk-7BVRA5MY.js} +4 -49
- package/dist/server/chunk-7BVRA5MY.js.map +1 -0
- package/dist/server/{chunk-I7ZR2WO3.mjs → chunk-7FIJSGHU.mjs} +2 -2
- package/dist/server/{chunk-I7ZR2WO3.mjs.map → chunk-7FIJSGHU.mjs.map} +1 -1
- package/dist/server/chunk-ARNCLSQT.mjs +52 -0
- package/dist/server/chunk-ARNCLSQT.mjs.map +1 -0
- package/dist/server/chunk-BNQV3PXP.js +69 -0
- package/dist/server/chunk-BNQV3PXP.js.map +1 -0
- package/dist/server/{chunk-I2D7KOEA.js → chunk-JWRNMNWI.js} +5 -3
- package/dist/server/chunk-JWRNMNWI.js.map +1 -0
- package/dist/server/{chunk-IVHIQFJH.js → chunk-P7UVAMK6.js} +2 -2
- package/dist/server/{chunk-IVHIQFJH.js.map → chunk-P7UVAMK6.js.map} +1 -1
- package/dist/server/{chunk-XXFF4RVR.mjs → chunk-RBJFXNDM.mjs} +1 -46
- package/dist/server/chunk-RBJFXNDM.mjs.map +1 -0
- package/dist/server/chunk-SWYWZT3L.mjs +69 -0
- package/dist/server/chunk-SWYWZT3L.mjs.map +1 -0
- package/dist/server/chunk-T26N3P26.js +52 -0
- package/dist/server/chunk-T26N3P26.js.map +1 -0
- package/dist/server/components.js +5 -3
- package/dist/server/components.js.map +1 -1
- package/dist/server/components.mjs +5 -3
- package/dist/server/index-BTwWvSBu.d.ts +130 -0
- package/dist/server/index-DI_qlYx3.d.mts +130 -0
- package/dist/server/index.js +2 -2
- package/dist/server/index.mjs +1 -1
- package/dist/server/{loadContent-BS-3wesN.d.mts → loadContent-C-YYUKQa.d.mts} +10 -2
- package/dist/server/{loadContent-Buvmudee.d.ts → loadContent-DmgpFcFC.d.ts} +10 -2
- package/dist/server/metadata.d.mts +8 -135
- package/dist/server/metadata.d.ts +8 -135
- package/dist/server/metadata.js +5 -65
- package/dist/server/metadata.js.map +1 -1
- package/dist/server/metadata.mjs +4 -64
- package/dist/server/metadata.mjs.map +1 -1
- package/dist/server/next.d.mts +274 -0
- package/dist/server/next.d.ts +274 -0
- package/dist/server/next.js +150 -0
- package/dist/server/next.js.map +1 -0
- package/dist/server/next.mjs +150 -0
- package/dist/server/next.mjs.map +1 -0
- package/dist/server/rendering/server.js +5 -3
- package/dist/server/rendering/server.js.map +1 -1
- package/dist/server/rendering/server.mjs +5 -3
- package/dist/server/rendering.d.mts +1 -1
- package/dist/server/rendering.d.ts +1 -1
- package/dist/server/rendering.js +6 -4
- package/dist/server/rendering.js.map +1 -1
- package/dist/server/rendering.mjs +6 -4
- package/dist/server/server.d.mts +1 -1
- package/dist/server/server.d.ts +1 -1
- package/dist/server/server.js +3 -3
- package/dist/server/server.mjs +2 -2
- package/package.json +13 -1
- package/dist/server/chunk-3B364WO2.js.map +0 -1
- package/dist/server/chunk-I2D7KOEA.js.map +0 -1
- package/dist/server/chunk-XXFF4RVR.mjs.map +0 -1
- package/dist/server/chunk-Z5ZA6Q4D.mjs.map +0 -1
|
@@ -3,7 +3,6 @@ import {
|
|
|
3
3
|
buildMenu
|
|
4
4
|
} from "./chunk-YXA4GAAQ.mjs";
|
|
5
5
|
import {
|
|
6
|
-
PageRenderer,
|
|
7
6
|
buildThemeRuntime,
|
|
8
7
|
renderBlock
|
|
9
8
|
} from "./chunk-LNOUXALA.mjs";
|
|
@@ -12,49 +11,6 @@ import {
|
|
|
12
11
|
siteHeaderManifest
|
|
13
12
|
} from "./chunk-BYBJA6SP.mjs";
|
|
14
13
|
|
|
15
|
-
// src/rendering/components/Page.tsx
|
|
16
|
-
import { jsx } from "react/jsx-runtime";
|
|
17
|
-
function Page({
|
|
18
|
-
page,
|
|
19
|
-
theme,
|
|
20
|
-
themeTokens: providedTokens,
|
|
21
|
-
siteId,
|
|
22
|
-
resolvedData,
|
|
23
|
-
routeMap,
|
|
24
|
-
wrapBlock,
|
|
25
|
-
registry,
|
|
26
|
-
usePlaceholders = false,
|
|
27
|
-
blockOverrides,
|
|
28
|
-
sdkConfig,
|
|
29
|
-
supabaseUrl,
|
|
30
|
-
dataContext
|
|
31
|
-
}) {
|
|
32
|
-
const baseTokens = providedTokens ?? buildThemeRuntime(theme).tokens;
|
|
33
|
-
const themeTokens = sdkConfig?.theme?.palette ? { ...baseTokens, palette: { ...baseTokens.palette, ...sdkConfig.theme.palette } } : baseTokens;
|
|
34
|
-
return /* @__PURE__ */ jsx(
|
|
35
|
-
PageRenderer,
|
|
36
|
-
{
|
|
37
|
-
theme,
|
|
38
|
-
page,
|
|
39
|
-
themeTokens,
|
|
40
|
-
usePlaceholders,
|
|
41
|
-
dataContext: {
|
|
42
|
-
siteId,
|
|
43
|
-
resolvedData,
|
|
44
|
-
routes: routeMap,
|
|
45
|
-
occurrenceContext: dataContext?.occurrenceContext ?? null,
|
|
46
|
-
contentEntry: dataContext?.contentEntry ?? null,
|
|
47
|
-
supabaseUrl
|
|
48
|
-
},
|
|
49
|
-
routeMap,
|
|
50
|
-
wrapBlock,
|
|
51
|
-
registry,
|
|
52
|
-
blockOverrides,
|
|
53
|
-
sdkConfig
|
|
54
|
-
}
|
|
55
|
-
);
|
|
56
|
-
}
|
|
57
|
-
|
|
58
14
|
// src/rendering/components/Layout.tsx
|
|
59
15
|
import { Fragment, jsxs } from "react/jsx-runtime";
|
|
60
16
|
async function Layout({
|
|
@@ -128,7 +84,6 @@ async function Layout({
|
|
|
128
84
|
}
|
|
129
85
|
|
|
130
86
|
export {
|
|
131
|
-
Page,
|
|
132
87
|
Layout
|
|
133
88
|
};
|
|
134
|
-
//# sourceMappingURL=chunk-
|
|
89
|
+
//# sourceMappingURL=chunk-RBJFXNDM.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/rendering/components/Layout.tsx"],"sourcesContent":["/**\n * Layout component with header and footer\n *\n * Renders site header and footer around content. Fetches site data if not provided.\n */\n\nimport { renderBlock, siteFooterManifest, siteHeaderManifest, buildThemeRuntime } from '@riverbankcms/blocks';\nimport { buildMenu, buildLogo } from '../../navigation';\nimport type { RiverbankClient, SiteResponse } from '../../client/types';\n\nexport type HeaderData = {\n menu: ReturnType<typeof buildMenu>;\n logo: ReturnType<typeof buildLogo>;\n site: SiteResponse['site'];\n theme: SiteResponse['theme'];\n routes: SiteResponse['routes'];\n};\n\nexport type LayoutProps = {\n // Option 1: Pass pre-fetched site data\n siteData?: SiteResponse;\n\n // Option 2: Fetch site data (provide client + identifier)\n client?: RiverbankClient;\n siteId?: string;\n slug?: string;\n domain?: string;\n\n // Content\n children: React.ReactNode;\n\n // Control rendering\n header?: boolean | ((data: HeaderData) => React.ReactNode);\n footer?: boolean;\n\n // Header variant override (if using default header)\n headerVariant?: 'classic' | 'centered' | 'transparent' | 'floating' | 'editorial';\n};\n\n/**\n * Layout component that wraps content with site header and footer.\n *\n * @example With pre-fetched site data (recommended)\n * ```tsx\n * const site = await client.getSite({ slug: 'my-site' });\n *\n * <Layout siteData={site}>\n * <Page {...pageData} />\n * </Layout>\n * ```\n *\n * @example With automatic fetching\n * ```tsx\n * <Layout client={client} slug=\"my-site\">\n * <Page {...pageData} />\n * </Layout>\n * ```\n */\nexport async function Layout({\n siteData: providedSiteData,\n client,\n siteId,\n slug,\n domain,\n children,\n header = true,\n footer = true,\n headerVariant,\n}: LayoutProps) {\n // Fetch site data if not provided\n let siteData = providedSiteData;\n if (!siteData) {\n if (!client) {\n throw new Error('Layout: must provide either siteData or client');\n }\n if (!siteId && !slug && !domain) {\n throw new Error('Layout: must provide siteId, slug, or domain when using client');\n }\n\n siteData = await client.getSite({ id: siteId, slug, domain });\n }\n\n const { site, theme, navigation, layout, routes } = siteData;\n const themeRuntime = buildThemeRuntime(theme);\n\n // Build view models for header/footer\n const menuViewModel = buildMenu(navigation, routes);\n const logoViewModel = buildLogo(layout.logo ?? null, site.title);\n\n // Prepare header data for custom headers\n const headerData: HeaderData = {\n menu: menuViewModel,\n logo: logoViewModel,\n site,\n theme,\n routes,\n };\n\n // Override header variant if specified\n const headerContent = headerVariant\n ? { ...layout.header, variant: headerVariant }\n : layout.header;\n\n // Override theme header variant if specified\n const themeWithVariant = headerVariant\n ? {\n ...theme,\n header: { ...theme.header, variant: headerVariant },\n }\n : theme;\n\n const viewModelOverrides = {\n $root: {\n siteId: site.id,\n routes,\n theme: themeWithVariant,\n },\n site,\n menu: menuViewModel,\n content: {\n logo: logoViewModel,\n },\n };\n\n // Render header based on type\n let headerElement: React.ReactNode = null;\n if (header === true) {\n // Default header rendering\n headerElement = renderBlock(siteHeaderManifest, headerContent, {\n theme: themeRuntime.tokens,\n themeConfig: themeWithVariant,\n viewModelOverrides,\n });\n } else if (typeof header === 'function') {\n // Custom header rendering\n headerElement = header(headerData);\n }\n\n return (\n <>\n {headerElement}\n\n {children}\n\n {footer && renderBlock(siteFooterManifest, layout.footer, {\n theme: themeRuntime.tokens,\n themeConfig: theme,\n viewModelOverrides,\n })}\n </>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;AA2II;AAjFJ,eAAsB,OAAO;AAAA,EAC3B,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT,SAAS;AAAA,EACT;AACF,GAAgB;AAEd,MAAI,WAAW;AACf,MAAI,CAAC,UAAU;AACb,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,MAAM,gDAAgD;AAAA,IAClE;AACA,QAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ;AAC/B,YAAM,IAAI,MAAM,gEAAgE;AAAA,IAClF;AAEA,eAAW,MAAM,OAAO,QAAQ,EAAE,IAAI,QAAQ,MAAM,OAAO,CAAC;AAAA,EAC9D;AAEA,QAAM,EAAE,MAAM,OAAO,YAAY,QAAQ,OAAO,IAAI;AACpD,QAAM,eAAe,kBAAkB,KAAK;AAG5C,QAAM,gBAAgB,UAAU,YAAY,MAAM;AAClD,QAAM,gBAAgB,UAAU,OAAO,QAAQ,MAAM,KAAK,KAAK;AAG/D,QAAM,aAAyB;AAAA,IAC7B,MAAM;AAAA,IACN,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAGA,QAAM,gBAAgB,gBAClB,EAAE,GAAG,OAAO,QAAQ,SAAS,cAAc,IAC3C,OAAO;AAGX,QAAM,mBAAmB,gBACrB;AAAA,IACE,GAAG;AAAA,IACH,QAAQ,EAAE,GAAG,MAAM,QAAQ,SAAS,cAAc;AAAA,EACpD,IACA;AAEJ,QAAM,qBAAqB;AAAA,IACzB,OAAO;AAAA,MACL,QAAQ,KAAK;AAAA,MACb;AAAA,MACA,OAAO;AAAA,IACT;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN,SAAS;AAAA,MACP,MAAM;AAAA,IACR;AAAA,EACF;AAGA,MAAI,gBAAiC;AACrC,MAAI,WAAW,MAAM;AAEnB,oBAAgB,YAAY,oBAAoB,eAAe;AAAA,MAC7D,OAAO,aAAa;AAAA,MACpB,aAAa;AAAA,MACb;AAAA,IACF,CAAC;AAAA,EACH,WAAW,OAAO,WAAW,YAAY;AAEvC,oBAAgB,OAAO,UAAU;AAAA,EACnC;AAEA,SACE,iCACG;AAAA;AAAA,IAEA;AAAA,IAEA,UAAU,YAAY,oBAAoB,OAAO,QAAQ;AAAA,MACxD,OAAO,aAAa;AAAA,MACpB,aAAa;AAAA,MACb;AAAA,IACF,CAAC;AAAA,KACH;AAEJ;","names":[]}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
// src/metadata/generatePageMetadata.ts
|
|
2
|
+
function generatePageMetadata(input) {
|
|
3
|
+
const { page, site, path, siteUrl, overrides, googleSiteVerification } = input;
|
|
4
|
+
const pageTitle = overrides?.title ?? page.name;
|
|
5
|
+
const fullTitle = pageTitle === site.title ? pageTitle : `${pageTitle} | ${site.title}`;
|
|
6
|
+
const description = overrides?.description ?? page.purpose;
|
|
7
|
+
const canonicalUrl = overrides?.canonicalUrl ?? `${siteUrl}${path}`;
|
|
8
|
+
const fullUrl = `${siteUrl}${path}`;
|
|
9
|
+
const metadata = {
|
|
10
|
+
title: fullTitle,
|
|
11
|
+
description: description ?? void 0,
|
|
12
|
+
alternates: {
|
|
13
|
+
canonical: canonicalUrl
|
|
14
|
+
},
|
|
15
|
+
openGraph: {
|
|
16
|
+
title: pageTitle,
|
|
17
|
+
description: description ?? void 0,
|
|
18
|
+
url: fullUrl,
|
|
19
|
+
siteName: site.title,
|
|
20
|
+
type: "website",
|
|
21
|
+
...overrides?.ogImage ? {
|
|
22
|
+
images: [
|
|
23
|
+
{
|
|
24
|
+
url: overrides.ogImage,
|
|
25
|
+
alt: pageTitle
|
|
26
|
+
}
|
|
27
|
+
]
|
|
28
|
+
} : {}
|
|
29
|
+
},
|
|
30
|
+
twitter: {
|
|
31
|
+
card: "summary_large_image",
|
|
32
|
+
title: pageTitle,
|
|
33
|
+
description: description ?? void 0,
|
|
34
|
+
...overrides?.ogImage ? {
|
|
35
|
+
images: [overrides.ogImage]
|
|
36
|
+
} : {}
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
if (overrides?.robots) {
|
|
40
|
+
metadata.robots = {
|
|
41
|
+
index: overrides.robots.index ?? true,
|
|
42
|
+
follow: overrides.robots.follow ?? true
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
if (googleSiteVerification) {
|
|
46
|
+
metadata.verification = {
|
|
47
|
+
google: googleSiteVerification
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
return metadata;
|
|
51
|
+
}
|
|
52
|
+
function generatePreviewMetadata(input) {
|
|
53
|
+
return generatePageMetadata({
|
|
54
|
+
...input,
|
|
55
|
+
overrides: {
|
|
56
|
+
...input.overrides,
|
|
57
|
+
robots: {
|
|
58
|
+
index: false,
|
|
59
|
+
follow: false
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export {
|
|
66
|
+
generatePageMetadata,
|
|
67
|
+
generatePreviewMetadata
|
|
68
|
+
};
|
|
69
|
+
//# sourceMappingURL=chunk-SWYWZT3L.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/metadata/generatePageMetadata.ts"],"sourcesContent":["/**\n * Metadata generation helper for Next.js pages\n *\n * Generates SEO-optimized metadata from Builder page data for use in\n * Next.js generateMetadata() functions.\n */\n\nimport type { LoadPageResult } from '../rendering/helpers/loadPage';\nimport type { SiteResponse } from '../client/types';\n\n/**\n * Next.js Metadata type\n * Simplified version to avoid requiring Next.js as a dependency\n */\nexport type Metadata = {\n title?: string;\n description?: string;\n alternates?: {\n canonical?: string;\n };\n openGraph?: {\n title?: string;\n description?: string;\n url?: string;\n siteName?: string;\n type?: string;\n images?: Array<{\n url: string;\n alt?: string;\n }>;\n };\n twitter?: {\n card?: string;\n title?: string;\n description?: string;\n images?: string[];\n };\n robots?: {\n index?: boolean;\n follow?: boolean;\n };\n verification?: {\n google?: string;\n };\n};\n\nexport type PageMetadataInput = {\n /**\n * Page data from loadPage() or custom page object\n */\n page: LoadPageResult['page'] | {\n name: string;\n purpose?: string;\n };\n\n /**\n * Site data from client.getSite()\n */\n site: SiteResponse['site'];\n\n /**\n * Current URL path (e.g., '/about', '/blog/post-1')\n */\n path: string;\n\n /**\n * Full site URL for canonical and OG URLs\n * Example: 'https://example.com'\n */\n siteUrl: string;\n\n /**\n * Optional custom metadata overrides\n */\n overrides?: {\n title?: string;\n description?: string;\n ogImage?: string;\n canonicalUrl?: string;\n robots?: {\n index?: boolean;\n follow?: boolean;\n };\n };\n\n /**\n * Optional Google site verification token\n */\n googleSiteVerification?: string;\n};\n\n/**\n * Generate Next.js Metadata object from Builder page data\n *\n * @example\n * ```tsx\n * import { generatePageMetadata } from '@riverbankcms/sdk/metadata';\n * import { loadPage } from '@riverbankcms/sdk';\n *\n * export async function generateMetadata({ params }) {\n * const pageData = await loadPage({ client, siteId, path: params.slug });\n * const siteData = await client.getSite({ id: siteId });\n *\n * return generatePageMetadata({\n * page: pageData.page,\n * site: siteData.site,\n * path: params.slug,\n * siteUrl: 'https://example.com',\n * });\n * }\n * ```\n */\nexport function generatePageMetadata(input: PageMetadataInput): Metadata {\n const { page, site, path, siteUrl, overrides, googleSiteVerification } = input;\n\n // Build page title\n const pageTitle = overrides?.title ?? page.name;\n const fullTitle = pageTitle === site.title ? pageTitle : `${pageTitle} | ${site.title}`;\n\n // Use page purpose as description fallback\n const description = overrides?.description ?? page.purpose;\n\n // Build full URLs\n const canonicalUrl = overrides?.canonicalUrl ?? `${siteUrl}${path}`;\n const fullUrl = `${siteUrl}${path}`;\n\n // Build metadata object\n const metadata: Metadata = {\n title: fullTitle,\n description: description ?? undefined,\n alternates: {\n canonical: canonicalUrl,\n },\n openGraph: {\n title: pageTitle,\n description: description ?? undefined,\n url: fullUrl,\n siteName: site.title,\n type: 'website',\n ...(overrides?.ogImage\n ? {\n images: [\n {\n url: overrides.ogImage,\n alt: pageTitle,\n },\n ],\n }\n : {}),\n },\n twitter: {\n card: 'summary_large_image',\n title: pageTitle,\n description: description ?? undefined,\n ...(overrides?.ogImage\n ? {\n images: [overrides.ogImage],\n }\n : {}),\n },\n };\n\n // Add robots meta if specified\n if (overrides?.robots) {\n metadata.robots = {\n index: overrides.robots.index ?? true,\n follow: overrides.robots.follow ?? true,\n };\n }\n\n // Add Google site verification if provided\n if (googleSiteVerification) {\n metadata.verification = {\n google: googleSiteVerification,\n };\n }\n\n return metadata;\n}\n\n/**\n * Generate metadata for preview/staging environments\n *\n * This helper adds noindex/nofollow robots tags to prevent search engines\n * from indexing preview or staging URLs.\n *\n * @example\n * ```tsx\n * export async function generateMetadata({ params }) {\n * const pageData = await loadPage({ client, siteId, path: params.slug });\n * const isPreview = process.env.VERCEL_ENV !== 'production';\n *\n * return generatePreviewMetadata({\n * page: pageData.page,\n * site: siteData.site,\n * path: params.slug,\n * siteUrl: 'https://example.com',\n * });\n * }\n * ```\n */\nexport function generatePreviewMetadata(input: PageMetadataInput): Metadata {\n return generatePageMetadata({\n ...input,\n overrides: {\n ...input.overrides,\n robots: {\n index: false,\n follow: false,\n },\n },\n });\n}\n"],"mappings":";AAgHO,SAAS,qBAAqB,OAAoC;AACvE,QAAM,EAAE,MAAM,MAAM,MAAM,SAAS,WAAW,uBAAuB,IAAI;AAGzE,QAAM,YAAY,WAAW,SAAS,KAAK;AAC3C,QAAM,YAAY,cAAc,KAAK,QAAQ,YAAY,GAAG,SAAS,MAAM,KAAK,KAAK;AAGrF,QAAM,cAAc,WAAW,eAAe,KAAK;AAGnD,QAAM,eAAe,WAAW,gBAAgB,GAAG,OAAO,GAAG,IAAI;AACjE,QAAM,UAAU,GAAG,OAAO,GAAG,IAAI;AAGjC,QAAM,WAAqB;AAAA,IACzB,OAAO;AAAA,IACP,aAAa,eAAe;AAAA,IAC5B,YAAY;AAAA,MACV,WAAW;AAAA,IACb;AAAA,IACA,WAAW;AAAA,MACT,OAAO;AAAA,MACP,aAAa,eAAe;AAAA,MAC5B,KAAK;AAAA,MACL,UAAU,KAAK;AAAA,MACf,MAAM;AAAA,MACN,GAAI,WAAW,UACX;AAAA,QACE,QAAQ;AAAA,UACN;AAAA,YACE,KAAK,UAAU;AAAA,YACf,KAAK;AAAA,UACP;AAAA,QACF;AAAA,MACF,IACA,CAAC;AAAA,IACP;AAAA,IACA,SAAS;AAAA,MACP,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa,eAAe;AAAA,MAC5B,GAAI,WAAW,UACX;AAAA,QACE,QAAQ,CAAC,UAAU,OAAO;AAAA,MAC5B,IACA,CAAC;AAAA,IACP;AAAA,EACF;AAGA,MAAI,WAAW,QAAQ;AACrB,aAAS,SAAS;AAAA,MAChB,OAAO,UAAU,OAAO,SAAS;AAAA,MACjC,QAAQ,UAAU,OAAO,UAAU;AAAA,IACrC;AAAA,EACF;AAGA,MAAI,wBAAwB;AAC1B,aAAS,eAAe;AAAA,MACtB,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,SAAO;AACT;AAuBO,SAAS,wBAAwB,OAAoC;AAC1E,SAAO,qBAAqB;AAAA,IAC1B,GAAG;AAAA,IACH,WAAW;AAAA,MACT,GAAG,MAAM;AAAA,MACT,QAAQ;AAAA,QACN,OAAO;AAAA,QACP,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF,CAAC;AACH;","names":[]}
|
|
@@ -0,0 +1,52 @@
|
|
|
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
|
+
|
|
3
|
+
|
|
4
|
+
var _chunk7UPVCT3Kjs = require('./chunk-7UPVCT3K.js');
|
|
5
|
+
|
|
6
|
+
// src/rendering/components/Page.tsx
|
|
7
|
+
var _jsxruntime = require('react/jsx-runtime');
|
|
8
|
+
function Page({
|
|
9
|
+
page,
|
|
10
|
+
theme,
|
|
11
|
+
themeTokens: providedTokens,
|
|
12
|
+
siteId,
|
|
13
|
+
resolvedData,
|
|
14
|
+
routeMap,
|
|
15
|
+
wrapBlock,
|
|
16
|
+
registry,
|
|
17
|
+
usePlaceholders = false,
|
|
18
|
+
blockOverrides,
|
|
19
|
+
sdkConfig,
|
|
20
|
+
supabaseUrl,
|
|
21
|
+
dataContext
|
|
22
|
+
}) {
|
|
23
|
+
const baseTokens = _nullishCoalesce(providedTokens, () => ( _chunk7UPVCT3Kjs.buildThemeRuntime.call(void 0, theme).tokens));
|
|
24
|
+
const themeTokens = _optionalChain([sdkConfig, 'optionalAccess', _ => _.theme, 'optionalAccess', _2 => _2.palette]) ? { ...baseTokens, palette: { ...baseTokens.palette, ...sdkConfig.theme.palette } } : baseTokens;
|
|
25
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
26
|
+
_chunk7UPVCT3Kjs.PageRenderer,
|
|
27
|
+
{
|
|
28
|
+
theme,
|
|
29
|
+
page,
|
|
30
|
+
themeTokens,
|
|
31
|
+
usePlaceholders,
|
|
32
|
+
dataContext: {
|
|
33
|
+
siteId,
|
|
34
|
+
resolvedData,
|
|
35
|
+
routes: routeMap,
|
|
36
|
+
occurrenceContext: _nullishCoalesce(_optionalChain([dataContext, 'optionalAccess', _3 => _3.occurrenceContext]), () => ( null)),
|
|
37
|
+
contentEntry: _nullishCoalesce(_optionalChain([dataContext, 'optionalAccess', _4 => _4.contentEntry]), () => ( null)),
|
|
38
|
+
supabaseUrl
|
|
39
|
+
},
|
|
40
|
+
routeMap,
|
|
41
|
+
wrapBlock,
|
|
42
|
+
registry,
|
|
43
|
+
blockOverrides,
|
|
44
|
+
sdkConfig
|
|
45
|
+
}
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
exports.Page = Page;
|
|
52
|
+
//# sourceMappingURL=chunk-T26N3P26.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/chunk-T26N3P26.js","../../src/rendering/components/Page.tsx"],"names":[],"mappings":"AAAA;AACE;AACA;AACF,sDAA4B;AAC5B;AACA;AC0II,+CAAA;AAzBG,SAAS,IAAA,CAAK;AAAA,EACnB,IAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA,EAAa,cAAA;AAAA,EACb,MAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,gBAAA,EAAkB,KAAA;AAAA,EAClB,cAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA,EAAc;AAEZ,EAAA,MAAM,WAAA,mBAAa,cAAA,UAAkB,gDAAA,KAAuB,CAAA,CAAE,QAAA;AAI9D,EAAA,MAAM,YAAA,kBAAc,SAAA,2BAAW,KAAA,6BAAO,UAAA,EAClC,EAAE,GAAG,UAAA,EAAY,OAAA,EAAS,EAAE,GAAG,UAAA,CAAW,OAAA,EAAS,GAAG,SAAA,CAAU,KAAA,CAAM,QAAQ,EAAE,EAAA,EAChF,UAAA;AAEJ,EAAA,uBACE,6BAAA;AAAA,IAAC,6BAAA;AAAA,IAAA;AAAA,MACC,KAAA;AAAA,MACA,IAAA;AAAA,MACA,WAAA;AAAA,MACA,eAAA;AAAA,MACA,WAAA,EAAa;AAAA,QACX,MAAA;AAAA,QACA,YAAA;AAAA,QACA,MAAA,EAAQ,QAAA;AAAA,QACR,iBAAA,mCAAmB,WAAA,6BAAa,mBAAA,UAAqB,MAAA;AAAA,QACrD,YAAA,mCAAc,WAAA,6BAAa,cAAA,UAAgB,MAAA;AAAA,QAC3C;AAAA,MACF,CAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA;AAAA,MACA,QAAA;AAAA,MACA,cAAA;AAAA,MACA;AAAA,IAAA;AAAA,EACF,CAAA;AAEJ;ADpHA;AACA;AACE;AACF,oBAAC","file":"/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/chunk-T26N3P26.js","sourcesContent":[null,"/**\n * Pure Page renderer component for Riverbank CMS.\n *\n * This component expects all data to be provided via props.\n * For data fetching, use:\n * - Server-side: `await loadPage({ client, siteId, path })`\n * - Client-side: `usePage({ client, siteId, path })`\n */\n\nimport { PageRenderer, buildThemeRuntime } from '@riverbankcms/blocks';\nimport type { PageOutline, RouteMap, Theme, ThemeTokens, BlockOverrides, OccurrenceContextData } from '@riverbankcms/blocks';\nimport type { ResolvedBlockData } from '../../data';\nimport type { RuntimeSdkConfig } from '../helpers/loadPage';\n\n// Re-export OccurrenceContextData for SDK consumers\nexport type { OccurrenceContextData };\n\nexport type PageProps = {\n // Required data (must be provided by caller)\n page: PageOutline;\n theme: Theme;\n siteId: string;\n\n // Optional data\n themeTokens?: ThemeTokens; // If not provided, will be built from theme\n resolvedData?: ResolvedBlockData; // Pre-fetched block data\n routeMap?: RouteMap;\n /**\n * SDK site configuration containing theme palette overrides.\n * When provided, the SDK palette tokens are merged into the theme tokens,\n * allowing blocks to use SDK-defined color tokens for section backgrounds.\n */\n sdkConfig?: RuntimeSdkConfig | null;\n /**\n * Supabase storage URL for direct image access.\n * SDK sites receive this from the API instead of requiring NEXT_PUBLIC_SUPABASE_URL env var.\n */\n supabaseUrl?: string;\n\n /**\n * Additional context data for content entry pages.\n * Used to pass occurrence context and content entry data to blocks.\n */\n dataContext?: {\n /** Occurrence context for event pages (from URL like /events/yoga/2025-01-15) */\n occurrenceContext?: OccurrenceContextData | null;\n /** Content entry data for template pages */\n contentEntry?: Record<string, unknown> | null;\n };\n\n // Customization\n wrapBlock?: (blockId: string, rendered: React.ReactNode) => React.ReactNode;\n registry?: Parameters<typeof PageRenderer>[0]['registry'];\n usePlaceholders?: boolean;\n /**\n * Custom components to override default block rendering.\n * Keys can be full block kind (\"block.hero\") or short form (\"hero\").\n *\n * This is SSR-safe - no context or hooks required.\n *\n * @example\n * ```tsx\n * <Page\n * {...pageData}\n * blockOverrides={{\n * 'hero': MyCustomHero,\n * 'block.testimonials': MyCustomTestimonials,\n * }}\n * />\n * ```\n */\n blockOverrides?: BlockOverrides;\n};\n\n/**\n * Pure renderer for Riverbank CMS pages.\n *\n * This component expects all data to be provided via props.\n * For data fetching, use:\n * - Server-side: `await loadPage({ client, siteId, path })`\n * - Client-side: `usePage({ client, siteId, path })`\n *\n * @example Server-side (Next.js App Router)\n * ```tsx\n * import { createRiverbankClient } from '@riverbankcms/sdk';\n * import { loadPage, Page } from '@riverbankcms/sdk/rendering';\n *\n * const client = createRiverbankClient({ apiKey, baseUrl });\n *\n * export default async function PageRoute({ params }) {\n * const pageData = await loadPage({\n * client,\n * siteId: 'site-id',\n * path: `/${params.slug}`,\n * });\n *\n * return <Page {...pageData} />;\n * }\n * ```\n *\n * @example Client-side\n * ```tsx\n * import { createRiverbankClient } from '@riverbankcms/sdk';\n * import { usePage, Page } from '@riverbankcms/sdk/rendering';\n *\n * const client = createRiverbankClient({ apiKey, baseUrl });\n *\n * function MyPage({ path }) {\n * const pageData = usePage({ client, siteId: 'site-id', path });\n *\n * if (pageData.loading) return <LoadingState />;\n * if (pageData.error) return <ErrorState error={pageData.error} />;\n * if (!pageData.page) return <NotFound />;\n *\n * return <Page {...pageData} />;\n * }\n * ```\n */\nexport function Page({\n page,\n theme,\n themeTokens: providedTokens,\n siteId,\n resolvedData,\n routeMap,\n wrapBlock,\n registry,\n usePlaceholders = false,\n blockOverrides,\n sdkConfig,\n supabaseUrl,\n dataContext,\n}: PageProps) {\n // Build theme tokens if not provided\n const baseTokens = providedTokens ?? buildThemeRuntime(theme).tokens;\n\n // Merge SDK palette tokens into theme tokens\n // This allows blocks to resolve SDK-defined color tokens (e.g., 'primary' -> '#6d28d9')\n const themeTokens = sdkConfig?.theme?.palette\n ? { ...baseTokens, palette: { ...baseTokens.palette, ...sdkConfig.theme.palette } }\n : baseTokens;\n\n return (\n <PageRenderer\n theme={theme}\n page={page}\n themeTokens={themeTokens}\n usePlaceholders={usePlaceholders}\n dataContext={{\n siteId,\n resolvedData,\n routes: routeMap,\n occurrenceContext: dataContext?.occurrenceContext ?? null,\n contentEntry: dataContext?.contentEntry ?? null,\n supabaseUrl,\n }}\n routeMap={routeMap}\n wrapBlock={wrapBlock}\n registry={registry}\n blockOverrides={blockOverrides}\n sdkConfig={sdkConfig}\n />\n );\n}\n"]}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
var _chunk3B364WO2js = require('./chunk-3B364WO2.js');
|
|
3
|
+
var _chunk7BVRA5MYjs = require('./chunk-7BVRA5MY.js');
|
|
5
4
|
require('./chunk-EIVISR62.js');
|
|
6
5
|
|
|
7
6
|
|
|
7
|
+
var _chunkT26N3P26js = require('./chunk-T26N3P26.js');
|
|
8
|
+
|
|
9
|
+
|
|
8
10
|
|
|
9
11
|
|
|
10
12
|
|
|
@@ -22,5 +24,5 @@ require('./chunk-DGUM43GV.js');
|
|
|
22
24
|
|
|
23
25
|
|
|
24
26
|
|
|
25
|
-
exports.Layout =
|
|
27
|
+
exports.Layout = _chunk7BVRA5MYjs.Layout; exports.Page = _chunkT26N3P26js.Page; exports.PageRenderer = _chunk7UPVCT3Kjs.PageRenderer; exports.RichText = _chunk7UPVCT3Kjs.RichText; exports.SectionBackground = _chunk7UPVCT3Kjs.SectionBackground; exports.buildThemeRuntime = _chunk7UPVCT3Kjs.buildThemeRuntime; exports.resolveBackground = _chunk7UPVCT3Kjs.resolveBackground; exports.resolveImageUrl = _chunk7UPVCT3Kjs.resolveImageUrl;
|
|
26
28
|
//# sourceMappingURL=components.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/components.js"],"names":[],"mappings":"AAAA;AACE;
|
|
1
|
+
{"version":3,"sources":["/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/components.js"],"names":[],"mappings":"AAAA;AACE;AACF,sDAA4B;AAC5B,+BAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACE;AACA;AACA;AACA;AACA;AACA;AACF,sDAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,+aAAC","file":"/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/components.js"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { a as LoadPageResult } from './loadPage-DP3nrHBi.js';
|
|
2
|
+
import { S as SiteResponse } from './types-BvcJU7zk.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Metadata generation helper for Next.js pages
|
|
6
|
+
*
|
|
7
|
+
* Generates SEO-optimized metadata from Builder page data for use in
|
|
8
|
+
* Next.js generateMetadata() functions.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Next.js Metadata type
|
|
13
|
+
* Simplified version to avoid requiring Next.js as a dependency
|
|
14
|
+
*/
|
|
15
|
+
type Metadata = {
|
|
16
|
+
title?: string;
|
|
17
|
+
description?: string;
|
|
18
|
+
alternates?: {
|
|
19
|
+
canonical?: string;
|
|
20
|
+
};
|
|
21
|
+
openGraph?: {
|
|
22
|
+
title?: string;
|
|
23
|
+
description?: string;
|
|
24
|
+
url?: string;
|
|
25
|
+
siteName?: string;
|
|
26
|
+
type?: string;
|
|
27
|
+
images?: Array<{
|
|
28
|
+
url: string;
|
|
29
|
+
alt?: string;
|
|
30
|
+
}>;
|
|
31
|
+
};
|
|
32
|
+
twitter?: {
|
|
33
|
+
card?: string;
|
|
34
|
+
title?: string;
|
|
35
|
+
description?: string;
|
|
36
|
+
images?: string[];
|
|
37
|
+
};
|
|
38
|
+
robots?: {
|
|
39
|
+
index?: boolean;
|
|
40
|
+
follow?: boolean;
|
|
41
|
+
};
|
|
42
|
+
verification?: {
|
|
43
|
+
google?: string;
|
|
44
|
+
};
|
|
45
|
+
};
|
|
46
|
+
type PageMetadataInput = {
|
|
47
|
+
/**
|
|
48
|
+
* Page data from loadPage() or custom page object
|
|
49
|
+
*/
|
|
50
|
+
page: LoadPageResult['page'] | {
|
|
51
|
+
name: string;
|
|
52
|
+
purpose?: string;
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* Site data from client.getSite()
|
|
56
|
+
*/
|
|
57
|
+
site: SiteResponse['site'];
|
|
58
|
+
/**
|
|
59
|
+
* Current URL path (e.g., '/about', '/blog/post-1')
|
|
60
|
+
*/
|
|
61
|
+
path: string;
|
|
62
|
+
/**
|
|
63
|
+
* Full site URL for canonical and OG URLs
|
|
64
|
+
* Example: 'https://example.com'
|
|
65
|
+
*/
|
|
66
|
+
siteUrl: string;
|
|
67
|
+
/**
|
|
68
|
+
* Optional custom metadata overrides
|
|
69
|
+
*/
|
|
70
|
+
overrides?: {
|
|
71
|
+
title?: string;
|
|
72
|
+
description?: string;
|
|
73
|
+
ogImage?: string;
|
|
74
|
+
canonicalUrl?: string;
|
|
75
|
+
robots?: {
|
|
76
|
+
index?: boolean;
|
|
77
|
+
follow?: boolean;
|
|
78
|
+
};
|
|
79
|
+
};
|
|
80
|
+
/**
|
|
81
|
+
* Optional Google site verification token
|
|
82
|
+
*/
|
|
83
|
+
googleSiteVerification?: string;
|
|
84
|
+
};
|
|
85
|
+
/**
|
|
86
|
+
* Generate Next.js Metadata object from Builder page data
|
|
87
|
+
*
|
|
88
|
+
* @example
|
|
89
|
+
* ```tsx
|
|
90
|
+
* import { generatePageMetadata } from '@riverbankcms/sdk/metadata';
|
|
91
|
+
* import { loadPage } from '@riverbankcms/sdk';
|
|
92
|
+
*
|
|
93
|
+
* export async function generateMetadata({ params }) {
|
|
94
|
+
* const pageData = await loadPage({ client, siteId, path: params.slug });
|
|
95
|
+
* const siteData = await client.getSite({ id: siteId });
|
|
96
|
+
*
|
|
97
|
+
* return generatePageMetadata({
|
|
98
|
+
* page: pageData.page,
|
|
99
|
+
* site: siteData.site,
|
|
100
|
+
* path: params.slug,
|
|
101
|
+
* siteUrl: 'https://example.com',
|
|
102
|
+
* });
|
|
103
|
+
* }
|
|
104
|
+
* ```
|
|
105
|
+
*/
|
|
106
|
+
declare function generatePageMetadata(input: PageMetadataInput): Metadata;
|
|
107
|
+
/**
|
|
108
|
+
* Generate metadata for preview/staging environments
|
|
109
|
+
*
|
|
110
|
+
* This helper adds noindex/nofollow robots tags to prevent search engines
|
|
111
|
+
* from indexing preview or staging URLs.
|
|
112
|
+
*
|
|
113
|
+
* @example
|
|
114
|
+
* ```tsx
|
|
115
|
+
* export async function generateMetadata({ params }) {
|
|
116
|
+
* const pageData = await loadPage({ client, siteId, path: params.slug });
|
|
117
|
+
* const isPreview = process.env.VERCEL_ENV !== 'production';
|
|
118
|
+
*
|
|
119
|
+
* return generatePreviewMetadata({
|
|
120
|
+
* page: pageData.page,
|
|
121
|
+
* site: siteData.site,
|
|
122
|
+
* path: params.slug,
|
|
123
|
+
* siteUrl: 'https://example.com',
|
|
124
|
+
* });
|
|
125
|
+
* }
|
|
126
|
+
* ```
|
|
127
|
+
*/
|
|
128
|
+
declare function generatePreviewMetadata(input: PageMetadataInput): Metadata;
|
|
129
|
+
|
|
130
|
+
export { type Metadata as M, type PageMetadataInput as P, generatePreviewMetadata as a, generatePageMetadata as g };
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { a as LoadPageResult } from './loadPage-B8mQUUSo.mjs';
|
|
2
|
+
import { S as SiteResponse } from './types-1cLz0vnq.mjs';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Metadata generation helper for Next.js pages
|
|
6
|
+
*
|
|
7
|
+
* Generates SEO-optimized metadata from Builder page data for use in
|
|
8
|
+
* Next.js generateMetadata() functions.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Next.js Metadata type
|
|
13
|
+
* Simplified version to avoid requiring Next.js as a dependency
|
|
14
|
+
*/
|
|
15
|
+
type Metadata = {
|
|
16
|
+
title?: string;
|
|
17
|
+
description?: string;
|
|
18
|
+
alternates?: {
|
|
19
|
+
canonical?: string;
|
|
20
|
+
};
|
|
21
|
+
openGraph?: {
|
|
22
|
+
title?: string;
|
|
23
|
+
description?: string;
|
|
24
|
+
url?: string;
|
|
25
|
+
siteName?: string;
|
|
26
|
+
type?: string;
|
|
27
|
+
images?: Array<{
|
|
28
|
+
url: string;
|
|
29
|
+
alt?: string;
|
|
30
|
+
}>;
|
|
31
|
+
};
|
|
32
|
+
twitter?: {
|
|
33
|
+
card?: string;
|
|
34
|
+
title?: string;
|
|
35
|
+
description?: string;
|
|
36
|
+
images?: string[];
|
|
37
|
+
};
|
|
38
|
+
robots?: {
|
|
39
|
+
index?: boolean;
|
|
40
|
+
follow?: boolean;
|
|
41
|
+
};
|
|
42
|
+
verification?: {
|
|
43
|
+
google?: string;
|
|
44
|
+
};
|
|
45
|
+
};
|
|
46
|
+
type PageMetadataInput = {
|
|
47
|
+
/**
|
|
48
|
+
* Page data from loadPage() or custom page object
|
|
49
|
+
*/
|
|
50
|
+
page: LoadPageResult['page'] | {
|
|
51
|
+
name: string;
|
|
52
|
+
purpose?: string;
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* Site data from client.getSite()
|
|
56
|
+
*/
|
|
57
|
+
site: SiteResponse['site'];
|
|
58
|
+
/**
|
|
59
|
+
* Current URL path (e.g., '/about', '/blog/post-1')
|
|
60
|
+
*/
|
|
61
|
+
path: string;
|
|
62
|
+
/**
|
|
63
|
+
* Full site URL for canonical and OG URLs
|
|
64
|
+
* Example: 'https://example.com'
|
|
65
|
+
*/
|
|
66
|
+
siteUrl: string;
|
|
67
|
+
/**
|
|
68
|
+
* Optional custom metadata overrides
|
|
69
|
+
*/
|
|
70
|
+
overrides?: {
|
|
71
|
+
title?: string;
|
|
72
|
+
description?: string;
|
|
73
|
+
ogImage?: string;
|
|
74
|
+
canonicalUrl?: string;
|
|
75
|
+
robots?: {
|
|
76
|
+
index?: boolean;
|
|
77
|
+
follow?: boolean;
|
|
78
|
+
};
|
|
79
|
+
};
|
|
80
|
+
/**
|
|
81
|
+
* Optional Google site verification token
|
|
82
|
+
*/
|
|
83
|
+
googleSiteVerification?: string;
|
|
84
|
+
};
|
|
85
|
+
/**
|
|
86
|
+
* Generate Next.js Metadata object from Builder page data
|
|
87
|
+
*
|
|
88
|
+
* @example
|
|
89
|
+
* ```tsx
|
|
90
|
+
* import { generatePageMetadata } from '@riverbankcms/sdk/metadata';
|
|
91
|
+
* import { loadPage } from '@riverbankcms/sdk';
|
|
92
|
+
*
|
|
93
|
+
* export async function generateMetadata({ params }) {
|
|
94
|
+
* const pageData = await loadPage({ client, siteId, path: params.slug });
|
|
95
|
+
* const siteData = await client.getSite({ id: siteId });
|
|
96
|
+
*
|
|
97
|
+
* return generatePageMetadata({
|
|
98
|
+
* page: pageData.page,
|
|
99
|
+
* site: siteData.site,
|
|
100
|
+
* path: params.slug,
|
|
101
|
+
* siteUrl: 'https://example.com',
|
|
102
|
+
* });
|
|
103
|
+
* }
|
|
104
|
+
* ```
|
|
105
|
+
*/
|
|
106
|
+
declare function generatePageMetadata(input: PageMetadataInput): Metadata;
|
|
107
|
+
/**
|
|
108
|
+
* Generate metadata for preview/staging environments
|
|
109
|
+
*
|
|
110
|
+
* This helper adds noindex/nofollow robots tags to prevent search engines
|
|
111
|
+
* from indexing preview or staging URLs.
|
|
112
|
+
*
|
|
113
|
+
* @example
|
|
114
|
+
* ```tsx
|
|
115
|
+
* export async function generateMetadata({ params }) {
|
|
116
|
+
* const pageData = await loadPage({ client, siteId, path: params.slug });
|
|
117
|
+
* const isPreview = process.env.VERCEL_ENV !== 'production';
|
|
118
|
+
*
|
|
119
|
+
* return generatePreviewMetadata({
|
|
120
|
+
* page: pageData.page,
|
|
121
|
+
* site: siteData.site,
|
|
122
|
+
* path: params.slug,
|
|
123
|
+
* siteUrl: 'https://example.com',
|
|
124
|
+
* });
|
|
125
|
+
* }
|
|
126
|
+
* ```
|
|
127
|
+
*/
|
|
128
|
+
declare function generatePreviewMetadata(input: PageMetadataInput): Metadata;
|
|
129
|
+
|
|
130
|
+
export { type Metadata as M, type PageMetadataInput as P, generatePreviewMetadata as a, generatePageMetadata as g };
|
package/dist/server/index.js
CHANGED
|
@@ -5,7 +5,7 @@ var _chunkGERCMTPQjs = require('./chunk-GERCMTPQ.js');
|
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
|
|
8
|
-
var
|
|
8
|
+
var _chunkP7UVAMK6js = require('./chunk-P7UVAMK6.js');
|
|
9
9
|
require('./chunk-DGUM43GV.js');
|
|
10
10
|
|
|
11
11
|
// ../api/src/aiPlayground.ts
|
|
@@ -101,5 +101,5 @@ var MultiPageUpdateResponse = _zod.z.object({
|
|
|
101
101
|
|
|
102
102
|
|
|
103
103
|
|
|
104
|
-
exports.API_ENDPOINTS =
|
|
104
|
+
exports.API_ENDPOINTS = _chunkP7UVAMK6js.API_ENDPOINTS; exports.SYSTEM_BLOCK_KINDS = _chunkGERCMTPQjs.SYSTEM_BLOCK_KINDS; exports.buildEndpointURL = _chunkP7UVAMK6js.buildEndpointURL; exports.createRiverbankClient = _chunkP7UVAMK6js.createRiverbankClient;
|
|
105
105
|
//# sourceMappingURL=index.js.map
|
package/dist/server/index.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { T as Theme } from './types-Dsu9wsUh.mjs';
|
|
2
2
|
import './schema-Z6-afHJG.mjs';
|
|
3
|
-
import { R as RiverbankClient } from './types-1cLz0vnq.mjs';
|
|
3
|
+
import { R as RiverbankClient, S as SiteResponse } from './types-1cLz0vnq.mjs';
|
|
4
4
|
import { P as PageProps } from './loadPage-B8mQUUSo.mjs';
|
|
5
5
|
import { R as ResolvedBlockData } from './types-CbagRQ_7.mjs';
|
|
6
6
|
|
|
@@ -11,6 +11,10 @@ import { R as ResolvedBlockData } from './types-CbagRQ_7.mjs';
|
|
|
11
11
|
* a page or a content entry.
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
|
+
/**
|
|
15
|
+
* Site data included in content results for metadata generation.
|
|
16
|
+
*/
|
|
17
|
+
type SiteData = SiteResponse['site'];
|
|
14
18
|
type LoadContentParams = {
|
|
15
19
|
client: RiverbankClient;
|
|
16
20
|
siteId: string;
|
|
@@ -56,6 +60,8 @@ type PageContentResult = {
|
|
|
56
60
|
siteId: string;
|
|
57
61
|
/** Pre-fetched block data for data loaders */
|
|
58
62
|
resolvedData: ResolvedBlockData;
|
|
63
|
+
/** Site data for metadata generation */
|
|
64
|
+
site: SiteData;
|
|
59
65
|
};
|
|
60
66
|
/**
|
|
61
67
|
* Result when path resolves to a content entry
|
|
@@ -76,6 +82,8 @@ type EntryContentResult = {
|
|
|
76
82
|
theme: Theme;
|
|
77
83
|
/** Site ID */
|
|
78
84
|
siteId: string;
|
|
85
|
+
/** Site data for metadata generation */
|
|
86
|
+
site: SiteData;
|
|
79
87
|
};
|
|
80
88
|
/**
|
|
81
89
|
* Discriminated union result from loadContent
|
|
@@ -150,4 +158,4 @@ declare function isEntryContent(result: LoadContentResult): result is EntryConte
|
|
|
150
158
|
*/
|
|
151
159
|
declare function loadContent(params: LoadContentParams): Promise<LoadContentResult>;
|
|
152
160
|
|
|
153
|
-
export { type ContentEntryData as C, type EntryContentResult as E, type LoadContentParams as L, type PageContentResult as P, isEntryContent as a, type LoadContentResult as b, isPageContent as i, loadContent as l };
|
|
161
|
+
export { type ContentEntryData as C, type EntryContentResult as E, type LoadContentParams as L, type PageContentResult as P, type SiteData as S, isEntryContent as a, type LoadContentResult as b, isPageContent as i, loadContent as l };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { T as Theme } from './types-CVykEqXN.js';
|
|
2
2
|
import './schema-Z6-afHJG.js';
|
|
3
|
-
import { R as RiverbankClient } from './types-BvcJU7zk.js';
|
|
3
|
+
import { R as RiverbankClient, S as SiteResponse } from './types-BvcJU7zk.js';
|
|
4
4
|
import { P as PageProps } from './loadPage-DP3nrHBi.js';
|
|
5
5
|
import { R as ResolvedBlockData } from './types-DuQCNVV0.js';
|
|
6
6
|
|
|
@@ -11,6 +11,10 @@ import { R as ResolvedBlockData } from './types-DuQCNVV0.js';
|
|
|
11
11
|
* a page or a content entry.
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
|
+
/**
|
|
15
|
+
* Site data included in content results for metadata generation.
|
|
16
|
+
*/
|
|
17
|
+
type SiteData = SiteResponse['site'];
|
|
14
18
|
type LoadContentParams = {
|
|
15
19
|
client: RiverbankClient;
|
|
16
20
|
siteId: string;
|
|
@@ -56,6 +60,8 @@ type PageContentResult = {
|
|
|
56
60
|
siteId: string;
|
|
57
61
|
/** Pre-fetched block data for data loaders */
|
|
58
62
|
resolvedData: ResolvedBlockData;
|
|
63
|
+
/** Site data for metadata generation */
|
|
64
|
+
site: SiteData;
|
|
59
65
|
};
|
|
60
66
|
/**
|
|
61
67
|
* Result when path resolves to a content entry
|
|
@@ -76,6 +82,8 @@ type EntryContentResult = {
|
|
|
76
82
|
theme: Theme;
|
|
77
83
|
/** Site ID */
|
|
78
84
|
siteId: string;
|
|
85
|
+
/** Site data for metadata generation */
|
|
86
|
+
site: SiteData;
|
|
79
87
|
};
|
|
80
88
|
/**
|
|
81
89
|
* Discriminated union result from loadContent
|
|
@@ -150,4 +158,4 @@ declare function isEntryContent(result: LoadContentResult): result is EntryConte
|
|
|
150
158
|
*/
|
|
151
159
|
declare function loadContent(params: LoadContentParams): Promise<LoadContentResult>;
|
|
152
160
|
|
|
153
|
-
export { type ContentEntryData as C, type EntryContentResult as E, type LoadContentParams as L, type PageContentResult as P, isEntryContent as a, type LoadContentResult as b, isPageContent as i, loadContent as l };
|
|
161
|
+
export { type ContentEntryData as C, type EntryContentResult as E, type LoadContentParams as L, type PageContentResult as P, type SiteData as S, isEntryContent as a, type LoadContentResult as b, isPageContent as i, loadContent as l };
|