/** * Turns Simple Icons into one map of slug → [path, brand colour]. * * The package ships a file per icon and 15MB of SVG wrapper around what is * really a single `d` attribute each, plus a separate metadata file carrying * the brand's own hex. This joins the two and throws the rest away. * * The output goes to public/ rather than src/: it is fetched once at runtime * instead of being parsed into the JS bundle at every startup. * * `npm run build` runs this, so the result is never committed and never stale. */ import { readFileSync, readdirSync, writeFileSync } from "node:fs"; import { join } from "node:path"; const ICONS = "node_modules/simple-icons/icons"; const META = "node_modules/simple-icons/data/simple-icons.json"; const OUT = "public/brand-icons.json"; const hexes = new Map(); for (const icon of JSON.parse(readFileSync(META, "utf8"))) { hexes.set(icon.slug, icon.hex); } const icons = {}; for (const file of readdirSync(ICONS)) { if (!file.endsWith(".svg")) continue; const slug = file.slice(0, -4); const path = /\sd="([^"]+)"/.exec(readFileSync(join(ICONS, file), "utf8"))?.[1]; if (!path) continue; icons[slug] = [path, hexes.get(slug) ?? "64748B"]; } writeFileSync(OUT, JSON.stringify(icons)); const kb = Math.round(readFileSync(OUT).length / 1024); console.log(`${Object.keys(icons).length} icons → ${OUT} (${kb} KB)`);