nuxt-og-image 1.4.7 → 1.4.9

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/module.d.ts CHANGED
@@ -27,7 +27,7 @@ interface OgImageOptions extends Partial<ScreenshotOptions> {
27
27
  static?: boolean;
28
28
  title?: string;
29
29
  description?: string;
30
- component?: string;
30
+ component?: string | null;
31
31
  alt?: string;
32
32
  [key: string]: any;
33
33
  }
package/dist/module.json CHANGED
@@ -5,5 +5,5 @@
5
5
  "bridge": false
6
6
  },
7
7
  "configKey": "ogImage",
8
- "version": "1.4.7"
8
+ "version": "1.4.9"
9
9
  }
package/dist/module.mjs CHANGED
@@ -46,18 +46,27 @@ async function createBrowser() {
46
46
  }
47
47
  }
48
48
 
49
- async function screenshot(browser, url, options) {
49
+ async function screenshot(browser, options) {
50
50
  const page = await browser.newPage({
51
51
  colorScheme: options.colorScheme
52
52
  });
53
53
  await page.setViewportSize({
54
- width: options.width,
55
- height: options.height
56
- });
57
- await page.goto(url, {
58
- timeout: 1e4,
59
- waitUntil: "networkidle"
54
+ width: options.width || 1200,
55
+ height: options.height || 630
60
56
  });
57
+ if (options.path.startsWith("html:")) {
58
+ await page.evaluate((html) => {
59
+ document.open("text/html");
60
+ document.write(html);
61
+ document.close();
62
+ }, options.path.substring(5));
63
+ await page.waitForLoadState("networkidle");
64
+ } else {
65
+ await page.goto(`${options.host}${options.path}`, {
66
+ timeout: 1e4,
67
+ waitUntil: "networkidle"
68
+ });
69
+ }
61
70
  if (options.delay)
62
71
  await page.waitForTimeout(options.delay);
63
72
  if (options.mask) {
@@ -330,38 +339,48 @@ export {}
330
339
  nitroConfig.externals = defu(nitroConfig.externals || {}, {
331
340
  inline: [runtimeDir]
332
341
  });
342
+ if (config.experimentalRuntimeBrowser) {
343
+ nitroConfig.alias = nitroConfig.alias || {};
344
+ nitroConfig.alias.electron = "unenv/runtime/mock/proxy-cjs";
345
+ nitroConfig.alias.bufferutil = "unenv/runtime/mock/proxy-cjs";
346
+ nitroConfig.alias["utf-8-validate"] = "unenv/runtime/mock/proxy-cjs";
347
+ }
333
348
  nitroConfig.publicAssets = nitroConfig.publicAssets || [];
334
349
  nitroConfig.publicAssets.push({ dir: moduleAssetDir, maxAge: 31536e3 });
335
350
  const providerPath = `${runtimeDir}/nitro/providers`;
336
351
  if (config.browserProvider) {
337
- nitroConfig.virtual["#nuxt-og-image/browser"] = config.experimentalRuntimeBrowser ? `export default async function() {
338
- return await import('${providerPath}/browser/node').then(m => m.default)
352
+ nitroConfig.virtual["#nuxt-og-image/browser"] = nuxt.options.dev || config.experimentalRuntimeBrowser ? `
353
+ import node from '${providerPath}/browser/node'
354
+
355
+ export default async function() {
356
+ return node
339
357
  }
340
358
  ` : `export default async function() {
341
- return (process.env.prerender || process.env.dev === 'true') ? await import('${providerPath}/browser/node').then(m => m.default) : () => {}
359
+ return () => {}
342
360
  }
343
361
  `;
344
362
  }
345
363
  if (config.satoriProvider) {
346
- nitroConfig.virtual["#nuxt-og-image/satori"] = isWebWorkerEnv ? `export default async function() {
347
- return (process.env.prerender || process.env.dev === 'true') ? await import('${providerPath}/satori/webworker').then(m => m.default) : await import('${providerPath}/satori/webworker').then(m => m.default)
348
- }` : `import node from '${providerPath}/satori/node';
349
- export default function() {
350
- return node
351
- }
352
- `;
353
- nitroConfig.virtual["#nuxt-og-image/svg2png"] = `export default async function() {
354
- return await import('${providerPath}/svg2png/universal').then(m => m.default)
364
+ nitroConfig.virtual["#nuxt-og-image/satori"] = `import webworker from '${providerPath}/satori/${isWebWorkerEnv ? "webworker" : "node"}'
365
+ export default async function() {
366
+ return webworker
367
+ }`;
368
+ nitroConfig.virtual["#nuxt-og-image/svg2png"] = `
369
+ import svg2png from '${providerPath}/svg2png/universal'
370
+ export default async function() {
371
+ return svg2png
355
372
  }`;
356
373
  }
357
374
  nitroConfig.virtual["#nuxt-og-image/provider"] = `
358
- export async function useProvider(provider) {
359
- if (provider === 'satori')
360
- return ${config.satoriProvider ? `await import('${relative(nuxt.options.rootDir, resolve("./runtime/nitro/renderers/satori"))}').then(m => m.default)` : null}
361
- if (provider === 'browser')
362
- ${config.experimentalRuntimeBrowser ? `return await import('${relative(nuxt.options.rootDir, resolve("./runtime/nitro/renderers/browser"))}').then(m => m.default)` : ""}
363
- ${!config.experimentalRuntimeBrowser ? `return (process.env.prerender || process.env.dev) ? ${config.browserProvider ? `await import('${relative(nuxt.options.rootDir, resolve("./runtime/nitro/renderers/browser"))}').then(m => m.default)` : null} : null` : ""}
364
- }
375
+ import satori from '${relative(nuxt.options.rootDir, resolve("./runtime/nitro/renderers/satori"))}'
376
+ import browser from '${relative(nuxt.options.rootDir, resolve("./runtime/nitro/renderers/browser"))}'
377
+
378
+ export async function useProvider(provider) {
379
+ if (provider === 'satori')
380
+ return satori
381
+ if (provider === 'browser')
382
+ return browser
383
+ }
365
384
  `;
366
385
  });
367
386
  nuxt.hooks.hook("nitro:init", async (nitro) => {
@@ -407,14 +426,16 @@ export default function() {
407
426
  const routeRules = defu({}, ..._routeRulesMatcher.matchAll(ctx.route).reverse());
408
427
  if (!extractedOptions || routeRules.ogImage === false)
409
428
  return;
410
- const options = {
411
- path: ctx.route,
429
+ const entry = {
430
+ path: extractedOptions.component ? `/api/og-image-html?path=${ctx.route}` : ctx.route,
412
431
  ...extractedOptions,
413
432
  ...routeRules.ogImage || {},
414
433
  ctx
415
434
  };
416
- if ((nuxt.options._generate || options.static) && options.provider === "browser")
417
- screenshotQueue.push(options);
435
+ if (entry.component)
436
+ entry.path = `html:${await $fetch(entry.path)}`;
437
+ if ((nuxt.options._generate || entry.static) && entry.provider === "browser")
438
+ screenshotQueue.push(entry);
418
439
  });
419
440
  if (nuxt.options.dev)
420
441
  return;
@@ -446,7 +467,7 @@ export default function() {
446
467
  })).trim();
447
468
  browser = await createBrowser();
448
469
  if (browser) {
449
- nitro.logger.info(`Pre-rendering ${screenshotQueue.length} og:image screenshots...`);
470
+ nitro.logger.info(`Prerendering ${screenshotQueue.length} og:image screenshots...`);
450
471
  for (const k in screenshotQueue) {
451
472
  const entry = screenshotQueue[k];
452
473
  const start = Date.now();
@@ -454,9 +475,10 @@ export default function() {
454
475
  const dirname = joinURL(nitro.options.output.publicDir, `${entry.ctx.fileName.replace("index.html", "")}__og_image__/`);
455
476
  const filename = joinURL(dirname, "/og.png");
456
477
  try {
457
- const imgBuffer = await screenshot(browser, `${host}${entry.path}`, {
478
+ const imgBuffer = await screenshot(browser, {
458
479
  ...config.defaults || {},
459
- ...entry || {}
480
+ ...entry || {},
481
+ host
460
482
  });
461
483
  try {
462
484
  await mkdirp(dirname);
@@ -1,4 +1,4 @@
1
1
  /// <reference types="node" />
2
2
  import type { Browser } from 'playwright-core';
3
3
  import type { ScreenshotOptions } from '../types';
4
- export declare function screenshot(browser: Browser, url: string, options: ScreenshotOptions): Promise<Buffer>;
4
+ export declare function screenshot(browser: Browser, options: Partial<ScreenshotOptions> & Record<string, any>): Promise<Buffer>;
@@ -1,15 +1,24 @@
1
- export async function screenshot(browser, url, options) {
1
+ export async function screenshot(browser, options) {
2
2
  const page = await browser.newPage({
3
3
  colorScheme: options.colorScheme
4
4
  });
5
5
  await page.setViewportSize({
6
- width: options.width,
7
- height: options.height
8
- });
9
- await page.goto(url, {
10
- timeout: 1e4,
11
- waitUntil: "networkidle"
6
+ width: options.width || 1200,
7
+ height: options.height || 630
12
8
  });
9
+ if (options.path.startsWith("html:")) {
10
+ await page.evaluate((html) => {
11
+ document.open("text/html");
12
+ document.write(html);
13
+ document.close();
14
+ }, options.path.substring(5));
15
+ await page.waitForLoadState("networkidle");
16
+ } else {
17
+ await page.goto(`${options.host}${options.path}`, {
18
+ timeout: 1e4,
19
+ waitUntil: "networkidle"
20
+ });
21
+ }
13
22
  if (options.delay)
14
23
  await page.waitForTimeout(options.delay);
15
24
  if (options.mask) {
@@ -9,6 +9,7 @@ export function defineOgImageScreenshot(options = {}) {
9
9
  defineOgImage({
10
10
  alt: `Web page screenshot${route ? ` of ${route}` : ""}.`,
11
11
  provider: "browser",
12
+ component: null,
12
13
  static: true,
13
14
  ...options
14
15
  });
@@ -9,10 +9,16 @@ export default {
9
9
  throw new Error("Browser provider can't create VNodes.");
10
10
  },
11
11
  createPng: async function createPng(basePath, options) {
12
+ const url = new URL(basePath);
12
13
  const createBrowser = await loadBrowser();
13
14
  const browser = await createBrowser();
14
- if (browser)
15
- return screenshot(browser, basePath, options);
15
+ if (browser) {
16
+ return screenshot(browser, {
17
+ ...options,
18
+ host: url.origin,
19
+ path: `/api/og-image-html?path=${url.pathname}`
20
+ });
21
+ }
16
22
  return null;
17
23
  }
18
24
  };
@@ -13,7 +13,7 @@ export default defineEventHandler(async (e) => {
13
13
  options = JSON.parse(getQuery(e).options);
14
14
  if (!options)
15
15
  options = await fetchOptions(e, path);
16
- if (options.provider === "browser")
16
+ if (options.provider === "browser" && !options.component)
17
17
  return sendRedirect(e, withBase(path, useHostname(e)));
18
18
  const island = await renderIsland(options);
19
19
  const head = createHeadCore();
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "nuxt-og-image",
3
3
  "type": "module",
4
- "version": "1.4.7",
4
+ "version": "1.4.9",
5
5
  "packageManager": "pnpm@7.8.0",
6
6
  "license": "MIT",
7
7
  "funding": "https://github.com/sponsors/harlan-zw",
@@ -41,7 +41,7 @@
41
41
  "pathe": "^1.1.0",
42
42
  "playwright-core": "^1.30.0",
43
43
  "radix3": "^1.0.0",
44
- "satori": "^0.2.0",
44
+ "satori": "0.2.0",
45
45
  "satori-html": "^0.3.2",
46
46
  "sirv": "^2.0.2",
47
47
  "std-env": "^3.3.2",
@@ -53,7 +53,7 @@
53
53
  },
54
54
  "devDependencies": {
55
55
  "@antfu/eslint-config": "^0.35.1",
56
- "@nuxt/devtools-edge": "0.0.0-27925355.bb05ed5",
56
+ "@nuxt/devtools-edge": "0.0.0-27928010.c91ffe5",
57
57
  "@nuxt/module-builder": "^0.2.1",
58
58
  "@nuxt/test-utils": "3.1.2",
59
59
  "@nuxtjs/eslint-config-typescript": "^12.0.0",