You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					95 lines
				
				2.7 KiB
			
		
		
			
		
	
	
					95 lines
				
				2.7 KiB
			| 
											3 years ago
										 | import Metadata from './metadata.js' | ||
|  | import isPossibleNumber from './isPossibleNumber_.js' | ||
|  | import isValidNumber from './validate_.js' | ||
|  | import isValidNumberForRegion from './isValidNumberForRegion_.js' | ||
|  | import getNumberType from './helpers/getNumberType.js' | ||
|  | import formatNumber from './format_.js' | ||
|  | 
 | ||
|  | const USE_NON_GEOGRAPHIC_COUNTRY_CODE = false | ||
|  | 
 | ||
|  | export default class PhoneNumber { | ||
|  | 	constructor(countryCallingCode, nationalNumber, metadata) { | ||
|  | 		if (!countryCallingCode) { | ||
|  | 			throw new TypeError('`country` or `countryCallingCode` not passed') | ||
|  | 		} | ||
|  | 		if (!nationalNumber) { | ||
|  | 			throw new TypeError('`nationalNumber` not passed') | ||
|  | 		} | ||
|  | 		if (!metadata) { | ||
|  | 			throw new TypeError('`metadata` not passed') | ||
|  | 		} | ||
|  | 		const _metadata = new Metadata(metadata) | ||
|  | 		// If country code is passed then derive `countryCallingCode` from it.
 | ||
|  | 		// Also store the country code as `.country`.
 | ||
|  | 		if (isCountryCode(countryCallingCode)) { | ||
|  | 			this.country = countryCallingCode | ||
|  | 			_metadata.country(countryCallingCode) | ||
|  | 			countryCallingCode = _metadata.countryCallingCode() | ||
|  | 		} else { | ||
|  | 			/* istanbul ignore if */ | ||
|  | 			if (USE_NON_GEOGRAPHIC_COUNTRY_CODE) { | ||
|  | 				if (_metadata.isNonGeographicCallingCode(countryCallingCode)) { | ||
|  | 					this.country = '001' | ||
|  | 				} | ||
|  | 			} | ||
|  | 		} | ||
|  | 		this.countryCallingCode = countryCallingCode | ||
|  | 		this.nationalNumber = nationalNumber | ||
|  | 		this.number = '+' + this.countryCallingCode + this.nationalNumber | ||
|  | 		this.metadata = metadata | ||
|  | 	} | ||
|  | 
 | ||
|  | 	setExt(ext) { | ||
|  | 		this.ext = ext | ||
|  | 	} | ||
|  | 
 | ||
|  | 	isPossible() { | ||
|  | 		return isPossibleNumber(this, { v2: true }, this.metadata) | ||
|  | 	} | ||
|  | 
 | ||
|  | 	isValid() { | ||
|  | 		return isValidNumber(this, { v2: true }, this.metadata) | ||
|  | 	} | ||
|  | 
 | ||
|  | 	isNonGeographic() { | ||
|  | 		const metadata = new Metadata(this.metadata) | ||
|  | 		return metadata.isNonGeographicCallingCode(this.countryCallingCode) | ||
|  | 	} | ||
|  | 
 | ||
|  | 	isEqual(phoneNumber) { | ||
|  | 		return this.number === phoneNumber.number && this.ext === phoneNumber.ext | ||
|  | 	} | ||
|  | 
 | ||
|  | 	// // Is just an alias for `this.isValid() && this.country === country`.
 | ||
|  | 	// // https://github.com/googlei18n/libphonenumber/blob/master/FAQ.md#when-should-i-use-isvalidnumberforregion
 | ||
|  | 	// isValidForRegion(country) {
 | ||
|  | 	// 	return isValidNumberForRegion(this, country, { v2: true }, this.metadata)
 | ||
|  | 	// }
 | ||
|  | 
 | ||
|  | 	getType() { | ||
|  | 		return getNumberType(this, { v2: true }, this.metadata) | ||
|  | 	} | ||
|  | 
 | ||
|  | 	format(format, options) { | ||
|  | 		return formatNumber( | ||
|  | 			this, | ||
|  | 			format, | ||
|  | 			options ? { ...options, v2: true } : { v2: true }, | ||
|  | 			this.metadata | ||
|  | 		) | ||
|  | 	} | ||
|  | 
 | ||
|  | 	formatNational(options) { | ||
|  | 		return this.format('NATIONAL', options) | ||
|  | 	} | ||
|  | 
 | ||
|  | 	formatInternational(options) { | ||
|  | 		return this.format('INTERNATIONAL', options) | ||
|  | 	} | ||
|  | 
 | ||
|  | 	getURI(options) { | ||
|  | 		return this.format('RFC3966', options) | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | const isCountryCode = (value) => /^[A-Z]{2}$/.test(value) |