// Regenerates src/lib/countries-data.ts from the local runtime's ICU (CLDR) region names. // Usage: node scripts/generate-countries.mjs import { writeFileSync } from "node:fs"; const dn = new Intl.DisplayNames(["en"], { type: "region" }); // CLDR also knows reserved, retired and pseudo codes that aren't current ISO 3166-1 countries. // Keep only current ISO 3166-1 alpha-2 codes plus XK (Kosovo, the de-facto user-assigned code). const EXCLUDE = new Set([ "AC", "CP", "DG", "EA", "EU", "EZ", "IC", "TA", "UN", // exceptionally reserved "AN", "BU", "CQ", "CS", "DD", "DY", "FX", "HV", "NH", "RH", "SU", "TP", "VD", "YD", "YU", "ZR", // retired "UK", // reserved for GB; WHOIS "UK" is handled as an alias in countries.ts "QO", "XA", "XB", // CLDR-only pseudo territories ]); const entries = []; for (let a = 65; a <= 90; a++) { for (let b = 65; b <= 90; b++) { const code = String.fromCharCode(a, b); if (EXCLUDE.has(code)) continue; let name; try { name = dn.of(code); } catch { continue; } if (!name || name === code || name === "Unknown Region") continue; entries.push([code, name]); } } const body = entries.map(([c, n]) => ` ${c}: ${JSON.stringify(n)},`).join("\n"); writeFileSync( new URL("../src/lib/countries-data.ts", import.meta.url), `// Generated by scripts/generate-countries.mjs from CLDR (Unicode license). Do not edit by hand.\n` + `export const COUNTRY_NAMES: Record = {\n${body}\n};\n`, ); console.log( `Wrote ${entries.length} countries (Node ${process.version}, ICU ${process.versions.icu}, CLDR ${process.versions.cldr})`, );