x-satori
Version:
use Vue or Astro file to generate SVG image using Satori
52 lines (50 loc) • 1.56 kB
JavaScript
import {
defineSatoriConfig,
genSatoriSVG
} from "./chunk-JDONRD3H.mjs";
// src/astro.ts
import crypto from "crypto";
import fs from "fs";
import { dirname, resolve } from "path";
import { fileURLToPath } from "url";
import { transform } from "@astrojs/compiler";
import { experimental_AstroContainer as AstroContainer } from "astro/container";
async function satoriAstro(opts, astroTemplateStr) {
const ___dirname = dirname(fileURLToPath(import.meta.url));
const rawHash = crypto.createHash("md5").update(astroTemplateStr).digest("hex");
const tmpFile = resolve(
___dirname,
".tmp",
`x-satori-${rawHash}.js`
);
if (!fs.existsSync(tmpFile)) {
const { code: tsCode } = await transform(
astroTemplateStr,
{
filename: tmpFile,
sourcemap: "external",
internalURL: "astro/runtime/server/index.js",
resolvePath: async (s) => s
}
);
const { transformSync } = await import("esbuild");
const { code: jsCode } = transformSync(tsCode, { loader: "ts" });
fs.mkdirSync(resolve(___dirname, ".tmp"), { recursive: true });
fs.writeFileSync(tmpFile, jsCode, "utf-8");
}
const templateComponent = await (await import(tmpFile)).default;
const container = await AstroContainer.create();
const renderedHtmlStr = await container.renderToString(
templateComponent,
{
props: opts.props
}
);
return await genSatoriSVG(opts, renderedHtmlStr);
}
var astro_default = satoriAstro;
export {
astro_default as default,
defineSatoriConfig,
satoriAstro
};