UNPKG

28.9 kBSource Map (JSON)View Raw
1{"version":3,"sources":["../source/AsYouTypeParser.js"],"names":["VALID_FORMATTED_PHONE_NUMBER_PART","VALID_PUNCTUATION","VALID_DIGITS","VALID_FORMATTED_PHONE_NUMBER_PART_PATTERN","RegExp","VALID_PHONE_NUMBER","PLUS_CHARS","AFTER_PHONE_NUMBER_DIGITS_END_PATTERN","COMPLEX_NATIONAL_PREFIX","AsYouTypeParser","defaultCountry","defaultCallingCode","metadata","onNationalSignificantNumberChange","text","state","extractFormattedDigitsAndPlus","formattedDigits","hasPlus","digits","justLeadingPlus","startInternationalNumber","inputDigits","nextDigits","hasReceivedThreeLeadingDigits","length","appendDigits","extractIddPrefix","isWaitingForCountryCallingCode","extractCountryCallingCode","appendNationalSignificantNumberDigits","international","hasExtractedNationalSignificantNumber","extractNationalSignificantNumber","getNationalDigits","update","callingCode","getDigitsWithoutInternationalPrefix","countryCallingCode","number","setCallingCode","nationalSignificantNumber","numberingPlan","hasSelectedNumberingPlan","nationalPrefixForParsing","_nationalPrefixForParsing","couldPossiblyExtractAnotherNationalSignificantNumber","test","undefined","nationalDigits","setState","nationalPrefix","nationalNumber","carrierCode","onExtractedNationalNumber","prevNationalSignificantNumber","complexPrefixBeforeNationalSignificantNumber","nationalSignificantNumberMatchesInput","nationalSignificantNumberIndex","lastIndexOf","prefixBeforeNationalNumber","slice","extractAnotherNationalSignificantNumber","extractCallingCodeAndNationalSignificantNumber","fixMissingPlus","IDDPrefix","numberWithoutIDD","newCallingCode","missingPlus","resetNationalSignificantNumber","extractFormattedPhoneNumber","startsAt","search","replace","_extractFormattedDigitsAndPlus","extractedNumber"],"mappings":"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","sourcesContent":["import extractCountryCallingCode from './helpers/extractCountryCallingCode'\r\nimport extractCountryCallingCodeFromInternationalNumberWithoutPlusSign from './helpers/extractCountryCallingCodeFromInternationalNumberWithoutPlusSign'\r\nimport extractNationalNumberFromPossiblyIncompleteNumber from './helpers/extractNationalNumberFromPossiblyIncompleteNumber'\r\nimport stripIddPrefix from './helpers/stripIddPrefix'\r\nimport parseDigits from './helpers/parseDigits'\r\n\r\nimport {\r\n\tVALID_DIGITS,\r\n\tVALID_PUNCTUATION,\r\n\tPLUS_CHARS\r\n} from './constants'\r\n\r\nconst VALID_FORMATTED_PHONE_NUMBER_PART =\r\n\t'[' +\r\n\t\tVALID_PUNCTUATION +\r\n\t\tVALID_DIGITS +\r\n\t']+'\r\n\r\nconst VALID_FORMATTED_PHONE_NUMBER_PART_PATTERN = new RegExp('^' + VALID_FORMATTED_PHONE_NUMBER_PART + '$', 'i')\r\n\r\nconst VALID_PHONE_NUMBER =\r\n\t'(?:' +\r\n\t\t'[' + PLUS_CHARS + ']' +\r\n\t\t'[' +\r\n\t\t\tVALID_PUNCTUATION +\r\n\t\t\tVALID_DIGITS +\r\n\t\t']*' +\r\n\t\t'|' +\r\n\t\t'[' +\r\n\t\t\tVALID_PUNCTUATION +\r\n\t\t\tVALID_DIGITS +\r\n\t\t']+' +\r\n\t')'\r\n\r\nconst AFTER_PHONE_NUMBER_DIGITS_END_PATTERN = new RegExp(\r\n\t'[^' +\r\n\t\tVALID_PUNCTUATION +\r\n\t\tVALID_DIGITS +\r\n\t']+' +\r\n\t'.*' +\r\n\t'$'\r\n)\r\n\r\n// Tests whether `national_prefix_for_parsing` could match\r\n// different national prefixes.\r\n// Matches anything that's not a digit or a square bracket.\r\nconst COMPLEX_NATIONAL_PREFIX = /[^\\d\\[\\]]/\r\n\r\nexport default class AsYouTypeParser {\r\n\tconstructor({\r\n\t\tdefaultCountry,\r\n\t\tdefaultCallingCode,\r\n\t\tmetadata,\r\n\t\tonNationalSignificantNumberChange\r\n\t}) {\r\n\t\tthis.defaultCountry = defaultCountry\r\n\t\tthis.defaultCallingCode = defaultCallingCode\r\n\t\tthis.metadata = metadata\r\n\t\tthis.onNationalSignificantNumberChange = onNationalSignificantNumberChange\r\n\t}\r\n\r\n\tinput(text, state) {\r\n\t\tconst [formattedDigits, hasPlus] = extractFormattedDigitsAndPlus(text)\r\n\t\tconst digits = parseDigits(formattedDigits)\r\n\t\t// Checks for a special case: just a leading `+` has been entered.\r\n\t\tlet justLeadingPlus\r\n\t\tif (hasPlus) {\r\n\t\t\tif (!state.digits) {\r\n\t\t\t\tstate.startInternationalNumber()\r\n\t\t\t\tif (!digits) {\r\n\t\t\t\t\tjustLeadingPlus = true\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (digits) {\r\n\t\t\tthis.inputDigits(digits, state)\r\n\t\t}\r\n\t\treturn {\r\n\t\t\tdigits,\r\n\t\t\tjustLeadingPlus\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Inputs \"next\" phone number digits.\r\n\t * @param {string} digits\r\n\t * @return {string} [formattedNumber] Formatted national phone number (if it can be formatted at this stage). Returning `undefined` means \"don't format the national phone number at this stage\".\r\n\t */\r\n\tinputDigits(nextDigits, state) {\r\n\t\tconst { digits } = state\r\n\t\tconst hasReceivedThreeLeadingDigits = digits.length < 3 && digits.length + nextDigits.length >= 3\r\n\r\n\t\t// Append phone number digits.\r\n\t\tstate.appendDigits(nextDigits)\r\n\r\n\t\t// Attempt to extract IDD prefix:\r\n\t\t// Some users input their phone number in international format,\r\n\t\t// but in an \"out-of-country\" dialing format instead of using the leading `+`.\r\n\t\t// https://github.com/catamphetamine/libphonenumber-js/issues/185\r\n\t\t// Detect such numbers as soon as there're at least 3 digits.\r\n\t\t// Google's library attempts to extract IDD prefix at 3 digits,\r\n\t\t// so this library just copies that behavior.\r\n\t\t// I guess that's because the most commot IDD prefixes are\r\n\t\t// `00` (Europe) and `011` (US).\r\n\t\t// There exist really long IDD prefixes too:\r\n\t\t// for example, in Australia the default IDD prefix is `0011`,\r\n\t\t// and it could even be as long as `14880011`.\r\n\t\t// An IDD prefix is extracted here, and then every time when\r\n\t\t// there's a new digit and the number couldn't be formatted.\r\n\t\tif (hasReceivedThreeLeadingDigits) {\r\n\t\t\tthis.extractIddPrefix(state)\r\n\t\t}\r\n\r\n\t\tif (this.isWaitingForCountryCallingCode(state)) {\r\n\t\t\tif (!this.extractCountryCallingCode(state)) {\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tstate.appendNationalSignificantNumberDigits(nextDigits)\r\n\t\t}\r\n\r\n\t\t// If a phone number is being input in international format,\r\n\t\t// then it's not valid for it to have a national prefix.\r\n\t\t// Still, some people incorrectly input such numbers with a national prefix.\r\n\t\t// In such cases, only attempt to strip a national prefix if the number becomes too long.\r\n\t\t// (but that is done later, not here)\r\n\t\tif (!state.international) {\r\n\t\t\tif (!this.hasExtractedNationalSignificantNumber) {\r\n\t\t\t\tthis.extractNationalSignificantNumber(state.getNationalDigits(), state.update)\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tisWaitingForCountryCallingCode({ international, callingCode }) {\r\n\t\treturn international && !callingCode\r\n\t}\r\n\r\n\t// Extracts a country calling code from a number\r\n\t// being entered in internatonal format.\r\n\textractCountryCallingCode(state) {\r\n\t\tconst { countryCallingCode, number } = extractCountryCallingCode(\r\n\t\t\t'+' + state.getDigitsWithoutInternationalPrefix(),\r\n\t\t\tthis.defaultCountry,\r\n\t\t\tthis.defaultCallingCode,\r\n\t\t\tthis.metadata.metadata\r\n\t\t)\r\n\t\tif (countryCallingCode) {\r\n\t\t\tstate.setCallingCode(countryCallingCode)\r\n\t\t\tstate.update({\r\n\t\t\t\tnationalSignificantNumber: number\r\n\t\t\t})\r\n\t\t\treturn true\r\n\t\t}\r\n\t}\r\n\r\n\treset(numberingPlan) {\r\n\t\tif (numberingPlan) {\r\n\t\t\tthis.hasSelectedNumberingPlan = true\r\n\t\t\tconst nationalPrefixForParsing = numberingPlan._nationalPrefixForParsing()\r\n\t\t\tthis.couldPossiblyExtractAnotherNationalSignificantNumber = nationalPrefixForParsing && COMPLEX_NATIONAL_PREFIX.test(nationalPrefixForParsing)\r\n\t\t} else {\r\n\t\t\tthis.hasSelectedNumberingPlan = undefined\r\n\t\t\tthis.couldPossiblyExtractAnotherNationalSignificantNumber = undefined\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Extracts a national (significant) number from user input.\r\n\t * Google's library is different in that it only applies `national_prefix_for_parsing`\r\n\t * and doesn't apply `national_prefix_transform_rule` after that.\r\n\t * https://github.com/google/libphonenumber/blob/a3d70b0487875475e6ad659af404943211d26456/java/libphonenumber/src/com/google/i18n/phonenumbers/AsYouTypeFormatter.java#L539\r\n\t * @return {boolean} [extracted]\r\n\t */\r\n\textractNationalSignificantNumber(nationalDigits, setState) {\r\n\t\tif (!this.hasSelectedNumberingPlan) {\r\n\t\t\treturn\r\n\t\t}\r\n\t\tconst {\r\n\t\t\tnationalPrefix,\r\n\t\t\tnationalNumber,\r\n\t\t\tcarrierCode\r\n\t\t} = extractNationalNumberFromPossiblyIncompleteNumber(\r\n\t\t\tnationalDigits,\r\n\t\t\tthis.metadata\r\n\t\t)\r\n\t\tif (nationalNumber === nationalDigits) {\r\n\t\t\treturn\r\n\t\t}\r\n\t\tthis.onExtractedNationalNumber(\r\n\t\t\tnationalPrefix,\r\n\t\t\tcarrierCode,\r\n\t\t\tnationalNumber,\r\n\t\t\tnationalDigits,\r\n\t\t\tsetState\r\n\t\t)\r\n\t\treturn true\r\n\t}\r\n\r\n\t/**\r\n\t * In Google's code this function is called \"attempt to extract longer NDD\".\r\n\t * \"Some national prefixes are a substring of others\", they say.\r\n\t * @return {boolean} [result] — Returns `true` if extracting a national prefix produced different results from what they were.\r\n\t */\r\n\textractAnotherNationalSignificantNumber(nationalDigits, prevNationalSignificantNumber, setState) {\r\n\t\tif (!this.hasExtractedNationalSignificantNumber) {\r\n\t\t\treturn this.extractNationalSignificantNumber(nationalDigits, setState)\r\n\t\t}\r\n\t\tif (!this.couldPossiblyExtractAnotherNationalSignificantNumber) {\r\n\t\t\treturn\r\n\t\t}\r\n\t\tconst {\r\n\t\t\tnationalPrefix,\r\n\t\t\tnationalNumber,\r\n\t\t\tcarrierCode\r\n\t\t} = extractNationalNumberFromPossiblyIncompleteNumber(\r\n\t\t\tnationalDigits,\r\n\t\t\tthis.metadata\r\n\t\t)\r\n\t\t// If a national prefix has been extracted previously,\r\n\t\t// then it's always extracted as additional digits are added.\r\n\t\t// That's assuming `extractNationalNumberFromPossiblyIncompleteNumber()`\r\n\t\t// doesn't do anything different from what it currently does.\r\n\t\t// So, just in case, here's this check, though it doesn't occur.\r\n\t\t/* istanbul ignore if */\r\n\t\tif (nationalNumber === prevNationalSignificantNumber) {\r\n\t\t\treturn\r\n\t\t}\r\n\t\tthis.onExtractedNationalNumber(\r\n\t\t\tnationalPrefix,\r\n\t\t\tcarrierCode,\r\n\t\t\tnationalNumber,\r\n\t\t\tnationalDigits,\r\n\t\t\tsetState\r\n\t\t)\r\n\t\treturn true\r\n\t}\r\n\r\n\tonExtractedNationalNumber(\r\n\t\tnationalPrefix,\r\n\t\tcarrierCode,\r\n\t\tnationalSignificantNumber,\r\n\t\tnationalDigits,\r\n\t\tsetState\r\n\t) {\r\n\t\tlet complexPrefixBeforeNationalSignificantNumber\r\n\t\tlet nationalSignificantNumberMatchesInput\r\n\t\t// This check also works with empty `this.nationalSignificantNumber`.\r\n\t\tconst nationalSignificantNumberIndex = nationalDigits.lastIndexOf(nationalSignificantNumber)\r\n\t\t// If the extracted national (significant) number is the\r\n\t\t// last substring of the `digits`, then it means that it hasn't been altered:\r\n\t\t// no digits have been removed from the national (significant) number\r\n\t\t// while applying `national_prefix_transform_rule`.\r\n\t\t// https://gitlab.com/catamphetamine/libphonenumber-js/-/blob/master/METADATA.md#national_prefix_for_parsing--national_prefix_transform_rule\r\n\t\tif (nationalSignificantNumberIndex >= 0 &&\r\n\t\t\tnationalSignificantNumberIndex === nationalDigits.length - nationalSignificantNumber.length) {\r\n\t\t\tnationalSignificantNumberMatchesInput = true\r\n\t\t\t// If a prefix of a national (significant) number is not as simple\r\n\t\t\t// as just a basic national prefix, then such prefix is stored in\r\n\t\t\t// `this.complexPrefixBeforeNationalSignificantNumber` property and will be\r\n\t\t\t// prepended \"as is\" to the national (significant) number to produce\r\n\t\t\t// a formatted result.\r\n\t\t\tconst prefixBeforeNationalNumber = nationalDigits.slice(0, nationalSignificantNumberIndex)\r\n\t\t\t// `prefixBeforeNationalNumber` is always non-empty,\r\n\t\t\t// because `onExtractedNationalNumber()` isn't called\r\n\t\t\t// when a national (significant) number hasn't been actually \"extracted\":\r\n\t\t\t// when a national (significant) number is equal to the national part of `digits`,\r\n\t\t\t// then `onExtractedNationalNumber()` doesn't get called.\r\n\t\t\tif (prefixBeforeNationalNumber !== nationalPrefix) {\r\n\t\t\t\tcomplexPrefixBeforeNationalSignificantNumber = prefixBeforeNationalNumber\r\n\t\t\t}\r\n\t\t}\r\n\t\tsetState({\r\n\t\t\tnationalPrefix,\r\n\t\t\tcarrierCode,\r\n\t\t\tnationalSignificantNumber,\r\n\t\t\tnationalSignificantNumberMatchesInput,\r\n\t\t\tcomplexPrefixBeforeNationalSignificantNumber\r\n\t\t})\r\n\t\t// `onExtractedNationalNumber()` is only called when\r\n\t\t// the national (significant) number actually did change.\r\n\t\tthis.hasExtractedNationalSignificantNumber = true\r\n\t\tthis.onNationalSignificantNumberChange()\r\n\t}\r\n\r\n\treExtractNationalSignificantNumber(state) {\r\n\t\t// Attempt to extract a national prefix.\r\n\t\t//\r\n\t\t// Some people incorrectly input national prefix\r\n\t\t// in an international phone number.\r\n\t\t// For example, some people write British phone numbers as `+44(0)...`.\r\n\t\t//\r\n\t\t// Also, in some rare cases, it is valid for a national prefix\r\n\t\t// to be a part of an international phone number.\r\n\t\t// For example, mobile phone numbers in Mexico are supposed to be\r\n\t\t// dialled internationally using a `1` national prefix,\r\n\t\t// so the national prefix will be part of an international number.\r\n\t\t//\r\n\t\t// Quote from:\r\n\t\t// https://www.mexperience.com/dialing-cell-phones-in-mexico/\r\n\t\t//\r\n\t\t// \"Dialing a Mexican cell phone from abroad\r\n\t\t// When you are calling a cell phone number in Mexico from outside Mexico,\r\n\t\t// it’s necessary to dial an additional “1” after Mexico’s country code\r\n\t\t// (which is “52”) and before the area code.\r\n\t\t// You also ignore the 045, and simply dial the area code and the\r\n\t\t// cell phone’s number.\r\n\t\t//\r\n\t\t// If you don’t add the “1”, you’ll receive a recorded announcement\r\n\t\t// asking you to redial using it.\r\n\t\t//\r\n\t\t// For example, if you are calling from the USA to a cell phone\r\n\t\t// in Mexico City, you would dial +52 – 1 – 55 – 1234 5678.\r\n\t\t// (Note that this is different to calling a land line in Mexico City\r\n\t\t// from abroad, where the number dialed would be +52 – 55 – 1234 5678)\".\r\n\t\t//\r\n\t\t// Google's demo output:\r\n\t\t// https://libphonenumber.appspot.com/phonenumberparser?number=%2b5215512345678&country=MX\r\n\t\t//\r\n\t\tif (this.extractAnotherNationalSignificantNumber(\r\n\t\t\tstate.getNationalDigits(),\r\n\t\t\tstate.nationalSignificantNumber,\r\n\t\t\tstate.update\r\n\t\t)) {\r\n\t\t\treturn true\r\n\t\t}\r\n\t\t// If no format matches the phone number, then it could be\r\n\t\t// \"a really long IDD\" (quote from a comment in Google's library).\r\n\t\t// An IDD prefix is first extracted when the user has entered at least 3 digits,\r\n\t\t// and then here — every time when there's a new digit and the number\r\n\t\t// couldn't be formatted.\r\n\t\t// For example, in Australia the default IDD prefix is `0011`,\r\n\t\t// and it could even be as long as `14880011`.\r\n\t\t//\r\n\t\t// Could also check `!hasReceivedThreeLeadingDigits` here\r\n\t\t// to filter out the case when this check duplicates the one\r\n\t\t// already performed when there're 3 leading digits,\r\n\t\t// but it's not a big deal, and in most cases there\r\n\t\t// will be a suitable `format` when there're 3 leading digits.\r\n\t\t//\r\n\t\tif (this.extractIddPrefix(state)) {\r\n\t\t\tthis.extractCallingCodeAndNationalSignificantNumber(state)\r\n\t\t\treturn true\r\n\t\t}\r\n\t\t// Google's AsYouType formatter supports sort of an \"autocorrection\" feature\r\n\t\t// when it \"autocorrects\" numbers that have been input for a country\r\n\t\t// with that country's calling code.\r\n\t\t// Such \"autocorrection\" feature looks weird, but different people have been requesting it:\r\n\t\t// https://github.com/catamphetamine/libphonenumber-js/issues/376\r\n\t\t// https://github.com/catamphetamine/libphonenumber-js/issues/375\r\n\t\t// https://github.com/catamphetamine/libphonenumber-js/issues/316\r\n\t\tif (this.fixMissingPlus(state)) {\r\n\t\t\tthis.extractCallingCodeAndNationalSignificantNumber(state)\r\n\t\t\treturn true\r\n\t\t}\r\n\t}\r\n\r\n\textractIddPrefix(state) {\r\n\t\t// An IDD prefix can't be present in a number written with a `+`.\r\n\t\t// Also, don't re-extract an IDD prefix if has already been extracted.\r\n\t\tconst {\r\n\t\t\tinternational,\r\n\t\t\tIDDPrefix,\r\n\t\t\tdigits,\r\n\t\t\tnationalSignificantNumber\r\n\t\t} = state\r\n\t\tif (international || IDDPrefix) {\r\n\t\t\treturn\r\n\t\t}\r\n\t\t// Some users input their phone number in \"out-of-country\"\r\n\t\t// dialing format instead of using the leading `+`.\r\n\t\t// https://github.com/catamphetamine/libphonenumber-js/issues/185\r\n\t\t// Detect such numbers.\r\n\t\tconst numberWithoutIDD = stripIddPrefix(\r\n\t\t\tdigits,\r\n\t\t\tthis.defaultCountry,\r\n\t\t\tthis.defaultCallingCode,\r\n\t\t\tthis.metadata.metadata\r\n\t\t)\r\n\t\tif (numberWithoutIDD !== undefined && numberWithoutIDD !== digits) {\r\n\t\t\t// If an IDD prefix was stripped then convert the IDD-prefixed number\r\n\t\t\t// to international number for subsequent parsing.\r\n\t\t\tstate.update({\r\n\t\t\t\tIDDPrefix: digits.slice(0, digits.length - numberWithoutIDD.length)\r\n\t\t\t})\r\n\t\t\tthis.startInternationalNumber(state)\r\n\t\t\treturn true\r\n\t\t}\r\n\t}\r\n\r\n\tfixMissingPlus(state) {\r\n\t\tif (!state.international) {\r\n\t\t\tconst {\r\n\t\t\t\tcountryCallingCode: newCallingCode,\r\n\t\t\t\tnumber\r\n\t\t\t} = extractCountryCallingCodeFromInternationalNumberWithoutPlusSign(\r\n\t\t\t\tstate.digits,\r\n\t\t\t\tthis.defaultCountry,\r\n\t\t\t\tthis.defaultCallingCode,\r\n\t\t\t\tthis.metadata.metadata\r\n\t\t\t)\r\n\t\t\tif (newCallingCode) {\r\n\t\t\t\tstate.update({\r\n\t\t\t\t\tmissingPlus: true\r\n\t\t\t\t})\r\n\t\t\t\tthis.startInternationalNumber(state)\r\n\t\t\t\treturn true\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tstartInternationalNumber(state) {\r\n\t\tstate.startInternationalNumber()\r\n\t\t// If a national (significant) number has been extracted before, reset it.\r\n\t\tif (state.nationalSignificantNumber) {\r\n\t\t\tstate.resetNationalSignificantNumber()\r\n\t\t\tthis.onNationalSignificantNumberChange()\r\n\t\t\tthis.hasExtractedNationalSignificantNumber = undefined\r\n\t\t}\r\n\t}\r\n\r\n\textractCallingCodeAndNationalSignificantNumber(state) {\r\n\t\tif (this.extractCountryCallingCode(state)) {\r\n\t\t\t// `this.extractCallingCode()` is currently called when the number\r\n\t\t\t// couldn't be formatted during the standard procedure.\r\n\t\t\t// Normally, the national prefix would be re-extracted\r\n\t\t\t// for an international number if such number couldn't be formatted,\r\n\t\t\t// but since it's already not able to be formatted,\r\n\t\t\t// there won't be yet another retry, so also extract national prefix here.\r\n\t\t\tthis.extractNationalSignificantNumber(state.getNationalDigits(), state.update)\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/**\r\n * Extracts formatted phone number from text (if there's any).\r\n * @param {string} text\r\n * @return {string} [formattedPhoneNumber]\r\n */\r\nfunction extractFormattedPhoneNumber(text) {\r\n\t// Attempt to extract a possible number from the string passed in.\r\n\tconst startsAt = text.search(VALID_PHONE_NUMBER)\r\n\tif (startsAt < 0) {\r\n\t\treturn\r\n\t}\r\n\t// Trim everything to the left of the phone number.\r\n\ttext = text.slice(startsAt)\r\n\t// Trim the `+`.\r\n\tlet hasPlus\r\n\tif (text[0] === '+') {\r\n\t\thasPlus = true\r\n\t\ttext = text.slice('+'.length)\r\n\t}\r\n\t// Trim everything to the right of the phone number.\r\n\ttext = text.replace(AFTER_PHONE_NUMBER_DIGITS_END_PATTERN, '')\r\n\t// Re-add the previously trimmed `+`.\r\n\tif (hasPlus) {\r\n\t\ttext = '+' + text\r\n\t}\r\n\treturn text\r\n}\r\n\r\n/**\r\n * Extracts formatted phone number digits (and a `+`) from text (if there're any).\r\n * @param {string} text\r\n * @return {any[]}\r\n */\r\nfunction _extractFormattedDigitsAndPlus(text) {\r\n\t// Extract a formatted phone number part from text.\r\n\tconst extractedNumber = extractFormattedPhoneNumber(text) || ''\r\n\t// Trim a `+`.\r\n\tif (extractedNumber[0] === '+') {\r\n\t\treturn [extractedNumber.slice('+'.length), true]\r\n\t}\r\n\treturn [extractedNumber]\r\n}\r\n\r\n/**\r\n * Extracts formatted phone number digits (and a `+`) from text (if there're any).\r\n * @param {string} text\r\n * @return {any[]}\r\n */\r\nexport function extractFormattedDigitsAndPlus(text) {\r\n\tlet [formattedDigits, hasPlus] = _extractFormattedDigitsAndPlus(text)\r\n\t// If the extracted phone number part\r\n\t// can possibly be a part of some valid phone number\r\n\t// then parse phone number characters from a formatted phone number.\r\n\tif (!VALID_FORMATTED_PHONE_NUMBER_PART_PATTERN.test(formattedDigits)) {\r\n\t\tformattedDigits = ''\r\n\t}\r\n\treturn [formattedDigits, hasPlus]\r\n}"],"file":"AsYouTypeParser.js"}
\No newline at end of file