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.
Files changed (35) hide show
  1. package/README.md +5 -0
  2. package/dist/client/200.html +2 -2
  3. package/dist/client/404.html +2 -2
  4. package/dist/client/_nuxt/{IconCSS.b113975e.js → IconCSS.949abf95.js} +1 -1
  5. package/dist/client/_nuxt/{ImageLoader.b3f2fdfd.js → ImageLoader.774190b0.js} +1 -1
  6. package/dist/client/_nuxt/{entry.c23ed2b6.js → entry.fb4ca698.js} +2 -2
  7. package/dist/client/_nuxt/{error-404.0002113d.js → error-404.736a1e4b.js} +1 -1
  8. package/dist/client/_nuxt/{error-500.171ba3b2.js → error-500.686b9dc7.js} +1 -1
  9. package/dist/client/_nuxt/{error-component.bbb20371.js → error-component.87d5d1c8.js} +2 -2
  10. package/dist/client/_nuxt/{index.b33d70ad.js → index.e24116fd.js} +1 -1
  11. package/dist/client/_nuxt/{options.446a167e.js → options.9b775832.js} +1 -1
  12. package/dist/client/_nuxt/{png.2c1d3085.js → png.8caf6198.js} +1 -1
  13. package/dist/client/_nuxt/{shiki.caf1a928.js → shiki.53e0cdc3.js} +1 -1
  14. package/dist/client/_nuxt/{svg.01d38cc1.js → svg.166f9ef2.js} +1 -1
  15. package/dist/client/_nuxt/{vnodes.dbfaa416.js → vnodes.184394d9.js} +1 -1
  16. package/dist/client/index.html +2 -2
  17. package/dist/client/options/index.html +2 -2
  18. package/dist/client/png/index.html +2 -2
  19. package/dist/client/svg/index.html +2 -2
  20. package/dist/client/vnodes/index.html +2 -2
  21. package/dist/module.d.ts +5 -4
  22. package/dist/module.json +1 -1
  23. package/dist/module.mjs +15 -4
  24. package/dist/runtime/components/OgImageBasic.island.vue +5 -0
  25. package/dist/runtime/nitro/renderers/satori/index.mjs +1 -9
  26. package/dist/runtime/nitro/renderers/satori/plugins/emojis.d.ts +1 -1
  27. package/dist/runtime/nitro/renderers/satori/plugins/emojis.mjs +24 -9
  28. package/dist/runtime/nitro/renderers/satori/plugins/encoding.d.ts +1 -1
  29. package/dist/runtime/nitro/renderers/satori/plugins/flex.d.ts +1 -1
  30. package/dist/runtime/nitro/renderers/satori/plugins/imageSrc.d.ts +1 -1
  31. package/dist/runtime/nitro/renderers/satori/plugins/twClasses.d.ts +1 -1
  32. package/dist/runtime/nitro/renderers/satori/utils.d.ts +2 -2
  33. package/dist/runtime/nitro/renderers/satori/utils.mjs +2 -2
  34. package/dist/runtime/nitro/routes/html.mjs +21 -19
  35. 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
- filter: (node) => node.type === "img" && node.props?.class?.includes("emoji"),
5
- transform: async (node) => {
6
- node.props.style = node.props.style || {};
7
- node.props.style.height = "1em";
8
- node.props.style.width = "1em";
9
- node.props.style.margin = "0 .05em 0 .1em";
10
- node.props.style.verticalAlign = "0.1em";
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 (typeof font === "object") {
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
- if (typeof firstFont === "string")
45
- defaultFontFamily = firstFont.split(":")[0];
46
- else
47
- defaultFontFamily = firstFont.name;
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
- scale ? {
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('${path2}') format('truetype');
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) => typeof font === "string").map((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;">${island.html}</div>${headChunk.bodyTags}</body>
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.43",
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",