aboutsummaryrefslogtreecommitdiff
path: root/common/renderCard.ts
diff options
context:
space:
mode:
Diffstat (limited to 'common/renderCard.ts')
-rw-r--r--common/renderCard.ts64
1 files changed, 64 insertions, 0 deletions
diff --git a/common/renderCard.ts b/common/renderCard.ts
new file mode 100644
index 0000000..0e1bb63
--- /dev/null
+++ b/common/renderCard.ts
@@ -0,0 +1,64 @@
+import { SatoriOptions } from 'satori'
+import { Font } from './types/configType'
+import QueryType from './types/queryType'
+import { mergeConfig } from './configHelper'
+import { getRepoDetails } from './github/repoQuery'
+import getTwemojiMap from './twemoji'
+
+export async function getFont(
+ font: Font,
+ weight: SatoriOptions['fonts'][0]['weight']
+): Promise<SatoriOptions['fonts'][0]> {
+ const fontSlug = font.replace(/\s/g, '-').toLowerCase()
+ const cdnUrl = `https://cdn.jsdelivr.net/npm/@fontsource/${fontSlug}/files/${fontSlug}-all-${weight}-normal.woff`
+
+ return {
+ name: font,
+ data: await fetch(cdnUrl).then((response) => {
+ if (response.ok) {
+ return response.arrayBuffer()
+ }
+ throw new Error('Failed to fetch font')
+ }),
+ weight,
+ style: 'normal'
+ }
+}
+
+export function getFonts(font: Font) {
+ return Promise.all([
+ getFont(Font.jost, 400),
+ getFont(font, 200),
+ getFont(font, 400),
+ getFont(font, 500)
+ ])
+}
+
+export async function getEmojiSVG(code: string) {
+ return (
+ await fetch(`https://twemoji.maxcdn.com/v/13.1.0/svg/${code}.svg`)
+ ).text()
+}
+
+export async function getGraphemeImages(description: string = '') {
+ const emojiCodes = getTwemojiMap(description)
+ const emojis = await Promise.all(Object.values(emojiCodes).map(getEmojiSVG))
+ const graphemeImages = Object.fromEntries(
+ Object.entries(emojiCodes).map(([key], index) => [
+ key,
+ `data:image/svg+xml;base64,` + btoa(emojis[index])
+ ])
+ )
+
+ return graphemeImages
+}
+
+export async function getCardConfig(query: QueryType) {
+ const { repository } = await getRepoDetails(query._owner, query._name)
+
+ const config = mergeConfig(repository, query)
+
+ if (!config) throw Error('Configuration failed to generate')
+
+ return config
+}