import { execFileSync } from "node:child_process"; import { mkdtempSync, readFileSync, rmSync } from "node:fs"; import { tmpdir } from "node:os"; import { join } from "node:path"; import sharp from "sharp"; const svg = readFileSync("public/favicon.svg"); const sizes = [16, 32, 48]; const tmp = mkdtempSync(join(tmpdir(), "favicon-")); try { const pngs = []; for (const s of sizes) { const out = join(tmp, `${s}.png`); await sharp(svg, { density: 384 }) .resize(s, s, { fit: "contain", background: { r: 0, g: 0, b: 0, alpha: 0 } }) .png() .toFile(out); pngs.push(out); } execFileSync("magick", [...pngs, "public/favicon.ico"], { stdio: "inherit" }); console.log(`wrote public/favicon.ico (${sizes.join(", ")} px)`); } finally { rmSync(tmp, { recursive: true, force: true }); }