@vercel/og 0.4.2 → 0.5.0
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/index.edge.js +18088 -11
- package/dist/index.edge.js.map +1 -1
- package/dist/index.node.js +18094 -17
- package/dist/index.node.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-GIRBQXLD.js +0 -135
- package/dist/chunk-GIRBQXLD.js.map +0 -1
package/package.json
CHANGED
package/dist/chunk-GIRBQXLD.js
DELETED
|
@@ -1,135 +0,0 @@
|
|
|
1
|
-
// src/emoji/index.ts
|
|
2
|
-
var U200D = String.fromCharCode(8205);
|
|
3
|
-
var UFE0Fg = /\uFE0F/g;
|
|
4
|
-
function getIconCode(char) {
|
|
5
|
-
return toCodePoint(char.indexOf(U200D) < 0 ? char.replace(UFE0Fg, "") : char);
|
|
6
|
-
}
|
|
7
|
-
function toCodePoint(unicodeSurrogates) {
|
|
8
|
-
var r = [], c = 0, p = 0, i = 0;
|
|
9
|
-
while (i < unicodeSurrogates.length) {
|
|
10
|
-
c = unicodeSurrogates.charCodeAt(i++);
|
|
11
|
-
if (p) {
|
|
12
|
-
r.push((65536 + (p - 55296 << 10) + (c - 56320)).toString(16));
|
|
13
|
-
p = 0;
|
|
14
|
-
} else if (55296 <= c && c <= 56319) {
|
|
15
|
-
p = c;
|
|
16
|
-
} else {
|
|
17
|
-
r.push(c.toString(16));
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
return r.join("-");
|
|
21
|
-
}
|
|
22
|
-
var apis = {
|
|
23
|
-
twemoji: (code) => "https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/svg/" + code.toLowerCase() + ".svg",
|
|
24
|
-
openmoji: "https://cdn.jsdelivr.net/npm/@svgmoji/openmoji@2.0.0/svg/",
|
|
25
|
-
blobmoji: "https://cdn.jsdelivr.net/npm/@svgmoji/blob@2.0.0/svg/",
|
|
26
|
-
noto: "https://cdn.jsdelivr.net/gh/svgmoji/svgmoji/packages/svgmoji__noto/svg/",
|
|
27
|
-
fluent: (code) => "https://cdn.jsdelivr.net/gh/shuding/fluentui-emoji-unicode/assets/" + code.toLowerCase() + "_color.svg",
|
|
28
|
-
fluentFlat: (code) => "https://cdn.jsdelivr.net/gh/shuding/fluentui-emoji-unicode/assets/" + code.toLowerCase() + "_flat.svg"
|
|
29
|
-
};
|
|
30
|
-
function loadEmoji(code, type) {
|
|
31
|
-
if (!type || !apis[type]) {
|
|
32
|
-
type = "twemoji";
|
|
33
|
-
}
|
|
34
|
-
const api = apis[type];
|
|
35
|
-
if (typeof api === "function") {
|
|
36
|
-
return fetch(api(code));
|
|
37
|
-
}
|
|
38
|
-
return fetch(`${api}${code.toUpperCase()}.svg`);
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
// src/og.ts
|
|
42
|
-
var languageFontMap = {
|
|
43
|
-
"ja-JP": "Noto+Sans+JP",
|
|
44
|
-
"ko-KR": "Noto+Sans+KR",
|
|
45
|
-
"zh-CN": "Noto+Sans+SC",
|
|
46
|
-
"zh-TW": "Noto+Sans+TC",
|
|
47
|
-
"zh-HK": "Noto+Sans+HK",
|
|
48
|
-
"th-TH": "Noto+Sans+Thai",
|
|
49
|
-
"bn-IN": "Noto+Sans+Bengali",
|
|
50
|
-
"ar-AR": "Noto+Sans+Arabic",
|
|
51
|
-
"ta-IN": "Noto+Sans+Tamil",
|
|
52
|
-
"ml-IN": "Noto+Sans+Malayalam",
|
|
53
|
-
"he-IL": "Noto+Sans+Hebrew",
|
|
54
|
-
"te-IN": "Noto+Sans+Telugu",
|
|
55
|
-
devanagari: "Noto+Sans+Devanagari",
|
|
56
|
-
kannada: "Noto+Sans+Kannada",
|
|
57
|
-
symbol: ["Noto+Sans+Symbols", "Noto+Sans+Symbols+2"],
|
|
58
|
-
math: "Noto+Sans+Math",
|
|
59
|
-
unknown: "Noto+Sans"
|
|
60
|
-
};
|
|
61
|
-
async function loadGoogleFont(font, text) {
|
|
62
|
-
if (!font || !text)
|
|
63
|
-
return;
|
|
64
|
-
const API = `https://fonts.googleapis.com/css2?family=${font}&text=${encodeURIComponent(text)}`;
|
|
65
|
-
const css = await (await fetch(API, {
|
|
66
|
-
headers: {
|
|
67
|
-
"User-Agent": "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; de-at) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/5.0.5 Safari/533.21.1"
|
|
68
|
-
}
|
|
69
|
-
})).text();
|
|
70
|
-
const resource = css.match(/src: url\((.+)\) format\('(opentype|truetype)'\)/);
|
|
71
|
-
if (!resource)
|
|
72
|
-
throw new Error("Failed to load font");
|
|
73
|
-
return fetch(resource[1]).then((res) => res.arrayBuffer());
|
|
74
|
-
}
|
|
75
|
-
var assetCache = /* @__PURE__ */ new Map();
|
|
76
|
-
var loadDynamicAsset = ({ emoji }) => {
|
|
77
|
-
const fn = async (code, text) => {
|
|
78
|
-
if (code === "emoji") {
|
|
79
|
-
return `data:image/svg+xml;base64,` + btoa(await (await loadEmoji(getIconCode(text), emoji)).text());
|
|
80
|
-
}
|
|
81
|
-
if (!languageFontMap[code])
|
|
82
|
-
code = "unknown";
|
|
83
|
-
try {
|
|
84
|
-
const data = await loadGoogleFont(languageFontMap[code], text);
|
|
85
|
-
if (data) {
|
|
86
|
-
return {
|
|
87
|
-
name: `satori_${code}_fallback_${text}`,
|
|
88
|
-
data,
|
|
89
|
-
weight: 400,
|
|
90
|
-
style: "normal"
|
|
91
|
-
};
|
|
92
|
-
}
|
|
93
|
-
} catch (e) {
|
|
94
|
-
console.error("Failed to load dynamic font for", text, ". Error:", e);
|
|
95
|
-
}
|
|
96
|
-
};
|
|
97
|
-
return async (...args) => {
|
|
98
|
-
const key = JSON.stringify(args);
|
|
99
|
-
const cache = assetCache.get(key);
|
|
100
|
-
if (cache)
|
|
101
|
-
return cache;
|
|
102
|
-
const asset = await fn(...args);
|
|
103
|
-
assetCache.set(key, asset);
|
|
104
|
-
return asset;
|
|
105
|
-
};
|
|
106
|
-
};
|
|
107
|
-
async function render(satori, resvg, opts, defaultFonts, element) {
|
|
108
|
-
const options = Object.assign({
|
|
109
|
-
width: 1200,
|
|
110
|
-
height: 630,
|
|
111
|
-
debug: false
|
|
112
|
-
}, opts);
|
|
113
|
-
const svg = await satori(element, {
|
|
114
|
-
width: options.width,
|
|
115
|
-
height: options.height,
|
|
116
|
-
debug: options.debug,
|
|
117
|
-
fonts: options.fonts || defaultFonts,
|
|
118
|
-
loadAdditionalAsset: loadDynamicAsset({
|
|
119
|
-
emoji: options.emoji
|
|
120
|
-
})
|
|
121
|
-
});
|
|
122
|
-
const resvgJS = new resvg.Resvg(svg, {
|
|
123
|
-
fitTo: {
|
|
124
|
-
mode: "width",
|
|
125
|
-
value: options.width
|
|
126
|
-
}
|
|
127
|
-
});
|
|
128
|
-
return resvgJS.render().asPng();
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
export {
|
|
132
|
-
render
|
|
133
|
-
};
|
|
134
|
-
/*! Copyright Twitter Inc. and other contributors. Licensed under MIT */
|
|
135
|
-
//# sourceMappingURL=chunk-GIRBQXLD.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/emoji/index.ts","../src/og.ts"],"sourcesContent":["/**\n * Modified version of https://unpkg.com/twemoji@13.1.0/dist/twemoji.esm.js.\n */\n\n/*! Copyright Twitter Inc. and other contributors. Licensed under MIT */\n\nconst U200D = String.fromCharCode(8205)\nconst UFE0Fg = /\\uFE0F/g\n\nexport function getIconCode(char: string) {\n return toCodePoint(char.indexOf(U200D) < 0 ? char.replace(UFE0Fg, '') : char)\n}\n\nfunction toCodePoint(unicodeSurrogates: string) {\n var r: string[] = [],\n c = 0,\n p = 0,\n i = 0\n while (i < unicodeSurrogates.length) {\n c = unicodeSurrogates.charCodeAt(i++)\n if (p) {\n r.push((65536 + ((p - 55296) << 10) + (c - 56320)).toString(16))\n p = 0\n } else if (55296 <= c && c <= 56319) {\n p = c\n } else {\n r.push(c.toString(16))\n }\n }\n return r.join('-')\n}\n\nconst apis = {\n twemoji: (code) =>\n 'https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/svg/' + code.toLowerCase() + '.svg',\n openmoji: 'https://cdn.jsdelivr.net/npm/@svgmoji/openmoji@2.0.0/svg/',\n blobmoji: 'https://cdn.jsdelivr.net/npm/@svgmoji/blob@2.0.0/svg/',\n noto: 'https://cdn.jsdelivr.net/gh/svgmoji/svgmoji/packages/svgmoji__noto/svg/',\n fluent: (code) =>\n 'https://cdn.jsdelivr.net/gh/shuding/fluentui-emoji-unicode/assets/' +\n code.toLowerCase() +\n '_color.svg',\n fluentFlat: (code) =>\n 'https://cdn.jsdelivr.net/gh/shuding/fluentui-emoji-unicode/assets/' +\n code.toLowerCase() +\n '_flat.svg',\n}\n\nexport type EmojiType = keyof typeof apis\n\nexport function loadEmoji(code: string, type?: EmojiType) {\n // https://github.com/svgmoji/svgmoji\n if (!type || !apis[type]) {\n type = 'twemoji'\n }\n const api = apis[type]\n if (typeof api === 'function') {\n return fetch(api(code))\n }\n return fetch(`${api}${code.toUpperCase()}.svg`)\n}\n","import { loadEmoji, getIconCode, EmojiType } from './emoji'\n\n// @TODO: Support font style and weights, and make this option extensible rather\n// than built-in.\n// @TODO: Cover most languages with Noto Sans.\nconst languageFontMap = {\n 'ja-JP': 'Noto+Sans+JP',\n 'ko-KR': 'Noto+Sans+KR',\n 'zh-CN': 'Noto+Sans+SC',\n 'zh-TW': 'Noto+Sans+TC',\n 'zh-HK': 'Noto+Sans+HK',\n 'th-TH': 'Noto+Sans+Thai',\n 'bn-IN': 'Noto+Sans+Bengali',\n 'ar-AR': 'Noto+Sans+Arabic',\n 'ta-IN': 'Noto+Sans+Tamil',\n 'ml-IN': 'Noto+Sans+Malayalam',\n 'he-IL': 'Noto+Sans+Hebrew',\n 'te-IN': 'Noto+Sans+Telugu',\n devanagari: 'Noto+Sans+Devanagari',\n kannada: 'Noto+Sans+Kannada',\n symbol: ['Noto+Sans+Symbols', 'Noto+Sans+Symbols+2'],\n math: 'Noto+Sans+Math',\n unknown: 'Noto+Sans',\n}\n\nasync function loadGoogleFont(font: string, text: string) {\n if (!font || !text) return\n\n const API = `https://fonts.googleapis.com/css2?family=${font}&text=${encodeURIComponent(\n text\n )}`\n\n const css = await (\n await fetch(API, {\n headers: {\n // Make sure it returns TTF.\n 'User-Agent':\n 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; de-at) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/5.0.5 Safari/533.21.1',\n },\n })\n ).text()\n\n const resource = css.match(/src: url\\((.+)\\) format\\('(opentype|truetype)'\\)/)\n if (!resource) throw new Error('Failed to load font')\n\n return fetch(resource[1]).then((res) => res.arrayBuffer())\n}\n\nconst assetCache = new Map<string, any>()\nconst loadDynamicAsset = ({ emoji }: { emoji?: EmojiType }) => {\n const fn = async (code, text) => {\n if (code === 'emoji') {\n // It's an emoji, load the image.\n return (\n `data:image/svg+xml;base64,` +\n btoa(await (await loadEmoji(getIconCode(text), emoji)).text())\n )\n }\n\n // Try to load from Google Fonts.\n if (!languageFontMap[code]) code = 'unknown'\n\n try {\n const data = await loadGoogleFont(languageFontMap[code], text)\n\n if (data) {\n return {\n name: `satori_${code}_fallback_${text}`,\n data,\n weight: 400,\n style: 'normal',\n }\n }\n } catch (e) {\n console.error('Failed to load dynamic font for', text, '. Error:', e)\n }\n }\n\n return async (...args: Parameters<typeof fn>) => {\n const key = JSON.stringify(args)\n const cache = assetCache.get(key)\n if (cache) return cache\n\n const asset = await fn(...args)\n assetCache.set(key, asset)\n return asset\n }\n}\n\nexport default async function render(\n satori,\n resvg,\n opts,\n defaultFonts,\n element\n) {\n const options = Object.assign(\n {\n width: 1200,\n height: 630,\n debug: false,\n },\n opts\n )\n\n const svg = await satori(element, {\n width: options.width,\n height: options.height,\n debug: options.debug,\n fonts: options.fonts || defaultFonts,\n loadAdditionalAsset: loadDynamicAsset({\n emoji: options.emoji,\n }),\n })\n\n const resvgJS = new resvg.Resvg(svg, {\n fitTo: {\n mode: 'width',\n value: options.width,\n },\n })\n\n return resvgJS.render().asPng()\n}\n"],"mappings":"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","names":[]}
|