phonumber
Version:
Phone number parser. Good for formatting phone numbers entered by users.
1,280 lines (1,279 loc) • 21.9 kB
JavaScript
const M = {
1: [
{
secondNumbers: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
countries: [
{
code: "US",
dialCode: "+1"
}
]
}
],
2: [
{
secondNumbers: [0],
countries: [
{
code: "EG",
dialCode: "+20"
}
]
},
{
secondNumbers: [1],
countries: [
{
code: "SS",
dialCode: "+211"
},
{
code: "MA",
dialCode: "+212"
},
{
code: "DZ",
dialCode: "+213"
},
{
code: "TN",
dialCode: "+216"
},
{
code: "LY",
dialCode: "+218"
}
]
},
{
secondNumbers: [2],
countries: [
{
code: "GM",
dialCode: "+220"
},
{
code: "SN",
dialCode: "+221"
},
{
code: "MR",
dialCode: "+222"
},
{
code: "ML",
dialCode: "+223"
},
{
code: "GN",
dialCode: "+224"
},
{
code: "CI",
dialCode: "+225"
},
{
code: "BF",
dialCode: "+226"
},
{
code: "NE",
dialCode: "+227"
},
{
code: "TG",
dialCode: "+228"
},
{
code: "BJ",
dialCode: "+229"
}
]
},
{
secondNumbers: [3],
countries: [
{
code: "MU",
dialCode: "+230"
},
{
code: "LR",
dialCode: "+231"
},
{
code: "SL",
dialCode: "+232"
},
{
code: "GH",
dialCode: "+233"
},
{
code: "NG",
dialCode: "+234"
},
{
code: "TD",
dialCode: "+235"
},
{
code: "CF",
dialCode: "+236"
},
{
code: "CM",
dialCode: "+237"
},
{
code: "CV",
dialCode: "+238"
},
{
code: "ST",
dialCode: "+239"
}
]
},
{
secondNumbers: [4],
countries: [
{
code: "GQ",
dialCode: "+240"
},
{
code: "GA",
dialCode: "+241"
},
{
code: "CG",
dialCode: "+242"
},
{
code: "CD",
dialCode: "+243"
},
{
code: "AO",
dialCode: "+244"
},
{
code: "GW",
dialCode: "+245"
},
{
code: "IO",
dialCode: "+246"
},
{
code: "AC",
dialCode: "+247"
},
{
code: "SC",
dialCode: "+248"
},
{
code: "SD",
dialCode: "+249"
}
]
},
{
secondNumbers: [5],
countries: [
{
code: "RW",
dialCode: "+250"
},
{
code: "ET",
dialCode: "+251"
},
{
code: "SO",
dialCode: "+252"
},
{
code: "DJ",
dialCode: "+253"
},
{
code: "KE",
dialCode: "+254"
},
{
code: "TZ",
dialCode: "+255"
},
{
code: "UG",
dialCode: "+256"
},
{
code: "BI",
dialCode: "+257"
},
{
code: "MZ",
dialCode: "+258"
}
]
},
{
secondNumbers: [6],
countries: [
{
code: "ZM",
dialCode: "+260"
},
{
code: "MG",
dialCode: "+261"
},
{
code: "RE",
dialCode: "+262"
},
{
code: "ZW",
dialCode: "+263"
},
{
code: "NA",
dialCode: "+264"
},
{
code: "MW",
dialCode: "+265"
},
{
code: "LS",
dialCode: "+266"
},
{
code: "BW",
dialCode: "+267"
},
{
code: "SZ",
dialCode: "+268"
},
{
code: "KM",
dialCode: "+269"
}
]
},
{
secondNumbers: [7],
countries: [
{
code: "ZA",
dialCode: "+27"
}
]
},
{
secondNumbers: [9],
countries: [
{
code: "SH",
dialCode: "+290"
},
{
code: "ER",
dialCode: "+291"
},
{
code: "AW",
dialCode: "+297"
},
{
code: "FO",
dialCode: "+298"
},
{
code: "GL",
dialCode: "+299"
}
]
}
],
3: [
{
secondNumbers: [0],
countries: [
{
code: "GR",
dialCode: "+30"
}
]
},
{
secondNumbers: [1],
countries: [
{
code: "NL",
dialCode: "+31"
}
]
},
{
secondNumbers: [2],
countries: [
{
code: "BE",
dialCode: "+32"
}
]
},
{
secondNumbers: [3],
countries: [
{
code: "FR",
dialCode: "+33"
}
]
},
{
secondNumbers: [4],
countries: [
{
code: "ES",
dialCode: "+34"
}
]
},
{
secondNumbers: [5],
countries: [
{
code: "GI",
dialCode: "+350"
},
{
code: "PT",
dialCode: "+351"
},
{
code: "LU",
dialCode: "+352"
},
{
code: "IE",
dialCode: "+353"
},
{
code: "IS",
dialCode: "+354"
},
{
code: "AL",
dialCode: "+355"
},
{
code: "MT",
dialCode: "+356"
},
{
code: "CY",
dialCode: "+357"
},
{
code: "FI",
dialCode: "+358"
},
{
code: "BG",
dialCode: "+359"
}
]
},
{
secondNumbers: [6],
countries: [
{
code: "HU",
dialCode: "+36"
}
]
},
{
secondNumbers: [7],
countries: [
{
code: "LT",
dialCode: "+370"
},
{
code: "LV",
dialCode: "+371"
},
{
code: "EE",
dialCode: "+372"
},
{
code: "MD",
dialCode: "+373"
},
{
code: "AM",
dialCode: "+374"
},
{
code: "BY",
dialCode: "+375"
},
{
code: "AD",
dialCode: "+376"
},
{
code: "MC",
dialCode: "+377"
},
{
code: "SM",
dialCode: "+378"
},
{
code: "VA",
dialCode: "+379"
}
]
},
{
secondNumbers: [8],
countries: [
{
code: "UA",
dialCode: "+380"
},
{
code: "RS",
dialCode: "+381"
},
{
code: "ME",
dialCode: "+382"
},
{
code: "XK",
dialCode: "+383"
},
{
code: "HR",
dialCode: "+385"
},
{
code: "SI",
dialCode: "+386"
},
{
code: "BA",
dialCode: "+387"
},
{
code: "EU",
dialCode: "+388"
},
{
code: "MK",
dialCode: "+389"
}
]
},
{
secondNumbers: [9],
countries: [
{
code: "IT",
dialCode: "+39"
}
]
}
],
4: [
{
secondNumbers: [0],
countries: [
{
code: "RO",
dialCode: "+40"
}
]
},
{
secondNumbers: [1],
countries: [
{
code: "CH",
dialCode: "+41"
}
]
},
{
secondNumbers: [2],
countries: [
{
code: "CZ",
dialCode: "+420"
},
{
code: "SK",
dialCode: "+421"
},
{
code: "LI",
dialCode: "+423"
}
]
},
{
secondNumbers: [3],
countries: [
{
code: "AT",
dialCode: "+43"
}
]
},
{
secondNumbers: [4],
countries: [
{
code: "UK",
dialCode: "+44"
}
]
},
{
secondNumbers: [5],
countries: [
{
code: "DK",
dialCode: "+45"
}
]
},
{
secondNumbers: [6],
countries: [
{
code: "SE",
dialCode: "+45"
}
]
},
{
secondNumbers: [7],
countries: [
{
code: "NO",
dialCode: "+47"
}
]
},
{
secondNumbers: [8],
countries: [
{
code: "PL",
dialCode: "+48"
}
]
},
{
secondNumbers: [9],
countries: [
{
code: "DE",
dialCode: "+49"
}
]
}
],
5: [
{
secondNumbers: [0],
countries: [
{
code: "FK",
dialCode: "+500"
},
{
code: "BZ",
dialCode: "+501"
},
{
code: "GT",
dialCode: "+502"
},
{
code: "SV",
dialCode: "+503"
},
{
code: "HN",
dialCode: "+504"
},
{
code: "NI",
dialCode: "+505"
},
{
code: "CR",
dialCode: "+506"
},
{
code: "PA",
dialCode: "+507"
},
{
code: "PM",
dialCode: "+508"
},
{
code: "HT",
dialCode: "+509"
}
]
},
{
secondNumbers: [1],
countries: [
{
code: "PE",
dialCode: "+51"
}
]
},
{
secondNumbers: [2],
countries: [
{
code: "MX",
dialCode: "+52"
}
]
},
{
secondNumbers: [3],
countries: [
{
code: "CU",
dialCode: "+53"
}
]
},
{
secondNumbers: [4],
countries: [
{
code: "AR",
dialCode: "+54"
}
]
},
{
secondNumbers: [5],
countries: [
{
code: "BR",
dialCode: "+55"
}
]
},
{
secondNumbers: [6],
countries: [
{
code: "CL",
dialCode: "+56"
}
]
},
{
secondNumbers: [7],
countries: [
{
code: "CO",
dialCode: "+57"
}
]
},
{
secondNumbers: [8],
countries: [
{
code: "VE",
dialCode: "+58"
}
]
},
{
secondNumbers: [9],
countries: [
{
code: "FK",
dialCode: "+590"
},
{
code: "BZ",
dialCode: "+591"
},
{
code: "GT",
dialCode: "+592"
},
{
code: "SV",
dialCode: "+593"
},
{
code: "HN",
dialCode: "+594"
},
{
code: "NI",
dialCode: "+595"
},
{
code: "CR",
dialCode: "+596"
},
{
code: "PA",
dialCode: "+597"
},
{
code: "PM",
dialCode: "+598"
},
{
code: "HT",
dialCode: "+599"
}
]
}
],
6: [
{
secondNumbers: [0],
countries: [
{
code: "MY",
dialCode: "+60"
}
]
},
{
secondNumbers: [1],
countries: [
{
code: "AU",
dialCode: "+61"
}
]
},
{
secondNumbers: [2],
countries: [
{
code: "ID",
dialCode: "+62"
}
]
},
{
secondNumbers: [3],
countries: [
{
code: "PH",
dialCode: "+63"
}
]
},
{
secondNumbers: [4],
countries: [
{
code: "NZ",
dialCode: "+64"
}
]
},
{
secondNumbers: [5],
countries: [
{
code: "SG",
dialCode: "+65"
}
]
},
{
secondNumbers: [6],
countries: [
{
code: "TH",
dialCode: "+66"
}
]
},
{
secondNumbers: [7],
countries: [
{
code: "TL",
dialCode: "+670"
},
{
code: "AQ",
dialCode: "+672"
},
{
code: "BN",
dialCode: "+673"
},
{
code: "NR",
dialCode: "+674"
},
{
code: "PG",
dialCode: "+675"
},
{
code: "TO",
dialCode: "+676"
},
{
code: "SB",
dialCode: "+677"
},
{
code: "VU",
dialCode: "+678"
},
{
code: "FJ",
dialCode: "+679"
}
]
},
{
secondNumbers: [8],
countries: [
{
code: "PW",
dialCode: "+680"
},
{
code: "WF",
dialCode: "+681"
},
{
code: "CK",
dialCode: "+682"
},
{
code: "NU",
dialCode: "+683"
},
{
code: "WS",
dialCode: "+685"
},
{
code: "KI",
dialCode: "+686"
},
{
code: "NC",
dialCode: "+687"
},
{
code: "TV",
dialCode: "+688"
},
{
code: "PF",
dialCode: "+689"
}
]
},
{
secondNumbers: [9],
countries: [
{
code: "TK",
dialCode: "+690"
},
{
code: "FM",
dialCode: "+691"
},
{
code: "MH",
dialCode: "+692"
}
]
}
],
7: [
{
secondNumbers: [6, 7],
countries: [
{
code: "KZ",
dialCode: "+7"
}
]
},
{
secondNumbers: [0, 1, 2, 3, 4, 5, 8, 9],
countries: [
{
code: "RU",
dialCode: "+7"
}
]
}
],
8: [
{
secondNumbers: [1],
countries: [
{
code: "JP",
dialCode: "+81"
}
]
},
{
secondNumbers: [2],
countries: [
{
code: "KR",
dialCode: "+82"
}
]
},
{
secondNumbers: [4],
countries: [
{
code: "VN",
dialCode: "+84"
}
]
},
{
secondNumbers: [5],
countries: [
{
code: "KP",
dialCode: "+850"
},
{
code: "HK",
dialCode: "+852"
},
{
code: "MO",
dialCode: "+853"
},
{
code: "KH",
dialCode: "+855"
},
{
code: "LA",
dialCode: "+856"
}
]
},
{
secondNumbers: [6],
countries: [
{
code: "CN",
dialCode: "+86"
}
]
},
{
secondNumbers: [8],
countries: [
{
code: "BD",
dialCode: "+880"
},
{
code: "TW",
dialCode: "+886"
}
]
}
],
9: [
{
secondNumbers: [0],
countries: [
{
code: "TR",
dialCode: "+90"
}
]
},
{
secondNumbers: [1],
countries: [
{
code: "IN",
dialCode: "+91"
}
]
},
{
secondNumbers: [2],
countries: [
{
code: "PK",
dialCode: "+92"
}
]
},
{
secondNumbers: [3],
countries: [
{
code: "AF",
dialCode: "+93"
}
]
},
{
secondNumbers: [4],
countries: [
{
code: "LK",
dialCode: "+94"
}
]
},
{
secondNumbers: [5],
countries: [
{
code: "MM",
dialCode: "+95"
}
]
},
{
secondNumbers: [6],
countries: [
{
code: "MV",
dialCode: "+960"
},
{
code: "LB",
dialCode: "+961"
},
{
code: "JO",
dialCode: "+962"
},
{
code: "SY",
dialCode: "+963"
},
{
code: "IQ",
dialCode: "+964"
},
{
code: "KW",
dialCode: "+965"
},
{
code: "SA",
dialCode: "+966"
},
{
code: "YE",
dialCode: "+967"
},
{
code: "OM",
dialCode: "+968"
}
]
},
{
secondNumbers: [7],
countries: [
{
code: "PS",
dialCode: "+970"
},
{
code: "AE",
dialCode: "+971"
},
{
code: "IL",
dialCode: "+972"
},
{
code: "BH",
dialCode: "+973"
},
{
code: "QA",
dialCode: "+974"
},
{
code: "BT",
dialCode: "+975"
},
{
code: "MN",
dialCode: "+976"
},
{
code: "NP",
dialCode: "+977"
}
]
},
{
secondNumbers: [8],
countries: [
{
code: "IR",
dialCode: "+98"
}
]
},
{
secondNumbers: [9],
countries: [
{
code: "TJ",
dialCode: "+992"
},
{
code: "TM",
dialCode: "+993"
},
{
code: "AZ",
dialCode: "+994"
},
{
code: "GE",
dialCode: "+995"
},
{
code: "KG",
dialCode: "+996"
},
{
code: "UZ",
dialCode: "+998"
}
]
}
]
}, R = /\(|\)|\s|-|\+/g, h = /[^\\(\\)\s-#]/g, I = /#/g, D = /\D/g, f = /\D$/g, E = {
REGEXP_ALL_HASHES: I,
REGEXP_ONLY_DIGITS: D,
REGEXP_MASK_SYMBOLS: R,
REGEXP_CLEANED_MASK: h,
REGEXP_LAST_NONE_DIGIT: f
}, { REGEXP_ONLY_DIGITS: K } = E, H = ({
value: c,
resolvers: e
}) => {
const a = +c.charAt(0);
let i = null, l = c;
const d = e.find((o) => o.firstInputChars[a]);
if (d) {
const { resolveAs: o } = d;
i = M[o.firstChar].find((t) => t.countries.find((n) => n.code === o.code)) || null;
const s = i ? i.countries.find((t) => t.code === o.code) : null, r = s ? s.dialCode.replace(K, "") : null, C = d.firstInputChars[a];
(C == null ? void 0 : C.mode) === "add" && (l = `${r || o.firstChar}${l}`), (C == null ? void 0 : C.mode) === "replace" && (l = `${r || o.firstChar}${l.substring(1)}`);
}
return {
resolvedCell: i,
resolvedPhone: l
};
}, { REGEXP_ALL_HASHES: g, REGEXP_MASK_SYMBOLS: B, REGEXP_CLEANED_MASK: O } = E, X = ({ mask: c, value: e, options: a }) => {
let i = 0, l = "";
if (!e)
return "";
if (!c)
return e;
const d = c.replace(O, "");
if (a != null && a.withTail) {
const s = d.replace(B, "").length;
l = e.slice(s, e.length);
}
return `${d.replace(g, () => {
const s = e[i];
return i += 1, s || "_";
}).split("_")[0].trim()}${l}`;
}, { REGEXP_ONLY_DIGITS: $, REGEXP_LAST_NONE_DIGIT: U } = E, Y = (c, e) => {
const a = e == null ? void 0 : e.resolvers, i = e == null ? void 0 : e.formats, l = c.charAt(0), d = c.trim().replace($, ""), o = d.length > 1 ? d.charAt(1) : "";
let u = d.length > 0 ? d.charAt(0) : "", s = null, r = d;
if (a && u && l !== "+") {
const { resolvedCell: t, resolvedPhone: n } = H({
value: d,
resolvers: a
});
s = t, r = n, u = r.charAt(0);
}
const C = {
code: null,
dialCode: null,
nationalNumber: null,
formattedNumber: c ? `+${r}` : ""
};
if (u && u !== "0") {
const t = o === "" ? -1 : Number(o), n = s || M[u].find(
(b) => b.secondNumbers.includes(t)
);
if (n) {
const b = n ? n.countries[0].dialCode.length - 1 : 0, L = r.slice(0, b), m = n.countries.filter(
(_) => _.dialCode.includes(L)
);
if (m.length > 1 || !m.length)
return C;
const P = m[0].dialCode.substring(1), { dialCode: S, code: A } = m[0], G = r.substring(P.length), N = i ? i[A] : null, T = `${S} ${X({
value: G,
mask: N == null ? void 0 : N.mask,
options: {
withTail: !!(N != null && N.withTail)
}
})}`.trim().replace(U, "");
return {
code: A,
dialCode: S,
nationalNumber: G,
formattedNumber: c ? T : ""
};
}
}
return C;
};
export {
Y as parsePhoneNumber
};