UNPKG

@octabytes/format-phone

Version:

Convert phone number into human readable format

111 lines (110 loc) 5.02 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const lodash_find_1 = __importDefault(require("lodash.find")); const lodash_reduce_1 = __importDefault(require("lodash.reduce")); const lodash_head_1 = __importDefault(require("lodash.head")); const lodash_tail_1 = __importDefault(require("lodash.tail")); const lodash_memoize_1 = __importDefault(require("lodash.memoize")); const lodash_trim_1 = __importDefault(require("lodash.trim")); const lodash_startswith_1 = __importDefault(require("lodash.startswith")); const country_data_1 = __importDefault(require("./country_data")); class PhoneNumberFormatter { constructor(inputNumber) { this.inputNumber = inputNumber; this.formatNumber = (text, pattern) => { const disableCountryCode = false; const enableLongNumbers = false; const autoFormat = true; if (!text || text.length === 0) { return disableCountryCode ? "" : "+"; } // for all strings with length less than 3, just return it (1, 2 etc.) // also return the same text if the selected country has no fixed format if ((text && text.length < 2) || !pattern || !autoFormat) { return disableCountryCode ? text : `+${text}`; } const formattedObject = (0, lodash_reduce_1.default)(pattern, (acc, character) => { if (acc.remainingText.length === 0) { return acc; } if (character !== ".") { return { formattedText: acc.formattedText + character, remainingText: acc.remainingText, }; } return { formattedText: acc.formattedText + (0, lodash_head_1.default)(acc.remainingText), remainingText: (0, lodash_tail_1.default)(acc.remainingText), }; }, { formattedText: "", remainingText: text.split(""), }); let formattedNumber; if (enableLongNumbers) { formattedNumber = formattedObject.formattedText + formattedObject.remainingText.join(""); } else { formattedNumber = formattedObject.formattedText; } // Always close brackets if (formattedNumber.includes("(") && !formattedNumber.includes(")")) formattedNumber += ")"; return formattedNumber; }; this.guessSelectedCountry = (0, lodash_memoize_1.default)((inputNumber, onlyCountries, defaultCountry) => { const secondBestGuess = (0, lodash_find_1.default)(onlyCountries, { iso2: defaultCountry }) || {}; if ((0, lodash_trim_1.default)(inputNumber) === "") return secondBestGuess; const bestGuess = (0, lodash_reduce_1.default)(onlyCountries, (selectedCountry, country) => { if ((0, lodash_startswith_1.default)(inputNumber, country.dialCode)) { if (country.dialCode.length > selectedCountry.dialCode.length) { return country; } if (country.dialCode.length === selectedCountry.dialCode.length && country.priority < selectedCountry.priority) { return country; } } return selectedCountry; }, { dialCode: "", priority: 10001 }); // @ts-ignore if (!bestGuess.name) return secondBestGuess; return bestGuess; }); } formatPhone() { let onlyCountries = country_data_1.default.allCountries; const inputNumber = this.inputNumber; let countryGuess; if (inputNumber.length > 1) { // Country detect by value field countryGuess = this.guessSelectedCountry(inputNumber.replace(/\D/g, "").substring(0, 6), onlyCountries, "") || 0; } else { // Empty params countryGuess = 0; } const dialCode = inputNumber.length < 2 && countryGuess && !(0, lodash_startswith_1.default)(inputNumber.replace(/\D/g, ""), countryGuess.dialCode) ? countryGuess.dialCode : ""; const formattedNumber = inputNumber === "" && countryGuess === 0 ? "" : this.formatNumber(dialCode + inputNumber.replace(/\D/g, ""), countryGuess.name ? countryGuess.format : undefined); return formattedNumber; } } function formatPhone(phone) { const formatter = new PhoneNumberFormatter(phone); return formatter.formatPhone(); } exports.default = formatPhone;