UNPKG

18.1 kBSource Map (JSON)View Raw
1{"version":3,"sources":["../source/parse_.js"],"names":["MAX_INPUT_STRING_LENGTH","PHONE_NUMBER_START_PATTERN","RegExp","PLUS_CHARS","VALID_DIGITS","AFTER_PHONE_NUMBER_END_PATTERN","USE_NON_GEOGRAPHIC_COUNTRY_CODE","parse","text","options","metadata","Metadata","defaultCountry","hasCountry","v2","ParseError","Error","parseInput","formattedPhoneNumber","number","ext","parsePhoneNumber","defaultCallingCode","country","nationalNumber","countryCallingCode","carrierCode","hasSelectedNumberingPlan","length","MIN_LENGTH_FOR_NSN","MAX_LENGTH_FOR_NSN","phoneNumber","PhoneNumber","valid","extended","nationalNumberPattern","result","possible","possibleLengths","phone","extractFormattedPhoneNumber","throwOnError","startsAt","search","slice","replace","indexOf","withExtensionStripped","selectNumberingPlan","isNonGeographicCallingCode","exactCountry"],"mappings":"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","sourcesContent":["// This is a port of Google Android `libphonenumber`'s\r\n// `phonenumberutil.js` of December 31th, 2018.\r\n//\r\n// https://github.com/googlei18n/libphonenumber/commits/master/javascript/i18n/phonenumbers/phonenumberutil.js\r\n\r\nimport {\r\n\tVALID_DIGITS,\r\n\tPLUS_CHARS,\r\n\tMIN_LENGTH_FOR_NSN,\r\n\tMAX_LENGTH_FOR_NSN\r\n} from './constants'\r\n\r\nimport ParseError from './ParseError'\r\nimport Metadata from './metadata'\r\nimport isViablePhoneNumber from './helpers/isViablePhoneNumber'\r\nimport extractExtension from './helpers/extension/extractExtension'\r\nimport parseIncompletePhoneNumber from './parseIncompletePhoneNumber'\r\nimport getCountryCallingCode from './getCountryCallingCode'\r\nimport { isPossibleNumber } from './isPossibleNumber_'\r\nimport { parseRFC3966 } from './helpers/RFC3966'\r\nimport PhoneNumber from './PhoneNumber'\r\nimport matchesEntirely from './helpers/matchesEntirely'\r\nimport extractCountryCallingCode from './helpers/extractCountryCallingCode'\r\nimport extractCountryCallingCodeFromInternationalNumberWithoutPlusSign from './helpers/extractCountryCallingCodeFromInternationalNumberWithoutPlusSign'\r\nimport extractNationalNumber from './helpers/extractNationalNumber'\r\nimport stripIddPrefix from './helpers/stripIddPrefix'\r\nimport getCountryByCallingCode from './helpers/getCountryByCallingCode'\r\n\r\n// We don't allow input strings for parsing to be longer than 250 chars.\r\n// This prevents malicious input from consuming CPU.\r\nconst MAX_INPUT_STRING_LENGTH = 250\r\n\r\n// This consists of the plus symbol, digits, and arabic-indic digits.\r\nconst PHONE_NUMBER_START_PATTERN = new RegExp('[' + PLUS_CHARS + VALID_DIGITS + ']')\r\n\r\n// Regular expression of trailing characters that we want to remove.\r\n// A trailing `#` is sometimes used when writing phone numbers with extensions in US.\r\n// Example: \"+1 (645) 123 1234-910#\" number has extension \"910\".\r\nconst AFTER_PHONE_NUMBER_END_PATTERN = new RegExp('[^' + VALID_DIGITS + '#' + ']+$')\r\n\r\nconst USE_NON_GEOGRAPHIC_COUNTRY_CODE = false\r\n\r\n// `options`:\r\n// {\r\n// country:\r\n// {\r\n// restrict - (a two-letter country code)\r\n// the phone number must be in this country\r\n//\r\n// default - (a two-letter country code)\r\n// default country to use for phone number parsing and validation\r\n// (if no country code could be derived from the phone number)\r\n// }\r\n// }\r\n//\r\n// Returns `{ country, number }`\r\n//\r\n// Example use cases:\r\n//\r\n// ```js\r\n// parse('8 (800) 555-35-35', 'RU')\r\n// parse('8 (800) 555-35-35', 'RU', metadata)\r\n// parse('8 (800) 555-35-35', { country: { default: 'RU' } })\r\n// parse('8 (800) 555-35-35', { country: { default: 'RU' } }, metadata)\r\n// parse('+7 800 555 35 35')\r\n// parse('+7 800 555 35 35', metadata)\r\n// ```\r\n//\r\nexport default function parse(text, options, metadata) {\r\n\t// If assigning the `{}` default value is moved to the arguments above,\r\n\t// code coverage would decrease for some weird reason.\r\n\toptions = options || {}\r\n\r\n\tmetadata = new Metadata(metadata)\r\n\r\n\t// Validate `defaultCountry`.\r\n\tif (options.defaultCountry && !metadata.hasCountry(options.defaultCountry)) {\r\n\t\tif (options.v2) {\r\n\t\t\tthrow new ParseError('INVALID_COUNTRY')\r\n\t\t}\r\n\t\tthrow new Error(`Unknown country: ${options.defaultCountry}`)\r\n\t}\r\n\r\n\t// Parse the phone number.\r\n\tconst { number: formattedPhoneNumber, ext } = parseInput(text, options.v2)\r\n\r\n\t// If the phone number is not viable then return nothing.\r\n\tif (!formattedPhoneNumber) {\r\n\t\tif (options.v2) {\r\n\t\t\tthrow new ParseError('NOT_A_NUMBER')\r\n\t\t}\r\n\t\treturn {}\r\n\t}\r\n\r\n\tconst {\r\n\t\tcountry,\r\n\t\tnationalNumber,\r\n\t\tcountryCallingCode,\r\n\t\tcarrierCode\r\n\t} = parsePhoneNumber(\r\n\t\tformattedPhoneNumber,\r\n\t\toptions.defaultCountry,\r\n\t\toptions.defaultCallingCode,\r\n\t\tmetadata\r\n\t)\r\n\r\n\tif (!metadata.hasSelectedNumberingPlan()) {\r\n\t\tif (options.v2) {\r\n\t\t\tthrow new ParseError('INVALID_COUNTRY')\r\n\t\t}\r\n\t\treturn {}\r\n\t}\r\n\r\n\t// Validate national (significant) number length.\r\n\tif (!nationalNumber || nationalNumber.length < MIN_LENGTH_FOR_NSN) {\r\n\t\t// Won't throw here because the regexp already demands length > 1.\r\n\t\t/* istanbul ignore if */\r\n\t\tif (options.v2) {\r\n\t\t\tthrow new ParseError('TOO_SHORT')\r\n\t\t}\r\n\t\t// Google's demo just throws an error in this case.\r\n\t\treturn {}\r\n\t}\r\n\r\n\t// Validate national (significant) number length.\r\n\t//\r\n\t// A sidenote:\r\n\t//\r\n\t// They say that sometimes national (significant) numbers\r\n\t// can be longer than `MAX_LENGTH_FOR_NSN` (e.g. in Germany).\r\n\t// https://github.com/googlei18n/libphonenumber/blob/7e1748645552da39c4e1ba731e47969d97bdb539/resources/phonenumber.proto#L36\r\n\t// Such numbers will just be discarded.\r\n\t//\r\n\tif (nationalNumber.length > MAX_LENGTH_FOR_NSN) {\r\n\t\tif (options.v2) {\r\n\t\t\tthrow new ParseError('TOO_LONG')\r\n\t\t}\r\n\t\t// Google's demo just throws an error in this case.\r\n\t\treturn {}\r\n\t}\r\n\r\n\tif (options.v2) {\r\n\t\tconst phoneNumber = new PhoneNumber(\r\n\t\t\tcountryCallingCode,\r\n\t\t\tnationalNumber,\r\n\t\t\tmetadata.metadata\r\n\t\t)\r\n\t\tif (country) {\r\n\t\t\tphoneNumber.country = country\r\n\t\t}\r\n\t\tif (carrierCode) {\r\n\t\t\tphoneNumber.carrierCode = carrierCode\r\n\t\t}\r\n\t\tif (ext) {\r\n\t\t\tphoneNumber.ext = ext\r\n\t\t}\r\n\t\treturn phoneNumber\r\n\t}\r\n\r\n\t// Check if national phone number pattern matches the number.\r\n\t// National number pattern is different for each country,\r\n\t// even for those ones which are part of the \"NANPA\" group.\r\n\tconst valid = (options.extended ? metadata.hasSelectedNumberingPlan() : country) ?\r\n\t\tmatchesEntirely(nationalNumber, metadata.nationalNumberPattern()) :\r\n\t\tfalse\r\n\r\n\tif (!options.extended) {\r\n\t\treturn valid ? result(country, nationalNumber, ext) : {}\r\n\t}\r\n\r\n\t// isInternational: countryCallingCode !== undefined\r\n\r\n\treturn {\r\n\t\tcountry,\r\n\t\tcountryCallingCode,\r\n\t\tcarrierCode,\r\n\t\tvalid,\r\n\t\tpossible: valid ? true : (\r\n\t\t\toptions.extended === true &&\r\n\t\t\tmetadata.possibleLengths() &&\r\n\t\t\tisPossibleNumber(nationalNumber, metadata) ? true : false\r\n\t\t),\r\n\t\tphone: nationalNumber,\r\n\t\text\r\n\t}\r\n}\r\n\r\n/**\r\n * Extracts a formatted phone number from text.\r\n * Doesn't guarantee that the extracted phone number\r\n * is a valid phone number (for example, doesn't validate its length).\r\n * @param {string} text\r\n * @param {boolean} throwOnError — By default, it won't throw if the text is too long.\r\n * @return {string}\r\n * @example\r\n * // Returns \"(213) 373-4253\".\r\n * extractFormattedPhoneNumber(\"Call (213) 373-4253 for assistance.\")\r\n */\r\nexport function extractFormattedPhoneNumber(text, throwOnError) {\r\n\tif (!text) {\r\n\t\treturn\r\n\t}\r\n\tif (text.length > MAX_INPUT_STRING_LENGTH) {\r\n\t\tif (throwOnError) {\r\n\t\t\tthrow new ParseError('TOO_LONG')\r\n\t\t}\r\n\t\treturn\r\n\t}\r\n\t// Attempt to extract a possible number from the string passed in\r\n\tconst startsAt = text.search(PHONE_NUMBER_START_PATTERN)\r\n\tif (startsAt < 0) {\r\n\t\treturn\r\n\t}\r\n\treturn text\r\n\t\t// Trim everything to the left of the phone number\r\n\t\t.slice(startsAt)\r\n\t\t// Remove trailing non-numerical characters\r\n\t\t.replace(AFTER_PHONE_NUMBER_END_PATTERN, '')\r\n}\r\n\r\n/**\r\n * @param {string} text - Input.\r\n * @return {object} `{ ?number, ?ext }`.\r\n */\r\nfunction parseInput(text, v2) {\r\n\t// Parse RFC 3966 phone number URI.\r\n\tif (text && text.indexOf('tel:') === 0) {\r\n\t\treturn parseRFC3966(text)\r\n\t}\r\n\tlet number = extractFormattedPhoneNumber(text, v2)\r\n\t// If the phone number is not viable, then abort.\r\n\tif (!number || !isViablePhoneNumber(number)) {\r\n\t\treturn {}\r\n\t}\r\n\t// Attempt to parse extension first, since it doesn't require region-specific\r\n\t// data and we want to have the non-normalised number here.\r\n\tconst withExtensionStripped = extractExtension(number)\r\n\tif (withExtensionStripped.ext) {\r\n\t\treturn withExtensionStripped\r\n\t}\r\n\treturn { number }\r\n}\r\n\r\n/**\r\n * Creates `parse()` result object.\r\n */\r\nfunction result(country, nationalNumber, ext) {\r\n\tconst result = {\r\n\t\tcountry,\r\n\t\tphone: nationalNumber\r\n\t}\r\n\tif (ext) {\r\n\t\tresult.ext = ext\r\n\t}\r\n\treturn result\r\n}\r\n\r\n/**\r\n * Parses a viable phone number.\r\n * @param {string} formattedPhoneNumber — Example: \"(213) 373-4253\".\r\n * @param {string} [defaultCountry]\r\n * @param {string} [defaultCallingCode]\r\n * @param {Metadata} metadata\r\n * @return {object} Returns `{ country: string?, countryCallingCode: string?, nationalNumber: string? }`.\r\n */\r\nfunction parsePhoneNumber(\r\n\tformattedPhoneNumber,\r\n\tdefaultCountry,\r\n\tdefaultCallingCode,\r\n\tmetadata\r\n) {\r\n\t// Extract calling code from phone number.\r\n\tlet { countryCallingCode, number } = extractCountryCallingCode(\r\n\t\tparseIncompletePhoneNumber(formattedPhoneNumber),\r\n\t\tdefaultCountry,\r\n\t\tdefaultCallingCode,\r\n\t\tmetadata.metadata\r\n\t)\r\n\r\n\t// Choose a country by `countryCallingCode`.\r\n\tlet country\r\n\tif (countryCallingCode) {\r\n\t\tmetadata.selectNumberingPlan(countryCallingCode)\r\n\t}\r\n\t// If `formattedPhoneNumber` is in \"national\" format\r\n\t// then `number` is defined and `countryCallingCode` isn't.\r\n\telse if (number && (defaultCountry || defaultCallingCode)) {\r\n\t\tmetadata.selectNumberingPlan(defaultCountry, defaultCallingCode)\r\n\t\tif (defaultCountry) {\r\n\t\t\tcountry = defaultCountry\r\n\t\t} else {\r\n\t\t\t/* istanbul ignore if */\r\n\t\t\tif (USE_NON_GEOGRAPHIC_COUNTRY_CODE) {\r\n\t\t\t\tif (metadata.isNonGeographicCallingCode(defaultCallingCode)) {\r\n\t\t\t\t\tcountry = '001'\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tcountryCallingCode = defaultCallingCode || getCountryCallingCode(defaultCountry, metadata.metadata)\r\n\t}\r\n\telse return {}\r\n\r\n\tif (!number) {\r\n\t\treturn { countryCallingCode }\r\n\t}\r\n\r\n\tconst {\r\n\t\tnationalNumber,\r\n\t\tcarrierCode\r\n\t} = extractNationalNumber(\r\n\t\tparseIncompletePhoneNumber(number),\r\n\t\tmetadata\r\n\t)\r\n\r\n\t// Sometimes there are several countries\r\n\t// corresponding to the same country phone code\r\n\t// (e.g. NANPA countries all having `1` country phone code).\r\n\t// Therefore, to reliably determine the exact country,\r\n\t// national (significant) number should have been parsed first.\r\n\t//\r\n\t// When `metadata.json` is generated, all \"ambiguous\" country phone codes\r\n\t// get their countries populated with the full set of\r\n\t// \"phone number type\" regular expressions.\r\n\t//\r\n\tconst exactCountry = getCountryByCallingCode(countryCallingCode, nationalNumber, metadata)\r\n\tif (exactCountry) {\r\n\t\tcountry = exactCountry\r\n\t\t/* istanbul ignore if */\r\n\t\tif (exactCountry === '001') {\r\n\t\t\t// Can't happen with `USE_NON_GEOGRAPHIC_COUNTRY_CODE` being `false`.\r\n\t\t\t// If `USE_NON_GEOGRAPHIC_COUNTRY_CODE` is set to `true` for some reason,\r\n\t\t\t// then remove the \"istanbul ignore if\".\r\n\t\t} else {\r\n\t\t\tmetadata.country(country)\r\n\t\t}\r\n\t}\r\n\r\n\treturn {\r\n\t\tcountry,\r\n\t\tcountryCallingCode,\r\n\t\tnationalNumber,\r\n\t\tcarrierCode\r\n\t}\r\n}"],"file":"parse_.js"}
\No newline at end of file