|  |  |  |  | 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.
 | 
					
						
							|  |  |  |  | 		const 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) { | 
					
						
							|  |  |  |  | 				const { | 
					
						
							|  |  |  |  | 					countryCallingCode, | 
					
						
							|  |  |  |  | 					number: shorterNumber | 
					
						
							|  |  |  |  | 				} = extractCountryCallingCodeFromInternationalNumberWithoutPlusSign( | 
					
						
							|  |  |  |  | 					number, | 
					
						
							|  |  |  |  | 					country, | 
					
						
							|  |  |  |  | 					callingCode, | 
					
						
							|  |  |  |  | 					metadata | 
					
						
							|  |  |  |  | 				) | 
					
						
							|  |  |  |  | 				if (countryCallingCode) { | 
					
						
							|  |  |  |  | 					return { | 
					
						
							|  |  |  |  | 						countryCallingCode, | 
					
						
							|  |  |  |  | 						number: shorterNumber | 
					
						
							|  |  |  |  | 					} | 
					
						
							|  |  |  |  | 				} | 
					
						
							|  |  |  |  | 			} | 
					
						
							|  |  |  |  | 			return { 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.
 | 
					
						
							|  |  |  |  | 	//
 | 
					
						
							|  |  |  |  | 	let i = 2 | 
					
						
							|  |  |  |  | 	while (i - 1 <= MAX_LENGTH_COUNTRY_CODE && i <= number.length) { | 
					
						
							|  |  |  |  | 		const countryCallingCode = number.slice(1, i) | 
					
						
							|  |  |  |  | 		if (metadata.hasCallingCode(countryCallingCode)) { | 
					
						
							|  |  |  |  | 			metadata.selectNumberingPlan(countryCallingCode) | 
					
						
							|  |  |  |  | 			return { | 
					
						
							|  |  |  |  | 				countryCallingCode, | 
					
						
							|  |  |  |  | 				number: number.slice(i) | 
					
						
							|  |  |  |  | 			} | 
					
						
							|  |  |  |  | 		} | 
					
						
							|  |  |  |  | 		i++ | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	return {} | 
					
						
							|  |  |  |  | } |