#!/usr/bin/env bun
import { readdirSync, statSync } from "node:fs";
import { join } from "node:path";
const distDir = "./docs/dist";
const ogImageUrl = "https://sequoia.pub/og.png";
// Function to recursively find all HTML files
function findHtmlFiles(dir: string): string[] {
const files: string[] = [];
const entries = readdirSync(dir);
for (const entry of entries) {
const fullPath = join(dir, entry);
const stat = statSync(fullPath);
if (stat.isDirectory()) {
files.push(...findHtmlFiles(fullPath));
} else if (entry.endsWith(".html")) {
files.push(fullPath);
}
}
return files;
}
// Function to inject OG image meta tags
async function injectOgImageTags(filePath: string) {
const file = Bun.file(filePath);
let content = await file.text();
// Check if og:image already exists
if (content.includes('property="og:image"')) {
console.log(`⏭️ Skipping ${filePath} - og:image already exists`);
return;
}
// Find the position to inject the meta tag
// We'll insert it after og:description if it exists, or before twitter:card
const ogDescriptionMatch = content.match(
/]*>/,
);
const twitterCardMatch = content.match(/]*>/);
let insertPosition: number;
if (ogDescriptionMatch && ogDescriptionMatch.index !== undefined) {
insertPosition = ogDescriptionMatch.index + ogDescriptionMatch[0].length;
} else if (twitterCardMatch && twitterCardMatch.index !== undefined) {
insertPosition = twitterCardMatch.index;
} else {
// Fallback: insert before
const headCloseMatch = content.indexOf("");
if (headCloseMatch === -1) {
console.log(`⚠️ Warning: Could not find insertion point in ${filePath}`);
return;
}
insertPosition = headCloseMatch;
}
// Inject the og:image and twitter:image meta tags
const ogImageTag = ``;
const twitterImageTag = ``;
const newContent =
content.slice(0, insertPosition) +
ogImageTag +
twitterImageTag +
content.slice(insertPosition);
// Write the modified content back to the file
await Bun.write(filePath, newContent);
console.log(`✅ Injected og:image tags into ${filePath}`);
}
// Main execution
async function main() {
console.log("🔍 Finding HTML files in dist directory...");
const htmlFiles = findHtmlFiles(distDir);
console.log(`📄 Found ${htmlFiles.length} HTML files`);
for (const file of htmlFiles) {
await injectOgImageTags(file);
}
console.log("\n✨ Done! All HTML files have been processed.");
}
main();