UNPKG

@eristack/iso-3166

Version:

ISO 3166-1 country codes and ISO 3166-2 subdivision normalization — assigned alpha-2/alpha-3 registry

658 lines (649 loc) • 10 kB
"use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // src/zod/index.ts var zod_exports = {}; __export(zod_exports, { countryAlpha2LooseSchema: () => countryAlpha2LooseSchema, countryAlpha2Schema: () => countryAlpha2Schema, countryAlpha3Schema: () => countryAlpha3Schema, subdivisionCodeSchema: () => subdivisionCodeSchema }); module.exports = __toCommonJS(zod_exports); // src/zod/schemas.ts var import_zod = require("zod"); // src/core/alpha2-codes.ts var ISO_3166_1_ALPHA2_CODES = [ "AD", "AE", "AF", "AG", "AI", "AL", "AM", "AO", "AQ", "AR", "AS", "AT", "AU", "AW", "AX", "AZ", "BA", "BB", "BD", "BE", "BF", "BG", "BH", "BI", "BJ", "BL", "BM", "BN", "BO", "BQ", "BR", "BS", "BT", "BV", "BW", "BY", "BZ", "CA", "CC", "CD", "CF", "CG", "CH", "CI", "CK", "CL", "CM", "CN", "CO", "CR", "CU", "CV", "CW", "CX", "CY", "CZ", "DE", "DJ", "DK", "DM", "DO", "DZ", "EC", "EE", "EG", "EH", "ER", "ES", "ET", "FI", "FJ", "FK", "FM", "FO", "FR", "GA", "GB", "GD", "GE", "GF", "GG", "GH", "GI", "GL", "GM", "GN", "GP", "GQ", "GR", "GS", "GT", "GU", "GW", "GY", "HK", "HM", "HN", "HR", "HT", "HU", "ID", "IE", "IL", "IM", "IN", "IO", "IQ", "IR", "IS", "IT", "JE", "JM", "JO", "JP", "KE", "KG", "KH", "KI", "KM", "KN", "KP", "KR", "KW", "KY", "KZ", "LA", "LB", "LC", "LI", "LK", "LR", "LS", "LT", "LU", "LV", "LY", "MA", "MC", "MD", "ME", "MF", "MG", "MH", "MK", "ML", "MM", "MN", "MO", "MP", "MQ", "MR", "MS", "MT", "MU", "MV", "MW", "MX", "MY", "MZ", "NA", "NC", "NE", "NF", "NG", "NI", "NL", "NO", "NP", "NR", "NU", "NZ", "OM", "PA", "PE", "PF", "PG", "PH", "PK", "PL", "PM", "PN", "PR", "PS", "PT", "PW", "PY", "QA", "RE", "RO", "RS", "RU", "RW", "SA", "SB", "SC", "SD", "SE", "SG", "SH", "SI", "SJ", "SK", "SL", "SM", "SN", "SO", "SR", "SS", "ST", "SV", "SX", "SY", "SZ", "TC", "TD", "TF", "TG", "TH", "TJ", "TK", "TL", "TM", "TN", "TO", "TR", "TT", "TV", "TW", "TZ", "UA", "UG", "UM", "US", "UY", "UZ", "VA", "VC", "VE", "VG", "VI", "VN", "VU", "WF", "WS", "XK", "YE", "YT", "ZA", "ZM", "ZW" ]; var ISO_3166_1_ALPHA2_SET = new Set( ISO_3166_1_ALPHA2_CODES ); // src/core/errors.ts var CountryCodeError = class extends Error { constructor(message) { super(message); this.name = "CountryCodeError"; } }; // src/core/alpha2.ts var ALPHA2_FORMAT = /^[A-Z]{2}$/; function isAssignedAlpha2(code) { const upper = code.trim().toUpperCase(); return ALPHA2_FORMAT.test(upper) && ISO_3166_1_ALPHA2_SET.has(upper); } function normalizeAlpha2(code) { const upper = code.trim().toUpperCase(); if (!ALPHA2_FORMAT.test(upper)) { throw new CountryCodeError( `Invalid country code "${code}" \u2014 expected ISO 3166-1 alpha-2 (two letters)` ); } if (!ISO_3166_1_ALPHA2_SET.has(upper)) { throw new CountryCodeError( `Country code "${upper}" is not an assigned ISO 3166-1 alpha-2 code` ); } return upper; } // src/core/alpha3-map.ts var ISO_3166_1_ALPHA3_TO_ALPHA2 = { AFG: "AF", ALA: "AX", ALB: "AL", DZA: "DZ", ASM: "AS", AND: "AD", AGO: "AO", AIA: "AI", ATA: "AQ", ATG: "AG", ARG: "AR", ARM: "AM", ABW: "AW", AUS: "AU", AUT: "AT", AZE: "AZ", BHS: "BS", BHR: "BH", BGD: "BD", BRB: "BB", BLR: "BY", BEL: "BE", BLZ: "BZ", BEN: "BJ", BMU: "BM", BTN: "BT", BOL: "BO", BES: "BQ", BIH: "BA", BWA: "BW", BVT: "BV", BRA: "BR", IOT: "IO", BRN: "BN", BGR: "BG", BFA: "BF", BDI: "BI", CPV: "CV", KHM: "KH", CMR: "CM", CAN: "CA", CYM: "KY", CAF: "CF", TCD: "TD", CHL: "CL", CHN: "CN", CXR: "CX", CCK: "CC", COL: "CO", COM: "KM", COD: "CD", COG: "CG", COK: "CK", CRI: "CR", CIV: "CI", HRV: "HR", CUB: "CU", CUW: "CW", CYP: "CY", CZE: "CZ", DNK: "DK", DJI: "DJ", DMA: "DM", DOM: "DO", ECU: "EC", EGY: "EG", SLV: "SV", GNQ: "GQ", ERI: "ER", EST: "EE", SWZ: "SZ", ETH: "ET", FLK: "FK", FRO: "FO", FJI: "FJ", FIN: "FI", FRA: "FR", GUF: "GF", PYF: "PF", ATF: "TF", GAB: "GA", GMB: "GM", GEO: "GE", DEU: "DE", GHA: "GH", GIB: "GI", GRC: "GR", GRL: "GL", GRD: "GD", GLP: "GP", GUM: "GU", GTM: "GT", GGY: "GG", GIN: "GN", GNB: "GW", GUY: "GY", HTI: "HT", HMD: "HM", VAT: "VA", HND: "HN", HKG: "HK", HUN: "HU", ISL: "IS", IND: "IN", IDN: "ID", IRN: "IR", IRQ: "IQ", IRL: "IE", IMN: "IM", ISR: "IL", ITA: "IT", JAM: "JM", JPN: "JP", JEY: "JE", JOR: "JO", KAZ: "KZ", KEN: "KE", KIR: "KI", PRK: "KP", KOR: "KR", KWT: "KW", KGZ: "KG", LAO: "LA", LVA: "LV", LBN: "LB", LSO: "LS", LBR: "LR", LBY: "LY", LIE: "LI", LTU: "LT", LUX: "LU", MAC: "MO", MDG: "MG", MWI: "MW", MYS: "MY", MDV: "MV", MLI: "ML", MLT: "MT", MHL: "MH", MTQ: "MQ", MRT: "MR", MUS: "MU", MYT: "YT", MEX: "MX", FSM: "FM", MDA: "MD", MCO: "MC", MNG: "MN", MNE: "ME", MSR: "MS", MAR: "MA", MOZ: "MZ", MMR: "MM", NAM: "NA", NRU: "NR", NPL: "NP", NLD: "NL", NCL: "NC", NZL: "NZ", NIC: "NI", NER: "NE", NGA: "NG", NIU: "NU", NFK: "NF", MKD: "MK", MNP: "MP", NOR: "NO", OMN: "OM", PAK: "PK", PLW: "PW", PSE: "PS", PAN: "PA", PNG: "PG", PRY: "PY", PER: "PE", PHL: "PH", PCN: "PN", POL: "PL", PRT: "PT", PRI: "PR", QAT: "QA", REU: "RE", ROU: "RO", RUS: "RU", RWA: "RW", BLM: "BL", SHN: "SH", KNA: "KN", LCA: "LC", MAF: "MF", SPM: "PM", VCT: "VC", WSM: "WS", SMR: "SM", STP: "ST", SAU: "SA", SEN: "SN", SRB: "RS", SYC: "SC", SLE: "SL", SGP: "SG", SXM: "SX", SVK: "SK", SVN: "SI", SLB: "SB", SOM: "SO", ZAF: "ZA", SGS: "GS", SSD: "SS", ESP: "ES", LKA: "LK", SDN: "SD", SUR: "SR", SJM: "SJ", SWE: "SE", CHE: "CH", SYR: "SY", TWN: "TW", TJK: "TJ", TZA: "TZ", THA: "TH", TLS: "TL", TGO: "TG", TKL: "TK", TON: "TO", TTO: "TT", TUN: "TN", TUR: "TR", TKM: "TM", TCA: "TC", TUV: "TV", UGA: "UG", UKR: "UA", ARE: "AE", GBR: "GB", USA: "US", UMI: "UM", URY: "UY", UZB: "UZ", VUT: "VU", VEN: "VE", VNM: "VN", VGB: "VG", VIR: "VI", WLF: "WF", ESH: "EH", YEM: "YE", ZMB: "ZM", ZWE: "ZW", XKX: "XK" }; var alpha2ToAlpha3 = /* @__PURE__ */ new Map(); for (const [a3, a2] of Object.entries(ISO_3166_1_ALPHA3_TO_ALPHA2)) { if (!alpha2ToAlpha3.has(a2)) { alpha2ToAlpha3.set(a2, a3); } } // src/core/alpha3.ts var ALPHA3_FORMAT = /^[A-Z]{3}$/; function alpha3ToAlpha2(code) { const upper = code.trim().toUpperCase(); if (!ALPHA3_FORMAT.test(upper)) { throw new CountryCodeError( `Invalid alpha-3 country code "${code}" \u2014 expected three letters` ); } const a2 = ISO_3166_1_ALPHA3_TO_ALPHA2[upper]; if (!a2) { throw new CountryCodeError( `Alpha-3 code "${upper}" is not an assigned ISO 3166-1 alpha-3 code` ); } return normalizeAlpha2(a2); } // src/core/subdivision.ts var SUBDIVISION = /^[A-Z]{2}-[\dA-Z]{1,8}$/; function normalizeSubdivisionCode(countryAlpha2, subdivision) { const country = normalizeAlpha2(countryAlpha2); let raw = subdivision.trim().toUpperCase(); if (!raw.includes("-")) { raw = `${country}-${raw}`; } if (!SUBDIVISION.test(raw)) { throw new CountryCodeError( `Invalid subdivision "${subdivision}" \u2014 expected ISO 3166-2 form CC-XXX` ); } const prefix = raw.slice(0, 2); if (prefix !== country) { throw new CountryCodeError( `Subdivision "${raw}" does not match country "${country}"` ); } return raw; } // src/zod/schemas.ts var countryAlpha2Schema = import_zod.z.string().trim().transform((value, ctx) => { try { return normalizeAlpha2(value); } catch (error) { ctx.addIssue({ code: "custom", message: error instanceof Error ? error.message : "Invalid country code" }); return import_zod.z.NEVER; } }); var countryAlpha2LooseSchema = import_zod.z.string().trim().refine((value) => isAssignedAlpha2(value), { message: "Expected assigned ISO 3166-1 alpha-2 code" }); var countryAlpha3Schema = import_zod.z.string().trim().transform((value, ctx) => { try { return alpha3ToAlpha2(value); } catch (error) { ctx.addIssue({ code: "custom", message: error instanceof Error ? error.message : "Invalid alpha-3 code" }); return import_zod.z.NEVER; } }); var subdivisionCodeSchema = import_zod.z.object({ countryAlpha2: countryAlpha2Schema, subdivision: import_zod.z.string().trim().min(1) }).transform( ({ countryAlpha2, subdivision }) => normalizeSubdivisionCode(countryAlpha2, subdivision) ); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { countryAlpha2LooseSchema, countryAlpha2Schema, countryAlpha3Schema, subdivisionCodeSchema }); //# sourceMappingURL=index.cjs.map