/** * Turns Simple Icons' 3,400 SVG files into one map of slug → path data. * * The package ships a file per icon and 15MB of SVG wrapper around what is * really a single `d` attribute each. This keeps the attribute and throws the * rest away, so the app carries about a megabyte instead of fifteen. * * 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. * * Run `npm run icons` after upgrading simple-icons. The output is committed, * so a build never depends on this having been run. */ import { readdirSync, readFileSync, writeFileSync } from "node:fs"; import { join } from "node:path"; const SRC = "node_modules/simple-icons/icons"; const OUT = "public/brand-icons.json"; const icons = {}; for (const file of readdirSync(SRC)) { if (!file.endsWith(".svg")) continue; const svg = readFileSync(join(SRC, file), "utf8"); const match = /\sd="([^"]+)"/.exec(svg); if (!match) continue; icons[file.slice(0, -4)] = match[1]; } writeFileSync(OUT, JSON.stringify(icons)); const kb = Math.round(readFileSync(OUT).length / 1024); console.log(`${Object.keys(icons).length} icons → ${OUT} (${kb} KB)`);