import satori, { SatoriOptions } from "satori"; import { SITE } from "@config"; import { writeFile } from "node:fs/promises"; import { Resvg } from "@resvg/resvg-js"; const fetchFonts = async () => { // Regular Font const fontFileRegular = await fetch( "https://www.1001fonts.com/download/font/ibm-plex-mono.regular.ttf" ); const fontRegular: ArrayBuffer = await fontFileRegular.arrayBuffer(); // Bold Font const fontFileBold = await fetch( "https://www.1001fonts.com/download/font/ibm-plex-mono.bold.ttf" ); const fontBold: ArrayBuffer = await fontFileBold.arrayBuffer(); return { fontRegular, fontBold }; }; const { fontRegular, fontBold } = await fetchFonts(); const ogImage = (text: string) => { return (

{text}

by{" "} " {SITE.author} {SITE.title}
); }; const options: SatoriOptions = { width: 1200, height: 630, embedFont: true, fonts: [ { name: "IBM Plex Mono", data: fontRegular, weight: 400, style: "normal", }, { name: "IBM Plex Mono", data: fontBold, weight: 600, style: "normal", }, ], }; const generateOgImage = async (mytext = SITE.title) => { const svg = await satori(ogImage(mytext), options); // render png in production mode if (import.meta.env.MODE === "production") { const resvg = new Resvg(svg); const pngData = resvg.render(); const pngBuffer = pngData.asPng(); console.info("Output PNG Image :", `${mytext}.png`); await writeFile(`./dist/${mytext}.png`, pngBuffer); } return svg; }; export default generateOgImage;