UNPKG

phonumber

Version:

Phone number parser. Good for formatting phone numbers entered by users.

1,280 lines (1,279 loc) 21.9 kB
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 };