feat: Reinitialize frontend with SvelteKit and TypeScript

- Delete old Vite+Svelte frontend
- Initialize new SvelteKit project with TypeScript
- Configure Tailwind CSS v4 + DaisyUI
- Implement JWT authentication with auto-refresh
- Create login page with form validation (Zod)
- Add protected route guards
- Update Docker configuration for single-stage build
- Add E2E tests with Playwright (6/11 passing)
- Fix Svelte 5 reactivity with $state() runes

Known issues:
- 5 E2E tests failing (timing/async issues)
- Token refresh implementation needs debugging
- Validation error display timing
This commit is contained in:
2026-02-17 16:19:59 -05:00
parent 54df6018f5
commit de2d83092e
28274 changed files with 3816354 additions and 90 deletions

View File

@@ -0,0 +1,126 @@
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }
function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
import parse from '../parse.js';
import { VALID_PHONE_NUMBER_WITH_EXTENSION } from '../helpers/isViablePhoneNumber.js';
import parsePreCandidate from '../findNumbers/parsePreCandidate.js';
import isValidPreCandidate from '../findNumbers/isValidPreCandidate.js';
import isValidCandidate from '../findNumbers/isValidCandidate.js';
import {
// PLUS_CHARS,
VALID_PUNCTUATION,
// VALID_DIGITS,
WHITESPACE } from '../constants.js';
var WHITESPACE_IN_THE_BEGINNING_PATTERN = new RegExp('^[' + WHITESPACE + ']+');
var PUNCTUATION_IN_THE_END_PATTERN = new RegExp('[' + VALID_PUNCTUATION + ']+$');
/**
* Extracts a parseable phone number including any opening brackets, etc.
* @param {string} text - Input.
* @return {object} `{ ?number, ?startsAt, ?endsAt }`.
*/
var PhoneNumberSearch = /*#__PURE__*/function () {
function PhoneNumberSearch(text, options, metadata) {
_classCallCheck(this, PhoneNumberSearch);
this.text = text;
// If assigning the `{}` default value is moved to the arguments above,
// code coverage would decrease for some weird reason.
this.options = options || {};
this.metadata = metadata;
// Iteration tristate.
this.state = 'NOT_READY';
this.regexp = new RegExp(VALID_PHONE_NUMBER_WITH_EXTENSION, 'ig');
}
return _createClass(PhoneNumberSearch, [{
key: "find",
value: function find() {
var matches = this.regexp.exec(this.text);
if (!matches) {
return;
}
var number = matches[0];
var startsAt = matches.index;
number = number.replace(WHITESPACE_IN_THE_BEGINNING_PATTERN, '');
startsAt += matches[0].length - number.length;
// Fixes not parsing numbers with whitespace in the end.
// Also fixes not parsing numbers with opening parentheses in the end.
// https://github.com/catamphetamine/libphonenumber-js/issues/252
number = number.replace(PUNCTUATION_IN_THE_END_PATTERN, '');
number = parsePreCandidate(number);
var result = this.parseCandidate(number, startsAt);
if (result) {
return result;
}
// Tail recursion.
// Try the next one if this one is not a valid phone number.
return this.find();
}
}, {
key: "parseCandidate",
value: function parseCandidate(number, startsAt) {
if (!isValidPreCandidate(number, startsAt, this.text)) {
return;
}
// Don't parse phone numbers which are non-phone numbers
// due to being part of something else (e.g. a UUID).
// https://github.com/catamphetamine/libphonenumber-js/issues/213
// Copy-pasted from Google's `PhoneNumberMatcher.js` (`.parseAndValidate()`).
if (!isValidCandidate(number, startsAt, this.text, this.options.extended ? 'POSSIBLE' : 'VALID')) {
return;
}
// // Prepend any opening brackets left behind by the
// // `PHONE_NUMBER_START_PATTERN` regexp.
// const text_before_number = text.slice(this.searching_from, startsAt)
// const full_number_starts_at = text_before_number.search(BEFORE_NUMBER_DIGITS_PUNCTUATION)
// if (full_number_starts_at >= 0) {
// number = text_before_number.slice(full_number_starts_at) + number
// startsAt = full_number_starts_at
// }
//
// this.searching_from = matches.lastIndex
var result = parse(number, this.options, this.metadata);
if (!result.phone) {
return;
}
result.startsAt = startsAt;
result.endsAt = startsAt + number.length;
return result;
}
}, {
key: "hasNext",
value: function hasNext() {
if (this.state === 'NOT_READY') {
this.last_match = this.find();
if (this.last_match) {
this.state = 'READY';
} else {
this.state = 'DONE';
}
}
return this.state === 'READY';
}
}, {
key: "next",
value: function next() {
// Check the state and find the next match as a side-effect if necessary.
if (!this.hasNext()) {
throw new Error('No next element');
}
// Don't retain that memory any longer than necessary.
var result = this.last_match;
this.last_match = null;
this.state = 'NOT_READY';
return result;
}
}]);
}();
export { PhoneNumberSearch as default };
//# sourceMappingURL=PhoneNumberSearch.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,15 @@
import PhoneNumberMatcher from '../PhoneNumberMatcher.js';
import normalizeArguments from '../normalizeArguments.js';
export default function findNumbers() {
var _normalizeArguments = normalizeArguments(arguments),
text = _normalizeArguments.text,
options = _normalizeArguments.options,
metadata = _normalizeArguments.metadata;
var matcher = new PhoneNumberMatcher(text, options, metadata);
var results = [];
while (matcher.hasNext()) {
results.push(matcher.next());
}
return results;
}
//# sourceMappingURL=findNumbers.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"findNumbers.js","names":["PhoneNumberMatcher","normalizeArguments","findNumbers","_normalizeArguments","arguments","text","options","metadata","matcher","results","hasNext","push","next"],"sources":["../../source/legacy/findNumbers.js"],"sourcesContent":["import PhoneNumberMatcher from '../PhoneNumberMatcher.js'\r\nimport normalizeArguments from '../normalizeArguments.js'\r\n\r\nexport default function findNumbers() {\r\n\tconst { text, options, metadata } = normalizeArguments(arguments)\r\n\tconst matcher = new PhoneNumberMatcher(text, options, metadata)\r\n\tconst results = []\r\n\twhile (matcher.hasNext()) {\r\n\t\tresults.push(matcher.next())\r\n\t}\r\n\treturn results\r\n}"],"mappings":"AAAA,OAAOA,kBAAkB,MAAM,0BAA0B;AACzD,OAAOC,kBAAkB,MAAM,0BAA0B;AAEzD,eAAe,SAASC,WAAWA,CAAA,EAAG;EACrC,IAAAC,mBAAA,GAAoCF,kBAAkB,CAACG,SAAS,CAAC;IAAzDC,IAAI,GAAAF,mBAAA,CAAJE,IAAI;IAAEC,OAAO,GAAAH,mBAAA,CAAPG,OAAO;IAAEC,QAAQ,GAAAJ,mBAAA,CAARI,QAAQ;EAC/B,IAAMC,OAAO,GAAG,IAAIR,kBAAkB,CAACK,IAAI,EAAEC,OAAO,EAAEC,QAAQ,CAAC;EAC/D,IAAME,OAAO,GAAG,EAAE;EAClB,OAAOD,OAAO,CAACE,OAAO,CAAC,CAAC,EAAE;IACzBD,OAAO,CAACE,IAAI,CAACH,OAAO,CAACI,IAAI,CAAC,CAAC,CAAC;EAC7B;EACA,OAAOH,OAAO;AACf","ignoreList":[]}

View File

@@ -0,0 +1,205 @@
import findNumbers from './findNumbers.js';
import metadata from '../../metadata.max.json' with { type: 'json' };
describe('findNumbers', function () {
it('should find numbers', function () {
expect(findNumbers('2133734253', 'US', metadata)).to.deep.equal([{
phone: '2133734253',
country: 'US',
startsAt: 0,
endsAt: 10
}]);
expect(findNumbers('(213) 373-4253', 'US', metadata)).to.deep.equal([{
phone: '2133734253',
country: 'US',
startsAt: 0,
endsAt: 14
}]);
expect(findNumbers('The number is +7 (800) 555-35-35 and not (213) 373-4253 as written in the document.', 'US', metadata)).to.deep.equal([{
phone: '8005553535',
country: 'RU',
startsAt: 14,
endsAt: 32
}, {
phone: '2133734253',
country: 'US',
startsAt: 41,
endsAt: 55
}]);
// Opening parenthesis issue.
// https://github.com/catamphetamine/libphonenumber-js/issues/252
expect(findNumbers('The number is +7 (800) 555-35-35 and not (213) 373-4253 (that\'s not even in the same country!) as written in the document.', 'US', metadata)).to.deep.equal([{
phone: '8005553535',
country: 'RU',
startsAt: 14,
endsAt: 32
}, {
phone: '2133734253',
country: 'US',
startsAt: 41,
endsAt: 55
}]);
// No default country.
expect(findNumbers('The number is +7 (800) 555-35-35 as written in the document.', metadata)).to.deep.equal([{
phone: '8005553535',
country: 'RU',
startsAt: 14,
endsAt: 32
}]);
// Passing `options` and default country.
expect(findNumbers('The number is +7 (800) 555-35-35 as written in the document.', 'US', {
leniency: 'VALID'
}, metadata)).to.deep.equal([{
phone: '8005553535',
country: 'RU',
startsAt: 14,
endsAt: 32
}]);
// Passing `options`.
expect(findNumbers('The number is +7 (800) 555-35-35 as written in the document.', {
leniency: 'VALID'
}, metadata)).to.deep.equal([{
phone: '8005553535',
country: 'RU',
startsAt: 14,
endsAt: 32
}]);
// Not a phone number and a phone number.
expect(findNumbers('Digits 12 are not a number, but +7 (800) 555-35-35 is.', {
leniency: 'VALID'
}, metadata)).to.deep.equal([{
phone: '8005553535',
country: 'RU',
startsAt: 32,
endsAt: 50
}]);
// Phone number extension.
expect(findNumbers('Date 02/17/2018 is not a number, but +7 (800) 555-35-35 ext. 123 is.', {
leniency: 'VALID'
}, metadata)).to.deep.equal([{
phone: '8005553535',
country: 'RU',
ext: '123',
startsAt: 37,
endsAt: 64
}]);
});
it('should find numbers (v2)', function () {
var phoneNumbers = findNumbers('The number is +7 (800) 555-35-35 ext. 1234 and not (213) 373-4253 as written in the document.', 'US', {
v2: true
}, metadata);
expect(phoneNumbers.length).to.equal(2);
expect(phoneNumbers[0].startsAt).to.equal(14);
expect(phoneNumbers[0].endsAt).to.equal(42);
expect(phoneNumbers[0].number.number).to.equal('+78005553535');
expect(phoneNumbers[0].number.nationalNumber).to.equal('8005553535');
expect(phoneNumbers[0].number.country).to.equal('RU');
expect(phoneNumbers[0].number.countryCallingCode).to.equal('7');
expect(phoneNumbers[0].number.ext).to.equal('1234');
expect(phoneNumbers[1].startsAt).to.equal(51);
expect(phoneNumbers[1].endsAt).to.equal(65);
expect(phoneNumbers[1].number.number).to.equal('+12133734253');
expect(phoneNumbers[1].number.nationalNumber).to.equal('2133734253');
expect(phoneNumbers[1].number.country).to.equal('US');
expect(phoneNumbers[1].number.countryCallingCode).to.equal('1');
});
it('shouldn\'t find non-valid numbers', function () {
// Not a valid phone number for US.
expect(findNumbers('1111111111', 'US', metadata)).to.deep.equal([]);
});
it('should find non-European digits', function () {
// E.g. in Iraq they don't write `+442323234` but rather `+٤٤٢٣٢٣٢٣٤`.
expect(findNumbers('العَرَبِيَّة‎ +٤٤٣٣٣٣٣٣٣٣٣٣عَرَبِيّ‎', metadata)).to.deep.equal([{
country: 'GB',
phone: '3333333333',
startsAt: 14,
endsAt: 27
}]);
});
it('should work in edge cases', function () {
var thrower;
// No input
expect(findNumbers('', metadata)).to.deep.equal([]);
// // No country metadata for this `require` country code
// thrower = () => findNumbers('123', 'ZZ', metadata)
// thrower.should.throw('Unknown country')
// Numerical `value`
thrower = function thrower() {
return findNumbers(2141111111, 'US');
};
expect(thrower).to["throw"]('A text for parsing must be a string.');
// // No metadata
// thrower = () => findNumbers('')
// thrower.should.throw('`metadata` argument not passed')
// No metadata, no default country, no phone numbers.
expect(findNumbers('')).to.deep.equal([]);
});
it('should find international numbers when passed a non-existent default country', function () {
var numbers = findNumbers('Phone: +7 (800) 555 35 35. National: 8 (800) 555-55-55', {
defaultCountry: 'XX',
v2: true
}, metadata);
expect(numbers.length).to.equal(1);
expect(numbers[0].number.nationalNumber).to.equal('8005553535');
});
it('shouldn\'t find phone numbers which are not phone numbers', function () {
// A timestamp.
expect(findNumbers('2012-01-02 08:00', 'US', metadata)).to.deep.equal([]);
// A valid number (not a complete timestamp).
expect(findNumbers('2012-01-02 08', 'US', metadata)).to.deep.equal([{
country: 'US',
phone: '2012010208',
startsAt: 0,
endsAt: 13
}]);
// Invalid parens.
expect(findNumbers('213(3734253', 'US', metadata)).to.deep.equal([]);
// Letters after phone number.
expect(findNumbers('2133734253a', 'US', metadata)).to.deep.equal([]);
// Valid phone (same as the one found in the UUID below).
expect(findNumbers('The phone number is 231354125.', 'FR', metadata)).to.deep.equal([{
country: 'FR',
phone: '231354125',
startsAt: 20,
endsAt: 29
}]);
// Not a phone number (part of a UUID).
// Should parse in `{ extended: true }` mode.
var possibleNumbers = findNumbers('The UUID is CA801c26f98cd16e231354125ad046e40b.', 'FR', {
extended: true
}, metadata);
expect(possibleNumbers.length).to.equal(1);
expect(possibleNumbers[0].country).to.equal('FR');
expect(possibleNumbers[0].phone).to.equal('231354125');
// Not a phone number (part of a UUID).
// Shouldn't parse by default.
expect(findNumbers('The UUID is CA801c26f98cd16e231354125ad046e40b.', 'FR', metadata)).to.deep.equal([]);
});
// https://gitlab.com/catamphetamine/libphonenumber-js/-/merge_requests/4
it('should return correct `startsAt` and `endsAt` when matching "inner" candidates in a could-be-a-candidate substring', function () {
expect(findNumbers('39945926 77200596 16533084', 'ID', metadata)).to.deep.equal([{
country: 'ID',
phone: '77200596',
startsAt: 9,
endsAt: 17
}]);
});
});
//# sourceMappingURL=findNumbers.test.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,24 @@
// This is a legacy function.
// Use `findNumbers()` instead.
import _findPhoneNumbers, { searchPhoneNumbers as _searchPhoneNumbers } from './findPhoneNumbersInitialImplementation.js';
import normalizeArguments from '../normalizeArguments.js';
export default function findPhoneNumbers() {
var _normalizeArguments = normalizeArguments(arguments),
text = _normalizeArguments.text,
options = _normalizeArguments.options,
metadata = _normalizeArguments.metadata;
return _findPhoneNumbers(text, options, metadata);
}
/**
* @return ES6 `for ... of` iterator.
*/
export function searchPhoneNumbers() {
var _normalizeArguments2 = normalizeArguments(arguments),
text = _normalizeArguments2.text,
options = _normalizeArguments2.options,
metadata = _normalizeArguments2.metadata;
return _searchPhoneNumbers(text, options, metadata);
}
//# sourceMappingURL=findPhoneNumbers.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"findPhoneNumbers.js","names":["_findPhoneNumbers","searchPhoneNumbers","_searchPhoneNumbers","normalizeArguments","findPhoneNumbers","_normalizeArguments","arguments","text","options","metadata","_normalizeArguments2"],"sources":["../../source/legacy/findPhoneNumbers.js"],"sourcesContent":["// This is a legacy function.\r\n// Use `findNumbers()` instead.\r\n\r\nimport _findPhoneNumbers, { searchPhoneNumbers as _searchPhoneNumbers } from './findPhoneNumbersInitialImplementation.js'\r\nimport normalizeArguments from '../normalizeArguments.js'\r\n\r\nexport default function findPhoneNumbers()\r\n{\r\n\tconst { text, options, metadata } = normalizeArguments(arguments)\r\n\treturn _findPhoneNumbers(text, options, metadata)\r\n}\r\n\r\n/**\r\n * @return ES6 `for ... of` iterator.\r\n */\r\nexport function searchPhoneNumbers()\r\n{\r\n\tconst { text, options, metadata } = normalizeArguments(arguments)\r\n\treturn _searchPhoneNumbers(text, options, metadata)\r\n}"],"mappings":"AAAA;AACA;;AAEA,OAAOA,iBAAiB,IAAIC,kBAAkB,IAAIC,mBAAmB,QAAQ,4CAA4C;AACzH,OAAOC,kBAAkB,MAAM,0BAA0B;AAEzD,eAAe,SAASC,gBAAgBA,CAAA,EACxC;EACC,IAAAC,mBAAA,GAAoCF,kBAAkB,CAACG,SAAS,CAAC;IAAzDC,IAAI,GAAAF,mBAAA,CAAJE,IAAI;IAAEC,OAAO,GAAAH,mBAAA,CAAPG,OAAO;IAAEC,QAAQ,GAAAJ,mBAAA,CAARI,QAAQ;EAC/B,OAAOT,iBAAiB,CAACO,IAAI,EAAEC,OAAO,EAAEC,QAAQ,CAAC;AAClD;;AAEA;AACA;AACA;AACA,OAAO,SAASR,kBAAkBA,CAAA,EAClC;EACC,IAAAS,oBAAA,GAAoCP,kBAAkB,CAACG,SAAS,CAAC;IAAzDC,IAAI,GAAAG,oBAAA,CAAJH,IAAI;IAAEC,OAAO,GAAAE,oBAAA,CAAPF,OAAO;IAAEC,QAAQ,GAAAC,oBAAA,CAARD,QAAQ;EAC/B,OAAOP,mBAAmB,CAACK,IAAI,EAAEC,OAAO,EAAEC,QAAQ,CAAC;AACpD","ignoreList":[]}

View File

@@ -0,0 +1,240 @@
function _createForOfIteratorHelperLoose(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (t) return (t = t.call(r)).next.bind(t); if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var o = 0; return function () { return o >= r.length ? { done: !0 } : { done: !1, value: r[o++] }; }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
// This is a legacy function.
// Use `findNumbers()` instead.
import findNumbers, { searchPhoneNumbers } from './findPhoneNumbers.js';
import PhoneNumberSearch from './PhoneNumberSearch.js';
import metadata from '../../metadata.min.json' with { type: 'json' };
describe('findPhoneNumbers', function () {
it('should find numbers', function () {
expect(findNumbers('2133734253', 'US', metadata)).to.deep.equal([{
phone: '2133734253',
country: 'US',
startsAt: 0,
endsAt: 10
}]);
expect(findNumbers('(213) 373-4253', 'US', metadata)).to.deep.equal([{
phone: '2133734253',
country: 'US',
startsAt: 0,
endsAt: 14
}]);
expect(findNumbers('The number is +7 (800) 555-35-35 and not (213) 373-4253 as written in the document.', 'US', metadata)).to.deep.equal([{
phone: '8005553535',
country: 'RU',
startsAt: 14,
endsAt: 32
}, {
phone: '2133734253',
country: 'US',
startsAt: 41,
endsAt: 55
}]);
// Opening parenthesis issue.
// https://github.com/catamphetamine/libphonenumber-js/issues/252
expect(findNumbers('The number is +7 (800) 555-35-35 and not (213) 373-4253 (that\'s not even in the same country!) as written in the document.', 'US', metadata)).to.deep.equal([{
phone: '8005553535',
country: 'RU',
startsAt: 14,
endsAt: 32
}, {
phone: '2133734253',
country: 'US',
startsAt: 41,
endsAt: 55
}]);
// No default country.
expect(findNumbers('The number is +7 (800) 555-35-35 as written in the document.', metadata)).to.deep.equal([{
phone: '8005553535',
country: 'RU',
startsAt: 14,
endsAt: 32
}]);
// Passing `options` and default country.
expect(findNumbers('The number is +7 (800) 555-35-35 as written in the document.', 'US', {
leniency: 'VALID'
}, metadata)).to.deep.equal([{
phone: '8005553535',
country: 'RU',
startsAt: 14,
endsAt: 32
}]);
// Passing `options`.
expect(findNumbers('The number is +7 (800) 555-35-35 as written in the document.', {
leniency: 'VALID'
}, metadata)).to.deep.equal([{
phone: '8005553535',
country: 'RU',
startsAt: 14,
endsAt: 32
}]);
// Not a phone number and a phone number.
expect(findNumbers('Digits 12 are not a number, but +7 (800) 555-35-35 is.', {
leniency: 'VALID'
}, metadata)).to.deep.equal([{
phone: '8005553535',
country: 'RU',
startsAt: 32,
endsAt: 50
}]);
// Phone number extension.
expect(findNumbers('Date 02/17/2018 is not a number, but +7 (800) 555-35-35 ext. 123 is.', {
leniency: 'VALID'
}, metadata)).to.deep.equal([{
phone: '8005553535',
country: 'RU',
ext: '123',
startsAt: 37,
endsAt: 64
}]);
});
it('shouldn\'t find non-valid numbers', function () {
// Not a valid phone number for US.
expect(findNumbers('1111111111', 'US', metadata)).to.deep.equal([]);
});
it('should find non-European digits', function () {
// E.g. in Iraq they don't write `+442323234` but rather `+٤٤٢٣٢٣٢٣٤`.
expect(findNumbers('العَرَبِيَّة‎ +٤٤٣٣٣٣٣٣٣٣٣٣عَرَبِيّ‎', metadata)).to.deep.equal([{
country: 'GB',
phone: '3333333333',
startsAt: 14,
endsAt: 27
}]);
});
it('should iterate', function () {
var expected_numbers = [{
country: 'RU',
phone: '8005553535',
// number : '+7 (800) 555-35-35',
startsAt: 14,
endsAt: 32
}, {
country: 'US',
phone: '2133734253',
// number : '(213) 373-4253',
startsAt: 41,
endsAt: 55
}];
for (var _iterator = _createForOfIteratorHelperLoose(searchPhoneNumbers('The number is +7 (800) 555-35-35 and not (213) 373-4253 as written in the document.', 'US', metadata)), _step; !(_step = _iterator()).done;) {
var number = _step.value;
expect(number).to.deep.equal(expected_numbers.shift());
}
expect(expected_numbers.length).to.equal(0);
});
it('should work in edge cases', function () {
var thrower;
// No input
expect(findNumbers('', metadata)).to.deep.equal([]);
// No country metadata for this `require` country code
thrower = function thrower() {
return findNumbers('123', 'ZZ', metadata);
};
expect(thrower).to["throw"]('Unknown country');
// Numerical `value`
thrower = function thrower() {
return findNumbers(2141111111, 'US');
};
expect(thrower).to["throw"]('A text for parsing must be a string.');
// // No metadata
// thrower = () => findNumbers('')
// thrower.should.throw('`metadata` argument not passed')
});
it('shouldn\'t find phone numbers which are not phone numbers', function () {
// A timestamp.
expect(findNumbers('2012-01-02 08:00', 'US', metadata)).to.deep.equal([]);
// A valid number (not a complete timestamp).
expect(findNumbers('2012-01-02 08', 'US', metadata)).to.deep.equal([{
country: 'US',
phone: '2012010208',
startsAt: 0,
endsAt: 13
}]);
// Invalid parens.
expect(findNumbers('213(3734253', 'US', metadata)).to.deep.equal([]);
// Letters after phone number.
expect(findNumbers('2133734253a', 'US', metadata)).to.deep.equal([]);
// Valid phone (same as the one found in the UUID below).
expect(findNumbers('The phone number is 231354125.', 'FR', metadata)).to.deep.equal([{
country: 'FR',
phone: '231354125',
startsAt: 20,
endsAt: 29
}]);
// Not a phone number (part of a UUID).
// Should parse in `{ extended: true }` mode.
var possibleNumbers = findNumbers('The UUID is CA801c26f98cd16e231354125ad046e40b.', 'FR', {
extended: true
}, metadata);
expect(possibleNumbers.length).to.equal(3);
expect(possibleNumbers[1].country).to.equal('FR');
expect(possibleNumbers[1].phone).to.equal('231354125');
// Not a phone number (part of a UUID).
// Shouldn't parse by default.
expect(findNumbers('The UUID is CA801c26f98cd16e231354125ad046e40b.', 'FR', metadata)).to.deep.equal([]);
});
});
describe('PhoneNumberSearch', function () {
it('should search for phone numbers', function () {
var finder = new PhoneNumberSearch('The number is +7 (800) 555-35-35 and not (213) 373-4253 as written in the document.', {
defaultCountry: 'US'
}, metadata);
expect(finder.hasNext()).to.equal(true);
expect(finder.next()).to.deep.equal({
country: 'RU',
phone: '8005553535',
// number : '+7 (800) 555-35-35',
startsAt: 14,
endsAt: 32
});
expect(finder.hasNext()).to.equal(true);
expect(finder.next()).to.deep.equal({
country: 'US',
phone: '2133734253',
// number : '(213) 373-4253',
startsAt: 41,
endsAt: 55
});
expect(finder.hasNext()).to.equal(false);
});
it('should search for phone numbers (no options)', function () {
var finder = new PhoneNumberSearch('The number is +7 (800) 555-35-35', undefined, metadata);
expect(finder.hasNext()).to.equal(true);
expect(finder.next()).to.deep.equal({
country: 'RU',
phone: '8005553535',
// number : '+7 (800) 555-35-35',
startsAt: 14,
endsAt: 32
});
expect(finder.hasNext()).to.equal(false);
});
it('should work in edge cases', function () {
// No options
var search = new PhoneNumberSearch('', undefined, metadata);
// No next element
var thrower = function thrower() {
return search.next();
};
expect(thrower).to["throw"]('No next element');
});
});
//# sourceMappingURL=findPhoneNumbers.test.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,79 @@
// This is a legacy function.
// Use `findNumbers()` instead.
import createExtensionPattern from '../helpers/extension/createExtensionPattern.js';
import PhoneNumberSearch from './PhoneNumberSearch.js';
/**
* Regexp of all possible ways to write extensions, for use when parsing. This
* will be run as a case-insensitive regexp match. Wide character versions are
* also provided after each ASCII version. There are three regular expressions
* here. The first covers RFC 3966 format, where the extension is added using
* ';ext='. The second more generic one starts with optional white space and
* ends with an optional full stop (.), followed by zero or more spaces/tabs
* /commas and then the numbers themselves. The other one covers the special
* case of American numbers where the extension is written with a hash at the
* end, such as '- 503#'. Note that the only capturing groups should be around
* the digits that you want to capture as part of the extension, or else parsing
* will fail! We allow two options for representing the accented o - the
* character itself, and one in the unicode decomposed form with the combining
* acute accent.
*/
export var EXTN_PATTERNS_FOR_PARSING = createExtensionPattern('parsing');
// // Regular expression for getting opening brackets for a valid number
// // found using `PHONE_NUMBER_START_PATTERN` for prepending those brackets to the number.
// const BEFORE_NUMBER_DIGITS_PUNCTUATION = new RegExp('[' + OPENING_BRACKETS + ']+' + '[' + WHITESPACE + ']*' + '$')
// const VALID_PRECEDING_CHARACTER_PATTERN = /[^a-zA-Z0-9]/
export default function findPhoneNumbers(text, options, metadata) {
/* istanbul ignore if */
if (options === undefined) {
options = {};
}
var search = new PhoneNumberSearch(text, options, metadata);
var phones = [];
while (search.hasNext()) {
phones.push(search.next());
}
return phones;
}
/**
* @return ES6 `for ... of` iterator.
*/
export function searchPhoneNumbers(text, options, metadata) {
/* istanbul ignore if */
if (options === undefined) {
options = {};
}
var search = new PhoneNumberSearch(text, options, metadata);
var iterator = function iterator() {
return {
next: function next() {
if (search.hasNext()) {
return {
done: false,
value: search.next()
};
}
return {
done: true
};
}
};
};
// This line of code didn't really work with `babel`/`istanbul`:
// for some weird reason, it showed code coverage less than 100%.
// That's because `babel`/`istanbul`, for some weird reason,
// apparently doesn't know how to properly exclude Babel polyfills from code coverage.
//
// const iterable = { [Symbol.iterator]: iterator }
var iterable = {};
iterable[Symbol.iterator] = iterator;
return iterable;
}
//# sourceMappingURL=findPhoneNumbersInitialImplementation.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"findPhoneNumbersInitialImplementation.js","names":["createExtensionPattern","PhoneNumberSearch","EXTN_PATTERNS_FOR_PARSING","findPhoneNumbers","text","options","metadata","undefined","search","phones","hasNext","push","next","searchPhoneNumbers","iterator","done","value","iterable","Symbol"],"sources":["../../source/legacy/findPhoneNumbersInitialImplementation.js"],"sourcesContent":["// This is a legacy function.\r\n// Use `findNumbers()` instead.\r\n\r\nimport createExtensionPattern from '../helpers/extension/createExtensionPattern.js'\r\n\r\nimport PhoneNumberSearch from './PhoneNumberSearch.js'\r\n\r\n/**\r\n * Regexp of all possible ways to write extensions, for use when parsing. This\r\n * will be run as a case-insensitive regexp match. Wide character versions are\r\n * also provided after each ASCII version. There are three regular expressions\r\n * here. The first covers RFC 3966 format, where the extension is added using\r\n * ';ext='. The second more generic one starts with optional white space and\r\n * ends with an optional full stop (.), followed by zero or more spaces/tabs\r\n * /commas and then the numbers themselves. The other one covers the special\r\n * case of American numbers where the extension is written with a hash at the\r\n * end, such as '- 503#'. Note that the only capturing groups should be around\r\n * the digits that you want to capture as part of the extension, or else parsing\r\n * will fail! We allow two options for representing the accented o - the\r\n * character itself, and one in the unicode decomposed form with the combining\r\n * acute accent.\r\n */\r\nexport const EXTN_PATTERNS_FOR_PARSING = createExtensionPattern('parsing')\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\n// const VALID_PRECEDING_CHARACTER_PATTERN = /[^a-zA-Z0-9]/\r\n\r\nexport default function findPhoneNumbers(text, options, metadata) {\r\n\t/* istanbul ignore if */\r\n\tif (options === undefined) {\r\n\t\toptions = {}\r\n\t}\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\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\tconst iterator = () => {\r\n\t\treturn {\r\n\t\t\tnext: () => {\r\n\t\t\t\tif (search.hasNext()) {\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\tdone: false,\r\n\t\t\t\t\t\tvalue: search.next()\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn {\r\n\t\t\t\t\tdone: true\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// This line of code didn't really work with `babel`/`istanbul`:\r\n\t// for some weird reason, it showed code coverage less than 100%.\r\n\t// That's because `babel`/`istanbul`, for some weird reason,\r\n\t// apparently doesn't know how to properly exclude Babel polyfills from code coverage.\r\n\t//\r\n\t// const iterable = { [Symbol.iterator]: iterator }\r\n\r\n\tconst iterable = {}\r\n\titerable[Symbol.iterator] = iterator\r\n\treturn iterable\r\n}\r\n"],"mappings":"AAAA;AACA;;AAEA,OAAOA,sBAAsB,MAAM,gDAAgD;AAEnF,OAAOC,iBAAiB,MAAM,wBAAwB;;AAEtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,IAAMC,yBAAyB,GAAGF,sBAAsB,CAAC,SAAS,CAAC;;AAE1E;AACA;AACA;;AAEA;;AAEA,eAAe,SAASG,gBAAgBA,CAACC,IAAI,EAAEC,OAAO,EAAEC,QAAQ,EAAE;EACjE;EACA,IAAID,OAAO,KAAKE,SAAS,EAAE;IAC1BF,OAAO,GAAG,CAAC,CAAC;EACb;EACA,IAAMG,MAAM,GAAG,IAAIP,iBAAiB,CAACG,IAAI,EAAEC,OAAO,EAAEC,QAAQ,CAAC;EAC7D,IAAMG,MAAM,GAAG,EAAE;EACjB,OAAOD,MAAM,CAACE,OAAO,CAAC,CAAC,EAAE;IACxBD,MAAM,CAACE,IAAI,CAACH,MAAM,CAACI,IAAI,CAAC,CAAC,CAAC;EAC3B;EACA,OAAOH,MAAM;AACd;;AAEA;AACA;AACA;AACA,OAAO,SAASI,kBAAkBA,CAACT,IAAI,EAAEC,OAAO,EAAEC,QAAQ,EAAE;EAC3D;EACA,IAAID,OAAO,KAAKE,SAAS,EAAE;IAC1BF,OAAO,GAAG,CAAC,CAAC;EACb;EAEA,IAAMG,MAAM,GAAG,IAAIP,iBAAiB,CAACG,IAAI,EAAEC,OAAO,EAAEC,QAAQ,CAAC;EAE7D,IAAMQ,QAAQ,GAAG,SAAXA,QAAQA,CAAA,EAAS;IACtB,OAAO;MACNF,IAAI,EAAE,SAANA,IAAIA,CAAA,EAAQ;QACX,IAAIJ,MAAM,CAACE,OAAO,CAAC,CAAC,EAAE;UACrB,OAAO;YACNK,IAAI,EAAE,KAAK;YACXC,KAAK,EAAER,MAAM,CAACI,IAAI,CAAC;UACpB,CAAC;QACF;QACA,OAAO;UACNG,IAAI,EAAE;QACP,CAAC;MACF;IACD,CAAC;EACF,CAAC;;EAED;EACA;EACA;EACA;EACA;EACA;;EAEA,IAAME,QAAQ,GAAG,CAAC,CAAC;EACnBA,QAAQ,CAACC,MAAM,CAACJ,QAAQ,CAAC,GAAGA,QAAQ;EACpC,OAAOG,QAAQ;AAChB","ignoreList":[]}

View File

@@ -0,0 +1,96 @@
import _formatNumber from '../format.js';
import parse from '../parse.js';
import isObject from '../helpers/isObject.js';
export default function formatNumber() {
var _normalizeArguments = normalizeArguments(arguments),
input = _normalizeArguments.input,
format = _normalizeArguments.format,
options = _normalizeArguments.options,
metadata = _normalizeArguments.metadata;
return _formatNumber(input, format, options, metadata);
}
// Sort out arguments
function normalizeArguments(args) {
// This line of code appeared to not work correctly with `babel`/`istanbul`:
// for some weird reason, it caused coverage less than 100%.
// That's because `babel`/`istanbul`, for some weird reason,
// apparently doesn't know how to properly exclude Babel polyfills from code coverage.
//
// const [arg_1, arg_2, arg_3, arg_4, arg_5] = Array.prototype.slice.call(args)
var arg_1 = args[0];
var arg_2 = args[1];
var arg_3 = args[2];
var arg_4 = args[3];
var arg_5 = args[4];
var input;
var format;
var options;
var metadata;
// Sort out arguments.
// If the phone number is passed as a string.
// `format('8005553535', ...)`.
if (typeof arg_1 === 'string') {
// If country code is supplied.
// `format('8005553535', 'RU', 'NATIONAL', [options], metadata)`.
if (typeof arg_3 === 'string') {
format = arg_3;
if (arg_5) {
options = arg_4;
metadata = arg_5;
} else {
metadata = arg_4;
}
input = parse(arg_1, {
defaultCountry: arg_2,
extended: true
}, metadata);
}
// Just an international phone number is supplied
// `format('+78005553535', 'NATIONAL', [options], metadata)`.
else {
if (typeof arg_2 !== 'string') {
throw new Error('`format` argument not passed to `formatNumber(number, format)`');
}
format = arg_2;
if (arg_4) {
options = arg_3;
metadata = arg_4;
} else {
metadata = arg_3;
}
input = parse(arg_1, {
extended: true
}, metadata);
}
}
// If the phone number is passed as a parsed number object.
// `format({ phone: '8005553535', country: 'RU' }, 'NATIONAL', [options], metadata)`.
else if (isObject(arg_1)) {
input = arg_1;
format = arg_2;
if (arg_4) {
options = arg_3;
metadata = arg_4;
} else {
metadata = arg_3;
}
} else throw new TypeError('A phone number must either be a string or an object of shape { phone, [country] }.');
// Legacy lowercase formats.
if (format === 'International') {
format = 'INTERNATIONAL';
} else if (format === 'National') {
format = 'NATIONAL';
}
return {
input: input,
format: format,
options: options,
metadata: metadata
};
}
//# sourceMappingURL=format.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,294 @@
import metadata from '../../metadata.min.json' with { type: 'json' };
import _formatNumber from './format.js';
function formatNumber() {
for (var _len = arguments.length, parameters = new Array(_len), _key = 0; _key < _len; _key++) {
parameters[_key] = arguments[_key];
}
parameters.push(metadata);
return _formatNumber.apply(this, parameters);
}
describe('format', function () {
it('should work with the first argument being a E.164 number', function () {
expect(formatNumber('+12133734253', 'NATIONAL')).to.equal('(213) 373-4253');
expect(formatNumber('+12133734253', 'INTERNATIONAL')).to.equal('+1 213 373 4253');
// Invalid number.
expect(formatNumber('+12111111111', 'NATIONAL')).to.equal('(211) 111-1111');
// Formatting invalid E.164 numbers.
expect(formatNumber('+11111', 'INTERNATIONAL')).to.equal('+1 1111');
expect(formatNumber('+11111', 'NATIONAL')).to.equal('1111');
});
it('should work with the first object argument expanded', function () {
expect(formatNumber('2133734253', 'US', 'NATIONAL')).to.equal('(213) 373-4253');
expect(formatNumber('2133734253', 'US', 'INTERNATIONAL')).to.equal('+1 213 373 4253');
});
it('should support legacy "National" / "International" formats', function () {
expect(formatNumber('2133734253', 'US', 'National')).to.equal('(213) 373-4253');
expect(formatNumber('2133734253', 'US', 'International')).to.equal('+1 213 373 4253');
});
it('should format using formats with no leading digits (`format.leadingDigitsPatterns().length === 0`)', function () {
expect(formatNumber({
phone: '12345678901',
countryCallingCode: 888
}, 'INTERNATIONAL')).to.equal('+888 123 456 78901');
});
it('should sort out the arguments', function () {
var options = {
formatExtension: function formatExtension(number, extension) {
return "".concat(number, " \u0434\u043E\u0431. ").concat(extension);
}
};
expect(formatNumber({
phone: '8005553535',
country: 'RU',
ext: '123'
}, 'NATIONAL', options)).to.equal('8 (800) 555-35-35 доб. 123');
// Parse number from string.
expect(formatNumber('+78005553535', 'NATIONAL', options)).to.equal('8 (800) 555-35-35');
expect(formatNumber('8005553535', 'RU', 'NATIONAL', options)).to.equal('8 (800) 555-35-35');
});
it('should format with national prefix when specifically instructed', function () {
// With national prefix.
expect(formatNumber('88005553535', 'RU', 'NATIONAL')).to.equal('8 (800) 555-35-35');
// Without national prefix via an explicitly set option.
expect(formatNumber('88005553535', 'RU', 'NATIONAL', {
nationalPrefix: false
})).to.equal('800 555-35-35');
});
it('should format valid phone numbers', function () {
// Switzerland
expect(formatNumber({
country: 'CH',
phone: '446681800'
}, 'INTERNATIONAL')).to.equal('+41 44 668 18 00');
expect(formatNumber({
country: 'CH',
phone: '446681800'
}, 'E.164')).to.equal('+41446681800');
expect(formatNumber({
country: 'CH',
phone: '446681800'
}, 'RFC3966')).to.equal('tel:+41446681800');
expect(formatNumber({
country: 'CH',
phone: '446681800'
}, 'NATIONAL')).to.equal('044 668 18 00');
// France
expect(formatNumber({
country: 'FR',
phone: '169454850'
}, 'NATIONAL')).to.equal('01 69 45 48 50');
// Kazakhstan
expect(formatNumber('+7 702 211 1111', 'NATIONAL')).to.equal('8 (702) 211 1111');
});
it('should format national numbers with national prefix even if it\'s optional', function () {
// Russia
expect(formatNumber({
country: 'RU',
phone: '9991234567'
}, 'NATIONAL')).to.equal('8 (999) 123-45-67');
});
it('should work in edge cases', function () {
var thrower;
// No phone number
expect(formatNumber('', 'RU', 'INTERNATIONAL')).to.equal('');
expect(formatNumber('', 'RU', 'NATIONAL')).to.equal('');
expect(formatNumber({
country: 'RU',
phone: ''
}, 'INTERNATIONAL')).to.equal('+7');
expect(formatNumber({
country: 'RU',
phone: ''
}, 'NATIONAL')).to.equal('');
// No suitable format
expect(formatNumber('+121337342530', 'US', 'NATIONAL')).to.equal('21337342530');
// No suitable format (leading digits mismatch)
expect(formatNumber('28199999', 'AD', 'NATIONAL')).to.equal('28199999');
// Numerical `value`
thrower = function thrower() {
return formatNumber(89150000000, 'RU', 'NATIONAL');
};
expect(thrower).to["throw"]('A phone number must either be a string or an object of shape { phone, [country] }.');
// No metadata for country
expect(function () {
return formatNumber('+121337342530', 'USA', 'NATIONAL');
}).to["throw"]('Unknown country');
expect(function () {
return formatNumber('21337342530', 'USA', 'NATIONAL');
}).to["throw"]('Unknown country');
// No format type
thrower = function thrower() {
return formatNumber('+123');
};
expect(thrower).to["throw"]('`format` argument not passed');
// Unknown format type
thrower = function thrower() {
return formatNumber('123', 'US', 'Gay');
};
expect(thrower).to["throw"]('Unknown "format" argument');
// No metadata
thrower = function thrower() {
return _formatNumber('123', 'US', 'E.164');
};
expect(thrower).to["throw"]('`metadata`');
// No formats
expect(formatNumber('012345', 'AC', 'NATIONAL')).to.equal('012345');
// No `fromCountry` for `IDD` format.
expect(formatNumber('+78005553535', 'IDD')).to.be.undefined;
// `fromCountry` has no default IDD prefix.
expect(formatNumber('+78005553535', 'IDD', {
fromCountry: 'BO'
})).to.be.undefined;
// No such country.
expect(function () {
return formatNumber({
phone: '123',
country: 'USA'
}, 'NATIONAL');
}).to["throw"]('Unknown country');
});
it('should format phone number extensions', function () {
// National
expect(formatNumber({
country: 'US',
phone: '2133734253',
ext: '123'
}, 'NATIONAL')).to.equal('(213) 373-4253 ext. 123');
// International
expect(formatNumber({
country: 'US',
phone: '2133734253',
ext: '123'
}, 'INTERNATIONAL')).to.equal('+1 213 373 4253 ext. 123');
// International
expect(formatNumber({
country: 'US',
phone: '2133734253',
ext: '123'
}, 'INTERNATIONAL')).to.equal('+1 213 373 4253 ext. 123');
// E.164
expect(formatNumber({
country: 'US',
phone: '2133734253',
ext: '123'
}, 'E.164')).to.equal('+12133734253');
// RFC3966
expect(formatNumber({
country: 'US',
phone: '2133734253',
ext: '123'
}, 'RFC3966')).to.equal('tel:+12133734253;ext=123');
// Custom ext prefix.
expect(formatNumber({
country: 'GB',
phone: '7912345678',
ext: '123'
}, 'INTERNATIONAL')).to.equal('+44 7912 345678 x123');
});
it('should work with Argentina numbers', function () {
// The same mobile number is written differently
// in different formats in Argentina:
// `9` gets prepended in international format.
expect(formatNumber({
country: 'AR',
phone: '3435551212'
}, 'INTERNATIONAL')).to.equal('+54 3435 55 1212');
expect(formatNumber({
country: 'AR',
phone: '3435551212'
}, 'NATIONAL')).to.equal('03435 55-1212');
});
it('should work with Mexico numbers', function () {
// Fixed line.
expect(formatNumber({
country: 'MX',
phone: '4499780001'
}, 'INTERNATIONAL')).to.equal('+52 449 978 0001');
expect(formatNumber({
country: 'MX',
phone: '4499780001'
}, 'NATIONAL')).to.equal('449 978 0001');
// or '(449)978-0001'.
// Mobile.
// `1` is prepended before area code to mobile numbers in international format.
expect(formatNumber({
country: 'MX',
phone: '3312345678'
}, 'INTERNATIONAL')).to.equal('+52 33 1234 5678');
expect(formatNumber({
country: 'MX',
phone: '3312345678'
}, 'NATIONAL')).to.equal('33 1234 5678');
// or '045 33 1234-5678'.
});
it('should format possible numbers', function () {
expect(formatNumber({
countryCallingCode: '7',
phone: '1111111111'
}, 'E.164')).to.equal('+71111111111');
expect(formatNumber({
countryCallingCode: '7',
phone: '1111111111'
}, 'NATIONAL')).to.equal('1111111111');
expect(formatNumber({
countryCallingCode: '7',
phone: '1111111111'
}, 'INTERNATIONAL')).to.equal('+7 1111111111');
});
it('should format IDD-prefixed number', function () {
// No `fromCountry`.
expect(formatNumber('+78005553535', 'IDD')).to.be.undefined;
// No default IDD prefix.
expect(formatNumber('+78005553535', 'IDD', {
fromCountry: 'BO'
})).to.be.undefined;
// Same country calling code.
expect(formatNumber('+12133734253', 'IDD', {
fromCountry: 'CA'
})).to.equal('1 (213) 373-4253');
expect(formatNumber('+78005553535', 'IDD', {
fromCountry: 'KZ'
})).to.equal('8 (800) 555-35-35');
// formatNumber('+78005553535', 'IDD', { fromCountry: 'US' }).should.equal('01178005553535')
expect(formatNumber('+78005553535', 'IDD', {
fromCountry: 'US'
})).to.equal('011 7 800 555 35 35');
});
it('should format non-geographic numbering plan phone numbers', function () {
// https://github.com/catamphetamine/libphonenumber-js/issues/323
expect(formatNumber('+870773111632', 'INTERNATIONAL')).to.equal('+870 773 111 632');
expect(formatNumber('+870773111632', 'NATIONAL')).to.equal('773 111 632');
});
it('should use the default IDD prefix when formatting a phone number', function () {
// Testing preferred international prefixes with ~ are supported.
// ("~" designates waiting on a line until proceeding with the input).
expect(formatNumber('+390236618300', 'IDD', {
fromCountry: 'BY'
})).to.equal('8~10 39 02 3661 8300');
});
});
//# sourceMappingURL=format.test.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,103 @@
import isViablePhoneNumber from '../helpers/isViablePhoneNumber.js';
import _getNumberType from '../helpers/getNumberType.js';
import isObject from '../helpers/isObject.js';
import parse from '../parse.js';
// Finds out national phone number type (fixed line, mobile, etc)
export default function getNumberType() {
var _normalizeArguments = normalizeArguments(arguments),
input = _normalizeArguments.input,
options = _normalizeArguments.options,
metadata = _normalizeArguments.metadata;
// `parseNumber()` would return `{}` when no phone number could be parsed from the input.
if (!input.phone) {
return;
}
return _getNumberType(input, options, metadata);
}
// Sort out arguments
export function normalizeArguments(args) {
// This line of code appeared to not work correctly with `babel`/`istanbul`:
// for some weird reason, it caused coverage less than 100%.
// That's because `babel`/`istanbul`, for some weird reason,
// apparently doesn't know how to properly exclude Babel polyfills from code coverage.
//
// const [arg_1, arg_2, arg_3, arg_4] = Array.prototype.slice.call(args)
var arg_1 = args[0];
var arg_2 = args[1];
var arg_3 = args[2];
var arg_4 = args[3];
var input;
var options = {};
var metadata;
// If the phone number is passed as a string.
// `getNumberType('88005553535', ...)`.
if (typeof arg_1 === 'string') {
// If "default country" argument is being passed
// then convert it to an `options` object.
// `getNumberType('88005553535', 'RU', metadata)`.
if (!isObject(arg_2)) {
if (arg_4) {
options = arg_3;
metadata = arg_4;
} else {
metadata = arg_3;
}
// `parse` extracts phone numbers from raw text,
// therefore it will cut off all "garbage" characters,
// while this `validate` function needs to verify
// that the phone number contains no "garbage"
// therefore the explicit `isViablePhoneNumber` check.
if (isViablePhoneNumber(arg_1)) {
input = parse(arg_1, {
defaultCountry: arg_2
}, metadata);
} else {
input = {};
}
}
// No "resrict country" argument is being passed.
// International phone number is passed.
// `getNumberType('+78005553535', metadata)`.
else {
if (arg_3) {
options = arg_2;
metadata = arg_3;
} else {
metadata = arg_2;
}
// `parse` extracts phone numbers from raw text,
// therefore it will cut off all "garbage" characters,
// while this `validate` function needs to verify
// that the phone number contains no "garbage"
// therefore the explicit `isViablePhoneNumber` check.
if (isViablePhoneNumber(arg_1)) {
input = parse(arg_1, undefined, metadata);
} else {
input = {};
}
}
}
// If the phone number is passed as a parsed phone number.
// `getNumberType({ phone: '88005553535', country: 'RU' }, ...)`.
else if (isObject(arg_1)) {
input = arg_1;
if (arg_3) {
options = arg_2;
metadata = arg_3;
} else {
metadata = arg_2;
}
} else throw new TypeError('A phone number must either be a string or an object of shape { phone, [country] }.');
return {
input: input,
options: options,
metadata: metadata
};
}
//# sourceMappingURL=getNumberType.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,75 @@
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
import metadata from '../../metadata.max.json' with { type: 'json' };
import Metadata from '../metadata.js';
import _getNumberType from './getNumberType.js';
function getNumberType() {
for (var _len = arguments.length, parameters = new Array(_len), _key = 0; _key < _len; _key++) {
parameters[_key] = arguments[_key];
}
parameters.push(metadata);
return _getNumberType.apply(this, parameters);
}
describe('getNumberType', function () {
it('should infer phone number type MOBILE', function () {
expect(getNumberType('9150000000', 'RU')).to.equal('MOBILE');
expect(getNumberType('7912345678', 'GB')).to.equal('MOBILE');
expect(getNumberType('51234567', 'EE')).to.equal('MOBILE');
});
it('should infer phone number types', function () {
expect(getNumberType('88005553535', 'RU')).to.equal('TOLL_FREE');
expect(getNumberType('8005553535', 'RU')).to.equal('TOLL_FREE');
expect(getNumberType('4957777777', 'RU')).to.equal('FIXED_LINE');
expect(getNumberType('8030000000', 'RU')).to.equal('PREMIUM_RATE');
expect(getNumberType('2133734253', 'US')).to.equal('FIXED_LINE_OR_MOBILE');
expect(getNumberType('5002345678', 'US')).to.equal('PERSONAL_NUMBER');
});
it('should work when no country is passed', function () {
expect(getNumberType('+79150000000')).to.equal('MOBILE');
});
it('should return FIXED_LINE_OR_MOBILE when there is ambiguity', function () {
// (no such country in the metadata, therefore no unit test for this `if`)
});
it('should work in edge cases', function () {
var thrower;
// // No metadata
// thrower = () => _getNumberType({ phone: '+78005553535' })
// thrower.should.throw('`metadata` argument not passed')
// Parsed phone number
expect(getNumberType({
phone: '8005553535',
country: 'RU'
})).to.equal('TOLL_FREE');
// Invalid phone number
expect(type(getNumberType('123', 'RU'))).to.equal('undefined');
// Invalid country
thrower = function thrower() {
return getNumberType({
phone: '8005553535',
country: 'RUS'
});
};
expect(thrower).to["throw"]('Unknown country');
// Numerical `value`
thrower = function thrower() {
return getNumberType(89150000000, 'RU');
};
expect(thrower).to["throw"]('A phone number must either be a string or an object of shape { phone, [country] }.');
// When `options` argument is passed.
expect(getNumberType('8005553535', 'RU', {})).to.equal('TOLL_FREE');
expect(getNumberType('+78005553535', {})).to.equal('TOLL_FREE');
expect(getNumberType({
phone: '8005553535',
country: 'RU'
}, {})).to.equal('TOLL_FREE');
});
});
function type(something) {
return _typeof(something);
}
//# sourceMappingURL=getNumberType.test.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,29 @@
import { normalizeArguments } from './getNumberType.js';
import _isPossibleNumber from '../isPossible.js';
/**
* Checks if a given phone number is possible.
* Which means it only checks phone number length
* and doesn't test any regular expressions.
*
* Examples:
*
* ```js
* isPossibleNumber('+78005553535', metadata)
* isPossibleNumber('8005553535', 'RU', metadata)
* isPossibleNumber('88005553535', 'RU', metadata)
* isPossibleNumber({ phone: '8005553535', country: 'RU' }, metadata)
* ```
*/
export default function isPossibleNumber() {
var _normalizeArguments = normalizeArguments(arguments),
input = _normalizeArguments.input,
options = _normalizeArguments.options,
metadata = _normalizeArguments.metadata;
// `parseNumber()` would return `{}` when no phone number could be parsed from the input.
if (!input.phone && !(options && options.v2)) {
return false;
}
return _isPossibleNumber(input, options, metadata);
}
//# sourceMappingURL=isPossibleNumber.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"isPossibleNumber.js","names":["normalizeArguments","_isPossibleNumber","isPossibleNumber","_normalizeArguments","arguments","input","options","metadata","phone","v2"],"sources":["../../source/legacy/isPossibleNumber.js"],"sourcesContent":["import { normalizeArguments } from './getNumberType.js'\r\nimport _isPossibleNumber from '../isPossible.js'\r\n\r\n/**\r\n * Checks if a given phone number is possible.\r\n * Which means it only checks phone number length\r\n * and doesn't test any regular expressions.\r\n *\r\n * Examples:\r\n *\r\n * ```js\r\n * isPossibleNumber('+78005553535', metadata)\r\n * isPossibleNumber('8005553535', 'RU', metadata)\r\n * isPossibleNumber('88005553535', 'RU', metadata)\r\n * isPossibleNumber({ phone: '8005553535', country: 'RU' }, metadata)\r\n * ```\r\n */\r\nexport default function isPossibleNumber() {\r\n\tconst { input, options, metadata } = normalizeArguments(arguments)\r\n\t// `parseNumber()` would return `{}` when no phone number could be parsed from the input.\r\n\tif (!input.phone && !(options && options.v2)) {\r\n\t\treturn false\r\n\t}\r\n\treturn _isPossibleNumber(input, options, metadata)\r\n}"],"mappings":"AAAA,SAASA,kBAAkB,QAAQ,oBAAoB;AACvD,OAAOC,iBAAiB,MAAM,kBAAkB;;AAEhD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,SAASC,gBAAgBA,CAAA,EAAG;EAC1C,IAAAC,mBAAA,GAAqCH,kBAAkB,CAACI,SAAS,CAAC;IAA1DC,KAAK,GAAAF,mBAAA,CAALE,KAAK;IAAEC,OAAO,GAAAH,mBAAA,CAAPG,OAAO;IAAEC,QAAQ,GAAAJ,mBAAA,CAARI,QAAQ;EAChC;EACA,IAAI,CAACF,KAAK,CAACG,KAAK,IAAI,EAAEF,OAAO,IAAIA,OAAO,CAACG,EAAE,CAAC,EAAE;IAC7C,OAAO,KAAK;EACb;EACA,OAAOR,iBAAiB,CAACI,KAAK,EAAEC,OAAO,EAAEC,QAAQ,CAAC;AACnD","ignoreList":[]}

View File

@@ -0,0 +1,77 @@
import metadata from '../../metadata.min.json' with { type: 'json' };
import _isPossibleNumber from './isPossibleNumber.js';
function isPossibleNumber() {
for (var _len = arguments.length, parameters = new Array(_len), _key = 0; _key < _len; _key++) {
parameters[_key] = arguments[_key];
}
parameters.push(metadata);
return _isPossibleNumber.apply(this, parameters);
}
describe('isPossibleNumber', function () {
it('should work', function () {
expect(isPossibleNumber('+79992223344')).to.equal(true);
expect(isPossibleNumber({
phone: '1112223344',
country: 'RU'
})).to.equal(true);
expect(isPossibleNumber({
phone: '111222334',
country: 'RU'
})).to.equal(false);
expect(isPossibleNumber({
phone: '11122233445',
country: 'RU'
})).to.equal(false);
expect(isPossibleNumber({
phone: '1112223344',
countryCallingCode: 7
})).to.equal(true);
});
it('should work v2', function () {
expect(isPossibleNumber({
nationalNumber: '111222334',
countryCallingCode: 7
}, {
v2: true
})).to.equal(false);
expect(isPossibleNumber({
nationalNumber: '1112223344',
countryCallingCode: 7
}, {
v2: true
})).to.equal(true);
expect(isPossibleNumber({
nationalNumber: '11122233445',
countryCallingCode: 7
}, {
v2: true
})).to.equal(false);
});
it('should work in edge cases', function () {
// Invalid `PhoneNumber` argument.
expect(function () {
return isPossibleNumber({}, {
v2: true
});
}).to["throw"]('Invalid phone number object passed');
// Empty input is passed.
// This is just to support `isValidNumber({})`
// for cases when `parseNumber()` returns `{}`.
expect(isPossibleNumber({})).to.equal(false);
expect(function () {
return isPossibleNumber({
phone: '1112223344'
});
}).to["throw"]('Invalid phone number object passed');
// Incorrect country.
expect(function () {
return isPossibleNumber({
phone: '1112223344',
country: 'XX'
});
}).to["throw"]('Unknown country');
});
});
//# sourceMappingURL=isPossibleNumber.test.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"isPossibleNumber.test.js","names":["metadata","type","_isPossibleNumber","isPossibleNumber","_len","arguments","length","parameters","Array","_key","push","apply","describe","it","expect","to","equal","phone","country","countryCallingCode","nationalNumber","v2"],"sources":["../../source/legacy/isPossibleNumber.test.js"],"sourcesContent":["import metadata from '../../metadata.min.json' with { type: 'json' }\r\nimport _isPossibleNumber from './isPossibleNumber.js'\r\n\r\nfunction isPossibleNumber(...parameters) {\r\n\tparameters.push(metadata)\r\n\treturn _isPossibleNumber.apply(this, parameters)\r\n}\r\n\r\ndescribe('isPossibleNumber', () => {\r\n\tit('should work', function()\r\n\t{\r\n\t\texpect(isPossibleNumber('+79992223344')).to.equal(true)\r\n\r\n\t\texpect(isPossibleNumber({ phone: '1112223344', country: 'RU' })).to.equal(true)\r\n\t\texpect(isPossibleNumber({ phone: '111222334', country: 'RU' })).to.equal(false)\r\n\t\texpect(isPossibleNumber({ phone: '11122233445', country: 'RU' })).to.equal(false)\r\n\r\n\t\texpect(isPossibleNumber({ phone: '1112223344', countryCallingCode: 7 })).to.equal(true)\r\n\t})\r\n\r\n\tit('should work v2', () => {\r\n\t\texpect(\r\n isPossibleNumber({ nationalNumber: '111222334', countryCallingCode: 7 }, { v2: true })\r\n ).to.equal(false)\r\n\t\texpect(\r\n isPossibleNumber({ nationalNumber: '1112223344', countryCallingCode: 7 }, { v2: true })\r\n ).to.equal(true)\r\n\t\texpect(\r\n isPossibleNumber({ nationalNumber: '11122233445', countryCallingCode: 7 }, { v2: true })\r\n ).to.equal(false)\r\n\t})\r\n\r\n\tit('should work in edge cases', () => {\r\n\t\t// Invalid `PhoneNumber` argument.\r\n\t\texpect(() => isPossibleNumber({}, { v2: true })).to.throw('Invalid phone number object passed')\r\n\r\n\t\t// Empty input is passed.\r\n\t\t// This is just to support `isValidNumber({})`\r\n\t\t// for cases when `parseNumber()` returns `{}`.\r\n\t\texpect(isPossibleNumber({})).to.equal(false)\r\n\t\texpect(() => isPossibleNumber({ phone: '1112223344' })).to.throw('Invalid phone number object passed')\r\n\r\n\t\t// Incorrect country.\r\n\t\texpect(() => isPossibleNumber({ phone: '1112223344', country: 'XX' })).to.throw('Unknown country')\r\n\t})\r\n})"],"mappings":"AAAA,OAAOA,QAAQ,MAAM,yBAAyB,QAAQC,IAAI,EAAE,MAAM;AAClE,OAAOC,iBAAiB,MAAM,uBAAuB;AAErD,SAASC,gBAAgBA,CAAA,EAAgB;EAAA,SAAAC,IAAA,GAAAC,SAAA,CAAAC,MAAA,EAAZC,UAAU,OAAAC,KAAA,CAAAJ,IAAA,GAAAK,IAAA,MAAAA,IAAA,GAAAL,IAAA,EAAAK,IAAA;IAAVF,UAAU,CAAAE,IAAA,IAAAJ,SAAA,CAAAI,IAAA;EAAA;EACtCF,UAAU,CAACG,IAAI,CAACV,QAAQ,CAAC;EACzB,OAAOE,iBAAiB,CAACS,KAAK,CAAC,IAAI,EAAEJ,UAAU,CAAC;AACjD;AAEAK,QAAQ,CAAC,kBAAkB,EAAE,YAAM;EAClCC,EAAE,CAAC,aAAa,EAAE,YAClB;IACCC,MAAM,CAACX,gBAAgB,CAAC,cAAc,CAAC,CAAC,CAACY,EAAE,CAACC,KAAK,CAAC,IAAI,CAAC;IAEvDF,MAAM,CAACX,gBAAgB,CAAC;MAAEc,KAAK,EAAE,YAAY;MAAEC,OAAO,EAAE;IAAK,CAAC,CAAC,CAAC,CAACH,EAAE,CAACC,KAAK,CAAC,IAAI,CAAC;IAC/EF,MAAM,CAACX,gBAAgB,CAAC;MAAEc,KAAK,EAAE,WAAW;MAAEC,OAAO,EAAE;IAAK,CAAC,CAAC,CAAC,CAACH,EAAE,CAACC,KAAK,CAAC,KAAK,CAAC;IAC/EF,MAAM,CAACX,gBAAgB,CAAC;MAAEc,KAAK,EAAE,aAAa;MAAEC,OAAO,EAAE;IAAK,CAAC,CAAC,CAAC,CAACH,EAAE,CAACC,KAAK,CAAC,KAAK,CAAC;IAEjFF,MAAM,CAACX,gBAAgB,CAAC;MAAEc,KAAK,EAAE,YAAY;MAAEE,kBAAkB,EAAE;IAAE,CAAC,CAAC,CAAC,CAACJ,EAAE,CAACC,KAAK,CAAC,IAAI,CAAC;EACxF,CAAC,CAAC;EAEFH,EAAE,CAAC,gBAAgB,EAAE,YAAM;IAC1BC,MAAM,CACIX,gBAAgB,CAAC;MAAEiB,cAAc,EAAE,WAAW;MAAED,kBAAkB,EAAE;IAAE,CAAC,EAAE;MAAEE,EAAE,EAAE;IAAK,CAAC,CACzF,CAAC,CAACN,EAAE,CAACC,KAAK,CAAC,KAAK,CAAC;IACvBF,MAAM,CACIX,gBAAgB,CAAC;MAAEiB,cAAc,EAAE,YAAY;MAAED,kBAAkB,EAAE;IAAE,CAAC,EAAE;MAAEE,EAAE,EAAE;IAAK,CAAC,CAC1F,CAAC,CAACN,EAAE,CAACC,KAAK,CAAC,IAAI,CAAC;IACtBF,MAAM,CACIX,gBAAgB,CAAC;MAAEiB,cAAc,EAAE,aAAa;MAAED,kBAAkB,EAAE;IAAE,CAAC,EAAE;MAAEE,EAAE,EAAE;IAAK,CAAC,CAC3F,CAAC,CAACN,EAAE,CAACC,KAAK,CAAC,KAAK,CAAC;EACxB,CAAC,CAAC;EAEFH,EAAE,CAAC,2BAA2B,EAAE,YAAM;IACrC;IACAC,MAAM,CAAC;MAAA,OAAMX,gBAAgB,CAAC,CAAC,CAAC,EAAE;QAAEkB,EAAE,EAAE;MAAK,CAAC,CAAC;IAAA,EAAC,CAACN,EAAE,SAAM,CAAC,oCAAoC,CAAC;;IAE/F;IACA;IACA;IACAD,MAAM,CAACX,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAACY,EAAE,CAACC,KAAK,CAAC,KAAK,CAAC;IAC5CF,MAAM,CAAC;MAAA,OAAMX,gBAAgB,CAAC;QAAEc,KAAK,EAAE;MAAa,CAAC,CAAC;IAAA,EAAC,CAACF,EAAE,SAAM,CAAC,oCAAoC,CAAC;;IAEtG;IACAD,MAAM,CAAC;MAAA,OAAMX,gBAAgB,CAAC;QAAEc,KAAK,EAAE,YAAY;QAAEC,OAAO,EAAE;MAAK,CAAC,CAAC;IAAA,EAAC,CAACH,EAAE,SAAM,CAAC,iBAAiB,CAAC;EACnG,CAAC,CAAC;AACH,CAAC,CAAC","ignoreList":[]}

View File

@@ -0,0 +1,16 @@
import _isValidNumber from '../isValid.js';
import { normalizeArguments } from './getNumberType.js';
// Finds out national phone number type (fixed line, mobile, etc)
export default function isValidNumber() {
var _normalizeArguments = normalizeArguments(arguments),
input = _normalizeArguments.input,
options = _normalizeArguments.options,
metadata = _normalizeArguments.metadata;
// `parseNumber()` would return `{}` when no phone number could be parsed from the input.
if (!input.phone) {
return false;
}
return _isValidNumber(input, options, metadata);
}
//# sourceMappingURL=isValidNumber.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"isValidNumber.js","names":["_isValidNumber","normalizeArguments","isValidNumber","_normalizeArguments","arguments","input","options","metadata","phone"],"sources":["../../source/legacy/isValidNumber.js"],"sourcesContent":["import _isValidNumber from '../isValid.js'\r\nimport { normalizeArguments } from './getNumberType.js'\r\n\r\n// Finds out national phone number type (fixed line, mobile, etc)\r\nexport default function isValidNumber() {\r\n\tconst { input, options, metadata } = normalizeArguments(arguments)\r\n\t// `parseNumber()` would return `{}` when no phone number could be parsed from the input.\r\n\tif (!input.phone) {\r\n\t\treturn false\r\n\t}\r\n\treturn _isValidNumber(input, options, metadata)\r\n}"],"mappings":"AAAA,OAAOA,cAAc,MAAM,eAAe;AAC1C,SAASC,kBAAkB,QAAQ,oBAAoB;;AAEvD;AACA,eAAe,SAASC,aAAaA,CAAA,EAAG;EACvC,IAAAC,mBAAA,GAAqCF,kBAAkB,CAACG,SAAS,CAAC;IAA1DC,KAAK,GAAAF,mBAAA,CAALE,KAAK;IAAEC,OAAO,GAAAH,mBAAA,CAAPG,OAAO;IAAEC,QAAQ,GAAAJ,mBAAA,CAARI,QAAQ;EAChC;EACA,IAAI,CAACF,KAAK,CAACG,KAAK,EAAE;IACjB,OAAO,KAAK;EACb;EACA,OAAOR,cAAc,CAACK,KAAK,EAAEC,OAAO,EAAEC,QAAQ,CAAC;AAChD","ignoreList":[]}

View File

@@ -0,0 +1,97 @@
import metadata from '../../metadata.min.json' with { type: 'json' };
import _isValidNumber from './isValidNumber.js';
function isValidNumber() {
for (var _len = arguments.length, parameters = new Array(_len), _key = 0; _key < _len; _key++) {
parameters[_key] = arguments[_key];
}
parameters.push(metadata);
return _isValidNumber.apply(this, parameters);
}
describe('isValidNumber', function () {
it('should validate phone numbers', function () {
expect(isValidNumber('+1-213-373-4253')).to.equal(true);
expect(isValidNumber('+1-213-373')).to.equal(false);
expect(isValidNumber('+1-213-373-4253', undefined)).to.equal(true);
expect(isValidNumber('(213) 373-4253', 'US')).to.equal(true);
expect(isValidNumber('(213) 37', 'US')).to.equal(false);
expect(isValidNumber({
country: 'US',
phone: '2133734253'
})).to.equal(true);
// No "types" info: should return `true`.
expect(isValidNumber('+380972423740')).to.equal(true);
expect(isValidNumber('0912345678', 'TW')).to.equal(true);
// Moible numbers starting 07624* are Isle of Man
// which has its own "country code" "IM"
// which is in the "GB" "country calling code" zone.
// So while this number is for "IM" it's still supposed to
// be valid when passed "GB" as a default country.
expect(isValidNumber('07624369230', 'GB')).to.equal(true);
});
it('should refine phone number validation in case extended regular expressions are set for a country', function () {
// Germany general validation must pass
expect(isValidNumber('961111111', 'UZ')).to.equal(true);
var phoneNumberTypePatterns = metadata.countries.UZ[11];
// Different regular expressions for precise national number validation.
// `types` index in compressed array is `9` for v1.
// For v2 it's 10.
// For v3 it's 11.
metadata.countries.UZ[11] = [["(?:6(?:1(?:22|3[124]|4[1-4]|5[123578]|64)|2(?:22|3[0-57-9]|41)|5(?:22|3[3-7]|5[024-8])|6\\d{2}|7(?:[23]\\d|7[69])|9(?:22|4[1-8]|6[135]))|7(?:0(?:5[4-9]|6[0146]|7[12456]|9[135-8])|1[12]\\d|2(?:22|3[1345789]|4[123579]|5[14])|3(?:2\\d|3[1578]|4[1-35-7]|5[1-57]|61)|4(?:2\\d|3[1-579]|7[1-79])|5(?:22|5[1-9]|6[1457])|6(?:22|3[12457]|4[13-8])|9(?:22|5[1-9])))\\d{5}"], ["6(?:1(?:2(?:98|2[01])|35[0-4]|50\\d|61[23]|7(?:[01][017]|4\\d|55|9[5-9]))|2(?:11\\d|2(?:[12]1|9[01379])|5(?:[126]\\d|3[0-4])|7\\d{2})|5(?:19[01]|2(?:27|9[26])|30\\d|59\\d|7\\d{2})|6(?:2(?:1[5-9]|2[0367]|38|41|52|60)|3[79]\\d|4(?:56|83)|7(?:[07]\\d|1[017]|3[07]|4[047]|5[057]|67|8[0178]|9[79])|9[0-3]\\d)|7(?:2(?:24|3[237]|4[5-9]|7[15-8])|5(?:7[12]|8[0589])|7(?:0\\d|[39][07])|9(?:0\\d|7[079]))|9(?:2(?:1[1267]|5\\d|3[01]|7[0-4])|5[67]\\d|6(?:2[0-26]|8\\d)|7\\d{2}))\\d{4}|7(?:0\\d{3}|1(?:13[01]|6(?:0[47]|1[67]|66)|71[3-69]|98\\d)|2(?:2(?:2[79]|95)|3(?:2[5-9]|6[0-6])|57\\d|7(?:0\\d|1[17]|2[27]|3[37]|44|5[057]|66|88))|3(?:2(?:1[0-6]|21|3[469]|7[159])|33\\d|5(?:0[0-4]|5[579]|9\\d)|7(?:[0-3579]\\d|4[0467]|6[67]|8[078])|9[4-6]\\d)|4(?:2(?:29|5[0257]|6[0-7]|7[1-57])|5(?:1[0-4]|8\\d|9[5-9])|7(?:0\\d|1[024589]|2[0127]|3[0137]|[46][07]|5[01]|7[5-9]|9[079])|9(?:7[015-9]|[89]\\d))|5(?:112|2(?:0\\d|2[29]|[49]4)|3[1568]\\d|52[6-9]|7(?:0[01578]|1[017]|[23]7|4[047]|[5-7]\\d|8[78]|9[079]))|6(?:2(?:2[1245]|4[2-4])|39\\d|41[179]|5(?:[349]\\d|5[0-2])|7(?:0[017]|[13]\\d|22|44|55|67|88))|9(?:22[128]|3(?:2[0-4]|7\\d)|57[05629]|7(?:2[05-9]|3[37]|4\\d|60|7[2579]|87|9[07])))\\d{4}|9[0-57-9]\\d{7}"]];
// Extended validation must not pass for an invalid phone number
expect(isValidNumber('961111111', 'UZ')).to.equal(false);
// Extended validation must pass for a valid phone number
expect(isValidNumber('912345678', 'UZ')).to.equal(true);
metadata.countries.UZ[11] = phoneNumberTypePatterns;
});
it('should work in edge cases', function () {
// No metadata
var thrower = function thrower() {
return _isValidNumber('+78005553535');
};
expect(thrower).to["throw"]('`metadata` argument not passed');
// Non-phone-number characters in a phone number
expect(isValidNumber('+499821958a')).to.equal(false);
expect(isValidNumber('88005553535x', 'RU')).to.equal(false);
// Doesn't have `types` regexps in default metadata.
expect(isValidNumber({
country: 'UA',
phone: '300000000'
})).to.equal(true);
expect(isValidNumber({
country: 'UA',
phone: '200000000'
})).to.equal(false);
// Numerical `value`
thrower = function thrower() {
return isValidNumber(88005553535, 'RU');
};
expect(thrower).to["throw"]('A phone number must either be a string or an object of shape { phone, [country] }.');
// Long country phone code
expect(isValidNumber('+3725555555')).to.equal(true);
// Invalid country
thrower = function thrower() {
return isValidNumber({
phone: '8005553535',
country: 'RUS'
});
};
expect(thrower).to["throw"]('Unknown country');
});
it('should accept phone number extensions', function () {
// International
expect(isValidNumber('+12133734253 ext. 123')).to.equal(true);
// National
expect(isValidNumber('88005553535 x123', 'RU')).to.equal(true);
});
});
//# sourceMappingURL=isValidNumber.test.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,65 @@
import isViablePhoneNumber from '../helpers/isViablePhoneNumber.js';
import parseNumber from '../parse.js';
import _isValidNumberForRegion from './isValidNumberForRegion_.js';
// This function has been deprecated and is not exported as
// `isValidPhoneNumberForCountry()` or `isValidPhoneNumberForRegion()`.
//
// The rationale is:
//
// * We don't use the "region" word, so "country" would be better.
//
// * It could be substituted with:
//
// ```js
// export default function isValidPhoneNumberForCountry(phoneNumberString, country) {
// const phoneNumber = parsePhoneNumber(phoneNumberString, {
// defaultCountry: country,
// // Demand that the entire input string must be a phone number.
// // Otherwise, it would "extract" a phone number from an input string.
// extract: false
// })
// if (!phoneNumber) {
// return false
// }
// if (phoneNumber.country !== country) {
// return false
// }
// return phoneNumber.isValid()
// }
// ```
//
// * Same function could be used for `isPossiblePhoneNumberForCountry()`
// by replacing `isValid()` with `isPossible()`.
//
// * The reason why this function is not exported is because its result is ambiguous.
// Suppose `false` is returned. It could mean any of:
// * Not a phone number.
// * The phone number is valid but belongs to another country or another calling code.
// * The phone number belongs to the correct country but is not valid digit-wise.
// All those three cases should be handled separately from a "User Experience" standpoint.
// Simply showing "Invalid phone number" error in all of those cases would be lazy UX.
export default function isValidNumberForRegion(number, country, metadata) {
if (typeof number !== 'string') {
throw new TypeError('number must be a string');
}
if (typeof country !== 'string') {
throw new TypeError('country must be a string');
}
// `parse` extracts phone numbers from raw text,
// therefore it will cut off all "garbage" characters,
// while this `validate` function needs to verify
// that the phone number contains no "garbage"
// therefore the explicit `isViablePhoneNumber` check.
var input;
if (isViablePhoneNumber(number)) {
input = parseNumber(number, {
defaultCountry: country
}, metadata);
} else {
input = {};
}
return _isValidNumberForRegion(input, country, undefined, metadata);
}
//# sourceMappingURL=isValidNumberForRegion.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"isValidNumberForRegion.js","names":["isViablePhoneNumber","parseNumber","_isValidNumberForRegion","isValidNumberForRegion","number","country","metadata","TypeError","input","defaultCountry","undefined"],"sources":["../../source/legacy/isValidNumberForRegion.js"],"sourcesContent":["import isViablePhoneNumber from '../helpers/isViablePhoneNumber.js'\r\nimport parseNumber from '../parse.js'\r\nimport _isValidNumberForRegion from './isValidNumberForRegion_.js'\r\n\r\n// This function has been deprecated and is not exported as\r\n// `isValidPhoneNumberForCountry()` or `isValidPhoneNumberForRegion()`.\r\n//\r\n// The rationale is:\r\n//\r\n// * We don't use the \"region\" word, so \"country\" would be better.\r\n//\r\n// * It could be substituted with:\r\n//\r\n// ```js\r\n// export default function isValidPhoneNumberForCountry(phoneNumberString, country) {\r\n// \tconst phoneNumber = parsePhoneNumber(phoneNumberString, {\r\n// \t\tdefaultCountry: country,\r\n// \t\t// Demand that the entire input string must be a phone number.\r\n// \t\t// Otherwise, it would \"extract\" a phone number from an input string.\r\n// \t\textract: false\r\n// \t})\r\n// \tif (!phoneNumber) {\r\n// \t\treturn false\r\n// \t}\r\n// \tif (phoneNumber.country !== country) {\r\n// \t\treturn false\r\n// \t}\r\n// \treturn phoneNumber.isValid()\r\n// }\r\n// ```\r\n//\r\n// * Same function could be used for `isPossiblePhoneNumberForCountry()`\r\n// by replacing `isValid()` with `isPossible()`.\r\n//\r\n// * The reason why this function is not exported is because its result is ambiguous.\r\n// Suppose `false` is returned. It could mean any of:\r\n// * Not a phone number.\r\n// * The phone number is valid but belongs to another country or another calling code.\r\n// * The phone number belongs to the correct country but is not valid digit-wise.\r\n// All those three cases should be handled separately from a \"User Experience\" standpoint.\r\n// Simply showing \"Invalid phone number\" error in all of those cases would be lazy UX.\r\n\r\nexport default function isValidNumberForRegion(number, country, metadata) {\r\n\tif (typeof number !== 'string') {\r\n\t\tthrow new TypeError('number must be a string')\r\n\t}\r\n\tif (typeof country !== 'string') {\r\n\t\tthrow new TypeError('country must be a string')\r\n\t}\r\n\t// `parse` extracts phone numbers from raw text,\r\n\t// therefore it will cut off all \"garbage\" characters,\r\n\t// while this `validate` function needs to verify\r\n\t// that the phone number contains no \"garbage\"\r\n\t// therefore the explicit `isViablePhoneNumber` check.\r\n\tlet input\r\n\tif (isViablePhoneNumber(number)) {\r\n\t\tinput = parseNumber(number, { defaultCountry: country }, metadata)\r\n\t} else {\r\n\t\tinput = {}\r\n\t}\r\n\treturn _isValidNumberForRegion(input, country, undefined, metadata)\r\n}"],"mappings":"AAAA,OAAOA,mBAAmB,MAAM,mCAAmC;AACnE,OAAOC,WAAW,MAAM,aAAa;AACrC,OAAOC,uBAAuB,MAAM,8BAA8B;;AAElE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,eAAe,SAASC,sBAAsBA,CAACC,MAAM,EAAEC,OAAO,EAAEC,QAAQ,EAAE;EACzE,IAAI,OAAOF,MAAM,KAAK,QAAQ,EAAE;IAC/B,MAAM,IAAIG,SAAS,CAAC,yBAAyB,CAAC;EAC/C;EACA,IAAI,OAAOF,OAAO,KAAK,QAAQ,EAAE;IAChC,MAAM,IAAIE,SAAS,CAAC,0BAA0B,CAAC;EAChD;EACA;EACA;EACA;EACA;EACA;EACA,IAAIC,KAAK;EACT,IAAIR,mBAAmB,CAACI,MAAM,CAAC,EAAE;IAChCI,KAAK,GAAGP,WAAW,CAACG,MAAM,EAAE;MAAEK,cAAc,EAAEJ;IAAQ,CAAC,EAAEC,QAAQ,CAAC;EACnE,CAAC,MAAM;IACNE,KAAK,GAAG,CAAC,CAAC;EACX;EACA,OAAON,uBAAuB,CAACM,KAAK,EAAEH,OAAO,EAAEK,SAAS,EAAEJ,QAAQ,CAAC;AACpE","ignoreList":[]}

View File

@@ -0,0 +1,35 @@
import metadata from '../../metadata.min.json' with { type: 'json' };
import isValidNumberForRegionCustom from './isValidNumberForRegion.js';
import _isValidNumberForRegion from './isValidNumberForRegion_.js';
function isValidNumberForRegion() {
for (var _len = arguments.length, parameters = new Array(_len), _key = 0; _key < _len; _key++) {
parameters[_key] = arguments[_key];
}
parameters.push(metadata);
return isValidNumberForRegionCustom.apply(this, parameters);
}
describe('isValidNumberForRegion', function () {
it('should detect if is valid number for region', function () {
expect(isValidNumberForRegion('07624369230', 'GB')).to.equal(false);
expect(isValidNumberForRegion('07624369230', 'IM')).to.equal(true);
});
it('should validate arguments', function () {
expect(function () {
return isValidNumberForRegion({
phone: '7624369230',
country: 'GB'
});
}).to["throw"]('number must be a string');
expect(function () {
return isValidNumberForRegion('7624369230');
}).to["throw"]('country must be a string');
});
it('should work in edge cases', function () {
// Not a "viable" phone number.
expect(isValidNumberForRegion('7', 'GB')).to.equal(false);
// `options` argument `if/else` coverage.
expect(_isValidNumberForRegion('07624369230', 'GB', {}, metadata)).to.equal(false);
});
});
//# sourceMappingURL=isValidNumberForRegion.test.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"isValidNumberForRegion.test.js","names":["metadata","type","isValidNumberForRegionCustom","_isValidNumberForRegion","isValidNumberForRegion","_len","arguments","length","parameters","Array","_key","push","apply","describe","it","expect","to","equal","phone","country"],"sources":["../../source/legacy/isValidNumberForRegion.test.js"],"sourcesContent":["import metadata from '../../metadata.min.json' with { type: 'json' }\r\nimport isValidNumberForRegionCustom from './isValidNumberForRegion.js'\r\nimport _isValidNumberForRegion from './isValidNumberForRegion_.js'\r\n\r\nfunction isValidNumberForRegion(...parameters) {\r\n\tparameters.push(metadata)\r\n\treturn isValidNumberForRegionCustom.apply(this, parameters)\r\n}\r\n\r\ndescribe('isValidNumberForRegion', () => {\r\n\tit('should detect if is valid number for region', () => {\r\n\t\texpect(isValidNumberForRegion('07624369230', 'GB')).to.equal(false)\r\n\t\texpect(isValidNumberForRegion('07624369230', 'IM')).to.equal(true)\r\n\t})\r\n\r\n\tit('should validate arguments', () => {\r\n\t\texpect(() => isValidNumberForRegion({ phone: '7624369230', country: 'GB' })).to.throw('number must be a string')\r\n\t\texpect(() => isValidNumberForRegion('7624369230')).to.throw('country must be a string')\r\n\t})\r\n\r\n\tit('should work in edge cases', () => {\r\n\t\t// Not a \"viable\" phone number.\r\n\t\texpect(isValidNumberForRegion('7', 'GB')).to.equal(false)\r\n\r\n\t\t// `options` argument `if/else` coverage.\r\n\t\texpect(_isValidNumberForRegion('07624369230', 'GB', {}, metadata)).to.equal(false)\r\n\t})\r\n})"],"mappings":"AAAA,OAAOA,QAAQ,MAAM,yBAAyB,QAAQC,IAAI,EAAE,MAAM;AAClE,OAAOC,4BAA4B,MAAM,6BAA6B;AACtE,OAAOC,uBAAuB,MAAM,8BAA8B;AAElE,SAASC,sBAAsBA,CAAA,EAAgB;EAAA,SAAAC,IAAA,GAAAC,SAAA,CAAAC,MAAA,EAAZC,UAAU,OAAAC,KAAA,CAAAJ,IAAA,GAAAK,IAAA,MAAAA,IAAA,GAAAL,IAAA,EAAAK,IAAA;IAAVF,UAAU,CAAAE,IAAA,IAAAJ,SAAA,CAAAI,IAAA;EAAA;EAC5CF,UAAU,CAACG,IAAI,CAACX,QAAQ,CAAC;EACzB,OAAOE,4BAA4B,CAACU,KAAK,CAAC,IAAI,EAAEJ,UAAU,CAAC;AAC5D;AAEAK,QAAQ,CAAC,wBAAwB,EAAE,YAAM;EACxCC,EAAE,CAAC,6CAA6C,EAAE,YAAM;IACvDC,MAAM,CAACX,sBAAsB,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC,CAACY,EAAE,CAACC,KAAK,CAAC,KAAK,CAAC;IACnEF,MAAM,CAACX,sBAAsB,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC,CAACY,EAAE,CAACC,KAAK,CAAC,IAAI,CAAC;EACnE,CAAC,CAAC;EAEFH,EAAE,CAAC,2BAA2B,EAAE,YAAM;IACrCC,MAAM,CAAC;MAAA,OAAMX,sBAAsB,CAAC;QAAEc,KAAK,EAAE,YAAY;QAAEC,OAAO,EAAE;MAAK,CAAC,CAAC;IAAA,EAAC,CAACH,EAAE,SAAM,CAAC,yBAAyB,CAAC;IAChHD,MAAM,CAAC;MAAA,OAAMX,sBAAsB,CAAC,YAAY,CAAC;IAAA,EAAC,CAACY,EAAE,SAAM,CAAC,0BAA0B,CAAC;EACxF,CAAC,CAAC;EAEFF,EAAE,CAAC,2BAA2B,EAAE,YAAM;IACrC;IACAC,MAAM,CAACX,sBAAsB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAACY,EAAE,CAACC,KAAK,CAAC,KAAK,CAAC;;IAEzD;IACAF,MAAM,CAACZ,uBAAuB,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,EAAEH,QAAQ,CAAC,CAAC,CAACgB,EAAE,CAACC,KAAK,CAAC,KAAK,CAAC;EACnF,CAAC,CAAC;AACH,CAAC,CAAC","ignoreList":[]}

View File

@@ -0,0 +1,14 @@
import isValidNumber from '../isValid.js';
/**
* Checks if a given phone number is valid within a given region.
* Is just an alias for `phoneNumber.isValid() && phoneNumber.country === country`.
* https://github.com/googlei18n/libphonenumber/blob/master/FAQ.md#when-should-i-use-isvalidnumberforregion
*/
export default function isValidNumberForRegion(input, country, options, metadata) {
// If assigning the `{}` default value is moved to the arguments above,
// code coverage would decrease for some weird reason.
options = options || {};
return input.country === country && isValidNumber(input, options, metadata);
}
//# sourceMappingURL=isValidNumberForRegion_.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"isValidNumberForRegion_.js","names":["isValidNumber","isValidNumberForRegion","input","country","options","metadata"],"sources":["../../source/legacy/isValidNumberForRegion_.js"],"sourcesContent":["import isValidNumber from '../isValid.js'\r\n\r\n/**\r\n * Checks if a given phone number is valid within a given region.\r\n * Is just an alias for `phoneNumber.isValid() && phoneNumber.country === country`.\r\n * https://github.com/googlei18n/libphonenumber/blob/master/FAQ.md#when-should-i-use-isvalidnumberforregion\r\n */\r\nexport default function isValidNumberForRegion(input, country, 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\treturn input.country === country && isValidNumber(input, options, metadata)\r\n}"],"mappings":"AAAA,OAAOA,aAAa,MAAM,eAAe;;AAEzC;AACA;AACA;AACA;AACA;AACA,eAAe,SAASC,sBAAsBA,CAACC,KAAK,EAAEC,OAAO,EAAEC,OAAO,EAAEC,QAAQ,EAAE;EACjF;EACA;EACAD,OAAO,GAAGA,OAAO,IAAI,CAAC,CAAC;EACvB,OAAOF,KAAK,CAACC,OAAO,KAAKA,OAAO,IAAIH,aAAa,CAACE,KAAK,EAAEE,OAAO,EAAEC,QAAQ,CAAC;AAC5E","ignoreList":[]}

View File

@@ -0,0 +1,10 @@
import _parseNumber from '../parse.js';
import normalizeArguments from '../normalizeArguments.js';
export default function parseNumber() {
var _normalizeArguments = normalizeArguments(arguments),
text = _normalizeArguments.text,
options = _normalizeArguments.options,
metadata = _normalizeArguments.metadata;
return _parseNumber(text, options, metadata);
}
//# sourceMappingURL=parse.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"parse.js","names":["_parseNumber","normalizeArguments","parseNumber","_normalizeArguments","arguments","text","options","metadata"],"sources":["../../source/legacy/parse.js"],"sourcesContent":["import _parseNumber from '../parse.js'\r\nimport normalizeArguments from '../normalizeArguments.js'\r\n\r\nexport default function parseNumber() {\r\n\tconst { text, options, metadata } = normalizeArguments(arguments)\r\n\treturn _parseNumber(text, options, metadata)\r\n}"],"mappings":"AAAA,OAAOA,YAAY,MAAM,aAAa;AACtC,OAAOC,kBAAkB,MAAM,0BAA0B;AAEzD,eAAe,SAASC,WAAWA,CAAA,EAAG;EACrC,IAAAC,mBAAA,GAAoCF,kBAAkB,CAACG,SAAS,CAAC;IAAzDC,IAAI,GAAAF,mBAAA,CAAJE,IAAI;IAAEC,OAAO,GAAAH,mBAAA,CAAPG,OAAO;IAAEC,QAAQ,GAAAJ,mBAAA,CAARI,QAAQ;EAC/B,OAAOP,YAAY,CAACK,IAAI,EAAEC,OAAO,EAAEC,QAAQ,CAAC;AAC7C","ignoreList":[]}

View File

@@ -0,0 +1,612 @@
import metadata from '../../metadata.min.json' with { type: 'json' };
import _parseNumber from './parse.js';
import Metadata from '../metadata.js';
function parseNumber() {
for (var _len = arguments.length, parameters = new Array(_len), _key = 0; _key < _len; _key++) {
parameters[_key] = arguments[_key];
}
parameters.push(metadata);
return _parseNumber.apply(this, parameters);
}
var USE_NON_GEOGRAPHIC_COUNTRY_CODE = false;
describe('parse', function () {
it('should not parse invalid phone numbers', function () {
// Too short.
expect(parseNumber('+7 (800) 55-35-35')).to.deep.equal({});
// Too long.
expect(parseNumber('+7 (800) 55-35-35-55')).to.deep.equal({});
expect(parseNumber('+7 (800) 55-35-35', 'US')).to.deep.equal({});
expect(parseNumber('(800) 55 35 35', {
defaultCountry: 'RU'
})).to.deep.equal({});
expect(parseNumber('+1 187 215 5230', 'US')).to.deep.equal({});
expect(parseNumber('911231231', 'BE')).to.deep.equal({});
});
it('should parse valid phone numbers', function () {
// Instant loans
// https://www.youtube.com/watch?v=6e1pMrYH5jI
//
// Restrict to RU
expect(parseNumber('Phone: 8 (800) 555 35 35.', 'RU')).to.deep.equal({
country: 'RU',
phone: '8005553535'
});
// International format
expect(parseNumber('Phone: +7 (800) 555-35-35.')).to.deep.equal({
country: 'RU',
phone: '8005553535'
});
// // Restrict to US, but not a US country phone code supplied
// parseNumber('+7 (800) 555-35-35', 'US').should.deep.equal({})
// Restrict to RU
expect(parseNumber('(800) 555 35 35', 'RU')).to.deep.equal({
country: 'RU',
phone: '8005553535'
});
// Default to RU
expect(parseNumber('8 (800) 555 35 35', {
defaultCountry: 'RU'
})).to.deep.equal({
country: 'RU',
phone: '8005553535'
});
// Gangster partyline
expect(parseNumber('+1-213-373-4253')).to.deep.equal({
country: 'US',
phone: '2133734253'
});
// Switzerland (just in case)
expect(parseNumber('044 668 18 00', 'CH')).to.deep.equal({
country: 'CH',
phone: '446681800'
});
// China, Beijing
expect(parseNumber('010-852644821', 'CN')).to.deep.equal({
country: 'CN',
phone: '10852644821'
});
// France
expect(parseNumber('+33169454850')).to.deep.equal({
country: 'FR',
phone: '169454850'
});
// UK (Jersey)
expect(parseNumber('+44 7700 300000')).to.deep.equal({
country: 'JE',
phone: '7700300000'
});
// KZ
expect(parseNumber('+7 702 211 1111')).to.deep.equal({
country: 'KZ',
phone: '7022111111'
});
// Brazil
expect(parseNumber('11987654321', 'BR')).to.deep.equal({
country: 'BR',
phone: '11987654321'
});
// Long country phone code.
expect(parseNumber('+212659777777')).to.deep.equal({
country: 'MA',
phone: '659777777'
});
// No country could be derived.
// parseNumber('+212569887076').should.deep.equal({ countryPhoneCode: '212', phone: '569887076' })
// GB. Moible numbers starting 07624* are Isle of Man.
expect(parseNumber('07624369230', 'GB')).to.deep.equal({
country: 'IM',
phone: '7624369230'
});
});
it('should parse possible numbers', function () {
// Invalid phone number for a given country.
expect(parseNumber('1112223344', 'RU', {
extended: true
})).to.deep.equal({
country: 'RU',
countryCallingCode: '7',
phone: '1112223344',
carrierCode: undefined,
ext: undefined,
valid: false,
possible: true
});
// International phone number.
// Several countries with the same country phone code.
expect(parseNumber('+71112223344')).to.deep.equal({});
expect(parseNumber('+71112223344', {
extended: true
})).to.deep.equal({
country: undefined,
countryCallingCode: '7',
phone: '1112223344',
carrierCode: undefined,
ext: undefined,
valid: false,
possible: true
});
// International phone number.
// Single country with the given country phone code.
expect(parseNumber('+33011222333', {
extended: true
})).to.deep.equal({
country: 'FR',
countryCallingCode: '33',
phone: '011222333',
carrierCode: undefined,
ext: undefined,
valid: false,
possible: true
});
// Too short.
// Won't strip national prefix `8` because otherwise the number would be too short.
expect(parseNumber('+7 (800) 55-35-35', {
extended: true
})).to.deep.equal({
country: 'RU',
countryCallingCode: '7',
phone: '800553535',
carrierCode: undefined,
ext: undefined,
valid: false,
possible: false
});
// Too long.
expect(parseNumber('+1 213 37342530', {
extended: true
})).to.deep.equal({
country: undefined,
countryCallingCode: '1',
phone: '21337342530',
carrierCode: undefined,
ext: undefined,
valid: false,
possible: false
});
// No national number to be parsed.
expect(parseNumber('+996', {
extended: true
})).to.deep.equal({
// countryCallingCode : '996'
});
// Valid number.
expect(parseNumber('+78005553535', {
extended: true
})).to.deep.equal({
country: 'RU',
countryCallingCode: '7',
phone: '8005553535',
carrierCode: undefined,
ext: undefined,
valid: true,
possible: true
});
// https://github.com/catamphetamine/libphonenumber-js/issues/211
expect(parseNumber('+966', {
extended: true
})).to.deep.equal({});
expect(parseNumber('+9664', {
extended: true
})).to.deep.equal({});
expect(parseNumber('+96645', {
extended: true
})).to.deep.equal({
carrierCode: undefined,
phone: '45',
ext: undefined,
country: 'SA',
countryCallingCode: '966',
possible: false,
valid: false
});
});
it('should parse non-European digits', function () {
expect(parseNumber('+١٢١٢٢٣٢٣٢٣٢')).to.deep.equal({
country: 'US',
phone: '2122323232'
});
});
it('should work in edge cases', function () {
var thrower;
// No input
expect(parseNumber('')).to.deep.equal({});
// No country phone code
expect(parseNumber('+')).to.deep.equal({});
// No country at all (non international number and no explicit country code)
expect(parseNumber('123')).to.deep.equal({});
// No country metadata for this `require` country code
thrower = function thrower() {
return parseNumber('123', 'ZZ');
};
expect(thrower).to["throw"]('Unknown country');
// No country metadata for this `default` country code
thrower = function thrower() {
return parseNumber('123', {
defaultCountry: 'ZZ'
});
};
expect(thrower).to["throw"]('Unknown country');
// Invalid country phone code
expect(parseNumber('+210')).to.deep.equal({});
// Invalid country phone code (extended parsing mode)
expect(parseNumber('+210', {
extended: true
})).to.deep.equal({});
// Too short of a number.
expect(parseNumber('1', 'US', {
extended: true
})).to.deep.equal({});
// Too long of a number.
expect(parseNumber('1111111111111111111', 'RU', {
extended: true
})).to.deep.equal({});
// Not a number.
expect(parseNumber('abcdefg', 'US', {
extended: true
})).to.deep.equal({});
// Country phone code beginning with a '0'
expect(parseNumber('+0123')).to.deep.equal({});
// Barbados NANPA phone number
expect(parseNumber('+12460000000')).to.deep.equal({
country: 'BB',
phone: '2460000000'
});
// // A case when country (restricted to) is not equal
// // to the one parsed out of an international number.
// parseNumber('+1-213-373-4253', 'RU').should.deep.equal({})
// National (significant) number too short
expect(parseNumber('2', 'US')).to.deep.equal({});
// National (significant) number too long
expect(parseNumber('222222222222222222', 'US')).to.deep.equal({});
// No `national_prefix_for_parsing`
expect(parseNumber('41111', 'AC')).to.deep.equal({
country: 'AC',
phone: '41111'
});
// https://github.com/catamphetamine/libphonenumber-js/issues/235
// `matchesEntirely()` bug fix.
expect(parseNumber('+4915784846111')).to.deep.equal({
country: 'DE',
phone: '15784846111'
});
// No metadata
thrower = function thrower() {
return _parseNumber('');
};
expect(thrower).to["throw"]('`metadata` argument not passed');
// Numerical `value`
thrower = function thrower() {
return parseNumber(2141111111, 'US');
};
expect(thrower).to["throw"]('A text for parsing must be a string.');
// Input string too long.
expect(parseNumber('8005553535 ', 'RU')).to.deep.equal({});
});
it('should parse phone number extensions', function () {
// "ext"
expect(parseNumber('2134567890 ext 123', 'US')).to.deep.equal({
country: 'US',
phone: '2134567890',
ext: '123'
});
// "ext."
expect(parseNumber('+12134567890 ext. 12345', 'US')).to.deep.equal({
country: 'US',
phone: '2134567890',
ext: '12345'
});
// "доб."
expect(parseNumber('+78005553535 доб. 1234', 'RU')).to.deep.equal({
country: 'RU',
phone: '8005553535',
ext: '1234'
});
// "#"
expect(parseNumber('+12134567890#1234')).to.deep.equal({
country: 'US',
phone: '2134567890',
ext: '1234'
});
// "x"
expect(parseNumber('+78005553535 x1234')).to.deep.equal({
country: 'RU',
phone: '8005553535',
ext: '1234'
});
// Not a valid extension
expect(parseNumber('2134567890 ext. abc', 'US')).to.deep.equal({
country: 'US',
phone: '2134567890'
});
});
it('should parse RFC 3966 phone numbers', function () {
expect(parseNumber('tel:+78005553535;ext=123')).to.deep.equal({
country: 'RU',
phone: '8005553535',
ext: '123'
});
// Should parse "visual separators".
expect(parseNumber('tel:+7(800)555-35.35;ext=123')).to.deep.equal({
country: 'RU',
phone: '8005553535',
ext: '123'
});
// Invalid number.
expect(parseNumber('tel:+7x8005553535;ext=123')).to.deep.equal({});
});
it('should parse invalid international numbers even if they are invalid', function () {
expect(parseNumber('+7(8)8005553535', 'RU')).to.deep.equal({
country: 'RU',
phone: '8005553535'
});
});
it('should parse carrier codes', function () {
expect(parseNumber('0 15 21 5555-5555', 'BR', {
extended: true
})).to.deep.equal({
country: 'BR',
countryCallingCode: '55',
phone: '2155555555',
carrierCode: '15',
ext: undefined,
valid: true,
possible: true
});
});
it('should parse IDD prefixes', function () {
expect(parseNumber('011 61 2 3456 7890', 'US')).to.deep.equal({
phone: '234567890',
country: 'AU'
});
expect(parseNumber('011 61 2 3456 7890', 'FR')).to.deep.equal({});
expect(parseNumber('00 61 2 3456 7890', 'US')).to.deep.equal({});
expect(parseNumber('810 61 2 3456 7890', 'RU')).to.deep.equal({
phone: '234567890',
country: 'AU'
});
});
it('should work with v2 API', function () {
parseNumber('+99989160151539');
});
it('should work with Argentina numbers', function () {
// The same mobile number is written differently
// in different formats in Argentina:
// `9` gets prepended in international format.
expect(parseNumber('+54 9 3435 55 1212')).to.deep.equal({
country: 'AR',
phone: '93435551212'
});
expect(parseNumber('0343 15-555-1212', 'AR')).to.deep.equal({
country: 'AR',
phone: '93435551212'
});
});
it('should work with Mexico numbers', function () {
// Fixed line.
expect(parseNumber('+52 449 978 0001')).to.deep.equal({
country: 'MX',
phone: '4499780001'
});
// "Dialling tokens 01, 02, 044, 045 and 1 are removed as they are
// no longer valid since August 2019."
//
// parseNumber('01 (449)978-0001', 'MX').should.deep.equal({
// country: 'MX',
// phone: '4499780001'
// })
expect(parseNumber('(449)978-0001', 'MX')).to.deep.equal({
country: 'MX',
phone: '4499780001'
});
// "Dialling tokens 01, 02, 044, 045 and 1 are removed as they are
// no longer valid since August 2019."
//
// // Mobile.
// // `1` is prepended before area code to mobile numbers in international format.
// parseNumber('+52 1 33 1234-5678', 'MX').should.deep.equal({
// country: 'MX',
// phone: '3312345678'
// })
expect(parseNumber('+52 33 1234-5678', 'MX')).to.deep.equal({
country: 'MX',
phone: '3312345678'
});
// "Dialling tokens 01, 02, 044, 045 and 1 are removed as they are
// no longer valid since August 2019."
//
// parseNumber('044 (33) 1234-5678', 'MX').should.deep.equal({
// country: 'MX',
// phone: '3312345678'
// })
// parseNumber('045 33 1234-5678', 'MX').should.deep.equal({
// country: 'MX',
// phone: '3312345678'
// })
});
it('should parse non-geographic numbering plan phone numbers', function () {
expect(parseNumber('+870773111632')).to.deep.equal(USE_NON_GEOGRAPHIC_COUNTRY_CODE ? {
country: '001',
phone: '773111632'
} : {});
});
it('should parse non-geographic numbering plan phone numbers (default country code)', function () {
expect(parseNumber('773111632', {
defaultCallingCode: '870'
})).to.deep.equal(USE_NON_GEOGRAPHIC_COUNTRY_CODE ? {
country: '001',
phone: '773111632'
} : {});
});
it('should parse non-geographic numbering plan phone numbers (extended)', function () {
expect(parseNumber('+870773111632', {
extended: true
})).to.deep.equal({
country: USE_NON_GEOGRAPHIC_COUNTRY_CODE ? '001' : undefined,
countryCallingCode: '870',
phone: '773111632',
carrierCode: undefined,
ext: undefined,
possible: true,
valid: true
});
});
it('should parse non-geographic numbering plan phone numbers (default country code) (extended)', function () {
expect(parseNumber('773111632', {
defaultCallingCode: '870',
extended: true
})).to.deep.equal({
country: USE_NON_GEOGRAPHIC_COUNTRY_CODE ? '001' : undefined,
countryCallingCode: '870',
phone: '773111632',
carrierCode: undefined,
ext: undefined,
possible: true,
valid: true
});
});
it('shouldn\'t crash when invalid `defaultCallingCode` is passed', function () {
expect(function () {
return parseNumber('773111632', {
defaultCallingCode: '999'
});
}).to["throw"]('Unknown calling code');
});
it('shouldn\'t set `country` when there\'s no `defaultCountry` and `defaultCallingCode` is not of a "non-geographic entity"', function () {
expect(parseNumber('88005553535', {
defaultCallingCode: '7'
})).to.deep.equal({
country: 'RU',
phone: '8005553535'
});
});
it('should correctly parse numbers starting with the same digit as the national prefix', function () {
// https://github.com/catamphetamine/libphonenumber-js/issues/373
// `BY`'s `national_prefix` is `8`.
expect(parseNumber('+37582004910060')).to.deep.equal({
country: 'BY',
phone: '82004910060'
});
});
it('should autocorrect numbers without a leading +', function () {
// https://github.com/catamphetamine/libphonenumber-js/issues/376
expect(parseNumber('375447521111', 'BY')).to.deep.equal({
country: 'BY',
phone: '447521111'
});
// https://github.com/catamphetamine/libphonenumber-js/issues/316
expect(parseNumber('33612902554', 'FR')).to.deep.equal({
country: 'FR',
phone: '612902554'
});
// https://github.com/catamphetamine/libphonenumber-js/issues/375
expect(parseNumber('61438331999', 'AU')).to.deep.equal({
country: 'AU',
phone: '438331999'
});
// A case when `49` is a country calling code of a number without a leading `+`.
expect(parseNumber('4930123456', 'DE')).to.deep.equal({
country: 'DE',
phone: '30123456'
});
// A case when `49` is a valid area code.
expect(parseNumber('4951234567890', 'DE')).to.deep.equal({
country: 'DE',
phone: '4951234567890'
});
});
it('should parse extensions (long extensions with explicitl abels)', function () {
// Test lower and upper limits of extension lengths for each type of label.
// Firstly, when in RFC format: PhoneNumberUtil.extLimitAfterExplicitLabel
expect(parseNumber('33316005 ext 0', 'NZ').ext).to.equal('0');
expect(parseNumber('33316005 ext 01234567890123456789', 'NZ').ext).to.equal('01234567890123456789');
// Extension too long.
expect(parseNumber('33316005 ext 012345678901234567890', 'NZ').ext).to.be.undefined;
// Explicit extension label.
expect(parseNumber('03 3316005ext:1', 'NZ').ext).to.equal('1');
expect(parseNumber('03 3316005 xtn:12345678901234567890', 'NZ').ext).to.equal('12345678901234567890');
expect(parseNumber('03 3316005 extension\t12345678901234567890', 'NZ').ext).to.equal('12345678901234567890');
expect(parseNumber('03 3316005 xtensio:12345678901234567890', 'NZ').ext).to.equal('12345678901234567890');
expect(parseNumber('03 3316005 xtensión, 12345678901234567890#', 'NZ').ext).to.equal('12345678901234567890');
expect(parseNumber('03 3316005extension.12345678901234567890', 'NZ').ext).to.equal('12345678901234567890');
expect(parseNumber('03 3316005 доб:12345678901234567890', 'NZ').ext).to.equal('12345678901234567890');
// Extension too long.
expect(parseNumber('03 3316005 extension 123456789012345678901', 'NZ').ext).to.be.undefined;
});
it('should parse extensions (long extensions with auto dialling labels)', function () {
expect(parseNumber('+12679000000,,123456789012345#').ext).to.equal('123456789012345');
expect(parseNumber('+12679000000;123456789012345#').ext).to.equal('123456789012345');
expect(parseNumber('+442034000000,,123456789#').ext).to.equal('123456789');
// Extension too long.
expect(parseNumber('+12679000000,,1234567890123456#').ext).to.be.undefined;
});
it('should parse extensions (short extensions with ambiguous characters)', function () {
expect(parseNumber('03 3316005 x 123456789', 'NZ').ext).to.equal('123456789');
expect(parseNumber('03 3316005 x. 123456789', 'NZ').ext).to.equal('123456789');
expect(parseNumber('03 3316005 #123456789#', 'NZ').ext).to.equal('123456789');
expect(parseNumber('03 3316005 ~ 123456789', 'NZ').ext).to.equal('123456789');
// Extension too long.
expect(parseNumber('03 3316005 ~ 1234567890', 'NZ').ext).to.be.undefined;
});
it('should parse extensions (short extensions when not sure of label)', function () {
expect(parseNumber('+1123-456-7890 666666#', {
v2: true
}).ext).to.equal('666666');
expect(parseNumber('+11234567890-6#', {
v2: true
}).ext).to.equal('6');
// Extension too long.
expect(function () {
return parseNumber('+1123-456-7890 7777777#', {
v2: true
});
}).to["throw"]('NOT_A_NUMBER');
});
});
//# sourceMappingURL=parse.test.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,33 @@
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
import normalizeArguments from '../normalizeArguments.js';
import PhoneNumberMatcher from '../PhoneNumberMatcher.js';
/**
* @return ES6 `for ... of` iterator.
*/
export default function searchNumbers() {
var _normalizeArguments = normalizeArguments(arguments),
text = _normalizeArguments.text,
options = _normalizeArguments.options,
metadata = _normalizeArguments.metadata;
var matcher = new PhoneNumberMatcher(text, options, metadata);
return _defineProperty({}, Symbol.iterator, function () {
return {
next: function next() {
if (matcher.hasNext()) {
return {
done: false,
value: matcher.next()
};
}
return {
done: true
};
}
};
});
}
//# sourceMappingURL=searchNumbers.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"searchNumbers.js","names":["normalizeArguments","PhoneNumberMatcher","searchNumbers","_normalizeArguments","arguments","text","options","metadata","matcher","_defineProperty","Symbol","iterator","next","hasNext","done","value"],"sources":["../../source/legacy/searchNumbers.js"],"sourcesContent":["import normalizeArguments from '../normalizeArguments.js'\r\nimport PhoneNumberMatcher from '../PhoneNumberMatcher.js'\r\n\r\n/**\r\n * @return ES6 `for ... of` iterator.\r\n */\r\nexport default function searchNumbers()\r\n{\r\n\tconst { text, options, metadata } = normalizeArguments(arguments)\r\n\r\n\tconst matcher = new PhoneNumberMatcher(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 (matcher.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: matcher.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"],"mappings":";;;;AAAA,OAAOA,kBAAkB,MAAM,0BAA0B;AACzD,OAAOC,kBAAkB,MAAM,0BAA0B;;AAEzD;AACA;AACA;AACA,eAAe,SAASC,aAAaA,CAAA,EACrC;EACC,IAAAC,mBAAA,GAAoCH,kBAAkB,CAACI,SAAS,CAAC;IAAzDC,IAAI,GAAAF,mBAAA,CAAJE,IAAI;IAAEC,OAAO,GAAAH,mBAAA,CAAPG,OAAO;IAAEC,QAAQ,GAAAJ,mBAAA,CAARI,QAAQ;EAE/B,IAAMC,OAAO,GAAG,IAAIP,kBAAkB,CAACI,IAAI,EAAEC,OAAO,EAAEC,QAAQ,CAAC;EAE/D,OAAAE,eAAA,KACEC,MAAM,CAACC,QAAQ,cAAI;IACnB,OAAO;MACHC,IAAI,EAAE,SAANA,IAAIA,CAAA,EAAQ;QACX,IAAIJ,OAAO,CAACK,OAAO,CAAC,CAAC,EAAE;UACzB,OAAO;YACNC,IAAI,EAAE,KAAK;YACXC,KAAK,EAAEP,OAAO,CAACI,IAAI,CAAC;UACrB,CAAC;QACF;QACA,OAAO;UACNE,IAAI,EAAE;QACP,CAAC;MACC;IACJ,CAAC;EACF,CAAC;AAEH","ignoreList":[]}

View File

@@ -0,0 +1,28 @@
function _createForOfIteratorHelperLoose(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (t) return (t = t.call(r)).next.bind(t); if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var o = 0; return function () { return o >= r.length ? { done: !0 } : { done: !1, value: r[o++] }; }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
import searchNumbers from './searchNumbers.js';
import metadata from '../../metadata.min.json' with { type: 'json' };
describe('searchNumbers', function () {
it('should iterate', function () {
var expectedNumbers = [{
country: 'RU',
phone: '8005553535',
// number : '+7 (800) 555-35-35',
startsAt: 14,
endsAt: 32
}, {
country: 'US',
phone: '2133734253',
// number : '(213) 373-4253',
startsAt: 41,
endsAt: 55
}];
for (var _iterator = _createForOfIteratorHelperLoose(searchNumbers('The number is +7 (800) 555-35-35 and not (213) 373-4253 as written in the document.', 'US', metadata)), _step; !(_step = _iterator()).done;) {
var number = _step.value;
expect(number).to.deep.equal(expectedNumbers.shift());
}
expect(expectedNumbers.length).to.equal(0);
});
});
//# sourceMappingURL=searchNumbers.test.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"searchNumbers.test.js","names":["searchNumbers","metadata","type","describe","it","expectedNumbers","country","phone","startsAt","endsAt","_iterator","_createForOfIteratorHelperLoose","_step","done","number","value","expect","to","deep","equal","shift","length"],"sources":["../../source/legacy/searchNumbers.test.js"],"sourcesContent":["import searchNumbers from './searchNumbers.js'\r\nimport metadata from '../../metadata.min.json' with { type: 'json' }\r\n\r\ndescribe('searchNumbers', () => {\r\n\tit('should iterate', () => {\r\n\t\tconst expectedNumbers =[{\r\n\t\t\tcountry : 'RU',\r\n\t\t\tphone : '8005553535',\r\n\t\t\t// number : '+7 (800) 555-35-35',\r\n\t\t\tstartsAt : 14,\r\n\t\t\tendsAt : 32\r\n\t\t}, {\r\n\t\t\tcountry : 'US',\r\n\t\t\tphone : '2133734253',\r\n\t\t\t// number : '(213) 373-4253',\r\n\t\t\tstartsAt : 41,\r\n\t\t\tendsAt : 55\r\n\t\t}]\r\n\r\n\t\tfor (const number of searchNumbers('The number is +7 (800) 555-35-35 and not (213) 373-4253 as written in the document.', 'US', metadata)) {\r\n\t\t\texpect(number).to.deep.equal(expectedNumbers.shift())\r\n\t\t}\r\n\r\n\t\texpect(expectedNumbers.length).to.equal(0)\r\n\t})\r\n})"],"mappings":";;;AAAA,OAAOA,aAAa,MAAM,oBAAoB;AAC9C,OAAOC,QAAQ,MAAM,yBAAyB,QAAQC,IAAI,EAAE,MAAM;AAElEC,QAAQ,CAAC,eAAe,EAAE,YAAM;EAC/BC,EAAE,CAAC,gBAAgB,EAAE,YAAM;IAC1B,IAAMC,eAAe,GAAE,CAAC;MACvBC,OAAO,EAAG,IAAI;MACdC,KAAK,EAAK,YAAY;MACtB;MACAC,QAAQ,EAAG,EAAE;MACbC,MAAM,EAAK;IACZ,CAAC,EAAE;MACFH,OAAO,EAAG,IAAI;MACdC,KAAK,EAAK,YAAY;MACtB;MACAC,QAAQ,EAAG,EAAE;MACbC,MAAM,EAAK;IACZ,CAAC,CAAC;IAEF,SAAAC,SAAA,GAAAC,+BAAA,CAAqBX,aAAa,CAAC,qFAAqF,EAAE,IAAI,EAAEC,QAAQ,CAAC,GAAAW,KAAA,IAAAA,KAAA,GAAAF,SAAA,IAAAG,IAAA,GAAE;MAAA,IAAhIC,MAAM,GAAAF,KAAA,CAAAG,KAAA;MAChBC,MAAM,CAACF,MAAM,CAAC,CAACG,EAAE,CAACC,IAAI,CAACC,KAAK,CAACd,eAAe,CAACe,KAAK,CAAC,CAAC,CAAC;IACtD;IAEAJ,MAAM,CAACX,eAAe,CAACgB,MAAM,CAAC,CAACJ,EAAE,CAACE,KAAK,CAAC,CAAC,CAAC;EAC3C,CAAC,CAAC;AACH,CAAC,CAAC","ignoreList":[]}