@bagelink/blox 1.13.5 → 1.14.7
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/LICENSE +21 -0
- package/dist/CmsPageView.vue.d.ts.map +1 -1
- package/dist/PreviewApp-BDMfuAiu.cjs +4 -0
- package/dist/PreviewApp-MdZQEVkN.js +4 -0
- package/dist/PreviewApp.vue.d.ts.map +1 -1
- package/dist/PreviewApp.vue_vue_type_style_index_0_lang-BG9Fvfdw.cjs +187 -0
- package/dist/PreviewApp.vue_vue_type_style_index_0_lang-Bc4Ac4WN.js +188 -0
- package/dist/PreviewRenderer.d.ts.map +1 -1
- package/dist/bridge.d.ts +5 -0
- package/dist/bridge.d.ts.map +1 -1
- package/dist/core-CgtYpQbn.js +466 -0
- package/dist/core-DhrL5TMI.cjs +465 -0
- package/dist/core.d.ts.map +1 -1
- package/dist/createBloxApp.d.ts +107 -0
- package/dist/createBloxApp.d.ts.map +1 -0
- package/dist/defineBlock.d.ts +23 -4
- package/dist/defineBlock.d.ts.map +1 -1
- package/dist/index.cjs +87 -604
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +86 -602
- package/dist/{prerender-oMLxrKGs.js → prerender-CJ22vZ1T.js} +12 -10
- package/dist/{prerender-CjJwDXkC.cjs → prerender-LqPEzho3.cjs} +8 -6
- package/dist/schema.d.ts +6 -0
- package/dist/schema.d.ts.map +1 -1
- package/dist/ssg/cli.cjs +2 -2
- package/dist/ssg/cli.mjs +2 -2
- package/dist/ssg/client.cjs +9 -7
- package/dist/ssg/client.d.ts +1 -1
- package/dist/ssg/client.d.ts.map +1 -1
- package/dist/ssg/client.mjs +3 -1
- package/dist/ssg/collection-cache.d.ts +1 -1
- package/dist/ssg/constants.d.ts +1 -1
- package/dist/ssg/constants.d.ts.map +1 -1
- package/dist/ssg/createSSREntry.d.ts +73 -0
- package/dist/ssg/createSSREntry.d.ts.map +1 -0
- package/dist/ssg/index.cjs +116 -8
- package/dist/ssg/index.d.ts +2 -0
- package/dist/ssg/index.d.ts.map +1 -1
- package/dist/ssg/index.mjs +94 -7
- package/dist/ssg/prerender.d.ts.map +1 -1
- package/dist/ssg/render-resolved-page.d.ts +1 -1
- package/dist/ssg/render-resolved-page.d.ts.map +1 -1
- package/dist/style.css +5 -46
- package/dist/vite-plugin.cjs +143 -3
- package/dist/vite-plugin.d.ts +22 -21
- package/dist/vite-plugin.d.ts.map +1 -1
- package/dist/vite-plugin.mjs +143 -3
- package/package.json +128 -126
- package/dist/PreviewApp-BZNzZkit.js +0 -4
- package/dist/PreviewApp-C1WvJWI4.cjs +0 -4
- package/dist/constants-BjitNk-W.js +0 -8
- package/dist/constants-CFB_pMvT.cjs +0 -7
|
@@ -3,24 +3,24 @@ import path from "node:path";
|
|
|
3
3
|
import process from "node:process";
|
|
4
4
|
import { pathToFileURL } from "node:url";
|
|
5
5
|
async function fetchCmsSiteData(apiBase, websiteName) {
|
|
6
|
-
const sitesRes = await fetch(`${apiBase}/
|
|
6
|
+
const sitesRes = await fetch(`${apiBase}/blox/websites`);
|
|
7
7
|
const sitesData = await sitesRes.json();
|
|
8
8
|
const sites = Array.isArray(sitesData) ? sitesData : sitesData.data ?? [];
|
|
9
9
|
const site = sites.find((s) => s.name === websiteName);
|
|
10
10
|
if ((site == null ? void 0 : site.id) == null || site.id === "") throw new Error(`Website "${websiteName}" not found at ${apiBase}`);
|
|
11
11
|
let website = site;
|
|
12
12
|
try {
|
|
13
|
-
const wRes = await fetch(`${apiBase}/
|
|
13
|
+
const wRes = await fetch(`${apiBase}/blox/websites/${site.id}`);
|
|
14
14
|
if (wRes.ok) website = await wRes.json();
|
|
15
15
|
} catch {
|
|
16
16
|
}
|
|
17
|
-
const pagesRes = await fetch(`${apiBase}/
|
|
17
|
+
const pagesRes = await fetch(`${apiBase}/blox/websites/${site.id}/pages?locale=${website.default_locale || "en"}`);
|
|
18
18
|
const pagesData = await pagesRes.json();
|
|
19
19
|
const pages = Array.isArray(pagesData) ? pagesData : pagesData.data ?? [];
|
|
20
20
|
const paths = await expandRoutes(apiBase, pages);
|
|
21
21
|
let redirects = [];
|
|
22
22
|
try {
|
|
23
|
-
const rRes = await fetch(`${apiBase}/
|
|
23
|
+
const rRes = await fetch(`${apiBase}/blox/websites/${site.id}/redirects`);
|
|
24
24
|
if (rRes.ok) {
|
|
25
25
|
const rData = await rRes.json();
|
|
26
26
|
const items = Array.isArray(rData) ? rData : rData.data ?? [];
|
|
@@ -244,7 +244,8 @@ Sitemap: ${base}/sitemap.xml
|
|
|
244
244
|
` : "";
|
|
245
245
|
if (robotsTxt) {
|
|
246
246
|
if (sitemapLine && !robotsTxt.toLowerCase().includes("sitemap:")) {
|
|
247
|
-
return robotsTxt.trimEnd()
|
|
247
|
+
return `${robotsTxt.trimEnd()}
|
|
248
|
+
${sitemapLine}`;
|
|
248
249
|
}
|
|
249
250
|
return robotsTxt;
|
|
250
251
|
}
|
|
@@ -254,7 +255,8 @@ ${sitemapLine}`;
|
|
|
254
255
|
}
|
|
255
256
|
function generateNetlifyRedirects(redirects) {
|
|
256
257
|
if (redirects.length === 0) return "";
|
|
257
|
-
return redirects.map((r) => `${r.from_path} ${r.to_path} ${r.status_code}`).join("\n")
|
|
258
|
+
return `${redirects.map((r) => `${r.from_path} ${r.to_path} ${r.status_code}`).join("\n")}
|
|
259
|
+
`;
|
|
258
260
|
}
|
|
259
261
|
function stripTemplateSeoTags(template) {
|
|
260
262
|
return template.replace(/<title>[^<]*<\/title>/gi, "<!--ssg:title-->").replace(/<meta\s[^>]*name\s*=\s*["']description["'][^>]*>/gi, "").replace(/<meta\s[^>]*property\s*=\s*["']og:[^"']*["'][^>]*>/gi, "").replace(/<meta\s[^>]*(?:property|name)\s*=\s*["']twitter:[^"']*["'][^>]*>/gi, "").replace(/<link\s[^>]*rel\s*=\s*["']apple-touch-icon["'][^>]*>/gi, "").replace(/<link\s[^>]*rel\s*=\s*["']icon["'][^>]*>/gi, "").replace(/\n\s*\n\s*\n/g, "\n\n");
|
|
@@ -508,12 +510,12 @@ function discoverInternalLinks(html) {
|
|
|
508
510
|
return [...out];
|
|
509
511
|
}
|
|
510
512
|
export {
|
|
511
|
-
|
|
513
|
+
prerender as a,
|
|
512
514
|
buildPageHead as b,
|
|
513
|
-
|
|
514
|
-
|
|
515
|
+
buildSiteHead as c,
|
|
516
|
+
fetchCmsPrerenderPaths as d,
|
|
515
517
|
generateRobotsTxt as e,
|
|
516
|
-
|
|
518
|
+
fetchCmsSiteData as f,
|
|
517
519
|
generateNetlifyRedirects as g,
|
|
518
520
|
generateSitemapXml as h,
|
|
519
521
|
polyfillBloxSsgGlobals as p
|
|
@@ -26,24 +26,24 @@ const path = require("node:path");
|
|
|
26
26
|
const process = require("node:process");
|
|
27
27
|
const node_url = require("node:url");
|
|
28
28
|
async function fetchCmsSiteData(apiBase, websiteName) {
|
|
29
|
-
const sitesRes = await fetch(`${apiBase}/
|
|
29
|
+
const sitesRes = await fetch(`${apiBase}/blox/websites`);
|
|
30
30
|
const sitesData = await sitesRes.json();
|
|
31
31
|
const sites = Array.isArray(sitesData) ? sitesData : sitesData.data ?? [];
|
|
32
32
|
const site = sites.find((s) => s.name === websiteName);
|
|
33
33
|
if ((site == null ? void 0 : site.id) == null || site.id === "") throw new Error(`Website "${websiteName}" not found at ${apiBase}`);
|
|
34
34
|
let website = site;
|
|
35
35
|
try {
|
|
36
|
-
const wRes = await fetch(`${apiBase}/
|
|
36
|
+
const wRes = await fetch(`${apiBase}/blox/websites/${site.id}`);
|
|
37
37
|
if (wRes.ok) website = await wRes.json();
|
|
38
38
|
} catch {
|
|
39
39
|
}
|
|
40
|
-
const pagesRes = await fetch(`${apiBase}/
|
|
40
|
+
const pagesRes = await fetch(`${apiBase}/blox/websites/${site.id}/pages?locale=${website.default_locale || "en"}`);
|
|
41
41
|
const pagesData = await pagesRes.json();
|
|
42
42
|
const pages = Array.isArray(pagesData) ? pagesData : pagesData.data ?? [];
|
|
43
43
|
const paths = await expandRoutes(apiBase, pages);
|
|
44
44
|
let redirects = [];
|
|
45
45
|
try {
|
|
46
|
-
const rRes = await fetch(`${apiBase}/
|
|
46
|
+
const rRes = await fetch(`${apiBase}/blox/websites/${site.id}/redirects`);
|
|
47
47
|
if (rRes.ok) {
|
|
48
48
|
const rData = await rRes.json();
|
|
49
49
|
const items = Array.isArray(rData) ? rData : rData.data ?? [];
|
|
@@ -267,7 +267,8 @@ Sitemap: ${base}/sitemap.xml
|
|
|
267
267
|
` : "";
|
|
268
268
|
if (robotsTxt) {
|
|
269
269
|
if (sitemapLine && !robotsTxt.toLowerCase().includes("sitemap:")) {
|
|
270
|
-
return robotsTxt.trimEnd()
|
|
270
|
+
return `${robotsTxt.trimEnd()}
|
|
271
|
+
${sitemapLine}`;
|
|
271
272
|
}
|
|
272
273
|
return robotsTxt;
|
|
273
274
|
}
|
|
@@ -277,7 +278,8 @@ ${sitemapLine}`;
|
|
|
277
278
|
}
|
|
278
279
|
function generateNetlifyRedirects(redirects) {
|
|
279
280
|
if (redirects.length === 0) return "";
|
|
280
|
-
return redirects.map((r) => `${r.from_path} ${r.to_path} ${r.status_code}`).join("\n")
|
|
281
|
+
return `${redirects.map((r) => `${r.from_path} ${r.to_path} ${r.status_code}`).join("\n")}
|
|
282
|
+
`;
|
|
281
283
|
}
|
|
282
284
|
function stripTemplateSeoTags(template) {
|
|
283
285
|
return template.replace(/<title>[^<]*<\/title>/gi, "<!--ssg:title-->").replace(/<meta\s[^>]*name\s*=\s*["']description["'][^>]*>/gi, "").replace(/<meta\s[^>]*property\s*=\s*["']og:[^"']*["'][^>]*>/gi, "").replace(/<meta\s[^>]*(?:property|name)\s*=\s*["']twitter:[^"']*["'][^>]*>/gi, "").replace(/<link\s[^>]*rel\s*=\s*["']apple-touch-icon["'][^>]*>/gi, "").replace(/<link\s[^>]*rel\s*=\s*["']icon["'][^>]*>/gi, "").replace(/\n\s*\n\s*\n/g, "\n\n");
|
package/dist/schema.d.ts
CHANGED
|
@@ -14,6 +14,12 @@ export interface BlockSchema {
|
|
|
14
14
|
fields?: SchemaDefinition;
|
|
15
15
|
/** Default prop values. Merged with block props at render time. */
|
|
16
16
|
defaults?: Record<string, unknown>;
|
|
17
|
+
/** True when this block fetches its own data from a datastore collection. */
|
|
18
|
+
dataSource?: boolean;
|
|
19
|
+
/** Static thumbnail image URL for the editor block picker. Overrides the default icon. */
|
|
20
|
+
thumbnail?: string;
|
|
21
|
+
/** Sort order in the editor block picker. Lower values appear first. Defaults to 100. */
|
|
22
|
+
order?: number;
|
|
17
23
|
}
|
|
18
24
|
export interface BlockDefinition {
|
|
19
25
|
component: Component;
|
package/dist/schema.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AACrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,KAAK,CAAA;AACpC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAE9C,MAAM,WAAW,WAAW;IAC3B,+CAA+C;IAC/C,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,sDAAsD;IACtD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb;;;OAGG;IACH,MAAM,CAAC,EAAE,gBAAgB,CAAA;IACzB,mEAAmE;IACnE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AACrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,KAAK,CAAA;AACpC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAE9C,MAAM,WAAW,WAAW;IAC3B,+CAA+C;IAC/C,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,sDAAsD;IACtD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb;;;OAGG;IACH,MAAM,CAAC,EAAE,gBAAgB,CAAA;IACzB,mEAAmE;IACnE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAClC,6EAA6E;IAC7E,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,0FAA0F;IAC1F,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,yFAAyF;IACzF,KAAK,CAAC,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,eAAe;IAC/B,SAAS,EAAE,SAAS,CAAA;IACpB,MAAM,EAAE,WAAW,CAAA;CACnB;AAED,+EAA+E;AAC/E,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,CAAA"}
|
package/dist/ssg/cli.cjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
2
2
|
"use strict";
|
|
3
3
|
const process = require("node:process");
|
|
4
|
-
const prerender = require("../prerender-
|
|
4
|
+
const prerender = require("../prerender-LqPEzho3.cjs");
|
|
5
5
|
async function resolveApiBase(mode) {
|
|
6
6
|
if (process.env.BAGELINK_API_URL != null && process.env.BAGELINK_API_URL !== "") {
|
|
7
7
|
return { apiBase: process.env.BAGELINK_API_URL };
|
|
@@ -76,7 +76,7 @@ Environment:
|
|
|
76
76
|
let website = null;
|
|
77
77
|
let websiteId = "";
|
|
78
78
|
let redirects = [];
|
|
79
|
-
|
|
79
|
+
const collections = {};
|
|
80
80
|
try {
|
|
81
81
|
const siteData = await prerender.fetchCmsSiteData(apiBase, websiteName);
|
|
82
82
|
paths = siteData.paths;
|
package/dist/ssg/cli.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
2
2
|
import process from "node:process";
|
|
3
|
-
import { p as polyfillBloxSsgGlobals,
|
|
3
|
+
import { p as polyfillBloxSsgGlobals, f as fetchCmsSiteData, a as prerender } from "../prerender-CJ22vZ1T.js";
|
|
4
4
|
async function resolveApiBase(mode) {
|
|
5
5
|
if (process.env.BAGELINK_API_URL != null && process.env.BAGELINK_API_URL !== "") {
|
|
6
6
|
return { apiBase: process.env.BAGELINK_API_URL };
|
|
@@ -75,7 +75,7 @@ Environment:
|
|
|
75
75
|
let website = null;
|
|
76
76
|
let websiteId = "";
|
|
77
77
|
let redirects = [];
|
|
78
|
-
|
|
78
|
+
const collections = {};
|
|
79
79
|
try {
|
|
80
80
|
const siteData = await fetchCmsSiteData(apiBase, websiteName);
|
|
81
81
|
paths = siteData.paths;
|
package/dist/ssg/client.cjs
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
-
const
|
|
3
|
+
const BLOX_STATE_WINDOW_KEY = "__BLOX_STATE__";
|
|
4
|
+
const BLOX_COLLECTIONS_WINDOW_KEY = "__BLOX_COLLECTIONS__";
|
|
5
|
+
const BLOX_WEBSITE_ID_WINDOW_KEY = "__BLOX_WEBSITE_ID__";
|
|
4
6
|
let _cache = null;
|
|
5
7
|
function readCache() {
|
|
6
8
|
if (_cache != null) return _cache;
|
|
7
9
|
if (typeof window === "undefined") return null;
|
|
8
|
-
const raw = window[
|
|
10
|
+
const raw = window[BLOX_COLLECTIONS_WINDOW_KEY];
|
|
9
11
|
if (raw && typeof raw === "object" && !Array.isArray(raw)) {
|
|
10
12
|
_cache = raw;
|
|
11
13
|
return _cache;
|
|
@@ -17,7 +19,7 @@ function getCollectionCache() {
|
|
|
17
19
|
}
|
|
18
20
|
function getEmbeddedWebsiteId() {
|
|
19
21
|
if (typeof window === "undefined") return "";
|
|
20
|
-
const id = window[
|
|
22
|
+
const id = window[BLOX_WEBSITE_ID_WINDOW_KEY];
|
|
21
23
|
return typeof id === "string" ? id : "";
|
|
22
24
|
}
|
|
23
25
|
function installCollectionCache() {
|
|
@@ -41,7 +43,7 @@ function installCollectionCache() {
|
|
|
41
43
|
return config;
|
|
42
44
|
};
|
|
43
45
|
}
|
|
44
|
-
function installBloxStateCache(globalKey =
|
|
46
|
+
function installBloxStateCache(globalKey = BLOX_STATE_WINDOW_KEY) {
|
|
45
47
|
if (typeof window === "undefined") return;
|
|
46
48
|
const state = window[globalKey];
|
|
47
49
|
if (!state || typeof state !== "object" || Object.keys(state).length === 0) return;
|
|
@@ -66,9 +68,9 @@ function installBloxStateCache(globalKey = constants.BLOX_STATE_WINDOW_KEY) {
|
|
|
66
68
|
return originalFetch(input, init);
|
|
67
69
|
};
|
|
68
70
|
}
|
|
69
|
-
exports.BLOX_COLLECTIONS_WINDOW_KEY =
|
|
70
|
-
exports.BLOX_STATE_WINDOW_KEY =
|
|
71
|
-
exports.BLOX_WEBSITE_ID_WINDOW_KEY =
|
|
71
|
+
exports.BLOX_COLLECTIONS_WINDOW_KEY = BLOX_COLLECTIONS_WINDOW_KEY;
|
|
72
|
+
exports.BLOX_STATE_WINDOW_KEY = BLOX_STATE_WINDOW_KEY;
|
|
73
|
+
exports.BLOX_WEBSITE_ID_WINDOW_KEY = BLOX_WEBSITE_ID_WINDOW_KEY;
|
|
72
74
|
exports.getCollectionCache = getCollectionCache;
|
|
73
75
|
exports.getEmbeddedWebsiteId = getEmbeddedWebsiteId;
|
|
74
76
|
exports.installBloxStateCache = installBloxStateCache;
|
package/dist/ssg/client.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
export { getCollectionCache, getEmbeddedWebsiteId, installCollectionCache } from './collection-cache';
|
|
1
2
|
/**
|
|
2
3
|
* @bagelink/blox/ssg/client — browser-safe SSG utilities.
|
|
3
4
|
*
|
|
@@ -5,6 +6,5 @@
|
|
|
5
6
|
* It does NOT pull in Node.js modules (fs, path, url, happy-dom).
|
|
6
7
|
*/
|
|
7
8
|
export { BLOX_COLLECTIONS_WINDOW_KEY, BLOX_STATE_WINDOW_KEY, BLOX_WEBSITE_ID_WINDOW_KEY } from './constants';
|
|
8
|
-
export { getCollectionCache, getEmbeddedWebsiteId, installCollectionCache } from './collection-cache';
|
|
9
9
|
export { installBloxStateCache } from './state-cache';
|
|
10
10
|
//# sourceMappingURL=client.d.ts.map
|
package/dist/ssg/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/ssg/client.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/ssg/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAA;AACrG;;;;;GAKG;AACH,OAAO,EAAE,2BAA2B,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAA;AAC5G,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA"}
|
package/dist/ssg/client.mjs
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
const BLOX_STATE_WINDOW_KEY = "__BLOX_STATE__";
|
|
2
|
+
const BLOX_COLLECTIONS_WINDOW_KEY = "__BLOX_COLLECTIONS__";
|
|
3
|
+
const BLOX_WEBSITE_ID_WINDOW_KEY = "__BLOX_WEBSITE_ID__";
|
|
2
4
|
let _cache = null;
|
|
3
5
|
function readCache() {
|
|
4
6
|
if (_cache != null) return _cache;
|
|
@@ -26,7 +26,7 @@ type CollectionCacheMap = Record<string, unknown[]>;
|
|
|
26
26
|
*/
|
|
27
27
|
export declare function getCollectionCache(): CollectionCacheMap | null;
|
|
28
28
|
/**
|
|
29
|
-
* Get the pre-embedded website ID (avoids GET /
|
|
29
|
+
* Get the pre-embedded website ID (avoids GET /blox/websites on client).
|
|
30
30
|
* Returns empty string if not available.
|
|
31
31
|
*/
|
|
32
32
|
export declare function getEmbeddedWebsiteId(): string;
|
package/dist/ssg/constants.d.ts
CHANGED
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
export declare const BLOX_STATE_WINDOW_KEY: "__BLOX_STATE__";
|
|
3
3
|
/** Global key for pre-fetched datastore collections (keyed by "store/collection"). */
|
|
4
4
|
export declare const BLOX_COLLECTIONS_WINDOW_KEY: "__BLOX_COLLECTIONS__";
|
|
5
|
-
/** Global key for the pre-resolved website ID (avoids GET /
|
|
5
|
+
/** Global key for the pre-resolved website ID (avoids GET /blox/websites on client). */
|
|
6
6
|
export declare const BLOX_WEBSITE_ID_WINDOW_KEY: "__BLOX_WEBSITE_ID__";
|
|
7
7
|
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/ssg/constants.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,eAAO,MAAM,qBAAqB,EAAG,gBAAyB,CAAA;AAE9D,sFAAsF;AACtF,eAAO,MAAM,2BAA2B,EAAG,sBAA+B,CAAA;AAE1E,
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/ssg/constants.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,eAAO,MAAM,qBAAqB,EAAG,gBAAyB,CAAA;AAE9D,sFAAsF;AACtF,eAAO,MAAM,2BAA2B,EAAG,sBAA+B,CAAA;AAE1E,wFAAwF;AACxF,eAAO,MAAM,0BAA0B,EAAG,qBAA8B,CAAA"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { Component } from 'vue';
|
|
2
|
+
import { Router } from 'vue-router';
|
|
3
|
+
import { BlockModule } from '../defineBlock';
|
|
4
|
+
import { RenderContext, RenderResult } from './prerender';
|
|
5
|
+
export interface CreateBloxSSREntryOptions {
|
|
6
|
+
/** Root Vue component (App.vue). */
|
|
7
|
+
rootComponent: Component;
|
|
8
|
+
/**
|
|
9
|
+
* Router factory. Must return a fresh router for each render call.
|
|
10
|
+
* @param mode - 'web' for client, 'memory' for SSR
|
|
11
|
+
* @param url - initial URL (only for 'memory' mode)
|
|
12
|
+
*/
|
|
13
|
+
createRouter: (mode: 'web' | 'memory', url?: string) => Router;
|
|
14
|
+
/**
|
|
15
|
+
* Block SFC modules — same format as `createBloxApp`.
|
|
16
|
+
* Use `import.meta.glob('./components/blocks/*.vue', { eager: true })`.
|
|
17
|
+
*/
|
|
18
|
+
modules: BlockModule[] | Record<string, BlockModule>;
|
|
19
|
+
/** CMS website name. */
|
|
20
|
+
websiteName: string;
|
|
21
|
+
/** Datastore store identifier. */
|
|
22
|
+
store: string;
|
|
23
|
+
/** API base URL for SSR fetches. @default process.env.BAGELINK_API_URL ?? 'https://api.bagel.to' */
|
|
24
|
+
apiBase?: string;
|
|
25
|
+
/** Default locale. @default 'en' */
|
|
26
|
+
locale?: string;
|
|
27
|
+
/** Supported locales. @default [locale] */
|
|
28
|
+
supportedLocales?: string[];
|
|
29
|
+
/**
|
|
30
|
+
* Extra Vue plugins to install on the SSR app.
|
|
31
|
+
* Typically `[BagelVue]` from `@bagelink/vue`.
|
|
32
|
+
*/
|
|
33
|
+
plugins?: Array<import('vue').Plugin | [import('vue').Plugin, ...unknown[]]>;
|
|
34
|
+
/**
|
|
35
|
+
* Global components to register.
|
|
36
|
+
* Typically `{ RouterWrapper }` from `@bagelink/vue`.
|
|
37
|
+
*/
|
|
38
|
+
globalComponents?: Record<string, Component>;
|
|
39
|
+
}
|
|
40
|
+
export interface BloxSSREntry {
|
|
41
|
+
render: (url: string, ctx: RenderContext) => Promise<RenderResult>;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Factory that produces the `{ render }` export for `main.server.ts`.
|
|
45
|
+
*
|
|
46
|
+
* Encapsulates all SSR boilerplate:
|
|
47
|
+
* - Website ID resolution
|
|
48
|
+
* - CMS page data fetching
|
|
49
|
+
* - Vue SSR app creation with Blox + Pinia
|
|
50
|
+
* - `renderBloxSsgPage()` call with full context passthrough
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* ```ts
|
|
54
|
+
* import { createBloxSSREntry } from '@bagelink/blox/ssg'
|
|
55
|
+
* import { BagelVue, RouterWrapper } from '@bagelink/vue'
|
|
56
|
+
* import App from './App.vue'
|
|
57
|
+
* import { createRouter } from './router'
|
|
58
|
+
*
|
|
59
|
+
* const blocks = import.meta.glob('./components/blocks/*.vue', { eager: true })
|
|
60
|
+
*
|
|
61
|
+
* export const { render } = createBloxSSREntry({
|
|
62
|
+
* rootComponent: App,
|
|
63
|
+
* createRouter,
|
|
64
|
+
* modules: Object.values(blocks),
|
|
65
|
+
* websiteName: 'cylogic',
|
|
66
|
+
* store: 'cylogic',
|
|
67
|
+
* plugins: [BagelVue],
|
|
68
|
+
* globalComponents: { RouterWrapper },
|
|
69
|
+
* })
|
|
70
|
+
* ```
|
|
71
|
+
*/
|
|
72
|
+
export declare function createBloxSSREntry(options: CreateBloxSSREntryOptions): BloxSSREntry;
|
|
73
|
+
//# sourceMappingURL=createSSREntry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createSSREntry.d.ts","sourceRoot":"","sources":["../../src/ssg/createSSREntry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAO,SAAS,EAAE,MAAM,KAAK,CAAA;AACzC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AACxC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAO9D,MAAM,WAAW,yBAAyB;IACzC,oCAAoC;IACpC,aAAa,EAAE,SAAS,CAAA;IACxB;;;;OAIG;IACH,YAAY,EAAE,CAAC,IAAI,EAAE,KAAK,GAAG,QAAQ,EAAE,GAAG,CAAC,EAAE,MAAM,KAAK,MAAM,CAAA;IAC9D;;;OAGG;IACH,OAAO,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;IACpD,wBAAwB;IACxB,WAAW,EAAE,MAAM,CAAA;IACnB,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAA;IACb,oGAAoG;IACpG,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,oCAAoC;IACpC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,2CAA2C;IAC3C,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC3B;;;OAGG;IACH,OAAO,CAAC,EAAE,KAAK,CAAC,OAAO,KAAK,EAAE,MAAM,GAAG,CAAC,OAAO,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,CAAA;IAC5E;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;CAC5C;AAED,MAAM,WAAW,YAAY;IAC5B,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,YAAY,CAAC,CAAA;CAClE;AAKD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,yBAAyB,GAAG,YAAY,CAoGnF"}
|
package/dist/ssg/index.cjs
CHANGED
|
@@ -1,15 +1,39 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __copyProps = (to, from, except, desc) => {
|
|
9
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
10
|
+
for (let key of __getOwnPropNames(from))
|
|
11
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
12
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
13
|
+
}
|
|
14
|
+
return to;
|
|
15
|
+
};
|
|
16
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
17
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
18
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
19
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
20
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
21
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
22
|
+
mod
|
|
23
|
+
));
|
|
2
24
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
-
const prerender = require("../prerender-
|
|
25
|
+
const prerender = require("../prerender-LqPEzho3.cjs");
|
|
4
26
|
const ssg_client = require("./client.cjs");
|
|
5
|
-
const
|
|
27
|
+
const pinia = require("pinia");
|
|
28
|
+
const vue = require("vue");
|
|
29
|
+
const core = require("../core-DhrL5TMI.cjs");
|
|
6
30
|
async function renderBloxSsgPage(options) {
|
|
7
31
|
const {
|
|
8
32
|
url,
|
|
9
33
|
resolvedData,
|
|
10
34
|
renderToString,
|
|
11
35
|
createAppForUrl,
|
|
12
|
-
stateWindowKey =
|
|
36
|
+
stateWindowKey = ssg_client.BLOX_STATE_WINDOW_KEY,
|
|
13
37
|
website = null,
|
|
14
38
|
websiteId = "",
|
|
15
39
|
collections
|
|
@@ -25,8 +49,8 @@ async function renderBloxSsgPage(options) {
|
|
|
25
49
|
await router.isReady();
|
|
26
50
|
const html = await renderToString(app);
|
|
27
51
|
const stateScript = resolvedData != null ? `<script>window[${JSON.stringify(stateWindowKey)}]=${JSON.stringify({ [url]: resolvedData })};${"<"}/script>` : "";
|
|
28
|
-
const collectionsScript = collections && Object.keys(collections).length > 0 ? `<script>window[${JSON.stringify(
|
|
29
|
-
const websiteIdScript = websiteId ? `<script>window[${JSON.stringify(
|
|
52
|
+
const collectionsScript = collections && Object.keys(collections).length > 0 ? `<script>window[${JSON.stringify(ssg_client.BLOX_COLLECTIONS_WINDOW_KEY)}]=${JSON.stringify(collections)};${"<"}/script>` : "";
|
|
53
|
+
const websiteIdScript = websiteId ? `<script>window[${JSON.stringify(ssg_client.BLOX_WEBSITE_ID_WINDOW_KEY)}]=${JSON.stringify(websiteId)};${"<"}/script>` : "";
|
|
30
54
|
const head = prerender.buildPageHead({
|
|
31
55
|
url,
|
|
32
56
|
resolvedData,
|
|
@@ -44,6 +68,89 @@ async function renderBloxSsgPage(options) {
|
|
|
44
68
|
}
|
|
45
69
|
}
|
|
46
70
|
}
|
|
71
|
+
let _websiteId = null;
|
|
72
|
+
function createBloxSSREntry(options) {
|
|
73
|
+
var _a;
|
|
74
|
+
const {
|
|
75
|
+
rootComponent,
|
|
76
|
+
createRouter,
|
|
77
|
+
modules,
|
|
78
|
+
websiteName,
|
|
79
|
+
store,
|
|
80
|
+
locale = "en",
|
|
81
|
+
supportedLocales = [locale],
|
|
82
|
+
plugins = [],
|
|
83
|
+
globalComponents = {}
|
|
84
|
+
} = options;
|
|
85
|
+
const apiBase = options.apiBase ?? (typeof process !== "undefined" ? (_a = process.env) == null ? void 0 : _a.BAGELINK_API_URL : void 0) ?? "https://api.bagel.to";
|
|
86
|
+
async function getWebsiteId() {
|
|
87
|
+
if (_websiteId) return _websiteId;
|
|
88
|
+
const res = await fetch(`${apiBase}/blox/websites`);
|
|
89
|
+
const data = await res.json();
|
|
90
|
+
const sites = Array.isArray(data) ? data : (data == null ? void 0 : data.data) ?? [];
|
|
91
|
+
const site = sites.find((s) => s.name === websiteName);
|
|
92
|
+
if (!(site == null ? void 0 : site.id)) throw new Error(`Website "${websiteName}" not found`);
|
|
93
|
+
_websiteId = site.id;
|
|
94
|
+
return _websiteId;
|
|
95
|
+
}
|
|
96
|
+
async function fetchResolvedPage(urlPath) {
|
|
97
|
+
const websiteId = await getWebsiteId();
|
|
98
|
+
const url = `${apiBase}/blox/websites/${websiteId}/resolve-path?path=${encodeURIComponent(urlPath)}&locale=${locale}`;
|
|
99
|
+
const res = await fetch(url);
|
|
100
|
+
if (!res.ok) throw new Error(`resolve-path ${res.status}: ${urlPath}`);
|
|
101
|
+
return res.json();
|
|
102
|
+
}
|
|
103
|
+
function buildApp(url) {
|
|
104
|
+
const router = createRouter("memory", url);
|
|
105
|
+
const app = vue.createSSRApp(rootComponent);
|
|
106
|
+
const pinia$1 = pinia.createPinia();
|
|
107
|
+
pinia$1.use(({ store: s }) => {
|
|
108
|
+
s.router = vue.markRaw(router);
|
|
109
|
+
});
|
|
110
|
+
const blox = core.createBlox({
|
|
111
|
+
modules,
|
|
112
|
+
websiteName,
|
|
113
|
+
store,
|
|
114
|
+
defaultLocale: locale,
|
|
115
|
+
supportedLocales,
|
|
116
|
+
router
|
|
117
|
+
});
|
|
118
|
+
for (const plugin of plugins) {
|
|
119
|
+
if (Array.isArray(plugin)) {
|
|
120
|
+
const [p, ...args] = plugin;
|
|
121
|
+
app.use(p, ...args);
|
|
122
|
+
} else {
|
|
123
|
+
app.use(plugin);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
blox.install(app, {});
|
|
127
|
+
app.use(pinia$1);
|
|
128
|
+
app.use(router);
|
|
129
|
+
for (const [name, comp] of Object.entries(globalComponents)) {
|
|
130
|
+
app.component(name, comp);
|
|
131
|
+
}
|
|
132
|
+
return { app, router };
|
|
133
|
+
}
|
|
134
|
+
async function render(url, ctx) {
|
|
135
|
+
let resolvedData = null;
|
|
136
|
+
try {
|
|
137
|
+
resolvedData = await fetchResolvedPage(url);
|
|
138
|
+
} catch (e) {
|
|
139
|
+
console.warn(`[prerender] Could not resolve: ${url} — ${e.message}`);
|
|
140
|
+
}
|
|
141
|
+
const { renderToString } = await import("vue/server-renderer");
|
|
142
|
+
return renderBloxSsgPage({
|
|
143
|
+
url,
|
|
144
|
+
resolvedData,
|
|
145
|
+
renderToString,
|
|
146
|
+
createAppForUrl: buildApp,
|
|
147
|
+
website: ctx.website,
|
|
148
|
+
websiteId: ctx.websiteId,
|
|
149
|
+
collections: ctx.collections
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
return { render };
|
|
153
|
+
}
|
|
47
154
|
exports.buildPageHead = prerender.buildPageHead;
|
|
48
155
|
exports.buildSiteHead = prerender.buildSiteHead;
|
|
49
156
|
exports.fetchCmsPrerenderPaths = prerender.fetchCmsPrerenderPaths;
|
|
@@ -53,11 +160,12 @@ exports.generateRobotsTxt = prerender.generateRobotsTxt;
|
|
|
53
160
|
exports.generateSitemapXml = prerender.generateSitemapXml;
|
|
54
161
|
exports.polyfillBloxSsgGlobals = prerender.polyfillBloxSsgGlobals;
|
|
55
162
|
exports.prerender = prerender.prerender;
|
|
163
|
+
exports.BLOX_COLLECTIONS_WINDOW_KEY = ssg_client.BLOX_COLLECTIONS_WINDOW_KEY;
|
|
164
|
+
exports.BLOX_STATE_WINDOW_KEY = ssg_client.BLOX_STATE_WINDOW_KEY;
|
|
165
|
+
exports.BLOX_WEBSITE_ID_WINDOW_KEY = ssg_client.BLOX_WEBSITE_ID_WINDOW_KEY;
|
|
56
166
|
exports.getCollectionCache = ssg_client.getCollectionCache;
|
|
57
167
|
exports.getEmbeddedWebsiteId = ssg_client.getEmbeddedWebsiteId;
|
|
58
168
|
exports.installBloxStateCache = ssg_client.installBloxStateCache;
|
|
59
169
|
exports.installCollectionCache = ssg_client.installCollectionCache;
|
|
60
|
-
exports.
|
|
61
|
-
exports.BLOX_STATE_WINDOW_KEY = constants.BLOX_STATE_WINDOW_KEY;
|
|
62
|
-
exports.BLOX_WEBSITE_ID_WINDOW_KEY = constants.BLOX_WEBSITE_ID_WINDOW_KEY;
|
|
170
|
+
exports.createBloxSSREntry = createBloxSSREntry;
|
|
63
171
|
exports.renderBloxSsgPage = renderBloxSsgPage;
|
package/dist/ssg/index.d.ts
CHANGED
|
@@ -13,6 +13,8 @@ export { getCollectionCache, getEmbeddedWebsiteId, installCollectionCache } from
|
|
|
13
13
|
* - SEO asset generation (sitemap.xml, robots.txt, _redirects)
|
|
14
14
|
*/
|
|
15
15
|
export { BLOX_COLLECTIONS_WINDOW_KEY, BLOX_STATE_WINDOW_KEY, BLOX_WEBSITE_ID_WINDOW_KEY } from './constants';
|
|
16
|
+
export { createBloxSSREntry } from './createSSREntry';
|
|
17
|
+
export type { BloxSSREntry, CreateBloxSSREntryOptions } from './createSSREntry';
|
|
16
18
|
export { polyfillBloxSsgGlobals } from './polyfill-node';
|
|
17
19
|
export { prerender } from './prerender';
|
|
18
20
|
export type { PrerenderOptions, PrerenderResult, RenderContext, RenderResult } from './prerender';
|
package/dist/ssg/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ssg/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AACvE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC9D,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAA;AACrG;;;;;;;;;;GAUG;AACH,OAAO,EAAE,2BAA2B,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAA;AAC5G,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAA;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AACjG,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,YAAY,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC/D,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,OAAO,CAAA;AACrH,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,OAAO,CAAA;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ssg/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AACvE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC9D,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAA;AACrG;;;;;;;;;;GAUG;AACH,OAAO,EAAE,2BAA2B,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAA;AAC5G,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AACrD,YAAY,EAAE,YAAY,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAA;AAC/E,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAA;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AACjG,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,YAAY,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC/D,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,OAAO,CAAA;AACrH,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,OAAO,CAAA;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA"}
|
package/dist/ssg/index.mjs
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
|
-
import { b as buildPageHead } from "../prerender-
|
|
2
|
-
import { d, f,
|
|
1
|
+
import { b as buildPageHead } from "../prerender-CJ22vZ1T.js";
|
|
2
|
+
import { c, d, f, g, e, h, p, a } from "../prerender-CJ22vZ1T.js";
|
|
3
|
+
import { BLOX_STATE_WINDOW_KEY, BLOX_COLLECTIONS_WINDOW_KEY, BLOX_WEBSITE_ID_WINDOW_KEY } from "./client.mjs";
|
|
3
4
|
import { getCollectionCache, getEmbeddedWebsiteId, installBloxStateCache, installCollectionCache } from "./client.mjs";
|
|
4
|
-
import {
|
|
5
|
+
import { createPinia } from "pinia";
|
|
6
|
+
import { createSSRApp, markRaw } from "vue";
|
|
7
|
+
import { c as createBlox } from "../core-CgtYpQbn.js";
|
|
5
8
|
async function renderBloxSsgPage(options) {
|
|
6
9
|
const {
|
|
7
10
|
url,
|
|
@@ -43,14 +46,98 @@ async function renderBloxSsgPage(options) {
|
|
|
43
46
|
}
|
|
44
47
|
}
|
|
45
48
|
}
|
|
49
|
+
let _websiteId = null;
|
|
50
|
+
function createBloxSSREntry(options) {
|
|
51
|
+
var _a;
|
|
52
|
+
const {
|
|
53
|
+
rootComponent,
|
|
54
|
+
createRouter,
|
|
55
|
+
modules,
|
|
56
|
+
websiteName,
|
|
57
|
+
store,
|
|
58
|
+
locale = "en",
|
|
59
|
+
supportedLocales = [locale],
|
|
60
|
+
plugins = [],
|
|
61
|
+
globalComponents = {}
|
|
62
|
+
} = options;
|
|
63
|
+
const apiBase = options.apiBase ?? (typeof process !== "undefined" ? (_a = process.env) == null ? void 0 : _a.BAGELINK_API_URL : void 0) ?? "https://api.bagel.to";
|
|
64
|
+
async function getWebsiteId() {
|
|
65
|
+
if (_websiteId) return _websiteId;
|
|
66
|
+
const res = await fetch(`${apiBase}/blox/websites`);
|
|
67
|
+
const data = await res.json();
|
|
68
|
+
const sites = Array.isArray(data) ? data : (data == null ? void 0 : data.data) ?? [];
|
|
69
|
+
const site = sites.find((s) => s.name === websiteName);
|
|
70
|
+
if (!(site == null ? void 0 : site.id)) throw new Error(`Website "${websiteName}" not found`);
|
|
71
|
+
_websiteId = site.id;
|
|
72
|
+
return _websiteId;
|
|
73
|
+
}
|
|
74
|
+
async function fetchResolvedPage(urlPath) {
|
|
75
|
+
const websiteId = await getWebsiteId();
|
|
76
|
+
const url = `${apiBase}/blox/websites/${websiteId}/resolve-path?path=${encodeURIComponent(urlPath)}&locale=${locale}`;
|
|
77
|
+
const res = await fetch(url);
|
|
78
|
+
if (!res.ok) throw new Error(`resolve-path ${res.status}: ${urlPath}`);
|
|
79
|
+
return res.json();
|
|
80
|
+
}
|
|
81
|
+
function buildApp(url) {
|
|
82
|
+
const router = createRouter("memory", url);
|
|
83
|
+
const app = createSSRApp(rootComponent);
|
|
84
|
+
const pinia = createPinia();
|
|
85
|
+
pinia.use(({ store: s }) => {
|
|
86
|
+
s.router = markRaw(router);
|
|
87
|
+
});
|
|
88
|
+
const blox = createBlox({
|
|
89
|
+
modules,
|
|
90
|
+
websiteName,
|
|
91
|
+
store,
|
|
92
|
+
defaultLocale: locale,
|
|
93
|
+
supportedLocales,
|
|
94
|
+
router
|
|
95
|
+
});
|
|
96
|
+
for (const plugin of plugins) {
|
|
97
|
+
if (Array.isArray(plugin)) {
|
|
98
|
+
const [p2, ...args] = plugin;
|
|
99
|
+
app.use(p2, ...args);
|
|
100
|
+
} else {
|
|
101
|
+
app.use(plugin);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
blox.install(app, {});
|
|
105
|
+
app.use(pinia);
|
|
106
|
+
app.use(router);
|
|
107
|
+
for (const [name, comp] of Object.entries(globalComponents)) {
|
|
108
|
+
app.component(name, comp);
|
|
109
|
+
}
|
|
110
|
+
return { app, router };
|
|
111
|
+
}
|
|
112
|
+
async function render(url, ctx) {
|
|
113
|
+
let resolvedData = null;
|
|
114
|
+
try {
|
|
115
|
+
resolvedData = await fetchResolvedPage(url);
|
|
116
|
+
} catch (e2) {
|
|
117
|
+
console.warn(`[prerender] Could not resolve: ${url} — ${e2.message}`);
|
|
118
|
+
}
|
|
119
|
+
const { renderToString } = await import("vue/server-renderer");
|
|
120
|
+
return renderBloxSsgPage({
|
|
121
|
+
url,
|
|
122
|
+
resolvedData,
|
|
123
|
+
renderToString,
|
|
124
|
+
createAppForUrl: buildApp,
|
|
125
|
+
website: ctx.website,
|
|
126
|
+
websiteId: ctx.websiteId,
|
|
127
|
+
collections: ctx.collections
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
return { render };
|
|
131
|
+
}
|
|
46
132
|
export {
|
|
47
133
|
BLOX_COLLECTIONS_WINDOW_KEY,
|
|
48
134
|
BLOX_STATE_WINDOW_KEY,
|
|
49
135
|
BLOX_WEBSITE_ID_WINDOW_KEY,
|
|
50
136
|
buildPageHead,
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
137
|
+
c as buildSiteHead,
|
|
138
|
+
createBloxSSREntry,
|
|
139
|
+
d as fetchCmsPrerenderPaths,
|
|
140
|
+
f as fetchCmsSiteData,
|
|
54
141
|
g as generateNetlifyRedirects,
|
|
55
142
|
e as generateRobotsTxt,
|
|
56
143
|
h as generateSitemapXml,
|
|
@@ -59,6 +146,6 @@ export {
|
|
|
59
146
|
installBloxStateCache,
|
|
60
147
|
installCollectionCache,
|
|
61
148
|
p as polyfillBloxSsgGlobals,
|
|
62
|
-
|
|
149
|
+
a as prerender,
|
|
63
150
|
renderBloxSsgPage
|
|
64
151
|
};
|