import type { AstroIntegration } from "astro"; import fs from "node:fs"; import path from "node:path"; import { fileURLToPath } from "node:url"; /** * Post-process built HTML files to set per-page og:image. * Replaces the default og:image with a page-specific one based on URL path. */ export default function ogImageIntegration(): AstroIntegration { return { name: "og-image-per-page", hooks: { "astro:build:done": async ({ dir, pages }) => { const distDir = typeof dir === "string" ? dir : fileURLToPath(dir); for (const page of pages) { const htmlPath = path.join(distDir, page.pathname, "index.html"); if (!fs.existsSync(htmlPath)) continue; let html = fs.readFileSync(htmlPath, "utf-8"); // Derive slug from pathname: e.g., "/whisper-to-ai-moji-okoshi/" → "whisper-to-ai-moji-okoshi" let slug = page.pathname.replace(/^\/|\/$/g, "") || "index"; const ogImageUrl = `https://yasutakeyohei.com/og/${slug}.png`; // Replace existing og:image with page-specific one html = html.replace( /