1 | "use strict";
|
2 |
|
3 | Object.defineProperty(exports, "__esModule", {
|
4 | value: true
|
5 | });
|
6 | exports["default"] = void 0;
|
7 |
|
8 | var _PhoneNumber = _interopRequireDefault(require("./PhoneNumber"));
|
9 |
|
10 | var _constants = require("./constants");
|
11 |
|
12 | var _createExtensionPattern = _interopRequireDefault(require("./helpers/extension/createExtensionPattern"));
|
13 |
|
14 | var _RegExpCache = _interopRequireDefault(require("./findNumbers/RegExpCache"));
|
15 |
|
16 | var _util = require("./findNumbers/util");
|
17 |
|
18 | var _utf = require("./findNumbers/utf-8");
|
19 |
|
20 | var _Leniency = _interopRequireDefault(require("./findNumbers/Leniency"));
|
21 |
|
22 | var _parsePreCandidate = _interopRequireDefault(require("./findNumbers/parsePreCandidate"));
|
23 |
|
24 | var _isValidPreCandidate = _interopRequireDefault(require("./findNumbers/isValidPreCandidate"));
|
25 |
|
26 | var _isValidCandidate = _interopRequireWildcard(require("./findNumbers/isValidCandidate"));
|
27 |
|
28 | var _metadata = require("./metadata");
|
29 |
|
30 | var _parse_ = _interopRequireDefault(require("./parse_"));
|
31 |
|
32 | function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj["default"] = obj; return newObj; } }
|
33 |
|
34 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
35 |
|
36 | function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }
|
37 |
|
38 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
39 |
|
40 | function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
|
41 |
|
42 | function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
|
43 |
|
44 | function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
45 |
|
46 | var EXTN_PATTERNS_FOR_MATCHING = (0, _createExtensionPattern["default"])('matching');
|
47 |
|
48 |
|
49 |
|
50 |
|
51 |
|
52 |
|
53 |
|
54 |
|
55 |
|
56 |
|
57 |
|
58 | var INNER_MATCHES = [
|
59 | '\\/+(.*)/',
|
60 |
|
61 | '(\\([^(]*)',
|
62 |
|
63 | "(?:".concat(_utf.pZ, "-|-").concat(_utf.pZ, ")").concat(_utf.pZ, "*(.+)"),
|
64 |
|
65 |
|
66 | "[\u2012-\u2015\uFF0D]".concat(_utf.pZ, "*(.+)"),
|
67 | "\\.+".concat(_utf.pZ, "*([^.]+)"),
|
68 | "".concat(_utf.pZ, "+(").concat(_utf.PZ, "+)")];
|
69 |
|
70 | var leadLimit = (0, _util.limit)(0, 2);
|
71 |
|
72 | var punctuationLimit = (0, _util.limit)(0, 4);
|
73 |
|
74 |
|
75 |
|
76 |
|
77 | var digitBlockLimit = _constants.MAX_LENGTH_FOR_NSN + _constants.MAX_LENGTH_COUNTRY_CODE;
|
78 |
|
79 |
|
80 | var blockLimit = (0, _util.limit)(0, digitBlockLimit);
|
81 |
|
82 |
|
83 | var punctuation = "[".concat(_constants.VALID_PUNCTUATION, "]") + punctuationLimit;
|
84 |
|
85 | var digitSequence = _utf.pNd + (0, _util.limit)(1, digitBlockLimit);
|
86 |
|
87 |
|
88 |
|
89 |
|
90 |
|
91 |
|
92 |
|
93 |
|
94 |
|
95 |
|
96 |
|
97 |
|
98 |
|
99 |
|
100 |
|
101 |
|
102 |
|
103 | var PATTERN = '(?:' + _isValidCandidate.LEAD_CLASS + punctuation + ')' + leadLimit + digitSequence + '(?:' + punctuation + digitSequence + ')' + blockLimit + '(?:' + EXTN_PATTERNS_FOR_MATCHING + ')?';
|
104 |
|
105 |
|
106 |
|
107 |
|
108 |
|
109 |
|
110 |
|
111 |
|
112 | var UNWANTED_END_CHAR_PATTERN = new RegExp("[^".concat(_utf._pN).concat(_utf._pL, "#]+$"));
|
113 | var NON_DIGITS_PATTERN = /(\D+)/;
|
114 | var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || Math.pow(2, 53) - 1;
|
115 |
|
116 |
|
117 |
|
118 |
|
119 |
|
120 |
|
121 |
|
122 |
|
123 |
|
124 |
|
125 |
|
126 | var PhoneNumberMatcher =
|
127 |
|
128 | function () {
|
129 |
|
130 |
|
131 |
|
132 |
|
133 |
|
134 |
|
135 |
|
136 |
|
137 | |
138 |
|
139 |
|
140 |
|
141 |
|
142 |
|
143 |
|
144 |
|
145 |
|
146 |
|
147 |
|
148 |
|
149 |
|
150 |
|
151 |
|
152 | function PhoneNumberMatcher() {
|
153 | var text = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
|
154 | var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
155 | var metadata = arguments.length > 2 ? arguments[2] : undefined;
|
156 |
|
157 | _classCallCheck(this, PhoneNumberMatcher);
|
158 |
|
159 | _defineProperty(this, "state", 'NOT_READY');
|
160 |
|
161 | _defineProperty(this, "searchIndex", 0);
|
162 |
|
163 | _defineProperty(this, "regExpCache", new _RegExpCache["default"](32));
|
164 |
|
165 | options = _objectSpread({}, options, {
|
166 | defaultCallingCode: options.defaultCallingCode,
|
167 | defaultCountry: options.defaultCountry && (0, _metadata.isSupportedCountry)(options.defaultCountry, metadata) ? options.defaultCountry : undefined,
|
168 | leniency: options.leniency || options.extended ? 'POSSIBLE' : 'VALID',
|
169 | maxTries: options.maxTries || MAX_SAFE_INTEGER
|
170 | });
|
171 |
|
172 | if (!options.leniency) {
|
173 | throw new TypeError('`Leniency` not supplied');
|
174 | }
|
175 |
|
176 | if (options.maxTries < 0) {
|
177 | throw new TypeError('`maxTries` not supplied');
|
178 | }
|
179 |
|
180 | this.text = text;
|
181 | this.options = options;
|
182 | this.metadata = metadata;
|
183 |
|
184 |
|
185 | this.leniency = _Leniency["default"][options.leniency];
|
186 |
|
187 | if (!this.leniency) {
|
188 | throw new TypeError("Unknown leniency: ".concat(options.leniency, "."));
|
189 | }
|
190 |
|
191 |
|
192 |
|
193 | this.maxTries = options.maxTries;
|
194 | this.PATTERN = new RegExp(PATTERN, 'ig');
|
195 | }
|
196 | |
197 |
|
198 |
|
199 |
|
200 |
|
201 |
|
202 |
|
203 |
|
204 |
|
205 | _createClass(PhoneNumberMatcher, [{
|
206 | key: "find",
|
207 | value: function find() {
|
208 |
|
209 |
|
210 | var matches;
|
211 |
|
212 | while (this.maxTries > 0 && (matches = this.PATTERN.exec(this.text)) !== null) {
|
213 | var candidate = matches[0];
|
214 | var offset = matches.index;
|
215 | candidate = (0, _parsePreCandidate["default"])(candidate);
|
216 |
|
217 | if ((0, _isValidPreCandidate["default"])(candidate, offset, this.text)) {
|
218 | var match =
|
219 | this.parseAndVerify(candidate, offset, this.text)
|
220 |
|
221 | || this.extractInnerMatch(candidate, offset, this.text);
|
222 |
|
223 | if (match) {
|
224 | if (this.options.v2) {
|
225 | var phoneNumber = new _PhoneNumber["default"](match.country || match.countryCallingCode, match.phone, this.metadata);
|
226 |
|
227 | if (match.ext) {
|
228 | phoneNumber.ext = match.ext;
|
229 | }
|
230 |
|
231 | return {
|
232 | startsAt: match.startsAt,
|
233 | endsAt: match.endsAt,
|
234 | number: phoneNumber
|
235 | };
|
236 | }
|
237 |
|
238 | return match;
|
239 | }
|
240 | }
|
241 |
|
242 | this.maxTries--;
|
243 | }
|
244 | }
|
245 | |
246 |
|
247 |
|
248 |
|
249 |
|
250 | }, {
|
251 | key: "extractInnerMatch",
|
252 | value: function extractInnerMatch(substring, offset, text) {
|
253 | for (var _i = 0, _INNER_MATCHES = INNER_MATCHES; _i < _INNER_MATCHES.length; _i++) {
|
254 | var innerMatchPattern = _INNER_MATCHES[_i];
|
255 | var isFirstMatch = true;
|
256 | var candidateMatch = void 0;
|
257 | var innerMatchRegExp = new RegExp(innerMatchPattern, 'g');
|
258 |
|
259 | while (this.maxTries > 0 && (candidateMatch = innerMatchRegExp.exec(substring)) !== null) {
|
260 | if (isFirstMatch) {
|
261 |
|
262 | var _candidate = (0, _util.trimAfterFirstMatch)(UNWANTED_END_CHAR_PATTERN, substring.slice(0, candidateMatch.index));
|
263 |
|
264 | var _match = this.parseAndVerify(_candidate, offset, text);
|
265 |
|
266 | if (_match) {
|
267 | return _match;
|
268 | }
|
269 |
|
270 | this.maxTries--;
|
271 | isFirstMatch = false;
|
272 | }
|
273 |
|
274 | var candidate = (0, _util.trimAfterFirstMatch)(UNWANTED_END_CHAR_PATTERN, candidateMatch[1]);
|
275 |
|
276 |
|
277 |
|
278 |
|
279 |
|
280 | var candidateIndexGuess = substring.indexOf(candidate, candidateMatch.index);
|
281 | var match = this.parseAndVerify(candidate, offset + candidateIndexGuess, text);
|
282 |
|
283 | if (match) {
|
284 | return match;
|
285 | }
|
286 |
|
287 | this.maxTries--;
|
288 | }
|
289 | }
|
290 | }
|
291 | |
292 |
|
293 |
|
294 |
|
295 |
|
296 |
|
297 |
|
298 |
|
299 |
|
300 |
|
301 | }, {
|
302 | key: "parseAndVerify",
|
303 | value: function parseAndVerify(candidate, offset, text) {
|
304 | if (!(0, _isValidCandidate["default"])(candidate, offset, text, this.options.leniency)) {
|
305 | return;
|
306 | }
|
307 |
|
308 | var number = (0, _parse_["default"])(candidate, {
|
309 | extended: true,
|
310 | defaultCountry: this.options.defaultCountry,
|
311 | defaultCallingCode: this.options.defaultCallingCode
|
312 | }, this.metadata);
|
313 |
|
314 | if (!number.possible) {
|
315 | return;
|
316 | }
|
317 |
|
318 | if (this.leniency(number, candidate, this.metadata, this.regExpCache)) {
|
319 |
|
320 |
|
321 |
|
322 |
|
323 |
|
324 |
|
325 |
|
326 | var result = {
|
327 | startsAt: offset,
|
328 | endsAt: offset + candidate.length,
|
329 | phone: number.phone
|
330 | };
|
331 |
|
332 | if (number.country && number.country !== '001') {
|
333 | result.country = number.country;
|
334 | } else {
|
335 | result.countryCallingCode = number.countryCallingCode;
|
336 | }
|
337 |
|
338 | if (number.ext) {
|
339 | result.ext = number.ext;
|
340 | }
|
341 |
|
342 | return result;
|
343 | }
|
344 | }
|
345 | }, {
|
346 | key: "hasNext",
|
347 | value: function hasNext() {
|
348 | if (this.state === 'NOT_READY') {
|
349 | this.lastMatch = this.find();
|
350 |
|
351 | if (this.lastMatch) {
|
352 |
|
353 | this.state = 'READY';
|
354 | } else {
|
355 | this.state = 'DONE';
|
356 | }
|
357 | }
|
358 |
|
359 | return this.state === 'READY';
|
360 | }
|
361 | }, {
|
362 | key: "next",
|
363 | value: function next() {
|
364 |
|
365 | if (!this.hasNext()) {
|
366 | throw new Error('No next element');
|
367 | }
|
368 |
|
369 |
|
370 | var result = this.lastMatch;
|
371 | this.lastMatch = null;
|
372 | this.state = 'NOT_READY';
|
373 | return result;
|
374 | }
|
375 | }]);
|
376 |
|
377 | return PhoneNumberMatcher;
|
378 | }();
|
379 |
|
380 | exports["default"] = PhoneNumberMatcher;
|
381 |
|
\ | No newline at end of file |