{"version":3,"sources":["../source/findPhoneNumbers_.js"],"names":["VALID_PHONE_NUMBER","PLUS_CHARS","VALID_PUNCTUATION","VALID_DIGITS","WHITESPACE_IN_THE_BEGINNING_PATTERN","RegExp","WHITESPACE","PUNCTUATION_IN_THE_END_PATTERN","VALID_PRECEDING_CHARACTER_PATTERN","findPhoneNumbers","text","options","metadata","undefined","search","PhoneNumberSearch","phones","hasNext","push","next","searchPhoneNumbers","Symbol","iterator","done","value","regexp","EXTN_PATTERNS_FOR_PARSING","matches","exec","number","startsAt","index","replace","length","result","parseCandidate","find","extended","phone","endsAt","state","last_match","Error"],"mappings":"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","sourcesContent":["// This is a legacy function.\r\n// Use `findNumbers()` instead.\r\n\r\nimport {\r\n\tPLUS_CHARS,\r\n\tVALID_PUNCTUATION,\r\n\tVALID_DIGITS,\r\n\tWHITESPACE\r\n} from './constants'\r\n\r\nimport { EXTN_PATTERNS_FOR_PARSING } from './extension'\r\n\r\nimport parse from './parse_'\r\n\r\nimport parsePreCandidate from './findNumbers/parsePreCandidate'\r\nimport isValidPreCandidate from './findNumbers/isValidPreCandidate'\r\nimport isValidCandidate from './findNumbers/isValidCandidate'\r\n\r\n// Copy-pasted from `./parse.js`.\r\nconst VALID_PHONE_NUMBER =\r\n\t'[' + PLUS_CHARS + ']{0,1}' +\r\n\t'(?:' +\r\n\t\t'[' + VALID_PUNCTUATION + ']*' +\r\n\t\t'[' + VALID_DIGITS + ']' +\r\n\t'){3,}' +\r\n\t'[' +\r\n\t\tVALID_PUNCTUATION +\r\n\t\tVALID_DIGITS +\r\n\t']*'\r\n\r\nconst WHITESPACE_IN_THE_BEGINNING_PATTERN = new RegExp('^[' + WHITESPACE + ']+')\r\nconst PUNCTUATION_IN_THE_END_PATTERN = new RegExp('[' + VALID_PUNCTUATION + ']+$')\r\n\r\n// // Regular expression for getting opening brackets for a valid number\r\n// // found using `PHONE_NUMBER_START_PATTERN` for prepending those brackets to the number.\r\n// const BEFORE_NUMBER_DIGITS_PUNCTUATION = new RegExp('[' + OPENING_BRACKETS + ']+' + '[' + WHITESPACE + ']*' + '$')\r\n\r\nconst VALID_PRECEDING_CHARACTER_PATTERN = /[^a-zA-Z0-9]/\r\n\r\nexport default function findPhoneNumbers(text, options, metadata)\r\n{\r\n\t/* istanbul ignore if */\r\n\tif (options === undefined) {\r\n\t\toptions = {}\r\n\t}\r\n\r\n\tconst search = new PhoneNumberSearch(text, options, metadata)\r\n\tconst phones = []\r\n\twhile (search.hasNext()) {\r\n\t\tphones.push(search.next())\r\n\t}\r\n\treturn phones\r\n}\r\n\r\n/**\r\n * @return ES6 `for ... of` iterator.\r\n */\r\nexport function searchPhoneNumbers(text, options, metadata)\r\n{\r\n\t/* istanbul ignore if */\r\n\tif (options === undefined) {\r\n\t\toptions = {}\r\n\t}\r\n\r\n\tconst search = new PhoneNumberSearch(text, options, metadata)\r\n\r\n\treturn {\r\n\t\t[Symbol.iterator]() {\r\n\t\t\treturn {\r\n\t \t\tnext: () => {\r\n\t \t\t\tif (search.hasNext()) {\r\n\t\t\t\t\t\treturn {\r\n\t\t\t\t\t\t\tdone: false,\r\n\t\t\t\t\t\t\tvalue: search.next()\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\tdone: true\r\n\t\t\t\t\t}\r\n\t \t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/**\r\n * Extracts a parseable phone number including any opening brackets, etc.\r\n * @param {string} text - Input.\r\n * @return {object} `{ ?number, ?startsAt, ?endsAt }`.\r\n */\r\nexport class PhoneNumberSearch\r\n{\r\n\t// Iteration tristate.\r\n\tstate = 'NOT_READY'\r\n\r\n\tconstructor(text, options, metadata)\r\n\t{\r\n\t\tthis.text = text\r\n\t\t// If assigning the `{}` default value is moved to the arguments above,\r\n\t\t// code coverage would decrease for some weird reason.\r\n\t\tthis.options = options || {}\r\n\t\tthis.metadata = metadata\r\n\r\n\t\tthis.regexp = new RegExp\r\n\t\t(\r\n\t\t\tVALID_PHONE_NUMBER +\r\n\t\t\t// Phone number extensions\r\n\t\t\t'(?:' + EXTN_PATTERNS_FOR_PARSING + ')?',\r\n\t\t\t'ig'\r\n\t\t)\r\n\r\n\t\t// this.searching_from = 0\r\n\t}\r\n\r\n\tfind()\r\n\t{\r\n\t\tconst matches = this.regexp.exec(this.text)\r\n\r\n\t\tif (!matches) {\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\tlet number = matches[0]\r\n\t\tlet startsAt = matches.index\r\n\r\n\t\tnumber = number.replace(WHITESPACE_IN_THE_BEGINNING_PATTERN, '')\r\n\t\tstartsAt += matches[0].length - number.length\r\n\t\t// Fixes not parsing numbers with whitespace in the end.\r\n\t\t// Also fixes not parsing numbers with opening parentheses in the end.\r\n\t\t// https://github.com/catamphetamine/libphonenumber-js/issues/252\r\n\t\tnumber = number.replace(PUNCTUATION_IN_THE_END_PATTERN, '')\r\n\r\n\t\tnumber = parsePreCandidate(number)\r\n\r\n\t\tconst result = this.parseCandidate(number, startsAt)\r\n\r\n\t\tif (result) {\r\n\t\t\treturn result\r\n\t\t}\r\n\r\n\t\t// Tail recursion.\r\n\t\t// Try the next one if this one is not a valid phone number.\r\n\t\treturn this.find()\r\n\t}\r\n\r\n\tparseCandidate(number, startsAt)\r\n\t{\r\n\t\tif (!isValidPreCandidate(number, startsAt, this.text)) {\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\t// Don't parse phone numbers which are non-phone numbers\r\n\t\t// due to being part of something else (e.g. a UUID).\r\n\t\t// https://github.com/catamphetamine/libphonenumber-js/issues/213\r\n\t\t// Copy-pasted from Google's `PhoneNumberMatcher.js` (`.parseAndValidate()`).\r\n\t\tif (!isValidCandidate(number, startsAt, this.text, this.options.extended ? 'POSSIBLE' : 'VALID'))\r\n\t\t{\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\t// // Prepend any opening brackets left behind by the\r\n\t\t// // `PHONE_NUMBER_START_PATTERN` regexp.\r\n\t\t// const text_before_number = text.slice(this.searching_from, startsAt)\r\n\t\t// const full_number_starts_at = text_before_number.search(BEFORE_NUMBER_DIGITS_PUNCTUATION)\r\n\t\t// if (full_number_starts_at >= 0)\r\n\t\t// {\r\n\t\t// \tnumber = text_before_number.slice(full_number_starts_at) + number\r\n\t\t// \tstartsAt = full_number_starts_at\r\n\t\t// }\r\n\t\t//\r\n\t\t// this.searching_from = matches.lastIndex\r\n\r\n\t\tconst result = parse(number, this.options, this.metadata)\r\n\r\n\t\tif (!result.phone) {\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\tresult.startsAt = startsAt\r\n\t\tresult.endsAt = startsAt + number.length\r\n\r\n\t\treturn result\r\n\t}\r\n\r\n\thasNext()\r\n\t{\r\n\t\tif (this.state === 'NOT_READY')\r\n\t\t{\r\n\t\t\tthis.last_match = this.find()\r\n\r\n\t\t\tif (this.last_match)\r\n\t\t\t{\r\n\t\t\t\tthis.state = 'READY'\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tthis.state = 'DONE'\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this.state === 'READY'\r\n\t}\r\n\r\n\tnext()\r\n\t{\r\n\t\t// Check the state and find the next match as a side-effect if necessary.\r\n\t\tif (!this.hasNext())\r\n\t\t{\r\n\t\t\tthrow new Error('No next element')\r\n\t\t}\r\n\r\n\t\t// Don't retain that memory any longer than necessary.\r\n\t\tconst result = this.last_match\r\n\t\tthis.last_match = null\r\n\t\tthis.state = 'NOT_READY'\r\n\t\treturn result\r\n\t}\r\n}"],"file":"findPhoneNumbers_.js"}