2023-02-17 11:06:01 +01:00

107 lines
3.0 KiB
JavaScript

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 getPossibleCountriesForNumber from './helpers/getPossibleCountriesForNumber.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
}
getPossibleCountries() {
if (this.country) {
return [this.country]
}
return getPossibleCountriesForNumber(
this.countryCallingCode,
this.nationalNumber,
this.metadata
)
}
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)