123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673 |
- "use strict";
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
- exports["default"] = void 0;
- exports.getCountryCallingCode = getCountryCallingCode;
- exports.getExtPrefix = getExtPrefix;
- exports.isSupportedCountry = isSupportedCountry;
- exports.validateMetadata = validateMetadata;
- var _semverCompare = _interopRequireDefault(require("./tools/semver-compare.js"));
- var _isObject = _interopRequireDefault(require("./helpers/isObject.js"));
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
- function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
- function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a 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); } }
- function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
- // 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'; // Moved `001` country code to "nonGeographic" section of metadata.
- var V4 = '1.7.35';
- var DEFAULT_EXT_PREFIX = ' ext. ';
- var CALLING_CODE_REG_EXP = /^\d+$/;
- /**
- * See: https://gitlab.com/catamphetamine/libphonenumber-js/blob/master/METADATA.md
- */
- var Metadata = /*#__PURE__*/function () {
- function Metadata(metadata) {
- _classCallCheck(this, Metadata);
- validateMetadata(metadata);
- this.metadata = metadata;
- setVersion.call(this, metadata);
- }
- _createClass(Metadata, [{
- key: "getCountries",
- value: function getCountries() {
- return Object.keys(this.metadata.countries).filter(function (_) {
- return _ !== '001';
- });
- }
- }, {
- key: "getCountryMetadata",
- value: function getCountryMetadata(countryCode) {
- return this.metadata.countries[countryCode];
- }
- }, {
- key: "nonGeographic",
- value: function nonGeographic() {
- if (this.v1 || this.v2 || this.v3) return; // `nonGeographical` was a typo.
- // It's present in metadata generated from `1.7.35` to `1.7.37`.
- // The test case could be found by searching for "nonGeographical".
- return this.metadata.nonGeographic || this.metadata.nonGeographical;
- }
- }, {
- key: "hasCountry",
- value: function hasCountry(country) {
- return this.getCountryMetadata(country) !== undefined;
- }
- }, {
- key: "hasCallingCode",
- value: function hasCallingCode(callingCode) {
- if (this.getCountryCodesForCallingCode(callingCode)) {
- return true;
- }
- if (this.nonGeographic()) {
- if (this.nonGeographic()[callingCode]) {
- return true;
- }
- } else {
- // A hacky workaround for old custom metadata (generated before V4).
- var countryCodes = this.countryCallingCodes()[callingCode];
- if (countryCodes && countryCodes.length === 1 && countryCodes[0] === '001') {
- return true;
- }
- }
- }
- }, {
- key: "isNonGeographicCallingCode",
- value: function isNonGeographicCallingCode(callingCode) {
- if (this.nonGeographic()) {
- return this.nonGeographic()[callingCode] ? true : false;
- } else {
- return this.getCountryCodesForCallingCode(callingCode) ? false : true;
- }
- } // Deprecated.
- }, {
- key: "country",
- value: function country(countryCode) {
- return this.selectNumberingPlan(countryCode);
- }
- }, {
- key: "selectNumberingPlan",
- value: function selectNumberingPlan(countryCode, callingCode) {
- // Supports just passing `callingCode` as the first argument.
- if (countryCode && CALLING_CODE_REG_EXP.test(countryCode)) {
- callingCode = countryCode;
- countryCode = null;
- }
- if (countryCode && countryCode !== '001') {
- if (!this.hasCountry(countryCode)) {
- throw new Error("Unknown country: ".concat(countryCode));
- }
- this.numberingPlan = new NumberingPlan(this.getCountryMetadata(countryCode), this);
- } else if (callingCode) {
- if (!this.hasCallingCode(callingCode)) {
- throw new Error("Unknown calling code: ".concat(callingCode));
- }
- this.numberingPlan = new NumberingPlan(this.getNumberingPlanMetadata(callingCode), this);
- } else {
- this.numberingPlan = undefined;
- }
- return this;
- }
- }, {
- key: "getCountryCodesForCallingCode",
- value: function getCountryCodesForCallingCode(callingCode) {
- var countryCodes = this.countryCallingCodes()[callingCode];
- if (countryCodes) {
- // Metadata before V4 included "non-geographic entity" calling codes
- // inside `country_calling_codes` (for example, `"881":["001"]`).
- // Now the semantics of `country_calling_codes` has changed:
- // it's specifically for "countries" now.
- // Older versions of custom metadata will simply skip parsing
- // "non-geographic entity" phone numbers with new versions
- // of this library: it's not considered a bug,
- // because such numbers are extremely rare,
- // and developers extremely rarely use custom metadata.
- if (countryCodes.length === 1 && countryCodes[0].length === 3) {
- return;
- }
- return countryCodes;
- }
- }
- }, {
- key: "getCountryCodeForCallingCode",
- value: function getCountryCodeForCallingCode(callingCode) {
- var countryCodes = this.getCountryCodesForCallingCode(callingCode);
- if (countryCodes) {
- return countryCodes[0];
- }
- }
- }, {
- key: "getNumberingPlanMetadata",
- value: function getNumberingPlanMetadata(callingCode) {
- var countryCode = this.getCountryCodeForCallingCode(callingCode);
- if (countryCode) {
- return this.getCountryMetadata(countryCode);
- }
- if (this.nonGeographic()) {
- var metadata = this.nonGeographic()[callingCode];
- if (metadata) {
- return metadata;
- }
- } else {
- // A hacky workaround for old custom metadata (generated before V4).
- // In that metadata, there was no concept of "non-geographic" metadata
- // so metadata for `001` country code was stored along with other countries.
- // The test case can be found by searching for:
- // "should work around `nonGeographic` metadata not existing".
- var countryCodes = this.countryCallingCodes()[callingCode];
- if (countryCodes && countryCodes.length === 1 && countryCodes[0] === '001') {
- return this.metadata.countries['001'];
- }
- }
- } // Deprecated.
- }, {
- key: "countryCallingCode",
- value: function countryCallingCode() {
- return this.numberingPlan.callingCode();
- } // Deprecated.
- }, {
- key: "IDDPrefix",
- value: function IDDPrefix() {
- return this.numberingPlan.IDDPrefix();
- } // Deprecated.
- }, {
- key: "defaultIDDPrefix",
- value: function defaultIDDPrefix() {
- return this.numberingPlan.defaultIDDPrefix();
- } // Deprecated.
- }, {
- key: "nationalNumberPattern",
- value: function nationalNumberPattern() {
- return this.numberingPlan.nationalNumberPattern();
- } // Deprecated.
- }, {
- key: "possibleLengths",
- value: function possibleLengths() {
- return this.numberingPlan.possibleLengths();
- } // Deprecated.
- }, {
- key: "formats",
- value: function formats() {
- return this.numberingPlan.formats();
- } // Deprecated.
- }, {
- key: "nationalPrefixForParsing",
- value: function nationalPrefixForParsing() {
- return this.numberingPlan.nationalPrefixForParsing();
- } // Deprecated.
- }, {
- key: "nationalPrefixTransformRule",
- value: function nationalPrefixTransformRule() {
- return this.numberingPlan.nationalPrefixTransformRule();
- } // Deprecated.
- }, {
- key: "leadingDigits",
- value: function leadingDigits() {
- return this.numberingPlan.leadingDigits();
- } // Deprecated.
- }, {
- key: "hasTypes",
- value: function hasTypes() {
- return this.numberingPlan.hasTypes();
- } // Deprecated.
- }, {
- key: "type",
- value: function type(_type) {
- return this.numberingPlan.type(_type);
- } // Deprecated.
- }, {
- key: "ext",
- value: function ext() {
- return this.numberingPlan.ext();
- }
- }, {
- key: "countryCallingCodes",
- value: function countryCallingCodes() {
- if (this.v1) return this.metadata.country_phone_code_to_countries;
- return this.metadata.country_calling_codes;
- } // Deprecated.
- }, {
- key: "chooseCountryByCountryCallingCode",
- value: function chooseCountryByCountryCallingCode(callingCode) {
- return this.selectNumberingPlan(callingCode);
- }
- }, {
- key: "hasSelectedNumberingPlan",
- value: function hasSelectedNumberingPlan() {
- return this.numberingPlan !== undefined;
- }
- }]);
- return Metadata;
- }();
- exports["default"] = Metadata;
- var NumberingPlan = /*#__PURE__*/function () {
- function NumberingPlan(metadata, globalMetadataObject) {
- _classCallCheck(this, NumberingPlan);
- this.globalMetadataObject = globalMetadataObject;
- this.metadata = metadata;
- setVersion.call(this, globalMetadataObject.metadata);
- }
- _createClass(NumberingPlan, [{
- key: "callingCode",
- value: function callingCode() {
- return this.metadata[0];
- } // 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`.
- }, {
- key: "getDefaultCountryMetadataForRegion",
- value: function getDefaultCountryMetadataForRegion() {
- return this.globalMetadataObject.getNumberingPlanMetadata(this.callingCode());
- } // Is always present.
- }, {
- key: "IDDPrefix",
- value: function IDDPrefix() {
- if (this.v1 || this.v2) return;
- return this.metadata[1];
- } // Is only present when a country supports multiple IDD prefixes.
- }, {
- key: "defaultIDDPrefix",
- value: function defaultIDDPrefix() {
- if (this.v1 || this.v2) return;
- return this.metadata[12];
- }
- }, {
- key: "nationalNumberPattern",
- value: function nationalNumberPattern() {
- if (this.v1 || this.v2) return this.metadata[1];
- return this.metadata[2];
- } // "possible length" data is always present in Google's metadata.
- }, {
- key: "possibleLengths",
- value: function possibleLengths() {
- if (this.v1) return;
- return this.metadata[this.v2 ? 2 : 3];
- }
- }, {
- key: "_getFormats",
- value: function _getFormats(metadata) {
- return metadata[this.v1 ? 2 : this.v2 ? 3 : 4];
- } // For countries of the same region (e.g. NANPA)
- // formats are all stored in the "main" country for that region.
- // E.g. "RU" and "KZ", "US" and "CA".
- }, {
- key: "formats",
- value: function formats() {
- var _this = this;
- var formats = this._getFormats(this.metadata) || this._getFormats(this.getDefaultCountryMetadataForRegion()) || [];
- return formats.map(function (_) {
- return new Format(_, _this);
- });
- }
- }, {
- key: "nationalPrefix",
- value: function nationalPrefix() {
- return this.metadata[this.v1 ? 3 : this.v2 ? 4 : 5];
- }
- }, {
- key: "_getNationalPrefixFormattingRule",
- value: function _getNationalPrefixFormattingRule(metadata) {
- return metadata[this.v1 ? 4 : this.v2 ? 5 : 6];
- } // For countries of the same region (e.g. NANPA)
- // national prefix formatting rule is stored in the "main" country for that region.
- // E.g. "RU" and "KZ", "US" and "CA".
- }, {
- key: "nationalPrefixFormattingRule",
- value: function nationalPrefixFormattingRule() {
- return this._getNationalPrefixFormattingRule(this.metadata) || this._getNationalPrefixFormattingRule(this.getDefaultCountryMetadataForRegion());
- }
- }, {
- key: "_nationalPrefixForParsing",
- value: function _nationalPrefixForParsing() {
- return this.metadata[this.v1 ? 5 : this.v2 ? 6 : 7];
- }
- }, {
- key: "nationalPrefixForParsing",
- value: function nationalPrefixForParsing() {
- // If `national_prefix_for_parsing` is not set explicitly,
- // then infer it from `national_prefix` (if any)
- return this._nationalPrefixForParsing() || this.nationalPrefix();
- }
- }, {
- key: "nationalPrefixTransformRule",
- value: function nationalPrefixTransformRule() {
- return this.metadata[this.v1 ? 6 : this.v2 ? 7 : 8];
- }
- }, {
- key: "_getNationalPrefixIsOptionalWhenFormatting",
- value: function _getNationalPrefixIsOptionalWhenFormatting() {
- return !!this.metadata[this.v1 ? 7 : this.v2 ? 8 : 9];
- } // For countries of the same region (e.g. NANPA)
- // "national prefix is optional when formatting" flag is
- // stored in the "main" country for that region.
- // E.g. "RU" and "KZ", "US" and "CA".
- }, {
- key: "nationalPrefixIsOptionalWhenFormattingInNationalFormat",
- value: function nationalPrefixIsOptionalWhenFormattingInNationalFormat() {
- return this._getNationalPrefixIsOptionalWhenFormatting(this.metadata) || this._getNationalPrefixIsOptionalWhenFormatting(this.getDefaultCountryMetadataForRegion());
- }
- }, {
- key: "leadingDigits",
- value: function leadingDigits() {
- return this.metadata[this.v1 ? 8 : this.v2 ? 9 : 10];
- }
- }, {
- key: "types",
- value: function types() {
- return this.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(_type2) {
- if (this.hasTypes() && getType(this.types(), _type2)) {
- return new Type(getType(this.types(), _type2), this);
- }
- }
- }, {
- key: "ext",
- value: function ext() {
- if (this.v1 || this.v2) return DEFAULT_EXT_PREFIX;
- return this.metadata[13] || DEFAULT_EXT_PREFIX;
- }
- }]);
- return NumberingPlan;
- }();
- var Format = /*#__PURE__*/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: "nationalPrefixIsOptionalWhenFormattingInNationalFormat",
- value: function nationalPrefixIsOptionalWhenFormattingInNationalFormat() {
- return !!this._format[4] || this.metadata.nationalPrefixIsOptionalWhenFormattingInNationalFormat();
- }
- }, {
- key: "nationalPrefixIsMandatoryWhenFormattingInNationalFormat",
- value: function nationalPrefixIsMandatoryWhenFormattingInNationalFormat() {
- // 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.usesNationalPrefix() && !this.nationalPrefixIsOptionalWhenFormattingInNationalFormat();
- } // Checks whether national prefix formatting rule contains national prefix.
- }, {
- key: "usesNationalPrefix",
- value: function usesNationalPrefix() {
- return this.nationalPrefixFormattingRule() && // Check that national prefix formatting rule is not a "dummy" one.
- !FIRST_GROUP_ONLY_PREFIX_PATTERN.test(this.nationalPrefixFormattingRule()) // In compressed metadata, `this.nationalPrefixFormattingRule()` is `0`
- // when `national_prefix_formatting_rule` is not present.
- // So, `true` or `false` are returned explicitly here, so that
- // `0` number isn't returned.
- ? true : false;
- }
- }, {
- key: "internationalFormat",
- value: function internationalFormat() {
- return this._format[5] || this.format();
- }
- }]);
- return Format;
- }();
- /**
- * A pattern that is used to determine if the national prefix formatting rule
- * has the first group only, i.e., does not start with the national prefix.
- * Note that the pattern explicitly allows for unbalanced parentheses.
- */
- var FIRST_GROUP_ONLY_PREFIX_PATTERN = /^\(?\$1\)?$/;
- var Type = /*#__PURE__*/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];
- }
- }
- 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 (!(0, _isObject["default"])(metadata) || !(0, _isObject["default"])(metadata.countries)) {
- throw new Error("[libphonenumber-js] `metadata` argument was passed but it's not a valid metadata. Must be an object having `.countries` child object property. Got ".concat((0, _isObject["default"])(metadata) ? 'an object of shape: { ' + Object.keys(metadata).join(', ') + ' }' : 'a ' + typeOf(metadata) + ': ' + metadata, "."));
- }
- } // Babel transforms `typeof` into some "branches"
- // so istanbul will show this as "branch not covered".
- /* istanbul ignore next */
- var typeOf = function typeOf(_) {
- return _typeof(_);
- };
- /**
- * Returns extension prefix for a country.
- * @param {string} country
- * @param {object} metadata
- * @return {string?}
- * @example
- * // Returns " ext. "
- * getExtPrefix("US")
- */
- function getExtPrefix(country, metadata) {
- metadata = new Metadata(metadata);
- if (metadata.hasCountry(country)) {
- return metadata.country(country).ext();
- }
- return DEFAULT_EXT_PREFIX;
- }
- /**
- * Returns "country calling code" for a country.
- * Throws an error if the country doesn't exist or isn't supported by this library.
- * @param {string} country
- * @param {object} metadata
- * @return {string}
- * @example
- * // Returns "44"
- * getCountryCallingCode("GB")
- */
- function getCountryCallingCode(country, metadata) {
- metadata = new Metadata(metadata);
- if (metadata.hasCountry(country)) {
- return metadata.country(country).countryCallingCode();
- }
- throw new Error("Unknown country: ".concat(country));
- }
- function isSupportedCountry(country, metadata) {
- // metadata = new Metadata(metadata)
- // return metadata.hasCountry(country)
- return metadata.countries.hasOwnProperty(country);
- }
- function setVersion(metadata) {
- var version = metadata.version;
- if (typeof version === 'number') {
- this.v1 = version === 1;
- this.v2 = version === 2;
- this.v3 = version === 3;
- this.v4 = version === 4;
- } else {
- if (!version) {
- this.v1 = true;
- } else if ((0, _semverCompare["default"])(version, V3) === -1) {
- this.v2 = true;
- } else if ((0, _semverCompare["default"])(version, V4) === -1) {
- this.v3 = true;
- } else {
- this.v4 = true;
- }
- }
- } // const ISO_COUNTRY_CODE = /^[A-Z]{2}$/
- // function isCountryCode(countryCode) {
- // return ISO_COUNTRY_CODE.test(countryCodeOrCountryCallingCode)
- // }
- //# sourceMappingURL=metadata.js.map
|