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.
- 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/content.d.cts +2 -14
- package/dist/content.d.mts +2 -14
- package/dist/content.d.ts +2 -14
- package/dist/devtools/200.html +1 -1
- package/dist/devtools/404.html +1 -1
- package/dist/devtools/_nuxt/{TwxRLlMM.js → B9jrmesR.js} +1 -1
- package/dist/devtools/_nuxt/BA-4cUNc.js +1 -0
- package/dist/devtools/_nuxt/{BLdiDWsd.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/{oq4DzcWM.js → C5797Ieg.js} +1 -1
- package/dist/devtools/_nuxt/{D0mxCJKN.js → C_JnDlx-.js} +1 -1
- package/dist/devtools/_nuxt/{DNGiVUg5.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/{BFE1I-6y.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/{IFrameLoader.Bd09J70F.css → IFrameLoader.k_861Nnq.css} +1 -1
- 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.sZ4TsxJx.css → pages.Ci_xvfJ8.css} +1 -1
- package/dist/devtools/_nuxt/renderer-select.COGJ4ZQe.css +1 -0
- package/dist/devtools/_nuxt/{templates.BHO7w0UG.css → templates.BByln3BG.css} +1 -1
- package/dist/devtools/_nuxt/{DWbsyffp.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/app/components/Templates/Community/BlogPost.takumi.d.vue.ts +2 -2
- package/dist/runtime/app/components/Templates/Community/BlogPost.takumi.vue.d.ts +2 -2
- package/dist/runtime/app/components/Templates/Community/Brutalist.satori.d.vue.ts +2 -2
- package/dist/runtime/app/components/Templates/Community/Brutalist.satori.vue.d.ts +2 -2
- package/dist/runtime/app/components/Templates/Community/Docs.takumi.d.vue.ts +2 -2
- package/dist/runtime/app/components/Templates/Community/Docs.takumi.vue.d.ts +2 -2
- package/dist/runtime/app/components/Templates/Community/Frame.satori.d.vue.ts +2 -2
- package/dist/runtime/app/components/Templates/Community/Frame.satori.vue.d.ts +2 -2
- package/dist/runtime/app/components/Templates/Community/Nuxt.satori.d.vue.ts +2 -2
- package/dist/runtime/app/components/Templates/Community/Nuxt.satori.vue.d.ts +2 -2
- package/dist/runtime/app/components/Templates/Community/NuxtSeo.satori.d.vue.ts +2 -2
- package/dist/runtime/app/components/Templates/Community/NuxtSeo.satori.vue.d.ts +2 -2
- package/dist/runtime/app/components/Templates/Community/NuxtSeo.takumi.d.vue.ts +2 -2
- package/dist/runtime/app/components/Templates/Community/NuxtSeo.takumi.vue.d.ts +2 -2
- package/dist/runtime/app/components/Templates/Community/Pergel.satori.d.vue.ts +2 -2
- package/dist/runtime/app/components/Templates/Community/Pergel.satori.vue.d.ts +2 -2
- package/dist/runtime/app/components/Templates/Community/ProductCard.takumi.d.vue.ts +2 -2
- package/dist/runtime/app/components/Templates/Community/ProductCard.takumi.vue.d.ts +2 -2
- package/dist/runtime/app/components/Templates/Community/SaaS.satori.d.vue.ts +2 -2
- package/dist/runtime/app/components/Templates/Community/SaaS.satori.vue.d.ts +2 -2
- package/dist/runtime/app/components/Templates/Community/SimpleBlog.satori.d.vue.ts +2 -2
- package/dist/runtime/app/components/Templates/Community/SimpleBlog.satori.vue.d.ts +2 -2
- package/dist/runtime/app/components/Templates/Community/UnJs.satori.d.vue.ts +2 -2
- package/dist/runtime/app/components/Templates/Community/UnJs.satori.vue.d.ts +2 -2
- package/dist/runtime/app/components/Templates/Community/WithEmoji.satori.d.vue.ts +2 -2
- package/dist/runtime/app/components/Templates/Community/WithEmoji.satori.vue.d.ts +2 -2
- package/dist/runtime/server/og-image/bindings/browser/cloudflare.js +2 -1
- package/dist/runtime/server/og-image/browser/screenshot.js +4 -1
- package/dist/runtime/server/og-image/takumi/instances.d.ts +1 -1
- package/dist/runtime/server/og-image/takumi/nodes.d.ts +1 -1
- package/dist/runtime/server/og-image/takumi/renderer.js +9 -4
- package/dist/runtime/server/util/cache.d.ts +5 -0
- package/dist/runtime/server/util/cache.js +22 -17
- package/dist/runtime/server/util/kit.js +1 -1
- package/dist/runtime/server/util/ssrf.js +15 -0
- package/dist/runtime/server/util/wasm.js +2 -2
- package/dist/shared/{nuxt-og-image.DVJCoUpz.cjs → nuxt-og-image.CgPzmzQY.cjs} +29 -15
- package/dist/shared/{nuxt-og-image.CBAJqzNe.mjs → nuxt-og-image.DGAMxBol.mjs} +28 -14
- package/package.json +61 -41
- package/dist/devtools/_nuxt/BFnUFv7a.js +0 -6
- package/dist/devtools/_nuxt/BeokGQcV.js +0 -1
- package/dist/devtools/_nuxt/CAvCRPq5.js +0 -23
- package/dist/devtools/_nuxt/D-SbM8XJ.js +0 -3
- package/dist/devtools/_nuxt/Dd8dEdTA.js +0 -3
- package/dist/devtools/_nuxt/DdjB2us_.js +0 -4
- package/dist/devtools/_nuxt/DevtoolsSection.DithqiRs.css +0 -1
- package/dist/devtools/_nuxt/DevtoolsSnippet.Bi7K9LD7.css +0 -1
- package/dist/devtools/_nuxt/builds/meta/4e19b9f7-298b-4c14-85e9-238c217158cb.json +0 -1
- package/dist/devtools/_nuxt/entry.D10ZDedD.css +0 -2
- package/dist/devtools/_nuxt/renderer-select.DomsjmoH.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
|
@@ -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]).
|
|
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 {
|
|
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 =
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
98
|
-
"@nuxt/kit": "^4.4.
|
|
99
|
-
"@
|
|
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.
|
|
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.
|
|
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.
|
|
116
|
-
"oxc-walker": "^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.
|
|
123
|
-
"tinyglobby": "^0.2.
|
|
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": "^
|
|
139
|
+
"@antfu/eslint-config": "^9.0.0",
|
|
130
140
|
"@fontsource/noto-sans-sc": "^5.2.9",
|
|
131
|
-
"@iconify-json/carbon": "^1.2.
|
|
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.
|
|
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.
|
|
138
|
-
"@nuxt/devtools": "4.0.0-alpha.
|
|
139
|
-
"@nuxt/devtools-kit": "4.0.0-alpha.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
153
|
-
"@shikijs/themes": "^4.0
|
|
154
|
-
"@tailwindcss/vite": "^4.
|
|
155
|
-
"@takumi-rs/core": "^1.
|
|
156
|
-
"@takumi-rs/
|
|
157
|
-
"@
|
|
158
|
-
"@
|
|
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
|
|
162
|
-
"eslint": "^10.
|
|
163
|
-
"eslint-plugin-harlanzw": "^0.
|
|
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.
|
|
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
|
-
"
|
|
187
|
+
"nitropack": "^2.13.4",
|
|
188
|
+
"nuxt": "^4.4.7",
|
|
172
189
|
"nuxtseo-layer-devtools": "^5.1.3",
|
|
173
|
-
"playwright": "^1.
|
|
174
|
-
"playwright-core": "^1.
|
|
175
|
-
"sass": "^1.
|
|
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.
|
|
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.
|
|
183
|
-
"vitest": "^4.1.
|
|
184
|
-
"vue
|
|
185
|
-
"
|
|
186
|
-
"
|
|
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",
|