libphonenumber-js
Version:
A simpler (and smaller) rewrite of Google Android's popular libphonenumber library
344 lines (309 loc) • 10.7 kB
JavaScript
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
import compare from 'semver-compare';
// Added "possibleLengths" and renamed
// "country_phone_code_to_countries" to "country_calling_codes".
var V2 = '1.0.18';
// Added "idd_prefix" and "default_idd_prefix".
var V3 = '1.2.0';
var DEFAULT_EXT_PREFIX = ' ext. ';
var Metadata = function () {
function Metadata(metadata) {
_classCallCheck(this, Metadata);
validateMetadata(metadata);
this.metadata = metadata;
this.v1 = !metadata.version;
this.v2 = metadata.version !== undefined && compare(metadata.version, V3) === -1;
this.v3 = metadata.version !== undefined; // && compare(metadata.version, V4) === -1
}
_createClass(Metadata, [{
key: 'hasCountry',
value: function hasCountry(country) {
return this.metadata.countries[country] !== undefined;
}
}, {
key: 'country',
value: function country(_country) {
if (!_country) {
this._country = undefined;
this.country_metadata = undefined;
return this;
}
if (!this.hasCountry(_country)) {
throw new Error('Unknown country: ' + _country);
}
this._country = _country;
this.country_metadata = this.metadata.countries[_country];
return this;
}
}, {
key: 'countryCallingCode',
value: function countryCallingCode() {
return this.country_metadata[0];
}
}, {
key: 'IDDPrefix',
value: function IDDPrefix() {
if (this.v1 || this.v2) return;
return this.country_metadata[1];
}
}, {
key: 'defaultIDDPrefix',
value: function defaultIDDPrefix() {
if (this.v1 || this.v2) return;
return this.country_metadata[12];
}
}, {
key: 'nationalNumberPattern',
value: function nationalNumberPattern() {
if (this.v1 || this.v2) return this.country_metadata[1];
return this.country_metadata[2];
}
}, {
key: 'possibleLengths',
value: function possibleLengths() {
if (this.v1) return;
return this.country_metadata[this.v2 ? 2 : 3];
}
}, {
key: 'formats',
value: function formats() {
var _this = this;
var formats = this.country_metadata[this.v1 ? 2 : this.v2 ? 3 : 4] || [];
return formats.map(function (_) {
return new Format(_, _this);
});
}
}, {
key: 'nationalPrefix',
value: function nationalPrefix() {
return this.country_metadata[this.v1 ? 3 : this.v2 ? 4 : 5];
}
}, {
key: 'nationalPrefixFormattingRule',
value: function nationalPrefixFormattingRule() {
return this.country_metadata[this.v1 ? 4 : this.v2 ? 5 : 6];
}
}, {
key: 'nationalPrefixForParsing',
value: function nationalPrefixForParsing() {
// If `national_prefix_for_parsing` is not set explicitly,
// then infer it from `national_prefix` (if any)
return this.country_metadata[this.v1 ? 5 : this.v2 ? 6 : 7] || this.nationalPrefix();
}
}, {
key: 'nationalPrefixTransformRule',
value: function nationalPrefixTransformRule() {
return this.country_metadata[this.v1 ? 6 : this.v2 ? 7 : 8];
}
}, {
key: 'nationalPrefixIsOptionalWhenFormatting',
value: function nationalPrefixIsOptionalWhenFormatting() {
return !!this.country_metadata[this.v1 ? 7 : this.v2 ? 8 : 9];
}
}, {
key: 'leadingDigits',
value: function leadingDigits() {
return this.country_metadata[this.v1 ? 8 : this.v2 ? 9 : 10];
}
}, {
key: 'types',
value: function types() {
return this.country_metadata[this.v1 ? 9 : this.v2 ? 10 : 11];
}
}, {
key: 'hasTypes',
value: function hasTypes() {
// Versions 1.2.0 - 1.2.4: can be `[]`.
/* istanbul ignore next */
if (this.types() && this.types().length === 0) {
return false;
}
// Versions <= 1.2.4: can be `undefined`.
// Version >= 1.2.5: can be `0`.
return !!this.types();
}
}, {
key: 'type',
value: function type(_type) {
if (this.hasTypes() && getType(this.types(), _type)) {
return new Type(getType(this.types(), _type), this);
}
}
}, {
key: 'ext',
value: function ext() {
if (this.v1 || this.v2) return DEFAULT_EXT_PREFIX;
return this.country_metadata[13] || DEFAULT_EXT_PREFIX;
}
}, {
key: 'countryCallingCodes',
value: function countryCallingCodes() {
if (this.v1) return this.metadata.country_phone_code_to_countries;
return this.metadata.country_calling_codes;
}
// Formatting information for regions which share
// a country calling code is contained by only one region
// for performance reasons. For example, for NANPA region
// ("North American Numbering Plan Administration",
// which includes USA, Canada, Cayman Islands, Bahamas, etc)
// it will be contained in the metadata for `US`.
//
// `country_calling_code` is always valid.
// But the actual country may not necessarily be part of the metadata.
//
}, {
key: 'chooseCountryByCountryCallingCode',
value: function chooseCountryByCountryCallingCode(country_calling_code) {
var country = this.countryCallingCodes()[country_calling_code][0];
// Do not want to test this case.
// (custom metadata, not all countries).
/* istanbul ignore else */
if (this.hasCountry(country)) {
this.country(country);
}
}
}, {
key: 'selectedCountry',
value: function selectedCountry() {
return this._country;
}
}]);
return Metadata;
}();
export default Metadata;
var Format = function () {
function Format(format, metadata) {
_classCallCheck(this, Format);
this._format = format;
this.metadata = metadata;
}
_createClass(Format, [{
key: 'pattern',
value: function pattern() {
return this._format[0];
}
}, {
key: 'format',
value: function format() {
return this._format[1];
}
}, {
key: 'leadingDigitsPatterns',
value: function leadingDigitsPatterns() {
return this._format[2] || [];
}
}, {
key: 'nationalPrefixFormattingRule',
value: function nationalPrefixFormattingRule() {
return this._format[3] || this.metadata.nationalPrefixFormattingRule();
}
}, {
key: 'nationalPrefixIsOptionalWhenFormatting',
value: function nationalPrefixIsOptionalWhenFormatting() {
return !!this._format[4] || this.metadata.nationalPrefixIsOptionalWhenFormatting();
}
}, {
key: 'nationalPrefixIsMandatoryWhenFormatting',
value: function nationalPrefixIsMandatoryWhenFormatting() {
// National prefix is omitted if there's no national prefix formatting rule
// set for this country, or when the national prefix formatting rule
// contains no national prefix itself, or when this rule is set but
// national prefix is optional for this phone number format
// (and it is not enforced explicitly)
return this.nationalPrefixFormattingRule() &&
// Check that national prefix formatting rule is not a dummy one.
// Check that national prefix formatting rule actually has national prefix digit(s).
this.usesNationalPrefix() &&
// Or maybe national prefix is optional for this format
!this.nationalPrefixIsOptionalWhenFormatting();
}
// Checks whether national prefix formatting rule contains national prefix
}, {
key: 'usesNationalPrefix',
value: function usesNationalPrefix() {
// Check that national prefix formatting rule is not a dummy one
return this.nationalPrefixFormattingRule() !== '$1' &&
// Check that national prefix formatting rule actually has national prefix digit(s)
/\d/.test(this.nationalPrefixFormattingRule().replace('$1', ''));
}
}, {
key: 'internationalFormat',
value: function internationalFormat() {
return this._format[5] || this.format();
}
}]);
return Format;
}();
var Type = function () {
function Type(type, metadata) {
_classCallCheck(this, Type);
this.type = type;
this.metadata = metadata;
}
_createClass(Type, [{
key: 'pattern',
value: function pattern() {
if (this.metadata.v1) return this.type;
return this.type[0];
}
}, {
key: 'possibleLengths',
value: function possibleLengths() {
if (this.metadata.v1) return;
return this.type[1] || this.metadata.possibleLengths();
}
}]);
return Type;
}();
function getType(types, type) {
switch (type) {
case 'FIXED_LINE':
return types[0];
case 'MOBILE':
return types[1];
case 'TOLL_FREE':
return types[2];
case 'PREMIUM_RATE':
return types[3];
case 'PERSONAL_NUMBER':
return types[4];
case 'VOICEMAIL':
return types[5];
case 'UAN':
return types[6];
case 'PAGER':
return types[7];
case 'VOIP':
return types[8];
case 'SHARED_COST':
return types[9];
}
}
export function validateMetadata(metadata) {
if (!metadata) {
throw new Error('[libphonenumber-js] `metadata` argument not passed. Check your arguments.');
}
// `country_phone_code_to_countries` was renamed to
// `country_calling_codes` in `1.0.18`.
if (!is_object(metadata) || !is_object(metadata.countries) || !is_object(metadata.country_calling_codes) && !is_object(metadata.country_phone_code_to_countries)) {
throw new Error('[libphonenumber-js] `metadata` argument was passed but it\'s not a valid metadata. Must be an object having `.countries` and `.country_calling_codes` child object properties. Got ' + (is_object(metadata) ? 'an object of shape: { ' + Object.keys(metadata).join(', ') + ' }' : 'a ' + type_of(metadata) + ': ' + metadata) + '.');
}
}
// Babel transforms `typeof` into some "branches"
// so istanbul will show this as "branch not covered".
/* istanbul ignore next */
var is_object = function is_object(_) {
return (typeof _ === 'undefined' ? 'undefined' : _typeof(_)) === 'object';
};
// Babel transforms `typeof` into some "branches"
// so istanbul will show this as "branch not covered".
/* istanbul ignore next */
var type_of = function type_of(_) {
return typeof _ === 'undefined' ? 'undefined' : _typeof(_);
};
export function getExtPrefix(country, metadata) {
return new Metadata(metadata).country(country).ext();
}
//# sourceMappingURL=metadata.js.map