@octabytes/format-phone
Version:
Convert phone number into human readable format
111 lines (110 loc) • 5.02 kB
JavaScript
;
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;