meno-core 1.0.50 → 1.0.52

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.
Files changed (32) hide show
  1. package/build-static.ts +8 -1
  2. package/dist/bin/cli.js +1 -1
  3. package/dist/build-static.js +3 -3
  4. package/dist/chunks/{chunk-PQ2HRXDR.js → chunk-2MHDV5BF.js} +11 -1
  5. package/dist/chunks/chunk-2MHDV5BF.js.map +7 -0
  6. package/dist/chunks/{chunk-YWJJD5D6.js → chunk-A725KYFK.js} +36 -17
  7. package/dist/chunks/{chunk-YWJJD5D6.js.map → chunk-A725KYFK.js.map} +3 -3
  8. package/dist/chunks/{chunk-CVLFID6V.js → chunk-CXCBV2M7.js} +65 -14
  9. package/dist/chunks/chunk-CXCBV2M7.js.map +7 -0
  10. package/dist/chunks/{chunk-4OFZP5NQ.js → chunk-HNLUO36W.js} +15 -4
  11. package/dist/chunks/chunk-HNLUO36W.js.map +7 -0
  12. package/dist/chunks/{chunk-56EUSC6D.js → chunk-LHLHPYSP.js} +4 -4
  13. package/dist/chunks/{chunk-56EUSC6D.js.map → chunk-LHLHPYSP.js.map} +2 -2
  14. package/dist/chunks/{configService-VOY2MY2K.js → configService-R3OGU2UD.js} +2 -2
  15. package/dist/entries/server-router.js +3 -3
  16. package/dist/lib/server/index.js +5 -5
  17. package/lib/server/routes/pages.ts +37 -2
  18. package/lib/server/services/cmsService.ts +21 -0
  19. package/lib/server/services/configService.ts +20 -0
  20. package/lib/server/ssr/buildErrorOverlay.ts +22 -4
  21. package/lib/server/ssr/errorOverlay.ts +11 -3
  22. package/lib/server/ssr/htmlGenerator.nonce.test.ts +165 -0
  23. package/lib/server/ssr/htmlGenerator.ts +25 -6
  24. package/lib/server/ssr/liveReloadIntegration.test.ts +3 -1
  25. package/lib/server/ssr/metaTagGenerator.ts +54 -6
  26. package/lib/server/ssr/ssrRenderer.ts +1 -0
  27. package/lib/server/ssrRenderer.test.ts +157 -2
  28. package/package.json +1 -1
  29. package/dist/chunks/chunk-4OFZP5NQ.js.map +0 -7
  30. package/dist/chunks/chunk-CVLFID6V.js.map +0 -7
  31. package/dist/chunks/chunk-PQ2HRXDR.js.map +0 -7
  32. /package/dist/chunks/{configService-VOY2MY2K.js.map → configService-R3OGU2UD.js.map} +0 -0
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  configService
3
- } from "./chunk-PQ2HRXDR.js";
3
+ } from "./chunk-2MHDV5BF.js";
4
4
  import {
5
5
  projectPaths,
6
6
  resolveProjectPath,
@@ -1070,6 +1070,25 @@ var CMSService = class {
1070
1070
  await this.provider.saveDraft(collection, item);
1071
1071
  this.itemsCache.delete(collection);
1072
1072
  }
1073
+ /**
1074
+ * Save a published item. Wraps the provider so the items cache is invalidated
1075
+ * immediately — without this, the editor's post-save refetch could hit a
1076
+ * stale snapshot inside the 5s TTL window and overwrite an optimistic preview.
1077
+ */
1078
+ async saveItem(collection, item) {
1079
+ if (!this.provider) throw new Error("CMS provider not configured");
1080
+ await this.provider.saveItem(collection, item);
1081
+ this.itemsCache.delete(collection);
1082
+ }
1083
+ /**
1084
+ * Delete an item (and its draft sibling). Cache invalidation, same rationale
1085
+ * as `saveItem`.
1086
+ */
1087
+ async deleteItem(collection, filename) {
1088
+ if (!this.provider) throw new Error("CMS provider not configured");
1089
+ await this.provider.deleteItem(collection, filename);
1090
+ this.itemsCache.delete(collection);
1091
+ }
1073
1092
  async discardDraft(collection, filename) {
1074
1093
  if (!this.provider) throw new Error("CMS provider not configured");
1075
1094
  await this.provider.discardDraft(collection, filename);
@@ -1622,7 +1641,18 @@ function extractPageMeta(pageData) {
1622
1641
  }
1623
1642
  return meta;
1624
1643
  }
1625
- function generateMetaTags(meta, url = "", locale = "en", config = DEFAULT_I18N_CONFIG, hreflangOptions) {
1644
+ function normalizeOgImageUrl(value, baseUrl) {
1645
+ if (!value) return value;
1646
+ let out = value;
1647
+ if (/^\/images\/[^?#]+\.(webp|avif)(\?|#|$)/i.test(out)) {
1648
+ out = out.replace(/\.(webp|avif)(?=\?|#|$)/i, ".jpg");
1649
+ }
1650
+ if (baseUrl && out.startsWith("/")) {
1651
+ out = `${baseUrl.replace(/\/$/, "")}${out}`;
1652
+ }
1653
+ return out;
1654
+ }
1655
+ function generateMetaTags(meta, url = "", locale = "en", config = DEFAULT_I18N_CONFIG, options) {
1626
1656
  const tags = [];
1627
1657
  const resolve = (value) => {
1628
1658
  const resolved = resolveI18nValue(value, locale, config);
@@ -1651,7 +1681,8 @@ function generateMetaTags(meta, url = "", locale = "en", config = DEFAULT_I18N_C
1651
1681
  tags.push(`<meta property="og:description" content="${escapeHtml(ogDescription)}" />`);
1652
1682
  }
1653
1683
  if (ogImage) {
1654
- tags.push(`<meta property="og:image" content="${escapeHtml(ogImage)}" />`);
1684
+ const normalizedOgImage = normalizeOgImageUrl(ogImage, options?.baseUrl);
1685
+ tags.push(`<meta property="og:image" content="${escapeHtml(normalizedOgImage)}" />`);
1655
1686
  }
1656
1687
  if (ogType) {
1657
1688
  tags.push(`<meta property="og:type" content="${escapeHtml(ogType)}" />`);
@@ -1659,11 +1690,28 @@ function generateMetaTags(meta, url = "", locale = "en", config = DEFAULT_I18N_C
1659
1690
  if (url) {
1660
1691
  tags.push(`<meta property="og:url" content="${escapeHtml(url)}" />`);
1661
1692
  }
1693
+ const hasAnyMeta = title || description || ogImage || ogTitle || ogDescription;
1694
+ if (hasAnyMeta) {
1695
+ const cardType = ogImage ? "summary_large_image" : "summary";
1696
+ tags.push(`<meta name="twitter:card" content="${cardType}" />`);
1697
+ }
1698
+ if (ogTitle) {
1699
+ tags.push(`<meta name="twitter:title" content="${escapeHtml(ogTitle)}" />`);
1700
+ }
1701
+ if (ogDescription) {
1702
+ tags.push(`<meta name="twitter:description" content="${escapeHtml(ogDescription)}" />`);
1703
+ }
1704
+ const rawHandle = options?.social?.twitterHandle?.trim();
1705
+ if (rawHandle) {
1706
+ const handle = rawHandle.startsWith("@") ? rawHandle : `@${rawHandle}`;
1707
+ tags.push(`<meta name="twitter:site" content="${escapeHtml(handle)}" />`);
1708
+ tags.push(`<meta name="twitter:creator" content="${escapeHtml(handle)}" />`);
1709
+ }
1662
1710
  if (url) {
1663
1711
  tags.push(`<link rel="canonical" href="${escapeHtml(url)}" />`);
1664
1712
  }
1665
- if (hreflangOptions?.slugMappings && hreflangOptions.slugMappings.length > 0 && config.locales.length > 1) {
1666
- const { slugMappings, pagePath = "/", baseUrl = "" } = hreflangOptions;
1713
+ if (options?.slugMappings && options.slugMappings.length > 0 && config.locales.length > 1) {
1714
+ const { slugMappings, pagePath = "/", baseUrl = "" } = options;
1667
1715
  const slugIndex = buildSlugIndex(slugMappings);
1668
1716
  const localeLinks = getLocaleLinks(pagePath, locale, config, slugIndex);
1669
1717
  for (const link of localeLinks) {
@@ -3118,7 +3166,8 @@ async function renderPageSSR(pageData, globalComponents = {}, pagePath = "/", ba
3118
3166
  const metaTags = generateMetaTags(meta, fullUrl, effectiveLocale, config, {
3119
3167
  slugMappings,
3120
3168
  pagePath,
3121
- baseUrl
3169
+ baseUrl,
3170
+ social: configService.getSocial()
3122
3171
  });
3123
3172
  const resolvedTitle = resolveI18nValue(meta.title, effectiveLocale, config);
3124
3173
  return {
@@ -3475,8 +3524,10 @@ async function generateSSRHTML(pageDataOrOptions, globalComponents = {}, pagePat
3475
3524
  injectEditorAttrs = false,
3476
3525
  isEditor = false,
3477
3526
  isProductionBuild = false,
3478
- serverPort
3527
+ serverPort,
3528
+ cspNonce
3479
3529
  } = options;
3530
+ const nonceAttr = cspNonce ? ` nonce="${cspNonce}"` : "";
3480
3531
  const rendered = await renderPageSSR(pageData, components, path2, base, loc, void 0, slugs, cms, cmsServ, isProductionBuild, injectEditorAttrs);
3481
3532
  let finalClientDataCollections = clientDataCollections;
3482
3533
  if (rendered.neededCollections.size > 0 && cmsServ) {
@@ -3507,7 +3558,7 @@ async function generateSSRHTML(pageDataOrOptions, globalComponents = {}, pagePat
3507
3558
  await configService.load();
3508
3559
  const globalLibraries = configService.getLibraries() || { js: [], css: [] };
3509
3560
  const globalCustomCode = configService.getCustomCode();
3510
- const menoBadgeHtml = configService.getShowMenoBadge() ? `<a href="https://meno.so" target="_blank" rel="noopener" style="position:fixed;bottom:12px;left:12px;z-index:9999;background:#000;color:#fff;padding:4px 10px;border-radius:6px;font-size:12px;font-family:system-ui,sans-serif;text-decoration:none;opacity:0.8;transition:opacity 0.2s" onmouseenter="this.style.opacity='1'" onmouseleave="this.style.opacity='0.8'">Made in Meno</a>` : "";
3561
+ const menoBadgeHtml = configService.getShowMenoBadge() ? `<style>.meno-badge{position:fixed;bottom:12px;left:12px;z-index:9999;background:#000;color:#fff;padding:4px 10px;border-radius:6px;font-size:12px;font-family:system-ui,sans-serif;text-decoration:none;opacity:0.8;transition:opacity 0.2s}.meno-badge:hover,.meno-badge:focus{opacity:1}</style><a class="meno-badge" href="https://meno.so" target="_blank" rel="noopener">Made in Meno</a>` : "";
3511
3562
  const mergedCustomCode = {
3512
3563
  head: [globalCustomCode.head, pageCustomCode?.head].filter(Boolean).join("\n"),
3513
3564
  bodyStart: [globalCustomCode.bodyStart, pageCustomCode?.bodyStart].filter(Boolean).join("\n"),
@@ -3576,7 +3627,7 @@ async function generateSSRHTML(pageDataOrOptions, globalComponents = {}, pagePat
3576
3627
  } else {
3577
3628
  const escapedJavaScript = allJavaScript.replace(/<\/script>/gi, "<\\/script>");
3578
3629
  componentScript = `
3579
- <script>
3630
+ <script${nonceAttr}>
3580
3631
  ${escapedJavaScript}
3581
3632
  </script>`;
3582
3633
  }
@@ -3643,14 +3694,14 @@ picture {
3643
3694
  const prefetchConfig = await loadPrefetchConfig();
3644
3695
  const menoConfig = prefetchConfig.enabled ? { prefetch: prefetchConfig } : {};
3645
3696
  const hasConfig = Object.keys(menoConfig).length > 0;
3646
- const configInlineScript = hasConfig && !extScriptPath && !returnSeparateJS ? `<script>window.__MENO_CONFIG__=${JSON.stringify(menoConfig)}</script>
3697
+ const configInlineScript = hasConfig && !extScriptPath && !returnSeparateJS ? `<script${nonceAttr}>window.__MENO_CONFIG__=${JSON.stringify(menoConfig)}</script>
3647
3698
  ` : "";
3648
3699
  if (hasConfig && externalJavaScript !== null) {
3649
3700
  externalJavaScript = `window.__MENO_CONFIG__=${JSON.stringify(menoConfig)};
3650
3701
 
3651
3702
  ` + externalJavaScript;
3652
3703
  }
3653
- const cmsInlineScript = cmsTemplatePath && cms && (!useBundled || injectLiveReload) ? `<script>window.__MENO_CMS__=${JSON.stringify({ item: cms.cms, templatePath: cmsTemplatePath })}</script>
3704
+ const cmsInlineScript = cmsTemplatePath && cms && (!useBundled || injectLiveReload) ? `<script${nonceAttr}>window.__MENO_CMS__=${JSON.stringify({ item: cms.cms, templatePath: cmsTemplatePath })}</script>
3654
3705
  ` : "";
3655
3706
  const clientDataScripts = finalClientDataCollections && finalClientDataCollections.size > 0 ? generateAllInlineDataScripts(finalClientDataCollections) + "\n " : "";
3656
3707
  const hasDarkFavicon = !!(iconsConfig.favicon && iconsConfig.faviconDark);
@@ -3661,8 +3712,8 @@ picture {
3661
3712
  const scriptPreloadTag = extScriptPath ? `<link rel="preload" href="${extScriptPath}" as="script">` : "";
3662
3713
  const imagePreloadTags = generateImagePreloadTags(rendered.preloadImages);
3663
3714
  const wsUrl = serverPort ? `'ws://localhost:${serverPort}/hmr'` : `location.origin.replace('http','ws')+'/hmr'`;
3664
- const liveReloadScript = injectLiveReload ? `<script>(function(){var ws,timer,gen=0,lastSrvRoot=null;function strip(s){return s?s.replace(/[?&]_r=\\d+/,''):''}function classList(el){return (el.getAttribute('class')||'').split(/\\s+/).filter(Boolean)}function syncEl(cur,srv,old){var cc=classList(cur),sc=classList(srv),oc=old?new Set(classList(old)):new Set();var rt=cc.filter(function(c){return !oc.has(c)});var seen=new Set(),fin=[];sc.concat(rt).forEach(function(c){if(!seen.has(c)){seen.add(c);fin.push(c)}});var fs=fin.join(' ');if((cur.getAttribute('class')||'')!==fs){if(fs)cur.setAttribute('class',fs);else cur.removeAttribute('class')}for(var i=0;i<srv.attributes.length;i++){var a=srv.attributes[i];if(a.name==='class')continue;if(cur.getAttribute(a.name)!==a.value)cur.setAttribute(a.name,a.value)}if(old){for(var i=0;i<old.attributes.length;i++){var a=old.attributes[i];if(a.name==='class')continue;if(!srv.hasAttribute(a.name)&&cur.hasAttribute(a.name))cur.removeAttribute(a.name)}}}function syncText(cur,srv){var cc=cur.childNodes,sc=srv.childNodes;for(var i=0;i<sc.length;i++){var s=sc[i],c=cc[i];if(s.nodeType===3&&c&&c.nodeType===3){if(c.textContent!==s.textContent)c.textContent=s.textContent}}}function smartUpdate(curR,srvR,oldR){var ce=curR.querySelectorAll('[data-element-path]'),se=srvR.querySelectorAll('[data-element-path]');if(ce.length!==se.length){if(curR.innerHTML!==srvR.innerHTML)curR.innerHTML=srvR.innerHTML;return}var sbp={};for(var i=0;i<se.length;i++)sbp[se[i].getAttribute('data-element-path')]=se[i];var obp={};if(oldR){var oe=oldR.querySelectorAll('[data-element-path]');for(var i=0;i<oe.length;i++)obp[oe[i].getAttribute('data-element-path')]=oe[i]}for(var i=0;i<ce.length;i++){var c=ce[i],p=c.getAttribute('data-element-path'),s=sbp[p];if(!s){if(curR.innerHTML!==srvR.innerHTML)curR.innerHTML=srvR.innerHTML;return}syncEl(c,s,obp[p]);syncText(c,s)}syncText(curR,srvR)}function connect(){ws=new WebSocket(${wsUrl});ws.onmessage=function(e){var d=JSON.parse(e.data);if(d.type==='hmr:libraries-update'){location.reload()}else if(d.type==='hmr:update'||d.type==='hmr:cms-update'||d.type==='hmr:colors-update'||d.type==='hmr:variables-update')hotReload()};ws.onclose=function(){clearTimeout(timer);timer=setTimeout(connect,1000)}}function hotReload(){var g=++gen;var sx=window.scrollX,sy=window.scrollY;fetch(location.href,{cache:'no-store'}).then(function(r){return r.text()}).then(function(html){if(g!==gen)return;var p=new DOMParser();var d=p.parseFromString(html,'text/html');var or=document.getElementById('root'),nr=d.getElementById('root');if(or&&nr)smartUpdate(or,nr,lastSrvRoot);if(nr)lastSrvRoot=nr.cloneNode(true);var os=document.getElementById('meno-styles'),ns=d.getElementById('meno-styles');if(os&&ns&&os.textContent!==ns.textContent)os.parentNode.replaceChild(ns.cloneNode(true),os);var nh=d.documentElement;if(nh){var nl=nh.getAttribute('lang')||'en',nt=nh.getAttribute('theme')||'light';if(document.documentElement.getAttribute('lang')!==nl)document.documentElement.setAttribute('lang',nl);if(document.documentElement.getAttribute('theme')!==nt)document.documentElement.setAttribute('theme',nt)}var ocms=document.querySelectorAll('script[id^="meno-cms-"]'),ncms=d.querySelectorAll('script[id^="meno-cms-"]');var ock=JSON.stringify(Array.prototype.map.call(ocms,function(s){return [s.id,s.textContent]}));var nck=JSON.stringify(Array.prototype.map.call(ncms,function(s){return [s.id,s.textContent]}));if(ock!==nck){ocms.forEach(function(s){s.remove()});ncms.forEach(function(s){var c=document.createElement('script');c.type=s.type;c.id=s.id;c.textContent=s.textContent;document.head.appendChild(c)})}window.__menoHotReload=true;var olib=document.querySelectorAll('body > script[src^="/libraries/"]'),nlib=d.querySelectorAll('body > script[src^="/libraries/"]');var olk=JSON.stringify(Array.prototype.map.call(olib,function(s){return strip(s.getAttribute('src'))}).sort());var nlk=JSON.stringify(Array.prototype.map.call(nlib,function(s){return strip(s.getAttribute('src'))}).sort());if(olk!==nlk){olib.forEach(function(o){o.remove()});nlib.forEach(function(n){var src=n.getAttribute('src');var ls=document.createElement('script');ls.src=src+(src.indexOf('?')>-1?'&':'?')+'_r='+Date.now();document.body.appendChild(ls)})}var oscr=document.querySelector('script[src^="/_scripts/"]'),nscr=d.querySelector('script[src^="/_scripts/"]');var oss=oscr?strip(oscr.getAttribute('src')):'',nss=nscr?strip(nscr.getAttribute('src')):'';if(oss===nss){window.scrollTo(sx,sy)}else{if(oscr)oscr.remove();if(nscr){var src=nscr.getAttribute('src');var s=document.createElement('script');s.src=src+(src.indexOf('?')>-1?'&':'?')+'_r='+Date.now();s.onload=function(){document.dispatchEvent(new Event('DOMContentLoaded'));window.scrollTo(sx,sy)};s.onerror=function(){window.scrollTo(sx,sy)};document.body.appendChild(s)}else{document.dispatchEvent(new Event('DOMContentLoaded'));window.scrollTo(sx,sy)}}}).catch(function(){location.reload()})}var iR=document.getElementById('root');if(iR)lastSrvRoot=iR.cloneNode(true);connect()})()</script>` : "";
3665
- const scrollHandlerScript = injectLiveReload ? `<script>(function(){window.addEventListener('message',function(e){if(e.data.type==='GET_SCROLL_POSITION'){window.parent.postMessage({type:'SCROLL_POSITION_RESPONSE',scrollX:window.scrollX,scrollY:window.scrollY},'*')}else if(e.data.type==='SET_SCROLL_POSITION'){window.scrollTo(e.data.scrollX,e.data.scrollY)}})})()</script>` : "";
3715
+ const liveReloadScript = injectLiveReload ? `<script${nonceAttr}>(function(){var ws,timer,gen=0,lastSrvRoot=null;function strip(s){return s?s.replace(/[?&]_r=\\d+/,''):''}function classList(el){return (el.getAttribute('class')||'').split(/\\s+/).filter(Boolean)}function syncEl(cur,srv,old){var cc=classList(cur),sc=classList(srv),oc=old?new Set(classList(old)):new Set();var rt=cc.filter(function(c){return !oc.has(c)});var seen=new Set(),fin=[];sc.concat(rt).forEach(function(c){if(!seen.has(c)){seen.add(c);fin.push(c)}});var fs=fin.join(' ');if((cur.getAttribute('class')||'')!==fs){if(fs)cur.setAttribute('class',fs);else cur.removeAttribute('class')}for(var i=0;i<srv.attributes.length;i++){var a=srv.attributes[i];if(a.name==='class')continue;if(cur.getAttribute(a.name)!==a.value)cur.setAttribute(a.name,a.value)}if(old){for(var i=0;i<old.attributes.length;i++){var a=old.attributes[i];if(a.name==='class')continue;if(!srv.hasAttribute(a.name)&&cur.hasAttribute(a.name))cur.removeAttribute(a.name)}}}function syncText(cur,srv){var cc=cur.childNodes,sc=srv.childNodes;for(var i=0;i<sc.length;i++){var s=sc[i],c=cc[i];if(s.nodeType===3&&c&&c.nodeType===3){if(c.textContent!==s.textContent)c.textContent=s.textContent}}}function smartUpdate(curR,srvR,oldR){var ce=curR.querySelectorAll('[data-element-path]'),se=srvR.querySelectorAll('[data-element-path]');if(ce.length!==se.length){if(curR.innerHTML!==srvR.innerHTML)curR.innerHTML=srvR.innerHTML;return}var sbp={};for(var i=0;i<se.length;i++)sbp[se[i].getAttribute('data-element-path')]=se[i];var obp={};if(oldR){var oe=oldR.querySelectorAll('[data-element-path]');for(var i=0;i<oe.length;i++)obp[oe[i].getAttribute('data-element-path')]=oe[i]}for(var i=0;i<ce.length;i++){var c=ce[i],p=c.getAttribute('data-element-path'),s=sbp[p];if(!s){if(curR.innerHTML!==srvR.innerHTML)curR.innerHTML=srvR.innerHTML;return}syncEl(c,s,obp[p]);syncText(c,s)}syncText(curR,srvR)}function connect(){ws=new WebSocket(${wsUrl});ws.onmessage=function(e){var d=JSON.parse(e.data);if(d.type==='hmr:libraries-update'){location.reload()}else if(d.type==='hmr:update'||d.type==='hmr:cms-update'||d.type==='hmr:colors-update'||d.type==='hmr:variables-update')hotReload()};ws.onclose=function(){clearTimeout(timer);timer=setTimeout(connect,1000)}}function hotReload(){var g=++gen;var sx=window.scrollX,sy=window.scrollY;fetch(location.href,{cache:'no-store'}).then(function(r){return r.text()}).then(function(html){if(g!==gen)return;var p=new DOMParser();var d=p.parseFromString(html,'text/html');var or=document.getElementById('root'),nr=d.getElementById('root');if(or&&nr)smartUpdate(or,nr,lastSrvRoot);if(nr)lastSrvRoot=nr.cloneNode(true);var os=document.getElementById('meno-styles'),ns=d.getElementById('meno-styles');if(os&&ns&&os.textContent!==ns.textContent)os.parentNode.replaceChild(ns.cloneNode(true),os);var nh=d.documentElement;if(nh){var nl=nh.getAttribute('lang')||'en',nt=nh.getAttribute('theme')||'light';if(document.documentElement.getAttribute('lang')!==nl)document.documentElement.setAttribute('lang',nl);if(document.documentElement.getAttribute('theme')!==nt)document.documentElement.setAttribute('theme',nt)}var ocms=document.querySelectorAll('script[id^="meno-cms-"]'),ncms=d.querySelectorAll('script[id^="meno-cms-"]');var ock=JSON.stringify(Array.prototype.map.call(ocms,function(s){return [s.id,s.textContent]}));var nck=JSON.stringify(Array.prototype.map.call(ncms,function(s){return [s.id,s.textContent]}));if(ock!==nck){ocms.forEach(function(s){s.remove()});ncms.forEach(function(s){var c=document.createElement('script');c.type=s.type;c.id=s.id;c.textContent=s.textContent;document.head.appendChild(c)})}window.__menoHotReload=true;var olib=document.querySelectorAll('body > script[src^="/libraries/"]'),nlib=d.querySelectorAll('body > script[src^="/libraries/"]');var olk=JSON.stringify(Array.prototype.map.call(olib,function(s){return strip(s.getAttribute('src'))}).sort());var nlk=JSON.stringify(Array.prototype.map.call(nlib,function(s){return strip(s.getAttribute('src'))}).sort());if(olk!==nlk){olib.forEach(function(o){o.remove()});nlib.forEach(function(n){var src=n.getAttribute('src');var ls=document.createElement('script');ls.src=src+(src.indexOf('?')>-1?'&':'?')+'_r='+Date.now();document.body.appendChild(ls)})}var oscr=document.querySelector('script[src^="/_scripts/"]'),nscr=d.querySelector('script[src^="/_scripts/"]');var oss=oscr?strip(oscr.getAttribute('src')):'',nss=nscr?strip(nscr.getAttribute('src')):'';if(oss===nss){window.scrollTo(sx,sy)}else{if(oscr)oscr.remove();if(nscr){var src=nscr.getAttribute('src');var s=document.createElement('script');s.src=src+(src.indexOf('?')>-1?'&':'?')+'_r='+Date.now();s.onload=function(){document.dispatchEvent(new Event('DOMContentLoaded'));window.scrollTo(sx,sy)};s.onerror=function(){window.scrollTo(sx,sy)};document.body.appendChild(s)}else{document.dispatchEvent(new Event('DOMContentLoaded'));window.scrollTo(sx,sy)}}}).catch(function(){location.reload()})}var iR=document.getElementById('root');if(iR)lastSrvRoot=iR.cloneNode(true);connect()})()</script>` : "";
3716
+ const scrollHandlerScript = injectLiveReload ? `<script${nonceAttr}>(function(){window.addEventListener('message',function(e){if(e.data.type==='GET_SCROLL_POSITION'){window.parent.postMessage({type:'SCROLL_POSITION_RESPONSE',scrollX:window.scrollX,scrollY:window.scrollY},'*')}else if(e.data.type==='SET_SCROLL_POSITION'){window.scrollTo(e.data.scrollX,e.data.scrollY)}})})()</script>` : "";
3666
3717
  const styleContent = useBundled ? finalCSS : `
3667
3718
  ${combinedCSS.split("\n").join("\n ")}
3668
3719
  `;
@@ -6332,4 +6383,4 @@ export {
6332
6383
  FileSystemCMSProvider,
6333
6384
  migrateTemplatesDirectory
6334
6385
  };
6335
- //# sourceMappingURL=chunk-CVLFID6V.js.map
6386
+ //# sourceMappingURL=chunk-CXCBV2M7.js.map