spb/spbgit Public MIT
SPB Git — the platform hosting itself
JavaScript 73.9%
CSS 11.7%
Nunjucks 11.6%
Shell 2.7%
1/**2 * ─────────────────────────────────────────────3 * SPB Git — Personal Git Platform4 * ─────────────────────────────────────────────5 * Author : Simon-Pierre Boucher6 * Contact : contact@spboucher.ai7 * File : scripts/fetch-fonts.mjs8 * Purpose : Download self-hosted Inter / JetBrains Mono fonts (web + OG rendering)9 * License : MIT © Simon-Pierre Boucher10 * ─────────────────────────────────────────────11 */1213import { mkdirSync, writeFileSync, existsSync } from 'node:fs';14import { join } from 'node:path';15import process from 'node:process';1617const ROOT = new URL('..', import.meta.url).pathname;18const FONTS_DIR = join(ROOT, 'src/web/assets/fonts');19const BEST_EFFORT = process.argv.includes('--best-effort');2021/** woff2 → served to browsers; woff → consumed by satori for OG images. */22const FONTS = [23 ['https://cdn.jsdelivr.net/npm/@fontsource/inter@5.1.0/files/inter-latin-400-normal.woff2', 'inter-400.woff2'],24 ['https://cdn.jsdelivr.net/npm/@fontsource/inter@5.1.0/files/inter-latin-500-normal.woff2', 'inter-500.woff2'],25 ['https://cdn.jsdelivr.net/npm/@fontsource/inter@5.1.0/files/inter-latin-600-normal.woff2', 'inter-600.woff2'],26 ['https://cdn.jsdelivr.net/npm/@fontsource/inter@5.1.0/files/inter-latin-700-normal.woff2', 'inter-700.woff2'],27 ['https://cdn.jsdelivr.net/npm/@fontsource/jetbrains-mono@5.1.1/files/jetbrains-mono-latin-400-normal.woff2', 'jetbrains-mono-400.woff2'],28 ['https://cdn.jsdelivr.net/npm/@fontsource/jetbrains-mono@5.1.1/files/jetbrains-mono-latin-600-normal.woff2', 'jetbrains-mono-600.woff2'],29 ['https://cdn.jsdelivr.net/npm/@fontsource/inter@5.1.0/files/inter-latin-400-normal.woff', 'og/inter-400.woff'],30 ['https://cdn.jsdelivr.net/npm/@fontsource/inter@5.1.0/files/inter-latin-700-normal.woff', 'og/inter-700.woff'],31 ['https://cdn.jsdelivr.net/npm/@fontsource/jetbrains-mono@5.1.1/files/jetbrains-mono-latin-400-normal.woff', 'og/jetbrains-mono-400.woff'],32];3334mkdirSync(join(FONTS_DIR, 'og'), { recursive: true });3536let failures = 0;37for (const [url, name] of FONTS) {38 const dest = join(FONTS_DIR, name);39 if (existsSync(dest)) continue;40 try {41 const res = await fetch(url);42 if (!res.ok) throw new Error(`HTTP ${res.status}`);43 writeFileSync(dest, Buffer.from(await res.arrayBuffer()));44 console.log(`✓ ${name}`);45 } catch (err) {46 failures += 1;47 console.warn(`✗ ${name}: ${err.message}`);48 }49}5051if (failures > 0 && !BEST_EFFORT) {52 console.error(`${failures} font(s) failed to download. Re-run: npm run fetch:fonts`);53 process.exit(1);54}55if (failures > 0) {56 console.warn('Continuing despite font download failures (best-effort mode). OG images will use a plain-SVG fallback.');57}58