nuxt-og-image 1.0.0 → 1.2.0

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.
@@ -1 +1 @@
1
- import{s as n,v as a,o as r,l,x as e,t as s,y as d,z as c,A as p,B as f,C as x,D as h}from"./entry.9b6fba4b.js";const m=t=>(x("data-v-18337f8d"),t=t(),h(),t),u={class:"font-sans antialiased bg-white dark:bg-black text-black dark:text-white grid min-h-screen place-content-center overflow-hidden"},g=m(()=>e("div",{class:"fixed left-0 right-0 spotlight z-10"},null,-1)),_={class:"max-w-520px text-center z-20"},b=["textContent"],y=["textContent"],w={class:"w-full flex items-center justify-center"},S={__name:"error-404",props:{appName:{type:String,default:"Nuxt"},version:{type:String,default:""},statusCode:{type:Number,default:404},statusMessage:{type:String,default:"Not Found"},description:{type:String,default:"Sorry, the page you are looking for could not be found."},backHome:{type:String,default:"Go back home"}},setup(t){const o=t;return a({title:`${o.statusCode} - ${o.statusMessage} | ${o.appName}`,script:[],style:[{children:'*,:before,:after{-webkit-box-sizing:border-box;box-sizing:border-box;border-width:0;border-style:solid;border-color:#e0e0e0}*{--tw-ring-inset:var(--tw-empty, );--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(14, 165, 233, .5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000}:root{-moz-tab-size:4;-o-tab-size:4;tab-size:4}a{color:inherit;text-decoration:inherit}body{margin:0;font-family:inherit;line-height:inherit}html{-webkit-text-size-adjust:100%;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";line-height:1.5}h1,p{margin:0}h1{font-size:inherit;font-weight:inherit}'}]}),(k,v)=>{const i=p;return r(),l("div",u,[g,e("div",_,[e("h1",{class:"text-8xl sm:text-10xl font-medium mb-8",textContent:s(t.statusCode)},null,8,b),e("p",{class:"text-xl px-8 sm:px-0 sm:text-4xl font-light mb-16 leading-tight",textContent:s(t.description)},null,8,y),e("div",w,[d(i,{to:"/",class:"gradient-border text-md sm:text-xl py-2 px-4 sm:py-3 sm:px-6 cursor-pointer"},{default:c(()=>[f(s(t.backHome),1)]),_:1})])])])}}},z=n(S,[["__scopeId","data-v-18337f8d"]]);export{z as default};
1
+ import{s as n,v as a,o as r,l,x as e,t as s,y as d,z as c,A as p,B as f,C as x,D as h}from"./entry.df5ad46e.js";const m=t=>(x("data-v-18337f8d"),t=t(),h(),t),u={class:"font-sans antialiased bg-white dark:bg-black text-black dark:text-white grid min-h-screen place-content-center overflow-hidden"},g=m(()=>e("div",{class:"fixed left-0 right-0 spotlight z-10"},null,-1)),_={class:"max-w-520px text-center z-20"},b=["textContent"],y=["textContent"],w={class:"w-full flex items-center justify-center"},S={__name:"error-404",props:{appName:{type:String,default:"Nuxt"},version:{type:String,default:""},statusCode:{type:Number,default:404},statusMessage:{type:String,default:"Not Found"},description:{type:String,default:"Sorry, the page you are looking for could not be found."},backHome:{type:String,default:"Go back home"}},setup(t){const o=t;return a({title:`${o.statusCode} - ${o.statusMessage} | ${o.appName}`,script:[],style:[{children:'*,:before,:after{-webkit-box-sizing:border-box;box-sizing:border-box;border-width:0;border-style:solid;border-color:#e0e0e0}*{--tw-ring-inset:var(--tw-empty, );--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(14, 165, 233, .5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000}:root{-moz-tab-size:4;-o-tab-size:4;tab-size:4}a{color:inherit;text-decoration:inherit}body{margin:0;font-family:inherit;line-height:inherit}html{-webkit-text-size-adjust:100%;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";line-height:1.5}h1,p{margin:0}h1{font-size:inherit;font-weight:inherit}'}]}),(k,v)=>{const i=p;return r(),l("div",u,[g,e("div",_,[e("h1",{class:"text-8xl sm:text-10xl font-medium mb-8",textContent:s(t.statusCode)},null,8,b),e("p",{class:"text-xl px-8 sm:px-0 sm:text-4xl font-light mb-16 leading-tight",textContent:s(t.description)},null,8,y),e("div",w,[d(i,{to:"/",class:"gradient-border text-md sm:text-xl py-2 px-4 sm:py-3 sm:px-6 cursor-pointer"},{default:c(()=>[f(s(t.backHome),1)]),_:1})])])])}}},z=n(S,[["__scopeId","data-v-18337f8d"]]);export{z as default};
@@ -1 +1 @@
1
- import{s as i,v as a,o as r,l as n,x as e,t as s,C as l,D as d}from"./entry.9b6fba4b.js";const c=t=>(l("data-v-428e244b"),t=t(),d(),t),p={class:"font-sans antialiased bg-white dark:bg-black text-black dark:text-white grid min-h-screen place-content-center overflow-hidden"},h=c(()=>e("div",{class:"fixed -bottom-1/2 left-0 right-0 h-1/2 spotlight"},null,-1)),f={class:"max-w-520px text-center"},g=["textContent"],m=["textContent"],x={__name:"error-500",props:{appName:{type:String,default:"Nuxt"},version:{type:String,default:""},statusCode:{type:Number,default:500},statusMessage:{type:String,default:"Server error"},description:{type:String,default:"This page is temporarily unavailable."}},setup(t){const o=t;return a({title:`${o.statusCode} - ${o.statusMessage} | ${o.appName}`,script:[],style:[{children:'*,:before,:after{-webkit-box-sizing:border-box;box-sizing:border-box;border-width:0;border-style:solid;border-color:#e0e0e0}*{--tw-ring-inset:var(--tw-empty, );--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(14, 165, 233, .5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000}:root{-moz-tab-size:4;-o-tab-size:4;tab-size:4}body{margin:0;font-family:inherit;line-height:inherit}html{-webkit-text-size-adjust:100%;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";line-height:1.5}h1,p{margin:0}h1{font-size:inherit;font-weight:inherit}'}]}),(b,u)=>(r(),n("div",p,[h,e("div",f,[e("h1",{class:"text-8xl sm:text-10xl font-medium mb-8",textContent:s(t.statusCode)},null,8,g),e("p",{class:"text-xl px-8 sm:px-0 sm:text-4xl font-light mb-16 leading-tight",textContent:s(t.description)},null,8,m)])]))}},w=i(x,[["__scopeId","data-v-428e244b"]]);export{w as default};
1
+ import{s as i,v as a,o as r,l as n,x as e,t as s,C as l,D as d}from"./entry.df5ad46e.js";const c=t=>(l("data-v-428e244b"),t=t(),d(),t),p={class:"font-sans antialiased bg-white dark:bg-black text-black dark:text-white grid min-h-screen place-content-center overflow-hidden"},h=c(()=>e("div",{class:"fixed -bottom-1/2 left-0 right-0 h-1/2 spotlight"},null,-1)),f={class:"max-w-520px text-center"},g=["textContent"],m=["textContent"],x={__name:"error-500",props:{appName:{type:String,default:"Nuxt"},version:{type:String,default:""},statusCode:{type:Number,default:500},statusMessage:{type:String,default:"Server error"},description:{type:String,default:"This page is temporarily unavailable."}},setup(t){const o=t;return a({title:`${o.statusCode} - ${o.statusMessage} | ${o.appName}`,script:[],style:[{children:'*,:before,:after{-webkit-box-sizing:border-box;box-sizing:border-box;border-width:0;border-style:solid;border-color:#e0e0e0}*{--tw-ring-inset:var(--tw-empty, );--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(14, 165, 233, .5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000}:root{-moz-tab-size:4;-o-tab-size:4;tab-size:4}body{margin:0;font-family:inherit;line-height:inherit}html{-webkit-text-size-adjust:100%;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";line-height:1.5}h1,p{margin:0}h1{font-size:inherit;font-weight:inherit}'}]}),(b,u)=>(r(),n("div",p,[h,e("div",f,[e("h1",{class:"text-8xl sm:text-10xl font-medium mb-8",textContent:s(t.statusCode)},null,8,g),e("p",{class:"text-xl px-8 sm:px-0 sm:text-4xl font-light mb-16 leading-tight",textContent:s(t.description)},null,8,m)])]))}},w=i(x,[["__scopeId","data-v-428e244b"]]);export{w as default};
@@ -1,3 +1,3 @@
1
- import{d as n,_ as o,o as _,c as f,n as g,g as E,u as r}from"./entry.9b6fba4b.js";const k={__name:"nuxt-error-page",props:{error:Object},setup(t){(t.error.stack||"").split(`
1
+ import{d as n,_ as o,o as _,c as f,n as g,g as E,u as r}from"./entry.df5ad46e.js";const k={__name:"nuxt-error-page",props:{error:Object},setup(t){(t.error.stack||"").split(`
2
2
  `).splice(1).map(e=>({text:e.replace("webpack:/","").replace(".vue",".js").trim(),internal:e.includes("node_modules")&&!e.includes(".cache")||e.includes("internal")||e.includes("new Promise")})).map(e=>`<span class="stack${e.internal?" internal":""}">${e.text}</span>`).join(`
3
- `);const s=Number(t.error.statusCode||500),a=s===404,c=t.error.statusMessage??(a?"Page Not Found":"Internal Server Error"),u=t.error.message||t.error.toString(),i=void 0,d=n(()=>o(()=>import("./error-404.67bc6c65.js"),["./error-404.67bc6c65.js","./entry.9b6fba4b.js","./entry.dc5450bf.css","./error-404.68aa58b4.css"],import.meta.url).then(e=>e.default||e)),l=n(()=>o(()=>import("./error-500.e3a6cf7c.js"),["./error-500.e3a6cf7c.js","./entry.9b6fba4b.js","./entry.dc5450bf.css","./error-500.dc5710d1.css"],import.meta.url).then(e=>e.default||e)),m=a?d:l;return(e,p)=>(_(),f(r(m),g(E({statusCode:r(s),statusMessage:r(c),description:r(u),stack:r(i)})),null,16))}},v=k;export{v as default};
3
+ `);const s=Number(t.error.statusCode||500),a=s===404,c=t.error.statusMessage??(a?"Page Not Found":"Internal Server Error"),u=t.error.message||t.error.toString(),i=void 0,d=n(()=>o(()=>import("./error-404.8c9bfe7d.js"),["./error-404.8c9bfe7d.js","./entry.df5ad46e.js","./entry.dc5450bf.css","./error-404.68aa58b4.css"],import.meta.url).then(e=>e.default||e)),l=n(()=>o(()=>import("./error-500.cb171c6a.js"),["./error-500.cb171c6a.js","./entry.df5ad46e.js","./entry.dc5450bf.css","./error-500.dc5710d1.css"],import.meta.url).then(e=>e.default||e)),m=a?d:l;return(e,p)=>(_(),f(r(m),g(E({statusCode:r(s),statusMessage:r(c),description:r(u),stack:r(i)})),null,16))}},v=k;export{v as default};
@@ -1,7 +1,7 @@
1
1
  <!DOCTYPE html>
2
2
  <html >
3
3
  <head><meta charset="utf-8">
4
- <meta name="viewport" content="width=device-width, initial-scale=1"><link rel="modulepreload" as="script" crossorigin href="/__nuxt_og_image__/client/_nuxt/entry.9b6fba4b.js"><link rel="preload" as="style" href="/__nuxt_og_image__/client/_nuxt/entry.dc5450bf.css"><link rel="prefetch" as="script" crossorigin href="/__nuxt_og_image__/client/_nuxt/error-component.6baa49ee.js"><link rel="stylesheet" href="/__nuxt_og_image__/client/_nuxt/entry.dc5450bf.css"><script>"use strict";const w=window,de=document.documentElement,knownColorSchemes=["dark","light"],preference=window.localStorage.getItem("nuxt-color-mode")||"system";let value=preference==="system"?getColorScheme():preference;const forcedColorMode=de.getAttribute("data-color-mode-forced");forcedColorMode&&(value=forcedColorMode),addColorScheme(value),w["__NUXT_COLOR_MODE__"]={preference,value,getColorScheme,addColorScheme,removeColorScheme};function addColorScheme(e){const o=""+e+"",t="";de.classList?de.classList.add(o):de.className+=" "+o,t&&de.setAttribute("data-"+t,e)}function removeColorScheme(e){const o=""+e+"",t="";de.classList?de.classList.remove(o):de.className=de.className.replace(new RegExp(o,"g"),""),t&&de.removeAttribute("data-"+t)}function prefersColorScheme(e){return w.matchMedia("(prefers-color-scheme"+e+")")}function getColorScheme(){if(w.matchMedia&&prefersColorScheme("").media!=="not all"){for(const e of knownColorSchemes)if(prefersColorScheme(":"+e).matches)return e}return"light"}
4
+ <meta name="viewport" content="width=device-width, initial-scale=1"><link rel="modulepreload" as="script" crossorigin href="/__nuxt_og_image__/client/_nuxt/entry.df5ad46e.js"><link rel="preload" as="style" href="/__nuxt_og_image__/client/_nuxt/entry.dc5450bf.css"><link rel="prefetch" as="script" crossorigin href="/__nuxt_og_image__/client/_nuxt/error-component.c6b1c57b.js"><link rel="stylesheet" href="/__nuxt_og_image__/client/_nuxt/entry.dc5450bf.css"><script>"use strict";const w=window,de=document.documentElement,knownColorSchemes=["dark","light"],preference=window.localStorage.getItem("nuxt-color-mode")||"system";let value=preference==="system"?getColorScheme():preference;const forcedColorMode=de.getAttribute("data-color-mode-forced");forcedColorMode&&(value=forcedColorMode),addColorScheme(value),w["__NUXT_COLOR_MODE__"]={preference,value,getColorScheme,addColorScheme,removeColorScheme};function addColorScheme(e){const o=""+e+"",t="";de.classList?de.classList.add(o):de.className+=" "+o,t&&de.setAttribute("data-"+t,e)}function removeColorScheme(e){const o=""+e+"",t="";de.classList?de.classList.remove(o):de.className=de.className.replace(new RegExp(o,"g"),""),t&&de.removeAttribute("data-"+t)}function prefersColorScheme(e){return w.matchMedia("(prefers-color-scheme"+e+")")}function getColorScheme(){if(w.matchMedia&&prefersColorScheme("").media!=="not all"){for(const e of knownColorSchemes)if(prefersColorScheme(":"+e).matches)return e}return"light"}
5
5
  </script></head>
6
- <body ><div id="__nuxt"></div><script>window.__NUXT__={serverRendered:false,config:{public:{},app:{baseURL:"\u002F__nuxt_og_image__\u002Fclient",buildAssetsDir:"\u002F_nuxt\u002F",cdnURL:""}},data:{},state:{}}</script><script type="module" src="/__nuxt_og_image__/client/_nuxt/entry.9b6fba4b.js" crossorigin></script></body>
6
+ <body ><div id="__nuxt"></div><script>window.__NUXT__={serverRendered:false,config:{public:{},app:{baseURL:"\u002F__nuxt_og_image__\u002Fclient",buildAssetsDir:"\u002F_nuxt\u002F",cdnURL:""}},data:{},state:{}}</script><script type="module" src="/__nuxt_og_image__/client/_nuxt/entry.df5ad46e.js" crossorigin></script></body>
7
7
  </html>
package/dist/module.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "nuxt-og-image",
3
3
  "compatibility": {
4
- "nuxt": "^3.0.0",
4
+ "nuxt": "^3.1.0",
5
5
  "bridge": false
6
6
  },
7
7
  "configKey": "ogImage",
8
- "version": "1.0.0"
8
+ "version": "1.2.0"
9
9
  }
package/dist/module.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  import { mkdir, writeFile } from 'node:fs/promises';
2
2
  import { existsSync } from 'fs';
3
- import { useNuxt, addTemplate, defineNuxtModule, createResolver, getNuxtVersion, useLogger, addServerHandler, addImports, addComponent } from '@nuxt/kit';
3
+ import { useNuxt, addTemplate, defineNuxtModule, createResolver, addServerHandler, addImports, addComponent } from '@nuxt/kit';
4
4
  import { execa } from 'execa';
5
5
  import chalk from 'chalk';
6
6
  import defu from 'defu';
@@ -10,6 +10,7 @@ import { resolve, relative } from 'pathe';
10
10
  import { tinyws } from 'tinyws';
11
11
  import sirv from 'sirv';
12
12
  import { copy } from 'fs-extra';
13
+ import { provider } from 'std-env';
13
14
  import { createBirpcGroup } from 'birpc';
14
15
  import { stringify, parse } from 'flatted';
15
16
 
@@ -58,24 +59,6 @@ async function screenshot(browser, url, options) {
58
59
  return await page.screenshot();
59
60
  }
60
61
 
61
- function exposeConfig(alias, filename, config) {
62
- const exports = Object.entries(config).map(([k, v]) => `export const ${k} = ${JSON.stringify(v)}`).join("\n");
63
- useNuxt().options.alias[alias] = addTemplate({
64
- filename,
65
- getContents: () => exports
66
- }).dst;
67
- useNuxt().hooks.hook("nitro:config", (nitroConfig) => {
68
- nitroConfig.virtual[alias] = exports;
69
- });
70
- }
71
- function extractOgImageOptions(html) {
72
- const options = html.match(/<script id="nuxt-og-image-options" type="application\/json">(.+?)<\/script>/)?.[1];
73
- return options ? JSON.parse(options) : false;
74
- }
75
- function stripOgImageOptions(html) {
76
- return html.replace(/<script id="nuxt-og-image-options" type="application\/json">(.*?)<\/script>/, "");
77
- }
78
-
79
62
  function setupPlaygroundRPC(nuxt, config) {
80
63
  const serverFunctions = {
81
64
  getConfig() {
@@ -158,6 +141,48 @@ function getBodyJson(req) {
158
141
  });
159
142
  }
160
143
 
144
+ function exposeModuleConfig(moduleName, config) {
145
+ const nuxt = useNuxt();
146
+ const jsExports = Object.entries(config).map(([k, v]) => `export const ${k} = ${JSON.stringify(v)}`).join("\n");
147
+ const alias = `#${moduleName}/config`;
148
+ nuxt.options.alias[alias] = addTemplate({
149
+ filename: `modules/config/${moduleName}.mjs`,
150
+ getContents: () => jsExports
151
+ }).dst;
152
+ nuxt.hooks.hook("nitro:config", (nitroConfig) => {
153
+ nitroConfig.virtual[alias] = jsExports;
154
+ });
155
+ const typeDefName = `modules/config/${moduleName}.d.ts`;
156
+ const tsExports = Object.keys(config).map((k) => {
157
+ if (nuxt.options.dev)
158
+ return ` export const ${k}: ${JSON.stringify(config[k])} | ModuleOptions['${k}']`;
159
+ return ` export const ${k}: ModuleOptions['${k}']`;
160
+ }).join("\n");
161
+ addTemplate({
162
+ filename: typeDefName,
163
+ getContents: () => {
164
+ return `// generated by ${moduleName}
165
+ import type { ModuleOptions } from '${moduleName}'
166
+ declare module '${alias}' {
167
+ ${tsExports}
168
+ }
169
+ `;
170
+ }
171
+ });
172
+ nuxt.hooks.hook("prepare:types", ({ references }) => {
173
+ references.push({ path: resolve(nuxt.options.buildDir, typeDefName) });
174
+ });
175
+ return alias;
176
+ }
177
+
178
+ function extractOgImageOptions(html) {
179
+ const options = html.match(/<script id="nuxt-og-image-options" type="application\/json">(.+?)<\/script>/)?.[1];
180
+ return options ? JSON.parse(options) : false;
181
+ }
182
+ function stripOgImageOptions(html) {
183
+ return html.replace(/<script id="nuxt-og-image-options" type="application\/json">(.*?)<\/script>/, "");
184
+ }
185
+
161
186
  const PATH = "/__nuxt_og_image__";
162
187
  const PATH_ENTRY = `${PATH}/entry`;
163
188
  const PATH_PLAYGROUND = `${PATH}/client`;
@@ -165,7 +190,7 @@ const module = defineNuxtModule({
165
190
  meta: {
166
191
  name: "nuxt-og-image",
167
192
  compatibility: {
168
- nuxt: "^3.0.0",
193
+ nuxt: "^3.1.0",
169
194
  bridge: false
170
195
  },
171
196
  configKey: "ogImage"
@@ -195,11 +220,7 @@ const module = defineNuxtModule({
195
220
  return resolve(`../dist/${p}`);
196
221
  };
197
222
  nuxt.options.experimental.componentIslands = true;
198
- const isEdge = (process.env.NITRO_PRESET || "").includes("edge");
199
- const hasIslandSupport = getNuxtVersion(nuxt) !== "3.0.0";
200
- const logger = useLogger("nuxt-og-image");
201
- if (!hasIslandSupport)
202
- logger.warn("You are using Nuxt 3.0.0 with `nuxt-og-image`, which only supports screenshots.\nPlease upgrade to Nuxt 3.0.1 or the edge channel: https://nuxt.com/docs/guide/going-further/edge-channel.");
223
+ const isEdge = provider === "stackblitz" || (process.env.NITRO_PRESET || "").includes("edge");
203
224
  addTemplate({
204
225
  filename: "nuxt-og-image.d.ts",
205
226
  getContents: () => {
@@ -265,7 +286,7 @@ export {}
265
286
  nuxt.options.build.transpile.push(runtimeDir);
266
287
  const fontDir = resolve(nuxt.options.buildDir, "nuxt-og-image");
267
288
  const publicDirs = [`${nuxt.options.rootDir}/public`, fontDir];
268
- exposeConfig("#nuxt-og-image/config", "nuxt-og-image-config.mjs", { ...config, publicDirs });
289
+ exposeModuleConfig("nuxt-og-image", { ...config, publicDirs });
269
290
  nuxt.hooks.hook("build:before", async () => {
270
291
  await copy(resolve("./runtime/public"), resolve(nuxt.options.buildDir, "nuxt-og-image"));
271
292
  });
@@ -275,7 +296,11 @@ export {}
275
296
  });
276
297
  nitroConfig.publicAssets = nitroConfig.publicAssets || [];
277
298
  nitroConfig.publicAssets.push({ dir: fontDir, maxAge: 31536e3 });
278
- nitroConfig.virtual["#nuxt-og-image/browser"] = `export { createBrowser } from '${runtimeDir}/nitro/browsers/${isEdge ? "lambda" : "default"}'`;
299
+ if (isEdge && config.experimentalNitroBrowser)
300
+ nitroConfig.virtual["#nuxt-og-image/browser"] = `export { createBrowser } from '${runtimeDir}/nitro/browsers/${isEdge ? "lambda" : "default"}'`;
301
+ else
302
+ nitroConfig.virtual["#nuxt-og-image/browser"] = `export { createBrowser } from '${runtimeDir}/nitro/browsers/default'`;
303
+ nitroConfig.virtual["#nuxt-og-image/resvg"] = `import resvg from '${runtimeDir}/nitro/resvg/${isEdge ? "wasm" : "node"}'; export { resvg }`;
279
304
  nitroConfig.virtual["#nuxt-og-image/provider"] = `
280
305
  import satori from '${runtimeDir}/nitro/providers/satori'
281
306
  import browser from '${runtimeDir}/nitro/providers/browser'
@@ -1,7 +1,6 @@
1
1
  import { html as convertHtmlToSatori } from "satori-html";
2
2
  import satori from "satori";
3
3
  import { parseURL } from "ufo";
4
- import { Resvg } from "@resvg/resvg-js";
5
4
  import twemoji from "twemoji";
6
5
  import { loadFont, walkSatoriTree } from "./utils.mjs";
7
6
  import imageSrc from "./plugins/imageSrc.mjs";
@@ -9,13 +8,12 @@ import twClasses from "./plugins/twClasses.mjs";
9
8
  import flex from "./plugins/flex.mjs";
10
9
  import emojis from "./plugins/emojis.mjs";
11
10
  import { fonts, satoriOptions } from "#nuxt-og-image/config";
11
+ import { resvg } from "#nuxt-og-image/resvg";
12
12
  export default {
13
13
  name: "satori",
14
14
  createPng: async function createPng(baseUrl, options) {
15
15
  const svg = await this.createSvg(baseUrl, options);
16
- const resvg = new Resvg(svg, {});
17
- const pngData = resvg.render();
18
- return pngData.asPng();
16
+ return resvg(svg, options);
19
17
  },
20
18
  createVNode: async function createVNode(baseUrl, options) {
21
19
  const url = parseURL(baseUrl);
@@ -0,0 +1,3 @@
1
+ /// <reference types="node" />
2
+ import type { ResvgRenderOptions } from '@resvg/resvg-js';
3
+ export default function (svg: string, options: ResvgRenderOptions): Promise<Buffer>;
@@ -0,0 +1,6 @@
1
+ import { Resvg } from "@resvg/resvg-js";
2
+ export default async function(svg, options) {
3
+ const resvg = new Resvg(svg, options);
4
+ const pngData = resvg.render();
5
+ return pngData.asPng();
6
+ }
@@ -0,0 +1,2 @@
1
+ import type { ResvgRenderOptions } from '@resvg/resvg-wasm';
2
+ export default function (svg: string, options: ResvgRenderOptions): Promise<false | Uint8Array>;
@@ -0,0 +1,31 @@
1
+ import { Resvg, initWasm } from "@resvg/resvg-wasm";
2
+ import { resolvePath } from "mlly";
3
+ import { dirname, join } from "pathe";
4
+ import { $fetch } from "ofetch";
5
+ let wasm = null;
6
+ async function useResvgWasm() {
7
+ if (wasm)
8
+ return wasm;
9
+ try {
10
+ const path = join(
11
+ dirname(await resolvePath("@resvg/resvg-wasm")),
12
+ "index_bg.wasm"
13
+ );
14
+ const fs = await import("node:fs/promises");
15
+ wasm = await fs.readFile(path);
16
+ } catch (e) {
17
+ wasm = await $fetch("https://unpkg.com/@resvg/resvg-wasm/index_bg.wasm", {
18
+ responseType: "arrayBuffer"
19
+ });
20
+ }
21
+ return wasm;
22
+ }
23
+ export default async function(svg, options) {
24
+ const resvgWasm = await useResvgWasm();
25
+ if (!resvgWasm)
26
+ return false;
27
+ await initWasm(resvgWasm);
28
+ const resvg = new Resvg(svg, options);
29
+ const pngData = resvg.render();
30
+ return pngData.asPng();
31
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "nuxt-og-image",
3
3
  "type": "module",
4
- "version": "1.0.0",
4
+ "version": "1.2.0",
5
5
  "packageManager": "pnpm@7.8.0",
6
6
  "license": "MIT",
7
7
  "funding": "https://github.com/sponsors/harlan-zw",
@@ -26,13 +26,14 @@
26
26
  "dist"
27
27
  ],
28
28
  "dependencies": {
29
- "@nuxt/kit": "3.0.0",
29
+ "@nuxt/kit": "3.1.0",
30
30
  "@resvg/resvg-js": "^2.2.0",
31
+ "@resvg/resvg-wasm": "^2.2.0",
31
32
  "@types/fs-extra": "^11.0.1",
32
33
  "birpc": "^0.2.3",
33
34
  "chalk": "^5.2.0",
34
35
  "chrome-launcher": "^0.15.1",
35
- "defu": "^6.1.1",
36
+ "defu": "^6.1.2",
36
37
  "execa": "^6.1.0",
37
38
  "fast-glob": "^3.2.12",
38
39
  "flatted": "^3.2.7",
@@ -45,22 +46,22 @@
45
46
  "satori": "^0.1.1",
46
47
  "satori-html": "^0.3.2",
47
48
  "sirv": "^2.0.2",
49
+ "std-env": "^3.3.1",
48
50
  "tinyws": "^0.1.0",
49
51
  "twemoji": "^14.0.2",
50
52
  "ufo": "^1.0.1"
51
53
  },
52
54
  "devDependencies": {
53
55
  "@antfu/eslint-config": "^0.34.1",
54
- "@nuxt/kit": "3.0.0",
55
56
  "@nuxt/module-builder": "^0.2.1",
56
- "@nuxt/test-utils": "3.0.0",
57
+ "@nuxt/test-utils": "3.1.0",
57
58
  "@nuxtjs/eslint-config-typescript": "^12.0.0",
58
59
  "@types/ws": "^8.5.4",
59
60
  "bumpp": "^8.2.1",
60
61
  "eslint": "8.32.0",
61
62
  "nuxt": "npm:nuxt3@latest",
62
- "puppeteer": "^19.5.2",
63
- "vitest": "^0.27.2"
63
+ "puppeteer": "^19.6.0",
64
+ "vitest": "^0.28.1"
64
65
  },
65
66
  "scripts": {
66
67
  "build": "pnpm dev:prepare && pnpm build:module && pnpm build:client",