From daaa789068cebb5fdfcea6197ade6e663be46e0f Mon Sep 17 00:00:00 2001 From: Bobby Date: Wed, 30 Nov 2022 23:16:07 -0500 Subject: socialify update --- common/renderCard.ts | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 common/renderCard.ts (limited to 'common/renderCard.ts') 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 { + 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 +} -- cgit v1.2.3