1039 lines
15 KiB
TypeScript
1039 lines
15 KiB
TypeScript
/*
|
|
Copyright 2024 New Vector Ltd.
|
|
Copyright 2017 Vector Creations Ltd
|
|
|
|
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only
|
|
Please see LICENSE files in the repository root for full details.
|
|
*/
|
|
|
|
const PHONE_NUMBER_REGEXP = /^[0-9 -.]+$/;
|
|
|
|
/*
|
|
* Do basic validation to determine if the given input could be
|
|
* a valid phone number.
|
|
*
|
|
* @param {String} phoneNumber The string to validate. This could be
|
|
* either an international format number (MSISDN or e.164) or
|
|
* a national-format number.
|
|
* @return True if the number could be a valid phone number, otherwise false.
|
|
*/
|
|
export function looksValid(phoneNumber: string): boolean {
|
|
return PHONE_NUMBER_REGEXP.test(phoneNumber);
|
|
}
|
|
|
|
// Regional Indicator Symbol Letter A
|
|
const UNICODE_BASE = 127462 - "A".charCodeAt(0);
|
|
// Country code should be exactly 2 uppercase characters
|
|
const COUNTRY_CODE_REGEX = /^[A-Z]{2}$/;
|
|
|
|
export const getEmojiFlag = (countryCode: string): string => {
|
|
if (!COUNTRY_CODE_REGEX.test(countryCode)) return "";
|
|
// Rip the country code out of the emoji and use that
|
|
return String.fromCodePoint(...countryCode.split("").map((l) => UNICODE_BASE + l.charCodeAt(0)));
|
|
};
|
|
|
|
// Use https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DisplayNames to get name
|
|
export interface PhoneNumberCountryDefinition {
|
|
iso2: string;
|
|
prefix: string;
|
|
}
|
|
|
|
export const COUNTRIES: PhoneNumberCountryDefinition[] = [
|
|
{
|
|
iso2: "GB",
|
|
prefix: "44",
|
|
},
|
|
{
|
|
iso2: "US",
|
|
prefix: "1",
|
|
},
|
|
{
|
|
iso2: "AF",
|
|
prefix: "93",
|
|
},
|
|
{
|
|
iso2: "AX",
|
|
prefix: "358",
|
|
},
|
|
{
|
|
iso2: "AL",
|
|
prefix: "355",
|
|
},
|
|
{
|
|
iso2: "DZ",
|
|
prefix: "213",
|
|
},
|
|
{
|
|
iso2: "AS",
|
|
prefix: "1",
|
|
},
|
|
{
|
|
iso2: "AD",
|
|
prefix: "376",
|
|
},
|
|
{
|
|
iso2: "AO",
|
|
prefix: "244",
|
|
},
|
|
{
|
|
iso2: "AI",
|
|
prefix: "1",
|
|
},
|
|
{
|
|
iso2: "AQ",
|
|
prefix: "672",
|
|
},
|
|
{
|
|
iso2: "AG",
|
|
prefix: "1",
|
|
},
|
|
{
|
|
iso2: "AR",
|
|
prefix: "54",
|
|
},
|
|
{
|
|
iso2: "AM",
|
|
prefix: "374",
|
|
},
|
|
{
|
|
iso2: "AW",
|
|
prefix: "297",
|
|
},
|
|
{
|
|
iso2: "AU",
|
|
prefix: "61",
|
|
},
|
|
{
|
|
iso2: "AT",
|
|
prefix: "43",
|
|
},
|
|
{
|
|
iso2: "AZ",
|
|
prefix: "994",
|
|
},
|
|
{
|
|
iso2: "BS",
|
|
prefix: "1",
|
|
},
|
|
{
|
|
iso2: "BH",
|
|
prefix: "973",
|
|
},
|
|
{
|
|
iso2: "BD",
|
|
prefix: "880",
|
|
},
|
|
{
|
|
iso2: "BB",
|
|
prefix: "1",
|
|
},
|
|
{
|
|
iso2: "BY",
|
|
prefix: "375",
|
|
},
|
|
{
|
|
iso2: "BE",
|
|
prefix: "32",
|
|
},
|
|
{
|
|
iso2: "BZ",
|
|
prefix: "501",
|
|
},
|
|
{
|
|
iso2: "BJ",
|
|
prefix: "229",
|
|
},
|
|
{
|
|
iso2: "BM",
|
|
prefix: "1",
|
|
},
|
|
{
|
|
iso2: "BT",
|
|
prefix: "975",
|
|
},
|
|
{
|
|
iso2: "BO",
|
|
prefix: "591",
|
|
},
|
|
{
|
|
iso2: "BA",
|
|
prefix: "387",
|
|
},
|
|
{
|
|
iso2: "BW",
|
|
prefix: "267",
|
|
},
|
|
{
|
|
iso2: "BV",
|
|
prefix: "47",
|
|
},
|
|
{
|
|
iso2: "BR",
|
|
prefix: "55",
|
|
},
|
|
{
|
|
iso2: "IO",
|
|
prefix: "246",
|
|
},
|
|
{
|
|
iso2: "VG",
|
|
prefix: "1",
|
|
},
|
|
{
|
|
iso2: "BN",
|
|
prefix: "673",
|
|
},
|
|
{
|
|
iso2: "BG",
|
|
prefix: "359",
|
|
},
|
|
{
|
|
iso2: "BF",
|
|
prefix: "226",
|
|
},
|
|
{
|
|
iso2: "BI",
|
|
prefix: "257",
|
|
},
|
|
{
|
|
iso2: "KH",
|
|
prefix: "855",
|
|
},
|
|
{
|
|
iso2: "CM",
|
|
prefix: "237",
|
|
},
|
|
{
|
|
iso2: "CA",
|
|
prefix: "1",
|
|
},
|
|
{
|
|
iso2: "CV",
|
|
prefix: "238",
|
|
},
|
|
{
|
|
iso2: "BQ",
|
|
prefix: "599",
|
|
},
|
|
{
|
|
iso2: "KY",
|
|
prefix: "1",
|
|
},
|
|
{
|
|
iso2: "CF",
|
|
prefix: "236",
|
|
},
|
|
{
|
|
iso2: "TD",
|
|
prefix: "235",
|
|
},
|
|
{
|
|
iso2: "CL",
|
|
prefix: "56",
|
|
},
|
|
{
|
|
iso2: "CN",
|
|
prefix: "86",
|
|
},
|
|
{
|
|
iso2: "CX",
|
|
prefix: "61",
|
|
},
|
|
{
|
|
iso2: "CC",
|
|
prefix: "61",
|
|
},
|
|
{
|
|
iso2: "CO",
|
|
prefix: "57",
|
|
},
|
|
{
|
|
iso2: "KM",
|
|
prefix: "269",
|
|
},
|
|
{
|
|
iso2: "CG",
|
|
prefix: "242",
|
|
},
|
|
{
|
|
iso2: "CD",
|
|
prefix: "243",
|
|
},
|
|
{
|
|
iso2: "CK",
|
|
prefix: "682",
|
|
},
|
|
{
|
|
iso2: "CR",
|
|
prefix: "506",
|
|
},
|
|
{
|
|
iso2: "HR",
|
|
prefix: "385",
|
|
},
|
|
{
|
|
iso2: "CU",
|
|
prefix: "53",
|
|
},
|
|
{
|
|
iso2: "CW",
|
|
prefix: "599",
|
|
},
|
|
{
|
|
iso2: "CY",
|
|
prefix: "357",
|
|
},
|
|
{
|
|
iso2: "CZ",
|
|
prefix: "420",
|
|
},
|
|
{
|
|
iso2: "CI",
|
|
prefix: "225",
|
|
},
|
|
{
|
|
iso2: "DK",
|
|
prefix: "45",
|
|
},
|
|
{
|
|
iso2: "DJ",
|
|
prefix: "253",
|
|
},
|
|
{
|
|
iso2: "DM",
|
|
prefix: "1",
|
|
},
|
|
{
|
|
iso2: "DO",
|
|
prefix: "1",
|
|
},
|
|
{
|
|
iso2: "EC",
|
|
prefix: "593",
|
|
},
|
|
{
|
|
iso2: "EG",
|
|
prefix: "20",
|
|
},
|
|
{
|
|
iso2: "SV",
|
|
prefix: "503",
|
|
},
|
|
{
|
|
iso2: "GQ",
|
|
prefix: "240",
|
|
},
|
|
{
|
|
iso2: "ER",
|
|
prefix: "291",
|
|
},
|
|
{
|
|
iso2: "EE",
|
|
prefix: "372",
|
|
},
|
|
{
|
|
iso2: "ET",
|
|
prefix: "251",
|
|
},
|
|
{
|
|
iso2: "FK",
|
|
prefix: "500",
|
|
},
|
|
{
|
|
iso2: "FO",
|
|
prefix: "298",
|
|
},
|
|
{
|
|
iso2: "FJ",
|
|
prefix: "679",
|
|
},
|
|
{
|
|
iso2: "FI",
|
|
prefix: "358",
|
|
},
|
|
{
|
|
iso2: "FR",
|
|
prefix: "33",
|
|
},
|
|
{
|
|
iso2: "GF",
|
|
prefix: "594",
|
|
},
|
|
{
|
|
iso2: "PF",
|
|
prefix: "689",
|
|
},
|
|
{
|
|
iso2: "TF",
|
|
prefix: "262",
|
|
},
|
|
{
|
|
iso2: "GA",
|
|
prefix: "241",
|
|
},
|
|
{
|
|
iso2: "GM",
|
|
prefix: "220",
|
|
},
|
|
{
|
|
iso2: "GE",
|
|
prefix: "995",
|
|
},
|
|
{
|
|
iso2: "DE",
|
|
prefix: "49",
|
|
},
|
|
{
|
|
iso2: "GH",
|
|
prefix: "233",
|
|
},
|
|
{
|
|
iso2: "GI",
|
|
prefix: "350",
|
|
},
|
|
{
|
|
iso2: "GR",
|
|
prefix: "30",
|
|
},
|
|
{
|
|
iso2: "GL",
|
|
prefix: "299",
|
|
},
|
|
{
|
|
iso2: "GD",
|
|
prefix: "1",
|
|
},
|
|
{
|
|
iso2: "GP",
|
|
prefix: "590",
|
|
},
|
|
{
|
|
iso2: "GU",
|
|
prefix: "1",
|
|
},
|
|
{
|
|
iso2: "GT",
|
|
prefix: "502",
|
|
},
|
|
{
|
|
iso2: "GG",
|
|
prefix: "44",
|
|
},
|
|
{
|
|
iso2: "GN",
|
|
prefix: "224",
|
|
},
|
|
{
|
|
iso2: "GW",
|
|
prefix: "245",
|
|
},
|
|
{
|
|
iso2: "GY",
|
|
prefix: "592",
|
|
},
|
|
{
|
|
iso2: "HT",
|
|
prefix: "509",
|
|
},
|
|
{
|
|
iso2: "HM",
|
|
prefix: "672",
|
|
},
|
|
{
|
|
iso2: "HN",
|
|
prefix: "504",
|
|
},
|
|
{
|
|
iso2: "HK",
|
|
prefix: "852",
|
|
},
|
|
{
|
|
iso2: "HU",
|
|
prefix: "36",
|
|
},
|
|
{
|
|
iso2: "IS",
|
|
prefix: "354",
|
|
},
|
|
{
|
|
iso2: "IN",
|
|
prefix: "91",
|
|
},
|
|
{
|
|
iso2: "ID",
|
|
prefix: "62",
|
|
},
|
|
{
|
|
iso2: "IR",
|
|
prefix: "98",
|
|
},
|
|
{
|
|
iso2: "IQ",
|
|
prefix: "964",
|
|
},
|
|
{
|
|
iso2: "IE",
|
|
prefix: "353",
|
|
},
|
|
{
|
|
iso2: "IM",
|
|
prefix: "44",
|
|
},
|
|
{
|
|
iso2: "IL",
|
|
prefix: "972",
|
|
},
|
|
{
|
|
iso2: "IT",
|
|
prefix: "39",
|
|
},
|
|
{
|
|
iso2: "JM",
|
|
prefix: "1",
|
|
},
|
|
{
|
|
iso2: "JP",
|
|
prefix: "81",
|
|
},
|
|
{
|
|
iso2: "JE",
|
|
prefix: "44",
|
|
},
|
|
{
|
|
iso2: "JO",
|
|
prefix: "962",
|
|
},
|
|
{
|
|
iso2: "KZ",
|
|
prefix: "7",
|
|
},
|
|
{
|
|
iso2: "KE",
|
|
prefix: "254",
|
|
},
|
|
{
|
|
iso2: "KI",
|
|
prefix: "686",
|
|
},
|
|
{
|
|
iso2: "XK",
|
|
prefix: "383",
|
|
},
|
|
{
|
|
iso2: "KW",
|
|
prefix: "965",
|
|
},
|
|
{
|
|
iso2: "KG",
|
|
prefix: "996",
|
|
},
|
|
{
|
|
iso2: "LA",
|
|
prefix: "856",
|
|
},
|
|
{
|
|
iso2: "LV",
|
|
prefix: "371",
|
|
},
|
|
{
|
|
iso2: "LB",
|
|
prefix: "961",
|
|
},
|
|
{
|
|
iso2: "LS",
|
|
prefix: "266",
|
|
},
|
|
{
|
|
iso2: "LR",
|
|
prefix: "231",
|
|
},
|
|
{
|
|
iso2: "LY",
|
|
prefix: "218",
|
|
},
|
|
{
|
|
iso2: "LI",
|
|
prefix: "423",
|
|
},
|
|
{
|
|
iso2: "LT",
|
|
prefix: "370",
|
|
},
|
|
{
|
|
iso2: "LU",
|
|
prefix: "352",
|
|
},
|
|
{
|
|
iso2: "MO",
|
|
prefix: "853",
|
|
},
|
|
{
|
|
iso2: "MK",
|
|
prefix: "389",
|
|
},
|
|
{
|
|
iso2: "MG",
|
|
prefix: "261",
|
|
},
|
|
{
|
|
iso2: "MW",
|
|
prefix: "265",
|
|
},
|
|
{
|
|
iso2: "MY",
|
|
prefix: "60",
|
|
},
|
|
{
|
|
iso2: "MV",
|
|
prefix: "960",
|
|
},
|
|
{
|
|
iso2: "ML",
|
|
prefix: "223",
|
|
},
|
|
{
|
|
iso2: "MT",
|
|
prefix: "356",
|
|
},
|
|
{
|
|
iso2: "MH",
|
|
prefix: "692",
|
|
},
|
|
{
|
|
iso2: "MQ",
|
|
prefix: "596",
|
|
},
|
|
{
|
|
iso2: "MR",
|
|
prefix: "222",
|
|
},
|
|
{
|
|
iso2: "MU",
|
|
prefix: "230",
|
|
},
|
|
{
|
|
iso2: "YT",
|
|
prefix: "262",
|
|
},
|
|
{
|
|
iso2: "MX",
|
|
prefix: "52",
|
|
},
|
|
{
|
|
iso2: "FM",
|
|
prefix: "691",
|
|
},
|
|
{
|
|
iso2: "MD",
|
|
prefix: "373",
|
|
},
|
|
{
|
|
iso2: "MC",
|
|
prefix: "377",
|
|
},
|
|
{
|
|
iso2: "MN",
|
|
prefix: "976",
|
|
},
|
|
{
|
|
iso2: "ME",
|
|
prefix: "382",
|
|
},
|
|
{
|
|
iso2: "MS",
|
|
prefix: "1",
|
|
},
|
|
{
|
|
iso2: "MA",
|
|
prefix: "212",
|
|
},
|
|
{
|
|
iso2: "MZ",
|
|
prefix: "258",
|
|
},
|
|
{
|
|
iso2: "MM",
|
|
prefix: "95",
|
|
},
|
|
{
|
|
iso2: "NA",
|
|
prefix: "264",
|
|
},
|
|
{
|
|
iso2: "NR",
|
|
prefix: "674",
|
|
},
|
|
{
|
|
iso2: "NP",
|
|
prefix: "977",
|
|
},
|
|
{
|
|
iso2: "NL",
|
|
prefix: "31",
|
|
},
|
|
{
|
|
iso2: "NC",
|
|
prefix: "687",
|
|
},
|
|
{
|
|
iso2: "NZ",
|
|
prefix: "64",
|
|
},
|
|
{
|
|
iso2: "NI",
|
|
prefix: "505",
|
|
},
|
|
{
|
|
iso2: "NE",
|
|
prefix: "227",
|
|
},
|
|
{
|
|
iso2: "NG",
|
|
prefix: "234",
|
|
},
|
|
{
|
|
iso2: "NU",
|
|
prefix: "683",
|
|
},
|
|
{
|
|
iso2: "NF",
|
|
prefix: "672",
|
|
},
|
|
{
|
|
iso2: "KP",
|
|
prefix: "850",
|
|
},
|
|
{
|
|
iso2: "MP",
|
|
prefix: "1",
|
|
},
|
|
{
|
|
iso2: "NO",
|
|
prefix: "47",
|
|
},
|
|
{
|
|
iso2: "OM",
|
|
prefix: "968",
|
|
},
|
|
{
|
|
iso2: "PK",
|
|
prefix: "92",
|
|
},
|
|
{
|
|
iso2: "PW",
|
|
prefix: "680",
|
|
},
|
|
{
|
|
iso2: "PS",
|
|
prefix: "970",
|
|
},
|
|
{
|
|
iso2: "PA",
|
|
prefix: "507",
|
|
},
|
|
{
|
|
iso2: "PG",
|
|
prefix: "675",
|
|
},
|
|
{
|
|
iso2: "PY",
|
|
prefix: "595",
|
|
},
|
|
{
|
|
iso2: "PE",
|
|
prefix: "51",
|
|
},
|
|
{
|
|
iso2: "PH",
|
|
prefix: "63",
|
|
},
|
|
{
|
|
iso2: "PN",
|
|
prefix: "870",
|
|
},
|
|
{
|
|
iso2: "PL",
|
|
prefix: "48",
|
|
},
|
|
{
|
|
iso2: "PT",
|
|
prefix: "351",
|
|
},
|
|
{
|
|
iso2: "PR",
|
|
prefix: "1",
|
|
},
|
|
{
|
|
iso2: "QA",
|
|
prefix: "974",
|
|
},
|
|
{
|
|
iso2: "RO",
|
|
prefix: "40",
|
|
},
|
|
{
|
|
iso2: "RU",
|
|
prefix: "7",
|
|
},
|
|
{
|
|
iso2: "RW",
|
|
prefix: "250",
|
|
},
|
|
{
|
|
iso2: "RE",
|
|
prefix: "262",
|
|
},
|
|
{
|
|
iso2: "WS",
|
|
prefix: "685",
|
|
},
|
|
{
|
|
iso2: "SM",
|
|
prefix: "378",
|
|
},
|
|
{
|
|
iso2: "SA",
|
|
prefix: "966",
|
|
},
|
|
{
|
|
iso2: "SN",
|
|
prefix: "221",
|
|
},
|
|
{
|
|
iso2: "RS",
|
|
prefix: "381 p",
|
|
},
|
|
{
|
|
iso2: "SC",
|
|
prefix: "248",
|
|
},
|
|
{
|
|
iso2: "SL",
|
|
prefix: "232",
|
|
},
|
|
{
|
|
iso2: "SG",
|
|
prefix: "65",
|
|
},
|
|
{
|
|
iso2: "SX",
|
|
prefix: "1",
|
|
},
|
|
{
|
|
iso2: "SK",
|
|
prefix: "421",
|
|
},
|
|
{
|
|
iso2: "SI",
|
|
prefix: "386",
|
|
},
|
|
{
|
|
iso2: "SB",
|
|
prefix: "677",
|
|
},
|
|
{
|
|
iso2: "SO",
|
|
prefix: "252",
|
|
},
|
|
{
|
|
iso2: "ZA",
|
|
prefix: "27",
|
|
},
|
|
{
|
|
iso2: "GS",
|
|
prefix: "500",
|
|
},
|
|
{
|
|
iso2: "KR",
|
|
prefix: "82",
|
|
},
|
|
{
|
|
iso2: "SS",
|
|
prefix: "211",
|
|
},
|
|
{
|
|
iso2: "ES",
|
|
prefix: "34",
|
|
},
|
|
{
|
|
iso2: "LK",
|
|
prefix: "94",
|
|
},
|
|
{
|
|
iso2: "BL",
|
|
prefix: "590",
|
|
},
|
|
{
|
|
iso2: "SH",
|
|
prefix: "290 n",
|
|
},
|
|
{
|
|
iso2: "KN",
|
|
prefix: "1",
|
|
},
|
|
{
|
|
iso2: "LC",
|
|
prefix: "1",
|
|
},
|
|
{
|
|
iso2: "MF",
|
|
prefix: "590",
|
|
},
|
|
{
|
|
iso2: "PM",
|
|
prefix: "508",
|
|
},
|
|
{
|
|
iso2: "VC",
|
|
prefix: "1",
|
|
},
|
|
{
|
|
iso2: "SD",
|
|
prefix: "249",
|
|
},
|
|
{
|
|
iso2: "SR",
|
|
prefix: "597",
|
|
},
|
|
{
|
|
iso2: "SJ",
|
|
prefix: "47",
|
|
},
|
|
{
|
|
iso2: "SZ",
|
|
prefix: "268",
|
|
},
|
|
{
|
|
iso2: "SE",
|
|
prefix: "46",
|
|
},
|
|
{
|
|
iso2: "CH",
|
|
prefix: "41",
|
|
},
|
|
{
|
|
iso2: "SY",
|
|
prefix: "963",
|
|
},
|
|
{
|
|
iso2: "ST",
|
|
prefix: "239",
|
|
},
|
|
{
|
|
iso2: "TW",
|
|
prefix: "886",
|
|
},
|
|
{
|
|
iso2: "TJ",
|
|
prefix: "992",
|
|
},
|
|
{
|
|
iso2: "TZ",
|
|
prefix: "255",
|
|
},
|
|
{
|
|
iso2: "TH",
|
|
prefix: "66",
|
|
},
|
|
{
|
|
iso2: "TL",
|
|
prefix: "670",
|
|
},
|
|
{
|
|
iso2: "TG",
|
|
prefix: "228",
|
|
},
|
|
{
|
|
iso2: "TK",
|
|
prefix: "690",
|
|
},
|
|
{
|
|
iso2: "TO",
|
|
prefix: "676",
|
|
},
|
|
{
|
|
iso2: "TT",
|
|
prefix: "1",
|
|
},
|
|
{
|
|
iso2: "TN",
|
|
prefix: "216",
|
|
},
|
|
{
|
|
iso2: "TR",
|
|
prefix: "90",
|
|
},
|
|
{
|
|
iso2: "TM",
|
|
prefix: "993",
|
|
},
|
|
{
|
|
iso2: "TC",
|
|
prefix: "1",
|
|
},
|
|
{
|
|
iso2: "TV",
|
|
prefix: "688",
|
|
},
|
|
{
|
|
iso2: "VI",
|
|
prefix: "1",
|
|
},
|
|
{
|
|
iso2: "UG",
|
|
prefix: "256",
|
|
},
|
|
{
|
|
iso2: "UA",
|
|
prefix: "380",
|
|
},
|
|
{
|
|
iso2: "AE",
|
|
prefix: "971",
|
|
},
|
|
{
|
|
iso2: "UY",
|
|
prefix: "598",
|
|
},
|
|
{
|
|
iso2: "UZ",
|
|
prefix: "998",
|
|
},
|
|
{
|
|
iso2: "VU",
|
|
prefix: "678",
|
|
},
|
|
{
|
|
iso2: "VA",
|
|
prefix: "39",
|
|
},
|
|
{
|
|
iso2: "VE",
|
|
prefix: "58",
|
|
},
|
|
{
|
|
iso2: "VN",
|
|
prefix: "84",
|
|
},
|
|
{
|
|
iso2: "WF",
|
|
prefix: "681",
|
|
},
|
|
{
|
|
iso2: "EH",
|
|
prefix: "212",
|
|
},
|
|
{
|
|
iso2: "YE",
|
|
prefix: "967",
|
|
},
|
|
{
|
|
iso2: "ZM",
|
|
prefix: "260",
|
|
},
|
|
{
|
|
iso2: "ZW",
|
|
prefix: "263",
|
|
},
|
|
];
|