|  |  | import stripIddPrefix from './stripIddPrefix.js';
 | 
						
						
						
							|  |  | import extractCountryCallingCodeFromInternationalNumberWithoutPlusSign from './extractCountryCallingCodeFromInternationalNumberWithoutPlusSign.js';
 | 
						
						
						
							|  |  | import Metadata from '../metadata.js';
 | 
						
						
						
							|  |  | import { MAX_LENGTH_COUNTRY_CODE } from '../constants.js';
 | 
						
						
						
							|  |  | /**
 | 
						
						
						
							|  |  |  * Converts a phone number digits (possibly with a `+`)
 | 
						
						
						
							|  |  |  * into a calling code and the rest phone number digits.
 | 
						
						
						
							|  |  |  * The "rest phone number digits" could include
 | 
						
						
						
							|  |  |  * a national prefix, carrier code, and national
 | 
						
						
						
							|  |  |  * (significant) number.
 | 
						
						
						
							|  |  |  * @param  {string} number — Phone number digits (possibly with a `+`).
 | 
						
						
						
							|  |  |  * @param  {string} [country] — Default country.
 | 
						
						
						
							|  |  |  * @param  {string} [callingCode] — Default calling code (some phone numbering plans are non-geographic).
 | 
						
						
						
							|  |  |  * @param  {object} metadata
 | 
						
						
						
							|  |  |  * @return {object} `{ countryCallingCode: string?, number: string }`
 | 
						
						
						
							|  |  |  * @example
 | 
						
						
						
							|  |  |  * // Returns `{ countryCallingCode: "1", number: "2133734253" }`.
 | 
						
						
						
							|  |  |  * extractCountryCallingCode('2133734253', 'US', null, metadata)
 | 
						
						
						
							|  |  |  * extractCountryCallingCode('2133734253', null, '1', metadata)
 | 
						
						
						
							|  |  |  * extractCountryCallingCode('+12133734253', null, null, metadata)
 | 
						
						
						
							|  |  |  * extractCountryCallingCode('+12133734253', 'RU', null, metadata)
 | 
						
						
						
							|  |  |  */
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | export default function extractCountryCallingCode(number, country, callingCode, metadata) {
 | 
						
						
						
							|  |  |   if (!number) {
 | 
						
						
						
							|  |  |     return {};
 | 
						
						
						
							|  |  |   } // If this is not an international phone number,
 | 
						
						
						
							|  |  |   // then either extract an "IDD" prefix, or extract a
 | 
						
						
						
							|  |  |   // country calling code from a number by autocorrecting it
 | 
						
						
						
							|  |  |   // by prepending a leading `+` in cases when it starts
 | 
						
						
						
							|  |  |   // with the country calling code.
 | 
						
						
						
							|  |  |   // https://wikitravel.org/en/International_dialling_prefix
 | 
						
						
						
							|  |  |   // https://github.com/catamphetamine/libphonenumber-js/issues/376
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |   if (number[0] !== '+') {
 | 
						
						
						
							|  |  |     // Convert an "out-of-country" dialing phone number
 | 
						
						
						
							|  |  |     // to a proper international phone number.
 | 
						
						
						
							|  |  |     var numberWithoutIDD = stripIddPrefix(number, country, callingCode, metadata); // If an IDD prefix was stripped then
 | 
						
						
						
							|  |  |     // convert the number to international one
 | 
						
						
						
							|  |  |     // for subsequent parsing.
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |     if (numberWithoutIDD && numberWithoutIDD !== number) {
 | 
						
						
						
							|  |  |       number = '+' + numberWithoutIDD;
 | 
						
						
						
							|  |  |     } else {
 | 
						
						
						
							|  |  |       // Check to see if the number starts with the country calling code
 | 
						
						
						
							|  |  |       // for the default country. If so, we remove the country calling code,
 | 
						
						
						
							|  |  |       // and do some checks on the validity of the number before and after.
 | 
						
						
						
							|  |  |       // https://github.com/catamphetamine/libphonenumber-js/issues/376
 | 
						
						
						
							|  |  |       if (country || callingCode) {
 | 
						
						
						
							|  |  |         var _extractCountryCallin = extractCountryCallingCodeFromInternationalNumberWithoutPlusSign(number, country, callingCode, metadata),
 | 
						
						
						
							|  |  |             countryCallingCode = _extractCountryCallin.countryCallingCode,
 | 
						
						
						
							|  |  |             shorterNumber = _extractCountryCallin.number;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         if (countryCallingCode) {
 | 
						
						
						
							|  |  |           return {
 | 
						
						
						
							|  |  |             countryCallingCode: countryCallingCode,
 | 
						
						
						
							|  |  |             number: shorterNumber
 | 
						
						
						
							|  |  |           };
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  |       }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |       return {
 | 
						
						
						
							|  |  |         number: number
 | 
						
						
						
							|  |  |       };
 | 
						
						
						
							|  |  |     }
 | 
						
						
						
							|  |  |   } // Fast abortion: country codes do not begin with a '0'
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |   if (number[1] === '0') {
 | 
						
						
						
							|  |  |     return {};
 | 
						
						
						
							|  |  |   }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |   metadata = new Metadata(metadata); // The thing with country phone codes
 | 
						
						
						
							|  |  |   // is that they are orthogonal to each other
 | 
						
						
						
							|  |  |   // i.e. there's no such country phone code A
 | 
						
						
						
							|  |  |   // for which country phone code B exists
 | 
						
						
						
							|  |  |   // where B starts with A.
 | 
						
						
						
							|  |  |   // Therefore, while scanning digits,
 | 
						
						
						
							|  |  |   // if a valid country code is found,
 | 
						
						
						
							|  |  |   // that means that it is the country code.
 | 
						
						
						
							|  |  |   //
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |   var i = 2;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |   while (i - 1 <= MAX_LENGTH_COUNTRY_CODE && i <= number.length) {
 | 
						
						
						
							|  |  |     var _countryCallingCode = number.slice(1, i);
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |     if (metadata.hasCallingCode(_countryCallingCode)) {
 | 
						
						
						
							|  |  |       metadata.selectNumberingPlan(_countryCallingCode);
 | 
						
						
						
							|  |  |       return {
 | 
						
						
						
							|  |  |         countryCallingCode: _countryCallingCode,
 | 
						
						
						
							|  |  |         number: number.slice(i)
 | 
						
						
						
							|  |  |       };
 | 
						
						
						
							|  |  |     }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |     i++;
 | 
						
						
						
							|  |  |   }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |   return {};
 | 
						
						
						
							|  |  | }
 | 
						
						
						
							|  |  | //# sourceMappingURL=extractCountryCallingCode.js.map
 |