nuxt-og-image 6.4.2 → 6.4.3

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 (63) hide show
  1. package/dist/chunks/tw4.cjs +1 -1
  2. package/dist/chunks/tw4.mjs +1 -1
  3. package/dist/chunks/uno.cjs +1 -1
  4. package/dist/chunks/uno.mjs +1 -1
  5. package/dist/devtools/200.html +1 -1
  6. package/dist/devtools/404.html +1 -1
  7. package/dist/devtools/_nuxt/{BWm573-p.js → B-y6Zfh-.js} +1 -1
  8. package/dist/devtools/_nuxt/{w_tq7NMl.js → B5qFn-Gu.js} +1 -1
  9. package/dist/devtools/_nuxt/{CHeKziWa.js → BVne4GIn.js} +1 -1
  10. package/dist/devtools/_nuxt/{yBiBpwD7.js → BlCLj09b.js} +6 -6
  11. package/dist/devtools/_nuxt/CN79P4uE.js +6 -0
  12. package/dist/devtools/_nuxt/{Cy0omYQh.js → ClxM7Lmy.js} +1 -1
  13. package/dist/devtools/_nuxt/{DziLl24l.js → CwlJb64V.js} +1 -1
  14. package/dist/devtools/_nuxt/{BsivBvAU.js → D7u0rku6.js} +1 -1
  15. package/dist/devtools/_nuxt/DevtoolsSection.C56mUBtZ.css +1 -0
  16. package/dist/devtools/_nuxt/DevtoolsSnippet.BfzotPc4.css +1 -0
  17. package/dist/devtools/_nuxt/{BQDcSiMf.js → H3aAOs4d.js} +1 -1
  18. package/dist/devtools/_nuxt/{B6Dg3dZ6.js → QLqpVsIv.js} +1 -1
  19. package/dist/devtools/_nuxt/builds/latest.json +1 -1
  20. package/dist/devtools/_nuxt/builds/meta/cbeb6bb2-84a2-4c9c-a725-a30474eb2d1e.json +1 -0
  21. package/dist/devtools/_nuxt/{entry.BjD2aghs.css → entry.DTjl7Lr7.css} +1 -1
  22. package/dist/devtools/_nuxt/{pages.DO0dnDUs.css → pages.DqKYLiSy.css} +1 -1
  23. package/dist/devtools/_nuxt/renderer-select.Do_uPaOg.css +1 -0
  24. package/dist/devtools/_nuxt/{BMVWkjCo.js → rybsNufq.js} +1 -1
  25. package/dist/devtools/debug/index.html +1 -1
  26. package/dist/devtools/docs/index.html +1 -1
  27. package/dist/devtools/index.html +1 -1
  28. package/dist/devtools/templates/index.html +1 -1
  29. package/dist/module.cjs +1 -1
  30. package/dist/module.d.cts +11 -0
  31. package/dist/module.d.mts +11 -0
  32. package/dist/module.d.ts +11 -0
  33. package/dist/module.json +1 -1
  34. package/dist/module.mjs +1 -1
  35. package/dist/runtime/app/client-utils.js +24 -5
  36. package/dist/runtime/server/og-image/bindings/font-assets/cloudflare.js +9 -18
  37. package/dist/runtime/server/og-image/bindings/font-assets/dev-prerender.js +8 -4
  38. package/dist/runtime/server/og-image/bindings/font-assets/node.js +6 -2
  39. package/dist/runtime/server/og-image/browser/screenshot.d.ts +1 -1
  40. package/dist/runtime/server/og-image/browser/screenshot.js +6 -4
  41. package/dist/runtime/server/og-image/context.js +4 -0
  42. package/dist/runtime/server/og-image/core/plugins/imageSrc.js +106 -99
  43. package/dist/runtime/server/og-image/core/transforms/emojis/fetch.js +23 -12
  44. package/dist/runtime/server/og-image/satori/renderer.js +16 -14
  45. package/dist/runtime/server/og-image/takumi/renderer.js +27 -19
  46. package/dist/runtime/server/util/cloudflareAssets.d.ts +24 -0
  47. package/dist/runtime/server/util/cloudflareAssets.js +16 -0
  48. package/dist/runtime/server/util/eventHandlers.js +28 -5
  49. package/dist/runtime/server/util/fetchLocalAsset.d.ts +25 -0
  50. package/dist/runtime/server/util/fetchLocalAsset.js +34 -0
  51. package/dist/runtime/server/util/fetchTimeout.d.ts +2 -0
  52. package/dist/runtime/server/util/fetchTimeout.js +7 -0
  53. package/dist/runtime/server/util/timings.d.ts +17 -0
  54. package/dist/runtime/server/util/timings.js +75 -0
  55. package/dist/runtime/types.d.ts +3 -0
  56. package/dist/shared/{nuxt-og-image.C2oXAHiT.cjs → nuxt-og-image.B55LvX3B.cjs} +2 -1
  57. package/dist/shared/{nuxt-og-image.BK0-aZom.mjs → nuxt-og-image.BHvLMojr.mjs} +1 -0
  58. package/package.json +6 -6
  59. package/dist/devtools/_nuxt/DDRo8-tD.js +0 -6
  60. package/dist/devtools/_nuxt/DevtoolsSection.C-PGRg5f.css +0 -1
  61. package/dist/devtools/_nuxt/DevtoolsSnippet.BipAyEUC.css +0 -1
  62. package/dist/devtools/_nuxt/builds/meta/150c0674-b387-4525-9043-e05dd343db8e.json +0 -1
  63. package/dist/devtools/_nuxt/renderer-select.J57nTUNW.css +0 -1
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><script type="importmap">{"imports":{"#entry":"/__nuxt-og-image/_nuxt/yBiBpwD7.js"}}</script><link rel="stylesheet" href="/__nuxt-og-image/_nuxt/entry.BjD2aghs.css" crossorigin><link rel="stylesheet" href="/__nuxt-og-image/_nuxt/renderer-select.J57nTUNW.css" crossorigin><link rel="stylesheet" href="/__nuxt-og-image/_nuxt/DevtoolsSection.C-PGRg5f.css" crossorigin><link rel="modulepreload" as="script" crossorigin href="/__nuxt-og-image/_nuxt/yBiBpwD7.js"><link rel="modulepreload" as="script" crossorigin href="/__nuxt-og-image/_nuxt/CP0tQR2M.js"><link rel="modulepreload" as="script" crossorigin href="/__nuxt-og-image/_nuxt/DmsY5seq.js"><link rel="modulepreload" as="script" crossorigin href="/__nuxt-og-image/_nuxt/Cy0omYQh.js"><link rel="modulepreload" as="script" crossorigin href="/__nuxt-og-image/_nuxt/BWm573-p.js"><link rel="modulepreload" as="script" crossorigin href="/__nuxt-og-image/_nuxt/DDRo8-tD.js"><link rel="modulepreload" as="script" crossorigin href="/__nuxt-og-image/_nuxt/B6Dg3dZ6.js"><link rel="modulepreload" as="script" crossorigin href="/__nuxt-og-image/_nuxt/BQDcSiMf.js"><script type="module" src="/__nuxt-og-image/_nuxt/yBiBpwD7.js" crossorigin></script><script>"use strict";(()=>{const t=window,e=document.documentElement,c=["dark","light"],n=getStorageValue("localStorage","nuxt-color-mode")||"system";let i=n==="system"?u():n;const r=e.getAttribute("data-color-mode-forced");r&&(i=r),l(i),t["__NUXT_COLOR_MODE__"]={preference:n,value:i,getColorScheme:u,addColorScheme:l,removeColorScheme:d};function l(o){const s=""+o+"",a="";e.classList?e.classList.add(s):e.className+=" "+s,a&&e.setAttribute("data-"+a,o)}function d(o){const s=""+o+"",a="";e.classList?e.classList.remove(s):e.className=e.className.replace(new RegExp(s,"g"),""),a&&e.removeAttribute("data-"+a)}function f(o){return t.matchMedia("(prefers-color-scheme"+o+")")}function u(){if(t.matchMedia&&f("").media!=="not all"){for(const o of c)if(f(":"+o).matches)return o}return"light"}})();function getStorageValue(t,e){switch(t){case"localStorage":return window.localStorage.getItem(e);case"sessionStorage":return window.sessionStorage.getItem(e);case"cookie":return getCookie(e);default:return null}}function getCookie(t){const c=("; "+window.document.cookie).split("; "+t+"=");if(c.length===2)return c.pop()?.split(";").shift()}</script></head><body><div id="__nuxt" class="isolate"></div><div id="teleports"></div><script>window.__NUXT__={};window.__NUXT__.config={public:{},app:{baseURL:"/__nuxt-og-image",buildId:"150c0674-b387-4525-9043-e05dd343db8e",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script><script type="application/json" data-nuxt-data="nuxt-app" data-ssr="false" id="__NUXT_DATA__">[{"prerenderedAt":1,"serverRendered":2},1776225190433,false]</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><script type="importmap">{"imports":{"#entry":"/__nuxt-og-image/_nuxt/BlCLj09b.js"}}</script><link rel="stylesheet" href="/__nuxt-og-image/_nuxt/entry.DTjl7Lr7.css" crossorigin><link rel="stylesheet" href="/__nuxt-og-image/_nuxt/renderer-select.Do_uPaOg.css" crossorigin><link rel="stylesheet" href="/__nuxt-og-image/_nuxt/DevtoolsSection.C56mUBtZ.css" crossorigin><link rel="modulepreload" as="script" crossorigin href="/__nuxt-og-image/_nuxt/BlCLj09b.js"><link rel="modulepreload" as="script" crossorigin href="/__nuxt-og-image/_nuxt/CP0tQR2M.js"><link rel="modulepreload" as="script" crossorigin href="/__nuxt-og-image/_nuxt/DmsY5seq.js"><link rel="modulepreload" as="script" crossorigin href="/__nuxt-og-image/_nuxt/ClxM7Lmy.js"><link rel="modulepreload" as="script" crossorigin href="/__nuxt-og-image/_nuxt/B-y6Zfh-.js"><link rel="modulepreload" as="script" crossorigin href="/__nuxt-og-image/_nuxt/CN79P4uE.js"><link rel="modulepreload" as="script" crossorigin href="/__nuxt-og-image/_nuxt/QLqpVsIv.js"><link rel="modulepreload" as="script" crossorigin href="/__nuxt-og-image/_nuxt/H3aAOs4d.js"><script type="module" src="/__nuxt-og-image/_nuxt/BlCLj09b.js" crossorigin></script><script>"use strict";(()=>{const t=window,e=document.documentElement,c=["dark","light"],n=getStorageValue("localStorage","nuxt-color-mode")||"system";let i=n==="system"?u():n;const r=e.getAttribute("data-color-mode-forced");r&&(i=r),l(i),t["__NUXT_COLOR_MODE__"]={preference:n,value:i,getColorScheme:u,addColorScheme:l,removeColorScheme:d};function l(o){const s=""+o+"",a="";e.classList?e.classList.add(s):e.className+=" "+s,a&&e.setAttribute("data-"+a,o)}function d(o){const s=""+o+"",a="";e.classList?e.classList.remove(s):e.className=e.className.replace(new RegExp(s,"g"),""),a&&e.removeAttribute("data-"+a)}function f(o){return t.matchMedia("(prefers-color-scheme"+o+")")}function u(){if(t.matchMedia&&f("").media!=="not all"){for(const o of c)if(f(":"+o).matches)return o}return"light"}})();function getStorageValue(t,e){switch(t){case"localStorage":return window.localStorage.getItem(e);case"sessionStorage":return window.sessionStorage.getItem(e);case"cookie":return getCookie(e);default:return null}}function getCookie(t){const c=("; "+window.document.cookie).split("; "+t+"=");if(c.length===2)return c.pop()?.split(";").shift()}</script></head><body><div id="__nuxt" class="isolate"></div><div id="teleports"></div><script>window.__NUXT__={};window.__NUXT__.config={public:{},app:{baseURL:"/__nuxt-og-image",buildId:"cbeb6bb2-84a2-4c9c-a725-a30474eb2d1e",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script><script type="application/json" data-nuxt-data="nuxt-app" data-ssr="false" id="__NUXT_DATA__">[{"prerenderedAt":1,"serverRendered":2},1776345728122,false]</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><script type="importmap">{"imports":{"#entry":"/__nuxt-og-image/_nuxt/yBiBpwD7.js"}}</script><link rel="stylesheet" href="/__nuxt-og-image/_nuxt/entry.BjD2aghs.css" crossorigin><link rel="stylesheet" href="/__nuxt-og-image/_nuxt/renderer-select.J57nTUNW.css" crossorigin><link rel="stylesheet" href="/__nuxt-og-image/_nuxt/DevtoolsSection.C-PGRg5f.css" crossorigin><link rel="modulepreload" as="script" crossorigin href="/__nuxt-og-image/_nuxt/yBiBpwD7.js"><link rel="modulepreload" as="script" crossorigin href="/__nuxt-og-image/_nuxt/CP0tQR2M.js"><link rel="modulepreload" as="script" crossorigin href="/__nuxt-og-image/_nuxt/DmsY5seq.js"><link rel="modulepreload" as="script" crossorigin href="/__nuxt-og-image/_nuxt/Cy0omYQh.js"><link rel="modulepreload" as="script" crossorigin href="/__nuxt-og-image/_nuxt/BWm573-p.js"><link rel="modulepreload" as="script" crossorigin href="/__nuxt-og-image/_nuxt/DDRo8-tD.js"><link rel="modulepreload" as="script" crossorigin href="/__nuxt-og-image/_nuxt/B6Dg3dZ6.js"><link rel="modulepreload" as="script" crossorigin href="/__nuxt-og-image/_nuxt/BQDcSiMf.js"><script type="module" src="/__nuxt-og-image/_nuxt/yBiBpwD7.js" crossorigin></script><script>"use strict";(()=>{const t=window,e=document.documentElement,c=["dark","light"],n=getStorageValue("localStorage","nuxt-color-mode")||"system";let i=n==="system"?u():n;const r=e.getAttribute("data-color-mode-forced");r&&(i=r),l(i),t["__NUXT_COLOR_MODE__"]={preference:n,value:i,getColorScheme:u,addColorScheme:l,removeColorScheme:d};function l(o){const s=""+o+"",a="";e.classList?e.classList.add(s):e.className+=" "+s,a&&e.setAttribute("data-"+a,o)}function d(o){const s=""+o+"",a="";e.classList?e.classList.remove(s):e.className=e.className.replace(new RegExp(s,"g"),""),a&&e.removeAttribute("data-"+a)}function f(o){return t.matchMedia("(prefers-color-scheme"+o+")")}function u(){if(t.matchMedia&&f("").media!=="not all"){for(const o of c)if(f(":"+o).matches)return o}return"light"}})();function getStorageValue(t,e){switch(t){case"localStorage":return window.localStorage.getItem(e);case"sessionStorage":return window.sessionStorage.getItem(e);case"cookie":return getCookie(e);default:return null}}function getCookie(t){const c=("; "+window.document.cookie).split("; "+t+"=");if(c.length===2)return c.pop()?.split(";").shift()}</script></head><body><div id="__nuxt" class="isolate"></div><div id="teleports"></div><script>window.__NUXT__={};window.__NUXT__.config={public:{},app:{baseURL:"/__nuxt-og-image",buildId:"150c0674-b387-4525-9043-e05dd343db8e",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script><script type="application/json" data-nuxt-data="nuxt-app" data-ssr="false" id="__NUXT_DATA__">[{"prerenderedAt":1,"serverRendered":2},1776225190434,false]</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><script type="importmap">{"imports":{"#entry":"/__nuxt-og-image/_nuxt/BlCLj09b.js"}}</script><link rel="stylesheet" href="/__nuxt-og-image/_nuxt/entry.DTjl7Lr7.css" crossorigin><link rel="stylesheet" href="/__nuxt-og-image/_nuxt/renderer-select.Do_uPaOg.css" crossorigin><link rel="stylesheet" href="/__nuxt-og-image/_nuxt/DevtoolsSection.C56mUBtZ.css" crossorigin><link rel="modulepreload" as="script" crossorigin href="/__nuxt-og-image/_nuxt/BlCLj09b.js"><link rel="modulepreload" as="script" crossorigin href="/__nuxt-og-image/_nuxt/CP0tQR2M.js"><link rel="modulepreload" as="script" crossorigin href="/__nuxt-og-image/_nuxt/DmsY5seq.js"><link rel="modulepreload" as="script" crossorigin href="/__nuxt-og-image/_nuxt/ClxM7Lmy.js"><link rel="modulepreload" as="script" crossorigin href="/__nuxt-og-image/_nuxt/B-y6Zfh-.js"><link rel="modulepreload" as="script" crossorigin href="/__nuxt-og-image/_nuxt/CN79P4uE.js"><link rel="modulepreload" as="script" crossorigin href="/__nuxt-og-image/_nuxt/QLqpVsIv.js"><link rel="modulepreload" as="script" crossorigin href="/__nuxt-og-image/_nuxt/H3aAOs4d.js"><script type="module" src="/__nuxt-og-image/_nuxt/BlCLj09b.js" crossorigin></script><script>"use strict";(()=>{const t=window,e=document.documentElement,c=["dark","light"],n=getStorageValue("localStorage","nuxt-color-mode")||"system";let i=n==="system"?u():n;const r=e.getAttribute("data-color-mode-forced");r&&(i=r),l(i),t["__NUXT_COLOR_MODE__"]={preference:n,value:i,getColorScheme:u,addColorScheme:l,removeColorScheme:d};function l(o){const s=""+o+"",a="";e.classList?e.classList.add(s):e.className+=" "+s,a&&e.setAttribute("data-"+a,o)}function d(o){const s=""+o+"",a="";e.classList?e.classList.remove(s):e.className=e.className.replace(new RegExp(s,"g"),""),a&&e.removeAttribute("data-"+a)}function f(o){return t.matchMedia("(prefers-color-scheme"+o+")")}function u(){if(t.matchMedia&&f("").media!=="not all"){for(const o of c)if(f(":"+o).matches)return o}return"light"}})();function getStorageValue(t,e){switch(t){case"localStorage":return window.localStorage.getItem(e);case"sessionStorage":return window.sessionStorage.getItem(e);case"cookie":return getCookie(e);default:return null}}function getCookie(t){const c=("; "+window.document.cookie).split("; "+t+"=");if(c.length===2)return c.pop()?.split(";").shift()}</script></head><body><div id="__nuxt" class="isolate"></div><div id="teleports"></div><script>window.__NUXT__={};window.__NUXT__.config={public:{},app:{baseURL:"/__nuxt-og-image",buildId:"cbeb6bb2-84a2-4c9c-a725-a30474eb2d1e",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script><script type="application/json" data-nuxt-data="nuxt-app" data-ssr="false" id="__NUXT_DATA__">[{"prerenderedAt":1,"serverRendered":2},1776345728124,false]</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><script type="importmap">{"imports":{"#entry":"/__nuxt-og-image/_nuxt/yBiBpwD7.js"}}</script><link rel="stylesheet" href="/__nuxt-og-image/_nuxt/entry.BjD2aghs.css" crossorigin><link rel="stylesheet" href="/__nuxt-og-image/_nuxt/renderer-select.J57nTUNW.css" crossorigin><link rel="stylesheet" href="/__nuxt-og-image/_nuxt/DevtoolsSection.C-PGRg5f.css" crossorigin><link rel="modulepreload" as="script" crossorigin href="/__nuxt-og-image/_nuxt/yBiBpwD7.js"><link rel="modulepreload" as="script" crossorigin href="/__nuxt-og-image/_nuxt/CP0tQR2M.js"><link rel="modulepreload" as="script" crossorigin href="/__nuxt-og-image/_nuxt/DmsY5seq.js"><link rel="modulepreload" as="script" crossorigin href="/__nuxt-og-image/_nuxt/Cy0omYQh.js"><link rel="modulepreload" as="script" crossorigin href="/__nuxt-og-image/_nuxt/BWm573-p.js"><link rel="modulepreload" as="script" crossorigin href="/__nuxt-og-image/_nuxt/DDRo8-tD.js"><link rel="modulepreload" as="script" crossorigin href="/__nuxt-og-image/_nuxt/B6Dg3dZ6.js"><link rel="modulepreload" as="script" crossorigin href="/__nuxt-og-image/_nuxt/BQDcSiMf.js"><script type="module" src="/__nuxt-og-image/_nuxt/yBiBpwD7.js" crossorigin></script><script>"use strict";(()=>{const t=window,e=document.documentElement,c=["dark","light"],n=getStorageValue("localStorage","nuxt-color-mode")||"system";let i=n==="system"?u():n;const r=e.getAttribute("data-color-mode-forced");r&&(i=r),l(i),t["__NUXT_COLOR_MODE__"]={preference:n,value:i,getColorScheme:u,addColorScheme:l,removeColorScheme:d};function l(o){const s=""+o+"",a="";e.classList?e.classList.add(s):e.className+=" "+s,a&&e.setAttribute("data-"+a,o)}function d(o){const s=""+o+"",a="";e.classList?e.classList.remove(s):e.className=e.className.replace(new RegExp(s,"g"),""),a&&e.removeAttribute("data-"+a)}function f(o){return t.matchMedia("(prefers-color-scheme"+o+")")}function u(){if(t.matchMedia&&f("").media!=="not all"){for(const o of c)if(f(":"+o).matches)return o}return"light"}})();function getStorageValue(t,e){switch(t){case"localStorage":return window.localStorage.getItem(e);case"sessionStorage":return window.sessionStorage.getItem(e);case"cookie":return getCookie(e);default:return null}}function getCookie(t){const c=("; "+window.document.cookie).split("; "+t+"=");if(c.length===2)return c.pop()?.split(";").shift()}</script></head><body><div id="__nuxt" class="isolate"></div><div id="teleports"></div><script>window.__NUXT_SITE_CONFIG__={_priority:{env:-15,url:-3},env:"production",url:"https:\u002F\u002Fnuxtseo.com"}</script><script>window.__NUXT__={};window.__NUXT__.config={public:{},app:{baseURL:"/__nuxt-og-image",buildId:"150c0674-b387-4525-9043-e05dd343db8e",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script><script type="application/json" data-nuxt-data="nuxt-app" data-ssr="false" id="__NUXT_DATA__">[{"prerenderedAt":1,"serverRendered":2},1776225190434,false]</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><script type="importmap">{"imports":{"#entry":"/__nuxt-og-image/_nuxt/BlCLj09b.js"}}</script><link rel="stylesheet" href="/__nuxt-og-image/_nuxt/entry.DTjl7Lr7.css" crossorigin><link rel="stylesheet" href="/__nuxt-og-image/_nuxt/renderer-select.Do_uPaOg.css" crossorigin><link rel="stylesheet" href="/__nuxt-og-image/_nuxt/DevtoolsSection.C56mUBtZ.css" crossorigin><link rel="modulepreload" as="script" crossorigin href="/__nuxt-og-image/_nuxt/BlCLj09b.js"><link rel="modulepreload" as="script" crossorigin href="/__nuxt-og-image/_nuxt/CP0tQR2M.js"><link rel="modulepreload" as="script" crossorigin href="/__nuxt-og-image/_nuxt/DmsY5seq.js"><link rel="modulepreload" as="script" crossorigin href="/__nuxt-og-image/_nuxt/ClxM7Lmy.js"><link rel="modulepreload" as="script" crossorigin href="/__nuxt-og-image/_nuxt/B-y6Zfh-.js"><link rel="modulepreload" as="script" crossorigin href="/__nuxt-og-image/_nuxt/CN79P4uE.js"><link rel="modulepreload" as="script" crossorigin href="/__nuxt-og-image/_nuxt/QLqpVsIv.js"><link rel="modulepreload" as="script" crossorigin href="/__nuxt-og-image/_nuxt/H3aAOs4d.js"><script type="module" src="/__nuxt-og-image/_nuxt/BlCLj09b.js" crossorigin></script><script>"use strict";(()=>{const t=window,e=document.documentElement,c=["dark","light"],n=getStorageValue("localStorage","nuxt-color-mode")||"system";let i=n==="system"?u():n;const r=e.getAttribute("data-color-mode-forced");r&&(i=r),l(i),t["__NUXT_COLOR_MODE__"]={preference:n,value:i,getColorScheme:u,addColorScheme:l,removeColorScheme:d};function l(o){const s=""+o+"",a="";e.classList?e.classList.add(s):e.className+=" "+s,a&&e.setAttribute("data-"+a,o)}function d(o){const s=""+o+"",a="";e.classList?e.classList.remove(s):e.className=e.className.replace(new RegExp(s,"g"),""),a&&e.removeAttribute("data-"+a)}function f(o){return t.matchMedia("(prefers-color-scheme"+o+")")}function u(){if(t.matchMedia&&f("").media!=="not all"){for(const o of c)if(f(":"+o).matches)return o}return"light"}})();function getStorageValue(t,e){switch(t){case"localStorage":return window.localStorage.getItem(e);case"sessionStorage":return window.sessionStorage.getItem(e);case"cookie":return getCookie(e);default:return null}}function getCookie(t){const c=("; "+window.document.cookie).split("; "+t+"=");if(c.length===2)return c.pop()?.split(";").shift()}</script></head><body><div id="__nuxt" class="isolate"></div><div id="teleports"></div><script>window.__NUXT_SITE_CONFIG__={_priority:{env:-15,url:-3},env:"production",url:"https:\u002F\u002Fnuxtseo.com"}</script><script>window.__NUXT__={};window.__NUXT__.config={public:{},app:{baseURL:"/__nuxt-og-image",buildId:"cbeb6bb2-84a2-4c9c-a725-a30474eb2d1e",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script><script type="application/json" data-nuxt-data="nuxt-app" data-ssr="false" id="__NUXT_DATA__">[{"prerenderedAt":1,"serverRendered":2},1776345728124,false]</script></body></html>
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><script type="importmap">{"imports":{"#entry":"/__nuxt-og-image/_nuxt/yBiBpwD7.js"}}</script><link rel="stylesheet" href="/__nuxt-og-image/_nuxt/entry.BjD2aghs.css" crossorigin><link rel="stylesheet" href="/__nuxt-og-image/_nuxt/renderer-select.J57nTUNW.css" crossorigin><link rel="stylesheet" href="/__nuxt-og-image/_nuxt/DevtoolsSection.C-PGRg5f.css" crossorigin><link rel="modulepreload" as="script" crossorigin href="/__nuxt-og-image/_nuxt/yBiBpwD7.js"><link rel="modulepreload" as="script" crossorigin href="/__nuxt-og-image/_nuxt/CP0tQR2M.js"><link rel="modulepreload" as="script" crossorigin href="/__nuxt-og-image/_nuxt/DmsY5seq.js"><link rel="modulepreload" as="script" crossorigin href="/__nuxt-og-image/_nuxt/Cy0omYQh.js"><link rel="modulepreload" as="script" crossorigin href="/__nuxt-og-image/_nuxt/BWm573-p.js"><link rel="modulepreload" as="script" crossorigin href="/__nuxt-og-image/_nuxt/DDRo8-tD.js"><link rel="modulepreload" as="script" crossorigin href="/__nuxt-og-image/_nuxt/B6Dg3dZ6.js"><link rel="modulepreload" as="script" crossorigin href="/__nuxt-og-image/_nuxt/BQDcSiMf.js"><script type="module" src="/__nuxt-og-image/_nuxt/yBiBpwD7.js" crossorigin></script><script>"use strict";(()=>{const t=window,e=document.documentElement,c=["dark","light"],n=getStorageValue("localStorage","nuxt-color-mode")||"system";let i=n==="system"?u():n;const r=e.getAttribute("data-color-mode-forced");r&&(i=r),l(i),t["__NUXT_COLOR_MODE__"]={preference:n,value:i,getColorScheme:u,addColorScheme:l,removeColorScheme:d};function l(o){const s=""+o+"",a="";e.classList?e.classList.add(s):e.className+=" "+s,a&&e.setAttribute("data-"+a,o)}function d(o){const s=""+o+"",a="";e.classList?e.classList.remove(s):e.className=e.className.replace(new RegExp(s,"g"),""),a&&e.removeAttribute("data-"+a)}function f(o){return t.matchMedia("(prefers-color-scheme"+o+")")}function u(){if(t.matchMedia&&f("").media!=="not all"){for(const o of c)if(f(":"+o).matches)return o}return"light"}})();function getStorageValue(t,e){switch(t){case"localStorage":return window.localStorage.getItem(e);case"sessionStorage":return window.sessionStorage.getItem(e);case"cookie":return getCookie(e);default:return null}}function getCookie(t){const c=("; "+window.document.cookie).split("; "+t+"=");if(c.length===2)return c.pop()?.split(";").shift()}</script></head><body><div id="__nuxt" class="isolate"></div><div id="teleports"></div><script>window.__NUXT__={};window.__NUXT__.config={public:{},app:{baseURL:"/__nuxt-og-image",buildId:"150c0674-b387-4525-9043-e05dd343db8e",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script><script type="application/json" data-nuxt-data="nuxt-app" data-ssr="false" id="__NUXT_DATA__">[{"prerenderedAt":1,"serverRendered":2},1776225190434,false]</script></body></html>
1
+ <!DOCTYPE html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><script type="importmap">{"imports":{"#entry":"/__nuxt-og-image/_nuxt/BlCLj09b.js"}}</script><link rel="stylesheet" href="/__nuxt-og-image/_nuxt/entry.DTjl7Lr7.css" crossorigin><link rel="stylesheet" href="/__nuxt-og-image/_nuxt/renderer-select.Do_uPaOg.css" crossorigin><link rel="stylesheet" href="/__nuxt-og-image/_nuxt/DevtoolsSection.C56mUBtZ.css" crossorigin><link rel="modulepreload" as="script" crossorigin href="/__nuxt-og-image/_nuxt/BlCLj09b.js"><link rel="modulepreload" as="script" crossorigin href="/__nuxt-og-image/_nuxt/CP0tQR2M.js"><link rel="modulepreload" as="script" crossorigin href="/__nuxt-og-image/_nuxt/DmsY5seq.js"><link rel="modulepreload" as="script" crossorigin href="/__nuxt-og-image/_nuxt/ClxM7Lmy.js"><link rel="modulepreload" as="script" crossorigin href="/__nuxt-og-image/_nuxt/B-y6Zfh-.js"><link rel="modulepreload" as="script" crossorigin href="/__nuxt-og-image/_nuxt/CN79P4uE.js"><link rel="modulepreload" as="script" crossorigin href="/__nuxt-og-image/_nuxt/QLqpVsIv.js"><link rel="modulepreload" as="script" crossorigin href="/__nuxt-og-image/_nuxt/H3aAOs4d.js"><script type="module" src="/__nuxt-og-image/_nuxt/BlCLj09b.js" crossorigin></script><script>"use strict";(()=>{const t=window,e=document.documentElement,c=["dark","light"],n=getStorageValue("localStorage","nuxt-color-mode")||"system";let i=n==="system"?u():n;const r=e.getAttribute("data-color-mode-forced");r&&(i=r),l(i),t["__NUXT_COLOR_MODE__"]={preference:n,value:i,getColorScheme:u,addColorScheme:l,removeColorScheme:d};function l(o){const s=""+o+"",a="";e.classList?e.classList.add(s):e.className+=" "+s,a&&e.setAttribute("data-"+a,o)}function d(o){const s=""+o+"",a="";e.classList?e.classList.remove(s):e.className=e.className.replace(new RegExp(s,"g"),""),a&&e.removeAttribute("data-"+a)}function f(o){return t.matchMedia("(prefers-color-scheme"+o+")")}function u(){if(t.matchMedia&&f("").media!=="not all"){for(const o of c)if(f(":"+o).matches)return o}return"light"}})();function getStorageValue(t,e){switch(t){case"localStorage":return window.localStorage.getItem(e);case"sessionStorage":return window.sessionStorage.getItem(e);case"cookie":return getCookie(e);default:return null}}function getCookie(t){const c=("; "+window.document.cookie).split("; "+t+"=");if(c.length===2)return c.pop()?.split(";").shift()}</script></head><body><div id="__nuxt" class="isolate"></div><div id="teleports"></div><script>window.__NUXT__={};window.__NUXT__.config={public:{},app:{baseURL:"/__nuxt-og-image",buildId:"cbeb6bb2-84a2-4c9c-a725-a30474eb2d1e",buildAssetsDir:"/_nuxt/",cdnURL:""}}</script><script type="application/json" data-nuxt-data="nuxt-app" data-ssr="false" id="__NUXT_DATA__">[{"prerenderedAt":1,"serverRendered":2},1776345728124,false]</script></body></html>
package/dist/module.cjs CHANGED
@@ -9,7 +9,7 @@ require('nuxt-site-config/kit');
9
9
  require('ohash');
10
10
  require('pathe');
11
11
  require('pkg-types');
12
- const module$1 = require('./shared/nuxt-og-image.C2oXAHiT.cjs');
12
+ const module$1 = require('./shared/nuxt-og-image.B55LvX3B.cjs');
13
13
  require('nuxtseo-shared/kit');
14
14
  require('../dist/runtime/logger.js');
15
15
  require('node:crypto');
package/dist/module.d.cts CHANGED
@@ -149,6 +149,17 @@ interface ModuleOptions {
149
149
  maxDpr?: number;
150
150
  /** Render timeout in milliseconds. Returns 408 on timeout. @default 15000 */
151
151
  renderTimeout?: number;
152
+ /**
153
+ * Per-image fetch timeout in milliseconds.
154
+ *
155
+ * Applies to remote `<img>` / `background-image` fetches done while resolving templates.
156
+ * A stalled resource can otherwise consume the entire `renderTimeout` budget, which
157
+ * shows up as near-total request timeouts on edge platforms (e.g. Cloudflare Workers
158
+ * when the image URL routes back through the same worker).
159
+ *
160
+ * @default 3000
161
+ */
162
+ imageFetchTimeout?: number;
152
163
  /**
153
164
  * Maximum allowed length (in characters) for the query string on runtime OG image requests.
154
165
  * Requests exceeding this limit receive a 400 response.
package/dist/module.d.mts CHANGED
@@ -149,6 +149,17 @@ interface ModuleOptions {
149
149
  maxDpr?: number;
150
150
  /** Render timeout in milliseconds. Returns 408 on timeout. @default 15000 */
151
151
  renderTimeout?: number;
152
+ /**
153
+ * Per-image fetch timeout in milliseconds.
154
+ *
155
+ * Applies to remote `<img>` / `background-image` fetches done while resolving templates.
156
+ * A stalled resource can otherwise consume the entire `renderTimeout` budget, which
157
+ * shows up as near-total request timeouts on edge platforms (e.g. Cloudflare Workers
158
+ * when the image URL routes back through the same worker).
159
+ *
160
+ * @default 3000
161
+ */
162
+ imageFetchTimeout?: number;
152
163
  /**
153
164
  * Maximum allowed length (in characters) for the query string on runtime OG image requests.
154
165
  * Requests exceeding this limit receive a 400 response.
package/dist/module.d.ts CHANGED
@@ -149,6 +149,17 @@ interface ModuleOptions {
149
149
  maxDpr?: number;
150
150
  /** Render timeout in milliseconds. Returns 408 on timeout. @default 15000 */
151
151
  renderTimeout?: number;
152
+ /**
153
+ * Per-image fetch timeout in milliseconds.
154
+ *
155
+ * Applies to remote `<img>` / `background-image` fetches done while resolving templates.
156
+ * A stalled resource can otherwise consume the entire `renderTimeout` budget, which
157
+ * shows up as near-total request timeouts on edge platforms (e.g. Cloudflare Workers
158
+ * when the image URL routes back through the same worker).
159
+ *
160
+ * @default 3000
161
+ */
162
+ imageFetchTimeout?: number;
152
163
  /**
153
164
  * Maximum allowed length (in characters) for the query string on runtime OG image requests.
154
165
  * Requests exceeding this limit receive a 400 response.
package/dist/module.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "nuxt": ">=3.16.0"
5
5
  },
6
6
  "configKey": "ogImage",
7
- "version": "6.4.2",
7
+ "version": "6.4.3",
8
8
  "builder": {
9
9
  "@nuxt/module-builder": "1.0.2",
10
10
  "unbuild": "3.6.1"
package/dist/module.mjs CHANGED
@@ -7,7 +7,7 @@ import 'nuxt-site-config/kit';
7
7
  import 'ohash';
8
8
  import 'pathe';
9
9
  import 'pkg-types';
10
- export { m as default } from './shared/nuxt-og-image.BK0-aZom.mjs';
10
+ export { m as default } from './shared/nuxt-og-image.BHvLMojr.mjs';
11
11
  import 'nuxtseo-shared/kit';
12
12
  import '../dist/runtime/logger.js';
13
13
  import 'node:crypto';
@@ -1,9 +1,28 @@
1
1
  import { componentNames } from "#build/nuxt-og-image/components.mjs";
2
2
  import { defu } from "defu";
3
- import { useHead, useRuntimeConfig } from "nuxt/app";
3
+ import { injectHead, useHead, useRuntimeConfig } from "nuxt/app";
4
4
  import { joinURL, withQuery } from "ufo";
5
5
  import { toValue } from "vue";
6
6
  import { buildOgImageUrl, generateMeta, separateProps } from "../shared.js";
7
+ const clientEntriesByHead = /* @__PURE__ */ new WeakMap();
8
+ function registerClientOgHead(ogKey, input, options) {
9
+ let entries;
10
+ try {
11
+ const head = injectHead();
12
+ if (head) {
13
+ entries = clientEntriesByHead.get(head);
14
+ if (!entries) {
15
+ entries = /* @__PURE__ */ new Map();
16
+ clientEntriesByHead.set(head, entries);
17
+ }
18
+ }
19
+ } catch {
20
+ }
21
+ entries?.get(ogKey)?.dispose();
22
+ const entry = useHead(input, options);
23
+ if (entry && entries)
24
+ entries.set(ogKey, entry);
25
+ }
7
26
  function resolveReactiveOptions(input) {
8
27
  const options = toValue(input);
9
28
  if (options === false)
@@ -56,16 +75,16 @@ export function clientProcessOgImageOptions(input, route, basePath) {
56
75
  }
57
76
  if (route.query)
58
77
  validOptions._query = route.query;
78
+ const ogKey = validOptions.key || "og";
59
79
  if (validOptions.url) {
60
80
  const url = validOptions.url;
61
- useHead({ meta: generateMeta(url, validOptions) }, { tagPriority: "high" });
81
+ registerClientOgHead(ogKey, { meta: generateMeta(url, validOptions) }, { tagPriority: "high" });
62
82
  paths.push(url);
63
83
  continue;
64
84
  }
65
85
  if (publicCfg.hasServerRuntime) {
66
- const ogKey = validOptions.key || "og";
67
86
  const finalUrl2 = buildResolverUrl(baseURL, basePath, ogKey, route.query);
68
- useHead({ meta: generateMeta(finalUrl2, validOptions) }, { tagPriority: 35 });
87
+ registerClientOgHead(ogKey, { meta: generateMeta(finalUrl2, validOptions) }, { tagPriority: 35 });
69
88
  paths.push(finalUrl2);
70
89
  continue;
71
90
  }
@@ -79,7 +98,7 @@ export function clientProcessOgImageOptions(input, route, basePath) {
79
98
  const result = buildOgImageUrl(urlOpts, extension, true, defaults, void 0);
80
99
  const resolvedUrl = joinURL("/", baseURL, result.url);
81
100
  const finalUrl = opts._query && Object.keys(opts._query).length ? withQuery(resolvedUrl, { _query: opts._query }) : resolvedUrl;
82
- useHead({ meta: generateMeta(finalUrl, opts) }, { processTemplateParams: true, tagPriority: 35 });
101
+ registerClientOgHead(ogKey, { meta: generateMeta(finalUrl, opts) }, { processTemplateParams: true, tagPriority: 35 });
83
102
  paths.push(finalUrl);
84
103
  }
85
104
  return paths;
@@ -1,27 +1,18 @@
1
1
  import { useRuntimeConfig } from "nitropack/runtime";
2
2
  import { withBase } from "ufo";
3
+ import { getCloudflareAssets } from "../../../util/cloudflareAssets.js";
4
+ import { fetchLocalAsset } from "../../../util/fetchLocalAsset.js";
5
+ import { getFetchTimeout } from "../../../util/fetchTimeout.js";
6
+ import { useOgImageRuntimeConfig } from "../../../utils.js";
3
7
  export async function resolve(event, font) {
4
8
  const path = font.src || font.localPath;
5
9
  const { app } = useRuntimeConfig();
6
10
  const fullPath = withBase(path, app.baseURL);
7
- const assets = event.context.cloudflare?.env?.ASSETS || event.context.ASSETS;
8
- if (assets && typeof assets.fetch === "function") {
9
- const origin = event.context.cloudflare?.request?.url || `https://${event.headers.get("host") || "localhost"}`;
10
- const url = new URL(fullPath, origin).href;
11
- const res = await assets.fetch(url).catch(() => null);
12
- if (res?.ok) {
13
- return Buffer.from(await res.arrayBuffer());
14
- }
15
- }
16
- if (typeof event.fetch === "function") {
17
- const origin = event.context.cloudflare?.request?.url || `https://${event.headers.get("host") || "localhost"}`;
18
- const url = new URL(fullPath, origin).href;
19
- const res = await event.fetch(url).catch(() => null);
20
- if (res?.ok) {
21
- return Buffer.from(await res.arrayBuffer());
22
- }
23
- }
24
- if (!assets && !event.context._ogImageWarnedMissingAssets) {
11
+ const timeout = getFetchTimeout(useOgImageRuntimeConfig());
12
+ const ab = await fetchLocalAsset(event, fullPath, { fetchTimeout: timeout });
13
+ if (ab)
14
+ return Buffer.from(ab);
15
+ if (!getCloudflareAssets(event) && !event.context._ogImageWarnedMissingAssets) {
25
16
  event.context._ogImageWarnedMissingAssets = true;
26
17
  console.warn(
27
18
  `[Nuxt OG Image] No ASSETS binding found on Cloudflare Workers. Font loading will fail. To fix this, add \`nitro: { cloudflare: { deployConfig: true } }\` to your nuxt.config and deploy with \`npx wrangler --cwd .output deploy\` instead of using the --assets flag.`
@@ -4,6 +4,8 @@ import { getRequestURL } from "h3";
4
4
  import { useRuntimeConfig } from "nitropack/runtime";
5
5
  import { join } from "pathe";
6
6
  import { withBase } from "ufo";
7
+ import { getFetchTimeout } from "../../../util/fetchTimeout.js";
8
+ import { useOgImageRuntimeConfig } from "../../../utils.js";
7
9
  let fontUrlMapping;
8
10
  async function loadFontUrlMapping() {
9
11
  if (fontUrlMapping)
@@ -14,6 +16,7 @@ async function loadFontUrlMapping() {
14
16
  }
15
17
  export async function resolve(event, font) {
16
18
  const path = font.src || font.localPath;
19
+ const timeout = getFetchTimeout(useOgImageRuntimeConfig());
17
20
  if (font.absolutePath) {
18
21
  const data = await readFile(font.absolutePath).catch(() => null);
19
22
  if (data?.length)
@@ -33,7 +36,7 @@ export async function resolve(event, font) {
33
36
  return cached;
34
37
  const mapping = await loadFontUrlMapping();
35
38
  if (mapping[filename2]) {
36
- const res = await fetch(mapping[filename2]).catch(() => null);
39
+ const res = await fetch(mapping[filename2], { signal: AbortSignal.timeout(timeout) }).catch(() => null);
37
40
  if (res?.ok)
38
41
  return Buffer.from(await res.arrayBuffer());
39
42
  }
@@ -54,7 +57,7 @@ export async function resolve(event, font) {
54
57
  const filename = path.slice("/_fonts/".length);
55
58
  const mapping = await loadFontUrlMapping();
56
59
  if (mapping[filename]) {
57
- const res = await fetch(mapping[filename]).catch(() => null);
60
+ const res = await fetch(mapping[filename], { signal: AbortSignal.timeout(timeout) }).catch(() => null);
58
61
  if (res?.ok)
59
62
  return Buffer.from(await res.arrayBuffer());
60
63
  }
@@ -70,14 +73,15 @@ export async function resolve(event, font) {
70
73
  const reqUrl = getRequestURL(event);
71
74
  const origin = `${reqUrl.protocol}//${reqUrl.host}`;
72
75
  const url = new URL(withBase(path, app.baseURL), origin).href;
73
- const res = await fetch(url).catch(() => null);
76
+ const res = await fetch(url, { signal: AbortSignal.timeout(timeout) }).catch(() => null);
74
77
  if (res?.ok) {
75
78
  return Buffer.from(await res.arrayBuffer());
76
79
  }
77
80
  }
78
81
  const fullPath = withBase(path, app.baseURL);
79
82
  const arrayBuffer = await event.$fetch(fullPath, {
80
- responseType: "arrayBuffer"
83
+ responseType: "arrayBuffer",
84
+ timeout
81
85
  });
82
86
  return Buffer.from(arrayBuffer);
83
87
  }
@@ -1,17 +1,21 @@
1
1
  import { getNitroOrigin } from "#site-config/server/composables";
2
2
  import { useRuntimeConfig } from "nitropack/runtime";
3
3
  import { withBase } from "ufo";
4
+ import { getFetchTimeout } from "../../../util/fetchTimeout.js";
5
+ import { useOgImageRuntimeConfig } from "../../../utils.js";
4
6
  export async function resolve(event, font) {
5
7
  const path = font.src || font.localPath;
6
8
  const { app } = useRuntimeConfig();
7
9
  const fullPath = withBase(path, app.baseURL);
8
10
  const origin = getNitroOrigin(event);
9
- const res = await fetch(new URL(fullPath, origin).href).catch(() => null);
11
+ const timeout = getFetchTimeout(useOgImageRuntimeConfig());
12
+ const res = await fetch(new URL(fullPath, origin).href, { signal: AbortSignal.timeout(timeout) }).catch(() => null);
10
13
  if (res?.ok) {
11
14
  return Buffer.from(await res.arrayBuffer());
12
15
  }
13
16
  const arrayBuffer = await event.$fetch(fullPath, {
14
- responseType: "arrayBuffer"
17
+ responseType: "arrayBuffer",
18
+ timeout
15
19
  });
16
20
  return Buffer.from(arrayBuffer);
17
21
  }
@@ -1,4 +1,4 @@
1
1
  import type { Buffer } from 'node:buffer';
2
2
  import type { Browser } from 'playwright-core';
3
3
  import type { OgImageRenderEventContext } from '../../../types.js';
4
- export declare function createScreenshot({ basePath, e, options, extension }: OgImageRenderEventContext, browser: Browser): Promise<Buffer>;
4
+ export declare function createScreenshot({ basePath, e, options, extension, timings }: OgImageRenderEventContext, browser: Browser): Promise<Buffer>;
@@ -2,6 +2,7 @@ import { getNitroOrigin } from "#site-config/server/composables";
2
2
  import { withQuery } from "ufo";
3
3
  import { toValue } from "vue";
4
4
  import { buildOgImageUrl } from "../../../shared.js";
5
+ import { getFetchTimeout } from "../../util/fetchTimeout.js";
5
6
  import { logger } from "../../util/logger.js";
6
7
  import { useOgImageRuntimeConfig } from "../../utils.js";
7
8
  function isPlaywrightPage(page) {
@@ -53,8 +54,9 @@ async function takeScreenshot(page, selector, options) {
53
54
  }
54
55
  return await page.screenshot(puppeteerOptions);
55
56
  }
56
- export async function createScreenshot({ basePath, e, options, extension }, browser) {
57
- const { colorPreference, defaults, security } = useOgImageRuntimeConfig();
57
+ export async function createScreenshot({ basePath, e, options, extension, timings }, browser) {
58
+ const runtimeConfig = useOgImageRuntimeConfig();
59
+ const { colorPreference, defaults, security } = runtimeConfig;
58
60
  const path = options.component === "PageScreenshot" ? basePath : buildOgImageUrl(options, "html", false, defaults, security?.secret || void 0).url;
59
61
  let page;
60
62
  if (typeof browser.newPage === "function" && browser.newPage.length === 0) {
@@ -75,7 +77,7 @@ export async function createScreenshot({ basePath, e, options, extension }, brow
75
77
  logger.warn("The `html` option is deprecated and will be removed in the next major version. Use a Vue component instead.");
76
78
  }
77
79
  if (import.meta.prerender && !options.html) {
78
- options.html = await e.$fetch(path).catch(() => void 0);
80
+ options.html = await timings.measure("html-fetch", () => e.$fetch(path, { timeout: getFetchTimeout(runtimeConfig) }).catch(() => void 0));
79
81
  }
80
82
  await setViewport(
81
83
  page,
@@ -112,7 +114,7 @@ export async function createScreenshot({ basePath, e, options, extension }, brow
112
114
  el.style.display = "none";
113
115
  }, _options.mask);
114
116
  }
115
- return await takeScreenshot(page, _options.selector, screenshotOptions);
117
+ return await timings.measure("render-browser", () => takeScreenshot(page, _options.selector, screenshotOptions));
116
118
  } finally {
117
119
  await page.close();
118
120
  }
@@ -12,6 +12,7 @@ import { decodeOgImageParams, extractEncodedSegment, sanitizeProps, separateProp
12
12
  import { autoEjectCommunityTemplate } from "../util/auto-eject.js";
13
13
  import { createNitroRouteRuleMatcher } from "../util/kit.js";
14
14
  import { normaliseOptions } from "../util/options.js";
15
+ import { createTimings, TIMING_CTX_KEY } from "../util/timings.js";
15
16
  import { useOgImageRuntimeConfig } from "../utils.js";
16
17
  import { getBrowserRenderer, getSatoriRenderer, getTakumiRenderer } from "./instances.js";
17
18
  const RE_HASH_MODE = /^o_([a-z0-9]+)$/i;
@@ -186,6 +187,8 @@ export async function resolveContext(e) {
186
187
  statusMessage: `[Nuxt OG Image] Renderer "${rendererType}" is not available. Component "${normalised.component?.pascalName}" requires the ${rendererType} renderer but it's not bundled for this preset.`
187
188
  });
188
189
  }
190
+ const timings = e.context[TIMING_CTX_KEY] || createTimings();
191
+ e.context[TIMING_CTX_KEY] = timings;
189
192
  const ctx = {
190
193
  e,
191
194
  key,
@@ -196,6 +199,7 @@ export async function resolveContext(e) {
196
199
  extension,
197
200
  basePath,
198
201
  options: normalised.options,
202
+ timings,
199
203
  _nitro: useNitroApp()
200
204
  };
201
205
  await ctx._nitro.hooks.callHook("nuxt-og-image:context", ctx);