diff options
| author | Bobby <[email protected]> | 2022-11-30 23:16:07 -0500 |
|---|---|---|
| committer | Bobby <[email protected]> | 2022-11-30 23:16:07 -0500 |
| commit | daaa789068cebb5fdfcea6197ade6e663be46e0f (patch) | |
| tree | 1cd315851b779ac28fe622da332c3c16fe1c433c /common/renderCard.ts | |
| download | tcssocialify-daaa789068cebb5fdfcea6197ade6e663be46e0f.tar.xz tcssocialify-daaa789068cebb5fdfcea6197ade6e663be46e0f.zip | |
socialify update
Diffstat (limited to 'common/renderCard.ts')
| -rw-r--r-- | common/renderCard.ts | 64 |
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 +} |
