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)
							 |