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.
- package/dist/chunks/tw4.cjs +1 -1
- package/dist/chunks/tw4.mjs +1 -1
- package/dist/chunks/uno.cjs +1 -1
- package/dist/chunks/uno.mjs +1 -1
- package/dist/devtools/200.html +1 -1
- package/dist/devtools/404.html +1 -1
- package/dist/devtools/_nuxt/{BWm573-p.js → B-y6Zfh-.js} +1 -1
- package/dist/devtools/_nuxt/{w_tq7NMl.js → B5qFn-Gu.js} +1 -1
- package/dist/devtools/_nuxt/{CHeKziWa.js → BVne4GIn.js} +1 -1
- package/dist/devtools/_nuxt/{yBiBpwD7.js → BlCLj09b.js} +6 -6
- package/dist/devtools/_nuxt/CN79P4uE.js +6 -0
- package/dist/devtools/_nuxt/{Cy0omYQh.js → ClxM7Lmy.js} +1 -1
- package/dist/devtools/_nuxt/{DziLl24l.js → CwlJb64V.js} +1 -1
- package/dist/devtools/_nuxt/{BsivBvAU.js → D7u0rku6.js} +1 -1
- package/dist/devtools/_nuxt/DevtoolsSection.C56mUBtZ.css +1 -0
- package/dist/devtools/_nuxt/DevtoolsSnippet.BfzotPc4.css +1 -0
- package/dist/devtools/_nuxt/{BQDcSiMf.js → H3aAOs4d.js} +1 -1
- package/dist/devtools/_nuxt/{B6Dg3dZ6.js → QLqpVsIv.js} +1 -1
- package/dist/devtools/_nuxt/builds/latest.json +1 -1
- package/dist/devtools/_nuxt/builds/meta/cbeb6bb2-84a2-4c9c-a725-a30474eb2d1e.json +1 -0
- package/dist/devtools/_nuxt/{entry.BjD2aghs.css → entry.DTjl7Lr7.css} +1 -1
- package/dist/devtools/_nuxt/{pages.DO0dnDUs.css → pages.DqKYLiSy.css} +1 -1
- package/dist/devtools/_nuxt/renderer-select.Do_uPaOg.css +1 -0
- package/dist/devtools/_nuxt/{BMVWkjCo.js → rybsNufq.js} +1 -1
- package/dist/devtools/debug/index.html +1 -1
- package/dist/devtools/docs/index.html +1 -1
- package/dist/devtools/index.html +1 -1
- package/dist/devtools/templates/index.html +1 -1
- package/dist/module.cjs +1 -1
- package/dist/module.d.cts +11 -0
- package/dist/module.d.mts +11 -0
- package/dist/module.d.ts +11 -0
- package/dist/module.json +1 -1
- package/dist/module.mjs +1 -1
- package/dist/runtime/app/client-utils.js +24 -5
- package/dist/runtime/server/og-image/bindings/font-assets/cloudflare.js +9 -18
- package/dist/runtime/server/og-image/bindings/font-assets/dev-prerender.js +8 -4
- package/dist/runtime/server/og-image/bindings/font-assets/node.js +6 -2
- package/dist/runtime/server/og-image/browser/screenshot.d.ts +1 -1
- package/dist/runtime/server/og-image/browser/screenshot.js +6 -4
- package/dist/runtime/server/og-image/context.js +4 -0
- package/dist/runtime/server/og-image/core/plugins/imageSrc.js +106 -99
- package/dist/runtime/server/og-image/core/transforms/emojis/fetch.js +23 -12
- package/dist/runtime/server/og-image/satori/renderer.js +16 -14
- package/dist/runtime/server/og-image/takumi/renderer.js +27 -19
- package/dist/runtime/server/util/cloudflareAssets.d.ts +24 -0
- package/dist/runtime/server/util/cloudflareAssets.js +16 -0
- package/dist/runtime/server/util/eventHandlers.js +28 -5
- package/dist/runtime/server/util/fetchLocalAsset.d.ts +25 -0
- package/dist/runtime/server/util/fetchLocalAsset.js +34 -0
- package/dist/runtime/server/util/fetchTimeout.d.ts +2 -0
- package/dist/runtime/server/util/fetchTimeout.js +7 -0
- package/dist/runtime/server/util/timings.d.ts +17 -0
- package/dist/runtime/server/util/timings.js +75 -0
- package/dist/runtime/types.d.ts +3 -0
- package/dist/shared/{nuxt-og-image.C2oXAHiT.cjs → nuxt-og-image.B55LvX3B.cjs} +2 -1
- package/dist/shared/{nuxt-og-image.BK0-aZom.mjs → nuxt-og-image.BHvLMojr.mjs} +1 -0
- package/package.json +6 -6
- package/dist/devtools/_nuxt/DDRo8-tD.js +0 -6
- package/dist/devtools/_nuxt/DevtoolsSection.C-PGRg5f.css +0 -1
- package/dist/devtools/_nuxt/DevtoolsSnippet.BipAyEUC.css +0 -1
- package/dist/devtools/_nuxt/builds/meta/150c0674-b387-4525-9043-e05dd343db8e.json +0 -1
- 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/
|
|
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/
|
|
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/devtools/index.html
CHANGED
|
@@ -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/
|
|
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/
|
|
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.
|
|
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
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.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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
|
|
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
|
|
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);
|