nuxt-og-image 6.5.0 → 6.5.2

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 (94) hide show
  1. package/dist/chunks/tw4.cjs +2 -2
  2. package/dist/chunks/tw4.mjs +2 -2
  3. package/dist/chunks/uno.cjs +2 -2
  4. package/dist/chunks/uno.mjs +2 -2
  5. package/dist/content.d.cts +2 -14
  6. package/dist/content.d.mts +2 -14
  7. package/dist/content.d.ts +2 -14
  8. package/dist/devtools/200.html +1 -1
  9. package/dist/devtools/404.html +1 -1
  10. package/dist/devtools/_nuxt/{TwxRLlMM.js → B9jrmesR.js} +1 -1
  11. package/dist/devtools/_nuxt/BA-4cUNc.js +1 -0
  12. package/dist/devtools/_nuxt/{BLdiDWsd.js → BOEXnX7x.js} +3 -3
  13. package/dist/devtools/_nuxt/BWKJ0Uxb.js +30 -0
  14. package/dist/devtools/_nuxt/Bdtz4ZK9.js +4 -0
  15. package/dist/devtools/_nuxt/{oq4DzcWM.js → C5797Ieg.js} +1 -1
  16. package/dist/devtools/_nuxt/{D0mxCJKN.js → C_JnDlx-.js} +1 -1
  17. package/dist/devtools/_nuxt/{DNGiVUg5.js → CdmciVPJ.js} +1 -1
  18. package/dist/devtools/_nuxt/CqjbkMN9.js +3 -0
  19. package/dist/devtools/_nuxt/D4EkL0XJ.js +6 -0
  20. package/dist/devtools/_nuxt/DKaW7clv.js +1 -0
  21. package/dist/devtools/_nuxt/{BFE1I-6y.js → DSl3mlLY.js} +1 -1
  22. package/dist/devtools/_nuxt/DYta7Mdi.js +3 -0
  23. package/dist/devtools/_nuxt/DevtoolsSection.CcOMr_vO.css +1 -0
  24. package/dist/devtools/_nuxt/DevtoolsSnippet.BhrTdbXn.css +1 -0
  25. package/dist/devtools/_nuxt/{IFrameLoader.Bd09J70F.css → IFrameLoader.k_861Nnq.css} +1 -1
  26. package/dist/devtools/_nuxt/builds/latest.json +1 -1
  27. package/dist/devtools/_nuxt/builds/meta/a36bc212-7179-4aa2-a534-6366229bd7b1.json +1 -0
  28. package/dist/devtools/_nuxt/entry.CcrXpo2y.css +2 -0
  29. package/dist/devtools/_nuxt/{pages.sZ4TsxJx.css → pages.Ci_xvfJ8.css} +1 -1
  30. package/dist/devtools/_nuxt/renderer-select.COGJ4ZQe.css +1 -0
  31. package/dist/devtools/_nuxt/{templates.BHO7w0UG.css → templates.BByln3BG.css} +1 -1
  32. package/dist/devtools/_nuxt/{DWbsyffp.js → wMBdlVF-.js} +2 -2
  33. package/dist/devtools/debug/index.html +1 -1
  34. package/dist/devtools/docs/index.html +1 -1
  35. package/dist/devtools/index.html +1 -1
  36. package/dist/devtools/templates/index.html +1 -1
  37. package/dist/module.cjs +2 -2
  38. package/dist/module.json +1 -1
  39. package/dist/module.mjs +2 -2
  40. package/dist/runtime/app/components/Templates/Community/BlogPost.takumi.d.vue.ts +2 -2
  41. package/dist/runtime/app/components/Templates/Community/BlogPost.takumi.vue.d.ts +2 -2
  42. package/dist/runtime/app/components/Templates/Community/Brutalist.satori.d.vue.ts +2 -2
  43. package/dist/runtime/app/components/Templates/Community/Brutalist.satori.vue.d.ts +2 -2
  44. package/dist/runtime/app/components/Templates/Community/Docs.takumi.d.vue.ts +2 -2
  45. package/dist/runtime/app/components/Templates/Community/Docs.takumi.vue.d.ts +2 -2
  46. package/dist/runtime/app/components/Templates/Community/Frame.satori.d.vue.ts +2 -2
  47. package/dist/runtime/app/components/Templates/Community/Frame.satori.vue.d.ts +2 -2
  48. package/dist/runtime/app/components/Templates/Community/Nuxt.satori.d.vue.ts +2 -2
  49. package/dist/runtime/app/components/Templates/Community/Nuxt.satori.vue.d.ts +2 -2
  50. package/dist/runtime/app/components/Templates/Community/NuxtSeo.satori.d.vue.ts +2 -2
  51. package/dist/runtime/app/components/Templates/Community/NuxtSeo.satori.vue.d.ts +2 -2
  52. package/dist/runtime/app/components/Templates/Community/NuxtSeo.takumi.d.vue.ts +2 -2
  53. package/dist/runtime/app/components/Templates/Community/NuxtSeo.takumi.vue.d.ts +2 -2
  54. package/dist/runtime/app/components/Templates/Community/Pergel.satori.d.vue.ts +2 -2
  55. package/dist/runtime/app/components/Templates/Community/Pergel.satori.vue.d.ts +2 -2
  56. package/dist/runtime/app/components/Templates/Community/ProductCard.takumi.d.vue.ts +2 -2
  57. package/dist/runtime/app/components/Templates/Community/ProductCard.takumi.vue.d.ts +2 -2
  58. package/dist/runtime/app/components/Templates/Community/SaaS.satori.d.vue.ts +2 -2
  59. package/dist/runtime/app/components/Templates/Community/SaaS.satori.vue.d.ts +2 -2
  60. package/dist/runtime/app/components/Templates/Community/SimpleBlog.satori.d.vue.ts +2 -2
  61. package/dist/runtime/app/components/Templates/Community/SimpleBlog.satori.vue.d.ts +2 -2
  62. package/dist/runtime/app/components/Templates/Community/UnJs.satori.d.vue.ts +2 -2
  63. package/dist/runtime/app/components/Templates/Community/UnJs.satori.vue.d.ts +2 -2
  64. package/dist/runtime/app/components/Templates/Community/WithEmoji.satori.d.vue.ts +2 -2
  65. package/dist/runtime/app/components/Templates/Community/WithEmoji.satori.vue.d.ts +2 -2
  66. package/dist/runtime/server/og-image/bindings/browser/cloudflare.js +2 -1
  67. package/dist/runtime/server/og-image/browser/screenshot.js +4 -1
  68. package/dist/runtime/server/og-image/takumi/instances.d.ts +1 -1
  69. package/dist/runtime/server/og-image/takumi/nodes.d.ts +1 -1
  70. package/dist/runtime/server/og-image/takumi/renderer.js +9 -4
  71. package/dist/runtime/server/util/cache.d.ts +5 -0
  72. package/dist/runtime/server/util/cache.js +22 -17
  73. package/dist/runtime/server/util/kit.js +1 -1
  74. package/dist/runtime/server/util/ssrf.js +15 -0
  75. package/dist/runtime/server/util/wasm.js +2 -2
  76. package/dist/shared/{nuxt-og-image.DVJCoUpz.cjs → nuxt-og-image.CgPzmzQY.cjs} +29 -15
  77. package/dist/shared/{nuxt-og-image.CBAJqzNe.mjs → nuxt-og-image.DGAMxBol.mjs} +28 -14
  78. package/package.json +61 -41
  79. package/dist/devtools/_nuxt/BFnUFv7a.js +0 -6
  80. package/dist/devtools/_nuxt/BeokGQcV.js +0 -1
  81. package/dist/devtools/_nuxt/CAvCRPq5.js +0 -23
  82. package/dist/devtools/_nuxt/D-SbM8XJ.js +0 -3
  83. package/dist/devtools/_nuxt/Dd8dEdTA.js +0 -3
  84. package/dist/devtools/_nuxt/DdjB2us_.js +0 -4
  85. package/dist/devtools/_nuxt/DevtoolsSection.DithqiRs.css +0 -1
  86. package/dist/devtools/_nuxt/DevtoolsSnippet.Bi7K9LD7.css +0 -1
  87. package/dist/devtools/_nuxt/builds/meta/4e19b9f7-298b-4c14-85e9-238c217158cb.json +0 -1
  88. package/dist/devtools/_nuxt/entry.D10ZDedD.css +0 -2
  89. package/dist/devtools/_nuxt/renderer-select.DomsjmoH.css +0 -1
  90. /package/dist/devtools/_nuxt/{CM-t-6ZT.js → C5jzcy9i.js} +0 -0
  91. /package/dist/devtools/_nuxt/{HWyD49jH.js → CCTv7mmB.js} +0 -0
  92. /package/dist/devtools/_nuxt/{BsRKQH5X.js → CuJezOxb.js} +0 -0
  93. /package/dist/devtools/_nuxt/{CDaXKRRu.js → E8AZ6HoH.js} +0 -0
  94. /package/dist/devtools/_nuxt/{PONEy9N-.js → O5eLyffU.js} +0 -0
@@ -5,7 +5,7 @@ import { createRouter as createRadixRouter, toRouteMatcher } from "radix3";
5
5
  import { withoutBase, withoutTrailingSlash } from "ufo";
6
6
  export { withoutQuery } from "nuxtseo-shared/utils";
7
7
  export function fetchIsland(e, component, props, timeout) {
8
- const hashId = hash([component, props]).replaceAll("_", "-");
8
+ const hashId = hash([component, props, {}, void 0]).replace(/[-_]/g, "");
9
9
  const signal = timeout ? AbortSignal.timeout(timeout) : void 0;
10
10
  return e.$fetch(`/__nuxt_island/${component}_${hashId}.json`, {
11
11
  params: {
@@ -66,11 +66,26 @@ function isPrivateIPv6(groups) {
66
66
  const b = g6 & 255;
67
67
  return isPrivateIPv4(a, b);
68
68
  }
69
+ if (g0 === 0 && g1 === 0 && g2 === 0 && g3 === 0 && g4 === 0 && g5 === 0) {
70
+ const a = g6 >> 8 & 255;
71
+ const b = g6 & 255;
72
+ return isPrivateIPv4(a, b);
73
+ }
74
+ if (g0 === 0 && g1 === 0 && g2 === 0 && g3 === 0 && g4 === 65535 && g5 === 0) {
75
+ const a = g6 >> 8 & 255;
76
+ const b = g6 & 255;
77
+ return isPrivateIPv4(a, b);
78
+ }
69
79
  if (g0 === 100 && g1 === 65435 && g2 === 0 && g3 === 0 && g4 === 0 && g5 === 0) {
70
80
  const a = g6 >> 8 & 255;
71
81
  const b = g6 & 255;
72
82
  return isPrivateIPv4(a, b);
73
83
  }
84
+ if (g0 === 8194) {
85
+ const a = g1 >> 8 & 255;
86
+ const b = g1 & 255;
87
+ return isPrivateIPv4(a, b);
88
+ }
74
89
  if (g0 === 100 && g1 === 65435 && g2 === 1)
75
90
  return true;
76
91
  if ((g0 & 65024) === 64512)
@@ -1,5 +1,5 @@
1
1
  import { readFile } from "node:fs/promises";
2
- import { resolvePath } from "mlly";
2
+ import { resolveModulePath } from "exsolve";
3
3
  export async function importWasm(input) {
4
4
  const _input = await input;
5
5
  const _module = _input.default || _input;
@@ -11,6 +11,6 @@ export async function importWasm(input) {
11
11
  return _module;
12
12
  }
13
13
  export async function readWasmFile(input) {
14
- const path = await resolvePath(input);
14
+ const path = resolveModulePath(input);
15
15
  return readFile(path);
16
16
  }
@@ -9,12 +9,12 @@ const kit$2 = require('nuxt-site-config/kit');
9
9
  const ohash = require('ohash');
10
10
  const pathe = require('pathe');
11
11
  const pkgTypes = require('pkg-types');
12
+ const stdEnv = require('std-env');
12
13
  const node_crypto = require('node:crypto');
13
14
  const oxcWalker = require('oxc-walker');
14
15
  const kit$1 = require('nuxtseo-shared/kit');
15
16
  const logger_js = require('../../dist/runtime/logger.js');
16
17
  const chromeLauncher = require('chrome-launcher');
17
- const stdEnv = require('std-env');
18
18
  const nypm = require('nypm');
19
19
  const devtools = require('nuxtseo-shared/devtools');
20
20
  const unstorage = require('unstorage');
@@ -610,6 +610,14 @@ async function ensureProviderDependencies(provider, binding, nuxt) {
610
610
  }
611
611
  return { success: true, installed };
612
612
  }
613
+ function canPromptInteractively(env = {
614
+ hasTTY: stdEnv.hasTTY,
615
+ hasStdinTTY: Boolean(process.stdin?.isTTY),
616
+ isAgent: stdEnv.isAgent,
617
+ isCI: stdEnv.isCI
618
+ }) {
619
+ return env.hasTTY && env.hasStdinTTY && !env.isAgent && !env.isCI;
620
+ }
613
621
  async function promptForRendererSelection() {
614
622
  logger_js.logger.info("Welcome to Nuxt OG Image! No renderer dependencies detected.");
615
623
  const renderer = await logger_js.logger.prompt("Which renderer would you like to use?", {
@@ -829,9 +837,11 @@ ${content}`, "utf-8");
829
837
  const safeBroadcast = (fn) => {
830
838
  try {
831
839
  const result = fn();
832
- if (result && typeof result.then === "function")
833
- result.catch(() => {
840
+ if (result && typeof result.then === "function") {
841
+ result.catch((err) => {
842
+ void err;
834
843
  });
844
+ }
835
845
  } catch {
836
846
  }
837
847
  };
@@ -4198,6 +4208,10 @@ async function onInstall(nuxt) {
4198
4208
  }
4199
4209
  return;
4200
4210
  }
4211
+ if (!canPromptInteractively()) {
4212
+ logger_js.logger.info("Skipping interactive onboarding (non-interactive environment). Defaulting to the takumi renderer.");
4213
+ return;
4214
+ }
4201
4215
  logger_js.logger.info("");
4202
4216
  logger_js.logger.info("\u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510");
4203
4217
  logger_js.logger.info("\u2502 nuxt-og-image \u2502");
@@ -4399,9 +4413,10 @@ defineProps<{
4399
4413
  </div>
4400
4414
  </template>
4401
4415
  `;
4402
- if (!fs.existsSync(componentDir))
4403
- await promises.mkdir(componentDir, { recursive: true }).catch(() => {
4416
+ if (!fs.existsSync(componentDir)) {
4417
+ await promises.mkdir(componentDir, { recursive: true }).catch((err) => {
4404
4418
  });
4419
+ }
4405
4420
  await promises.writeFile(componentPath, template).then(() => logger_js.logger.success("Created components/OgImage/Default.vue")).catch(() => logger_js.logger.error("Failed to create starter component"));
4406
4421
  }
4407
4422
 
@@ -4684,15 +4699,9 @@ const module$1 = kit.defineNuxtModule({
4684
4699
  await onUpgrade(nuxt, options, previousVersion);
4685
4700
  },
4686
4701
  async setup(config, nuxt) {
4687
- const _resolver = kit.createResolver((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('shared/nuxt-og-image.DVJCoUpz.cjs', document.baseURI).href)));
4702
+ const _resolver = kit.createResolver((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('shared/nuxt-og-image.CgPzmzQY.cjs', document.baseURI).href)));
4688
4703
  const fixSharedPath = (p) => {
4689
- if (p.includes("/shared/runtime/"))
4690
- return p.replace("/shared/runtime/", "/runtime/");
4691
- if (p.includes("/shared/client"))
4692
- return p.replace("/shared/client", "/client");
4693
- if (p.includes("/shared/devtools"))
4694
- return p.replace("/shared/devtools", "/devtools");
4695
- return p;
4704
+ return p.replace(/\/shared\/runtime(\/|$)/, "/runtime$1").replace(/\/shared\/client(\/|$)/, "/client$1").replace(/\/shared\/devtools(\/|$)/, "/devtools$1");
4696
4705
  };
4697
4706
  const resolve = (path) => fixSharedPath(_resolver.resolve(path));
4698
4707
  const resolver = {
@@ -5041,7 +5050,7 @@ ${familyInfo}`);
5041
5050
  runtime: { sharp: false }
5042
5051
  });
5043
5052
  } else {
5044
- await import('sharp').catch(() => {
5053
+ await import('sharp').catch((err) => {
5045
5054
  }).then(() => {
5046
5055
  attemptSharpUsage = true;
5047
5056
  });
@@ -5231,12 +5240,13 @@ ${familyInfo}`);
5231
5240
  if (preferred) {
5232
5241
  ogImageComponentCtx.detectedRenderers.add(preferred.provider);
5233
5242
  logger_js.logger.debug(`Using ${preferred.provider} renderer`);
5234
- } else if (nuxt.options.dev && !nuxt.options._prepare) {
5243
+ } else if (nuxt.options.dev && !nuxt.options._prepare && canPromptInteractively()) {
5235
5244
  const renderer = await promptForRendererSelection();
5236
5245
  ogImageComponentCtx.detectedRenderers.add(renderer);
5237
5246
  logger_js.logger.debug(`Using ${renderer} renderer`);
5238
5247
  } else {
5239
5248
  ogImageComponentCtx.detectedRenderers.add("takumi");
5249
+ logger_js.logger.warn("No OG image renderer dependency detected. Defaulting to `takumi` (non-interactive environment). Install `@takumi-rs/core`, or add a renderer component (e.g. components/OgImage/Default.satori.vue) to choose explicitly.");
5240
5250
  }
5241
5251
  }
5242
5252
  const availableRenderers = /* @__PURE__ */ new Set();
@@ -5252,9 +5262,13 @@ ${familyInfo}`);
5252
5262
  const { success } = await ensureProviderDependencies(renderer, binding, nuxt);
5253
5263
  if (success) {
5254
5264
  availableRenderers.add(renderer);
5265
+ } else if (stdEnv.isAgent) {
5266
+ throw new Error(`[nuxt-og-image] Failed to install ${renderer} dependencies: ${missing.join(", ")}. Install manually: npx nypm add ${missing.join(" ")}`);
5255
5267
  } else {
5256
5268
  logger_js.logger.error(`Failed to install ${renderer} dependencies. Templates using this renderer won't work.`);
5257
5269
  }
5270
+ } else if (stdEnv.isAgent) {
5271
+ throw new Error(`[nuxt-og-image] ${renderer} renderer missing dependencies: ${missing.join(", ")}. Install with: npx nypm add ${missing.join(" ")}`);
5258
5272
  } else {
5259
5273
  logger_js.logger.error(`${renderer} renderer missing dependencies: ${missing.join(", ")}. Install with: npx nypm add ${missing.join(" ")}`);
5260
5274
  }
@@ -8,12 +8,12 @@ import { installNuxtSiteConfig } from 'nuxt-site-config/kit';
8
8
  import { hash } from 'ohash';
9
9
  import { basename, join, dirname, relative, isAbsolute, resolve } from 'pathe';
10
10
  import { readPackageJSON } from 'pkg-types';
11
+ import { isCI, isAgent, hasTTY } from 'std-env';
11
12
  import { createHash } from 'node:crypto';
12
13
  import { parseAndWalk } from 'oxc-walker';
13
14
  import { resolveNitroPreset, getNuxtModuleOptions, isNuxtGenerate } from 'nuxtseo-shared/kit';
14
15
  import { logger } from '../../dist/runtime/logger.js';
15
16
  import { Launcher } from 'chrome-launcher';
16
- import { isCI } from 'std-env';
17
17
  import { detectPackageManager, addDependency } from 'nypm';
18
18
  import { setupDevToolsUI as setupDevToolsUI$1, setupDevToolsRpc } from 'nuxtseo-shared/devtools';
19
19
  import { createStorage } from 'unstorage';
@@ -590,6 +590,14 @@ async function ensureProviderDependencies(provider, binding, nuxt) {
590
590
  }
591
591
  return { success: true, installed };
592
592
  }
593
+ function canPromptInteractively(env = {
594
+ hasTTY,
595
+ hasStdinTTY: Boolean(process.stdin?.isTTY),
596
+ isAgent,
597
+ isCI
598
+ }) {
599
+ return env.hasTTY && env.hasStdinTTY && !env.isAgent && !env.isCI;
600
+ }
593
601
  async function promptForRendererSelection() {
594
602
  logger.info("Welcome to Nuxt OG Image! No renderer dependencies detected.");
595
603
  const renderer = await logger.prompt("Which renderer would you like to use?", {
@@ -809,9 +817,11 @@ ${content}`, "utf-8");
809
817
  const safeBroadcast = (fn) => {
810
818
  try {
811
819
  const result = fn();
812
- if (result && typeof result.then === "function")
813
- result.catch(() => {
820
+ if (result && typeof result.then === "function") {
821
+ result.catch((err) => {
822
+ void err;
814
823
  });
824
+ }
815
825
  } catch {
816
826
  }
817
827
  };
@@ -4178,6 +4188,10 @@ async function onInstall(nuxt) {
4178
4188
  }
4179
4189
  return;
4180
4190
  }
4191
+ if (!canPromptInteractively()) {
4192
+ logger.info("Skipping interactive onboarding (non-interactive environment). Defaulting to the takumi renderer.");
4193
+ return;
4194
+ }
4181
4195
  logger.info("");
4182
4196
  logger.info("\u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510");
4183
4197
  logger.info("\u2502 nuxt-og-image \u2502");
@@ -4379,9 +4393,10 @@ defineProps<{
4379
4393
  </div>
4380
4394
  </template>
4381
4395
  `;
4382
- if (!existsSync(componentDir))
4383
- await mkdir(componentDir, { recursive: true }).catch(() => {
4396
+ if (!existsSync(componentDir)) {
4397
+ await mkdir(componentDir, { recursive: true }).catch((err) => {
4384
4398
  });
4399
+ }
4385
4400
  await writeFile(componentPath, template).then(() => logger.success("Created components/OgImage/Default.vue")).catch(() => logger.error("Failed to create starter component"));
4386
4401
  }
4387
4402
 
@@ -4666,13 +4681,7 @@ const module$1 = defineNuxtModule({
4666
4681
  async setup(config, nuxt) {
4667
4682
  const _resolver = createResolver(import.meta.url);
4668
4683
  const fixSharedPath = (p) => {
4669
- if (p.includes("/shared/runtime/"))
4670
- return p.replace("/shared/runtime/", "/runtime/");
4671
- if (p.includes("/shared/client"))
4672
- return p.replace("/shared/client", "/client");
4673
- if (p.includes("/shared/devtools"))
4674
- return p.replace("/shared/devtools", "/devtools");
4675
- return p;
4684
+ return p.replace(/\/shared\/runtime(\/|$)/, "/runtime$1").replace(/\/shared\/client(\/|$)/, "/client$1").replace(/\/shared\/devtools(\/|$)/, "/devtools$1");
4676
4685
  };
4677
4686
  const resolve = (path) => fixSharedPath(_resolver.resolve(path));
4678
4687
  const resolver = {
@@ -5021,7 +5030,7 @@ ${familyInfo}`);
5021
5030
  runtime: { sharp: false }
5022
5031
  });
5023
5032
  } else {
5024
- await import('sharp').catch(() => {
5033
+ await import('sharp').catch((err) => {
5025
5034
  }).then(() => {
5026
5035
  attemptSharpUsage = true;
5027
5036
  });
@@ -5211,12 +5220,13 @@ ${familyInfo}`);
5211
5220
  if (preferred) {
5212
5221
  ogImageComponentCtx.detectedRenderers.add(preferred.provider);
5213
5222
  logger.debug(`Using ${preferred.provider} renderer`);
5214
- } else if (nuxt.options.dev && !nuxt.options._prepare) {
5223
+ } else if (nuxt.options.dev && !nuxt.options._prepare && canPromptInteractively()) {
5215
5224
  const renderer = await promptForRendererSelection();
5216
5225
  ogImageComponentCtx.detectedRenderers.add(renderer);
5217
5226
  logger.debug(`Using ${renderer} renderer`);
5218
5227
  } else {
5219
5228
  ogImageComponentCtx.detectedRenderers.add("takumi");
5229
+ logger.warn("No OG image renderer dependency detected. Defaulting to `takumi` (non-interactive environment). Install `@takumi-rs/core`, or add a renderer component (e.g. components/OgImage/Default.satori.vue) to choose explicitly.");
5220
5230
  }
5221
5231
  }
5222
5232
  const availableRenderers = /* @__PURE__ */ new Set();
@@ -5232,9 +5242,13 @@ ${familyInfo}`);
5232
5242
  const { success } = await ensureProviderDependencies(renderer, binding, nuxt);
5233
5243
  if (success) {
5234
5244
  availableRenderers.add(renderer);
5245
+ } else if (isAgent) {
5246
+ throw new Error(`[nuxt-og-image] Failed to install ${renderer} dependencies: ${missing.join(", ")}. Install manually: npx nypm add ${missing.join(" ")}`);
5235
5247
  } else {
5236
5248
  logger.error(`Failed to install ${renderer} dependencies. Templates using this renderer won't work.`);
5237
5249
  }
5250
+ } else if (isAgent) {
5251
+ throw new Error(`[nuxt-og-image] ${renderer} renderer missing dependencies: ${missing.join(", ")}. Install with: npx nypm add ${missing.join(" ")}`);
5238
5252
  } else {
5239
5253
  logger.error(`${renderer} renderer missing dependencies: ${missing.join(", ")}. Install with: npx nypm add ${missing.join(" ")}`);
5240
5254
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "nuxt-og-image",
3
3
  "type": "module",
4
- "version": "6.5.0",
4
+ "version": "6.5.2",
5
5
  "description": "Enlightened OG Image generation for Nuxt.",
6
6
  "author": {
7
7
  "website": "https://harlanzw.com",
@@ -54,12 +54,14 @@
54
54
  "@takumi-rs/wasm": "^1.0.0-beta.3",
55
55
  "@unhead/vue": "^2.0.5 || ^3.0.0",
56
56
  "fontless": "^0.2.0",
57
+ "nitropack": "^2.13.4",
57
58
  "playwright-core": "^1.50.0",
58
59
  "satori": ">=0.19.2",
59
60
  "sharp": "^0.34.0",
60
61
  "tailwindcss": "^4.0.0",
61
62
  "unifont": "^0.7.0",
62
- "unstorage": "^1.15.0"
63
+ "unstorage": "^1.15.0",
64
+ "zod": ">=3"
63
65
  },
64
66
  "peerDependenciesMeta": {
65
67
  "@resvg/resvg-js": {
@@ -77,6 +79,9 @@
77
79
  "fontless": {
78
80
  "optional": true
79
81
  },
82
+ "nitropack": {
83
+ "optional": true
84
+ },
80
85
  "playwright-core": {
81
86
  "optional": true
82
87
  },
@@ -91,99 +96,114 @@
91
96
  },
92
97
  "unifont": {
93
98
  "optional": true
99
+ },
100
+ "zod": {
101
+ "optional": true
94
102
  }
95
103
  },
96
104
  "dependencies": {
97
- "@clack/prompts": "^1.3.0",
98
- "@nuxt/kit": "^4.4.4",
99
- "@vue/compiler-sfc": "^3.5.33",
105
+ "@clack/prompts": "^1.5.1",
106
+ "@nuxt/kit": "^4.4.7",
107
+ "@unocss/config": "^66.7.0",
108
+ "@unocss/core": "^66.7.0",
109
+ "@vue/compiler-sfc": "^3.5.35",
100
110
  "chrome-launcher": "^1.2.1",
101
111
  "consola": "^3.4.2",
102
112
  "culori": "^4.0.2",
103
113
  "defu": "^6.1.7",
104
- "devalue": "^5.8.0",
114
+ "devalue": "^5.8.1",
105
115
  "exsolve": "^1.0.8",
106
116
  "lightningcss": "^1.32.0",
107
117
  "magic-string": "^0.30.21",
108
- "magicast": "^0.5.2",
118
+ "magicast": "^0.5.3",
109
119
  "mocked-exports": "^0.1.1",
110
120
  "nuxt-site-config": "^4.0.8",
111
121
  "nuxtseo-shared": "^5.1.3",
112
122
  "nypm": "^0.6.6",
113
123
  "ofetch": "^1.5.1",
114
124
  "ohash": "^2.0.11",
115
- "oxc-parser": "^0.128.0",
116
- "oxc-walker": "^0.7.0",
125
+ "oxc-parser": "^0.134.0",
126
+ "oxc-walker": "^1.0.0",
117
127
  "pathe": "^2.0.3",
118
128
  "pkg-types": "^2.3.1",
119
129
  "radix3": "^1.1.2",
120
130
  "std-env": "^4.1.0",
121
131
  "strip-literal": "^3.1.0",
122
- "tinyexec": "^1.1.2",
123
- "tinyglobby": "^0.2.16",
132
+ "tinyexec": "^1.2.4",
133
+ "tinyglobby": "^0.2.17",
124
134
  "ufo": "^1.6.4",
125
135
  "ultrahtml": "^1.6.0",
126
136
  "unplugin": "^3.0.0"
127
137
  },
128
138
  "devDependencies": {
129
- "@antfu/eslint-config": "^8.2.0",
139
+ "@antfu/eslint-config": "^9.0.0",
130
140
  "@fontsource/noto-sans-sc": "^5.2.9",
131
- "@iconify-json/carbon": "^1.2.20",
141
+ "@iconify-json/carbon": "^1.2.22",
132
142
  "@iconify-json/logos": "^1.2.11",
133
143
  "@iconify-json/noto": "^1.2.7",
134
144
  "@iconify-json/ri": "^1.2.10",
135
- "@iconify-json/tabler": "^1.2.33",
145
+ "@iconify-json/tabler": "^1.2.35",
146
+ "@iconify/types": "^2.0.0",
136
147
  "@img/sharp-linux-x64": "^0.34.5",
137
- "@nuxt/content": "^3.13.0",
138
- "@nuxt/devtools": "4.0.0-alpha.4",
139
- "@nuxt/devtools-kit": "4.0.0-alpha.4",
148
+ "@nuxt/content": "^3.14.0",
149
+ "@nuxt/devtools": "4.0.0-alpha.7",
150
+ "@nuxt/devtools-kit": "4.0.0-alpha.7",
140
151
  "@nuxt/fonts": "^0.14.0",
141
- "@nuxt/icon": "^2.2.2",
152
+ "@nuxt/icon": "^2.2.3",
142
153
  "@nuxt/image": "^2.0.0",
143
154
  "@nuxt/module-builder": "^1.0.2",
144
155
  "@nuxt/test-utils": "^4.0.3",
145
- "@nuxt/ui": "^4.7.1",
156
+ "@nuxt/ui": "^4.8.1",
146
157
  "@nuxtjs/color-mode": "^4.0.0",
147
158
  "@nuxtjs/eslint-config-typescript": "^12.1.0",
148
- "@nuxtjs/i18n": "^10.3.0",
159
+ "@nuxtjs/i18n": "^10.4.0",
149
160
  "@nuxtjs/tailwindcss": "7.0.0-beta.1",
150
161
  "@resvg/resvg-js": "^2.6.2",
151
162
  "@resvg/resvg-wasm": "^2.6.2",
152
- "@shikijs/langs": "^4.0.2",
153
- "@shikijs/themes": "^4.0.2",
154
- "@tailwindcss/vite": "^4.2.4",
155
- "@takumi-rs/core": "^1.1.2",
156
- "@takumi-rs/wasm": "^1.1.2",
157
- "@unocss/nuxt": "^66.6.8",
158
- "@vitejs/plugin-vue": "^6.0.6",
163
+ "@shikijs/langs": "^4.2.0",
164
+ "@shikijs/themes": "^4.2.0",
165
+ "@tailwindcss/vite": "^4.3.0",
166
+ "@takumi-rs/core": "^1.7.0",
167
+ "@takumi-rs/helpers": "^1.7.0",
168
+ "@takumi-rs/wasm": "^1.7.0",
169
+ "@unocss/nuxt": "^66.7.0",
170
+ "@unocss/preset-icons": "^66.7.0",
171
+ "@unocss/preset-wind": "^66.7.0",
172
+ "@unocss/preset-wind4": "^66.7.0",
173
+ "@vitejs/plugin-vue": "^6.0.7",
174
+ "@vue/compiler-core": "^3.5.35",
159
175
  "@vueuse/nuxt": "^14.3.0",
160
176
  "birpc": "^4.0.0",
161
- "bumpp": "^11.0.1",
162
- "eslint": "^10.3.0",
163
- "eslint-plugin-harlanzw": "^0.12.1",
177
+ "bumpp": "^11.1.0",
178
+ "eslint": "^10.4.1",
179
+ "eslint-plugin-harlanzw": "^0.17.0",
164
180
  "fontless": "^0.2.1",
165
181
  "get-image-colors": "^4.0.1",
166
182
  "globby": "^16.2.0",
167
- "happy-dom": "^20.9.0",
183
+ "happy-dom": "^20.10.1",
168
184
  "hookable": "^6.1.1",
169
185
  "jest-image-snapshot": "^6.5.2",
170
186
  "lightningcss": "^1.32.0",
171
- "nuxt": "^4.4.4",
187
+ "nitropack": "^2.13.4",
188
+ "nuxt": "^4.4.7",
172
189
  "nuxtseo-layer-devtools": "^5.1.3",
173
- "playwright": "^1.59.1",
174
- "playwright-core": "^1.59.1",
175
- "sass": "^1.99.0",
190
+ "playwright": "^1.60.0",
191
+ "playwright-core": "^1.60.0",
192
+ "sass": "^1.100.0",
176
193
  "satori": "^0.26.0",
177
194
  "sharp": "^0.34.5",
178
195
  "sirv": "^3.0.2",
179
- "tailwindcss": "^4.2.4",
196
+ "tailwindcss": "^4.3.0",
180
197
  "typescript": "^6.0.3",
198
+ "unbuild": "^3.6.1",
181
199
  "unifont": "^0.7.4",
182
- "unocss": "^66.6.8",
183
- "vitest": "^4.1.5",
184
- "vue-tsc": "^3.2.8",
185
- "wrangler": "^4.87.0",
186
- "yoga-wasm-web": "^0.3.3"
200
+ "unocss": "^66.7.0",
201
+ "vitest": "^4.1.8",
202
+ "vue": "^3.5.35",
203
+ "vue-tsc": "^3.3.3",
204
+ "wrangler": "^4.97.0",
205
+ "yoga-wasm-web": "^0.3.3",
206
+ "zod": "^4.4.3"
187
207
  },
188
208
  "scripts": {
189
209
  "snapshots": "node --import jiti/register scripts/generate-template-snapshots.ts",