nuxt-og-image 2.0.0-beta.43 → 2.0.0-beta.45
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/README.md +5 -0
- package/dist/client/200.html +2 -2
- package/dist/client/404.html +2 -2
- package/dist/client/_nuxt/{IconCSS.b113975e.js → IconCSS.949abf95.js} +1 -1
- package/dist/client/_nuxt/{ImageLoader.b3f2fdfd.js → ImageLoader.774190b0.js} +1 -1
- package/dist/client/_nuxt/{entry.c23ed2b6.js → entry.fb4ca698.js} +2 -2
- package/dist/client/_nuxt/{error-404.0002113d.js → error-404.736a1e4b.js} +1 -1
- package/dist/client/_nuxt/{error-500.171ba3b2.js → error-500.686b9dc7.js} +1 -1
- package/dist/client/_nuxt/{error-component.bbb20371.js → error-component.87d5d1c8.js} +2 -2
- package/dist/client/_nuxt/{index.b33d70ad.js → index.e24116fd.js} +1 -1
- package/dist/client/_nuxt/{options.446a167e.js → options.9b775832.js} +1 -1
- package/dist/client/_nuxt/{png.2c1d3085.js → png.8caf6198.js} +1 -1
- package/dist/client/_nuxt/{shiki.caf1a928.js → shiki.53e0cdc3.js} +1 -1
- package/dist/client/_nuxt/{svg.01d38cc1.js → svg.166f9ef2.js} +1 -1
- package/dist/client/_nuxt/{vnodes.dbfaa416.js → vnodes.184394d9.js} +1 -1
- package/dist/client/index.html +2 -2
- package/dist/client/options/index.html +2 -2
- package/dist/client/png/index.html +2 -2
- package/dist/client/svg/index.html +2 -2
- package/dist/client/vnodes/index.html +2 -2
- package/dist/module.d.ts +5 -4
- package/dist/module.json +1 -1
- package/dist/module.mjs +15 -4
- package/dist/runtime/components/OgImageBasic.island.vue +5 -0
- package/dist/runtime/nitro/renderers/satori/index.mjs +1 -9
- package/dist/runtime/nitro/renderers/satori/plugins/emojis.d.ts +1 -1
- package/dist/runtime/nitro/renderers/satori/plugins/emojis.mjs +24 -9
- package/dist/runtime/nitro/renderers/satori/plugins/encoding.d.ts +1 -1
- package/dist/runtime/nitro/renderers/satori/plugins/flex.d.ts +1 -1
- package/dist/runtime/nitro/renderers/satori/plugins/imageSrc.d.ts +1 -1
- package/dist/runtime/nitro/renderers/satori/plugins/twClasses.d.ts +1 -1
- package/dist/runtime/nitro/renderers/satori/utils.d.ts +2 -2
- package/dist/runtime/nitro/renderers/satori/utils.mjs +2 -2
- package/dist/runtime/nitro/routes/html.mjs +21 -19
- package/package.json +2 -1
|
@@ -1,13 +1,28 @@
|
|
|
1
1
|
import { defineSatoriTransformer } from "../utils.mjs";
|
|
2
|
+
function isEmojiFilter(node) {
|
|
3
|
+
return node.type === "img" && node.props?.class?.includes("emoji");
|
|
4
|
+
}
|
|
2
5
|
export default defineSatoriTransformer(() => {
|
|
3
|
-
return
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
node.props
|
|
7
|
-
node
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
6
|
+
return [
|
|
7
|
+
// need to make sure parent div has flex for the emoji to render inline
|
|
8
|
+
{
|
|
9
|
+
filter: (node) => node.type === "div" && Array.isArray(node.props?.children) && node.props.children.some(isEmojiFilter),
|
|
10
|
+
transform: async (node) => {
|
|
11
|
+
node.props.style = node.props.style || {};
|
|
12
|
+
node.props.style.display = "flex";
|
|
13
|
+
node.props.style.alignItems = "center";
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
filter: isEmojiFilter,
|
|
18
|
+
transform: async (node) => {
|
|
19
|
+
node.props.style = node.props.style || {};
|
|
20
|
+
node.props.style.height = "1em";
|
|
21
|
+
node.props.style.width = "1em";
|
|
22
|
+
node.props.style.margin = "0 .3em 0 .3em";
|
|
23
|
+
node.props.style.verticalAlign = "0.1em";
|
|
24
|
+
node.props.class = "";
|
|
25
|
+
}
|
|
11
26
|
}
|
|
12
|
-
|
|
27
|
+
];
|
|
13
28
|
});
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
declare const _default: (url: import("ufo").ParsedURL) => import("../../../../../types").SatoriTransformer;
|
|
1
|
+
declare const _default: (url: import("ufo").ParsedURL) => import("../../../../../types").SatoriTransformer | import("../../../../../types").SatoriTransformer[];
|
|
2
2
|
export default _default;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
declare const _default: (url: import("ufo").ParsedURL) => import("../../../../../types").SatoriTransformer;
|
|
1
|
+
declare const _default: (url: import("ufo").ParsedURL) => import("../../../../../types").SatoriTransformer | import("../../../../../types").SatoriTransformer[];
|
|
2
2
|
export default _default;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
declare const _default: (url: import("ufo").ParsedURL) => import("../../../../../types").SatoriTransformer;
|
|
1
|
+
declare const _default: (url: import("ufo").ParsedURL) => import("../../../../../types").SatoriTransformer | import("../../../../../types").SatoriTransformer[];
|
|
2
2
|
export default _default;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
declare const _default: (url: import("ufo").ParsedURL) => import("../../../../../types").SatoriTransformer;
|
|
1
|
+
declare const _default: (url: import("ufo").ParsedURL) => import("../../../../../types").SatoriTransformer | import("../../../../../types").SatoriTransformer[];
|
|
2
2
|
export default _default;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ParsedURL } from 'ufo';
|
|
2
2
|
import type { FontConfig, SatoriTransformer, VNode } from '../../../../types';
|
|
3
3
|
export declare function loadFont(baseURL: string, font: FontConfig): Promise<any>;
|
|
4
|
-
export declare function walkSatoriTree(url: ParsedURL, node: VNode, plugins: SatoriTransformer[]): Promise<void>;
|
|
5
|
-
export declare function defineSatoriTransformer(transformer: (url: ParsedURL) => SatoriTransformer): (url: ParsedURL) => SatoriTransformer;
|
|
4
|
+
export declare function walkSatoriTree(url: ParsedURL, node: VNode, plugins: (SatoriTransformer | SatoriTransformer[])[]): Promise<void>;
|
|
5
|
+
export declare function defineSatoriTransformer(transformer: (url: ParsedURL) => SatoriTransformer | SatoriTransformer[]): (url: ParsedURL) => SatoriTransformer | SatoriTransformer[];
|
|
@@ -16,7 +16,7 @@ export async function loadFont(baseURL, font) {
|
|
|
16
16
|
if (!data && name === "Inter" && ["400", "700"].includes(weight)) {
|
|
17
17
|
data = await readPublicAsset(`/inter-latin-ext-${weight}-normal.woff`);
|
|
18
18
|
}
|
|
19
|
-
if (
|
|
19
|
+
if (font.path) {
|
|
20
20
|
data = await readPublicAsset(font.path);
|
|
21
21
|
if (!data) {
|
|
22
22
|
try {
|
|
@@ -49,7 +49,7 @@ export async function walkSatoriTree(url, node, plugins) {
|
|
|
49
49
|
}
|
|
50
50
|
for (const child of node.props.children || []) {
|
|
51
51
|
if (child) {
|
|
52
|
-
for (const plugin of plugins) {
|
|
52
|
+
for (const plugin of plugins.flat()) {
|
|
53
53
|
if (plugin.filter(child))
|
|
54
54
|
await plugin.transform(child);
|
|
55
55
|
}
|
|
@@ -3,6 +3,7 @@ import { renderSSRHead } from "@unhead/ssr";
|
|
|
3
3
|
import { createHeadCore } from "@unhead/vue";
|
|
4
4
|
import { createError, defineEventHandler, getQuery, sendRedirect } from "h3";
|
|
5
5
|
import { hash } from "ohash";
|
|
6
|
+
import twemoji from "twemoji";
|
|
6
7
|
import { fetchOptions, useHostname } from "../utils.mjs";
|
|
7
8
|
import { useRuntimeConfig } from "#imports";
|
|
8
9
|
export default defineEventHandler(async (e) => {
|
|
@@ -40,11 +41,15 @@ export default defineEventHandler(async (e) => {
|
|
|
40
41
|
head.push(island.head);
|
|
41
42
|
let defaultFontFamily = "sans-serif";
|
|
42
43
|
const firstFont = fonts[0];
|
|
43
|
-
if (firstFont)
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
44
|
+
if (firstFont)
|
|
45
|
+
defaultFontFamily = firstFont.name;
|
|
46
|
+
let html = island.html;
|
|
47
|
+
try {
|
|
48
|
+
html = twemoji.parse(html, {
|
|
49
|
+
folder: "svg",
|
|
50
|
+
ext: ".svg"
|
|
51
|
+
});
|
|
52
|
+
} catch (e2) {
|
|
48
53
|
}
|
|
49
54
|
head.push({
|
|
50
55
|
style: [
|
|
@@ -52,9 +57,9 @@ export default defineEventHandler(async (e) => {
|
|
|
52
57
|
// default font is the first font family
|
|
53
58
|
innerHTML: `body { font-family: '${defaultFontFamily.replace("+", " ")}', sans-serif; }`
|
|
54
59
|
},
|
|
55
|
-
|
|
60
|
+
{
|
|
56
61
|
innerHTML: `body {
|
|
57
|
-
transform: scale(${scale});
|
|
62
|
+
transform: scale(${scale || 1});
|
|
58
63
|
transform-origin: top left;
|
|
59
64
|
max-height: 100vh;
|
|
60
65
|
position: relative;
|
|
@@ -68,17 +73,15 @@ img.emoji {
|
|
|
68
73
|
width: 1em;
|
|
69
74
|
margin: 0 .05em 0 .1em;
|
|
70
75
|
vertical-align: -0.1em;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
...fonts.filter((font) => typeof font === "object").map((font) => {
|
|
75
|
-
const { name, weight, path: path2 } = font;
|
|
76
|
+
}`
|
|
77
|
+
},
|
|
78
|
+
...fonts.filter((font) => font.path).map((font) => {
|
|
76
79
|
return `
|
|
77
80
|
@font-face {
|
|
78
|
-
font-family: '${name}';
|
|
81
|
+
font-family: '${font.name}';
|
|
79
82
|
font-style: normal;
|
|
80
|
-
font-weight: ${weight};
|
|
81
|
-
src: url('${
|
|
83
|
+
font-weight: ${font.weight};
|
|
84
|
+
src: url('${font.path}') format('truetype');
|
|
82
85
|
}
|
|
83
86
|
`;
|
|
84
87
|
})
|
|
@@ -108,10 +111,9 @@ img.emoji {
|
|
|
108
111
|
rel: "stylesheet"
|
|
109
112
|
},
|
|
110
113
|
// have to add each weight as their own stylesheet
|
|
111
|
-
...fonts.filter((font) =>
|
|
112
|
-
const [name, weight] = font.split(":");
|
|
114
|
+
...fonts.filter((font) => !font.path).map((font) => {
|
|
113
115
|
return {
|
|
114
|
-
href: `https://fonts.googleapis.com/css2?family=${name}:wght@${weight}&display=swap`,
|
|
116
|
+
href: `https://fonts.googleapis.com/css2?family=${font.name}:wght@${font.weight}&display=swap`,
|
|
115
117
|
rel: "stylesheet"
|
|
116
118
|
};
|
|
117
119
|
})
|
|
@@ -121,6 +123,6 @@ img.emoji {
|
|
|
121
123
|
return `<!DOCTYPE html>
|
|
122
124
|
<html ${headChunk.htmlAttrs}>
|
|
123
125
|
<head>${headChunk.headTags}</head>
|
|
124
|
-
<body ${headChunk.bodyAttrs}>${headChunk.bodyTagsOpen}<div style="position: relative; display: flex; margin: 0 auto; width: 1200px; height: 630px;">${
|
|
126
|
+
<body ${headChunk.bodyAttrs}>${headChunk.bodyTagsOpen}<div style="position: relative; display: flex; margin: 0 auto; width: 1200px; height: 630px;">${html}</div>${headChunk.bodyTags}</body>
|
|
125
127
|
</html>`;
|
|
126
128
|
});
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "nuxt-og-image",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "2.0.0-beta.
|
|
4
|
+
"version": "2.0.0-beta.45",
|
|
5
5
|
"packageManager": "pnpm@8.6.0",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"funding": "https://github.com/sponsors/harlan-zw",
|
|
@@ -41,6 +41,7 @@
|
|
|
41
41
|
"globby": "^13.1.4",
|
|
42
42
|
"launch-editor": "^2.6.0",
|
|
43
43
|
"nuxt-icon": "^0.4.1",
|
|
44
|
+
"nuxt-site-config": "^0.2.1",
|
|
44
45
|
"nypm": "^0.2.0",
|
|
45
46
|
"ofetch": "^1.0.1",
|
|
46
47
|
"ohash": "^1.1.2",
|