nuxt-og-image 6.5.1 → 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.
- package/dist/chunks/tw4.cjs +2 -2
- package/dist/chunks/tw4.mjs +2 -2
- package/dist/chunks/uno.cjs +2 -2
- package/dist/chunks/uno.mjs +2 -2
- package/dist/devtools/200.html +1 -1
- package/dist/devtools/404.html +1 -1
- package/dist/devtools/_nuxt/{CG2dMR0n.js → B9jrmesR.js} +1 -1
- package/dist/devtools/_nuxt/BA-4cUNc.js +1 -0
- package/dist/devtools/_nuxt/{BDwLh8IC.js → BOEXnX7x.js} +3 -3
- package/dist/devtools/_nuxt/BWKJ0Uxb.js +30 -0
- package/dist/devtools/_nuxt/Bdtz4ZK9.js +4 -0
- package/dist/devtools/_nuxt/{Bi8Ot4jU.js → C5797Ieg.js} +1 -1
- package/dist/devtools/_nuxt/{CZyMS8w7.js → C_JnDlx-.js} +1 -1
- package/dist/devtools/_nuxt/{DLBiwS9Q.js → CdmciVPJ.js} +1 -1
- package/dist/devtools/_nuxt/CqjbkMN9.js +3 -0
- package/dist/devtools/_nuxt/D4EkL0XJ.js +6 -0
- package/dist/devtools/_nuxt/DKaW7clv.js +1 -0
- package/dist/devtools/_nuxt/{ClR6R-VC.js → DSl3mlLY.js} +1 -1
- package/dist/devtools/_nuxt/DYta7Mdi.js +3 -0
- package/dist/devtools/_nuxt/DevtoolsSection.CcOMr_vO.css +1 -0
- package/dist/devtools/_nuxt/DevtoolsSnippet.BhrTdbXn.css +1 -0
- package/dist/devtools/_nuxt/builds/latest.json +1 -1
- package/dist/devtools/_nuxt/builds/meta/a36bc212-7179-4aa2-a534-6366229bd7b1.json +1 -0
- package/dist/devtools/_nuxt/entry.CcrXpo2y.css +2 -0
- package/dist/devtools/_nuxt/{pages.tL-enpGt.css → pages.Ci_xvfJ8.css} +1 -1
- package/dist/devtools/_nuxt/renderer-select.COGJ4ZQe.css +1 -0
- package/dist/devtools/_nuxt/{Cl1WSuAY.js → wMBdlVF-.js} +2 -2
- 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 +2 -2
- package/dist/module.json +1 -1
- package/dist/module.mjs +2 -2
- package/dist/runtime/server/util/cache.d.ts +5 -0
- package/dist/runtime/server/util/cache.js +18 -15
- package/dist/runtime/server/util/ssrf.js +15 -0
- package/dist/shared/{nuxt-og-image.PENnTk2D.cjs → nuxt-og-image.CgPzmzQY.cjs} +21 -10
- package/dist/shared/{nuxt-og-image.OxKJTI9W.mjs → nuxt-og-image.DGAMxBol.mjs} +20 -9
- package/package.json +43 -39
- package/dist/devtools/_nuxt/BtwCZKCF.js +0 -3
- package/dist/devtools/_nuxt/C_Ue0QmI.js +0 -6
- package/dist/devtools/_nuxt/D0axj6Iu.js +0 -3
- package/dist/devtools/_nuxt/DevtoolsSection.CUBF7JZp.css +0 -1
- package/dist/devtools/_nuxt/DevtoolsSnippet.BrmJtCzf.css +0 -1
- package/dist/devtools/_nuxt/DuE42O8q.js +0 -1
- package/dist/devtools/_nuxt/PKWaIwi-.js +0 -23
- package/dist/devtools/_nuxt/ZHCkGAGo.js +0 -4
- package/dist/devtools/_nuxt/builds/meta/b91fb756-2cb4-4d37-8163-f13db20bcfb2.json +0 -1
- package/dist/devtools/_nuxt/entry.eBRL0Csn.css +0 -2
- package/dist/devtools/_nuxt/renderer-select.DowliTcg.css +0 -1
- /package/dist/devtools/_nuxt/{CM-t-6ZT.js → C5jzcy9i.js} +0 -0
- /package/dist/devtools/_nuxt/{HWyD49jH.js → CCTv7mmB.js} +0 -0
- /package/dist/devtools/_nuxt/{BsRKQH5X.js → CuJezOxb.js} +0 -0
- /package/dist/devtools/_nuxt/{CDaXKRRu.js → E8AZ6HoH.js} +0 -0
- /package/dist/devtools/_nuxt/{PONEy9N-.js → O5eLyffU.js} +0 -0
package/dist/module.cjs
CHANGED
|
@@ -9,13 +9,13 @@ require('nuxt-site-config/kit');
|
|
|
9
9
|
require('ohash');
|
|
10
10
|
require('pathe');
|
|
11
11
|
require('pkg-types');
|
|
12
|
-
|
|
12
|
+
require('std-env');
|
|
13
|
+
const module$1 = require('./shared/nuxt-og-image.CgPzmzQY.cjs');
|
|
13
14
|
require('nuxtseo-shared/kit');
|
|
14
15
|
require('../dist/runtime/logger.js');
|
|
15
16
|
require('node:crypto');
|
|
16
17
|
require('oxc-walker');
|
|
17
18
|
require('chrome-launcher');
|
|
18
|
-
require('std-env');
|
|
19
19
|
require('nypm');
|
|
20
20
|
require('nuxtseo-shared/devtools');
|
|
21
21
|
require('unstorage');
|
package/dist/module.json
CHANGED
package/dist/module.mjs
CHANGED
|
@@ -7,13 +7,13 @@ import 'nuxt-site-config/kit';
|
|
|
7
7
|
import 'ohash';
|
|
8
8
|
import 'pathe';
|
|
9
9
|
import 'pkg-types';
|
|
10
|
-
|
|
10
|
+
import 'std-env';
|
|
11
|
+
export { m as default } from './shared/nuxt-og-image.DGAMxBol.mjs';
|
|
11
12
|
import 'nuxtseo-shared/kit';
|
|
12
13
|
import '../dist/runtime/logger.js';
|
|
13
14
|
import 'node:crypto';
|
|
14
15
|
import 'oxc-walker';
|
|
15
16
|
import 'chrome-launcher';
|
|
16
|
-
import 'std-env';
|
|
17
17
|
import 'nypm';
|
|
18
18
|
import 'nuxtseo-shared/devtools';
|
|
19
19
|
import 'unstorage';
|
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
import type { H3Error } from 'h3';
|
|
2
2
|
import type { OgImageRenderEventContext } from '../../types.js';
|
|
3
|
+
declare module 'nitropack/types' {
|
|
4
|
+
interface NitroApp {
|
|
5
|
+
_ogImageCacheBackendWarned?: boolean;
|
|
6
|
+
}
|
|
7
|
+
}
|
|
3
8
|
export declare function useOgImageBufferCache(ctx: OgImageRenderEventContext, options: {
|
|
4
9
|
baseCacheKey: string | false;
|
|
5
10
|
cacheMaxAgeSeconds?: number;
|
|
@@ -12,9 +12,15 @@ function safeCompare(a, b) {
|
|
|
12
12
|
mismatch |= a.charCodeAt(i) ^ b.charCodeAt(i);
|
|
13
13
|
return mismatch === 0;
|
|
14
14
|
}
|
|
15
|
+
function warnCacheBackendUnreachable(ctx, baseCacheKey, e) {
|
|
16
|
+
if (ctx._nitro._ogImageCacheBackendWarned)
|
|
17
|
+
return;
|
|
18
|
+
ctx._nitro._ogImageCacheBackendWarned = true;
|
|
19
|
+
logger.warn(`[Nuxt OG Image] Cache backend "${baseCacheKey}" unreachable, continuing without cache: ${e?.message || e}`);
|
|
20
|
+
}
|
|
15
21
|
export async function useOgImageBufferCache(ctx, options) {
|
|
16
22
|
const maxAge = Number(options.cacheMaxAgeSeconds);
|
|
17
|
-
const intentionallyEnabled = !import.meta.dev && maxAge > 0;
|
|
23
|
+
const intentionallyEnabled = !import.meta.dev && !import.meta.prerender && maxAge > 0;
|
|
18
24
|
let enabled = intentionallyEnabled;
|
|
19
25
|
const cache = prefixStorage(useStorage(), withTrailingSlash(options.baseCacheKey || "/"));
|
|
20
26
|
const key = ctx.key;
|
|
@@ -22,19 +28,16 @@ export async function useOgImageBufferCache(ctx, options) {
|
|
|
22
28
|
if (enabled) {
|
|
23
29
|
const hasItem = await cache.hasItem(key).catch((e) => {
|
|
24
30
|
enabled = false;
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
statusCode: 500,
|
|
28
|
-
statusMessage: `[Nuxt OG Image] Failed to connect to cache ${options.baseCacheKey}. Response from cache: ${e.message}`
|
|
29
|
-
});
|
|
31
|
+
warnCacheBackendUnreachable(ctx, options.baseCacheKey, e);
|
|
32
|
+
return false;
|
|
30
33
|
});
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
}
|
|
34
|
+
const entry = hasItem ? await cache.getItem(key).catch((e) => {
|
|
35
|
+
enabled = false;
|
|
36
|
+
warnCacheBackendUnreachable(ctx, options.baseCacheKey, e);
|
|
37
|
+
return null;
|
|
38
|
+
}) : null;
|
|
39
|
+
if (entry) {
|
|
40
|
+
const { value, expiresAt, headers } = entry;
|
|
38
41
|
const purgeValue = getQuery(ctx.e).purge;
|
|
39
42
|
if (typeof purgeValue !== "undefined") {
|
|
40
43
|
if (options.secret && !safeCompare(String(purgeValue), options.secret)) {
|
|
@@ -64,7 +67,7 @@ export async function useOgImageBufferCache(ctx, options) {
|
|
|
64
67
|
}
|
|
65
68
|
}
|
|
66
69
|
}
|
|
67
|
-
if (!enabled) {
|
|
70
|
+
if (!enabled && !import.meta.prerender) {
|
|
68
71
|
setHeader(ctx.e, "Cache-Control", "no-cache, no-store, must-revalidate");
|
|
69
72
|
setHeader(ctx.e, "Pragma", "no-cache");
|
|
70
73
|
setHeader(ctx.e, "Expires", "0");
|
|
@@ -73,7 +76,7 @@ export async function useOgImageBufferCache(ctx, options) {
|
|
|
73
76
|
enabled,
|
|
74
77
|
cachedItem,
|
|
75
78
|
async update(item) {
|
|
76
|
-
setHeader(ctx.e, "X-OG-Cache",
|
|
79
|
+
setHeader(ctx.e, "X-OG-Cache", enabled ? "MISS" : "DISABLED");
|
|
77
80
|
if (!enabled)
|
|
78
81
|
return;
|
|
79
82
|
const value = Buffer.from(item).toString("base64");
|
|
@@ -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)
|
|
@@ -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?", {
|
|
@@ -4200,6 +4208,10 @@ async function onInstall(nuxt) {
|
|
|
4200
4208
|
}
|
|
4201
4209
|
return;
|
|
4202
4210
|
}
|
|
4211
|
+
if (!canPromptInteractively()) {
|
|
4212
|
+
logger_js.logger.info("Skipping interactive onboarding (non-interactive environment). Defaulting to the takumi renderer.");
|
|
4213
|
+
return;
|
|
4214
|
+
}
|
|
4203
4215
|
logger_js.logger.info("");
|
|
4204
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");
|
|
4205
4217
|
logger_js.logger.info("\u2502 nuxt-og-image \u2502");
|
|
@@ -4687,15 +4699,9 @@ const module$1 = kit.defineNuxtModule({
|
|
|
4687
4699
|
await onUpgrade(nuxt, options, previousVersion);
|
|
4688
4700
|
},
|
|
4689
4701
|
async setup(config, nuxt) {
|
|
4690
|
-
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.
|
|
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)));
|
|
4691
4703
|
const fixSharedPath = (p) => {
|
|
4692
|
-
|
|
4693
|
-
return p.replace("/shared/runtime/", "/runtime/");
|
|
4694
|
-
if (p.includes("/shared/client"))
|
|
4695
|
-
return p.replace("/shared/client", "/client");
|
|
4696
|
-
if (p.includes("/shared/devtools"))
|
|
4697
|
-
return p.replace("/shared/devtools", "/devtools");
|
|
4698
|
-
return p;
|
|
4704
|
+
return p.replace(/\/shared\/runtime(\/|$)/, "/runtime$1").replace(/\/shared\/client(\/|$)/, "/client$1").replace(/\/shared\/devtools(\/|$)/, "/devtools$1");
|
|
4699
4705
|
};
|
|
4700
4706
|
const resolve = (path) => fixSharedPath(_resolver.resolve(path));
|
|
4701
4707
|
const resolver = {
|
|
@@ -5234,12 +5240,13 @@ ${familyInfo}`);
|
|
|
5234
5240
|
if (preferred) {
|
|
5235
5241
|
ogImageComponentCtx.detectedRenderers.add(preferred.provider);
|
|
5236
5242
|
logger_js.logger.debug(`Using ${preferred.provider} renderer`);
|
|
5237
|
-
} else if (nuxt.options.dev && !nuxt.options._prepare) {
|
|
5243
|
+
} else if (nuxt.options.dev && !nuxt.options._prepare && canPromptInteractively()) {
|
|
5238
5244
|
const renderer = await promptForRendererSelection();
|
|
5239
5245
|
ogImageComponentCtx.detectedRenderers.add(renderer);
|
|
5240
5246
|
logger_js.logger.debug(`Using ${renderer} renderer`);
|
|
5241
5247
|
} else {
|
|
5242
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.");
|
|
5243
5250
|
}
|
|
5244
5251
|
}
|
|
5245
5252
|
const availableRenderers = /* @__PURE__ */ new Set();
|
|
@@ -5255,9 +5262,13 @@ ${familyInfo}`);
|
|
|
5255
5262
|
const { success } = await ensureProviderDependencies(renderer, binding, nuxt);
|
|
5256
5263
|
if (success) {
|
|
5257
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(" ")}`);
|
|
5258
5267
|
} else {
|
|
5259
5268
|
logger_js.logger.error(`Failed to install ${renderer} dependencies. Templates using this renderer won't work.`);
|
|
5260
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(" ")}`);
|
|
5261
5272
|
} else {
|
|
5262
5273
|
logger_js.logger.error(`${renderer} renderer missing dependencies: ${missing.join(", ")}. Install with: npx nypm add ${missing.join(" ")}`);
|
|
5263
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?", {
|
|
@@ -4180,6 +4188,10 @@ async function onInstall(nuxt) {
|
|
|
4180
4188
|
}
|
|
4181
4189
|
return;
|
|
4182
4190
|
}
|
|
4191
|
+
if (!canPromptInteractively()) {
|
|
4192
|
+
logger.info("Skipping interactive onboarding (non-interactive environment). Defaulting to the takumi renderer.");
|
|
4193
|
+
return;
|
|
4194
|
+
}
|
|
4183
4195
|
logger.info("");
|
|
4184
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");
|
|
4185
4197
|
logger.info("\u2502 nuxt-og-image \u2502");
|
|
@@ -4669,13 +4681,7 @@ const module$1 = defineNuxtModule({
|
|
|
4669
4681
|
async setup(config, nuxt) {
|
|
4670
4682
|
const _resolver = createResolver(import.meta.url);
|
|
4671
4683
|
const fixSharedPath = (p) => {
|
|
4672
|
-
|
|
4673
|
-
return p.replace("/shared/runtime/", "/runtime/");
|
|
4674
|
-
if (p.includes("/shared/client"))
|
|
4675
|
-
return p.replace("/shared/client", "/client");
|
|
4676
|
-
if (p.includes("/shared/devtools"))
|
|
4677
|
-
return p.replace("/shared/devtools", "/devtools");
|
|
4678
|
-
return p;
|
|
4684
|
+
return p.replace(/\/shared\/runtime(\/|$)/, "/runtime$1").replace(/\/shared\/client(\/|$)/, "/client$1").replace(/\/shared\/devtools(\/|$)/, "/devtools$1");
|
|
4679
4685
|
};
|
|
4680
4686
|
const resolve = (path) => fixSharedPath(_resolver.resolve(path));
|
|
4681
4687
|
const resolver = {
|
|
@@ -5214,12 +5220,13 @@ ${familyInfo}`);
|
|
|
5214
5220
|
if (preferred) {
|
|
5215
5221
|
ogImageComponentCtx.detectedRenderers.add(preferred.provider);
|
|
5216
5222
|
logger.debug(`Using ${preferred.provider} renderer`);
|
|
5217
|
-
} else if (nuxt.options.dev && !nuxt.options._prepare) {
|
|
5223
|
+
} else if (nuxt.options.dev && !nuxt.options._prepare && canPromptInteractively()) {
|
|
5218
5224
|
const renderer = await promptForRendererSelection();
|
|
5219
5225
|
ogImageComponentCtx.detectedRenderers.add(renderer);
|
|
5220
5226
|
logger.debug(`Using ${renderer} renderer`);
|
|
5221
5227
|
} else {
|
|
5222
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.");
|
|
5223
5230
|
}
|
|
5224
5231
|
}
|
|
5225
5232
|
const availableRenderers = /* @__PURE__ */ new Set();
|
|
@@ -5235,9 +5242,13 @@ ${familyInfo}`);
|
|
|
5235
5242
|
const { success } = await ensureProviderDependencies(renderer, binding, nuxt);
|
|
5236
5243
|
if (success) {
|
|
5237
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(" ")}`);
|
|
5238
5247
|
} else {
|
|
5239
5248
|
logger.error(`Failed to install ${renderer} dependencies. Templates using this renderer won't work.`);
|
|
5240
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(" ")}`);
|
|
5241
5252
|
} else {
|
|
5242
5253
|
logger.error(`${renderer} renderer missing dependencies: ${missing.join(", ")}. Install with: npx nypm add ${missing.join(" ")}`);
|
|
5243
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.
|
|
4
|
+
"version": "6.5.2",
|
|
5
5
|
"description": "Enlightened OG Image generation for Nuxt.",
|
|
6
6
|
"author": {
|
|
7
7
|
"website": "https://harlanzw.com",
|
|
@@ -60,7 +60,8 @@
|
|
|
60
60
|
"sharp": "^0.34.0",
|
|
61
61
|
"tailwindcss": "^4.0.0",
|
|
62
62
|
"unifont": "^0.7.0",
|
|
63
|
-
"unstorage": "^1.15.0"
|
|
63
|
+
"unstorage": "^1.15.0",
|
|
64
|
+
"zod": ">=3"
|
|
64
65
|
},
|
|
65
66
|
"peerDependenciesMeta": {
|
|
66
67
|
"@resvg/resvg-js": {
|
|
@@ -95,14 +96,17 @@
|
|
|
95
96
|
},
|
|
96
97
|
"unifont": {
|
|
97
98
|
"optional": true
|
|
99
|
+
},
|
|
100
|
+
"zod": {
|
|
101
|
+
"optional": true
|
|
98
102
|
}
|
|
99
103
|
},
|
|
100
104
|
"dependencies": {
|
|
101
|
-
"@clack/prompts": "^1.
|
|
102
|
-
"@nuxt/kit": "^4.4.
|
|
103
|
-
"@unocss/config": "^66.
|
|
104
|
-
"@unocss/core": "^66.
|
|
105
|
-
"@vue/compiler-sfc": "^3.5.
|
|
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",
|
|
106
110
|
"chrome-launcher": "^1.2.1",
|
|
107
111
|
"consola": "^3.4.2",
|
|
108
112
|
"culori": "^4.0.2",
|
|
@@ -118,24 +122,23 @@
|
|
|
118
122
|
"nypm": "^0.6.6",
|
|
119
123
|
"ofetch": "^1.5.1",
|
|
120
124
|
"ohash": "^2.0.11",
|
|
121
|
-
"oxc-parser": "^0.
|
|
125
|
+
"oxc-parser": "^0.134.0",
|
|
122
126
|
"oxc-walker": "^1.0.0",
|
|
123
127
|
"pathe": "^2.0.3",
|
|
124
128
|
"pkg-types": "^2.3.1",
|
|
125
129
|
"radix3": "^1.1.2",
|
|
126
130
|
"std-env": "^4.1.0",
|
|
127
131
|
"strip-literal": "^3.1.0",
|
|
128
|
-
"tinyexec": "^1.
|
|
129
|
-
"tinyglobby": "^0.2.
|
|
132
|
+
"tinyexec": "^1.2.4",
|
|
133
|
+
"tinyglobby": "^0.2.17",
|
|
130
134
|
"ufo": "^1.6.4",
|
|
131
135
|
"ultrahtml": "^1.6.0",
|
|
132
|
-
"unplugin": "^3.0.0"
|
|
133
|
-
"zod": "^4.4.3"
|
|
136
|
+
"unplugin": "^3.0.0"
|
|
134
137
|
},
|
|
135
138
|
"devDependencies": {
|
|
136
139
|
"@antfu/eslint-config": "^9.0.0",
|
|
137
140
|
"@fontsource/noto-sans-sc": "^5.2.9",
|
|
138
|
-
"@iconify-json/carbon": "^1.2.
|
|
141
|
+
"@iconify-json/carbon": "^1.2.22",
|
|
139
142
|
"@iconify-json/logos": "^1.2.11",
|
|
140
143
|
"@iconify-json/noto": "^1.2.7",
|
|
141
144
|
"@iconify-json/ri": "^1.2.10",
|
|
@@ -143,50 +146,50 @@
|
|
|
143
146
|
"@iconify/types": "^2.0.0",
|
|
144
147
|
"@img/sharp-linux-x64": "^0.34.5",
|
|
145
148
|
"@nuxt/content": "^3.14.0",
|
|
146
|
-
"@nuxt/devtools": "4.0.0-alpha.
|
|
147
|
-
"@nuxt/devtools-kit": "4.0.0-alpha.
|
|
149
|
+
"@nuxt/devtools": "4.0.0-alpha.7",
|
|
150
|
+
"@nuxt/devtools-kit": "4.0.0-alpha.7",
|
|
148
151
|
"@nuxt/fonts": "^0.14.0",
|
|
149
|
-
"@nuxt/icon": "^2.2.
|
|
152
|
+
"@nuxt/icon": "^2.2.3",
|
|
150
153
|
"@nuxt/image": "^2.0.0",
|
|
151
154
|
"@nuxt/module-builder": "^1.0.2",
|
|
152
155
|
"@nuxt/test-utils": "^4.0.3",
|
|
153
|
-
"@nuxt/ui": "^4.
|
|
156
|
+
"@nuxt/ui": "^4.8.1",
|
|
154
157
|
"@nuxtjs/color-mode": "^4.0.0",
|
|
155
158
|
"@nuxtjs/eslint-config-typescript": "^12.1.0",
|
|
156
|
-
"@nuxtjs/i18n": "^10.
|
|
159
|
+
"@nuxtjs/i18n": "^10.4.0",
|
|
157
160
|
"@nuxtjs/tailwindcss": "7.0.0-beta.1",
|
|
158
161
|
"@resvg/resvg-js": "^2.6.2",
|
|
159
162
|
"@resvg/resvg-wasm": "^2.6.2",
|
|
160
|
-
"@shikijs/langs": "^4.0
|
|
161
|
-
"@shikijs/themes": "^4.0
|
|
163
|
+
"@shikijs/langs": "^4.2.0",
|
|
164
|
+
"@shikijs/themes": "^4.2.0",
|
|
162
165
|
"@tailwindcss/vite": "^4.3.0",
|
|
163
|
-
"@takumi-rs/core": "^1.
|
|
164
|
-
"@takumi-rs/helpers": "^1.
|
|
165
|
-
"@takumi-rs/wasm": "^1.
|
|
166
|
-
"@unocss/nuxt": "^66.
|
|
167
|
-
"@unocss/preset-icons": "^66.
|
|
168
|
-
"@unocss/preset-wind": "^66.
|
|
169
|
-
"@unocss/preset-wind4": "^66.
|
|
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",
|
|
170
173
|
"@vitejs/plugin-vue": "^6.0.7",
|
|
171
|
-
"@vue/compiler-core": "^3.5.
|
|
174
|
+
"@vue/compiler-core": "^3.5.35",
|
|
172
175
|
"@vueuse/nuxt": "^14.3.0",
|
|
173
176
|
"birpc": "^4.0.0",
|
|
174
177
|
"bumpp": "^11.1.0",
|
|
175
|
-
"eslint": "^10.4.
|
|
176
|
-
"eslint-plugin-harlanzw": "^0.
|
|
178
|
+
"eslint": "^10.4.1",
|
|
179
|
+
"eslint-plugin-harlanzw": "^0.17.0",
|
|
177
180
|
"fontless": "^0.2.1",
|
|
178
181
|
"get-image-colors": "^4.0.1",
|
|
179
182
|
"globby": "^16.2.0",
|
|
180
|
-
"happy-dom": "^20.
|
|
183
|
+
"happy-dom": "^20.10.1",
|
|
181
184
|
"hookable": "^6.1.1",
|
|
182
185
|
"jest-image-snapshot": "^6.5.2",
|
|
183
186
|
"lightningcss": "^1.32.0",
|
|
184
187
|
"nitropack": "^2.13.4",
|
|
185
|
-
"nuxt": "^4.4.
|
|
188
|
+
"nuxt": "^4.4.7",
|
|
186
189
|
"nuxtseo-layer-devtools": "^5.1.3",
|
|
187
190
|
"playwright": "^1.60.0",
|
|
188
191
|
"playwright-core": "^1.60.0",
|
|
189
|
-
"sass": "^1.
|
|
192
|
+
"sass": "^1.100.0",
|
|
190
193
|
"satori": "^0.26.0",
|
|
191
194
|
"sharp": "^0.34.5",
|
|
192
195
|
"sirv": "^3.0.2",
|
|
@@ -194,12 +197,13 @@
|
|
|
194
197
|
"typescript": "^6.0.3",
|
|
195
198
|
"unbuild": "^3.6.1",
|
|
196
199
|
"unifont": "^0.7.4",
|
|
197
|
-
"unocss": "^66.
|
|
198
|
-
"vitest": "^4.1.
|
|
199
|
-
"vue": "^3.5.
|
|
200
|
-
"vue-tsc": "^3.3.
|
|
201
|
-
"wrangler": "^4.
|
|
202
|
-
"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"
|
|
203
207
|
},
|
|
204
208
|
"scripts": {
|
|
205
209
|
"snapshots": "node --import jiti/register scripts/generate-template-snapshots.ts",
|