@uniweb/runtime 1.2.2 → 1.2.4
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/ssr.js +32 -4
- package/dist/ssr.js.map +1 -1
- package/package.json +6 -4
- package/src/components/PageRenderer.jsx +2 -1
- package/src/head-meta.js +38 -0
- package/src/hooks/useHeadMeta.js +17 -1
- package/src/load-page-data.js +5 -0
- package/src/page-renderer.js +33 -8
- package/src/ssr-renderer.js +19 -8
package/dist/ssr.js
CHANGED
|
@@ -9,6 +9,7 @@ import { DEFAULT_ICON_BASE, iconUrl } from "@uniweb/core/icon-corpus";
|
|
|
9
9
|
import { buildTheme, FONT_LINKS_MARKER, buildSectionOverrides } from "@uniweb/theming";
|
|
10
10
|
import "@uniweb/core/services";
|
|
11
11
|
import "@uniweb/core/tracker";
|
|
12
|
+
import { pageMarkdownUrls } from "@uniweb/projections/markdown-urls";
|
|
12
13
|
import { escapeHtml } from "@uniweb/core/page-shell";
|
|
13
14
|
import { escapeHtml as escapeHtml2, foundationCssUrl, pageShell } from "@uniweb/core/page-shell";
|
|
14
15
|
import DataStore, { deriveCacheKey as deriveCacheKey$1 } from "@uniweb/core/datastore";
|
|
@@ -495,6 +496,20 @@ function documentTitle(pageTitle, siteName) {
|
|
|
495
496
|
const title = String(pageTitle);
|
|
496
497
|
return siteName ? `${title} | ${siteName}` : title;
|
|
497
498
|
}
|
|
499
|
+
const urlsOfPages = /* @__PURE__ */ new WeakMap();
|
|
500
|
+
function pageHeadMeta(page) {
|
|
501
|
+
return { ...page.getHeadMeta(), markdown: markdownUrlOf(page) };
|
|
502
|
+
}
|
|
503
|
+
function markdownUrlOf(page) {
|
|
504
|
+
const website = page?.website;
|
|
505
|
+
if (!website) return null;
|
|
506
|
+
let urls = urlsOfPages.get(website.pages);
|
|
507
|
+
if (!urls) {
|
|
508
|
+
urls = pageMarkdownUrls({ pages: website.getContentPages(), config: website.config });
|
|
509
|
+
urlsOfPages.set(website.pages, urls);
|
|
510
|
+
}
|
|
511
|
+
return urls.get(page.route) ?? null;
|
|
512
|
+
}
|
|
498
513
|
function resolvePage(website, route) {
|
|
499
514
|
return website.getPage(route);
|
|
500
515
|
}
|
|
@@ -697,10 +712,12 @@ async function prefetchIcons(siteContent, uniweb, onProgress = () => {
|
|
|
697
712
|
const url = iconUrl(family, name, cdnBase);
|
|
698
713
|
const response = await fetch(url);
|
|
699
714
|
if (!response.ok) throw new Error(`HTTP ${response.status}`);
|
|
700
|
-
|
|
701
|
-
uniweb.iconCache.set(`${family}:${name}`, svg);
|
|
715
|
+
return [`${family}:${name}`, await response.text()];
|
|
702
716
|
})
|
|
703
717
|
);
|
|
718
|
+
for (const result of results) {
|
|
719
|
+
if (result.status === "fulfilled") uniweb.iconCache.set(...result.value);
|
|
720
|
+
}
|
|
704
721
|
const succeeded = results.filter((r) => r.status === "fulfilled").length;
|
|
705
722
|
const failedRefs = icons.filter((_, i) => results[i].status === "rejected");
|
|
706
723
|
if (failedRefs.length > 0) {
|
|
@@ -803,7 +820,7 @@ ${options.sectionOverrideCSS}
|
|
|
803
820
|
return result;
|
|
804
821
|
}
|
|
805
822
|
function writeHeadMeta(html, page) {
|
|
806
|
-
const meta = typeof page?.getHeadMeta === "function" ? page
|
|
823
|
+
const meta = typeof page?.getHeadMeta === "function" ? pageHeadMeta(page) : { description: page?.description || null };
|
|
807
824
|
const end = html.indexOf("</head>");
|
|
808
825
|
if (!meta || end === -1) return html;
|
|
809
826
|
const og = meta.og || {};
|
|
@@ -836,6 +853,8 @@ function writeHeadMeta(html, page) {
|
|
|
836
853
|
for (const { hreflang, url } of meta.alternates || []) {
|
|
837
854
|
written.push(`<link rel="alternate" hreflang="${escapeHtml(hreflang)}" href="${escapeHtml(url)}">`);
|
|
838
855
|
}
|
|
856
|
+
head = head.replace(/<link\b(?=[^>]*\brel=["']alternate["'])(?=[^>]*\btype=["']text\/markdown["'])[^>]*>\s*/gi, "");
|
|
857
|
+
if (meta.markdown) written.push(`<link rel="alternate" type="text/markdown" href="${escapeHtml(meta.markdown)}">`);
|
|
839
858
|
return `${head}${written.join("\n")}
|
|
840
859
|
${html.slice(end)}`;
|
|
841
860
|
}
|
|
@@ -1188,6 +1207,7 @@ async function loadPageData({ website, route, fetch: fetch2, dev = false, locale
|
|
|
1188
1207
|
`loadPageData: this Website renders ${JSON.stringify(active)} and the caller asked for ${JSON.stringify(locale)}. A Website is locale-sliced — build one per locale (\`initPrerenderForLocale\`) rather than asking this step for another language.`
|
|
1189
1208
|
);
|
|
1190
1209
|
}
|
|
1210
|
+
website.makeCurrent();
|
|
1191
1211
|
const resolved = typeof route === "string" ? resolvePage(website, route) : route;
|
|
1192
1212
|
if (!resolved) return [];
|
|
1193
1213
|
const page = typeof resolved.getRenderableSelf === "function" ? resolved.getRenderableSelf() : resolved;
|
|
@@ -1232,7 +1252,15 @@ async function loadPageData({ website, route, fetch: fetch2, dev = false, locale
|
|
|
1232
1252
|
function createPageRenderer({ website, shell }) {
|
|
1233
1253
|
if (!website) throw new Error("createPageRenderer: `website` is required");
|
|
1234
1254
|
if (typeof shell !== "string") throw new Error("createPageRenderer: `shell` must be an HTML string");
|
|
1235
|
-
function render(target, { inject = {} } = {}) {
|
|
1255
|
+
function render(target, { inject = {}, fetchedData } = {}) {
|
|
1256
|
+
if (fetchedData !== void 0 && !Array.isArray(fetchedData)) {
|
|
1257
|
+
throw new Error("createPageRenderer: `fetchedData` must be the array of entries the page carries");
|
|
1258
|
+
}
|
|
1259
|
+
website.makeCurrent();
|
|
1260
|
+
if (fetchedData !== void 0) {
|
|
1261
|
+
website.forgetData();
|
|
1262
|
+
hydrateDataStore(website, fetchedData);
|
|
1263
|
+
}
|
|
1236
1264
|
const resolved = typeof target === "string" ? resolvePage(website, target) : target;
|
|
1237
1265
|
if (!resolved) return { outcome: "notFound", html: null, page: null, error: null };
|
|
1238
1266
|
const page = typeof resolved.getRenderableSelf === "function" ? resolved.getRenderableSelf() : resolved;
|