hongaar/bandersnatch

View on GitHub
examples/countries.ts

Summary

Maintainability
F
2 wks
Test Coverage
import { command, program } from "../src/index.js";

type CountryData = {
  name: string;
  native: string;
  phone: number[];
  continent: string;
  continents?: string[];
  capital: string;
  currency: string[];
  languages: string[];
};

class CountryNotFound extends Error {
  constructor(countryIdentifier: string) {
    super(`Country lookup failed for "${countryIdentifier}"`);
  }
}

// Source: https://raw.githubusercontent.com/annexare/Countries/master/data/countries.json
const data: { [key: string]: CountryData } = {
  AD: {
    name: "Andorra",
    native: "Andorra",
    phone: [376],
    continent: "EU",
    capital: "Andorra la Vella",
    currency: ["EUR"],
    languages: ["ca"],
  },
  AE: {
    name: "United Arab Emirates",
    native: "دولة الإمارات العربية المتحدة",
    phone: [971],
    continent: "AS",
    capital: "Abu Dhabi",
    currency: ["AED"],
    languages: ["ar"],
  },
  AF: {
    name: "Afghanistan",
    native: "افغانستان",
    phone: [93],
    continent: "AS",
    capital: "Kabul",
    currency: ["AFN"],
    languages: ["ps", "uz", "tk"],
  },
  AG: {
    name: "Antigua and Barbuda",
    native: "Antigua and Barbuda",
    phone: [1268],
    continent: "NA",
    capital: "Saint John's",
    currency: ["XCD"],
    languages: ["en"],
  },
  AI: {
    name: "Anguilla",
    native: "Anguilla",
    phone: [1264],
    continent: "NA",
    capital: "The Valley",
    currency: ["XCD"],
    languages: ["en"],
  },
  AL: {
    name: "Albania",
    native: "Shqipëria",
    phone: [355],
    continent: "EU",
    capital: "Tirana",
    currency: ["ALL"],
    languages: ["sq"],
  },
  AM: {
    name: "Armenia",
    native: "Հայաստան",
    phone: [374],
    continent: "AS",
    capital: "Yerevan",
    currency: ["AMD"],
    languages: ["hy", "ru"],
  },
  AO: {
    name: "Angola",
    native: "Angola",
    phone: [244],
    continent: "AF",
    capital: "Luanda",
    currency: ["AOA"],
    languages: ["pt"],
  },
  AQ: {
    name: "Antarctica",
    native: "Antarctica",
    phone: [672],
    continent: "AN",
    capital: "",
    currency: [],
    languages: [],
  },
  AR: {
    name: "Argentina",
    native: "Argentina",
    phone: [54],
    continent: "SA",
    capital: "Buenos Aires",
    currency: ["ARS"],
    languages: ["es", "gn"],
  },
  AS: {
    name: "American Samoa",
    native: "American Samoa",
    phone: [1684],
    continent: "OC",
    capital: "Pago Pago",
    currency: ["USD"],
    languages: ["en", "sm"],
  },
  AT: {
    name: "Austria",
    native: "Österreich",
    phone: [43],
    continent: "EU",
    capital: "Vienna",
    currency: ["EUR"],
    languages: ["de"],
  },
  AU: {
    name: "Australia",
    native: "Australia",
    phone: [61],
    continent: "OC",
    capital: "Canberra",
    currency: ["AUD"],
    languages: ["en"],
  },
  AW: {
    name: "Aruba",
    native: "Aruba",
    phone: [297],
    continent: "NA",
    capital: "Oranjestad",
    currency: ["AWG"],
    languages: ["nl", "pa"],
  },
  AX: {
    name: "Åland",
    native: "Åland",
    phone: [358],
    continent: "EU",
    capital: "Mariehamn",
    currency: ["EUR"],
    languages: ["sv"],
  },
  AZ: {
    name: "Azerbaijan",
    native: "Azərbaycan",
    phone: [994],
    continent: "AS",
    continents: ["AS", "EU"],
    capital: "Baku",
    currency: ["AZN"],
    languages: ["az"],
  },
  BA: {
    name: "Bosnia and Herzegovina",
    native: "Bosna i Hercegovina",
    phone: [387],
    continent: "EU",
    capital: "Sarajevo",
    currency: ["BAM"],
    languages: ["bs", "hr", "sr"],
  },
  BB: {
    name: "Barbados",
    native: "Barbados",
    phone: [1246],
    continent: "NA",
    capital: "Bridgetown",
    currency: ["BBD"],
    languages: ["en"],
  },
  BD: {
    name: "Bangladesh",
    native: "Bangladesh",
    phone: [880],
    continent: "AS",
    capital: "Dhaka",
    currency: ["BDT"],
    languages: ["bn"],
  },
  BE: {
    name: "Belgium",
    native: "België",
    phone: [32],
    continent: "EU",
    capital: "Brussels",
    currency: ["EUR"],
    languages: ["nl", "fr", "de"],
  },
  BF: {
    name: "Burkina Faso",
    native: "Burkina Faso",
    phone: [226],
    continent: "AF",
    capital: "Ouagadougou",
    currency: ["XOF"],
    languages: ["fr", "ff"],
  },
  BG: {
    name: "Bulgaria",
    native: "България",
    phone: [359],
    continent: "EU",
    capital: "Sofia",
    currency: ["BGN"],
    languages: ["bg"],
  },
  BH: {
    name: "Bahrain",
    native: "‏البحرين",
    phone: [973],
    continent: "AS",
    capital: "Manama",
    currency: ["BHD"],
    languages: ["ar"],
  },
  BI: {
    name: "Burundi",
    native: "Burundi",
    phone: [257],
    continent: "AF",
    capital: "Bujumbura",
    currency: ["BIF"],
    languages: ["fr", "rn"],
  },
  BJ: {
    name: "Benin",
    native: "Bénin",
    phone: [229],
    continent: "AF",
    capital: "Porto-Novo",
    currency: ["XOF"],
    languages: ["fr"],
  },
  BL: {
    name: "Saint Barthélemy",
    native: "Saint-Barthélemy",
    phone: [590],
    continent: "NA",
    capital: "Gustavia",
    currency: ["EUR"],
    languages: ["fr"],
  },
  BM: {
    name: "Bermuda",
    native: "Bermuda",
    phone: [1441],
    continent: "NA",
    capital: "Hamilton",
    currency: ["BMD"],
    languages: ["en"],
  },
  BN: {
    name: "Brunei",
    native: "Negara Brunei Darussalam",
    phone: [673],
    continent: "AS",
    capital: "Bandar Seri Begawan",
    currency: ["BND"],
    languages: ["ms"],
  },
  BO: {
    name: "Bolivia",
    native: "Bolivia",
    phone: [591],
    continent: "SA",
    capital: "Sucre",
    currency: ["BOB", "BOV"],
    languages: ["es", "ay", "qu"],
  },
  BQ: {
    name: "Bonaire",
    native: "Bonaire",
    phone: [5997],
    continent: "NA",
    capital: "Kralendijk",
    currency: ["USD"],
    languages: ["nl"],
  },
  BR: {
    name: "Brazil",
    native: "Brasil",
    phone: [55],
    continent: "SA",
    capital: "Brasília",
    currency: ["BRL"],
    languages: ["pt"],
  },
  BS: {
    name: "Bahamas",
    native: "Bahamas",
    phone: [1242],
    continent: "NA",
    capital: "Nassau",
    currency: ["BSD"],
    languages: ["en"],
  },
  BT: {
    name: "Bhutan",
    native: "ʼbrug-yul",
    phone: [975],
    continent: "AS",
    capital: "Thimphu",
    currency: ["BTN", "INR"],
    languages: ["dz"],
  },
  BV: {
    name: "Bouvet Island",
    native: "Bouvetøya",
    phone: [47],
    continent: "AN",
    capital: "",
    currency: ["NOK"],
    languages: ["no", "nb", "nn"],
  },
  BW: {
    name: "Botswana",
    native: "Botswana",
    phone: [267],
    continent: "AF",
    capital: "Gaborone",
    currency: ["BWP"],
    languages: ["en", "tn"],
  },
  BY: {
    name: "Belarus",
    native: "Белару́сь",
    phone: [375],
    continent: "EU",
    capital: "Minsk",
    currency: ["BYN"],
    languages: ["be", "ru"],
  },
  BZ: {
    name: "Belize",
    native: "Belize",
    phone: [501],
    continent: "NA",
    capital: "Belmopan",
    currency: ["BZD"],
    languages: ["en", "es"],
  },
  CA: {
    name: "Canada",
    native: "Canada",
    phone: [1],
    continent: "NA",
    capital: "Ottawa",
    currency: ["CAD"],
    languages: ["en", "fr"],
  },
  CC: {
    name: "Cocos [Keeling] Islands",
    native: "Cocos (Keeling) Islands",
    phone: [61],
    continent: "AS",
    capital: "West Island",
    currency: ["AUD"],
    languages: ["en"],
  },
  CD: {
    name: "Democratic Republic of the Congo",
    native: "République démocratique du Congo",
    phone: [243],
    continent: "AF",
    capital: "Kinshasa",
    currency: ["CDF"],
    languages: ["fr", "ln", "kg", "sw", "lu"],
  },
  CF: {
    name: "Central African Republic",
    native: "Ködörösêse tî Bêafrîka",
    phone: [236],
    continent: "AF",
    capital: "Bangui",
    currency: ["XAF"],
    languages: ["fr", "sg"],
  },
  CG: {
    name: "Republic of the Congo",
    native: "République du Congo",
    phone: [242],
    continent: "AF",
    capital: "Brazzaville",
    currency: ["XAF"],
    languages: ["fr", "ln"],
  },
  CH: {
    name: "Switzerland",
    native: "Schweiz",
    phone: [41],
    continent: "EU",
    capital: "Bern",
    currency: ["CHE", "CHF", "CHW"],
    languages: ["de", "fr", "it"],
  },
  CI: {
    name: "Ivory Coast",
    native: "Côte d'Ivoire",
    phone: [225],
    continent: "AF",
    capital: "Yamoussoukro",
    currency: ["XOF"],
    languages: ["fr"],
  },
  CK: {
    name: "Cook Islands",
    native: "Cook Islands",
    phone: [682],
    continent: "OC",
    capital: "Avarua",
    currency: ["NZD"],
    languages: ["en"],
  },
  CL: {
    name: "Chile",
    native: "Chile",
    phone: [56],
    continent: "SA",
    capital: "Santiago",
    currency: ["CLF", "CLP"],
    languages: ["es"],
  },
  CM: {
    name: "Cameroon",
    native: "Cameroon",
    phone: [237],
    continent: "AF",
    capital: "Yaoundé",
    currency: ["XAF"],
    languages: ["en", "fr"],
  },
  CN: {
    name: "China",
    native: "中国",
    phone: [86],
    continent: "AS",
    capital: "Beijing",
    currency: ["CNY"],
    languages: ["zh"],
  },
  CO: {
    name: "Colombia",
    native: "Colombia",
    phone: [57],
    continent: "SA",
    capital: "Bogotá",
    currency: ["COP"],
    languages: ["es"],
  },
  CR: {
    name: "Costa Rica",
    native: "Costa Rica",
    phone: [506],
    continent: "NA",
    capital: "San José",
    currency: ["CRC"],
    languages: ["es"],
  },
  CU: {
    name: "Cuba",
    native: "Cuba",
    phone: [53],
    continent: "NA",
    capital: "Havana",
    currency: ["CUC", "CUP"],
    languages: ["es"],
  },
  CV: {
    name: "Cape Verde",
    native: "Cabo Verde",
    phone: [238],
    continent: "AF",
    capital: "Praia",
    currency: ["CVE"],
    languages: ["pt"],
  },
  CW: {
    name: "Curacao",
    native: "Curaçao",
    phone: [5999],
    continent: "NA",
    capital: "Willemstad",
    currency: ["ANG"],
    languages: ["nl", "pa", "en"],
  },
  CX: {
    name: "Christmas Island",
    native: "Christmas Island",
    phone: [61],
    continent: "AS",
    capital: "Flying Fish Cove",
    currency: ["AUD"],
    languages: ["en"],
  },
  CY: {
    name: "Cyprus",
    native: "Κύπρος",
    phone: [357],
    continent: "EU",
    capital: "Nicosia",
    currency: ["EUR"],
    languages: ["el", "tr", "hy"],
  },
  CZ: {
    name: "Czech Republic",
    native: "Česká republika",
    phone: [420],
    continent: "EU",
    capital: "Prague",
    currency: ["CZK"],
    languages: ["cs", "sk"],
  },
  DE: {
    name: "Germany",
    native: "Deutschland",
    phone: [49],
    continent: "EU",
    capital: "Berlin",
    currency: ["EUR"],
    languages: ["de"],
  },
  DJ: {
    name: "Djibouti",
    native: "Djibouti",
    phone: [253],
    continent: "AF",
    capital: "Djibouti",
    currency: ["DJF"],
    languages: ["fr", "ar"],
  },
  DK: {
    name: "Denmark",
    native: "Danmark",
    phone: [45],
    continent: "EU",
    continents: ["EU", "NA"],
    capital: "Copenhagen",
    currency: ["DKK"],
    languages: ["da"],
  },
  DM: {
    name: "Dominica",
    native: "Dominica",
    phone: [1767],
    continent: "NA",
    capital: "Roseau",
    currency: ["XCD"],
    languages: ["en"],
  },
  DO: {
    name: "Dominican Republic",
    native: "República Dominicana",
    phone: [1809, 1829, 1849],
    continent: "NA",
    capital: "Santo Domingo",
    currency: ["DOP"],
    languages: ["es"],
  },
  DZ: {
    name: "Algeria",
    native: "الجزائر",
    phone: [213],
    continent: "AF",
    capital: "Algiers",
    currency: ["DZD"],
    languages: ["ar"],
  },
  EC: {
    name: "Ecuador",
    native: "Ecuador",
    phone: [593],
    continent: "SA",
    capital: "Quito",
    currency: ["USD"],
    languages: ["es"],
  },
  EE: {
    name: "Estonia",
    native: "Eesti",
    phone: [372],
    continent: "EU",
    capital: "Tallinn",
    currency: ["EUR"],
    languages: ["et"],
  },
  EG: {
    name: "Egypt",
    native: "مصر‎",
    phone: [20],
    continent: "AF",
    continents: ["AF", "AS"],
    capital: "Cairo",
    currency: ["EGP"],
    languages: ["ar"],
  },
  EH: {
    name: "Western Sahara",
    native: "الصحراء الغربية",
    phone: [212],
    continent: "AF",
    capital: "El Aaiún",
    currency: ["MAD", "DZD", "MRU"],
    languages: ["es"],
  },
  ER: {
    name: "Eritrea",
    native: "ኤርትራ",
    phone: [291],
    continent: "AF",
    capital: "Asmara",
    currency: ["ERN"],
    languages: ["ti", "ar", "en"],
  },
  ES: {
    name: "Spain",
    native: "España",
    phone: [34],
    continent: "EU",
    capital: "Madrid",
    currency: ["EUR"],
    languages: ["es", "eu", "ca", "gl", "oc"],
  },
  ET: {
    name: "Ethiopia",
    native: "ኢትዮጵያ",
    phone: [251],
    continent: "AF",
    capital: "Addis Ababa",
    currency: ["ETB"],
    languages: ["am"],
  },
  FI: {
    name: "Finland",
    native: "Suomi",
    phone: [358],
    continent: "EU",
    capital: "Helsinki",
    currency: ["EUR"],
    languages: ["fi", "sv"],
  },
  FJ: {
    name: "Fiji",
    native: "Fiji",
    phone: [679],
    continent: "OC",
    capital: "Suva",
    currency: ["FJD"],
    languages: ["en", "fj", "hi", "ur"],
  },
  FK: {
    name: "Falkland Islands",
    native: "Falkland Islands",
    phone: [500],
    continent: "SA",
    capital: "Stanley",
    currency: ["FKP"],
    languages: ["en"],
  },
  FM: {
    name: "Micronesia",
    native: "Micronesia",
    phone: [691],
    continent: "OC",
    capital: "Palikir",
    currency: ["USD"],
    languages: ["en"],
  },
  FO: {
    name: "Faroe Islands",
    native: "Føroyar",
    phone: [298],
    continent: "EU",
    capital: "Tórshavn",
    currency: ["DKK"],
    languages: ["fo"],
  },
  FR: {
    name: "France",
    native: "France",
    phone: [33],
    continent: "EU",
    capital: "Paris",
    currency: ["EUR"],
    languages: ["fr"],
  },
  GA: {
    name: "Gabon",
    native: "Gabon",
    phone: [241],
    continent: "AF",
    capital: "Libreville",
    currency: ["XAF"],
    languages: ["fr"],
  },
  GB: {
    name: "United Kingdom",
    native: "United Kingdom",
    phone: [44],
    continent: "EU",
    capital: "London",
    currency: ["GBP"],
    languages: ["en"],
  },
  GD: {
    name: "Grenada",
    native: "Grenada",
    phone: [1473],
    continent: "NA",
    capital: "St. George's",
    currency: ["XCD"],
    languages: ["en"],
  },
  GE: {
    name: "Georgia",
    native: "საქართველო",
    phone: [995],
    continent: "AS",
    capital: "Tbilisi",
    currency: ["GEL"],
    languages: ["ka"],
  },
  GF: {
    name: "French Guiana",
    native: "Guyane française",
    phone: [594],
    continent: "SA",
    capital: "Cayenne",
    currency: ["EUR"],
    languages: ["fr"],
  },
  GG: {
    name: "Guernsey",
    native: "Guernsey",
    phone: [44],
    continent: "EU",
    capital: "St. Peter Port",
    currency: ["GBP"],
    languages: ["en", "fr"],
  },
  GH: {
    name: "Ghana",
    native: "Ghana",
    phone: [233],
    continent: "AF",
    capital: "Accra",
    currency: ["GHS"],
    languages: ["en"],
  },
  GI: {
    name: "Gibraltar",
    native: "Gibraltar",
    phone: [350],
    continent: "EU",
    capital: "Gibraltar",
    currency: ["GIP"],
    languages: ["en"],
  },
  GL: {
    name: "Greenland",
    native: "Kalaallit Nunaat",
    phone: [299],
    continent: "NA",
    capital: "Nuuk",
    currency: ["DKK"],
    languages: ["kl"],
  },
  GM: {
    name: "Gambia",
    native: "Gambia",
    phone: [220],
    continent: "AF",
    capital: "Banjul",
    currency: ["GMD"],
    languages: ["en"],
  },
  GN: {
    name: "Guinea",
    native: "Guinée",
    phone: [224],
    continent: "AF",
    capital: "Conakry",
    currency: ["GNF"],
    languages: ["fr", "ff"],
  },
  GP: {
    name: "Guadeloupe",
    native: "Guadeloupe",
    phone: [590],
    continent: "NA",
    capital: "Basse-Terre",
    currency: ["EUR"],
    languages: ["fr"],
  },
  GQ: {
    name: "Equatorial Guinea",
    native: "Guinea Ecuatorial",
    phone: [240],
    continent: "AF",
    capital: "Malabo",
    currency: ["XAF"],
    languages: ["es", "fr"],
  },
  GR: {
    name: "Greece",
    native: "Ελλάδα",
    phone: [30],
    continent: "EU",
    capital: "Athens",
    currency: ["EUR"],
    languages: ["el"],
  },
  GS: {
    name: "South Georgia and the South Sandwich Islands",
    native: "South Georgia",
    phone: [500],
    continent: "AN",
    capital: "King Edward Point",
    currency: ["GBP"],
    languages: ["en"],
  },
  GT: {
    name: "Guatemala",
    native: "Guatemala",
    phone: [502],
    continent: "NA",
    capital: "Guatemala City",
    currency: ["GTQ"],
    languages: ["es"],
  },
  GU: {
    name: "Guam",
    native: "Guam",
    phone: [1671],
    continent: "OC",
    capital: "Hagåtña",
    currency: ["USD"],
    languages: ["en", "ch", "es"],
  },
  GW: {
    name: "Guinea-Bissau",
    native: "Guiné-Bissau",
    phone: [245],
    continent: "AF",
    capital: "Bissau",
    currency: ["XOF"],
    languages: ["pt"],
  },
  GY: {
    name: "Guyana",
    native: "Guyana",
    phone: [592],
    continent: "SA",
    capital: "Georgetown",
    currency: ["GYD"],
    languages: ["en"],
  },
  HK: {
    name: "Hong Kong",
    native: "香港",
    phone: [852],
    continent: "AS",
    capital: "City of Victoria",
    currency: ["HKD"],
    languages: ["zh", "en"],
  },
  HM: {
    name: "Heard Island and McDonald Islands",
    native: "Heard Island and McDonald Islands",
    phone: [61],
    continent: "AN",
    capital: "",
    currency: ["AUD"],
    languages: ["en"],
  },
  HN: {
    name: "Honduras",
    native: "Honduras",
    phone: [504],
    continent: "NA",
    capital: "Tegucigalpa",
    currency: ["HNL"],
    languages: ["es"],
  },
  HR: {
    name: "Croatia",
    native: "Hrvatska",
    phone: [385],
    continent: "EU",
    capital: "Zagreb",
    currency: ["HRK"],
    languages: ["hr"],
  },
  HT: {
    name: "Haiti",
    native: "Haïti",
    phone: [509],
    continent: "NA",
    capital: "Port-au-Prince",
    currency: ["HTG", "USD"],
    languages: ["fr", "ht"],
  },
  HU: {
    name: "Hungary",
    native: "Magyarország",
    phone: [36],
    continent: "EU",
    capital: "Budapest",
    currency: ["HUF"],
    languages: ["hu"],
  },
  ID: {
    name: "Indonesia",
    native: "Indonesia",
    phone: [62],
    continent: "AS",
    capital: "Jakarta",
    currency: ["IDR"],
    languages: ["id"],
  },
  IE: {
    name: "Ireland",
    native: "Éire",
    phone: [353],
    continent: "EU",
    capital: "Dublin",
    currency: ["EUR"],
    languages: ["ga", "en"],
  },
  IL: {
    name: "Israel",
    native: "יִשְׂרָאֵל",
    phone: [972],
    continent: "AS",
    capital: "Jerusalem",
    currency: ["ILS"],
    languages: ["he", "ar"],
  },
  IM: {
    name: "Isle of Man",
    native: "Isle of Man",
    phone: [44],
    continent: "EU",
    capital: "Douglas",
    currency: ["GBP"],
    languages: ["en", "gv"],
  },
  IN: {
    name: "India",
    native: "भारत",
    phone: [91],
    continent: "AS",
    capital: "New Delhi",
    currency: ["INR"],
    languages: ["hi", "en"],
  },
  IO: {
    name: "British Indian Ocean Territory",
    native: "British Indian Ocean Territory",
    phone: [246],
    continent: "AS",
    capital: "Diego Garcia",
    currency: ["USD"],
    languages: ["en"],
  },
  IQ: {
    name: "Iraq",
    native: "العراق",
    phone: [964],
    continent: "AS",
    capital: "Baghdad",
    currency: ["IQD"],
    languages: ["ar", "ku"],
  },
  IR: {
    name: "Iran",
    native: "ایران",
    phone: [98],
    continent: "AS",
    capital: "Tehran",
    currency: ["IRR"],
    languages: ["fa"],
  },
  IS: {
    name: "Iceland",
    native: "Ísland",
    phone: [354],
    continent: "EU",
    capital: "Reykjavik",
    currency: ["ISK"],
    languages: ["is"],
  },
  IT: {
    name: "Italy",
    native: "Italia",
    phone: [39],
    continent: "EU",
    capital: "Rome",
    currency: ["EUR"],
    languages: ["it"],
  },
  JE: {
    name: "Jersey",
    native: "Jersey",
    phone: [44],
    continent: "EU",
    capital: "Saint Helier",
    currency: ["GBP"],
    languages: ["en", "fr"],
  },
  JM: {
    name: "Jamaica",
    native: "Jamaica",
    phone: [1876],
    continent: "NA",
    capital: "Kingston",
    currency: ["JMD"],
    languages: ["en"],
  },
  JO: {
    name: "Jordan",
    native: "الأردن",
    phone: [962],
    continent: "AS",
    capital: "Amman",
    currency: ["JOD"],
    languages: ["ar"],
  },
  JP: {
    name: "Japan",
    native: "日本",
    phone: [81],
    continent: "AS",
    capital: "Tokyo",
    currency: ["JPY"],
    languages: ["ja"],
  },
  KE: {
    name: "Kenya",
    native: "Kenya",
    phone: [254],
    continent: "AF",
    capital: "Nairobi",
    currency: ["KES"],
    languages: ["en", "sw"],
  },
  KG: {
    name: "Kyrgyzstan",
    native: "Кыргызстан",
    phone: [996],
    continent: "AS",
    capital: "Bishkek",
    currency: ["KGS"],
    languages: ["ky", "ru"],
  },
  KH: {
    name: "Cambodia",
    native: "Kâmpŭchéa",
    phone: [855],
    continent: "AS",
    capital: "Phnom Penh",
    currency: ["KHR"],
    languages: ["km"],
  },
  KI: {
    name: "Kiribati",
    native: "Kiribati",
    phone: [686],
    continent: "OC",
    capital: "South Tarawa",
    currency: ["AUD"],
    languages: ["en"],
  },
  KM: {
    name: "Comoros",
    native: "Komori",
    phone: [269],
    continent: "AF",
    capital: "Moroni",
    currency: ["KMF"],
    languages: ["ar", "fr"],
  },
  KN: {
    name: "Saint Kitts and Nevis",
    native: "Saint Kitts and Nevis",
    phone: [1869],
    continent: "NA",
    capital: "Basseterre",
    currency: ["XCD"],
    languages: ["en"],
  },
  KP: {
    name: "North Korea",
    native: "북한",
    phone: [850],
    continent: "AS",
    capital: "Pyongyang",
    currency: ["KPW"],
    languages: ["ko"],
  },
  KR: {
    name: "South Korea",
    native: "대한민국",
    phone: [82],
    continent: "AS",
    capital: "Seoul",
    currency: ["KRW"],
    languages: ["ko"],
  },
  KW: {
    name: "Kuwait",
    native: "الكويت",
    phone: [965],
    continent: "AS",
    capital: "Kuwait City",
    currency: ["KWD"],
    languages: ["ar"],
  },
  KY: {
    name: "Cayman Islands",
    native: "Cayman Islands",
    phone: [1345],
    continent: "NA",
    capital: "George Town",
    currency: ["KYD"],
    languages: ["en"],
  },
  KZ: {
    name: "Kazakhstan",
    native: "Қазақстан",
    phone: [76, 77],
    continent: "AS",
    continents: ["AS", "EU"],
    capital: "Astana",
    currency: ["KZT"],
    languages: ["kk", "ru"],
  },
  LA: {
    name: "Laos",
    native: "ສປປລາວ",
    phone: [856],
    continent: "AS",
    capital: "Vientiane",
    currency: ["LAK"],
    languages: ["lo"],
  },
  LB: {
    name: "Lebanon",
    native: "لبنان",
    phone: [961],
    continent: "AS",
    capital: "Beirut",
    currency: ["LBP"],
    languages: ["ar", "fr"],
  },
  LC: {
    name: "Saint Lucia",
    native: "Saint Lucia",
    phone: [1758],
    continent: "NA",
    capital: "Castries",
    currency: ["XCD"],
    languages: ["en"],
  },
  LI: {
    name: "Liechtenstein",
    native: "Liechtenstein",
    phone: [423],
    continent: "EU",
    capital: "Vaduz",
    currency: ["CHF"],
    languages: ["de"],
  },
  LK: {
    name: "Sri Lanka",
    native: "śrī laṃkāva",
    phone: [94],
    continent: "AS",
    capital: "Colombo",
    currency: ["LKR"],
    languages: ["si", "ta"],
  },
  LR: {
    name: "Liberia",
    native: "Liberia",
    phone: [231],
    continent: "AF",
    capital: "Monrovia",
    currency: ["LRD"],
    languages: ["en"],
  },
  LS: {
    name: "Lesotho",
    native: "Lesotho",
    phone: [266],
    continent: "AF",
    capital: "Maseru",
    currency: ["LSL", "ZAR"],
    languages: ["en", "st"],
  },
  LT: {
    name: "Lithuania",
    native: "Lietuva",
    phone: [370],
    continent: "EU",
    capital: "Vilnius",
    currency: ["EUR"],
    languages: ["lt"],
  },
  LU: {
    name: "Luxembourg",
    native: "Luxembourg",
    phone: [352],
    continent: "EU",
    capital: "Luxembourg",
    currency: ["EUR"],
    languages: ["fr", "de", "lb"],
  },
  LV: {
    name: "Latvia",
    native: "Latvija",
    phone: [371],
    continent: "EU",
    capital: "Riga",
    currency: ["EUR"],
    languages: ["lv"],
  },
  LY: {
    name: "Libya",
    native: "‏ليبيا",
    phone: [218],
    continent: "AF",
    capital: "Tripoli",
    currency: ["LYD"],
    languages: ["ar"],
  },
  MA: {
    name: "Morocco",
    native: "المغرب",
    phone: [212],
    continent: "AF",
    capital: "Rabat",
    currency: ["MAD"],
    languages: ["ar"],
  },
  MC: {
    name: "Monaco",
    native: "Monaco",
    phone: [377],
    continent: "EU",
    capital: "Monaco",
    currency: ["EUR"],
    languages: ["fr"],
  },
  MD: {
    name: "Moldova",
    native: "Moldova",
    phone: [373],
    continent: "EU",
    capital: "Chișinău",
    currency: ["MDL"],
    languages: ["ro"],
  },
  ME: {
    name: "Montenegro",
    native: "Црна Гора",
    phone: [382],
    continent: "EU",
    capital: "Podgorica",
    currency: ["EUR"],
    languages: ["sr", "bs", "sq", "hr"],
  },
  MF: {
    name: "Saint Martin",
    native: "Saint-Martin",
    phone: [590],
    continent: "NA",
    capital: "Marigot",
    currency: ["EUR"],
    languages: ["en", "fr", "nl"],
  },
  MG: {
    name: "Madagascar",
    native: "Madagasikara",
    phone: [261],
    continent: "AF",
    capital: "Antananarivo",
    currency: ["MGA"],
    languages: ["fr", "mg"],
  },
  MH: {
    name: "Marshall Islands",
    native: "M̧ajeļ",
    phone: [692],
    continent: "OC",
    capital: "Majuro",
    currency: ["USD"],
    languages: ["en", "mh"],
  },
  MK: {
    name: "North Macedonia",
    native: "Северна Македонија",
    phone: [389],
    continent: "EU",
    capital: "Skopje",
    currency: ["MKD"],
    languages: ["mk"],
  },
  ML: {
    name: "Mali",
    native: "Mali",
    phone: [223],
    continent: "AF",
    capital: "Bamako",
    currency: ["XOF"],
    languages: ["fr"],
  },
  MM: {
    name: "Myanmar [Burma]",
    native: "မြန်မာ",
    phone: [95],
    continent: "AS",
    capital: "Naypyidaw",
    currency: ["MMK"],
    languages: ["my"],
  },
  MN: {
    name: "Mongolia",
    native: "Монгол улс",
    phone: [976],
    continent: "AS",
    capital: "Ulan Bator",
    currency: ["MNT"],
    languages: ["mn"],
  },
  MO: {
    name: "Macao",
    native: "澳門",
    phone: [853],
    continent: "AS",
    capital: "",
    currency: ["MOP"],
    languages: ["zh", "pt"],
  },
  MP: {
    name: "Northern Mariana Islands",
    native: "Northern Mariana Islands",
    phone: [1670],
    continent: "OC",
    capital: "Saipan",
    currency: ["USD"],
    languages: ["en", "ch"],
  },
  MQ: {
    name: "Martinique",
    native: "Martinique",
    phone: [596],
    continent: "NA",
    capital: "Fort-de-France",
    currency: ["EUR"],
    languages: ["fr"],
  },
  MR: {
    name: "Mauritania",
    native: "موريتانيا",
    phone: [222],
    continent: "AF",
    capital: "Nouakchott",
    currency: ["MRU"],
    languages: ["ar"],
  },
  MS: {
    name: "Montserrat",
    native: "Montserrat",
    phone: [1664],
    continent: "NA",
    capital: "Plymouth",
    currency: ["XCD"],
    languages: ["en"],
  },
  MT: {
    name: "Malta",
    native: "Malta",
    phone: [356],
    continent: "EU",
    capital: "Valletta",
    currency: ["EUR"],
    languages: ["mt", "en"],
  },
  MU: {
    name: "Mauritius",
    native: "Maurice",
    phone: [230],
    continent: "AF",
    capital: "Port Louis",
    currency: ["MUR"],
    languages: ["en"],
  },
  MV: {
    name: "Maldives",
    native: "Maldives",
    phone: [960],
    continent: "AS",
    capital: "Malé",
    currency: ["MVR"],
    languages: ["dv"],
  },
  MW: {
    name: "Malawi",
    native: "Malawi",
    phone: [265],
    continent: "AF",
    capital: "Lilongwe",
    currency: ["MWK"],
    languages: ["en", "ny"],
  },
  MX: {
    name: "Mexico",
    native: "México",
    phone: [52],
    continent: "NA",
    capital: "Mexico City",
    currency: ["MXN"],
    languages: ["es"],
  },
  MY: {
    name: "Malaysia",
    native: "Malaysia",
    phone: [60],
    continent: "AS",
    capital: "Kuala Lumpur",
    currency: ["MYR"],
    languages: ["ms"],
  },
  MZ: {
    name: "Mozambique",
    native: "Moçambique",
    phone: [258],
    continent: "AF",
    capital: "Maputo",
    currency: ["MZN"],
    languages: ["pt"],
  },
  NA: {
    name: "Namibia",
    native: "Namibia",
    phone: [264],
    continent: "AF",
    capital: "Windhoek",
    currency: ["NAD", "ZAR"],
    languages: ["en", "af"],
  },
  NC: {
    name: "New Caledonia",
    native: "Nouvelle-Calédonie",
    phone: [687],
    continent: "OC",
    capital: "Nouméa",
    currency: ["XPF"],
    languages: ["fr"],
  },
  NE: {
    name: "Niger",
    native: "Niger",
    phone: [227],
    continent: "AF",
    capital: "Niamey",
    currency: ["XOF"],
    languages: ["fr"],
  },
  NF: {
    name: "Norfolk Island",
    native: "Norfolk Island",
    phone: [672],
    continent: "OC",
    capital: "Kingston",
    currency: ["AUD"],
    languages: ["en"],
  },
  NG: {
    name: "Nigeria",
    native: "Nigeria",
    phone: [234],
    continent: "AF",
    capital: "Abuja",
    currency: ["NGN"],
    languages: ["en"],
  },
  NI: {
    name: "Nicaragua",
    native: "Nicaragua",
    phone: [505],
    continent: "NA",
    capital: "Managua",
    currency: ["NIO"],
    languages: ["es"],
  },
  NL: {
    name: "Netherlands",
    native: "Nederland",
    phone: [31],
    continent: "EU",
    capital: "Amsterdam",
    currency: ["EUR"],
    languages: ["nl"],
  },
  NO: {
    name: "Norway",
    native: "Norge",
    phone: [47],
    continent: "EU",
    capital: "Oslo",
    currency: ["NOK"],
    languages: ["no", "nb", "nn"],
  },
  NP: {
    name: "Nepal",
    native: "नपल",
    phone: [977],
    continent: "AS",
    capital: "Kathmandu",
    currency: ["NPR"],
    languages: ["ne"],
  },
  NR: {
    name: "Nauru",
    native: "Nauru",
    phone: [674],
    continent: "OC",
    capital: "Yaren",
    currency: ["AUD"],
    languages: ["en", "na"],
  },
  NU: {
    name: "Niue",
    native: "Niuē",
    phone: [683],
    continent: "OC",
    capital: "Alofi",
    currency: ["NZD"],
    languages: ["en"],
  },
  NZ: {
    name: "New Zealand",
    native: "New Zealand",
    phone: [64],
    continent: "OC",
    capital: "Wellington",
    currency: ["NZD"],
    languages: ["en", "mi"],
  },
  OM: {
    name: "Oman",
    native: "عمان",
    phone: [968],
    continent: "AS",
    capital: "Muscat",
    currency: ["OMR"],
    languages: ["ar"],
  },
  PA: {
    name: "Panama",
    native: "Panamá",
    phone: [507],
    continent: "NA",
    capital: "Panama City",
    currency: ["PAB", "USD"],
    languages: ["es"],
  },
  PE: {
    name: "Peru",
    native: "Perú",
    phone: [51],
    continent: "SA",
    capital: "Lima",
    currency: ["PEN"],
    languages: ["es"],
  },
  PF: {
    name: "French Polynesia",
    native: "Polynésie française",
    phone: [689],
    continent: "OC",
    capital: "Papeetē",
    currency: ["XPF"],
    languages: ["fr"],
  },
  PG: {
    name: "Papua New Guinea",
    native: "Papua Niugini",
    phone: [675],
    continent: "OC",
    capital: "Port Moresby",
    currency: ["PGK"],
    languages: ["en"],
  },
  PH: {
    name: "Philippines",
    native: "Pilipinas",
    phone: [63],
    continent: "AS",
    capital: "Manila",
    currency: ["PHP"],
    languages: ["en"],
  },
  PK: {
    name: "Pakistan",
    native: "Pakistan",
    phone: [92],
    continent: "AS",
    capital: "Islamabad",
    currency: ["PKR"],
    languages: ["en", "ur"],
  },
  PL: {
    name: "Poland",
    native: "Polska",
    phone: [48],
    continent: "EU",
    capital: "Warsaw",
    currency: ["PLN"],
    languages: ["pl"],
  },
  PM: {
    name: "Saint Pierre and Miquelon",
    native: "Saint-Pierre-et-Miquelon",
    phone: [508],
    continent: "NA",
    capital: "Saint-Pierre",
    currency: ["EUR"],
    languages: ["fr"],
  },
  PN: {
    name: "Pitcairn Islands",
    native: "Pitcairn Islands",
    phone: [64],
    continent: "OC",
    capital: "Adamstown",
    currency: ["NZD"],
    languages: ["en"],
  },
  PR: {
    name: "Puerto Rico",
    native: "Puerto Rico",
    phone: [1787, 1939],
    continent: "NA",
    capital: "San Juan",
    currency: ["USD"],
    languages: ["es", "en"],
  },
  PS: {
    name: "Palestine",
    native: "فلسطين",
    phone: [970],
    continent: "AS",
    capital: "Ramallah",
    currency: ["ILS"],
    languages: ["ar"],
  },
  PT: {
    name: "Portugal",
    native: "Portugal",
    phone: [351],
    continent: "EU",
    capital: "Lisbon",
    currency: ["EUR"],
    languages: ["pt"],
  },
  PW: {
    name: "Palau",
    native: "Palau",
    phone: [680],
    continent: "OC",
    capital: "Ngerulmud",
    currency: ["USD"],
    languages: ["en"],
  },
  PY: {
    name: "Paraguay",
    native: "Paraguay",
    phone: [595],
    continent: "SA",
    capital: "Asunción",
    currency: ["PYG"],
    languages: ["es", "gn"],
  },
  QA: {
    name: "Qatar",
    native: "قطر",
    phone: [974],
    continent: "AS",
    capital: "Doha",
    currency: ["QAR"],
    languages: ["ar"],
  },
  RE: {
    name: "Réunion",
    native: "La Réunion",
    phone: [262],
    continent: "AF",
    capital: "Saint-Denis",
    currency: ["EUR"],
    languages: ["fr"],
  },
  RO: {
    name: "Romania",
    native: "România",
    phone: [40],
    continent: "EU",
    capital: "Bucharest",
    currency: ["RON"],
    languages: ["ro"],
  },
  RS: {
    name: "Serbia",
    native: "Србија",
    phone: [381],
    continent: "EU",
    capital: "Belgrade",
    currency: ["RSD"],
    languages: ["sr"],
  },
  RU: {
    name: "Russia",
    native: "Россия",
    phone: [7],
    continent: "EU",
    continents: ["AS", "EU"],
    capital: "Moscow",
    currency: ["RUB"],
    languages: ["ru"],
  },
  RW: {
    name: "Rwanda",
    native: "Rwanda",
    phone: [250],
    continent: "AF",
    capital: "Kigali",
    currency: ["RWF"],
    languages: ["rw", "en", "fr"],
  },
  SA: {
    name: "Saudi Arabia",
    native: "العربية السعودية",
    phone: [966],
    continent: "AS",
    capital: "Riyadh",
    currency: ["SAR"],
    languages: ["ar"],
  },
  SB: {
    name: "Solomon Islands",
    native: "Solomon Islands",
    phone: [677],
    continent: "OC",
    capital: "Honiara",
    currency: ["SBD"],
    languages: ["en"],
  },
  SC: {
    name: "Seychelles",
    native: "Seychelles",
    phone: [248],
    continent: "AF",
    capital: "Victoria",
    currency: ["SCR"],
    languages: ["fr", "en"],
  },
  SD: {
    name: "Sudan",
    native: "السودان",
    phone: [249],
    continent: "AF",
    capital: "Khartoum",
    currency: ["SDG"],
    languages: ["ar", "en"],
  },
  SE: {
    name: "Sweden",
    native: "Sverige",
    phone: [46],
    continent: "EU",
    capital: "Stockholm",
    currency: ["SEK"],
    languages: ["sv"],
  },
  SG: {
    name: "Singapore",
    native: "Singapore",
    phone: [65],
    continent: "AS",
    capital: "Singapore",
    currency: ["SGD"],
    languages: ["en", "ms", "ta", "zh"],
  },
  SH: {
    name: "Saint Helena",
    native: "Saint Helena",
    phone: [290],
    continent: "AF",
    capital: "Jamestown",
    currency: ["SHP"],
    languages: ["en"],
  },
  SI: {
    name: "Slovenia",
    native: "Slovenija",
    phone: [386],
    continent: "EU",
    capital: "Ljubljana",
    currency: ["EUR"],
    languages: ["sl"],
  },
  SJ: {
    name: "Svalbard and Jan Mayen",
    native: "Svalbard og Jan Mayen",
    phone: [4779],
    continent: "EU",
    capital: "Longyearbyen",
    currency: ["NOK"],
    languages: ["no"],
  },
  SK: {
    name: "Slovakia",
    native: "Slovensko",
    phone: [421],
    continent: "EU",
    capital: "Bratislava",
    currency: ["EUR"],
    languages: ["sk"],
  },
  SL: {
    name: "Sierra Leone",
    native: "Sierra Leone",
    phone: [232],
    continent: "AF",
    capital: "Freetown",
    currency: ["SLL"],
    languages: ["en"],
  },
  SM: {
    name: "San Marino",
    native: "San Marino",
    phone: [378],
    continent: "EU",
    capital: "City of San Marino",
    currency: ["EUR"],
    languages: ["it"],
  },
  SN: {
    name: "Senegal",
    native: "Sénégal",
    phone: [221],
    continent: "AF",
    capital: "Dakar",
    currency: ["XOF"],
    languages: ["fr"],
  },
  SO: {
    name: "Somalia",
    native: "Soomaaliya",
    phone: [252],
    continent: "AF",
    capital: "Mogadishu",
    currency: ["SOS"],
    languages: ["so", "ar"],
  },
  SR: {
    name: "Suriname",
    native: "Suriname",
    phone: [597],
    continent: "SA",
    capital: "Paramaribo",
    currency: ["SRD"],
    languages: ["nl"],
  },
  SS: {
    name: "South Sudan",
    native: "South Sudan",
    phone: [211],
    continent: "AF",
    capital: "Juba",
    currency: ["SSP"],
    languages: ["en"],
  },
  ST: {
    name: "São Tomé and Príncipe",
    native: "São Tomé e Príncipe",
    phone: [239],
    continent: "AF",
    capital: "São Tomé",
    currency: ["STN"],
    languages: ["pt"],
  },
  SV: {
    name: "El Salvador",
    native: "El Salvador",
    phone: [503],
    continent: "NA",
    capital: "San Salvador",
    currency: ["SVC", "USD"],
    languages: ["es"],
  },
  SX: {
    name: "Sint Maarten",
    native: "Sint Maarten",
    phone: [1721],
    continent: "NA",
    capital: "Philipsburg",
    currency: ["ANG"],
    languages: ["nl", "en"],
  },
  SY: {
    name: "Syria",
    native: "سوريا",
    phone: [963],
    continent: "AS",
    capital: "Damascus",
    currency: ["SYP"],
    languages: ["ar"],
  },
  SZ: {
    name: "Swaziland",
    native: "Swaziland",
    phone: [268],
    continent: "AF",
    capital: "Lobamba",
    currency: ["SZL"],
    languages: ["en", "ss"],
  },
  TC: {
    name: "Turks and Caicos Islands",
    native: "Turks and Caicos Islands",
    phone: [1649],
    continent: "NA",
    capital: "Cockburn Town",
    currency: ["USD"],
    languages: ["en"],
  },
  TD: {
    name: "Chad",
    native: "Tchad",
    phone: [235],
    continent: "AF",
    capital: "N'Djamena",
    currency: ["XAF"],
    languages: ["fr", "ar"],
  },
  TF: {
    name: "French Southern Territories",
    native: "Territoire des Terres australes et antarctiques fr",
    phone: [262],
    continent: "AN",
    capital: "Port-aux-Français",
    currency: ["EUR"],
    languages: ["fr"],
  },
  TG: {
    name: "Togo",
    native: "Togo",
    phone: [228],
    continent: "AF",
    capital: "Lomé",
    currency: ["XOF"],
    languages: ["fr"],
  },
  TH: {
    name: "Thailand",
    native: "ประเทศไทย",
    phone: [66],
    continent: "AS",
    capital: "Bangkok",
    currency: ["THB"],
    languages: ["th"],
  },
  TJ: {
    name: "Tajikistan",
    native: "Тоҷикистон",
    phone: [992],
    continent: "AS",
    capital: "Dushanbe",
    currency: ["TJS"],
    languages: ["tg", "ru"],
  },
  TK: {
    name: "Tokelau",
    native: "Tokelau",
    phone: [690],
    continent: "OC",
    capital: "Fakaofo",
    currency: ["NZD"],
    languages: ["en"],
  },
  TL: {
    name: "East Timor",
    native: "Timor-Leste",
    phone: [670],
    continent: "OC",
    capital: "Dili",
    currency: ["USD"],
    languages: ["pt"],
  },
  TM: {
    name: "Turkmenistan",
    native: "Türkmenistan",
    phone: [993],
    continent: "AS",
    capital: "Ashgabat",
    currency: ["TMT"],
    languages: ["tk", "ru"],
  },
  TN: {
    name: "Tunisia",
    native: "تونس",
    phone: [216],
    continent: "AF",
    capital: "Tunis",
    currency: ["TND"],
    languages: ["ar"],
  },
  TO: {
    name: "Tonga",
    native: "Tonga",
    phone: [676],
    continent: "OC",
    capital: "Nuku'alofa",
    currency: ["TOP"],
    languages: ["en", "to"],
  },
  TR: {
    name: "Turkey",
    native: "Türkiye",
    phone: [90],
    continent: "AS",
    continents: ["AS", "EU"],
    capital: "Ankara",
    currency: ["TRY"],
    languages: ["tr"],
  },
  TT: {
    name: "Trinidad and Tobago",
    native: "Trinidad and Tobago",
    phone: [1868],
    continent: "NA",
    capital: "Port of Spain",
    currency: ["TTD"],
    languages: ["en"],
  },
  TV: {
    name: "Tuvalu",
    native: "Tuvalu",
    phone: [688],
    continent: "OC",
    capital: "Funafuti",
    currency: ["AUD"],
    languages: ["en"],
  },
  TW: {
    name: "Taiwan",
    native: "臺灣",
    phone: [886],
    continent: "AS",
    capital: "Taipei",
    currency: ["TWD"],
    languages: ["zh"],
  },
  TZ: {
    name: "Tanzania",
    native: "Tanzania",
    phone: [255],
    continent: "AF",
    capital: "Dodoma",
    currency: ["TZS"],
    languages: ["sw", "en"],
  },
  UA: {
    name: "Ukraine",
    native: "Україна",
    phone: [380],
    continent: "EU",
    capital: "Kyiv",
    currency: ["UAH"],
    languages: ["uk"],
  },
  UG: {
    name: "Uganda",
    native: "Uganda",
    phone: [256],
    continent: "AF",
    capital: "Kampala",
    currency: ["UGX"],
    languages: ["en", "sw"],
  },
  UM: {
    name: "U.S. Minor Outlying Islands",
    native: "United States Minor Outlying Islands",
    phone: [1],
    continent: "OC",
    capital: "",
    currency: ["USD"],
    languages: ["en"],
  },
  US: {
    name: "United States",
    native: "United States",
    phone: [1],
    continent: "NA",
    capital: "Washington D.C.",
    currency: ["USD", "USN", "USS"],
    languages: ["en"],
  },
  UY: {
    name: "Uruguay",
    native: "Uruguay",
    phone: [598],
    continent: "SA",
    capital: "Montevideo",
    currency: ["UYI", "UYU"],
    languages: ["es"],
  },
  UZ: {
    name: "Uzbekistan",
    native: "O‘zbekiston",
    phone: [998],
    continent: "AS",
    capital: "Tashkent",
    currency: ["UZS"],
    languages: ["uz", "ru"],
  },
  VA: {
    name: "Vatican City",
    native: "Vaticano",
    phone: [379],
    continent: "EU",
    capital: "Vatican City",
    currency: ["EUR"],
    languages: ["it", "la"],
  },
  VC: {
    name: "Saint Vincent and the Grenadines",
    native: "Saint Vincent and the Grenadines",
    phone: [1784],
    continent: "NA",
    capital: "Kingstown",
    currency: ["XCD"],
    languages: ["en"],
  },
  VE: {
    name: "Venezuela",
    native: "Venezuela",
    phone: [58],
    continent: "SA",
    capital: "Caracas",
    currency: ["VES"],
    languages: ["es"],
  },
  VG: {
    name: "British Virgin Islands",
    native: "British Virgin Islands",
    phone: [1284],
    continent: "NA",
    capital: "Road Town",
    currency: ["USD"],
    languages: ["en"],
  },
  VI: {
    name: "U.S. Virgin Islands",
    native: "United States Virgin Islands",
    phone: [1340],
    continent: "NA",
    capital: "Charlotte Amalie",
    currency: ["USD"],
    languages: ["en"],
  },
  VN: {
    name: "Vietnam",
    native: "Việt Nam",
    phone: [84],
    continent: "AS",
    capital: "Hanoi",
    currency: ["VND"],
    languages: ["vi"],
  },
  VU: {
    name: "Vanuatu",
    native: "Vanuatu",
    phone: [678],
    continent: "OC",
    capital: "Port Vila",
    currency: ["VUV"],
    languages: ["bi", "en", "fr"],
  },
  WF: {
    name: "Wallis and Futuna",
    native: "Wallis et Futuna",
    phone: [681],
    continent: "OC",
    capital: "Mata-Utu",
    currency: ["XPF"],
    languages: ["fr"],
  },
  WS: {
    name: "Samoa",
    native: "Samoa",
    phone: [685],
    continent: "OC",
    capital: "Apia",
    currency: ["WST"],
    languages: ["sm", "en"],
  },
  XK: {
    name: "Kosovo",
    native: "Republika e Kosovës",
    phone: [377, 381, 383, 386],
    continent: "EU",
    capital: "Pristina",
    currency: ["EUR"],
    languages: ["sq", "sr"],
  },
  YE: {
    name: "Yemen",
    native: "اليَمَن",
    phone: [967],
    continent: "AS",
    capital: "Sana'a",
    currency: ["YER"],
    languages: ["ar"],
  },
  YT: {
    name: "Mayotte",
    native: "Mayotte",
    phone: [262],
    continent: "AF",
    capital: "Mamoudzou",
    currency: ["EUR"],
    languages: ["fr"],
  },
  ZA: {
    name: "South Africa",
    native: "South Africa",
    phone: [27],
    continent: "AF",
    capital: "Pretoria",
    currency: ["ZAR"],
    languages: ["af", "en", "nr", "st", "ss", "tn", "ts", "ve", "xh", "zu"],
  },
  ZM: {
    name: "Zambia",
    native: "Zambia",
    phone: [260],
    continent: "AF",
    capital: "Lusaka",
    currency: ["ZMW"],
    languages: ["en"],
  },
  ZW: {
    name: "Zimbabwe",
    native: "Zimbabwe",
    phone: [263],
    continent: "AF",
    capital: "Harare",
    currency: ["USD", "ZAR", "BWP", "GBP", "AUD", "CNY", "INR", "JPY"],
    languages: ["en", "sn", "nd"],
  },
};

function countryAlpha2Codes() {
  return Object.keys(data);
}

function countryNames() {
  return Object.entries(data).map(([code, data]) => data.name);
}

function countryDataByAlpha2Code(code: string) {
  if (typeof data[code] === "undefined") {
    throw new CountryNotFound(code);
  }
  return { alpha2: code, ...data[code] };
}

function countryDataByName(name: string) {
  const entry = Object.entries(data).filter(
    ([code, data]) => data.name === name,
  );
  if (entry.length === 0) {
    throw new CountryNotFound(name);
  }

  return countryDataByAlpha2Code(entry[0][0]);
}

const byName = command("name")
  .description("Lookup a country by name")
  .argument("name", {
    description: "Country name",
    choices: countryNames(),
    prompt: true,
  })
  .action(({ name }) => {
    console.log(countryDataByName(name));
  });

const byAlpha2 = command("alpha2")
  .description("Lookup a country by alpha-2 code")
  .argument("alpha2", {
    description: "Alpha-2 code",
    choices: countryAlpha2Codes(),
    prompt: true,
  })
  .action(({ alpha2 }) => {
    console.log(countryDataByAlpha2Code(alpha2));
  });

program()
  .add(byName)
  .add(byAlpha2)
  .runOrRepl()
  .catch((error: CountryNotFound | Error | unknown) => {
    if (error instanceof CountryNotFound) {
      // This could never happen, since yargs validates the input based on the
      // `choices` in the `country` argument options.
      console.error(error.message);
    } else if (
      error instanceof Error &&
      error.message.includes("Invalid values")
    ) {
      console.error(error.message);
    } else {
      console.error(error);
    }
  });