@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 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
- const svg = await response.text();
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.getHeadMeta() : { description: page?.description || null };
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;